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