xref: /OK3568_Linux_fs/kernel/drivers/ata/sata_svw.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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