]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/ide/alim15x3.c
ide: add drive->dma_mode field
[mirror_ubuntu-artful-kernel.git] / drivers / ide / alim15x3.c
CommitLineData
1da177e4 1/*
1da177e4
LT
2 * Copyright (C) 1998-2000 Michel Aubry, Maintainer
3 * Copyright (C) 1998-2000 Andrzej Krzysztofowicz, Maintainer
4 * Copyright (C) 1999-2000 CJ, cjtsai@ali.com.tw, Maintainer
5 *
6 * Copyright (C) 1998-2000 Andre Hedrick (andre@linux-ide.org)
7 * May be copied or modified under the terms of the GNU General Public License
ccd32e22 8 * Copyright (C) 2002 Alan Cox
1da177e4 9 * ALi (now ULi M5228) support by Clear Zhang <Clear.Zhang@ali.com.tw>
21b82477 10 * Copyright (C) 2007 MontaVista Software, Inc. <source@mvista.com>
3c8cc8df 11 * Copyright (C) 2007-2010 Bartlomiej Zolnierkiewicz
1da177e4
LT
12 *
13 * (U)DMA capable version of ali 1533/1543(C), 1535(D)
14 *
15 **********************************************************************
16 * 9/7/99 --Parts from the above author are included and need to be
17 * converted into standard interface, once I finish the thought.
18 *
19 * Recent changes
20 * Don't use LBA48 mode on ALi <= 0xC4
21 * Don't poke 0x79 with a non ALi northbridge
22 * Don't flip undefined bits on newer chipsets (fix Fujitsu laptop hang)
23 * Allow UDMA6 on revisions > 0xC4
24 *
25 * Documentation
26 * Chipset documentation available under NDA only
27 *
28 */
29
1da177e4
LT
30#include <linux/module.h>
31#include <linux/types.h>
32#include <linux/kernel.h>
33#include <linux/pci.h>
1da177e4
LT
34#include <linux/ide.h>
35#include <linux/init.h>
95ba8c17 36#include <linux/dmi.h>
1da177e4
LT
37
38#include <asm/io.h>
39
ced3ec8a
BZ
40#define DRV_NAME "alim15x3"
41
1da177e4
LT
42/*
43 * ALi devices are not plug in. Otherwise these static values would
44 * need to go. They ought to go away anyway
45 */
46
47static u8 m5229_revision;
48static u8 chip_is_1543c_e;
49static struct pci_dev *isa_dev;
50
293f18ad
BZ
51static void ali_fifo_control(ide_hwif_t *hwif, ide_drive_t *drive, int on)
52{
53 struct pci_dev *pdev = to_pci_dev(hwif->dev);
54 int pio_fifo = 0x54 + hwif->channel;
55 u8 fifo;
56 int shift = 4 * (drive->dn & 1);
57
58 pci_read_config_byte(pdev, pio_fifo, &fifo);
59 fifo &= ~(0x0F << shift);
60 fifo |= (on << shift);
61 pci_write_config_byte(pdev, pio_fifo, fifo);
62}
63
1da177e4 64/**
88b2b32b 65 * ali_set_pio_mode - set host controller for PIO mode
26bcb879
BZ
66 * @drive: drive
67 * @pio: PIO mode number
21b82477 68 *
26bcb879 69 * Program the controller for the given PIO mode.
1da177e4 70 */
26bcb879 71
88b2b32b 72static void ali_set_pio_mode(ide_drive_t *drive, const u8 pio)
1da177e4 73{
898ec223 74 ide_hwif_t *hwif = drive->hwif;
36501650 75 struct pci_dev *dev = to_pci_dev(hwif->dev);
30e5ee4d 76 int bus_speed = ide_pci_clk ? ide_pci_clk : 33;
3c8cc8df 77 unsigned long T = 1000000 / bus_speed; /* PCI clock based */
1da177e4 78 int port = hwif->channel ? 0x5c : 0x58;
293f18ad 79 u8 unit = drive->dn & 1;
3c8cc8df 80 struct ide_timing t;
1da177e4 81
3c8cc8df
BZ
82 ide_timing_compute(drive, XFER_PIO_0 + pio, &t, T, 1);
83
84 t.setup = clamp_val(t.setup, 1, 8) & 7;
85 t.active = clamp_val(t.active, 1, 8) & 7;
86 t.recover = clamp_val(t.recover, 1, 16) & 15;
1da177e4 87
1da177e4
LT
88 /*
89 * PIO mode => ATA FIFO on, ATAPI FIFO off
90 */
293f18ad 91 ali_fifo_control(hwif, drive, (drive->media == ide_disk) ? 0x05 : 0x00);
3c8cc8df
BZ
92
93 pci_write_config_byte(dev, port, t.setup);
94 pci_write_config_byte(dev, port + unit + 2,
95 (t.active << 4) | t.recover);
21b82477
SS
96}
97
1da177e4 98/**
2d5eaa6d
BZ
99 * ali_udma_filter - compute UDMA mask
100 * @drive: IDE device
1da177e4 101 *
2d5eaa6d
BZ
102 * Return available UDMA modes.
103 *
104 * The actual rules for the ALi are:
1da177e4
LT
105 * No UDMA on revisions <= 0x20
106 * Disk only for revisions < 0xC2
63b1623e 107 * Not WDC drives on M1543C-E (?)
1da177e4 108 */
1da177e4 109
2d5eaa6d 110static u8 ali_udma_filter(ide_drive_t *drive)
1da177e4 111{
2d5eaa6d
BZ
112 if (m5229_revision > 0x20 && m5229_revision < 0xC2) {
113 if (drive->media != ide_disk)
114 return 0;
2db3dae5 115 if (chip_is_1543c_e &&
4dde4492 116 strstr((char *)&drive->id[ATA_ID_PROD], "WDC "))
2d5eaa6d 117 return 0;
1da177e4
LT
118 }
119
2d5eaa6d 120 return drive->hwif->ultra_mask;
1da177e4
LT
121}
122
123/**
88b2b32b
BZ
124 * ali_set_dma_mode - set host controller for DMA mode
125 * @drive: drive
126 * @speed: DMA mode
1da177e4
LT
127 *
128 * Configure the hardware for the desired IDE transfer mode.
1da177e4 129 */
f212ff28 130
88b2b32b 131static void ali_set_dma_mode(ide_drive_t *drive, const u8 speed)
1da177e4 132{
898ec223 133 ide_hwif_t *hwif = drive->hwif;
36501650 134 struct pci_dev *dev = to_pci_dev(hwif->dev);
1da177e4 135 u8 speed1 = speed;
123995b9 136 u8 unit = drive->dn & 1;
1da177e4
LT
137 u8 tmpbyte = 0x00;
138 int m5229_udma = (hwif->channel) ? 0x57 : 0x56;
139
140 if (speed == XFER_UDMA_6)
141 speed1 = 0x47;
142
143 if (speed < XFER_UDMA_0) {
144 u8 ultra_enable = (unit) ? 0x7f : 0xf7;
145 /*
146 * clear "ultra enable" bit
147 */
148 pci_read_config_byte(dev, m5229_udma, &tmpbyte);
149 tmpbyte &= ultra_enable;
150 pci_write_config_byte(dev, m5229_udma, tmpbyte);
151
a6fe837e
BZ
152 /*
153 * FIXME: Oh, my... DMA timings are never set.
154 */
1da177e4
LT
155 } else {
156 pci_read_config_byte(dev, m5229_udma, &tmpbyte);
157 tmpbyte &= (0x0f << ((1-unit) << 2));
158 /*
159 * enable ultra dma and set timing
160 */
161 tmpbyte |= ((0x08 | ((4-speed1)&0x07)) << (unit << 2));
162 pci_write_config_byte(dev, m5229_udma, tmpbyte);
163 if (speed >= XFER_UDMA_3) {
164 pci_read_config_byte(dev, 0x4b, &tmpbyte);
165 tmpbyte |= 1;
166 pci_write_config_byte(dev, 0x4b, tmpbyte);
167 }
168 }
1da177e4
LT
169}
170
1da177e4 171/**
8a4a5738 172 * ali_dma_check - DMA check
1da177e4 173 * @drive: target device
22981694 174 * @cmd: command
1da177e4
LT
175 *
176 * Returns 1 if the DMA cannot be performed, zero on success.
177 */
178
8a4a5738 179static int ali_dma_check(ide_drive_t *drive, struct ide_cmd *cmd)
1da177e4
LT
180{
181 if (m5229_revision < 0xC2 && drive->media != ide_disk) {
22981694 182 if (cmd->tf_flags & IDE_TFLAG_WRITE)
1da177e4
LT
183 return 1; /* try PIO instead of DMA */
184 }
8a4a5738 185 return 0;
1da177e4
LT
186}
187
188/**
189 * init_chipset_ali15x3 - Initialise an ALi IDE controller
190 * @dev: PCI device
1da177e4
LT
191 *
192 * This function initializes the ALI IDE controller and where
193 * appropriate also sets up the 1533 southbridge.
194 */
a326b02b 195
2ed0ef54 196static int init_chipset_ali15x3(struct pci_dev *dev)
1da177e4
LT
197{
198 unsigned long flags;
199 u8 tmpbyte;
b1489009 200 struct pci_dev *north = pci_get_slot(dev->bus, PCI_DEVFN(0,0));
1da177e4 201
44c10138 202 m5229_revision = dev->revision;
1da177e4 203
b1489009 204 isa_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL);
1da177e4 205
1da177e4
LT
206 local_irq_save(flags);
207
208 if (m5229_revision < 0xC2) {
209 /*
210 * revision 0x20 (1543-E, 1543-F)
211 * revision 0xC0, 0xC1 (1543C-C, 1543C-D, 1543C-E)
212 * clear CD-ROM DMA write bit, m5229, 0x4b, bit 7
213 */
214 pci_read_config_byte(dev, 0x4b, &tmpbyte);
215 /*
216 * clear bit 7
217 */
218 pci_write_config_byte(dev, 0x4b, tmpbyte & 0x7F);
cad221aa
BZ
219 /*
220 * check m1533, 0x5e, bit 1~4 == 1001 => & 00011110 = 00010010
221 */
222 if (m5229_revision >= 0x20 && isa_dev) {
223 pci_read_config_byte(isa_dev, 0x5e, &tmpbyte);
224 chip_is_1543c_e = ((tmpbyte & 0x1e) == 0x12) ? 1: 0;
225 }
b1489009 226 goto out;
1da177e4
LT
227 }
228
229 /*
230 * 1543C-B?, 1535, 1535D, 1553
231 * Note 1: not all "motherboard" support this detection
232 * Note 2: if no udma 66 device, the detection may "error".
233 * but in this case, we will not set the device to
234 * ultra 66, the detection result is not important
235 */
236
237 /*
238 * enable "Cable Detection", m5229, 0x4b, bit3
239 */
240 pci_read_config_byte(dev, 0x4b, &tmpbyte);
241 pci_write_config_byte(dev, 0x4b, tmpbyte | 0x08);
242
243 /*
244 * We should only tune the 1533 enable if we are using an ALi
245 * North bridge. We might have no north found on some zany
246 * box without a device at 0:0.0. The ALi bridge will be at
247 * 0:0.0 so if we didn't find one we know what is cooking.
248 */
b1489009
AC
249 if (north && north->vendor != PCI_VENDOR_ID_AL)
250 goto out;
1da177e4
LT
251
252 if (m5229_revision < 0xC5 && isa_dev)
253 {
254 /*
255 * set south-bridge's enable bit, m1533, 0x79
256 */
257
258 pci_read_config_byte(isa_dev, 0x79, &tmpbyte);
259 if (m5229_revision == 0xC2) {
260 /*
261 * 1543C-B0 (m1533, 0x79, bit 2)
262 */
263 pci_write_config_byte(isa_dev, 0x79, tmpbyte | 0x04);
264 } else if (m5229_revision >= 0xC3) {
265 /*
266 * 1553/1535 (m1533, 0x79, bit 1)
267 */
268 pci_write_config_byte(isa_dev, 0x79, tmpbyte | 0x02);
269 }
270 }
cad221aa 271
b1489009 272out:
cad221aa
BZ
273 /*
274 * CD_ROM DMA on (m5229, 0x53, bit0)
275 * Enable this bit even if we want to use PIO.
276 * PIO FIFO off (m5229, 0x53, bit1)
277 * The hardware will use 0x54h and 0x55h to control PIO FIFO.
278 * (Not on later devices it seems)
279 *
280 * 0x53 changes meaning on later revs - we must no touch
281 * bit 1 on them. Need to check if 0x20 is the right break.
282 */
283 if (m5229_revision >= 0x20) {
284 pci_read_config_byte(dev, 0x53, &tmpbyte);
285
286 if (m5229_revision <= 0x20)
287 tmpbyte = (tmpbyte & (~0x02)) | 0x01;
288 else if (m5229_revision == 0xc7 || m5229_revision == 0xc8)
289 tmpbyte |= 0x03;
290 else
291 tmpbyte |= 0x01;
292
293 pci_write_config_byte(dev, 0x53, tmpbyte);
294 }
b1489009
AC
295 pci_dev_put(north);
296 pci_dev_put(isa_dev);
1da177e4
LT
297 local_irq_restore(flags);
298 return 0;
299}
300
95ba8c17
BZ
301/*
302 * Cable special cases
303 */
304
1855256c 305static const struct dmi_system_id cable_dmi_table[] = {
95ba8c17
BZ
306 {
307 .ident = "HP Pavilion N5430",
308 .matches = {
309 DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
8663fd6d 310 DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"),
95ba8c17
BZ
311 },
312 },
03e6f489
DE
313 {
314 .ident = "Toshiba Satellite S1800-814",
315 .matches = {
316 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
317 DMI_MATCH(DMI_PRODUCT_NAME, "S1800-814"),
318 },
319 },
95ba8c17
BZ
320 { }
321};
322
323static int ali_cable_override(struct pci_dev *pdev)
324{
325 /* Fujitsu P2000 */
326 if (pdev->subsystem_vendor == 0x10CF &&
327 pdev->subsystem_device == 0x10AF)
328 return 1;
329
d151456a
BZ
330 /* Mitac 8317 (Winbook-A) and relatives */
331 if (pdev->subsystem_vendor == 0x1071 &&
332 pdev->subsystem_device == 0x8317)
333 return 1;
334
95ba8c17
BZ
335 /* Systems by DMI */
336 if (dmi_check_system(cable_dmi_table))
337 return 1;
338
339 return 0;
340}
341
1da177e4 342/**
ac95beed 343 * ali_cable_detect - cable detection
1da177e4
LT
344 * @hwif: IDE interface
345 *
346 * This checks if the controller and the cable are capable
347 * of UDMA66 transfers. It doesn't check the drives.
1da177e4
LT
348 */
349
f454cbe8 350static u8 ali_cable_detect(ide_hwif_t *hwif)
1da177e4 351{
36501650 352 struct pci_dev *dev = to_pci_dev(hwif->dev);
95ba8c17 353 u8 cbl = ATA_CBL_PATA40, tmpbyte;
1da177e4 354
1da177e4
LT
355 if (m5229_revision >= 0xC2) {
356 /*
95ba8c17
BZ
357 * m5229 80-pin cable detection (from Host View)
358 *
359 * 0x4a bit0 is 0 => primary channel has 80-pin
360 * 0x4a bit1 is 0 => secondary channel has 80-pin
361 *
362 * Certain laptops use short but suitable cables
363 * and don't implement the detect logic.
1da177e4 364 */
95ba8c17
BZ
365 if (ali_cable_override(dev))
366 cbl = ATA_CBL_PATA40_SHORT;
367 else {
368 pci_read_config_byte(dev, 0x4a, &tmpbyte);
369 if ((tmpbyte & (1 << hwif->channel)) == 0)
370 cbl = ATA_CBL_PATA80;
371 }
1da177e4
LT
372 }
373
95ba8c17 374 return cbl;
1da177e4
LT
375}
376
03682411 377#ifndef CONFIG_SPARC64
1da177e4
LT
378/**
379 * init_hwif_ali15x3 - Initialize the ALI IDE x86 stuff
380 * @hwif: interface to configure
381 *
382 * Obtain the IRQ tables for an ALi based IDE solution on the PC
383 * class platforms. This part of the code isn't applicable to the
03682411 384 * Sparc systems.
1da177e4
LT
385 */
386
c2f12589 387static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif)
1da177e4
LT
388{
389 u8 ideic, inmir;
390 s8 irq_routing_table[] = { -1, 9, 3, 10, 4, 5, 7, 6,
391 1, 11, 0, 12, 0, 14, 0, 15 };
392 int irq = -1;
393
1da177e4
LT
394 if (isa_dev) {
395 /*
396 * read IDE interface control
397 */
398 pci_read_config_byte(isa_dev, 0x58, &ideic);
399
400 /* bit0, bit1 */
401 ideic = ideic & 0x03;
402
403 /* get IRQ for IDE Controller */
404 if ((hwif->channel && ideic == 0x03) ||
405 (!hwif->channel && !ideic)) {
406 /*
407 * get SIRQ1 routing table
408 */
409 pci_read_config_byte(isa_dev, 0x44, &inmir);
410 inmir = inmir & 0x0f;
411 irq = irq_routing_table[inmir];
412 } else if (hwif->channel && !(ideic & 0x01)) {
413 /*
414 * get SIRQ2 routing table
415 */
416 pci_read_config_byte(isa_dev, 0x75, &inmir);
417 inmir = inmir & 0x0f;
418 irq = irq_routing_table[inmir];
419 }
420 if(irq >= 0)
421 hwif->irq = irq;
422 }
1da177e4 423}
6d1cee44
AV
424#else
425#define init_hwif_ali15x3 NULL
03682411 426#endif /* CONFIG_SPARC64 */
1da177e4
LT
427
428/**
429 * init_dma_ali15x3 - set up DMA on ALi15x3
430 * @hwif: IDE interface
b123f56e 431 * @d: IDE port info
1da177e4 432 *
b123f56e 433 * Set up the DMA functionality on the ALi 15x3.
1da177e4
LT
434 */
435
b123f56e
BZ
436static int __devinit init_dma_ali15x3(ide_hwif_t *hwif,
437 const struct ide_port_info *d)
1da177e4 438{
b123f56e
BZ
439 struct pci_dev *dev = to_pci_dev(hwif->dev);
440 unsigned long base = ide_pci_dma_base(hwif, d);
441
ebb00fb5
BZ
442 if (base == 0)
443 return -1;
444
445 hwif->dma_base = base;
446
447 if (ide_pci_check_simplex(hwif, d) < 0)
448 return -1;
449
450 if (ide_pci_set_master(dev, d->name) < 0)
b123f56e
BZ
451 return -1;
452
0ecdca26 453 if (!hwif->channel)
b123f56e
BZ
454 outb(inb(base + 2) & 0x60, base + 2);
455
456 printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx\n",
457 hwif->name, base, base + 7);
458
459 if (ide_allocate_dma_engine(hwif))
460 return -1;
461
b123f56e 462 return 0;
1da177e4
LT
463}
464
ac95beed
BZ
465static const struct ide_port_ops ali_port_ops = {
466 .set_pio_mode = ali_set_pio_mode,
467 .set_dma_mode = ali_set_dma_mode,
468 .udma_filter = ali_udma_filter,
469 .cable_detect = ali_cable_detect,
470};
471
f37afdac
BZ
472static const struct ide_dma_ops ali_dma_ops = {
473 .dma_host_set = ide_dma_host_set,
8a4a5738 474 .dma_setup = ide_dma_setup,
f37afdac 475 .dma_start = ide_dma_start,
653bcf52 476 .dma_end = ide_dma_end,
f37afdac
BZ
477 .dma_test_irq = ide_dma_test_irq,
478 .dma_lost_irq = ide_dma_lost_irq,
8a4a5738 479 .dma_check = ali_dma_check,
22117d6e 480 .dma_timer_expiry = ide_dma_sff_timer_expiry,
592b5315 481 .dma_sff_read_status = ide_dma_sff_read_status,
5e37bdc0
BZ
482};
483
85620436 484static const struct ide_port_info ali15x3_chipset __devinitdata = {
ced3ec8a 485 .name = DRV_NAME,
1da177e4
LT
486 .init_chipset = init_chipset_ali15x3,
487 .init_hwif = init_hwif_ali15x3,
488 .init_dma = init_dma_ali15x3,
ac95beed 489 .port_ops = &ali_port_ops,
3f023b01 490 .dma_ops = &sff_dma_ops,
4099d143 491 .pio_mask = ATA_PIO5,
5f8b6c34
BZ
492 .swdma_mask = ATA_SWDMA2,
493 .mwdma_mask = ATA_MWDMA2,
1da177e4
LT
494};
495
496/**
497 * alim15x3_init_one - set up an ALi15x3 IDE controller
498 * @dev: PCI device to set up
499 *
500 * Perform the actual set up for an ALi15x3 that has been found by the
501 * hot plug layer.
502 */
503
504static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_device_id *id)
505{
039788e1 506 struct ide_port_info d = ali15x3_chipset;
8ac2b42a 507 u8 rev = dev->revision, idx = id->driver_data;
1da177e4 508
28328307
BZ
509 /* don't use LBA48 DMA on ALi devices before rev 0xC5 */
510 if (rev <= 0xC4)
511 d.host_flags |= IDE_HFLAG_NO_LBA48_DMA;
512
513 if (rev >= 0x20) {
514 if (rev == 0x20)
515 d.host_flags |= IDE_HFLAG_NO_ATAPI_DMA;
516
517 if (rev < 0xC2)
518 d.udma_mask = ATA_UDMA2;
519 else if (rev == 0xC2 || rev == 0xC3)
520 d.udma_mask = ATA_UDMA4;
521 else if (rev == 0xC4)
522 d.udma_mask = ATA_UDMA5;
523 else
524 d.udma_mask = ATA_UDMA6;
5e37bdc0
BZ
525
526 d.dma_ops = &ali_dma_ops;
6d36b95f
BZ
527 } else {
528 d.host_flags |= IDE_HFLAG_NO_DMA;
529
530 d.mwdma_mask = d.swdma_mask = 0;
28328307
BZ
531 }
532
8ac2b42a
BZ
533 if (idx == 0)
534 d.host_flags |= IDE_HFLAG_CLEAR_SIMPLEX;
535
6cdf6eb3 536 return ide_pci_init_one(dev, &d, NULL);
1da177e4
LT
537}
538
539
9cbcc5e3
BZ
540static const struct pci_device_id alim15x3_pci_tbl[] = {
541 { PCI_VDEVICE(AL, PCI_DEVICE_ID_AL_M5229), 0 },
8ac2b42a 542 { PCI_VDEVICE(AL, PCI_DEVICE_ID_AL_M5228), 1 },
1da177e4
LT
543 { 0, },
544};
545MODULE_DEVICE_TABLE(pci, alim15x3_pci_tbl);
546
a9ab09e2 547static struct pci_driver alim15x3_pci_driver = {
1da177e4
LT
548 .name = "ALI15x3_IDE",
549 .id_table = alim15x3_pci_tbl,
550 .probe = alim15x3_init_one,
8ee3f3b6 551 .remove = ide_pci_remove,
feb22b7f
BZ
552 .suspend = ide_pci_suspend,
553 .resume = ide_pci_resume,
1da177e4
LT
554};
555
82ab1eec 556static int __init ali15x3_ide_init(void)
1da177e4 557{
a9ab09e2 558 return ide_pci_register_driver(&alim15x3_pci_driver);
1da177e4
LT
559}
560
8ee3f3b6
BZ
561static void __exit ali15x3_ide_exit(void)
562{
95964018 563 pci_unregister_driver(&alim15x3_pci_driver);
8ee3f3b6
BZ
564}
565
1da177e4 566module_init(ali15x3_ide_init);
8ee3f3b6 567module_exit(ali15x3_ide_exit);
1da177e4 568
3c8cc8df 569MODULE_AUTHOR("Michael Aubry, Andrzej Krzysztofowicz, CJ, Andre Hedrick, Alan Cox, Bartlomiej Zolnierkiewicz");
1da177e4
LT
570MODULE_DESCRIPTION("PCI driver module for ALi 15x3 IDE");
571MODULE_LICENSE("GPL");