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