Make UEFI boot-platform build again
[haiku.git] / headers / private / drivers / ata_types.h
blob7d5beded9049ef2eaea5f846efce363ad349b499
1 /*
2 * Copyright 2002/03, Thomas Kurschel. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5 #ifndef __ATA_TYPES_H__
6 #define __ATA_TYPES_H__
9 #include <iovec.h>
10 #include <lendian_bitfield.h>
13 // ATA task file.
14 // contains the command block interpreted under different conditions with
15 // first byte being first command register, second byte second command register
16 // etc.; for lba48, registers must be written twice, therefore there
17 // are twice as many bytes as registers - the first eight bytes are those
18 // that must be written first, the second eight bytes are those that
19 // must be written second.
20 union ata_task_file {
21 struct {
22 uint8 features;
23 uint8 sector_count;
24 uint8 sector_number;
25 uint8 cylinder_0_7;
26 uint8 cylinder_8_15;
27 B_LBITFIELD8_3(
28 head : 4,
29 device : 1,
30 mode : 3
32 uint8 command;
33 } chs;
34 struct {
35 uint8 features;
36 uint8 sector_count;
37 uint8 lba_0_7;
38 uint8 lba_8_15;
39 uint8 lba_16_23;
40 B_LBITFIELD8_3(
41 lba_24_27 : 4,
42 device : 1,
43 mode : 3
45 uint8 command;
46 } lba;
47 struct {
48 B_LBITFIELD8_3(
49 dma : 1,
50 ovl : 1,
51 _0_res2 : 6
53 B_LBITFIELD8_2(
54 _1_res0 : 3,
55 tag : 5
57 uint8 _2_res;
58 uint8 byte_count_0_7;
59 uint8 byte_count_8_15;
60 B_LBITFIELD8_6(
61 lun : 3,
62 _5_res3 : 1,
63 device : 1,
64 _5_one5 : 1,
65 _5_res6 : 1,
66 _5_one7 : 1
68 uint8 command;
69 } packet;
70 struct {
71 B_LBITFIELD8_5(
72 ili : 1,
73 eom : 1,
74 abrt : 1,
75 _0_res3 : 1,
76 sense_key : 4
78 B_LBITFIELD8_4(
79 cmd_or_data : 1, // 1 - cmd, 0 - data
80 input_or_output : 1, // 0 - input (to device), 1 - output
81 release : 1,
82 tag : 5
84 uint8 _2_res;
85 uint8 byte_count_0_7;
86 uint8 byte_count_8_15;
87 B_LBITFIELD8_5(
88 _4_res0 : 4,
89 device : 1,
90 _4_obs5 : 1,
91 _4_res6 : 1,
92 _4_obs7 : 1
94 B_LBITFIELD8_7(
95 chk : 1,
96 _7_res1 : 2,
97 drq : 1,
98 serv : 1,
99 dmrd : 1,
100 drdy : 1,
101 bsy : 1
103 } packet_res;
104 struct {
105 uint8 sector_count;
106 B_LBITFIELD8_4( // only <tag> is defined for write
107 cmd_or_data : 1, // 1 - cmd, 0 - data
108 input_or_output : 1, // 0 - input (to device), 1 - output
109 release : 1,
110 tag : 5
112 uint8 lba_0_7;
113 uint8 lba_8_15;
114 uint8 lba_16_23;
115 B_LBITFIELD8_3(
116 lba_24_27 : 4,
117 device : 1,
118 mode : 3
120 uint8 command;
121 } queued;
122 struct {
123 // low order bytes
124 uint8 features;
125 uint8 sector_count_0_7;
126 uint8 lba_0_7;
127 uint8 lba_8_15;
128 uint8 lba_16_23;
129 B_LBITFIELD8_3(
130 _5low_res0 : 4,
131 device : 1,
132 mode : 3
134 uint8 command;
136 // high order bytes
137 uint8 _0high_res;
138 uint8 sector_count_8_15;
139 uint8 lba_24_31;
140 uint8 lba_32_39;
141 uint8 lba_40_47;
142 } lba48;
143 struct {
144 // low order bytes
145 uint8 sector_count_0_7;
146 B_LBITFIELD8_4(
147 cmd_or_data : 1, // 1 - cmd, 0 - data
148 input_or_output : 1, // 0 - input (to device), 1 - output
149 release : 1,
150 tag : 5
152 uint8 lba_0_7;
153 uint8 lba_8_15;
154 uint8 lba_16_23;
155 B_LBITFIELD8_3(
156 _5low_res0 : 4,
157 device : 1,
158 mode : 3
160 uint8 command;
162 // high order bytes
163 uint8 sector_count_8_15;
164 uint8 _1high_res;
165 uint8 lba_24_31;
166 uint8 lba_32_39;
167 uint8 lba_40_47;
168 } queued48;
169 struct {
170 uint8 r[7+5];
171 } raw;
172 struct {
173 uint8 features;
174 uint8 sector_count;
175 uint8 sector_number;
176 uint8 cylinder_low;
177 uint8 cylinder_high;
178 uint8 device_head;
179 uint8 command;
180 } write;
181 struct {
182 uint8 error;
183 uint8 sector_count;
184 uint8 sector_number;
185 uint8 cylinder_low;
186 uint8 cylinder_high;
187 uint8 device_head;
188 uint8 status;
189 } read;
192 typedef union ata_task_file ata_task_file;
194 // content of "mode" field
195 enum {
196 ATA_MODE_CHS = 5,
197 ATA_MODE_LBA = 7
200 // mask for ata_task_file fields to be written
201 enum {
202 ATA_MASK_FEATURES = 0x01,
203 ATA_MASK_SECTOR_COUNT = 0x02,
205 // CHS
206 ATA_MASK_SECTOR_NUMBER = 0x04,
207 ATA_MASK_CYLINDER_LOW = 0x08,
208 ATA_MASK_CYLINDER_HIGH = 0x10,
210 // LBA
211 ATA_MASK_LBA_LOW = 0x04,
212 ATA_MASK_LBA_MID = 0x08,
213 ATA_MASK_LBA_HIGH = 0x10,
215 // packet
216 ATA_MASK_BYTE_COUNT = 0x18,
218 // packet and dma queued result
219 ATA_MASK_ERROR = 0x01,
220 ATA_MASK_INTERRUPT_REASON = 0x02,
222 ATA_MASK_DEVICE_HEAD = 0x20,
223 ATA_MASK_COMMAND = 0x40,
225 ATA_MASK_STATUS = 0x40,
227 // for 48 bits, the following flags tell which registers to load twice
228 ATA_MASK_FEATURES_48 = 0x80 | ATA_MASK_FEATURES,
229 ATA_MASK_SECTOR_COUNT_48 = 0x100 | ATA_MASK_SECTOR_COUNT,
230 ATA_MASK_LBA_LOW_48 = 0x200 | ATA_MASK_LBA_LOW,
231 ATA_MASK_LBA_MID_48 = 0x400 | ATA_MASK_LBA_MID,
232 ATA_MASK_LBA_HIGH_48 = 0x800 | ATA_MASK_LBA_HIGH,
234 ATA_MASK_HOB = 0xf80
237 // status register
238 enum {
239 ATA_STATUS_ERROR = 0x01, // error
240 ATA_STATUS_INDEX = 0x02, // obsolete
241 ATA_STATUS_CORR = 0x04, // obsolete
242 ATA_STATUS_DATA_REQUEST = 0x08, // data request
243 ATA_STATUS_DSC = 0x10, // reserved
244 ATA_STATUS_SERVICE = 0x10, // ready to service device
245 ATA_STATUS_DWF = 0x20, // reserved
246 ATA_STATUS_DMA = 0x20, // reserved
247 ATA_STATUS_DMA_READY = 0x20, // packet: DMA ready
248 ATA_STATUS_DEVICE_FAULT = 0x20, // device fault
249 ATA_STATUS_DEVICE_READY = 0x40, // device ready
250 ATA_STATUS_BUSY = 0x80 // busy
253 // device control register (ATA command block)
254 enum {
255 // bit 0 must be zero
256 ATA_DEVICE_CONTROL_DISABLE_INTS = 0x02, // disable INTRQ
257 ATA_DEVICE_CONTROL_SOFT_RESET = 0x04, // software device reset
258 ATA_DEVICE_CONTROL_BIT3 = 0x08, // obsolete. Must always be set
259 // bits inbetween are reserved
260 ATA_DEVICE_CONTROL_HIGH_ORDER_BYTE = 0x80 // read high order byte
261 // (for 48-bit lba)
264 // error register - most bits are command specific
265 enum {
266 // always used
267 ATA_ERROR_ABORTED = 0x04, // command aborted
269 // used for Ultra DMA modes
270 ATA_ERROR_INTERFACE_CRC = 0x80, // interface CRC error
272 // used by reading data transfers
273 ATA_ERROR_UNCORRECTABLE = 0x40, // uncorrectable data error
274 // used by writing data transfers
275 ATA_ERROR_WRITE_PROTECTED = 0x40, // media write protect
277 // used by all data transfer commands
278 ATA_ERROR_MEDIUM_CHANGED = 0x20, // medium changed
279 ATA_ERROR_INVALID_ADDRESS = 0x10, // invalid CHS address
280 ATA_ERROR_MEDIA_CHANGE_REQUESTED = 0x08, // media change requested
281 ATA_ERROR_NO_MEDIA = 0x02, // no media
283 ATA_ERROR_ALL = 0xfe
286 typedef struct ata_channel_info *ata_channel_cookie;
288 #endif /* __ATA_TYPES_H__ */