Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
  1// SPDX-License-Identifier: GPL-2.0-only
  2#include <linux/types.h>
  3#include <linux/string.h>
  4#include <linux/kernel.h>
  5#include <linux/export.h>
  6#include <linux/interrupt.h>
  7#include <linux/ide.h>
  8#include <linux/bitops.h>
  9
 10static const char *udma_str[] =
 11	 { "UDMA/16", "UDMA/25",  "UDMA/33",  "UDMA/44",
 12	   "UDMA/66", "UDMA/100", "UDMA/133", "UDMA7" };
 13static const char *mwdma_str[] =
 14	{ "MWDMA0", "MWDMA1", "MWDMA2", "MWDMA3", "MWDMA4" };
 15static const char *swdma_str[] =
 16	{ "SWDMA0", "SWDMA1", "SWDMA2" };
 17static const char *pio_str[] =
 18	{ "PIO0", "PIO1", "PIO2", "PIO3", "PIO4", "PIO5", "PIO6" };
 19
 20/**
 21 *	ide_xfer_verbose	-	return IDE mode names
 22 *	@mode: transfer mode
 23 *
 24 *	Returns a constant string giving the name of the mode
 25 *	requested.
 26 */
 27
 28const char *ide_xfer_verbose(u8 mode)
 29{
 30	const char *s;
 31	u8 i = mode & 0xf;
 32
 33	if (mode >= XFER_UDMA_0 && mode <= XFER_UDMA_7)
 34		s = udma_str[i];
 35	else if (mode >= XFER_MW_DMA_0 && mode <= XFER_MW_DMA_4)
 36		s = mwdma_str[i];
 37	else if (mode >= XFER_SW_DMA_0 && mode <= XFER_SW_DMA_2)
 38		s = swdma_str[i];
 39	else if (mode >= XFER_PIO_0 && mode <= XFER_PIO_6)
 40		s = pio_str[i & 0x7];
 41	else if (mode == XFER_PIO_SLOW)
 42		s = "PIO SLOW";
 43	else
 44		s = "XFER ERROR";
 45
 46	return s;
 47}
 48EXPORT_SYMBOL(ide_xfer_verbose);
 49
 50/**
 51 *	ide_get_best_pio_mode	-	get PIO mode from drive
 52 *	@drive: drive to consider
 53 *	@mode_wanted: preferred mode
 54 *	@max_mode: highest allowed mode
 55 *
 56 *	This routine returns the recommended PIO settings for a given drive,
 57 *	based on the drive->id information and the ide_pio_blacklist[].
 58 *
 59 *	Drive PIO mode is auto-selected if 255 is passed as mode_wanted.
 60 *	This is used by most chipset support modules when "auto-tuning".
 61 */
 62
 63static u8 ide_get_best_pio_mode(ide_drive_t *drive, u8 mode_wanted, u8 max_mode)
 64{
 65	u16 *id = drive->id;
 66	int pio_mode = -1, overridden = 0;
 67
 68	if (mode_wanted != 255)
 69		return min_t(u8, mode_wanted, max_mode);
 70
 71	if ((drive->hwif->host_flags & IDE_HFLAG_PIO_NO_BLACKLIST) == 0)
 72		pio_mode = ide_scan_pio_blacklist((char *)&id[ATA_ID_PROD]);
 73
 74	if (pio_mode != -1) {
 75		printk(KERN_INFO "%s: is on PIO blacklist\n", drive->name);
 76	} else {
 77		pio_mode = id[ATA_ID_OLD_PIO_MODES] >> 8;
 78		if (pio_mode > 2) {	/* 2 is maximum allowed tPIO value */
 79			pio_mode = 2;
 80			overridden = 1;
 81		}
 82
 83		if (id[ATA_ID_FIELD_VALID] & 2) {	      /* ATA2? */
 84			if (ata_id_is_cfa(id) && (id[ATA_ID_CFA_MODES] & 7))
 85				pio_mode = 4 + min_t(int, 2,
 86						     id[ATA_ID_CFA_MODES] & 7);
 87			else if (ata_id_has_iordy(id)) {
 88				if (id[ATA_ID_PIO_MODES] & 7) {
 89					overridden = 0;
 90					if (id[ATA_ID_PIO_MODES] & 4)
 91						pio_mode = 5;
 92					else if (id[ATA_ID_PIO_MODES] & 2)
 93						pio_mode = 4;
 94					else
 95						pio_mode = 3;
 96				}
 97			}
 98		}
 99
100		if (overridden)
101			printk(KERN_INFO "%s: tPIO > 2, assuming tPIO = 2\n",
102					 drive->name);
103	}
104
105	if (pio_mode > max_mode)
106		pio_mode = max_mode;
107
108	return pio_mode;
109}
110
111int ide_pio_need_iordy(ide_drive_t *drive, const u8 pio)
112{
113	/*
114	 * IORDY may lead to controller lock up on certain controllers
115	 * if the port is not occupied.
116	 */
117	if (pio == 0 && (drive->hwif->port_flags & IDE_PFLAG_PROBING))
118		return 0;
119	return ata_id_pio_need_iordy(drive->id, pio);
120}
121EXPORT_SYMBOL_GPL(ide_pio_need_iordy);
122
123int ide_set_pio_mode(ide_drive_t *drive, const u8 mode)
124{
125	ide_hwif_t *hwif = drive->hwif;
126	const struct ide_port_ops *port_ops = hwif->port_ops;
127
128	if (hwif->host_flags & IDE_HFLAG_NO_SET_MODE)
129		return 0;
130
131	if (port_ops == NULL || port_ops->set_pio_mode == NULL)
132		return -1;
133
134	/*
135	 * TODO: temporary hack for some legacy host drivers that didn't
136	 * set transfer mode on the device in ->set_pio_mode method...
137	 */
138	if (port_ops->set_dma_mode == NULL) {
139		drive->pio_mode = mode;
140		port_ops->set_pio_mode(hwif, drive);
141		return 0;
142	}
143
144	if (hwif->host_flags & IDE_HFLAG_POST_SET_MODE) {
145		if (ide_config_drive_speed(drive, mode))
146			return -1;
147		drive->pio_mode = mode;
148		port_ops->set_pio_mode(hwif, drive);
149		return 0;
150	} else {
151		drive->pio_mode = mode;
152		port_ops->set_pio_mode(hwif, drive);
153		return ide_config_drive_speed(drive, mode);
154	}
155}
156
157int ide_set_dma_mode(ide_drive_t *drive, const u8 mode)
158{
159	ide_hwif_t *hwif = drive->hwif;
160	const struct ide_port_ops *port_ops = hwif->port_ops;
161
162	if (hwif->host_flags & IDE_HFLAG_NO_SET_MODE)
163		return 0;
164
165	if (port_ops == NULL || port_ops->set_dma_mode == NULL)
166		return -1;
167
168	if (hwif->host_flags & IDE_HFLAG_POST_SET_MODE) {
169		if (ide_config_drive_speed(drive, mode))
170			return -1;
171		drive->dma_mode = mode;
172		port_ops->set_dma_mode(hwif, drive);
173		return 0;
174	} else {
175		drive->dma_mode = mode;
176		port_ops->set_dma_mode(hwif, drive);
177		return ide_config_drive_speed(drive, mode);
178	}
179}
180EXPORT_SYMBOL_GPL(ide_set_dma_mode);
181
182/* req_pio == "255" for auto-tune */
183void ide_set_pio(ide_drive_t *drive, u8 req_pio)
184{
185	ide_hwif_t *hwif = drive->hwif;
186	const struct ide_port_ops *port_ops = hwif->port_ops;
187	u8 host_pio, pio;
188
189	if (port_ops == NULL || port_ops->set_pio_mode == NULL ||
190	    (hwif->host_flags & IDE_HFLAG_NO_SET_MODE))
191		return;
192
193	BUG_ON(hwif->pio_mask == 0x00);
194
195	host_pio = fls(hwif->pio_mask) - 1;
196
197	pio = ide_get_best_pio_mode(drive, req_pio, host_pio);
198
199	/*
200	 * TODO:
201	 * - report device max PIO mode
202	 * - check req_pio != 255 against device max PIO mode
203	 */
204	printk(KERN_DEBUG "%s: host max PIO%d wanted PIO%d%s selected PIO%d\n",
205			  drive->name, host_pio, req_pio,
206			  req_pio == 255 ? "(auto-tune)" : "", pio);
207
208	(void)ide_set_pio_mode(drive, XFER_PIO_0 + pio);
209}
210EXPORT_SYMBOL_GPL(ide_set_pio);
211
212/**
213 *	ide_rate_filter		-	filter transfer mode
214 *	@drive: IDE device
215 *	@speed: desired speed
216 *
217 *	Given the available transfer modes this function returns
218 *	the best available speed at or below the speed requested.
219 *
220 *	TODO: check device PIO capabilities
221 */
222
223static u8 ide_rate_filter(ide_drive_t *drive, u8 speed)
224{
225	ide_hwif_t *hwif = drive->hwif;
226	u8 mode = ide_find_dma_mode(drive, speed);
227
228	if (mode == 0) {
229		if (hwif->pio_mask)
230			mode = fls(hwif->pio_mask) - 1 + XFER_PIO_0;
231		else
232			mode = XFER_PIO_4;
233	}
234
235/*	printk("%s: mode 0x%02x, speed 0x%02x\n", __func__, mode, speed); */
236
237	return min(speed, mode);
238}
239
240/**
241 *	ide_set_xfer_rate	-	set transfer rate
242 *	@drive: drive to set
243 *	@rate: speed to attempt to set
244 *
245 *	General helper for setting the speed of an IDE device. This
246 *	function knows about user enforced limits from the configuration
247 *	which ->set_pio_mode/->set_dma_mode does not.
248 */
249
250int ide_set_xfer_rate(ide_drive_t *drive, u8 rate)
251{
252	ide_hwif_t *hwif = drive->hwif;
253	const struct ide_port_ops *port_ops = hwif->port_ops;
254
255	if (port_ops == NULL || port_ops->set_dma_mode == NULL ||
256	    (hwif->host_flags & IDE_HFLAG_NO_SET_MODE))
257		return -1;
258
259	rate = ide_rate_filter(drive, rate);
260
261	BUG_ON(rate < XFER_PIO_0);
262
263	if (rate >= XFER_PIO_0 && rate <= XFER_PIO_6)
264		return ide_set_pio_mode(drive, rate);
265
266	return ide_set_dma_mode(drive, rate);
267}