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");