xref: /reactos/sdk/include/ddk/ide.h (revision c0c57e23)
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     _Inout_ 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 CODE_SEG("PAGE")
250 NTSTATUS NTAPI
251 PciIdeXInitialize(
252     _In_ PDRIVER_OBJECT DriverObject,
253     _In_ PUNICODE_STRING RegistryPath,
254     _In_ PCONTROLLER_PROPERTIES HwGetControllerProperties,
255     _In_ ULONG ExtensionSize);
256 
257 NTSTATUS NTAPI
258 PciIdeXGetBusData(
259     _In_ PVOID DeviceExtension,
260     _Out_writes_bytes_all_(BufferLength) PVOID Buffer,
261     _In_ ULONG ConfigDataOffset,
262     _In_ ULONG BufferLength);
263 
264 NTSTATUS NTAPI
265 PciIdeXSetBusData(
266     _In_ PVOID DeviceExtension,
267     _In_reads_bytes_(BufferLength) PVOID Buffer,
268     _In_reads_bytes_(BufferLength) PVOID DataMask,
269     _In_ ULONG ConfigDataOffset,
270     _In_ ULONG BufferLength);
271 
272 /* Bit field values for
273  * PCIIDE_TRANSFER_MODE_SELECT.DeviceTransferModeSupported and
274  * IDE_CONTROLLER_PROPERTIES.SupportedTransferMode
275  */
276 // PIO Modes
277 #define PIO_MODE0   (1 << 0)
278 #define PIO_MODE1   (1 << 1)
279 #define PIO_MODE2   (1 << 2)
280 #define PIO_MODE3   (1 << 3)
281 #define PIO_MODE4   (1 << 4)
282 // Single-word DMA Modes
283 #define SWDMA_MODE0 (1 << 5)
284 #define SWDMA_MODE1 (1 << 6)
285 #define SWDMA_MODE2 (1 << 7)
286 // Multi-word DMA Modes
287 #define MWDMA_MODE0 (1 << 8)
288 #define MWDMA_MODE1 (1 << 9)
289 #define MWDMA_MODE2 (1 << 10)
290 // Ultra DMA Modes
291 #define UDMA_MODE0  (1 << 11)
292 #define UDMA_MODE1  (1 << 12)
293 #define UDMA_MODE2  (1 << 13)
294 #define UDMA_MODE3  (1 << 14)
295 #define UDMA_MODE4  (1 << 15)
296 #define UDMA_MODE5  (1 << 16)
297 
298 #ifdef __cplusplus
299 }
300 #endif
301 
302 #endif /* __IDE_H */
303