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