source: trunk/src/os2ahci/ata.h@ 209

Last change on this file since 209 was 207, checked in by David Azarewicz, 4 years ago

Add 64/48 bit LBA support.

File size: 23.0 KB
Line 
1/**
2 * ata.h - ATA structures and macros for os2ahci driver
3 *
4 * Copyright (c) 2011 thi.guten Software Development
5 * Copyright (c) 2011 Mensys B.V.
6 * Copyright (c) 2013-2021 David Azarewicz <david@88watts.net>
7 *
8 * Authors: Christian Mueller, Markus Thielen
9 *
10 * Parts copied from/inspired by the Linux AHCI driver;
11 * those parts are (c) Linux AHCI/ATA maintainers
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 */
27
28/******************************************************************************
29 * Right now, os2ahci uses a fixed sector size of 512 bytes for hard disks.
30 * This may change in the future...
31 */
32#define ATA_SECTOR_SIZE 512
33
34/******************************************************************************
35 * Macros to access geometry values in the ATA ID buffer
36 */
37#define ATA_CYLS(id_buf) *((u16 *) (id_buf + ATA_ID_CYLS))
38#define ATA_HEADS(id_buf) *((u16 *) (id_buf + ATA_ID_HEADS))
39#define ATA_SECTORS(id_buf) *((u16 *) (id_buf + ATA_ID_SECTORS))
40#define ATA_CAPACITY(id_buf) *((u32 *) (id_buf + ATA_ID_LBA_CAPACITY))
41
42#define ATA_CAPACITY48_L(id_buf) *((u32 *) (id_buf + ATA_ID_LBA_CAPACITY_2))
43#define ATA_CAPACITY48_H(id_buf) *((u32 *) (id_buf + ATA_ID_LBA_CAPACITY_2 + 2))
44
45#define CUR_CYLS(id_buf) *((u16 *) (id_buf + ATA_ID_CUR_CYLS))
46#define CUR_HEADS(id_buf) *((u16 *) (id_buf + ATA_ID_CUR_HEADS))
47#define CUR_SECTORS(id_buf) *((u16 *) (id_buf + ATA_ID_CUR_SECTORS))
48#define CUR_CAPACITY(id_buf) *((u32 *) (id_buf + ATA_ID_CUR_CAPACITY))
49
50
51/******************************************************************************
52 * ATA IDENTIFY offsets and constants. The ATA IDENTIFY response is a bit of a
53 * mess and after struggling to put this into some structure, I discovered the
54 * Linux folks simply defined offsets and constants to those fields which are
55 * actually needed. Thus, I copied the relevant bits from ata.h, replacing
56 * the enum with precompiler definitions because our enums are signed 16 bits.
57 *
58 * Please note that strings such as the product name are stored using byte-
59 * swapped 16-bit words.
60 */
61#define ATA_ID_WORDS 256
62#define ATA_ID_CONFIG 0
63#define ATA_ID_CYLS 1
64#define ATA_ID_HEADS 3
65#define ATA_ID_SECTORS 6
66#define ATA_ID_SERNO 10
67#define ATA_ID_BUF_SIZE 21
68#define ATA_ID_FW_REV 23
69#define ATA_ID_PROD 27
70#define ATA_ID_MAX_MULTSECT 47
71#define ATA_ID_DWORD_IO 48
72#define ATA_ID_CAPABILITY 49
73#define ATA_ID_OLD_PIO_MODES 51
74#define ATA_ID_OLD_DMA_MODES 52
75#define ATA_ID_FIELD_VALID 53
76#define ATA_ID_CUR_CYLS 54
77#define ATA_ID_CUR_HEADS 55
78#define ATA_ID_CUR_SECTORS 56
79#define ATA_ID_CUR_CAPACITY 57
80#define ATA_ID_MULTSECT 59
81#define ATA_ID_LBA_CAPACITY 60
82#define ATA_ID_SWDMA_MODES 62
83#define ATA_ID_MWDMA_MODES 63
84#define ATA_ID_PIO_MODES 64
85#define ATA_ID_EIDE_DMA_MIN 65
86#define ATA_ID_EIDE_DMA_TIME 66
87#define ATA_ID_EIDE_PIO 67
88#define ATA_ID_EIDE_PIO_IORDY 68
89#define ATA_ID_ADDITIONAL_SUPP 69
90#define ATA_ID_QUEUE_DEPTH 75
91#define ATA_ID_MAJOR_VER 80
92#define ATA_ID_COMMAND_SET_1 82
93#define ATA_ID_COMMAND_SET_2 83
94#define ATA_ID_CFSSE 84
95#define ATA_ID_CFSSE 84
96#define ATA_ID_CFS_ENABLE_1 85
97#define ATA_ID_CFS_ENABLE_2 86
98#define ATA_ID_CSF_DEFAULT 87
99#define ATA_ID_UDMA_MODES 88
100#define ATA_ID_HW_CONFIG 93
101#define ATA_ID_SPG 98
102#define ATA_ID_LBA_CAPACITY_2 100
103#define ATA_ID_SECTOR_SIZE 106
104#define ATA_ID_LAST_LUN 126
105#define ATA_ID_DLF 128
106#define ATA_ID_CSFO 129
107#define ATA_ID_CFA_POWER 160
108#define ATA_ID_CFA_KEY_MGMT 162
109#define ATA_ID_CFA_MODES 163
110#define ATA_ID_DATA_SET_MGMT 169
111#define ATA_ID_ROT_SPEED 217
112#define ATA_ID_PIO4 (1U << 1)
113
114#define ATA_ID_SERNO_LEN 20
115#define ATA_ID_FW_REV_LEN 8
116#define ATA_ID_PROD_LEN 40
117
118#define ATA_PCI_CTL_OFS 2
119
120#define ATA_PIO0 (1U << 0)
121#define ATA_PIO1 ATA_PIO0 | (1U << 1)
122#define ATA_PIO2 ATA_PIO1 | (1U << 2)
123#define ATA_PIO3 ATA_PIO2 | (1U << 3)
124#define ATA_PIO4 ATA_PIO3 | (1U << 4)
125#define ATA_PIO5 ATA_PIO4 | (1U << 5)
126#define ATA_PIO6 ATA_PIO5 | (1U << 6)
127
128#define ATA_PIO4_ONLY (1U << 4)
129
130#define ATA_SWDMA0 (1U << 0)
131#define ATA_SWDMA1 ATA_SWDMA0 | (1U << 1)
132#define ATA_SWDMA2 ATA_SWDMA1 | (1U << 2)
133
134#define ATA_SWDMA2_ONLY (1U << 2)
135
136#define ATA_MWDMA0 (1U << 0)
137#define ATA_MWDMA1 ATA_MWDMA0 | (1U << 1)
138#define ATA_MWDMA2 ATA_MWDMA1 | (1U << 2)
139#define ATA_MWDMA3 ATA_MWDMA2 | (1U << 3)
140#define ATA_MWDMA4 ATA_MWDMA3 | (1U << 4)
141
142#define ATA_MWDMA12_ONLY (1U << 1) | (1U << 2)
143#define ATA_MWDMA2_ONLY (1U << 2)
144
145#define ATA_UDMA0 (1U << 0)
146#define ATA_UDMA1 ATA_UDMA0 | (1U << 1)
147#define ATA_UDMA2 ATA_UDMA1 | (1U << 2)
148#define ATA_UDMA3 ATA_UDMA2 | (1U << 3)
149#define ATA_UDMA4 ATA_UDMA3 | (1U << 4)
150#define ATA_UDMA5 ATA_UDMA4 | (1U << 5)
151#define ATA_UDMA6 ATA_UDMA5 | (1U << 6)
152
153/******************************************************************************
154 * Miscellanous constants copied from the Linux LIBATA code. Again, the enums
155 * have been converted to preprocessor definitions to avoid problems with
156 * signed 16-bit integers.
157 *
158 * Please note that Linux supports all kinds of IDE/EIDE/ATA/SATA/... devices
159 * in LIBATA while we only need the ATA-8 bits, and those only as far as they
160 * are relevant to AHCI.
161 */
162
163/* bits in ATA command block registers */
164#define ATA_HOB (1U << 7) /* LBA48 selector */
165#define ATA_NIEN (1U << 1) /* disable-irq flag */
166#define ATA_LBA (1U << 6) /* LBA28 selector */
167#define ATA_DEV1 (1U << 4) /* Select Device 1 (slave) */
168#define ATA_DEVICE_OBS (1U << 7) | (1U << 5) /* obs bits in dev reg */
169#define ATA_DEVCTL_OBS (1U << 3) /* obsolete bit in devctl reg */
170#define ATA_BUSY (1U << 7) /* BSY status bit */
171#define ATA_DRDY (1U << 6) /* device ready */
172#define ATA_DF (1U << 5) /* device fault */
173#define ATA_DSC (1U << 4) /* drive seek complete */
174#define ATA_DRQ (1U << 3) /* data request i/o */
175#define ATA_CORR (1U << 2) /* corrected data error */
176#define ATA_IDX (1U << 1) /* index */
177#define ATA_ERR (1U << 0) /* have an error */
178#define ATA_SRST (1U << 2) /* software reset */
179#define ATA_ICRC (1U << 7) /* interface CRC error */
180#define ATA_BBK ATA_ICRC /* pre-EIDE: block marked bad */
181#define ATA_UNC (1U << 6) /* uncorrectable media error */
182#define ATA_MC (1U << 5) /* media changed */
183#define ATA_IDNF (1U << 4) /* ID not found */
184#define ATA_MCR (1U << 3) /* media change requested */
185#define ATA_ABORTED (1U << 2) /* command aborted */
186#define ATA_TRK0NF (1U << 1) /* track 0 not found */
187#define ATA_AMNF (1U << 0) /* address mark not found */
188#define ATAPI_LFS 0xF0U /* last failed sense */
189#define ATAPI_EOM ATA_TRK0NF /* end of media */
190#define ATAPI_ILI ATA_AMNF /* illegal length indication */
191#define ATAPI_IO (1U << 1)
192#define ATAPI_COD (1U << 0)
193
194/* ATA device commands */
195#define ATA_CMD_DEV_RESET 0x08 /* ATAPI device reset */
196#define ATA_CMD_CHK_POWER 0xE5 /* check power mode */
197#define ATA_CMD_STANDBY 0xE2 /* place in standby power mode */
198#define ATA_CMD_IDLE 0xE3 /* place in idle power mode */
199#define ATA_CMD_EDD 0x90 /* execute device diagnostic */
200#define ATA_CMD_DOWNLOAD_MICRO 0x92
201#define ATA_CMD_NOP 0x00
202#define ATA_CMD_FLUSH 0xE7
203#define ATA_CMD_FLUSH_EXT 0xEA
204#define ATA_CMD_ID_ATA 0xEC
205#define ATA_CMD_ID_ATAPI 0xA1
206#define ATA_CMD_SERVICE 0xA2
207#define ATA_CMD_READ 0xC8
208#define ATA_CMD_READ_EXT 0x25
209#define ATA_CMD_READ_QUEUED 0x26
210#define ATA_CMD_READ_STREAM_EXT 0x2B
211#define ATA_CMD_READ_STREAM_DMA_EXT 0x2A
212#define ATA_CMD_WRITE 0xCA
213#define ATA_CMD_WRITE_EXT 0x35
214#define ATA_CMD_WRITE_QUEUED 0x36
215#define ATA_CMD_WRITE_STREAM_EXT 0x3B
216#define ATA_CMD_WRITE_STREAM_DMA_EXT 0x3A
217#define ATA_CMD_WRITE_FUA_EXT 0x3D
218#define ATA_CMD_WRITE_QUEUED_FUA_EXT 0x3E
219#define ATA_CMD_FPDMA_READ 0x60
220#define ATA_CMD_FPDMA_WRITE 0x61
221#define ATA_CMD_PIO_READ 0x20
222#define ATA_CMD_PIO_READ_EXT 0x24
223#define ATA_CMD_PIO_WRITE 0x30
224#define ATA_CMD_PIO_WRITE_EXT 0x34
225#define ATA_CMD_READ_MULTI 0xC4
226#define ATA_CMD_READ_MULTI_EXT 0x29
227#define ATA_CMD_WRITE_MULTI 0xC5
228#define ATA_CMD_WRITE_MULTI_EXT 0x39
229#define ATA_CMD_WRITE_MULTI_FUA_EXT 0xCE
230#define ATA_CMD_SET_FEATURES 0xEF
231#define ATA_CMD_SET_MULTI 0xC6
232#define ATA_CMD_PACKET 0xA0
233#define ATA_CMD_VERIFY 0x40
234#define ATA_CMD_VERIFY_EXT 0x42
235#define ATA_CMD_WRITE_UNCORR_EXT 0x45
236#define ATA_CMD_STANDBYNOW1 0xE0
237#define ATA_CMD_IDLEIMMEDIATE 0xE1
238#define ATA_CMD_SLEEP 0xE6
239#define ATA_CMD_INIT_DEV_PARAMS 0x91
240#define ATA_CMD_READ_NATIVE_MAX 0xF8
241#define ATA_CMD_READ_NATIVE_MAX_EXT 0x27
242#define ATA_CMD_SET_MAX 0xF9
243#define ATA_CMD_SET_MAX_EXT 0x37
244#define ATA_CMD_READ_LOG_EXT 0x2F
245#define ATA_CMD_WRITE_LOG_EXT 0x3F
246#define ATA_CMD_READ_LOG_DMA_EXT 0x47
247#define ATA_CMD_WRITE_LOG_DMA_EXT 0x57
248#define ATA_CMD_TRUSTED_RCV 0x5C
249#define ATA_CMD_TRUSTED_RCV_DMA 0x5D
250#define ATA_CMD_TRUSTED_SND 0x5E
251#define ATA_CMD_TRUSTED_SND_DMA 0x5F
252#define ATA_CMD_PMP_READ 0xE4
253#define ATA_CMD_PMP_WRITE 0xE8
254#define ATA_CMD_CONF_OVERLAY 0xB1
255#define ATA_CMD_SEC_SET_PASS 0xF1
256#define ATA_CMD_SEC_UNLOCK 0xF2
257#define ATA_CMD_SEC_ERASE_PREP 0xF3
258#define ATA_CMD_SEC_ERASE_UNIT 0xF4
259#define ATA_CMD_SEC_FREEZE_LOCK 0xF5
260#define ATA_CMD_SEC_DISABLE_PASS 0xF6
261#define ATA_CMD_CONFIG_STREAM 0x51
262#define ATA_CMD_SMART 0xB0
263#define ATA_CMD_MEDIA_LOCK 0xDE
264#define ATA_CMD_MEDIA_UNLOCK 0xDF
265#define ATA_CMD_DSM 0x06
266#define ATA_CMD_CHK_MED_CRD_TYP 0xD1
267#define ATA_CMD_CFA_REQ_EXT_ERR 0x03
268#define ATA_CMD_CFA_WRITE_NE 0x38
269#define ATA_CMD_CFA_TRANS_SECT 0x87
270#define ATA_CMD_CFA_ERASE 0xC0
271#define ATA_CMD_CFA_WRITE_MULT_NE 0xCD
272/* marked obsolete in the ATA/ATAPI-7 spec */
273#define ATA_CMD_RESTORE 0x10
274
275/* READ_LOG_EXT pages */
276#define ATA_LOG_SATA_NCQ 0x10
277
278/* READ/WRITE LONG (obsolete) */
279#define ATA_CMD_READ_LONG 0x22
280#define ATA_CMD_READ_LONG_ONCE 0x23
281#define ATA_CMD_WRITE_LONG 0x32
282#define ATA_CMD_WRITE_LONG_ONCE 0x33
283
284/* SETFEATURES stuff */
285#define SETFEATURES_XFER 0x03
286#define XFER_UDMA_7 0x47
287#define XFER_UDMA_6 0x46
288#define XFER_UDMA_5 0x45
289#define XFER_UDMA_4 0x44
290#define XFER_UDMA_3 0x43
291#define XFER_UDMA_2 0x42
292#define XFER_UDMA_1 0x41
293#define XFER_UDMA_0 0x40
294#define XFER_MW_DMA_4 0x24 /* CFA only */
295#define XFER_MW_DMA_3 0x23 /* CFA only */
296#define XFER_MW_DMA_2 0x22
297#define XFER_MW_DMA_1 0x21
298#define XFER_MW_DMA_0 0x20
299#define XFER_SW_DMA_2 0x12
300#define XFER_SW_DMA_1 0x11
301#define XFER_SW_DMA_0 0x10
302#define XFER_PIO_6 0x0E /* CFA only */
303#define XFER_PIO_5 0x0D /* CFA only */
304#define XFER_PIO_4 0x0C
305#define XFER_PIO_3 0x0B
306#define XFER_PIO_2 0x0A
307#define XFER_PIO_1 0x09
308#define XFER_PIO_0 0x08
309#define XFER_PIO_SLOW 0x00
310
311#define SETFEATURES_WC_ON 0x02 /* Enable write cache */
312#define SETFEATURES_WC_OFF 0x82 /* Disable write cache */
313
314/* Enable/Disable Automatic Acoustic Management */
315#define SETFEATURES_AAM_ON 0x42
316#define SETFEATURES_AAM_OFF 0xC2
317
318#define SETFEATURES_SPINUP 0x07 /* Spin-up drive */
319
320#define SETFEATURES_SATA_ENABLE 0x10 /* Enable use of SATA feature */
321#define SETFEATURES_SATA_DISABLE 0x90 /* Disable use of SATA feature */
322
323/* SETFEATURE Sector counts for SATA features */
324#define SATA_FPDMA_OFFSET 0x01 /* FPDMA non-zero buffer offsets */
325#define SATA_FPDMA_AA 0x02 /* FPDMA Setup FIS Auto-Activate */
326#define SATA_DIPM 0x03 /* Device Initiated Power Management */
327#define SATA_FPDMA_IN_ORDER 0x04 /* FPDMA in-order data delivery */
328#define SATA_AN 0x05 /* Asynchronous Notification */
329#define SATA_SSP 0x06 /* Software Settings Preservation */
330
331/* feature values for SET_MAX */
332#define ATA_SET_MAX_ADDR 0x00
333#define ATA_SET_MAX_PASSWD 0x01
334#define ATA_SET_MAX_LOCK 0x02
335#define ATA_SET_MAX_UNLOCK 0x03
336#define ATA_SET_MAX_FREEZE_LOCK 0x04
337
338/* feature values for DEVICE CONFIGURATION OVERLAY */
339#define ATA_DCO_RESTORE 0xC0
340#define ATA_DCO_FREEZE_LOCK 0xC1
341#define ATA_DCO_IDENTIFY 0xC2
342#define ATA_DCO_SET 0xC3
343
344/* feature values for SMART */
345#define ATA_SMART_READ_VALUES 0xD0
346#define ATA_SMART_READ_THRESHOLDS 0xD1
347#define ATA_SMART_AUTOSAVE 0xD2
348#define ATA_SMART_SAVE 0xD3
349#define ATA_SMART_IMMEDIATE_OFFLINE 0xD4
350#define ATA_SMART_READ_LOG 0xD5
351#define ATA_SMART_WRITE_LOG 0xD6
352#define ATA_SMART_ENABLE 0xD8
353#define ATA_SMART_DISABLE 0xD9
354#define ATA_SMART_STATUS 0xDA
355#define ATA_SMART_AUTO_OFFLINE 0xDB
356
357/* feature values for Data Set Management */
358#define ATA_DSM_TRIM 0x01
359
360/* password used in LBA Mid / LBA High for executing SMART commands */
361#define ATA_SMART_LBAM_PASS 0x4F
362#define ATA_SMART_LBAH_PASS 0xC2
363
364/* ATAPI stuff */
365#define ATAPI_PKT_DMA (1U << 0)
366#define ATAPI_DMADIR (1U << 2) /* ATAPI data dir:
367 0=to device, 1=to host */
368#define ATAPI_CDB_LEN 16
369
370/* PMP stuff */
371#define SATA_PMP_MAX_PORTS 15
372#define SATA_PMP_CTRL_PORT 15
373
374#define SATA_PMP_GSCR_DWORDS 128
375#define SATA_PMP_GSCR_PROD_ID 0
376#define SATA_PMP_GSCR_REV 1
377#define SATA_PMP_GSCR_PORT_INFO 2
378#define SATA_PMP_GSCR_ERROR 32
379#define SATA_PMP_GSCR_ERROR_EN 33
380#define SATA_PMP_GSCR_FEAT 64
381#define SATA_PMP_GSCR_FEAT_EN 96
382
383#define SATA_PMP_PSCR_STATUS 0
384#define SATA_PMP_PSCR_ERROR 1
385#define SATA_PMP_PSCR_CONTROL 2
386
387#define SATA_PMP_FEAT_BIST (1U << 0)
388#define SATA_PMP_FEAT_PMREQ (1U << 1)
389#define SATA_PMP_FEAT_DYNSSC (1U << 2)
390#define SATA_PMP_FEAT_NOTIFY (1U << 3)
391
392/* SATA Status and Control Registers */
393#define SCR_STATUS 0
394#define SCR_ERROR 1
395#define SCR_CONTROL 2
396#define SCR_ACTIVE 3
397#define SCR_NOTIFICATION 4
398
399/* SError bits */
400#define SERR_DATA_RECOVERED (1UL << 0) /* recovered data error */
401#define SERR_COMM_RECOVERED (1UL << 1) /* recovered comm failure */
402#define SERR_DATA (1UL << 8) /* unrecovered data error */
403#define SERR_PERSISTENT (1UL << 9) /* persistent data/comm error */
404#define SERR_PROTOCOL (1UL << 10) /* protocol violation */
405#define SERR_INTERNAL (1UL << 11) /* host internal error */
406#define SERR_PHYRDY_CHG (1UL << 16) /* PHY RDY changed */
407#define SERR_PHY_INT_ERR (1UL << 17) /* PHY internal error */
408#define SERR_COMM_WAKE (1UL << 18) /* Comm wake */
409#define SERR_10B_8B_ERR (1UL << 19) /* 10b to 8b decode error */
410#define SERR_DISPARITY (1UL << 20) /* Disparity */
411#define SERR_CRC (1UL << 21) /* CRC error */
412#define SERR_HANDSHAKE (1UL << 22) /* Handshake error */
413#define SERR_LINK_SEQ_ERR (1UL << 23) /* Link sequence error */
414#define SERR_TRANS_ST_ERROR (1UL << 24) /* Transport state trans. error */
415#define SERR_UNRECOG_FIS (1UL << 25) /* Unrecognized FIS */
416#define SERR_DEV_XCHG (1UL << 26) /* device exchanged */
417
418/******************************************************************************
419 * Parameters for ATA commands. Those parameters are passed in a variable
420 * argument list in the format:
421 *
422 * AP_xxx, [val, ...], AP_xxx, [val, ...]
423 *
424 * The values expected by each parameter are indicated within square brackets.
425 */
426typedef enum {
427 AP_FEATURES, /* [u16] ATA command features (read: flags) */
428 AP_COUNT, /* [u16] number of sectors (0 = 65536) */
429 AP_SECTOR_28, /* [u32] 28-bit sector address */
430 AP_SECTOR_48, /* [u32, u16] 48-bit sector address */
431 AP_DEVICE, /* [u16] ATA cmd "device" field */
432 AP_SGLIST, /* [void *, u16] buffer S/G (SCATGATENTRY/count) */
433 AP_VADDR, /* [void *, u16] buffer virtual address (buf/len) */
434 AP_WRITE, /* [u16] if != 0, data is written to device */
435 AP_AHCI_FLAGS, /* [u16] AHCI command header flags */
436 AP_ATAPI_CMD, /* [void *, u16] ATAPI command (CDB) and length */
437 AP_ATA_CMD, /* [void *] ATA command (fixed len) */
438 AP_END /* [] end of variable argument list */
439} ATA_PARM;
440
441/******************************************************************************
442 * Return codes for ata_cmd(); please note that positive return codes indicate
443 * that not all S/G elements could be mapped, 0 means success and negative
444 * values indicate error conditions.
445 */
446#define ATA_CMD_SUCCESS 0
447#define ATA_CMD_INVALID_PARM -1
448#define ATA_CMD_UNALIGNED_ADDR -2
449
450/* ------------------------ typedefs and structures ------------------------ */
451
452/******************************************************************************
453 * Generic ATA-8 command structure. This is loosely based on ATA-8, i.e. we
454 * don't have to deal with shadow registers and map them to the low bytes of
455 * adjecent words, etc. but there are still some oddities which need to be
456 * taken into consideration. For example, ATA-8 says LBA-28 sector addresses
457 * are simply the lower 28 bits in the LBA field. However, the underlying
458 * transport (SATA in our case) only looks at the three lower bytes of the
459 * LBA field, much like an IDE device would do. This means that only 3 bytes
460 * of the LBA field are processed and this yields only 24 bits. The remaining
461 * 4 bits need to be stored in the "device" register....
462 *
463 * Everything else seems to behave normally, as far as this term can be
464 * applied to IDE/ATA. Further details can be found in section 7.1.5.1 of the
465 * ATA-8 spec (Inputs for 28-bit Read/Write Commands).
466 */
467typedef struct {
468 u16 features; /* feature bits */
469 u16 count; /* count register (e.g. number of sectors) */
470 u32 lba_l; /* low 24 bits of LBA-28 (32 bits for 48-bit devices) */
471 u16 lba_h; /* high 16 bits of LBA for 48-bit devices */
472 u8 cmd; /* ATA command field */
473 u8 device; /* ATA device field and upper 4 bits of LBA-28 */
474} ATA_CMD;
475
476/* generic ATA-8 response structure */
477typedef struct {
478 u16 error; /* error code, if any */
479 u16 count; /* count register (e.g. number of sectors) */
480 u32 lba_l; /* low 28 bits of LBA (32 bits for 48-bit devices) */
481 u16 lba_h; /* high 16 bits of LBA for 48-bit devices */
482 u16 status; /* response status bits */
483} ATA_RSP;
484
485/******************************************************************************
486 * Command-specific ATA-8 structures.
487 */
488
489/* -------------------------- function prototypes -------------------------- */
490
491extern int ata_cmd(AD_INFO *ai, int port, int device, int slot, int cmd, ...);
492extern int v_ata_cmd(AD_INFO *ai, int port, int device, int slot, int cmd, va_list va);
493extern void ata_cmd_to_fis(u8 *fis, ATA_CMD *cmd, int device);
494extern void ata_max_sg_cnt(IORB_EXECUTEIO *io, USHORT sg_indx, USHORT sg_max, USHORT *sg_cnt, USHORT *sector_cnt);
495extern int ata_get_geometry(IORBH FAR16DATA *iorb, IORBH *pIorb, int slot);
496extern void ata_get_geometry_pp(IORBH FAR16DATA *vIorb, IORBH *pIorb);
497extern int ata_unit_ready(IORBH FAR16DATA *vIorb, IORBH *pIorb, int slot);
498extern int ata_read(IORBH FAR16DATA *vIorb, IORBH *pIorb, int slot);
499extern int ata_read_unaligned(IORBH *pIorb, int slot);
500extern void ata_read_pp(IORBH FAR16DATA *vIorb, IORBH *pIorb);
501extern int ata_verify(IORBH FAR16DATA *vIorb, IORBH *pIorb, int slot);
502extern int ata_write(IORBH FAR16DATA *vIorb, IORBH *pIorb, int slot);
503extern int ata_write_unaligned(IORBH *pIorb, int slot);
504extern void ata_write_pp(IORBH FAR16DATA *vIorb, IORBH *pIorb);
505extern int ata_execute_ata(IORBH FAR16DATA *vIorb, IORBH *pIorb, int slot);
506extern void ata_execute_ata_pp(IORBH FAR16DATA *vIorb, IORBH *pIorb);
507extern int ata_req_sense(IORBH FAR16DATA *vIorb, IORBH *pIorb, int slot);
508extern char *ata_dev_name(u16 *id_buf);
509
Note: See TracBrowser for help on using the repository browser.