1669a5db4SJeff Garzik /*
2669a5db4SJeff Garzik * ata_generic.c - Generic PATA/SATA controller driver.
3ab771630SAlan Cox * Copyright 2005 Red Hat Inc, all rights reserved.
4669a5db4SJeff Garzik *
5669a5db4SJeff Garzik * Elements from ide/pci/generic.c
6669a5db4SJeff Garzik * Copyright (C) 2001-2002 Andre Hedrick <andre@linux-ide.org>
7669a5db4SJeff Garzik * Portions (C) Copyright 2002 Red Hat Inc <alan@redhat.com>
8669a5db4SJeff Garzik *
9669a5db4SJeff Garzik * May be copied or modified under the terms of the GNU General Public License
10669a5db4SJeff Garzik *
11669a5db4SJeff Garzik * Driver for PCI IDE interfaces implementing the standard bus mastering
12669a5db4SJeff Garzik * interface functionality. This assumes the BIOS did the drive set up and
13669a5db4SJeff Garzik * tuning for us. By default we do not grab all IDE class devices as they
14669a5db4SJeff Garzik * may have other drivers or need fixups to avoid problems. Instead we keep
15669a5db4SJeff Garzik * a default list of stuff without documentation/driver that appears to
16669a5db4SJeff Garzik * work.
17669a5db4SJeff Garzik */
18669a5db4SJeff Garzik
19669a5db4SJeff Garzik #include <linux/kernel.h>
20669a5db4SJeff Garzik #include <linux/module.h>
21669a5db4SJeff Garzik #include <linux/pci.h>
22669a5db4SJeff Garzik #include <linux/blkdev.h>
23669a5db4SJeff Garzik #include <linux/delay.h>
24669a5db4SJeff Garzik #include <scsi/scsi_host.h>
25669a5db4SJeff Garzik #include <linux/libata.h>
26669a5db4SJeff Garzik
27669a5db4SJeff Garzik #define DRV_NAME "ata_generic"
285e8f757cSAlan Cox #define DRV_VERSION "0.2.15"
29669a5db4SJeff Garzik
30669a5db4SJeff Garzik /*
31669a5db4SJeff Garzik * A generic parallel ATA driver using libata
32669a5db4SJeff Garzik */
33669a5db4SJeff Garzik
341529c69aSTejun Heo enum {
351529c69aSTejun Heo ATA_GEN_CLASS_MATCH = (1 << 0),
361529c69aSTejun Heo ATA_GEN_FORCE_DMA = (1 << 1),
3760039a52SAlan Cox ATA_GEN_INTEL_IDER = (1 << 2),
381529c69aSTejun Heo };
391529c69aSTejun Heo
40669a5db4SJeff Garzik /**
41669a5db4SJeff Garzik * generic_set_mode - mode setting
420260731fSTejun Heo * @link: link to set up
43b229a7b0SAlan * @unused: returned device on error
44669a5db4SJeff Garzik *
45669a5db4SJeff Garzik * Use a non standard set_mode function. We don't want to be tuned.
46669a5db4SJeff Garzik * The BIOS configured everything. Our job is not to fiddle. We
47669a5db4SJeff Garzik * read the dma enabled bits from the PCI configuration of the device
48669a5db4SJeff Garzik * and respect them.
49669a5db4SJeff Garzik */
50669a5db4SJeff Garzik
generic_set_mode(struct ata_link * link,struct ata_device ** unused)510260731fSTejun Heo static int generic_set_mode(struct ata_link *link, struct ata_device **unused)
52669a5db4SJeff Garzik {
530260731fSTejun Heo struct ata_port *ap = link->ap;
541529c69aSTejun Heo const struct pci_device_id *id = ap->host->private_data;
55669a5db4SJeff Garzik int dma_enabled = 0;
56f58229f8STejun Heo struct ata_device *dev;
57669a5db4SJeff Garzik
581529c69aSTejun Heo if (id->driver_data & ATA_GEN_FORCE_DMA) {
591529c69aSTejun Heo dma_enabled = 0xff;
601529c69aSTejun Heo } else if (ap->ioaddr.bmdma_addr) {
61669a5db4SJeff Garzik /* Bits 5 and 6 indicate if DMA is active on master/slave */
62d6f4d5eaSAlan Cox dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
631529c69aSTejun Heo }
64669a5db4SJeff Garzik
651eca4365STejun Heo ata_for_each_dev(dev, link, ENABLED) {
66669a5db4SJeff Garzik /* We don't really care */
67669a5db4SJeff Garzik dev->pio_mode = XFER_PIO_0;
68669a5db4SJeff Garzik dev->dma_mode = XFER_MW_DMA_0;
69669a5db4SJeff Garzik /* We do need the right mode information for DMA or PIO
70669a5db4SJeff Garzik and this comes from the current configuration flags */
71f58229f8STejun Heo if (dma_enabled & (1 << (5 + dev->devno))) {
729d3501abSTejun Heo unsigned int xfer_mask = ata_id_xfermask(dev->id);
739d3501abSTejun Heo const char *name;
749d3501abSTejun Heo
759d3501abSTejun Heo if (xfer_mask & (ATA_MASK_MWDMA | ATA_MASK_UDMA))
769d3501abSTejun Heo name = ata_mode_string(xfer_mask);
779d3501abSTejun Heo else {
789d3501abSTejun Heo /* SWDMA perhaps? */
799d3501abSTejun Heo name = "DMA";
809d3501abSTejun Heo xfer_mask |= ata_xfer_mode2mask(XFER_MW_DMA_0);
819d3501abSTejun Heo }
829d3501abSTejun Heo
83a9a79dfeSJoe Perches ata_dev_info(dev, "configured for %s\n", name);
849d3501abSTejun Heo
859d3501abSTejun Heo dev->xfer_mode = ata_xfer_mask2mode(xfer_mask);
869d3501abSTejun Heo dev->xfer_shift = ata_xfer_mode2shift(dev->xfer_mode);
87669a5db4SJeff Garzik dev->flags &= ~ATA_DFLAG_PIO;
88669a5db4SJeff Garzik } else {
89a9a79dfeSJoe Perches ata_dev_info(dev, "configured for PIO\n");
90669a5db4SJeff Garzik dev->xfer_mode = XFER_PIO_0;
91669a5db4SJeff Garzik dev->xfer_shift = ATA_SHIFT_PIO;
92669a5db4SJeff Garzik dev->flags |= ATA_DFLAG_PIO;
93669a5db4SJeff Garzik }
94669a5db4SJeff Garzik }
95b229a7b0SAlan return 0;
96669a5db4SJeff Garzik }
97669a5db4SJeff Garzik
98*25df73d9SBart Van Assche static const struct scsi_host_template generic_sht = {
9968d1d07bSTejun Heo ATA_BMDMA_SHT(DRV_NAME),
100669a5db4SJeff Garzik };
101669a5db4SJeff Garzik
102669a5db4SJeff Garzik static struct ata_port_operations generic_port_ops = {
103029cfd6bSTejun Heo .inherits = &ata_bmdma_port_ops,
104eb4a2c7fSAlan Cox .cable_detect = ata_cable_unknown,
105029cfd6bSTejun Heo .set_mode = generic_set_mode,
106669a5db4SJeff Garzik };
107669a5db4SJeff Garzik
108669a5db4SJeff Garzik static int all_generic_ide; /* Set to claim all devices */
109669a5db4SJeff Garzik
110669a5db4SJeff Garzik /**
11160039a52SAlan Cox * is_intel_ider - identify intel IDE-R devices
11260039a52SAlan Cox * @dev: PCI device
11360039a52SAlan Cox *
11460039a52SAlan Cox * Distinguish Intel IDE-R controller devices from other Intel IDE
11560039a52SAlan Cox * devices. IDE-R devices have no timing registers and are in
11660039a52SAlan Cox * most respects virtual. They should be driven by the ata_generic
11760039a52SAlan Cox * driver.
11860039a52SAlan Cox *
11960039a52SAlan Cox * IDE-R devices have PCI offset 0xF8.L as zero, later Intel ATA has
12060039a52SAlan Cox * it non zero. All Intel ATA has 0x40 writable (timing), but it is
12160039a52SAlan Cox * not writable on IDE-R devices (this is guaranteed).
12260039a52SAlan Cox */
12360039a52SAlan Cox
is_intel_ider(struct pci_dev * dev)12460039a52SAlan Cox static int is_intel_ider(struct pci_dev *dev)
12560039a52SAlan Cox {
12660039a52SAlan Cox /* For Intel IDE the value at 0xF8 is only zero on IDE-R
12760039a52SAlan Cox interfaces */
12860039a52SAlan Cox u32 r;
12960039a52SAlan Cox u16 t;
13060039a52SAlan Cox
13160039a52SAlan Cox /* Check the manufacturing ID, it will be zero for IDE-R */
13260039a52SAlan Cox pci_read_config_dword(dev, 0xF8, &r);
13360039a52SAlan Cox /* Not IDE-R: punt so that ata_(old)piix gets it */
13460039a52SAlan Cox if (r != 0)
13560039a52SAlan Cox return 0;
13660039a52SAlan Cox /* 0xF8 will also be zero on some early Intel IDE devices
13760039a52SAlan Cox but they will have a sane timing register */
13860039a52SAlan Cox pci_read_config_word(dev, 0x40, &t);
13960039a52SAlan Cox if (t != 0)
14060039a52SAlan Cox return 0;
14160039a52SAlan Cox /* Finally check if the timing register is writable so that
14260039a52SAlan Cox we eliminate any early devices hot-docked in a docking
14360039a52SAlan Cox station */
14460039a52SAlan Cox pci_write_config_word(dev, 0x40, 1);
14560039a52SAlan Cox pci_read_config_word(dev, 0x40, &t);
14660039a52SAlan Cox if (t) {
14760039a52SAlan Cox pci_write_config_word(dev, 0x40, 0);
14860039a52SAlan Cox return 0;
14960039a52SAlan Cox }
15060039a52SAlan Cox return 1;
15160039a52SAlan Cox }
15260039a52SAlan Cox
15360039a52SAlan Cox /**
154b7ab575fSLee Jones * ata_generic_init_one - attach generic IDE
155669a5db4SJeff Garzik * @dev: PCI device found
156669a5db4SJeff Garzik * @id: match entry
157669a5db4SJeff Garzik *
158669a5db4SJeff Garzik * Called each time a matching IDE interface is found. We check if the
159669a5db4SJeff Garzik * interface is one we wish to claim and if so we perform any chip
160669a5db4SJeff Garzik * specific hacks then let the ATA layer do the heavy lifting.
161669a5db4SJeff Garzik */
162669a5db4SJeff Garzik
ata_generic_init_one(struct pci_dev * dev,const struct pci_device_id * id)163669a5db4SJeff Garzik static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id *id)
164669a5db4SJeff Garzik {
165669a5db4SJeff Garzik u16 command;
1661626aeb8STejun Heo static const struct ata_port_info info = {
1671d2808fdSJeff Garzik .flags = ATA_FLAG_SLAVE_POSS,
16814bdef98SErik Inge Bolsø .pio_mask = ATA_PIO4,
16914bdef98SErik Inge Bolsø .mwdma_mask = ATA_MWDMA2,
170bf6263a8SJeff Garzik .udma_mask = ATA_UDMA5,
171669a5db4SJeff Garzik .port_ops = &generic_port_ops
172669a5db4SJeff Garzik };
1731626aeb8STejun Heo const struct ata_port_info *ppi[] = { &info, NULL };
174669a5db4SJeff Garzik
175669a5db4SJeff Garzik /* Don't use the generic entry unless instructed to do so */
1761529c69aSTejun Heo if ((id->driver_data & ATA_GEN_CLASS_MATCH) && all_generic_ide == 0)
177669a5db4SJeff Garzik return -ENODEV;
178669a5db4SJeff Garzik
17947ee9108SAndi Kleen if ((id->driver_data & ATA_GEN_INTEL_IDER) && !all_generic_ide)
18060039a52SAlan Cox if (!is_intel_ider(dev))
18160039a52SAlan Cox return -ENODEV;
18260039a52SAlan Cox
183669a5db4SJeff Garzik /* Devices that need care */
184669a5db4SJeff Garzik if (dev->vendor == PCI_VENDOR_ID_UMC &&
185669a5db4SJeff Garzik dev->device == PCI_DEVICE_ID_UMC_UM8886A &&
186669a5db4SJeff Garzik (!(PCI_FUNC(dev->devfn) & 1)))
187669a5db4SJeff Garzik return -ENODEV;
188669a5db4SJeff Garzik
189669a5db4SJeff Garzik if (dev->vendor == PCI_VENDOR_ID_OPTI &&
190669a5db4SJeff Garzik dev->device == PCI_DEVICE_ID_OPTI_82C558 &&
191669a5db4SJeff Garzik (!(PCI_FUNC(dev->devfn) & 1)))
192669a5db4SJeff Garzik return -ENODEV;
193669a5db4SJeff Garzik
194669a5db4SJeff Garzik /* Don't re-enable devices in generic mode or we will break some
195669a5db4SJeff Garzik motherboards with disabled and unused IDE controllers */
196669a5db4SJeff Garzik pci_read_config_word(dev, PCI_COMMAND, &command);
197669a5db4SJeff Garzik if (!(command & PCI_COMMAND_IO))
198669a5db4SJeff Garzik return -ENODEV;
199669a5db4SJeff Garzik
200669a5db4SJeff Garzik if (dev->vendor == PCI_VENDOR_ID_AL)
2019363c382STejun Heo ata_pci_bmdma_clear_simplex(dev);
202669a5db4SJeff Garzik
20305177f17SAlan Cox if (dev->vendor == PCI_VENDOR_ID_ATI) {
20405177f17SAlan Cox int rc = pcim_enable_device(dev);
20505177f17SAlan Cox if (rc < 0)
20605177f17SAlan Cox return rc;
20705177f17SAlan Cox pcim_pin_device(dev);
20805177f17SAlan Cox }
2091529c69aSTejun Heo return ata_pci_bmdma_init_one(dev, ppi, &generic_sht, (void *)id, 0);
210669a5db4SJeff Garzik }
211669a5db4SJeff Garzik
212669a5db4SJeff Garzik static struct pci_device_id ata_generic[] = {
213669a5db4SJeff Garzik { PCI_DEVICE(PCI_VENDOR_ID_PCTECH, PCI_DEVICE_ID_PCTECH_SAMURAI_IDE), },
214669a5db4SJeff Garzik { PCI_DEVICE(PCI_VENDOR_ID_HOLTEK, PCI_DEVICE_ID_HOLTEK_6565), },
215669a5db4SJeff Garzik { PCI_DEVICE(PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8673F), },
216669a5db4SJeff Garzik { PCI_DEVICE(PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8886A), },
217669a5db4SJeff Garzik { PCI_DEVICE(PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8886BF), },
218669a5db4SJeff Garzik { PCI_DEVICE(PCI_VENDOR_ID_HINT, PCI_DEVICE_ID_HINT_VXPROII_IDE), },
219669a5db4SJeff Garzik { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C561), },
220669a5db4SJeff Garzik { PCI_DEVICE(PCI_VENDOR_ID_OPTI, PCI_DEVICE_ID_OPTI_82C558), },
2211529c69aSTejun Heo { PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE),
2221529c69aSTejun Heo .driver_data = ATA_GEN_FORCE_DMA },
2238e182a90SAlan Cox #if !defined(CONFIG_PATA_TOSHIBA) && !defined(CONFIG_PATA_TOSHIBA_MODULE)
224669a5db4SJeff Garzik { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), },
225669a5db4SJeff Garzik { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2), },
2268e182a90SAlan Cox { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_3), },
2278e182a90SAlan Cox { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_5), },
2288e182a90SAlan Cox #endif
22960039a52SAlan Cox /* Intel, IDE class device */
23060039a52SAlan Cox { PCI_VENDOR_ID_INTEL, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
23160039a52SAlan Cox PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL,
23260039a52SAlan Cox .driver_data = ATA_GEN_INTEL_IDER },
233669a5db4SJeff Garzik /* Must come last. If you add entries adjust this table appropriately */
2341529c69aSTejun Heo { PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL),
2351529c69aSTejun Heo .driver_data = ATA_GEN_CLASS_MATCH },
236669a5db4SJeff Garzik { 0, },
237669a5db4SJeff Garzik };
238669a5db4SJeff Garzik
239669a5db4SJeff Garzik static struct pci_driver ata_generic_pci_driver = {
240669a5db4SJeff Garzik .name = DRV_NAME,
241669a5db4SJeff Garzik .id_table = ata_generic,
242669a5db4SJeff Garzik .probe = ata_generic_init_one,
24330ced0f0SAlan .remove = ata_pci_remove_one,
24458eb8cd5SBartlomiej Zolnierkiewicz #ifdef CONFIG_PM_SLEEP
24530ced0f0SAlan .suspend = ata_pci_device_suspend,
24630ced0f0SAlan .resume = ata_pci_device_resume,
247438ac6d5STejun Heo #endif
248669a5db4SJeff Garzik };
249669a5db4SJeff Garzik
2502fc75da0SAxel Lin module_pci_driver(ata_generic_pci_driver);
251669a5db4SJeff Garzik
252669a5db4SJeff Garzik MODULE_AUTHOR("Alan Cox");
253669a5db4SJeff Garzik MODULE_DESCRIPTION("low-level driver for generic ATA");
254669a5db4SJeff Garzik MODULE_LICENSE("GPL");
255669a5db4SJeff Garzik MODULE_DEVICE_TABLE(pci, ata_generic);
256669a5db4SJeff Garzik MODULE_VERSION(DRV_VERSION);
257669a5db4SJeff Garzik
258669a5db4SJeff Garzik module_param(all_generic_ide, int, 0);
259