[XDK/DDK]
[reactos.git] / reactos / include / ddk / ide.h
1 /*
2 * ide.h
3 *
4 * IDE driver interface
5 *
6 * This file is part of the w32api package.
7 *
8 * Contributors:
9 * Created by Hervé Poussineau <hpoussin@reactos.org>
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 */
22
23 #ifndef __IDE_H
24 #define __IDE_H
25
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29
30 #define MAX_IDE_CHANNEL 2
31 #define MAX_IDE_LINE 2
32 #define MAX_IDE_DEVICE 2
33
34 #include <pshpack1.h>
35 typedef struct _IDENTIFY_DATA {
36 USHORT GeneralConfiguration; /* 00 */
37 USHORT NumCylinders; /* 02 */
38 USHORT Reserved1; /* 04 */
39 USHORT NumHeads; /* 06 */
40 USHORT UnformattedBytesPerTrack; /* 08 */
41 USHORT UnformattedBytesPerSector; /* 10 */
42 USHORT NumSectorsPerTrack; /* 12 */
43 USHORT VendorUnique1[3]; /* 14 */
44 UCHAR SerialNumber[20]; /* 20 */
45 USHORT BufferType; /* 40 */
46 USHORT BufferSectorSize; /* 42 */
47 USHORT NumberOfEccBytes; /* 44 */
48 UCHAR FirmwareRevision[8]; /* 46 */
49 UCHAR ModelNumber[40]; /* 54 */
50 UCHAR MaximumBlockTransfer; /* 94 */
51 UCHAR VendorUnique2; /* 95 */
52 USHORT DoubleWordIo; /* 96 */
53 USHORT Capabilities; /* 98 */
54 USHORT Reserved2; /* 100 */
55 UCHAR VendorUnique3; /* 102 */
56 UCHAR PioCycleTimingMode; /* 103 */
57 UCHAR VendorUnique4; /* 104 */
58 UCHAR DmaCycleTimingMode; /* 105 */
59 USHORT TranslationFieldsValid:3; /* 106 */
60 USHORT Reserved3:13; /* - */
61 USHORT NumberOfCurrentCylinders; /* 108 */
62 USHORT NumberOfCurrentHeads; /* 110 */
63 USHORT CurrentSectorsPerTrack; /* 112 */
64 ULONG CurrentSectorCapacity; /* 114 */
65 USHORT CurrentMultiSectorSetting; /* 118 */
66 ULONG UserAddressableSectors; /* 120 */
67 USHORT SingleWordDMASupport:8; /* 124 */
68 USHORT SingleWordDMAActive:8; /* - */
69 USHORT MultiWordDMASupport:8; /* 126 */
70 USHORT MultiWordDMAActive:8; /* - */
71 USHORT AdvancedPIOModes:8; /* 128 */
72 USHORT Reserved4:8; /* - */
73 USHORT MinimumMWXferCycleTime; /* 130 */
74 USHORT RecommendedMWXferCycleTime; /* 132 */
75 USHORT MinimumPIOCycleTime; /* 134 */
76 USHORT MinimumPIOCycleTimeIORDY; /* 136 */
77 USHORT Reserved5[11]; /* 138 */
78 USHORT MajorRevision; /* 160 */
79 USHORT MinorRevision; /* 162 */
80 USHORT Reserved6; /* 164 */
81 USHORT CommandSetSupport; /* 166 */
82 USHORT Reserved6a[2]; /* 168 */
83 USHORT CommandSetActive; /* 172 */
84 USHORT Reserved6b; /* 174 */
85 USHORT UltraDMASupport:8; /* 176 */
86 USHORT UltraDMAActive:8; /* - */
87 USHORT Reserved7[11]; /* 178 */
88 ULONG Max48BitLBA[2]; /* 200 */
89 USHORT Reserved7a[22]; /* 208 */
90 USHORT LastLun:3; /* 252 */
91 USHORT Reserved8:13; /* - */
92 USHORT MediaStatusNotification:2; /* 254 */
93 USHORT Reserved9:6; /* - */
94 USHORT DeviceWriteProtect:1; /* - */
95 USHORT Reserved10:7; /* - */
96 USHORT Reserved11[128]; /* 256 */
97 } IDENTIFY_DATA, *PIDENTIFY_DATA;
98
99 typedef struct _EXTENDED_IDENTIFY_DATA {
100 USHORT GeneralConfiguration; /* 00 */
101 USHORT NumCylinders; /* 02 */
102 USHORT Reserved1; /* 04 */
103 USHORT NumHeads; /* 06 */
104 USHORT UnformattedBytesPerTrack; /* 08 */
105 USHORT UnformattedBytesPerSector; /* 10 */
106 USHORT NumSectorsPerTrack; /* 12 */
107 __GNU_EXTENSION union
108 {
109 USHORT VendorUnique1[3]; /* 14 */
110 struct
111 {
112 UCHAR InterSectorGap; /* 14 */
113 UCHAR InterSectorGapSize; /* - */
114 UCHAR Reserved16; /* 16 */
115 UCHAR BytesInPLO; /* - */
116 USHORT VendorUniqueCnt; /* 18 */
117 } u;
118 };
119 UCHAR SerialNumber[20]; /* 20 */
120 USHORT BufferType; /* 40 */
121 USHORT BufferSectorSize; /* 42 */
122 USHORT NumberOfEccBytes; /* 44 */
123 UCHAR FirmwareRevision[8]; /* 46 */
124 UCHAR ModelNumber[40]; /* 54 */
125 UCHAR MaximumBlockTransfer; /* 94 */
126 UCHAR VendorUnique2; /* 95 */
127 USHORT DoubleWordIo; /* 96 */
128 USHORT Capabilities; /* 98 */
129 USHORT Reserved2; /* 100 */
130 UCHAR VendorUnique3; /* 102 */
131 UCHAR PioCycleTimingMode; /* 103 */
132 UCHAR VendorUnique4; /* 104 */
133 UCHAR DmaCycleTimingMode; /* 105 */
134 USHORT TranslationFieldsValid:3; /* 106 */
135 USHORT Reserved3:13; /* - */
136 USHORT NumberOfCurrentCylinders; /* 108 */
137 USHORT NumberOfCurrentHeads; /* 110 */
138 USHORT CurrentSectorsPerTrack; /* 112 */
139 ULONG CurrentSectorCapacity; /* 114 */
140 USHORT CurrentMultiSectorSetting; /* 118 */
141 ULONG UserAddressableSectors; /* 120 */
142 USHORT SingleWordDMASupport:8; /* 124 */
143 USHORT SingleWordDMAActive:8; /* - */
144 USHORT MultiWordDMASupport:8; /* 126 */
145 USHORT MultiWordDMAActive:8; /* - */
146 USHORT AdvancedPIOModes:8; /* 128 */
147 USHORT Reserved4:8; /* - */
148 USHORT MinimumMWXferCycleTime; /* 130 */
149 USHORT RecommendedMWXferCycleTime; /* 132 */
150 USHORT MinimumPIOCycleTime; /* 134 */
151 USHORT MinimumPIOCycleTimeIORDY; /* 136 */
152 USHORT Reserved5[11]; /* 138 */
153 USHORT MajorRevision; /* 160 */
154 USHORT MinorRevision; /* 162 */
155 USHORT Reserved6; /* 164 */
156 USHORT CommandSetSupport; /* 166 */
157 USHORT Reserved6a[2]; /* 168 */
158 USHORT CommandSetActive; /* 172 */
159 USHORT Reserved6b; /* 174 */
160 USHORT UltraDMASupport:8; /* 176 */
161 USHORT UltraDMAActive:8; /* - */
162 USHORT Reserved7[11]; /* 178 */
163 ULONG Max48BitLBA[2]; /* 200 */
164 USHORT Reserved7a[22]; /* 208 */
165 USHORT LastLun:3; /* 252 */
166 USHORT Reserved8:13; /* - */
167 USHORT MediaStatusNotification:2; /* 254 */
168 USHORT Reserved9:6; /* - */
169 USHORT DeviceWriteProtect:1; /* - */
170 USHORT Reserved10:7; /* - */
171 USHORT Reserved11[128]; /* 256 */
172 } EXTENDED_IDENTIFY_DATA, *PEXTENDED_IDENTIFY_DATA;
173 #include <poppack.h>
174
175 typedef struct _PCIIDE_TRANSFER_MODE_SELECT
176 {
177 ULONG Channel;
178 BOOLEAN DevicePresent[MAX_IDE_DEVICE * MAX_IDE_LINE];
179 BOOLEAN FixedDisk[MAX_IDE_DEVICE * MAX_IDE_LINE];
180 BOOLEAN IoReadySupported[MAX_IDE_DEVICE * MAX_IDE_LINE];
181 ULONG DeviceTransferModeSupported[MAX_IDE_DEVICE * MAX_IDE_LINE];
182 ULONG BestPioCycleTime[MAX_IDE_DEVICE * MAX_IDE_LINE];
183 ULONG BestSwDmaCycleTime[MAX_IDE_DEVICE * MAX_IDE_LINE];
184 ULONG BestMwDmaCycleTime[MAX_IDE_DEVICE * MAX_IDE_LINE];
185 ULONG BestUDmaCycleTime[MAX_IDE_DEVICE * MAX_IDE_LINE];
186 ULONG DeviceTransferModeCurrent[MAX_IDE_DEVICE * MAX_IDE_LINE];
187 ULONG UserChoiceTransferMode[MAX_IDE_DEVICE * MAX_IDE_LINE];
188 ULONG EnableUDMA66;
189 IDENTIFY_DATA IdentifyData[MAX_IDE_DEVICE];
190 ULONG DeviceTransferModeSelected[MAX_IDE_DEVICE * MAX_IDE_LINE];
191 PULONG TransferModeTimingTable;
192 ULONG TransferModeTableLength;
193 } PCIIDE_TRANSFER_MODE_SELECT, *PPCIIDE_TRANSFER_MODE_SELECT;
194
195 typedef enum
196 {
197 ChannelDisabled = 0,
198 ChannelEnabled,
199 ChannelStateUnknown
200 } IDE_CHANNEL_STATE;
201
202 typedef IDE_CHANNEL_STATE
203 (NTAPI *PCIIDE_CHANNEL_ENABLED)(
204 IN PVOID DeviceExtension,
205 IN ULONG Channel);
206
207 typedef BOOLEAN
208 (NTAPI *PCIIDE_SYNC_ACCESS_REQUIRED)(
209 IN PVOID DeviceExtension);
210
211 typedef NTSTATUS
212 (NTAPI *PCIIDE_TRANSFER_MODE_SELECT_FUNC)(
213 IN PVOID DeviceExtension,
214 IN OUT PPCIIDE_TRANSFER_MODE_SELECT XferMode);
215
216 typedef ULONG
217 (NTAPI *PCIIDE_USEDMA_FUNC)(
218 IN PVOID DeviceExtension,
219 IN PUCHAR CdbCommand,
220 IN PUCHAR Slave);
221
222 typedef NTSTATUS
223 (NTAPI *PCIIDE_UDMA_MODES_SUPPORTED)(
224 IN IDENTIFY_DATA IdentifyData,
225 OUT PULONG BestXferMode,
226 OUT PULONG CurrentXferMode);
227
228 typedef struct _IDE_CONTROLLER_PROPERTIES
229 {
230 ULONG Size;
231 ULONG ExtensionSize;
232 ULONG SupportedTransferMode[MAX_IDE_CHANNEL][MAX_IDE_DEVICE];
233 PCIIDE_CHANNEL_ENABLED PciIdeChannelEnabled;
234 PCIIDE_SYNC_ACCESS_REQUIRED PciIdeSyncAccessRequired;
235 PCIIDE_TRANSFER_MODE_SELECT_FUNC PciIdeTransferModeSelect;
236 BOOLEAN IgnoreActiveBitForAtaDevice;
237 BOOLEAN AlwaysClearBusMasterInterrupt;
238 PCIIDE_USEDMA_FUNC PciIdeUseDma;
239 ULONG AlignmentRequirement;
240 ULONG DefaultPIO;
241 PCIIDE_UDMA_MODES_SUPPORTED PciIdeUdmaModesSupported;
242 } IDE_CONTROLLER_PROPERTIES, *PIDE_CONTROLLER_PROPERTIES;
243
244 typedef NTSTATUS
245 (NTAPI *PCONTROLLER_PROPERTIES)(
246 IN PVOID DeviceExtension,
247 IN PIDE_CONTROLLER_PROPERTIES ControllerProperties);
248
249 NTSTATUS NTAPI
250 PciIdeXInitialize(
251 IN PDRIVER_OBJECT DriverObject,
252 IN PUNICODE_STRING RegistryPath,
253 IN PCONTROLLER_PROPERTIES HwGetControllerProperties,
254 IN ULONG ExtensionSize);
255
256 NTSTATUS NTAPI
257 PciIdeXGetBusData(
258 IN PVOID DeviceExtension,
259 IN PVOID Buffer,
260 IN ULONG ConfigDataOffset,
261 IN ULONG BufferLength);
262
263 NTSTATUS NTAPI
264 PciIdeXSetBusData(
265 IN PVOID DeviceExtension,
266 IN PVOID Buffer,
267 IN PVOID DataMask,
268 IN ULONG ConfigDataOffset,
269 IN ULONG BufferLength);
270
271 /* Bit field values for
272 * PCIIDE_TRANSFER_MODE_SELECT.DeviceTransferModeSupported and
273 * IDE_CONTROLLER_PROPERTIES.SupportedTransferMode
274 */
275 // PIO Modes
276 #define PIO_MODE0 (1 << 0)
277 #define PIO_MODE1 (1 << 1)
278 #define PIO_MODE2 (1 << 2)
279 #define PIO_MODE3 (1 << 3)
280 #define PIO_MODE4 (1 << 4)
281 // Single-word DMA Modes
282 #define SWDMA_MODE0 (1 << 5)
283 #define SWDMA_MODE1 (1 << 6)
284 #define SWDMA_MODE2 (1 << 7)
285 // Multi-word DMA Modes
286 #define MWDMA_MODE0 (1 << 8)
287 #define MWDMA_MODE1 (1 << 9)
288 #define MWDMA_MODE2 (1 << 10)
289 // Ultra DMA Modes
290 #define UDMA_MODE0 (1 << 11)
291 #define UDMA_MODE1 (1 << 12)
292 #define UDMA_MODE2 (1 << 13)
293 #define UDMA_MODE3 (1 << 14)
294 #define UDMA_MODE4 (1 << 15)
295 #define UDMA_MODE5 (1 << 16)
296
297 #ifdef __cplusplus
298 }
299 #endif
300
301 #endif /* __IDE_H */