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