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