xref: /openbmc/linux/drivers/ata/ata_generic.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
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