2 * Promise TX2/TX4/TX2000/133 IDE driver
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
10 * linux/drivers/ide/pdc202xx.c Version 0.35 Mar. 30, 2002
11 * Copyright (C) 1998-2002 Andre Hedrick <andre@linux-ide.org>
12 * Portions Copyright (C) 1999 Promise Technology, Inc.
13 * Author: Frank Tiernan (frankt@promise.com)
14 * Released under terms of General Public License
17 #include <linux/module.h>
18 #include <linux/types.h>
19 #include <linux/kernel.h>
20 #include <linux/delay.h>
21 #include <linux/timer.h>
23 #include <linux/ioport.h>
24 #include <linux/blkdev.h>
25 #include <linux/hdreg.h>
26 #include <linux/interrupt.h>
27 #include <linux/pci.h>
28 #include <linux/init.h>
29 #include <linux/ide.h>
34 #ifdef CONFIG_PPC_PMAC
36 #include <asm/pci-bridge.h>
39 #define PDC202_DEBUG_CABLE 0
41 static const char *pdc_quirk_drives
[] = {
42 "QUANTUM FIREBALLlct08 08",
43 "QUANTUM FIREBALLP KA6.4",
44 "QUANTUM FIREBALLP KA9.1",
45 "QUANTUM FIREBALLP LM20.4",
46 "QUANTUM FIREBALLP KX13.6",
47 "QUANTUM FIREBALLP KX20.5",
48 "QUANTUM FIREBALLP KX27.3",
49 "QUANTUM FIREBALLP LM20.5",
53 #define set_2regs(a, b) \
55 hwif->OUTB((a + adj), indexreg); \
56 hwif->OUTB(b, datareg); \
59 #define set_ultra(a, b, c) \
61 set_2regs(0x10,(a)); \
62 set_2regs(0x11,(b)); \
63 set_2regs(0x12,(c)); \
66 #define set_ata2(a, b) \
68 set_2regs(0x0e,(a)); \
69 set_2regs(0x0f,(b)); \
72 #define set_pio(a, b, c) \
74 set_2regs(0x0c,(a)); \
75 set_2regs(0x0d,(b)); \
76 set_2regs(0x13,(c)); \
79 static u8
pdcnew_ratemask (ide_drive_t
*drive
)
83 switch(HWIF(drive
)->pci_dev
->device
) {
84 case PCI_DEVICE_ID_PROMISE_20277
:
85 case PCI_DEVICE_ID_PROMISE_20276
:
86 case PCI_DEVICE_ID_PROMISE_20275
:
87 case PCI_DEVICE_ID_PROMISE_20271
:
88 case PCI_DEVICE_ID_PROMISE_20269
:
91 case PCI_DEVICE_ID_PROMISE_20270
:
92 case PCI_DEVICE_ID_PROMISE_20268
:
98 if (!eighty_ninty_three(drive
))
99 mode
= min(mode
, (u8
)1);
103 static int check_in_drive_lists (ide_drive_t
*drive
, const char **list
)
105 struct hd_driveid
*id
= drive
->id
;
107 if (pdc_quirk_drives
== list
) {
109 if (strstr(id
->model
, *list
++)) {
115 if (!strcmp(*list
++,id
->model
)) {
123 static int pdcnew_new_tune_chipset (ide_drive_t
*drive
, u8 xferspeed
)
125 ide_hwif_t
*hwif
= HWIF(drive
);
126 unsigned long indexreg
= hwif
->dma_vendor1
;
127 unsigned long datareg
= hwif
->dma_vendor3
;
129 u8 adj
= (drive
->dn
%2) ? 0x08 : 0x00;
130 u8 speed
= ide_rate_filter(pdcnew_ratemask(drive
), xferspeed
);
132 if (speed
== XFER_UDMA_2
) {
133 hwif
->OUTB((thold
+ adj
), indexreg
);
134 hwif
->OUTB((hwif
->INB(datareg
) & 0x7f), datareg
);
140 case XFER_UDMA_6
: set_ultra(0x1a, 0x01, 0xcb); break;
141 case XFER_UDMA_5
: set_ultra(0x1a, 0x02, 0xcb); break;
142 case XFER_UDMA_4
: set_ultra(0x1a, 0x03, 0xcd); break;
143 case XFER_UDMA_3
: set_ultra(0x1a, 0x05, 0xcd); break;
144 case XFER_UDMA_2
: set_ultra(0x2a, 0x07, 0xcd); break;
145 case XFER_UDMA_1
: set_ultra(0x3a, 0x0a, 0xd0); break;
146 case XFER_UDMA_0
: set_ultra(0x4a, 0x0f, 0xd5); break;
147 case XFER_MW_DMA_2
: set_ata2(0x69, 0x25); break;
148 case XFER_MW_DMA_1
: set_ata2(0x6b, 0x27); break;
149 case XFER_MW_DMA_0
: set_ata2(0xdf, 0x5f); break;
150 case XFER_PIO_4
: set_pio(0x23, 0x09, 0x25); break;
151 case XFER_PIO_3
: set_pio(0x27, 0x0d, 0x35); break;
152 case XFER_PIO_2
: set_pio(0x23, 0x26, 0x64); break;
153 case XFER_PIO_1
: set_pio(0x46, 0x29, 0xa4); break;
154 case XFER_PIO_0
: set_pio(0xfb, 0x2b, 0xac); break;
159 return (ide_config_drive_speed(drive
, speed
));
163 * 960, 480, 390, 300, 240, 180, 120, 90, 60
164 * 180, 150, 120, 90, 60
166 * 180, 120, 90, 90, 90, 60, 30
167 * 11, 5, 4, 3, 2, 1, 0
169 static void pdcnew_tune_drive(ide_drive_t
*drive
, u8 pio
)
173 if (pio
== 5) pio
= 4;
174 speed
= XFER_PIO_0
+ ide_get_best_pio_mode(drive
, 255, pio
, NULL
);
176 (void)pdcnew_new_tune_chipset(drive
, speed
);
179 static u8
pdcnew_new_cable_detect (ide_hwif_t
*hwif
)
181 hwif
->OUTB(0x0b, hwif
->dma_vendor1
);
182 return ((u8
)((hwif
->INB(hwif
->dma_vendor3
) & 0x04)));
184 static int config_chipset_for_dma (ide_drive_t
*drive
)
186 struct hd_driveid
*id
= drive
->id
;
187 ide_hwif_t
*hwif
= HWIF(drive
);
191 u8 ultra_66
= ((id
->dma_ultra
& 0x0010) ||
192 (id
->dma_ultra
& 0x0008)) ? 1 : 0;
194 cable
= pdcnew_new_cable_detect(hwif
);
196 if (ultra_66
&& cable
) {
197 printk(KERN_WARNING
"Warning: %s channel requires an 80-pin cable for operation.\n", hwif
->channel
? "Secondary":"Primary");
198 printk(KERN_WARNING
"%s reduced to Ultra33 mode.\n", drive
->name
);
201 if (drive
->media
!= ide_disk
)
203 if (id
->capability
& 4) { /* IORDY_EN & PREFETCH_EN */
204 hwif
->OUTB((0x13 + ((drive
->dn
%2) ? 0x08 : 0x00)), hwif
->dma_vendor1
);
205 hwif
->OUTB((hwif
->INB(hwif
->dma_vendor3
)|0x03), hwif
->dma_vendor3
);
208 speed
= ide_dma_speed(drive
, pdcnew_ratemask(drive
));
211 hwif
->tuneproc(drive
, 5);
215 (void) hwif
->speedproc(drive
, speed
);
216 return ide_dma_enable(drive
);
219 static int pdcnew_config_drive_xfer_rate (ide_drive_t
*drive
)
221 ide_hwif_t
*hwif
= HWIF(drive
);
222 struct hd_driveid
*id
= drive
->id
;
224 drive
->init_speed
= 0;
226 if (id
&& (id
->capability
& 1) && drive
->autodma
) {
228 if (ide_use_dma(drive
)) {
229 if (config_chipset_for_dma(drive
))
230 return hwif
->ide_dma_on(drive
);
235 } else if ((id
->capability
& 8) || (id
->field_valid
& 2)) {
237 hwif
->tuneproc(drive
, 5);
238 return hwif
->ide_dma_off_quietly(drive
);
240 /* IORDY not supported */
244 static int pdcnew_quirkproc (ide_drive_t
*drive
)
246 return ((int) check_in_drive_lists(drive
, pdc_quirk_drives
));
249 static int pdcnew_ide_dma_lostirq(ide_drive_t
*drive
)
251 if (HWIF(drive
)->resetproc
!= NULL
)
252 HWIF(drive
)->resetproc(drive
);
253 return __ide_dma_lostirq(drive
);
256 static int pdcnew_ide_dma_timeout(ide_drive_t
*drive
)
258 if (HWIF(drive
)->resetproc
!= NULL
)
259 HWIF(drive
)->resetproc(drive
);
260 return __ide_dma_timeout(drive
);
263 static void pdcnew_new_reset (ide_drive_t
*drive
)
266 * Deleted this because it is redundant from the caller.
268 printk(KERN_WARNING
"PDC202XX: %s channel reset.\n",
269 HWIF(drive
)->channel
? "Secondary" : "Primary");
272 #ifdef CONFIG_PPC_PMAC
273 static void __devinit
apple_kiwi_init(struct pci_dev
*pdev
)
275 struct device_node
*np
= pci_device_to_OF_node(pdev
);
276 unsigned int class_rev
= 0;
280 if (np
== NULL
|| !device_is_compatible(np
, "kiwi-root"))
283 pci_read_config_dword(pdev
, PCI_CLASS_REVISION
, &class_rev
);
286 if (class_rev
>= 0x03) {
287 /* Setup chip magic config stuff (from darwin) */
288 pci_read_config_byte(pdev
, 0x40, &conf
);
289 pci_write_config_byte(pdev
, 0x40, conf
| 0x01);
291 mmio
= ioremap(pci_resource_start(pdev
, 5),
292 pci_resource_len(pdev
, 5));
294 /* Setup some PLL stuffs */
295 switch (pdev
->device
) {
296 case PCI_DEVICE_ID_PROMISE_20270
:
297 writew(0x0d2b, mmio
+ 0x1202);
300 case PCI_DEVICE_ID_PROMISE_20271
:
301 writew(0x0826, mmio
+ 0x1202);
308 #endif /* CONFIG_PPC_PMAC */
310 static unsigned int __devinit
init_chipset_pdcnew(struct pci_dev
*dev
, const char *name
)
312 if (dev
->resource
[PCI_ROM_RESOURCE
].start
) {
313 pci_write_config_dword(dev
, PCI_ROM_ADDRESS
,
314 dev
->resource
[PCI_ROM_RESOURCE
].start
| PCI_ROM_ADDRESS_ENABLE
);
315 printk(KERN_INFO
"%s: ROM enabled at 0x%08lx\n", name
,
316 (unsigned long)dev
->resource
[PCI_ROM_RESOURCE
].start
);
319 #ifdef CONFIG_PPC_PMAC
320 apple_kiwi_init(dev
);
326 static void __devinit
init_hwif_pdc202new(ide_hwif_t
*hwif
)
330 hwif
->tuneproc
= &pdcnew_tune_drive
;
331 hwif
->quirkproc
= &pdcnew_quirkproc
;
332 hwif
->speedproc
= &pdcnew_new_tune_chipset
;
333 hwif
->resetproc
= &pdcnew_new_reset
;
335 hwif
->drives
[0].autotune
= hwif
->drives
[1].autotune
= 1;
337 hwif
->ultra_mask
= 0x7f;
338 hwif
->mwdma_mask
= 0x07;
340 hwif
->err_stops_fifo
= 1;
342 hwif
->ide_dma_check
= &pdcnew_config_drive_xfer_rate
;
343 hwif
->ide_dma_lostirq
= &pdcnew_ide_dma_lostirq
;
344 hwif
->ide_dma_timeout
= &pdcnew_ide_dma_timeout
;
345 if (!(hwif
->udma_four
))
346 hwif
->udma_four
= (pdcnew_new_cable_detect(hwif
)) ? 0 : 1;
349 hwif
->drives
[0].autodma
= hwif
->drives
[1].autodma
= hwif
->autodma
;
350 #if PDC202_DEBUG_CABLE
351 printk(KERN_DEBUG
"%s: %s-pin cable\n",
352 hwif
->name
, hwif
->udma_four
? "80" : "40");
353 #endif /* PDC202_DEBUG_CABLE */
356 static int __devinit
init_setup_pdcnew(struct pci_dev
*dev
, ide_pci_device_t
*d
)
358 return ide_setup_pci_device(dev
, d
);
361 static int __devinit
init_setup_pdc20270(struct pci_dev
*dev
,
364 struct pci_dev
*findev
= NULL
;
366 if ((dev
->bus
->self
&&
367 dev
->bus
->self
->vendor
== PCI_VENDOR_ID_DEC
) &&
368 (dev
->bus
->self
->device
== PCI_DEVICE_ID_DEC_21150
)) {
369 if (PCI_SLOT(dev
->devfn
) & 2)
372 while ((findev
= pci_find_device(PCI_ANY_ID
, PCI_ANY_ID
, findev
)) != NULL
) {
373 if ((findev
->vendor
== dev
->vendor
) &&
374 (findev
->device
== dev
->device
) &&
375 (PCI_SLOT(findev
->devfn
) & 2)) {
376 if (findev
->irq
!= dev
->irq
) {
377 findev
->irq
= dev
->irq
;
379 return ide_setup_pci_devices(dev
, findev
, d
);
383 return ide_setup_pci_device(dev
, d
);
386 static int __devinit
init_setup_pdc20276(struct pci_dev
*dev
,
389 if ((dev
->bus
->self
) &&
390 (dev
->bus
->self
->vendor
== PCI_VENDOR_ID_INTEL
) &&
391 ((dev
->bus
->self
->device
== PCI_DEVICE_ID_INTEL_I960
) ||
392 (dev
->bus
->self
->device
== PCI_DEVICE_ID_INTEL_I960RM
))) {
393 printk(KERN_INFO
"ide: Skipping Promise PDC20276 "
394 "attached to I2O RAID controller.\n");
397 return ide_setup_pci_device(dev
, d
);
400 static ide_pci_device_t pdcnew_chipsets
[] __devinitdata
= {
403 .init_setup
= init_setup_pdcnew
,
404 .init_chipset
= init_chipset_pdcnew
,
405 .init_hwif
= init_hwif_pdc202new
,
408 .bootable
= OFF_BOARD
,
411 .init_setup
= init_setup_pdcnew
,
412 .init_chipset
= init_chipset_pdcnew
,
413 .init_hwif
= init_hwif_pdc202new
,
416 .bootable
= OFF_BOARD
,
419 .init_setup
= init_setup_pdc20270
,
420 .init_chipset
= init_chipset_pdcnew
,
421 .init_hwif
= init_hwif_pdc202new
,
424 .bootable
= OFF_BOARD
,
427 .init_setup
= init_setup_pdcnew
,
428 .init_chipset
= init_chipset_pdcnew
,
429 .init_hwif
= init_hwif_pdc202new
,
432 .bootable
= OFF_BOARD
,
435 .init_setup
= init_setup_pdcnew
,
436 .init_chipset
= init_chipset_pdcnew
,
437 .init_hwif
= init_hwif_pdc202new
,
440 .bootable
= OFF_BOARD
,
443 .init_setup
= init_setup_pdc20276
,
444 .init_chipset
= init_chipset_pdcnew
,
445 .init_hwif
= init_hwif_pdc202new
,
448 .bootable
= OFF_BOARD
,
451 .init_setup
= init_setup_pdcnew
,
452 .init_chipset
= init_chipset_pdcnew
,
453 .init_hwif
= init_hwif_pdc202new
,
456 .bootable
= OFF_BOARD
,
461 * pdc202new_init_one - called when a pdc202xx is found
462 * @dev: the pdc202new device
463 * @id: the matching pci id
465 * Called when the PCI registration layer (or the IDE initialization)
466 * finds a device matching our IDE device tables.
469 static int __devinit
pdc202new_init_one(struct pci_dev
*dev
, const struct pci_device_id
*id
)
471 ide_pci_device_t
*d
= &pdcnew_chipsets
[id
->driver_data
];
473 return d
->init_setup(dev
, d
);
476 static struct pci_device_id pdc202new_pci_tbl
[] = {
477 { PCI_VENDOR_ID_PROMISE
, PCI_DEVICE_ID_PROMISE_20268
, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
478 { PCI_VENDOR_ID_PROMISE
, PCI_DEVICE_ID_PROMISE_20269
, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 1},
479 { PCI_VENDOR_ID_PROMISE
, PCI_DEVICE_ID_PROMISE_20270
, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 2},
480 { PCI_VENDOR_ID_PROMISE
, PCI_DEVICE_ID_PROMISE_20271
, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 3},
481 { PCI_VENDOR_ID_PROMISE
, PCI_DEVICE_ID_PROMISE_20275
, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 4},
482 { PCI_VENDOR_ID_PROMISE
, PCI_DEVICE_ID_PROMISE_20276
, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 5},
483 { PCI_VENDOR_ID_PROMISE
, PCI_DEVICE_ID_PROMISE_20277
, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 6},
486 MODULE_DEVICE_TABLE(pci
, pdc202new_pci_tbl
);
488 static struct pci_driver driver
= {
489 .name
= "Promise_IDE",
490 .id_table
= pdc202new_pci_tbl
,
491 .probe
= pdc202new_init_one
,
494 static int pdc202new_ide_init(void)
496 return ide_pci_register_driver(&driver
);
499 module_init(pdc202new_ide_init
);
501 MODULE_AUTHOR("Andre Hedrick, Frank Tiernan");
502 MODULE_DESCRIPTION("PCI driver module for Promise PDC20268 and higher");
503 MODULE_LICENSE("GPL");