[1166] | 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 */
|
---|