2 * Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 * $OpenBSD: atascsi.h,v 1.33 2009/02/16 21:19:06 miod Exp $
26 #define ATA_C_DATA_SET_MANAGEMENT 0x06 /* Data Set Management command */
27 #define ATA_C_SATA_FEATURE_ENA 0x10
28 #define ATA_C_READDMA_EXT 0x25
29 #define ATA_C_READ_LOG_EXT 0x2f
30 #define ATA_C_WRITEDMA_EXT 0x35
31 #define ATA_C_READ_FPDMA 0x60
32 #define ATA_C_WRITE_FPDMA 0x61
33 #define ATA_C_SATA_FEATURE_DIS 0x90
34 #define ATA_C_PACKET 0xa0
35 #define ATA_C_ATAPI_IDENTIFY 0xa1
36 #define ATA_C_READDMA 0xc8
37 #define ATA_C_WRITEDMA 0xca
38 #define ATA_C_READ_PM 0xe4
39 #define ATA_C_WRITE_PM 0xe8
40 #define ATA_C_FLUSH_CACHE 0xe7
41 #define ATA_C_FLUSH_CACHE_EXT 0xea /* lba48 */
42 #define ATA_C_IDENTIFY 0xec
43 #define ATA_C_SET_FEATURES 0xef
44 #define ATA_C_SEC_FREEZE_LOCK 0xf5
47 * ATA SATA FEATURES subcommands
49 #define ATA_SATAFT_NONZDMA 0x01 /* DMA non-zero buffer offset */
50 #define ATA_SATAFT_DMAAAOPT 0x02 /* DMA AA optimization */
51 #define ATA_SATAFT_DEVIPS 0x03 /* Device-initiated pwr state*/
52 #define ATA_SATAFT_INORDER 0x04 /* in-order data delivery */
53 #define ATA_SATAFT_ASYNCNOTIFY 0x05 /* Async notification */
56 * ATA SET FEATURES subcommands
58 #define ATA_SF_DSM_TRIM 0x01 /* TRIM DSM feature */
59 #define ATA_SF_WRITECACHE_EN 0x02
60 #define ATA_SF_SETXFER 0x03
61 #define ATA_SF_LOOKAHEAD_EN 0xaa
62 #define ATA_SF_SENSEDATA_EN 0xc3
65 u_int16_t config
; /* 0 */
66 u_int16_t ncyls
; /* 1 */
67 u_int16_t reserved1
; /* 2 */
68 u_int16_t nheads
; /* 3 */
69 u_int16_t track_size
; /* 4 */
70 u_int16_t sector_size
; /* 5 */
71 u_int16_t nsectors
; /* 6 */
72 u_int16_t reserved2
[3]; /* 7 vendor unique */
73 u_int8_t serial
[20]; /* 10 */
74 u_int16_t buffer_type
; /* 20 */
75 u_int16_t buffer_size
; /* 21 */
76 u_int16_t ecc
; /* 22 */
77 u_int8_t firmware
[8]; /* 23 */
78 u_int8_t model
[40]; /* 27 */
79 u_int16_t multi
; /* 47 */
80 u_int16_t dwcap
; /* 48 */
81 u_int16_t cap
; /* 49 */
82 u_int16_t reserved3
; /* 50 */
83 u_int16_t piomode
; /* 51 */
84 u_int16_t dmamode
; /* 52 */
85 u_int16_t validinfo
; /* 53 */
86 u_int16_t curcyls
; /* 54 */
87 u_int16_t curheads
; /* 55 */
88 u_int16_t cursectrk
; /* 56 */
89 u_int16_t curseccp
[2]; /* 57 */
90 u_int16_t mult2
; /* 59 */
91 u_int16_t addrsec
[2]; /* 60 */
92 u_int16_t worddma
; /* 62 */
93 u_int16_t dworddma
; /* 63 */
94 u_int16_t advpiomode
; /* 64 */
95 u_int16_t minmwdma
; /* 65 */
96 u_int16_t recmwdma
; /* 66 */
97 u_int16_t minpio
; /* 67 */
98 u_int16_t minpioflow
; /* 68 */
99 u_int16_t support3
; /* 69 */
100 #define ATA_SUPPORT_RZAT 0x0020
101 #define ATA_SUPPORT_DRAT 0x4000
102 u_int16_t reserved4
; /* 70 */
103 u_int16_t typtime
[2]; /* 71 */
104 u_int16_t reserved5
[2]; /* 73 */
105 u_int16_t qdepth
; /* 75 */
106 u_int16_t satacap
; /* 76 */
107 u_int16_t satacap2
; /* 77 */
108 #define SATA_CAP2_SNDRCV_FPDMA (1 << 6)
109 u_int16_t satafsup
; /* 78 */
110 u_int16_t satafen
; /* 79 */
111 u_int16_t majver
; /* 80 */
112 u_int16_t minver
; /* 81 */
113 u_int16_t cmdset82
; /* 82 */
114 u_int16_t cmdset83
; /* 83 */
115 u_int16_t cmdset84
; /* 84 */
116 u_int16_t features85
; /* 85 */
117 u_int16_t features86
; /* 86 */
118 u_int16_t features87
; /* 87 */
119 #define ATA_ID_F87_WWN (1<<8)
120 u_int16_t ultradma
; /* 88 */
121 u_int16_t erasetime
; /* 89 */
122 u_int16_t erasetimex
; /* 90 */
123 u_int16_t apm
; /* 91 */
124 u_int16_t masterpw
; /* 92 */
125 u_int16_t hwreset
; /* 93 */
126 u_int16_t acoustic
; /* 94 */
127 u_int16_t stream_min
; /* 95 */
128 u_int16_t stream_xfer_d
; /* 96 */
129 u_int16_t stream_lat
; /* 97 */
130 u_int16_t streamperf
[2]; /* 98 */
131 u_int16_t addrsecxt
[4]; /* 100 */
132 u_int16_t stream_xfer_p
; /* 104 */
133 u_int16_t max_dsm_blocks
; /* 105 */
134 u_int16_t phys_sect_sz
; /* 106 */
135 u_int16_t seek_delay
; /* 107 */
136 u_int16_t naa_ieee_oui
; /* 108 */
137 u_int16_t ieee_oui_uid
; /* 109 */
138 u_int16_t uid_mid
; /* 110 */
139 u_int16_t uid_low
; /* 111 */
140 u_int16_t resv_wwn
[4]; /* 112 */
141 u_int16_t incits
; /* 116 */
142 u_int16_t words_lsec
[2]; /* 117 */
143 u_int16_t cmdset119
; /* 119 */
144 u_int16_t features120
; /* 120 */
145 u_int16_t padding2
[6];
146 u_int16_t rmsn
; /* 127 */
147 u_int16_t securestatus
; /* 128 */
148 #define ATA_SECURE_LOCKED (1<<2)
149 #define ATA_SECURE_FROZEN (1<<3)
150 u_int16_t vendor
[31]; /* 129 */
151 u_int16_t padding3
[9]; /* 160 */
152 u_int16_t support_dsm
; /* 169 */
153 #define ATA_SUPPORT_DSM_TRIM 0x0001
154 u_int16_t padding5
[6]; /* 170 */
155 u_int16_t curmedser
[30]; /* 176 */
156 u_int16_t sctsupport
; /* 206 */
157 u_int16_t padding4
[10]; /* 207 */
158 u_int16_t nomrota_rate
; /* 217 */
159 u_int16_t padding6
[37]; /* 218 */
160 u_int16_t integrity
; /* 255 */
164 * IDENTIFY DEVICE data
166 #define ATA_IDENTIFY_SECURITY (1 << 1)
167 #define ATA_IDENTIFY_WRITECACHE (1 << 5)
168 #define ATA_IDENTIFY_LOOKAHEAD (1 << 6)
171 * Frame Information Structures
174 #define ATA_FIS_LENGTH 20
178 #define ATA_FIS_TYPE_H2D 0x27
180 #define ATA_H2D_FLAGS_CMD (1<<7)
183 #define ATA_H2D_FEATURES_DMA (1<<0)
184 #define ATA_H2D_FEATURES_DIR (1<<2)
185 #define ATA_H2D_FEATURES_DIR_READ (1<<2)
186 #define ATA_H2D_FEATURES_DIR_WRITE (0<<2)
192 #define ATA_H2D_DEVICE_LBA 0x40
194 u_int8_t lba_low_exp
;
195 u_int8_t lba_mid_exp
;
196 u_int8_t lba_high_exp
;
197 u_int8_t features_exp
;
199 u_int8_t sector_count
;
200 u_int8_t sector_count_exp
;
203 #define ATA_FIS_CONTROL_SRST 0x04
204 #define ATA_FIS_CONTROL_4BIT 0x08
214 #define ATA_FIS_TYPE_D2H 0x34
216 #define ATA_D2H_FLAGS_INTR (1<<6)
218 #define ATA_D2H_STATUS_BSY (1<<7) /* Busy */
219 #define ATA_D2H_STATUS_DRDY (1<<6) /* Device Ready */
220 #define ATA_D2H_STATUS_DF (1<<5) /* Device Fault */
221 #define ATA_D2H_STATUS_DSC (1<<4) /* Seek Complete */
222 #define ATA_D2H_STATUS_DRQ (1<<3) /* Data Transfer Request */
223 #define ATA_D2H_STATUS_CORR (1<<2) /* Data Corrected */
224 #define ATA_D2H_STATUS_IDX (1<<1) /* Index mark */
225 #define ATA_D2H_STATUS_ERR (1<<0) /* Error */
227 #define ATA_D2H_ERROR_BBK (1<<7) /* Bad Block */
228 #define ATA_D2H_ERROR_UNK (1<<6) /* Uncorrectable data error */
229 #define ATA_D2H_ERROR_MC (1<<5) /* Media Check */
230 #define ATA_D2H_ERROR_IDNF (1<<4) /* ID (of sector) not found */
231 #define ATA_D2H_ERROR_MCR (1<<3) /* Media Change Request */
232 #define ATA_D2H_ERROR_ABRT (1<<2) /* Aborted Command */
233 #define ATA_D2H_ERROR_TK0NF (1<<1) /* Track 0 not valid */
234 #define ATA_D2H_ERROR_AMNF (1<<0) /* Data Address Mark not found */
241 u_int8_t lba_low_exp
;
242 u_int8_t lba_mid_exp
;
243 u_int8_t lba_high_exp
;
246 u_int8_t sector_count
;
247 u_int8_t sector_count_exp
;
258 * SATA log page 10h -
259 * looks like a D2H FIS, with errored tag number in first byte.
261 struct ata_log_page_10h
{
262 struct ata_fis_d2h err_regs
;
263 #define ATA_LOG_10H_TYPE_NOTQUEUED 0x80
264 #define ATA_LOG_10H_TYPE_TAG_MASK 0x1f
265 u_int8_t reserved
[256 - sizeof(struct ata_fis_d2h
)];
266 u_int8_t vendor_specific
[255];
274 #define SATA_SStatus_DET 0x00f
275 #define SATA_SStatus_DET_NODEV 0x000
276 #define SATA_SStatus_DET_NOPHY 0x001
277 #define SATA_SStatus_DET_DEV 0x003
278 #define SATA_SStatus_DET_OFFLINE 0x008
280 #define SATA_SStatus_SPD 0x0f0
281 #define SATA_SStatus_SPD_NONE 0x000
282 #define SATA_SStatus_SPD_1_5 0x010
283 #define SATA_SStatus_SPD_3_0 0x020
285 #define SATA_SStatus_IPM 0xf00
286 #define SATA_SStatus_IPM_NODEV 0x000
287 #define SATA_SStatus_IPM_ACTIVE 0x100
288 #define SATA_SStatus_IPM_PARTIAL 0x200
289 #define SATA_SStatus_IPM_SLUMBER 0x600
291 #define SATA_SIGNATURE_PORT_MULTIPLIER 0x96690101
292 #define SATA_SIGNATURE_ATAPI 0xeb140101
293 #define SATA_SIGNATURE_DISK 0x00000101
302 struct ata_identify at_identify
; /* only if ATA_PORT_T_DISK */
303 struct ahci_port
*at_ahci_port
;
305 #define ATA_PORT_T_NONE 0
306 #define ATA_PORT_T_DISK 1
307 #define ATA_PORT_T_ATAPI 2
308 #define ATA_PORT_T_PM 3
310 #define ATA_PORT_F_WCACHE (1 << 0)
311 #define ATA_PORT_F_RAHEAD (1 << 1)
312 #define ATA_PORT_F_FRZLCK (1 << 2)
313 #define ATA_PORT_F_RESCAN (1 << 3) /* re-check on bus scan */
315 #define ATA_PROBE_NEED_INIT 0
316 #define ATA_PROBE_NEED_HARD_RESET 1
317 #define ATA_PROBE_NEED_SOFT_RESET 2
318 #define ATA_PROBE_NEED_IDENT 3
319 #define ATA_PROBE_GOOD 4
320 #define ATA_PROBE_FAILED 7
322 u_int64_t at_capacity
; /* only if ATA_PORT_T_DISK */
323 int at_target
; /* port multiplier port */
328 struct ata_fis_h2d
*fis
;
329 struct ata_fis_d2h rfis
;
337 void (*complete
)(struct ata_xfer
*);
339 int serial
; /* detect timeout races */
342 #define ATA_F_READ (1<<0)
343 #define ATA_F_WRITE (1<<1)
344 #define ATA_F_NOWAIT (1<<2)
345 #define ATA_F_POLL (1<<3)
346 #define ATA_F_PIO (1<<4)
347 #define ATA_F_PACKET (1<<5)
348 #define ATA_F_NCQ (1<<6)
349 #define ATA_F_TIMEOUT_RUNNING (1<<7)
350 #define ATA_F_TIMEOUT_DESIRED (1<<8)
351 #define ATA_F_TIMEOUT_EXPIRED (1<<9)
352 #define ATA_F_AUTOSENSE (1<<10)
353 #define ATA_F_EXCLUSIVE (1<<11)
354 #define ATA_F_SILENT (1<<12)
355 #define ATA_FMT_FLAGS "\020" \
360 "\011DESIRED" "\010TRUNNING" \
361 "\007NCQ" "\006PACKET" \
362 "\005PIO" "\004POLL" "\003NOWAIT" \
363 "\002WRITE" "\001READ"
366 #define ATA_S_SETUP 0
367 #define ATA_S_PENDING 1
368 #define ATA_S_COMPLETE 2
369 #define ATA_S_ERROR 3
370 #define ATA_S_TIMEOUT 4
371 #define ATA_S_ONCHIP 5
374 void *atascsi_private
;
375 struct ata_port
*at
; /* NULL if direct-attached */