xref: /rk3399_rockchip-uboot/drivers/ata/sata_dwc.h (revision 9ff3d0147e970e15128c2e0436f2f4069b687ad4)
1*f2105c61SSimon Glass /*
2*f2105c61SSimon Glass  * sata_dwc.h
3*f2105c61SSimon Glass  *
4*f2105c61SSimon Glass  * Synopsys DesignWare Cores (DWC) SATA host driver
5*f2105c61SSimon Glass  *
6*f2105c61SSimon Glass  * Author: Mark Miesfeld <mmiesfeld@amcc.com>
7*f2105c61SSimon Glass  *
8*f2105c61SSimon Glass  * Ported from 2.6.19.2 to 2.6.25/26 by Stefan Roese <sr@denx.de>
9*f2105c61SSimon Glass  * Copyright 2008 DENX Software Engineering
10*f2105c61SSimon Glass  *
11*f2105c61SSimon Glass  * Based on versions provided by AMCC and Synopsys which are:
12*f2105c61SSimon Glass  *          Copyright 2006 Applied Micro Circuits Corporation
13*f2105c61SSimon Glass  *          COPYRIGHT (C) 2005  SYNOPSYS, INC.  ALL RIGHTS RESERVED
14*f2105c61SSimon Glass  *
15*f2105c61SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
16*f2105c61SSimon Glass  */
17*f2105c61SSimon Glass /*
18*f2105c61SSimon Glass  * SATA support based on the chip canyonlands.
19*f2105c61SSimon Glass  *
20*f2105c61SSimon Glass  * 04-17-2009
21*f2105c61SSimon Glass  *		The local version of this driver for the canyonlands board
22*f2105c61SSimon Glass  *		does not use interrupts but polls the chip instead.
23*f2105c61SSimon Glass  */
24*f2105c61SSimon Glass 
25*f2105c61SSimon Glass 
26*f2105c61SSimon Glass #ifndef _SATA_DWC_H_
27*f2105c61SSimon Glass #define _SATA_DWC_H_
28*f2105c61SSimon Glass 
29*f2105c61SSimon Glass #define __U_BOOT__
30*f2105c61SSimon Glass 
31*f2105c61SSimon Glass #define HZ 100
32*f2105c61SSimon Glass #define READ 0
33*f2105c61SSimon Glass #define WRITE 1
34*f2105c61SSimon Glass 
35*f2105c61SSimon Glass enum {
36*f2105c61SSimon Glass 	ATA_READID_POSTRESET	= (1 << 0),
37*f2105c61SSimon Glass 
38*f2105c61SSimon Glass 	ATA_DNXFER_PIO		= 0,
39*f2105c61SSimon Glass 	ATA_DNXFER_DMA		= 1,
40*f2105c61SSimon Glass 	ATA_DNXFER_40C		= 2,
41*f2105c61SSimon Glass 	ATA_DNXFER_FORCE_PIO	= 3,
42*f2105c61SSimon Glass 	ATA_DNXFER_FORCE_PIO0	= 4,
43*f2105c61SSimon Glass 
44*f2105c61SSimon Glass 	ATA_DNXFER_QUIET	= (1 << 31),
45*f2105c61SSimon Glass };
46*f2105c61SSimon Glass 
47*f2105c61SSimon Glass enum hsm_task_states {
48*f2105c61SSimon Glass 	HSM_ST_IDLE,
49*f2105c61SSimon Glass 	HSM_ST_FIRST,
50*f2105c61SSimon Glass 	HSM_ST,
51*f2105c61SSimon Glass 	HSM_ST_LAST,
52*f2105c61SSimon Glass 	HSM_ST_ERR,
53*f2105c61SSimon Glass };
54*f2105c61SSimon Glass 
55*f2105c61SSimon Glass #define	ATA_SHORT_PAUSE		((HZ >> 6) + 1)
56*f2105c61SSimon Glass 
57*f2105c61SSimon Glass struct ata_queued_cmd {
58*f2105c61SSimon Glass 	struct ata_port		*ap;
59*f2105c61SSimon Glass 	struct ata_device	*dev;
60*f2105c61SSimon Glass 
61*f2105c61SSimon Glass 	struct ata_taskfile	tf;
62*f2105c61SSimon Glass 	u8			cdb[ATAPI_CDB_LEN];
63*f2105c61SSimon Glass 	unsigned long		flags;
64*f2105c61SSimon Glass 	unsigned int		tag;
65*f2105c61SSimon Glass 	unsigned int		n_elem;
66*f2105c61SSimon Glass 
67*f2105c61SSimon Glass 	int			dma_dir;
68*f2105c61SSimon Glass 	unsigned int		sect_size;
69*f2105c61SSimon Glass 
70*f2105c61SSimon Glass 	unsigned int		nbytes;
71*f2105c61SSimon Glass 	unsigned int		extrabytes;
72*f2105c61SSimon Glass 	unsigned int		curbytes;
73*f2105c61SSimon Glass 
74*f2105c61SSimon Glass 	unsigned int		err_mask;
75*f2105c61SSimon Glass 	struct ata_taskfile	result_tf;
76*f2105c61SSimon Glass 
77*f2105c61SSimon Glass 	void			*private_data;
78*f2105c61SSimon Glass #ifndef __U_BOOT__
79*f2105c61SSimon Glass 	void			*lldd_task;
80*f2105c61SSimon Glass #endif
81*f2105c61SSimon Glass 	unsigned char		*pdata;
82*f2105c61SSimon Glass };
83*f2105c61SSimon Glass 
84*f2105c61SSimon Glass typedef void (*ata_qc_cb_t) (struct ata_queued_cmd *qc);
85*f2105c61SSimon Glass 
86*f2105c61SSimon Glass #define ATA_TAG_POISON	0xfafbfcfdU
87*f2105c61SSimon Glass 
88*f2105c61SSimon Glass enum {
89*f2105c61SSimon Glass 	LIBATA_MAX_PRD		= ATA_MAX_PRD / 2,
90*f2105c61SSimon Glass 	LIBATA_DUMB_MAX_PRD	= ATA_MAX_PRD / 4,
91*f2105c61SSimon Glass 	ATA_MAX_PORTS		= 8,
92*f2105c61SSimon Glass 	ATA_DEF_QUEUE		= 1,
93*f2105c61SSimon Glass 	ATA_MAX_QUEUE		= 32,
94*f2105c61SSimon Glass 	ATA_TAG_INTERNAL	= ATA_MAX_QUEUE - 1,
95*f2105c61SSimon Glass 	ATA_MAX_BUS		= 2,
96*f2105c61SSimon Glass 	ATA_DEF_BUSY_WAIT	= 10000,
97*f2105c61SSimon Glass 
98*f2105c61SSimon Glass 	ATAPI_MAX_DRAIN		= 16 << 10,
99*f2105c61SSimon Glass 
100*f2105c61SSimon Glass 	ATA_SHT_EMULATED	= 1,
101*f2105c61SSimon Glass 	ATA_SHT_CMD_PER_LUN	= 1,
102*f2105c61SSimon Glass 	ATA_SHT_THIS_ID		= -1,
103*f2105c61SSimon Glass 	ATA_SHT_USE_CLUSTERING	= 1,
104*f2105c61SSimon Glass 
105*f2105c61SSimon Glass 	ATA_DFLAG_LBA		= (1 << 0),
106*f2105c61SSimon Glass 	ATA_DFLAG_LBA48		= (1 << 1),
107*f2105c61SSimon Glass 	ATA_DFLAG_CDB_INTR	= (1 << 2),
108*f2105c61SSimon Glass 	ATA_DFLAG_NCQ		= (1 << 3),
109*f2105c61SSimon Glass 	ATA_DFLAG_FLUSH_EXT	= (1 << 4),
110*f2105c61SSimon Glass 	ATA_DFLAG_ACPI_PENDING 	= (1 << 5),
111*f2105c61SSimon Glass 	ATA_DFLAG_ACPI_FAILED	= (1 << 6),
112*f2105c61SSimon Glass 	ATA_DFLAG_AN		= (1 << 7),
113*f2105c61SSimon Glass 	ATA_DFLAG_HIPM		= (1 << 8),
114*f2105c61SSimon Glass 	ATA_DFLAG_DIPM		= (1 << 9),
115*f2105c61SSimon Glass 	ATA_DFLAG_DMADIR	= (1 << 10),
116*f2105c61SSimon Glass 	ATA_DFLAG_CFG_MASK	= (1 << 12) - 1,
117*f2105c61SSimon Glass 
118*f2105c61SSimon Glass 	ATA_DFLAG_PIO		= (1 << 12),
119*f2105c61SSimon Glass 	ATA_DFLAG_NCQ_OFF	= (1 << 13),
120*f2105c61SSimon Glass 	ATA_DFLAG_SPUNDOWN	= (1 << 14),
121*f2105c61SSimon Glass 	ATA_DFLAG_SLEEPING	= (1 << 15),
122*f2105c61SSimon Glass 	ATA_DFLAG_DUBIOUS_XFER	= (1 << 16),
123*f2105c61SSimon Glass 	ATA_DFLAG_INIT_MASK	= (1 << 24) - 1,
124*f2105c61SSimon Glass 
125*f2105c61SSimon Glass 	ATA_DFLAG_DETACH	= (1 << 24),
126*f2105c61SSimon Glass 	ATA_DFLAG_DETACHED	= (1 << 25),
127*f2105c61SSimon Glass 
128*f2105c61SSimon Glass 	ATA_LFLAG_HRST_TO_RESUME	= (1 << 0),
129*f2105c61SSimon Glass 	ATA_LFLAG_SKIP_D2H_BSY		= (1 << 1),
130*f2105c61SSimon Glass 	ATA_LFLAG_NO_SRST		= (1 << 2),
131*f2105c61SSimon Glass 	ATA_LFLAG_ASSUME_ATA		= (1 << 3),
132*f2105c61SSimon Glass 	ATA_LFLAG_ASSUME_SEMB		= (1 << 4),
133*f2105c61SSimon Glass 	ATA_LFLAG_ASSUME_CLASS = ATA_LFLAG_ASSUME_ATA | ATA_LFLAG_ASSUME_SEMB,
134*f2105c61SSimon Glass 	ATA_LFLAG_NO_RETRY		= (1 << 5),
135*f2105c61SSimon Glass 	ATA_LFLAG_DISABLED		= (1 << 6),
136*f2105c61SSimon Glass 
137*f2105c61SSimon Glass 	ATA_FLAG_SLAVE_POSS	= (1 << 0),
138*f2105c61SSimon Glass 	ATA_FLAG_SATA		= (1 << 1),
139*f2105c61SSimon Glass 	ATA_FLAG_NO_LEGACY	= (1 << 2),
140*f2105c61SSimon Glass 	ATA_FLAG_MMIO		= (1 << 3),
141*f2105c61SSimon Glass 	ATA_FLAG_SRST		= (1 << 4),
142*f2105c61SSimon Glass 	ATA_FLAG_SATA_RESET	= (1 << 5),
143*f2105c61SSimon Glass 	ATA_FLAG_NO_ATAPI	= (1 << 6),
144*f2105c61SSimon Glass 	ATA_FLAG_PIO_DMA	= (1 << 7),
145*f2105c61SSimon Glass 	ATA_FLAG_PIO_LBA48	= (1 << 8),
146*f2105c61SSimon Glass 	ATA_FLAG_PIO_POLLING	= (1 << 9),
147*f2105c61SSimon Glass 	ATA_FLAG_NCQ		= (1 << 10),
148*f2105c61SSimon Glass 	ATA_FLAG_DEBUGMSG	= (1 << 13),
149*f2105c61SSimon Glass 	ATA_FLAG_IGN_SIMPLEX	= (1 << 15),
150*f2105c61SSimon Glass 	ATA_FLAG_NO_IORDY	= (1 << 16),
151*f2105c61SSimon Glass 	ATA_FLAG_ACPI_SATA	= (1 << 17),
152*f2105c61SSimon Glass 	ATA_FLAG_AN		= (1 << 18),
153*f2105c61SSimon Glass 	ATA_FLAG_PMP		= (1 << 19),
154*f2105c61SSimon Glass 	ATA_FLAG_IPM		= (1 << 20),
155*f2105c61SSimon Glass 
156*f2105c61SSimon Glass 	ATA_FLAG_DISABLED	= (1 << 23),
157*f2105c61SSimon Glass 
158*f2105c61SSimon Glass 	ATA_PFLAG_EH_PENDING		= (1 << 0),
159*f2105c61SSimon Glass 	ATA_PFLAG_EH_IN_PROGRESS	= (1 << 1),
160*f2105c61SSimon Glass 	ATA_PFLAG_FROZEN		= (1 << 2),
161*f2105c61SSimon Glass 	ATA_PFLAG_RECOVERED		= (1 << 3),
162*f2105c61SSimon Glass 	ATA_PFLAG_LOADING		= (1 << 4),
163*f2105c61SSimon Glass 	ATA_PFLAG_UNLOADING		= (1 << 5),
164*f2105c61SSimon Glass 	ATA_PFLAG_SCSI_HOTPLUG		= (1 << 6),
165*f2105c61SSimon Glass 	ATA_PFLAG_INITIALIZING		= (1 << 7),
166*f2105c61SSimon Glass 	ATA_PFLAG_RESETTING		= (1 << 8),
167*f2105c61SSimon Glass 	ATA_PFLAG_SUSPENDED		= (1 << 17),
168*f2105c61SSimon Glass 	ATA_PFLAG_PM_PENDING		= (1 << 18),
169*f2105c61SSimon Glass 
170*f2105c61SSimon Glass 	ATA_QCFLAG_ACTIVE	= (1 << 0),
171*f2105c61SSimon Glass 	ATA_QCFLAG_DMAMAP	= (1 << 1),
172*f2105c61SSimon Glass 	ATA_QCFLAG_IO		= (1 << 3),
173*f2105c61SSimon Glass 	ATA_QCFLAG_RESULT_TF	= (1 << 4),
174*f2105c61SSimon Glass 	ATA_QCFLAG_CLEAR_EXCL	= (1 << 5),
175*f2105c61SSimon Glass 	ATA_QCFLAG_QUIET	= (1 << 6),
176*f2105c61SSimon Glass 
177*f2105c61SSimon Glass 	ATA_QCFLAG_FAILED	= (1 << 16),
178*f2105c61SSimon Glass 	ATA_QCFLAG_SENSE_VALID	= (1 << 17),
179*f2105c61SSimon Glass 	ATA_QCFLAG_EH_SCHEDULED	= (1 << 18),
180*f2105c61SSimon Glass 
181*f2105c61SSimon Glass 	ATA_HOST_SIMPLEX	= (1 << 0),
182*f2105c61SSimon Glass 	ATA_HOST_STARTED	= (1 << 1),
183*f2105c61SSimon Glass 
184*f2105c61SSimon Glass 	ATA_TMOUT_BOOT			= 30 * 100,
185*f2105c61SSimon Glass 	ATA_TMOUT_BOOT_QUICK		= 7 * 100,
186*f2105c61SSimon Glass 	ATA_TMOUT_INTERNAL		= 30 * 100,
187*f2105c61SSimon Glass 	ATA_TMOUT_INTERNAL_QUICK	= 5 * 100,
188*f2105c61SSimon Glass 
189*f2105c61SSimon Glass 	/* FIXME: GoVault needs 2s but we can't afford that without
190*f2105c61SSimon Glass 	 * parallel probing.  800ms is enough for iVDR disk
191*f2105c61SSimon Glass 	 * HHD424020F7SV00.  Increase to 2secs when parallel probing
192*f2105c61SSimon Glass 	 * is in place.
193*f2105c61SSimon Glass 	 */
194*f2105c61SSimon Glass 	ATA_TMOUT_FF_WAIT	= 4 * 100 / 5,
195*f2105c61SSimon Glass 
196*f2105c61SSimon Glass 	BUS_UNKNOWN		= 0,
197*f2105c61SSimon Glass 	BUS_DMA			= 1,
198*f2105c61SSimon Glass 	BUS_IDLE		= 2,
199*f2105c61SSimon Glass 	BUS_NOINTR		= 3,
200*f2105c61SSimon Glass 	BUS_NODATA		= 4,
201*f2105c61SSimon Glass 	BUS_TIMER		= 5,
202*f2105c61SSimon Glass 	BUS_PIO			= 6,
203*f2105c61SSimon Glass 	BUS_EDD			= 7,
204*f2105c61SSimon Glass 	BUS_IDENTIFY		= 8,
205*f2105c61SSimon Glass 	BUS_PACKET		= 9,
206*f2105c61SSimon Glass 
207*f2105c61SSimon Glass 	PORT_UNKNOWN		= 0,
208*f2105c61SSimon Glass 	PORT_ENABLED		= 1,
209*f2105c61SSimon Glass 	PORT_DISABLED		= 2,
210*f2105c61SSimon Glass 
211*f2105c61SSimon Glass 	/* encoding various smaller bitmaps into a single
212*f2105c61SSimon Glass 	 * unsigned long bitmap
213*f2105c61SSimon Glass 	 */
214*f2105c61SSimon Glass 	ATA_NR_PIO_MODES	= 7,
215*f2105c61SSimon Glass 	ATA_NR_MWDMA_MODES	= 5,
216*f2105c61SSimon Glass 	ATA_NR_UDMA_MODES	= 8,
217*f2105c61SSimon Glass 
218*f2105c61SSimon Glass 	ATA_SHIFT_PIO		= 0,
219*f2105c61SSimon Glass 	ATA_SHIFT_MWDMA		= ATA_SHIFT_PIO + ATA_NR_PIO_MODES,
220*f2105c61SSimon Glass 	ATA_SHIFT_UDMA		= ATA_SHIFT_MWDMA + ATA_NR_MWDMA_MODES,
221*f2105c61SSimon Glass 
222*f2105c61SSimon Glass 	ATA_DMA_PAD_SZ		= 4,
223*f2105c61SSimon Glass 
224*f2105c61SSimon Glass 	ATA_ERING_SIZE		= 32,
225*f2105c61SSimon Glass 
226*f2105c61SSimon Glass 	ATA_DEFER_LINK		= 1,
227*f2105c61SSimon Glass 	ATA_DEFER_PORT		= 2,
228*f2105c61SSimon Glass 
229*f2105c61SSimon Glass 	ATA_EH_DESC_LEN		= 80,
230*f2105c61SSimon Glass 
231*f2105c61SSimon Glass 	ATA_EH_REVALIDATE	= (1 << 0),
232*f2105c61SSimon Glass 	ATA_EH_SOFTRESET	= (1 << 1),
233*f2105c61SSimon Glass 	ATA_EH_HARDRESET	= (1 << 2),
234*f2105c61SSimon Glass 	ATA_EH_ENABLE_LINK	= (1 << 3),
235*f2105c61SSimon Glass 	ATA_EH_LPM		= (1 << 4),
236*f2105c61SSimon Glass 
237*f2105c61SSimon Glass 	ATA_EH_RESET_MASK	= ATA_EH_SOFTRESET | ATA_EH_HARDRESET,
238*f2105c61SSimon Glass 	ATA_EH_PERDEV_MASK	= ATA_EH_REVALIDATE,
239*f2105c61SSimon Glass 
240*f2105c61SSimon Glass 	ATA_EHI_HOTPLUGGED	= (1 << 0),
241*f2105c61SSimon Glass 	ATA_EHI_RESUME_LINK	= (1 << 1),
242*f2105c61SSimon Glass 	ATA_EHI_NO_AUTOPSY	= (1 << 2),
243*f2105c61SSimon Glass 	ATA_EHI_QUIET		= (1 << 3),
244*f2105c61SSimon Glass 
245*f2105c61SSimon Glass 	ATA_EHI_DID_SOFTRESET	= (1 << 16),
246*f2105c61SSimon Glass 	ATA_EHI_DID_HARDRESET	= (1 << 17),
247*f2105c61SSimon Glass 	ATA_EHI_PRINTINFO	= (1 << 18),
248*f2105c61SSimon Glass 	ATA_EHI_SETMODE		= (1 << 19),
249*f2105c61SSimon Glass 	ATA_EHI_POST_SETMODE	= (1 << 20),
250*f2105c61SSimon Glass 
251*f2105c61SSimon Glass 	ATA_EHI_DID_RESET = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET,
252*f2105c61SSimon Glass 	ATA_EHI_RESET_MODIFIER_MASK = ATA_EHI_RESUME_LINK,
253*f2105c61SSimon Glass 
254*f2105c61SSimon Glass 	ATA_EH_MAX_TRIES	= 5,
255*f2105c61SSimon Glass 
256*f2105c61SSimon Glass 	ATA_PROBE_MAX_TRIES	= 3,
257*f2105c61SSimon Glass 	ATA_EH_DEV_TRIES	= 3,
258*f2105c61SSimon Glass 	ATA_EH_PMP_TRIES	= 5,
259*f2105c61SSimon Glass 	ATA_EH_PMP_LINK_TRIES	= 3,
260*f2105c61SSimon Glass 
261*f2105c61SSimon Glass 	SATA_PMP_SCR_TIMEOUT	= 250,
262*f2105c61SSimon Glass 
263*f2105c61SSimon Glass 	/* Horkage types. May be set by libata or controller on drives
264*f2105c61SSimon Glass 	(some horkage may be drive/controller pair dependant */
265*f2105c61SSimon Glass 
266*f2105c61SSimon Glass 	ATA_HORKAGE_DIAGNOSTIC	= (1 << 0),
267*f2105c61SSimon Glass 	ATA_HORKAGE_NODMA	= (1 << 1),
268*f2105c61SSimon Glass 	ATA_HORKAGE_NONCQ	= (1 << 2),
269*f2105c61SSimon Glass 	ATA_HORKAGE_MAX_SEC_128	= (1 << 3),
270*f2105c61SSimon Glass 	ATA_HORKAGE_BROKEN_HPA	= (1 << 4),
271*f2105c61SSimon Glass 	ATA_HORKAGE_SKIP_PM	= (1 << 5),
272*f2105c61SSimon Glass 	ATA_HORKAGE_HPA_SIZE	= (1 << 6),
273*f2105c61SSimon Glass 	ATA_HORKAGE_IPM		= (1 << 7),
274*f2105c61SSimon Glass 	ATA_HORKAGE_IVB		= (1 << 8),
275*f2105c61SSimon Glass 	ATA_HORKAGE_STUCK_ERR	= (1 << 9),
276*f2105c61SSimon Glass 
277*f2105c61SSimon Glass 	ATA_DMA_MASK_ATA	= (1 << 0),
278*f2105c61SSimon Glass 	ATA_DMA_MASK_ATAPI	= (1 << 1),
279*f2105c61SSimon Glass 	ATA_DMA_MASK_CFA	= (1 << 2),
280*f2105c61SSimon Glass 
281*f2105c61SSimon Glass 	ATAPI_READ		= 0,
282*f2105c61SSimon Glass 	ATAPI_WRITE		= 1,
283*f2105c61SSimon Glass 	ATAPI_READ_CD		= 2,
284*f2105c61SSimon Glass 	ATAPI_PASS_THRU		= 3,
285*f2105c61SSimon Glass 	ATAPI_MISC		= 4,
286*f2105c61SSimon Glass };
287*f2105c61SSimon Glass 
288*f2105c61SSimon Glass enum ata_completion_errors {
289*f2105c61SSimon Glass 	AC_ERR_DEV		= (1 << 0),
290*f2105c61SSimon Glass 	AC_ERR_HSM		= (1 << 1),
291*f2105c61SSimon Glass 	AC_ERR_TIMEOUT		= (1 << 2),
292*f2105c61SSimon Glass 	AC_ERR_MEDIA		= (1 << 3),
293*f2105c61SSimon Glass 	AC_ERR_ATA_BUS		= (1 << 4),
294*f2105c61SSimon Glass 	AC_ERR_HOST_BUS		= (1 << 5),
295*f2105c61SSimon Glass 	AC_ERR_SYSTEM		= (1 << 6),
296*f2105c61SSimon Glass 	AC_ERR_INVALID		= (1 << 7),
297*f2105c61SSimon Glass 	AC_ERR_OTHER		= (1 << 8),
298*f2105c61SSimon Glass 	AC_ERR_NODEV_HINT	= (1 << 9),
299*f2105c61SSimon Glass 	AC_ERR_NCQ		= (1 << 10),
300*f2105c61SSimon Glass };
301*f2105c61SSimon Glass 
302*f2105c61SSimon Glass enum ata_xfer_mask {
303*f2105c61SSimon Glass 	ATA_MASK_PIO	= ((1LU << ATA_NR_PIO_MODES) - 1) << ATA_SHIFT_PIO,
304*f2105c61SSimon Glass 	ATA_MASK_MWDMA	= ((1LU << ATA_NR_MWDMA_MODES) - 1) << ATA_SHIFT_MWDMA,
305*f2105c61SSimon Glass 	ATA_MASK_UDMA	= ((1LU << ATA_NR_UDMA_MODES) - 1) << ATA_SHIFT_UDMA,
306*f2105c61SSimon Glass };
307*f2105c61SSimon Glass 
308*f2105c61SSimon Glass struct ata_port_info {
309*f2105c61SSimon Glass #ifndef __U_BOOT__
310*f2105c61SSimon Glass 	struct scsi_host_template	*sht;
311*f2105c61SSimon Glass #endif
312*f2105c61SSimon Glass 	unsigned long			flags;
313*f2105c61SSimon Glass 	unsigned long			link_flags;
314*f2105c61SSimon Glass 	unsigned long			pio_mask;
315*f2105c61SSimon Glass 	unsigned long			mwdma_mask;
316*f2105c61SSimon Glass 	unsigned long			udma_mask;
317*f2105c61SSimon Glass #ifndef __U_BOOT__
318*f2105c61SSimon Glass 	const struct ata_port_operations *port_ops;
319*f2105c61SSimon Glass 	void				*private_data;
320*f2105c61SSimon Glass #endif
321*f2105c61SSimon Glass };
322*f2105c61SSimon Glass 
323*f2105c61SSimon Glass struct ata_ioports {
324*f2105c61SSimon Glass 	void __iomem		*cmd_addr;
325*f2105c61SSimon Glass 	void __iomem		*data_addr;
326*f2105c61SSimon Glass 	void __iomem		*error_addr;
327*f2105c61SSimon Glass 	void __iomem		*feature_addr;
328*f2105c61SSimon Glass 	void __iomem		*nsect_addr;
329*f2105c61SSimon Glass 	void __iomem		*lbal_addr;
330*f2105c61SSimon Glass 	void __iomem		*lbam_addr;
331*f2105c61SSimon Glass 	void __iomem		*lbah_addr;
332*f2105c61SSimon Glass 	void __iomem		*device_addr;
333*f2105c61SSimon Glass 	void __iomem		*status_addr;
334*f2105c61SSimon Glass 	void __iomem		*command_addr;
335*f2105c61SSimon Glass 	void __iomem		*altstatus_addr;
336*f2105c61SSimon Glass 	void __iomem		*ctl_addr;
337*f2105c61SSimon Glass #ifndef __U_BOOT__
338*f2105c61SSimon Glass 	void __iomem		*bmdma_addr;
339*f2105c61SSimon Glass #endif
340*f2105c61SSimon Glass 	void __iomem		*scr_addr;
341*f2105c61SSimon Glass };
342*f2105c61SSimon Glass 
343*f2105c61SSimon Glass struct ata_host {
344*f2105c61SSimon Glass #ifndef __U_BOOT__
345*f2105c61SSimon Glass 	void __iomem * const	*iomap;
346*f2105c61SSimon Glass 	void			*private_data;
347*f2105c61SSimon Glass 	const struct ata_port_operations *ops;
348*f2105c61SSimon Glass 	unsigned long		flags;
349*f2105c61SSimon Glass 	struct ata_port		*simplex_claimed;
350*f2105c61SSimon Glass #endif
351*f2105c61SSimon Glass 	unsigned int		n_ports;
352*f2105c61SSimon Glass 	struct ata_port		*ports[0];
353*f2105c61SSimon Glass };
354*f2105c61SSimon Glass 
355*f2105c61SSimon Glass #ifndef __U_BOOT__
356*f2105c61SSimon Glass struct ata_port_stats {
357*f2105c61SSimon Glass 	unsigned long		unhandled_irq;
358*f2105c61SSimon Glass 	unsigned long		idle_irq;
359*f2105c61SSimon Glass 	unsigned long		rw_reqbuf;
360*f2105c61SSimon Glass };
361*f2105c61SSimon Glass #endif
362*f2105c61SSimon Glass 
363*f2105c61SSimon Glass struct ata_device {
364*f2105c61SSimon Glass 	struct ata_link		*link;
365*f2105c61SSimon Glass 	unsigned int		devno;
366*f2105c61SSimon Glass 	unsigned long		flags;
367*f2105c61SSimon Glass 	unsigned int		horkage;
368*f2105c61SSimon Glass #ifndef __U_BOOT__
369*f2105c61SSimon Glass 	struct scsi_device	*sdev;
370*f2105c61SSimon Glass #ifdef CONFIG_ATA_ACPI
371*f2105c61SSimon Glass 	acpi_handle		acpi_handle;
372*f2105c61SSimon Glass 	union acpi_object	*gtf_cache;
373*f2105c61SSimon Glass #endif
374*f2105c61SSimon Glass #endif
375*f2105c61SSimon Glass 	u64			n_sectors;
376*f2105c61SSimon Glass 	unsigned int		class;
377*f2105c61SSimon Glass 
378*f2105c61SSimon Glass 	union {
379*f2105c61SSimon Glass 		u16		id[ATA_ID_WORDS];
380*f2105c61SSimon Glass 		u32		gscr[SATA_PMP_GSCR_DWORDS];
381*f2105c61SSimon Glass 	};
382*f2105c61SSimon Glass #ifndef __U_BOOT__
383*f2105c61SSimon Glass 	u8			pio_mode;
384*f2105c61SSimon Glass 	u8			dma_mode;
385*f2105c61SSimon Glass 	u8			xfer_mode;
386*f2105c61SSimon Glass 	unsigned int		xfer_shift;
387*f2105c61SSimon Glass #endif
388*f2105c61SSimon Glass 	unsigned int		multi_count;
389*f2105c61SSimon Glass 	unsigned int		max_sectors;
390*f2105c61SSimon Glass 	unsigned int		cdb_len;
391*f2105c61SSimon Glass #ifndef __U_BOOT__
392*f2105c61SSimon Glass 	unsigned long		pio_mask;
393*f2105c61SSimon Glass 	unsigned long		mwdma_mask;
394*f2105c61SSimon Glass #endif
395*f2105c61SSimon Glass 	unsigned long		udma_mask;
396*f2105c61SSimon Glass 	u16			cylinders;
397*f2105c61SSimon Glass 	u16			heads;
398*f2105c61SSimon Glass 	u16			sectors;
399*f2105c61SSimon Glass #ifndef __U_BOOT__
400*f2105c61SSimon Glass 	int			spdn_cnt;
401*f2105c61SSimon Glass #endif
402*f2105c61SSimon Glass };
403*f2105c61SSimon Glass 
404*f2105c61SSimon Glass struct ata_link {
405*f2105c61SSimon Glass 	struct ata_port		*ap;
406*f2105c61SSimon Glass 	int			pmp;
407*f2105c61SSimon Glass 	unsigned int		active_tag;
408*f2105c61SSimon Glass 	u32			sactive;
409*f2105c61SSimon Glass 	unsigned int		flags;
410*f2105c61SSimon Glass 	unsigned int		hw_sata_spd_limit;
411*f2105c61SSimon Glass #ifndef __U_BOOT__
412*f2105c61SSimon Glass 	unsigned int		sata_spd_limit;
413*f2105c61SSimon Glass 	unsigned int		sata_spd;
414*f2105c61SSimon Glass 	struct ata_device	device[2];
415*f2105c61SSimon Glass #endif
416*f2105c61SSimon Glass };
417*f2105c61SSimon Glass 
418*f2105c61SSimon Glass struct ata_port {
419*f2105c61SSimon Glass 	unsigned long		flags;
420*f2105c61SSimon Glass 	unsigned int		pflags;
421*f2105c61SSimon Glass 	unsigned int		print_id;
422*f2105c61SSimon Glass 	unsigned int		port_no;
423*f2105c61SSimon Glass 
424*f2105c61SSimon Glass 	struct ata_ioports	ioaddr;
425*f2105c61SSimon Glass 
426*f2105c61SSimon Glass 	u8			ctl;
427*f2105c61SSimon Glass 	u8			last_ctl;
428*f2105c61SSimon Glass 	unsigned int		pio_mask;
429*f2105c61SSimon Glass 	unsigned int		mwdma_mask;
430*f2105c61SSimon Glass 	unsigned int		udma_mask;
431*f2105c61SSimon Glass 	unsigned int		cbl;
432*f2105c61SSimon Glass 
433*f2105c61SSimon Glass 	struct ata_queued_cmd	qcmd[ATA_MAX_QUEUE];
434*f2105c61SSimon Glass 	unsigned long		qc_allocated;
435*f2105c61SSimon Glass 	unsigned int		qc_active;
436*f2105c61SSimon Glass 	int			nr_active_links;
437*f2105c61SSimon Glass 
438*f2105c61SSimon Glass 	struct ata_link		link;
439*f2105c61SSimon Glass #ifndef __U_BOOT__
440*f2105c61SSimon Glass 	int			nr_pmp_links;
441*f2105c61SSimon Glass 	struct ata_link		*pmp_link;
442*f2105c61SSimon Glass #endif
443*f2105c61SSimon Glass 	struct ata_link		*excl_link;
444*f2105c61SSimon Glass 	int			nr_pmp_links;
445*f2105c61SSimon Glass #ifndef __U_BOOT__
446*f2105c61SSimon Glass 	struct ata_port_stats	stats;
447*f2105c61SSimon Glass 	struct device		*dev;
448*f2105c61SSimon Glass 	u32			msg_enable;
449*f2105c61SSimon Glass #endif
450*f2105c61SSimon Glass 	struct ata_host		*host;
451*f2105c61SSimon Glass 	void			*port_task_data;
452*f2105c61SSimon Glass 
453*f2105c61SSimon Glass 	unsigned int		hsm_task_state;
454*f2105c61SSimon Glass 	void			*private_data;
455*f2105c61SSimon Glass 	unsigned char		*pdata;
456*f2105c61SSimon Glass };
457*f2105c61SSimon Glass 
458*f2105c61SSimon Glass #endif
459