xref: /openbmc/linux/drivers/ata/pata_oldpiix.c (revision 58e16d792a6a8c6b750f637a4649967fcac853dc)
1*09c434b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2669a5db4SJeff Garzik /*
3669a5db4SJeff Garzik  *    pata_oldpiix.c - Intel PATA/SATA controllers
4669a5db4SJeff Garzik  *
5ab771630SAlan Cox  *	(C) 2005 Red Hat
6669a5db4SJeff Garzik  *
7669a5db4SJeff Garzik  *    Some parts based on ata_piix.c by Jeff Garzik and others.
8669a5db4SJeff Garzik  *
9669a5db4SJeff Garzik  *    Early PIIX differs significantly from the later PIIX as it lacks
10669a5db4SJeff Garzik  *    SITRE and the slave timing registers. This means that you have to
11669a5db4SJeff Garzik  *    set timing per channel, or be clever. Libata tells us whenever it
12669a5db4SJeff Garzik  *    does drive selection and we use this to reload the timings.
13669a5db4SJeff Garzik  *
14669a5db4SJeff Garzik  *    Because of these behaviour differences PIIX gets its own driver module.
15669a5db4SJeff Garzik  */
16669a5db4SJeff Garzik 
17669a5db4SJeff Garzik #include <linux/kernel.h>
18669a5db4SJeff Garzik #include <linux/module.h>
19669a5db4SJeff Garzik #include <linux/pci.h>
20669a5db4SJeff Garzik #include <linux/blkdev.h>
21669a5db4SJeff Garzik #include <linux/delay.h>
22669a5db4SJeff Garzik #include <linux/device.h>
23669a5db4SJeff Garzik #include <scsi/scsi_host.h>
24669a5db4SJeff Garzik #include <linux/libata.h>
25669a5db4SJeff Garzik #include <linux/ata.h>
26669a5db4SJeff Garzik 
27669a5db4SJeff Garzik #define DRV_NAME	"pata_oldpiix"
28a0fcdc02SJeff Garzik #define DRV_VERSION	"0.5.5"
29669a5db4SJeff Garzik 
30669a5db4SJeff Garzik /**
31669a5db4SJeff Garzik  *	oldpiix_pre_reset		-	probe begin
32cc0680a5STejun Heo  *	@link: ATA link
33d4b2bab4STejun Heo  *	@deadline: deadline jiffies for the operation
34669a5db4SJeff Garzik  *
35669a5db4SJeff Garzik  *	Set up cable type and use generic probe init
36669a5db4SJeff Garzik  */
37669a5db4SJeff Garzik 
oldpiix_pre_reset(struct ata_link * link,unsigned long deadline)38cc0680a5STejun Heo static int oldpiix_pre_reset(struct ata_link *link, unsigned long deadline)
39669a5db4SJeff Garzik {
40cc0680a5STejun Heo 	struct ata_port *ap = link->ap;
41669a5db4SJeff Garzik 	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
42669a5db4SJeff Garzik 	static const struct pci_bits oldpiix_enable_bits[] = {
43669a5db4SJeff Garzik 		{ 0x41U, 1U, 0x80UL, 0x80UL },	/* port 0 */
44669a5db4SJeff Garzik 		{ 0x43U, 1U, 0x80UL, 0x80UL },	/* port 1 */
45669a5db4SJeff Garzik 	};
46669a5db4SJeff Garzik 
47c961922bSAlan Cox 	if (!pci_test_config_bits(pdev, &oldpiix_enable_bits[ap->port_no]))
48c961922bSAlan Cox 		return -ENOENT;
49d4b2bab4STejun Heo 
509363c382STejun Heo 	return ata_sff_prereset(link, deadline);
51669a5db4SJeff Garzik }
52669a5db4SJeff Garzik 
53669a5db4SJeff Garzik /**
54669a5db4SJeff Garzik  *	oldpiix_set_piomode - Initialize host controller PATA PIO timings
55669a5db4SJeff Garzik  *	@ap: Port whose timings we are configuring
56a0fcdc02SJeff Garzik  *	@adev: Device whose timings we are configuring
57669a5db4SJeff Garzik  *
58669a5db4SJeff Garzik  *	Set PIO mode for device, in host controller PCI config space.
59669a5db4SJeff Garzik  *
60669a5db4SJeff Garzik  *	LOCKING:
61669a5db4SJeff Garzik  *	None (inherited from caller).
62669a5db4SJeff Garzik  */
63669a5db4SJeff Garzik 
oldpiix_set_piomode(struct ata_port * ap,struct ata_device * adev)64669a5db4SJeff Garzik static void oldpiix_set_piomode (struct ata_port *ap, struct ata_device *adev)
65669a5db4SJeff Garzik {
66669a5db4SJeff Garzik 	unsigned int pio	= adev->pio_mode - XFER_PIO_0;
67669a5db4SJeff Garzik 	struct pci_dev *dev	= to_pci_dev(ap->host->dev);
68669a5db4SJeff Garzik 	unsigned int idetm_port= ap->port_no ? 0x42 : 0x40;
69669a5db4SJeff Garzik 	u16 idetm_data;
70669a5db4SJeff Garzik 	int control = 0;
71669a5db4SJeff Garzik 
72669a5db4SJeff Garzik 	/*
73669a5db4SJeff Garzik 	 *	See Intel Document 298600-004 for the timing programing rules
74669a5db4SJeff Garzik 	 *	for PIIX/ICH. Note that the early PIIX does not have the slave
75669a5db4SJeff Garzik 	 *	timing port at 0x44.
76669a5db4SJeff Garzik 	 */
77669a5db4SJeff Garzik 
78669a5db4SJeff Garzik 	static const	 /* ISP  RTC */
79669a5db4SJeff Garzik 	u8 timings[][2]	= { { 0, 0 },
80669a5db4SJeff Garzik 			    { 0, 0 },
81669a5db4SJeff Garzik 			    { 1, 0 },
82669a5db4SJeff Garzik 			    { 2, 1 },
83669a5db4SJeff Garzik 			    { 2, 3 }, };
84669a5db4SJeff Garzik 
85409ba47cSSergei Shtylyov 	if (pio > 1)
86409ba47cSSergei Shtylyov 		control |= 1;	/* TIME */
87669a5db4SJeff Garzik 	if (ata_pio_need_iordy(adev))
88409ba47cSSergei Shtylyov 		control |= 2;	/* IE */
89669a5db4SJeff Garzik 
90409ba47cSSergei Shtylyov 	/* Intel specifies that the prefetch/posting is for disk only */
91669a5db4SJeff Garzik 	if (adev->class == ATA_DEV_ATA)
92409ba47cSSergei Shtylyov 		control |= 4;	/* PPE */
93669a5db4SJeff Garzik 
94669a5db4SJeff Garzik 	pci_read_config_word(dev, idetm_port, &idetm_data);
95669a5db4SJeff Garzik 
96409ba47cSSergei Shtylyov 	/*
97409ba47cSSergei Shtylyov 	 * Set PPE, IE and TIME as appropriate.
98409ba47cSSergei Shtylyov 	 * Clear the other drive's timing bits.
99409ba47cSSergei Shtylyov 	 */
100669a5db4SJeff Garzik 	if (adev->devno == 0) {
101669a5db4SJeff Garzik 		idetm_data &= 0xCCE0;
102669a5db4SJeff Garzik 		idetm_data |= control;
103669a5db4SJeff Garzik 	} else {
104669a5db4SJeff Garzik 		idetm_data &= 0xCC0E;
105669a5db4SJeff Garzik 		idetm_data |= (control << 4);
106669a5db4SJeff Garzik 	}
107669a5db4SJeff Garzik 	idetm_data |= (timings[pio][0] << 12) |
108669a5db4SJeff Garzik 			(timings[pio][1] << 8);
109669a5db4SJeff Garzik 	pci_write_config_word(dev, idetm_port, idetm_data);
110669a5db4SJeff Garzik 
111669a5db4SJeff Garzik 	/* Track which port is configured */
112669a5db4SJeff Garzik 	ap->private_data = adev;
113669a5db4SJeff Garzik }
114669a5db4SJeff Garzik 
115669a5db4SJeff Garzik /**
116669a5db4SJeff Garzik  *	oldpiix_set_dmamode - Initialize host controller PATA DMA timings
117669a5db4SJeff Garzik  *	@ap: Port whose timings we are configuring
118669a5db4SJeff Garzik  *	@adev: Device to program
119669a5db4SJeff Garzik  *
120669a5db4SJeff Garzik  *	Set MWDMA mode for device, in host controller PCI config space.
121669a5db4SJeff Garzik  *
122669a5db4SJeff Garzik  *	LOCKING:
123669a5db4SJeff Garzik  *	None (inherited from caller).
124669a5db4SJeff Garzik  */
125669a5db4SJeff Garzik 
oldpiix_set_dmamode(struct ata_port * ap,struct ata_device * adev)126669a5db4SJeff Garzik static void oldpiix_set_dmamode (struct ata_port *ap, struct ata_device *adev)
127669a5db4SJeff Garzik {
128669a5db4SJeff Garzik 	struct pci_dev *dev	= to_pci_dev(ap->host->dev);
129669a5db4SJeff Garzik 	u8 idetm_port		= ap->port_no ? 0x42 : 0x40;
130669a5db4SJeff Garzik 	u16 idetm_data;
131669a5db4SJeff Garzik 
132669a5db4SJeff Garzik 	static const	 /* ISP  RTC */
133669a5db4SJeff Garzik 	u8 timings[][2]	= { { 0, 0 },
134669a5db4SJeff Garzik 			    { 0, 0 },
135669a5db4SJeff Garzik 			    { 1, 0 },
136669a5db4SJeff Garzik 			    { 2, 1 },
137669a5db4SJeff Garzik 			    { 2, 3 }, };
138669a5db4SJeff Garzik 
139669a5db4SJeff Garzik 	/*
140669a5db4SJeff Garzik 	 * MWDMA is driven by the PIO timings. We must also enable
141669a5db4SJeff Garzik 	 * IORDY unconditionally along with TIME1. PPE has already
142669a5db4SJeff Garzik 	 * been set when the PIO timing was set.
143669a5db4SJeff Garzik 	 */
144669a5db4SJeff Garzik 
145669a5db4SJeff Garzik 	unsigned int mwdma	= adev->dma_mode - XFER_MW_DMA_0;
146669a5db4SJeff Garzik 	unsigned int control;
147669a5db4SJeff Garzik 	const unsigned int needed_pio[3] = {
148669a5db4SJeff Garzik 		XFER_PIO_0, XFER_PIO_3, XFER_PIO_4
149669a5db4SJeff Garzik 	};
150669a5db4SJeff Garzik 	int pio = needed_pio[mwdma] - XFER_PIO_0;
151669a5db4SJeff Garzik 
152669a5db4SJeff Garzik 	pci_read_config_word(dev, idetm_port, &idetm_data);
153669a5db4SJeff Garzik 
154669a5db4SJeff Garzik 	control = 3;	/* IORDY|TIME0 */
155669a5db4SJeff Garzik 	/* Intel specifies that the PPE functionality is for disk only */
156669a5db4SJeff Garzik 	if (adev->class == ATA_DEV_ATA)
157669a5db4SJeff Garzik 		control |= 4;	/* PPE enable */
158669a5db4SJeff Garzik 
159669a5db4SJeff Garzik 	/* If the drive MWDMA is faster than it can do PIO then
160669a5db4SJeff Garzik 	   we must force PIO into PIO0 */
161669a5db4SJeff Garzik 
162669a5db4SJeff Garzik 	if (adev->pio_mode < needed_pio[mwdma])
163669a5db4SJeff Garzik 		/* Enable DMA timing only */
164669a5db4SJeff Garzik 		control |= 8;	/* PIO cycles in PIO0 */
165669a5db4SJeff Garzik 
166669a5db4SJeff Garzik 	/* Mask out the relevant control and timing bits we will load. Also
167669a5db4SJeff Garzik 	   clear the other drive TIME register as a precaution */
168669a5db4SJeff Garzik 	if (adev->devno == 0) {
169669a5db4SJeff Garzik 		idetm_data &= 0xCCE0;
170669a5db4SJeff Garzik 		idetm_data |= control;
171669a5db4SJeff Garzik 	} else {
172669a5db4SJeff Garzik 		idetm_data &= 0xCC0E;
173669a5db4SJeff Garzik 		idetm_data |= (control << 4);
174669a5db4SJeff Garzik 	}
175669a5db4SJeff Garzik 	idetm_data |= (timings[pio][0] << 12) | (timings[pio][1] << 8);
176669a5db4SJeff Garzik 	pci_write_config_word(dev, idetm_port, idetm_data);
177669a5db4SJeff Garzik 
178669a5db4SJeff Garzik 	/* Track which port is configured */
179669a5db4SJeff Garzik 	ap->private_data = adev;
180669a5db4SJeff Garzik }
181669a5db4SJeff Garzik 
182669a5db4SJeff Garzik /**
1839363c382STejun Heo  *	oldpiix_qc_issue	-	command issue
184669a5db4SJeff Garzik  *	@qc: command pending
185669a5db4SJeff Garzik  *
186669a5db4SJeff Garzik  *	Called when the libata layer is about to issue a command. We wrap
187669a5db4SJeff Garzik  *	this interface so that we can load the correct ATA timings if
1883a4fa0a2SRobert P. J. Day  *	necessary. Our logic also clears TIME0/TIME1 for the other device so
189669a5db4SJeff Garzik  *	that, even if we get this wrong, cycles to the other device will
190669a5db4SJeff Garzik  *	be made PIO0.
191669a5db4SJeff Garzik  */
192669a5db4SJeff Garzik 
oldpiix_qc_issue(struct ata_queued_cmd * qc)1939363c382STejun Heo static unsigned int oldpiix_qc_issue(struct ata_queued_cmd *qc)
194669a5db4SJeff Garzik {
195669a5db4SJeff Garzik 	struct ata_port *ap = qc->ap;
196669a5db4SJeff Garzik 	struct ata_device *adev = qc->dev;
197669a5db4SJeff Garzik 
198669a5db4SJeff Garzik 	if (adev != ap->private_data) {
199b7939b14SAlan 		oldpiix_set_piomode(ap, adev);
200b15b3ebaSAlan Cox 		if (ata_dma_enabled(adev))
201669a5db4SJeff Garzik 			oldpiix_set_dmamode(ap, adev);
202669a5db4SJeff Garzik 	}
203360ff783STejun Heo 	return ata_bmdma_qc_issue(qc);
204669a5db4SJeff Garzik }
205669a5db4SJeff Garzik 
206669a5db4SJeff Garzik 
207669a5db4SJeff Garzik static const struct scsi_host_template oldpiix_sht = {
20868d1d07bSTejun Heo 	ATA_BMDMA_SHT(DRV_NAME),
209669a5db4SJeff Garzik };
210669a5db4SJeff Garzik 
211029cfd6bSTejun Heo static struct ata_port_operations oldpiix_pata_ops = {
212029cfd6bSTejun Heo 	.inherits		= &ata_bmdma_port_ops,
2139363c382STejun Heo 	.qc_issue		= oldpiix_qc_issue,
214029cfd6bSTejun Heo 	.cable_detect		= ata_cable_40wire,
215669a5db4SJeff Garzik 	.set_piomode		= oldpiix_set_piomode,
216669a5db4SJeff Garzik 	.set_dmamode		= oldpiix_set_dmamode,
217a1efdabaSTejun Heo 	.prereset		= oldpiix_pre_reset,
218669a5db4SJeff Garzik };
219669a5db4SJeff Garzik 
220669a5db4SJeff Garzik 
221669a5db4SJeff Garzik /**
222669a5db4SJeff Garzik  *	oldpiix_init_one - Register PIIX ATA PCI device with kernel services
223669a5db4SJeff Garzik  *	@pdev: PCI device to register
224669a5db4SJeff Garzik  *	@ent: Entry in oldpiix_pci_tbl matching with @pdev
225669a5db4SJeff Garzik  *
226669a5db4SJeff Garzik  *	Called from kernel PCI layer.  We probe for combined mode (sigh),
227669a5db4SJeff Garzik  *	and then hand over control to libata, for it to do the rest.
228669a5db4SJeff Garzik  *
229669a5db4SJeff Garzik  *	LOCKING:
230669a5db4SJeff Garzik  *	Inherited from PCI layer (may sleep).
231669a5db4SJeff Garzik  *
232669a5db4SJeff Garzik  *	RETURNS:
233669a5db4SJeff Garzik  *	Zero on success, or -ERRNO value.
234669a5db4SJeff Garzik  */
235669a5db4SJeff Garzik 
oldpiix_init_one(struct pci_dev * pdev,const struct pci_device_id * ent)236669a5db4SJeff Garzik static int oldpiix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
237669a5db4SJeff Garzik {
2381626aeb8STejun Heo 	static const struct ata_port_info info = {
2391d2808fdSJeff Garzik 		.flags		= ATA_FLAG_SLAVE_POSS,
24014bdef98SErik Inge Bolsø 		.pio_mask	= ATA_PIO4,
24182563232SBartlomiej Zolnierkiewicz 		.mwdma_mask	= ATA_MWDMA12_ONLY,
242669a5db4SJeff Garzik 		.port_ops	= &oldpiix_pata_ops,
243669a5db4SJeff Garzik 	};
2441626aeb8STejun Heo 	const struct ata_port_info *ppi[] = { &info, NULL };
245669a5db4SJeff Garzik 
24606296a1eSJoe Perches 	ata_print_version_once(&pdev->dev, DRV_VERSION);
247669a5db4SJeff Garzik 
2481c5afdf7STejun Heo 	return ata_pci_bmdma_init_one(pdev, ppi, &oldpiix_sht, NULL, 0);
249669a5db4SJeff Garzik }
250669a5db4SJeff Garzik 
251669a5db4SJeff Garzik static const struct pci_device_id oldpiix_pci_tbl[] = {
2522d2744fcSJeff Garzik 	{ PCI_VDEVICE(INTEL, 0x1230), },
2532d2744fcSJeff Garzik 
254669a5db4SJeff Garzik 	{ }	/* terminate list */
255669a5db4SJeff Garzik };
256669a5db4SJeff Garzik 
257669a5db4SJeff Garzik static struct pci_driver oldpiix_pci_driver = {
258669a5db4SJeff Garzik 	.name			= DRV_NAME,
259669a5db4SJeff Garzik 	.id_table		= oldpiix_pci_tbl,
260669a5db4SJeff Garzik 	.probe			= oldpiix_init_one,
261669a5db4SJeff Garzik 	.remove			= ata_pci_remove_one,
26258eb8cd5SBartlomiej Zolnierkiewicz #ifdef CONFIG_PM_SLEEP
26330ced0f0SAlan 	.suspend		= ata_pci_device_suspend,
26430ced0f0SAlan 	.resume			= ata_pci_device_resume,
265438ac6d5STejun Heo #endif
266669a5db4SJeff Garzik };
267669a5db4SJeff Garzik 
2682fc75da0SAxel Lin module_pci_driver(oldpiix_pci_driver);
269669a5db4SJeff Garzik 
270669a5db4SJeff Garzik MODULE_AUTHOR("Alan Cox");
271669a5db4SJeff Garzik MODULE_DESCRIPTION("SCSI low-level driver for early PIIX series controllers");
272669a5db4SJeff Garzik MODULE_LICENSE("GPL");
273669a5db4SJeff Garzik MODULE_DEVICE_TABLE(pci, oldpiix_pci_tbl);
274669a5db4SJeff Garzik MODULE_VERSION(DRV_VERSION);
275