1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * sata_svw.c - ServerWorks / Apple K2 SATA
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Maintained by: Benjamin Herrenschmidt <benh@kernel.crashing.org> and
6*4882a593Smuzhiyun * Jeff Garzik <jgarzik@pobox.com>
7*4882a593Smuzhiyun * Please ALWAYS copy linux-ide@vger.kernel.org
8*4882a593Smuzhiyun * on emails.
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * Copyright 2003 Benjamin Herrenschmidt <benh@kernel.crashing.org>
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun * Bits from Jeff Garzik, Copyright RedHat, Inc.
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun * This driver probably works with non-Apple versions of the
15*4882a593Smuzhiyun * Broadcom chipset...
16*4882a593Smuzhiyun *
17*4882a593Smuzhiyun * libata documentation is available via 'make {ps|pdf}docs',
18*4882a593Smuzhiyun * as Documentation/driver-api/libata.rst
19*4882a593Smuzhiyun *
20*4882a593Smuzhiyun * Hardware documentation available under NDA.
21*4882a593Smuzhiyun */
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun #include <linux/kernel.h>
24*4882a593Smuzhiyun #include <linux/module.h>
25*4882a593Smuzhiyun #include <linux/pci.h>
26*4882a593Smuzhiyun #include <linux/blkdev.h>
27*4882a593Smuzhiyun #include <linux/delay.h>
28*4882a593Smuzhiyun #include <linux/interrupt.h>
29*4882a593Smuzhiyun #include <linux/device.h>
30*4882a593Smuzhiyun #include <scsi/scsi_host.h>
31*4882a593Smuzhiyun #include <scsi/scsi_cmnd.h>
32*4882a593Smuzhiyun #include <scsi/scsi.h>
33*4882a593Smuzhiyun #include <linux/libata.h>
34*4882a593Smuzhiyun #include <linux/of.h>
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #define DRV_NAME "sata_svw"
37*4882a593Smuzhiyun #define DRV_VERSION "2.3"
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun enum {
40*4882a593Smuzhiyun /* ap->flags bits */
41*4882a593Smuzhiyun K2_FLAG_SATA_8_PORTS = (1 << 24),
42*4882a593Smuzhiyun K2_FLAG_NO_ATAPI_DMA = (1 << 25),
43*4882a593Smuzhiyun K2_FLAG_BAR_POS_3 = (1 << 26),
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun /* Taskfile registers offsets */
46*4882a593Smuzhiyun K2_SATA_TF_CMD_OFFSET = 0x00,
47*4882a593Smuzhiyun K2_SATA_TF_DATA_OFFSET = 0x00,
48*4882a593Smuzhiyun K2_SATA_TF_ERROR_OFFSET = 0x04,
49*4882a593Smuzhiyun K2_SATA_TF_NSECT_OFFSET = 0x08,
50*4882a593Smuzhiyun K2_SATA_TF_LBAL_OFFSET = 0x0c,
51*4882a593Smuzhiyun K2_SATA_TF_LBAM_OFFSET = 0x10,
52*4882a593Smuzhiyun K2_SATA_TF_LBAH_OFFSET = 0x14,
53*4882a593Smuzhiyun K2_SATA_TF_DEVICE_OFFSET = 0x18,
54*4882a593Smuzhiyun K2_SATA_TF_CMDSTAT_OFFSET = 0x1c,
55*4882a593Smuzhiyun K2_SATA_TF_CTL_OFFSET = 0x20,
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun /* DMA base */
58*4882a593Smuzhiyun K2_SATA_DMA_CMD_OFFSET = 0x30,
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun /* SCRs base */
61*4882a593Smuzhiyun K2_SATA_SCR_STATUS_OFFSET = 0x40,
62*4882a593Smuzhiyun K2_SATA_SCR_ERROR_OFFSET = 0x44,
63*4882a593Smuzhiyun K2_SATA_SCR_CONTROL_OFFSET = 0x48,
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun /* Others */
66*4882a593Smuzhiyun K2_SATA_SICR1_OFFSET = 0x80,
67*4882a593Smuzhiyun K2_SATA_SICR2_OFFSET = 0x84,
68*4882a593Smuzhiyun K2_SATA_SIM_OFFSET = 0x88,
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun /* Port stride */
71*4882a593Smuzhiyun K2_SATA_PORT_OFFSET = 0x100,
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun chip_svw4 = 0,
74*4882a593Smuzhiyun chip_svw8 = 1,
75*4882a593Smuzhiyun chip_svw42 = 2, /* bar 3 */
76*4882a593Smuzhiyun chip_svw43 = 3, /* bar 5 */
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun static u8 k2_stat_check_status(struct ata_port *ap);
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun
k2_sata_check_atapi_dma(struct ata_queued_cmd * qc)82*4882a593Smuzhiyun static int k2_sata_check_atapi_dma(struct ata_queued_cmd *qc)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun u8 cmnd = qc->scsicmd->cmnd[0];
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun if (qc->ap->flags & K2_FLAG_NO_ATAPI_DMA)
87*4882a593Smuzhiyun return -1; /* ATAPI DMA not supported */
88*4882a593Smuzhiyun else {
89*4882a593Smuzhiyun switch (cmnd) {
90*4882a593Smuzhiyun case READ_10:
91*4882a593Smuzhiyun case READ_12:
92*4882a593Smuzhiyun case READ_16:
93*4882a593Smuzhiyun case WRITE_10:
94*4882a593Smuzhiyun case WRITE_12:
95*4882a593Smuzhiyun case WRITE_16:
96*4882a593Smuzhiyun return 0;
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun default:
99*4882a593Smuzhiyun return -1;
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun
k2_sata_scr_read(struct ata_link * link,unsigned int sc_reg,u32 * val)105*4882a593Smuzhiyun static int k2_sata_scr_read(struct ata_link *link,
106*4882a593Smuzhiyun unsigned int sc_reg, u32 *val)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun if (sc_reg > SCR_CONTROL)
109*4882a593Smuzhiyun return -EINVAL;
110*4882a593Smuzhiyun *val = readl(link->ap->ioaddr.scr_addr + (sc_reg * 4));
111*4882a593Smuzhiyun return 0;
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun
k2_sata_scr_write(struct ata_link * link,unsigned int sc_reg,u32 val)115*4882a593Smuzhiyun static int k2_sata_scr_write(struct ata_link *link,
116*4882a593Smuzhiyun unsigned int sc_reg, u32 val)
117*4882a593Smuzhiyun {
118*4882a593Smuzhiyun if (sc_reg > SCR_CONTROL)
119*4882a593Smuzhiyun return -EINVAL;
120*4882a593Smuzhiyun writel(val, link->ap->ioaddr.scr_addr + (sc_reg * 4));
121*4882a593Smuzhiyun return 0;
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun
k2_sata_softreset(struct ata_link * link,unsigned int * class,unsigned long deadline)124*4882a593Smuzhiyun static int k2_sata_softreset(struct ata_link *link,
125*4882a593Smuzhiyun unsigned int *class, unsigned long deadline)
126*4882a593Smuzhiyun {
127*4882a593Smuzhiyun u8 dmactl;
128*4882a593Smuzhiyun void __iomem *mmio = link->ap->ioaddr.bmdma_addr;
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun dmactl = readb(mmio + ATA_DMA_CMD);
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun /* Clear the start bit */
133*4882a593Smuzhiyun if (dmactl & ATA_DMA_START) {
134*4882a593Smuzhiyun dmactl &= ~ATA_DMA_START;
135*4882a593Smuzhiyun writeb(dmactl, mmio + ATA_DMA_CMD);
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun return ata_sff_softreset(link, class, deadline);
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun
k2_sata_hardreset(struct ata_link * link,unsigned int * class,unsigned long deadline)141*4882a593Smuzhiyun static int k2_sata_hardreset(struct ata_link *link,
142*4882a593Smuzhiyun unsigned int *class, unsigned long deadline)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun u8 dmactl;
145*4882a593Smuzhiyun void __iomem *mmio = link->ap->ioaddr.bmdma_addr;
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun dmactl = readb(mmio + ATA_DMA_CMD);
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun /* Clear the start bit */
150*4882a593Smuzhiyun if (dmactl & ATA_DMA_START) {
151*4882a593Smuzhiyun dmactl &= ~ATA_DMA_START;
152*4882a593Smuzhiyun writeb(dmactl, mmio + ATA_DMA_CMD);
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun return sata_sff_hardreset(link, class, deadline);
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
k2_sata_tf_load(struct ata_port * ap,const struct ata_taskfile * tf)158*4882a593Smuzhiyun static void k2_sata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun struct ata_ioports *ioaddr = &ap->ioaddr;
161*4882a593Smuzhiyun unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR;
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun if (tf->ctl != ap->last_ctl) {
164*4882a593Smuzhiyun writeb(tf->ctl, ioaddr->ctl_addr);
165*4882a593Smuzhiyun ap->last_ctl = tf->ctl;
166*4882a593Smuzhiyun ata_wait_idle(ap);
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) {
169*4882a593Smuzhiyun writew(tf->feature | (((u16)tf->hob_feature) << 8),
170*4882a593Smuzhiyun ioaddr->feature_addr);
171*4882a593Smuzhiyun writew(tf->nsect | (((u16)tf->hob_nsect) << 8),
172*4882a593Smuzhiyun ioaddr->nsect_addr);
173*4882a593Smuzhiyun writew(tf->lbal | (((u16)tf->hob_lbal) << 8),
174*4882a593Smuzhiyun ioaddr->lbal_addr);
175*4882a593Smuzhiyun writew(tf->lbam | (((u16)tf->hob_lbam) << 8),
176*4882a593Smuzhiyun ioaddr->lbam_addr);
177*4882a593Smuzhiyun writew(tf->lbah | (((u16)tf->hob_lbah) << 8),
178*4882a593Smuzhiyun ioaddr->lbah_addr);
179*4882a593Smuzhiyun } else if (is_addr) {
180*4882a593Smuzhiyun writew(tf->feature, ioaddr->feature_addr);
181*4882a593Smuzhiyun writew(tf->nsect, ioaddr->nsect_addr);
182*4882a593Smuzhiyun writew(tf->lbal, ioaddr->lbal_addr);
183*4882a593Smuzhiyun writew(tf->lbam, ioaddr->lbam_addr);
184*4882a593Smuzhiyun writew(tf->lbah, ioaddr->lbah_addr);
185*4882a593Smuzhiyun }
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun if (tf->flags & ATA_TFLAG_DEVICE)
188*4882a593Smuzhiyun writeb(tf->device, ioaddr->device_addr);
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun ata_wait_idle(ap);
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun
k2_sata_tf_read(struct ata_port * ap,struct ata_taskfile * tf)194*4882a593Smuzhiyun static void k2_sata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun struct ata_ioports *ioaddr = &ap->ioaddr;
197*4882a593Smuzhiyun u16 nsect, lbal, lbam, lbah, feature;
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun tf->command = k2_stat_check_status(ap);
200*4882a593Smuzhiyun tf->device = readw(ioaddr->device_addr);
201*4882a593Smuzhiyun feature = readw(ioaddr->error_addr);
202*4882a593Smuzhiyun nsect = readw(ioaddr->nsect_addr);
203*4882a593Smuzhiyun lbal = readw(ioaddr->lbal_addr);
204*4882a593Smuzhiyun lbam = readw(ioaddr->lbam_addr);
205*4882a593Smuzhiyun lbah = readw(ioaddr->lbah_addr);
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun tf->feature = feature;
208*4882a593Smuzhiyun tf->nsect = nsect;
209*4882a593Smuzhiyun tf->lbal = lbal;
210*4882a593Smuzhiyun tf->lbam = lbam;
211*4882a593Smuzhiyun tf->lbah = lbah;
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun if (tf->flags & ATA_TFLAG_LBA48) {
214*4882a593Smuzhiyun tf->hob_feature = feature >> 8;
215*4882a593Smuzhiyun tf->hob_nsect = nsect >> 8;
216*4882a593Smuzhiyun tf->hob_lbal = lbal >> 8;
217*4882a593Smuzhiyun tf->hob_lbam = lbam >> 8;
218*4882a593Smuzhiyun tf->hob_lbah = lbah >> 8;
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun /**
223*4882a593Smuzhiyun * k2_bmdma_setup_mmio - Set up PCI IDE BMDMA transaction (MMIO)
224*4882a593Smuzhiyun * @qc: Info associated with this ATA transaction.
225*4882a593Smuzhiyun *
226*4882a593Smuzhiyun * LOCKING:
227*4882a593Smuzhiyun * spin_lock_irqsave(host lock)
228*4882a593Smuzhiyun */
229*4882a593Smuzhiyun
k2_bmdma_setup_mmio(struct ata_queued_cmd * qc)230*4882a593Smuzhiyun static void k2_bmdma_setup_mmio(struct ata_queued_cmd *qc)
231*4882a593Smuzhiyun {
232*4882a593Smuzhiyun struct ata_port *ap = qc->ap;
233*4882a593Smuzhiyun unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE);
234*4882a593Smuzhiyun u8 dmactl;
235*4882a593Smuzhiyun void __iomem *mmio = ap->ioaddr.bmdma_addr;
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun /* load PRD table addr. */
238*4882a593Smuzhiyun mb(); /* make sure PRD table writes are visible to controller */
239*4882a593Smuzhiyun writel(ap->bmdma_prd_dma, mmio + ATA_DMA_TABLE_OFS);
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun /* specify data direction, triple-check start bit is clear */
242*4882a593Smuzhiyun dmactl = readb(mmio + ATA_DMA_CMD);
243*4882a593Smuzhiyun dmactl &= ~(ATA_DMA_WR | ATA_DMA_START);
244*4882a593Smuzhiyun if (!rw)
245*4882a593Smuzhiyun dmactl |= ATA_DMA_WR;
246*4882a593Smuzhiyun writeb(dmactl, mmio + ATA_DMA_CMD);
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun /* issue r/w command if this is not a ATA DMA command*/
249*4882a593Smuzhiyun if (qc->tf.protocol != ATA_PROT_DMA)
250*4882a593Smuzhiyun ap->ops->sff_exec_command(ap, &qc->tf);
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun /**
254*4882a593Smuzhiyun * k2_bmdma_start_mmio - Start a PCI IDE BMDMA transaction (MMIO)
255*4882a593Smuzhiyun * @qc: Info associated with this ATA transaction.
256*4882a593Smuzhiyun *
257*4882a593Smuzhiyun * LOCKING:
258*4882a593Smuzhiyun * spin_lock_irqsave(host lock)
259*4882a593Smuzhiyun */
260*4882a593Smuzhiyun
k2_bmdma_start_mmio(struct ata_queued_cmd * qc)261*4882a593Smuzhiyun static void k2_bmdma_start_mmio(struct ata_queued_cmd *qc)
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun struct ata_port *ap = qc->ap;
264*4882a593Smuzhiyun void __iomem *mmio = ap->ioaddr.bmdma_addr;
265*4882a593Smuzhiyun u8 dmactl;
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun /* start host DMA transaction */
268*4882a593Smuzhiyun dmactl = readb(mmio + ATA_DMA_CMD);
269*4882a593Smuzhiyun writeb(dmactl | ATA_DMA_START, mmio + ATA_DMA_CMD);
270*4882a593Smuzhiyun /* This works around possible data corruption.
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun On certain SATA controllers that can be seen when the r/w
273*4882a593Smuzhiyun command is given to the controller before the host DMA is
274*4882a593Smuzhiyun started.
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun On a Read command, the controller would initiate the
277*4882a593Smuzhiyun command to the drive even before it sees the DMA
278*4882a593Smuzhiyun start. When there are very fast drives connected to the
279*4882a593Smuzhiyun controller, or when the data request hits in the drive
280*4882a593Smuzhiyun cache, there is the possibility that the drive returns a
281*4882a593Smuzhiyun part or all of the requested data to the controller before
282*4882a593Smuzhiyun the DMA start is issued. In this case, the controller
283*4882a593Smuzhiyun would become confused as to what to do with the data. In
284*4882a593Smuzhiyun the worst case when all the data is returned back to the
285*4882a593Smuzhiyun controller, the controller could hang. In other cases it
286*4882a593Smuzhiyun could return partial data returning in data
287*4882a593Smuzhiyun corruption. This problem has been seen in PPC systems and
288*4882a593Smuzhiyun can also appear on an system with very fast disks, where
289*4882a593Smuzhiyun the SATA controller is sitting behind a number of bridges,
290*4882a593Smuzhiyun and hence there is significant latency between the r/w
291*4882a593Smuzhiyun command and the start command. */
292*4882a593Smuzhiyun /* issue r/w command if the access is to ATA */
293*4882a593Smuzhiyun if (qc->tf.protocol == ATA_PROT_DMA)
294*4882a593Smuzhiyun ap->ops->sff_exec_command(ap, &qc->tf);
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun
k2_stat_check_status(struct ata_port * ap)298*4882a593Smuzhiyun static u8 k2_stat_check_status(struct ata_port *ap)
299*4882a593Smuzhiyun {
300*4882a593Smuzhiyun return readl(ap->ioaddr.status_addr);
301*4882a593Smuzhiyun }
302*4882a593Smuzhiyun
k2_sata_show_info(struct seq_file * m,struct Scsi_Host * shost)303*4882a593Smuzhiyun static int k2_sata_show_info(struct seq_file *m, struct Scsi_Host *shost)
304*4882a593Smuzhiyun {
305*4882a593Smuzhiyun struct ata_port *ap;
306*4882a593Smuzhiyun struct device_node *np;
307*4882a593Smuzhiyun int index;
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun /* Find the ata_port */
310*4882a593Smuzhiyun ap = ata_shost_to_port(shost);
311*4882a593Smuzhiyun if (ap == NULL)
312*4882a593Smuzhiyun return 0;
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun /* Find the OF node for the PCI device proper */
315*4882a593Smuzhiyun np = pci_device_to_OF_node(to_pci_dev(ap->host->dev));
316*4882a593Smuzhiyun if (np == NULL)
317*4882a593Smuzhiyun return 0;
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun /* Match it to a port node */
320*4882a593Smuzhiyun index = (ap == ap->host->ports[0]) ? 0 : 1;
321*4882a593Smuzhiyun for (np = np->child; np != NULL; np = np->sibling) {
322*4882a593Smuzhiyun const u32 *reg = of_get_property(np, "reg", NULL);
323*4882a593Smuzhiyun if (!reg)
324*4882a593Smuzhiyun continue;
325*4882a593Smuzhiyun if (index == *reg) {
326*4882a593Smuzhiyun seq_printf(m, "devspec: %pOF\n", np);
327*4882a593Smuzhiyun break;
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun }
330*4882a593Smuzhiyun return 0;
331*4882a593Smuzhiyun }
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun static struct scsi_host_template k2_sata_sht = {
334*4882a593Smuzhiyun ATA_BMDMA_SHT(DRV_NAME),
335*4882a593Smuzhiyun .show_info = k2_sata_show_info,
336*4882a593Smuzhiyun };
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun static struct ata_port_operations k2_sata_ops = {
340*4882a593Smuzhiyun .inherits = &ata_bmdma_port_ops,
341*4882a593Smuzhiyun .softreset = k2_sata_softreset,
342*4882a593Smuzhiyun .hardreset = k2_sata_hardreset,
343*4882a593Smuzhiyun .sff_tf_load = k2_sata_tf_load,
344*4882a593Smuzhiyun .sff_tf_read = k2_sata_tf_read,
345*4882a593Smuzhiyun .sff_check_status = k2_stat_check_status,
346*4882a593Smuzhiyun .check_atapi_dma = k2_sata_check_atapi_dma,
347*4882a593Smuzhiyun .bmdma_setup = k2_bmdma_setup_mmio,
348*4882a593Smuzhiyun .bmdma_start = k2_bmdma_start_mmio,
349*4882a593Smuzhiyun .scr_read = k2_sata_scr_read,
350*4882a593Smuzhiyun .scr_write = k2_sata_scr_write,
351*4882a593Smuzhiyun };
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun static const struct ata_port_info k2_port_info[] = {
354*4882a593Smuzhiyun /* chip_svw4 */
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun .flags = ATA_FLAG_SATA | K2_FLAG_NO_ATAPI_DMA,
357*4882a593Smuzhiyun .pio_mask = ATA_PIO4,
358*4882a593Smuzhiyun .mwdma_mask = ATA_MWDMA2,
359*4882a593Smuzhiyun .udma_mask = ATA_UDMA6,
360*4882a593Smuzhiyun .port_ops = &k2_sata_ops,
361*4882a593Smuzhiyun },
362*4882a593Smuzhiyun /* chip_svw8 */
363*4882a593Smuzhiyun {
364*4882a593Smuzhiyun .flags = ATA_FLAG_SATA | K2_FLAG_NO_ATAPI_DMA |
365*4882a593Smuzhiyun K2_FLAG_SATA_8_PORTS,
366*4882a593Smuzhiyun .pio_mask = ATA_PIO4,
367*4882a593Smuzhiyun .mwdma_mask = ATA_MWDMA2,
368*4882a593Smuzhiyun .udma_mask = ATA_UDMA6,
369*4882a593Smuzhiyun .port_ops = &k2_sata_ops,
370*4882a593Smuzhiyun },
371*4882a593Smuzhiyun /* chip_svw42 */
372*4882a593Smuzhiyun {
373*4882a593Smuzhiyun .flags = ATA_FLAG_SATA | K2_FLAG_BAR_POS_3,
374*4882a593Smuzhiyun .pio_mask = ATA_PIO4,
375*4882a593Smuzhiyun .mwdma_mask = ATA_MWDMA2,
376*4882a593Smuzhiyun .udma_mask = ATA_UDMA6,
377*4882a593Smuzhiyun .port_ops = &k2_sata_ops,
378*4882a593Smuzhiyun },
379*4882a593Smuzhiyun /* chip_svw43 */
380*4882a593Smuzhiyun {
381*4882a593Smuzhiyun .flags = ATA_FLAG_SATA,
382*4882a593Smuzhiyun .pio_mask = ATA_PIO4,
383*4882a593Smuzhiyun .mwdma_mask = ATA_MWDMA2,
384*4882a593Smuzhiyun .udma_mask = ATA_UDMA6,
385*4882a593Smuzhiyun .port_ops = &k2_sata_ops,
386*4882a593Smuzhiyun },
387*4882a593Smuzhiyun };
388*4882a593Smuzhiyun
k2_sata_setup_port(struct ata_ioports * port,void __iomem * base)389*4882a593Smuzhiyun static void k2_sata_setup_port(struct ata_ioports *port, void __iomem *base)
390*4882a593Smuzhiyun {
391*4882a593Smuzhiyun port->cmd_addr = base + K2_SATA_TF_CMD_OFFSET;
392*4882a593Smuzhiyun port->data_addr = base + K2_SATA_TF_DATA_OFFSET;
393*4882a593Smuzhiyun port->feature_addr =
394*4882a593Smuzhiyun port->error_addr = base + K2_SATA_TF_ERROR_OFFSET;
395*4882a593Smuzhiyun port->nsect_addr = base + K2_SATA_TF_NSECT_OFFSET;
396*4882a593Smuzhiyun port->lbal_addr = base + K2_SATA_TF_LBAL_OFFSET;
397*4882a593Smuzhiyun port->lbam_addr = base + K2_SATA_TF_LBAM_OFFSET;
398*4882a593Smuzhiyun port->lbah_addr = base + K2_SATA_TF_LBAH_OFFSET;
399*4882a593Smuzhiyun port->device_addr = base + K2_SATA_TF_DEVICE_OFFSET;
400*4882a593Smuzhiyun port->command_addr =
401*4882a593Smuzhiyun port->status_addr = base + K2_SATA_TF_CMDSTAT_OFFSET;
402*4882a593Smuzhiyun port->altstatus_addr =
403*4882a593Smuzhiyun port->ctl_addr = base + K2_SATA_TF_CTL_OFFSET;
404*4882a593Smuzhiyun port->bmdma_addr = base + K2_SATA_DMA_CMD_OFFSET;
405*4882a593Smuzhiyun port->scr_addr = base + K2_SATA_SCR_STATUS_OFFSET;
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun
k2_sata_init_one(struct pci_dev * pdev,const struct pci_device_id * ent)409*4882a593Smuzhiyun static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun const struct ata_port_info *ppi[] =
412*4882a593Smuzhiyun { &k2_port_info[ent->driver_data], NULL };
413*4882a593Smuzhiyun struct ata_host *host;
414*4882a593Smuzhiyun void __iomem *mmio_base;
415*4882a593Smuzhiyun int n_ports, i, rc, bar_pos;
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun ata_print_version_once(&pdev->dev, DRV_VERSION);
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun /* allocate host */
420*4882a593Smuzhiyun n_ports = 4;
421*4882a593Smuzhiyun if (ppi[0]->flags & K2_FLAG_SATA_8_PORTS)
422*4882a593Smuzhiyun n_ports = 8;
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
425*4882a593Smuzhiyun if (!host)
426*4882a593Smuzhiyun return -ENOMEM;
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun bar_pos = 5;
429*4882a593Smuzhiyun if (ppi[0]->flags & K2_FLAG_BAR_POS_3)
430*4882a593Smuzhiyun bar_pos = 3;
431*4882a593Smuzhiyun /*
432*4882a593Smuzhiyun * If this driver happens to only be useful on Apple's K2, then
433*4882a593Smuzhiyun * we should check that here as it has a normal Serverworks ID
434*4882a593Smuzhiyun */
435*4882a593Smuzhiyun rc = pcim_enable_device(pdev);
436*4882a593Smuzhiyun if (rc)
437*4882a593Smuzhiyun return rc;
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun /*
440*4882a593Smuzhiyun * Check if we have resources mapped at all (second function may
441*4882a593Smuzhiyun * have been disabled by firmware)
442*4882a593Smuzhiyun */
443*4882a593Smuzhiyun if (pci_resource_len(pdev, bar_pos) == 0) {
444*4882a593Smuzhiyun /* In IDE mode we need to pin the device to ensure that
445*4882a593Smuzhiyun pcim_release does not clear the busmaster bit in config
446*4882a593Smuzhiyun space, clearing causes busmaster DMA to fail on
447*4882a593Smuzhiyun ports 3 & 4 */
448*4882a593Smuzhiyun pcim_pin_device(pdev);
449*4882a593Smuzhiyun return -ENODEV;
450*4882a593Smuzhiyun }
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun /* Request and iomap PCI regions */
453*4882a593Smuzhiyun rc = pcim_iomap_regions(pdev, 1 << bar_pos, DRV_NAME);
454*4882a593Smuzhiyun if (rc == -EBUSY)
455*4882a593Smuzhiyun pcim_pin_device(pdev);
456*4882a593Smuzhiyun if (rc)
457*4882a593Smuzhiyun return rc;
458*4882a593Smuzhiyun host->iomap = pcim_iomap_table(pdev);
459*4882a593Smuzhiyun mmio_base = host->iomap[bar_pos];
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun /* different controllers have different number of ports - currently 4 or 8 */
462*4882a593Smuzhiyun /* All ports are on the same function. Multi-function device is no
463*4882a593Smuzhiyun * longer available. This should not be seen in any system. */
464*4882a593Smuzhiyun for (i = 0; i < host->n_ports; i++) {
465*4882a593Smuzhiyun struct ata_port *ap = host->ports[i];
466*4882a593Smuzhiyun unsigned int offset = i * K2_SATA_PORT_OFFSET;
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun k2_sata_setup_port(&ap->ioaddr, mmio_base + offset);
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun ata_port_pbar_desc(ap, 5, -1, "mmio");
471*4882a593Smuzhiyun ata_port_pbar_desc(ap, 5, offset, "port");
472*4882a593Smuzhiyun }
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun rc = dma_set_mask_and_coherent(&pdev->dev, ATA_DMA_MASK);
475*4882a593Smuzhiyun if (rc)
476*4882a593Smuzhiyun return rc;
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun /* Clear a magic bit in SCR1 according to Darwin, those help
479*4882a593Smuzhiyun * some funky seagate drives (though so far, those were already
480*4882a593Smuzhiyun * set by the firmware on the machines I had access to)
481*4882a593Smuzhiyun */
482*4882a593Smuzhiyun writel(readl(mmio_base + K2_SATA_SICR1_OFFSET) & ~0x00040000,
483*4882a593Smuzhiyun mmio_base + K2_SATA_SICR1_OFFSET);
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun /* Clear SATA error & interrupts we don't use */
486*4882a593Smuzhiyun writel(0xffffffff, mmio_base + K2_SATA_SCR_ERROR_OFFSET);
487*4882a593Smuzhiyun writel(0x0, mmio_base + K2_SATA_SIM_OFFSET);
488*4882a593Smuzhiyun
489*4882a593Smuzhiyun pci_set_master(pdev);
490*4882a593Smuzhiyun return ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
491*4882a593Smuzhiyun IRQF_SHARED, &k2_sata_sht);
492*4882a593Smuzhiyun }
493*4882a593Smuzhiyun
494*4882a593Smuzhiyun /* 0x240 is device ID for Apple K2 device
495*4882a593Smuzhiyun * 0x241 is device ID for Serverworks Frodo4
496*4882a593Smuzhiyun * 0x242 is device ID for Serverworks Frodo8
497*4882a593Smuzhiyun * 0x24a is device ID for BCM5785 (aka HT1000) HT southbridge integrated SATA
498*4882a593Smuzhiyun * controller
499*4882a593Smuzhiyun * */
500*4882a593Smuzhiyun static const struct pci_device_id k2_sata_pci_tbl[] = {
501*4882a593Smuzhiyun { PCI_VDEVICE(SERVERWORKS, 0x0240), chip_svw4 },
502*4882a593Smuzhiyun { PCI_VDEVICE(SERVERWORKS, 0x0241), chip_svw8 },
503*4882a593Smuzhiyun { PCI_VDEVICE(SERVERWORKS, 0x0242), chip_svw4 },
504*4882a593Smuzhiyun { PCI_VDEVICE(SERVERWORKS, 0x024a), chip_svw4 },
505*4882a593Smuzhiyun { PCI_VDEVICE(SERVERWORKS, 0x024b), chip_svw4 },
506*4882a593Smuzhiyun { PCI_VDEVICE(SERVERWORKS, 0x0410), chip_svw42 },
507*4882a593Smuzhiyun { PCI_VDEVICE(SERVERWORKS, 0x0411), chip_svw43 },
508*4882a593Smuzhiyun
509*4882a593Smuzhiyun { }
510*4882a593Smuzhiyun };
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun static struct pci_driver k2_sata_pci_driver = {
513*4882a593Smuzhiyun .name = DRV_NAME,
514*4882a593Smuzhiyun .id_table = k2_sata_pci_tbl,
515*4882a593Smuzhiyun .probe = k2_sata_init_one,
516*4882a593Smuzhiyun .remove = ata_pci_remove_one,
517*4882a593Smuzhiyun };
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun module_pci_driver(k2_sata_pci_driver);
520*4882a593Smuzhiyun
521*4882a593Smuzhiyun MODULE_AUTHOR("Benjamin Herrenschmidt");
522*4882a593Smuzhiyun MODULE_DESCRIPTION("low-level driver for K2 SATA controller");
523*4882a593Smuzhiyun MODULE_LICENSE("GPL");
524*4882a593Smuzhiyun MODULE_DEVICE_TABLE(pci, k2_sata_pci_tbl);
525*4882a593Smuzhiyun MODULE_VERSION(DRV_VERSION);
526