10#define PCI_VEN_ATI 0x1002
11#define PCI_VEN_AMD 0x1022
12#define PCI_VEN_NVIDIA 0x10DE
13#define PCI_VEN_PC_TECH 0x1042
14#define PCI_VEN_CMD 0x1095
15#define PCI_VEN_VIA 0x1106
16#define PCI_VEN_SERVERWORKS 0x1166
17#define PCI_VEN_TOSHIBA 0x1179
18#define PCI_VEN_CAVIUM 0x177D
19#define PCI_VEN_INTEL 0x8086
22#define CHANNEL_PCAT_MAX_DEVICES 2
25#define CHANNEL_PC98_MAX_DEVICES 4
28#define PC98_ATA_BANK 0x432
29#define PC98_ATA_BANK_32BIT_PORT 0x08
32#define ATA_IO_WAIT() KeStallExecutionProcessor(1)
34#define NUM_TO_BITMAP(num) (0xFFFFFFFF >> (RTL_BITS_OF(ULONG) - (num)))
38 (PIO_ALL | MWDMA_ALL | UDMA_ALL)
42 (UDMA_MODE3 | UDMA_MODE4 | UDMA_MODE5 | UDMA_MODE6)
45#define MWDMA_MODES(MinMode, MaxMode) \
46 (NUM_TO_BITMAP(MWDMA_MODE((MaxMode) + 1)) & ~NUM_TO_BITMAP(MWDMA_MODE(MinMode)))
49#define UDMA_MODES(MinMode, MaxMode) \
50 (NUM_TO_BITMAP(UDMA_MODE((MaxMode) + 1)) & ~NUM_TO_BITMAP(UDMA_MODE(MinMode)))
52#define IDE_DC_ALWAYS 0x08
53#define IDE_DRIVE_SELECT 0xA0
55#define IDE_HIGH_ORDER_BYTE 0x80
57#define IDE_FEATURE_PIO 0x00
58#define IDE_FEATURE_DMA 0x01
59#define IDE_FEATURE_DMADIR 0x04
65#define ATAPI_MAX_DRQ_DATA_BLOCK 0xFFFE
71#define PCIIDE_LEGACY_RESOURCE_COUNT 3
72#define PCIIDE_LEGACY_COMMAND_IO_RANGE_LENGTH 8
73#define PCIIDE_LEGACY_CONTROL_IO_RANGE_LENGTH 1
74#define PCIIDE_LEGACY_PRIMARY_COMMAND_BASE 0x1F0
75#define PCIIDE_LEGACY_PRIMARY_CONTROL_BASE 0x3F6
76#define PCIIDE_LEGACY_PRIMARY_IRQ 14
77#define PCIIDE_LEGACY_SECONDARY_COMMAND_BASE 0x170
78#define PCIIDE_LEGACY_SECONDARY_CONTROL_BASE 0x376
79#define PCIIDE_LEGACY_SECONDARY_IRQ 15
82#define PCIIDE_COMMAND_IO_RANGE_LENGTH 8
83#define PCIIDE_CONTROL_IO_RANGE_LENGTH 4
84#define PCIIDE_CONTROL_IO_BAR_OFFSET 2
85#define PCIIDE_DMA_IO_BAR 4
86#define PCIIDE_DMA_IO_RANGE_LENGTH 16
89#define PCIIDE_DMA_SECONDARY_CHANNEL_OFFSET 8
95#define PCIIDE_PROGIF_PRIMARY_CHANNEL_NATIVE_MODE 0x01
96#define PCIIDE_PROGIF_PRIMARY_CHANNEL_NATIVE_MODE_CAPABLE 0x02
97#define PCIIDE_PROGIF_SECONDARY_CHANNEL_NATIVE_MODE 0x04
98#define PCIIDE_PROGIF_SECONDARY_CHANNEL_NATIVE_MODE_CAPABLE 0x08
99#define PCIIDE_PROGIF_DMA_CAPABLE 0x80
106#define PCIIDE_DMA_COMMAND 0
107#define PCIIDE_DMA_STATUS 2
108#define PCIIDE_DMA_PRDT_PHYSICAL_ADDRESS 4
115#define PCIIDE_DMA_COMMAND_STOP 0x00
116#define PCIIDE_DMA_COMMAND_START 0x01
117#define PCIIDE_DMA_COMMAND_READ_FROM_SYSTEM_MEMORY 0x00
118#define PCIIDE_DMA_COMMAND_WRITE_TO_SYSTEM_MEMORY 0x08
125#define PCIIDE_DMA_STATUS_ACTIVE 0x01
126#define PCIIDE_DMA_STATUS_ERROR 0x02
127#define PCIIDE_DMA_STATUS_INTERRUPT 0x04
128#define PCIIDE_DMA_STATUS_RESERVED1 0x08
129#define PCIIDE_DMA_STATUS_RESERVED2 0x10
130#define PCIIDE_DMA_STATUS_DRIVE0_DMA_CAPABLE 0x20
131#define PCIIDE_DMA_STATUS_DRIVE1_DMA_CAPABLE 0x40
132#define PCIIDE_DMA_STATUS_SIMPLEX 0x80
140#define ATAPI_INT_REASON_COD 0x01
143#define ATAPI_INT_REASON_IO 0x02
146#define ATAPI_INT_REASON_RELEASE 0x04
149#define ATAPI_INT_REASON_TAG 0xF8
151#define ATAPI_INT_REASON_MASK (ATAPI_INT_REASON_IO | ATAPI_INT_REASON_COD)
154#define ATAPI_INT_REASON_STATUS_NEC 0x00
157#define ATAPI_INT_REASON_STATUS (ATAPI_INT_REASON_IO | ATAPI_INT_REASON_COD)
160#define ATAPI_INT_REASON_DATA_OUT IDE_STATUS_DRQ
163#define ATAPI_INT_REASON_AWAIT_CDB (IDE_STATUS_DRQ | ATAPI_INT_REASON_COD)
166#define ATAPI_INT_REASON_DATA_IN (ATAPI_INT_REASON_IO | IDE_STATUS_DRQ)
169#define ATA_TIME_BUSY_SELECT 3000
170#define ATA_TIME_BUSY_NORMAL 50000
171#define ATA_TIME_BUSY_POLL 5
172#define ATA_TIME_DRQ_CLEAR 1000
173#define ATA_TIME_PHASE_CHANGE 100
176#define ATA_TIME_DRQ_ASSERT 15
178#define ATA_TIME_RESET_SELECT (2000 / PORT_TIMER_TICK_MS)
179#define ATA_TIME_BUSY_RESET (10000 / PORT_TIMER_TICK_MS)
181#define CMD_FLAG_NONE 0x00000000
182#define CMD_FLAG_TRANSFER_MASK 0x00000003
183#define CMD_FLAG_AWAIT_CDB 0x00000004
184#define CMD_FLAG_DATA_IN 0x00000040
185#define CMD_FLAG_DATA_OUT 0x00000080
186#define CMD_FLAG_AWAIT_INTERRUPT 0x80000000
188#define CMD_FLAG_ATAPI_PIO_TRANSFER 0x00000001
189#define CMD_FLAG_ATA_PIO_TRANSFER 0x00000002
190#define CMD_FLAG_DMA_TRANSFER 0x00000003
193#define PATA_CHANNEL_SLOT 0
194#define PATA_CHANNEL_QUEUE_DEPTH 1
209#define PCIIDE_PRD_LENGTH_MASK 0xFFFF
210#define PCIIDE_PRD_END_OF_TABLE 0x80000000
215#define PCIIDE_PRD_LIMIT 0x10000
230#define SHARED_CMD_TIMINGS 0x00000001
231#define SHARED_DATA_TIMINGS 0x00000002
232#define SHARED_ADDR_TIMINGS 0x00000004
248#define ATA_READ_BLOCK_16(Port, Buffer, Count, Ctx, MmioFlag) \
249 AtaReadBlock16(Port, Buffer, Count, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
251#define ATA_WRITE_BLOCK_16(Port, Buffer, Count, Ctx, MmioFlag) \
252 AtaWriteBlock16(Port, Buffer, Count, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
254#define ATA_READ_BLOCK_32(Port, Buffer, Count, Ctx, MmioFlag) \
255 AtaReadBlock32(Port, Buffer, Count, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
257#define ATA_WRITE_BLOCK_32(Port, Buffer, Count, Ctx, MmioFlag) \
258 AtaWriteBlock32(Port, Buffer, Count, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
260#define ATA_READ(Port, Ctx, MmioFlag) \
261 AtaReadPortUchar(Port, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
263#define ATA_WRITE(Port, Value, Ctx, MmioFlag) \
264 AtaWritePortUchar(Port, Value, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
266#define ATA_WRITE_ULONG(Port, Value, Ctx, MmioFlag) \
267 AtaWritePortUlong(Port, Value, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
295 ATA_WRITE(ChanData->Regs.Device, DeviceSelect, ChanData, MRES_TF);
312 IdeStatus = ChanData->ReadStatus(ChanData);
316 if (IdeStatus == 0xFF)
#define REQUEST_FLAG_DATA_IN
#define REQUEST_FLAG_DATA_OUT
#define REQUEST_FLAG_POLL
_In_ PCHAR _In_ ULONG DeviceNumber
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define KeStallExecutionProcessor(MicroSeconds)
struct _ATA_TIMING ATA_TIMING
#define ATA_WRITE(Port, Value, Ctx, MmioFlag)
#define CMD_FLAG_ATAPI_PIO_TRANSFER
#define CMD_FLAG_ATA_PIO_TRANSFER
FORCEINLINE ATATIM CLAMP_TIMING(_In_ ATATIM Value, _In_ ATATIM Minimum, _In_ ATATIM Maximum)
#define CMD_FLAG_DMA_TRANSFER
#define PC98_ATA_BANK_32BIT_PORT
struct _PCIIDE_PRD_TABLE_ENTRY * PPCIIDE_PRD_TABLE_ENTRY
FORCEINLINE VOID ATA_SELECT_DEVICE(_In_ PCHANNEL_DATA_PATA ChanData, _In_ UCHAR DeviceNumber, _In_ UCHAR DeviceSelect)
FORCEINLINE UCHAR ATA_WAIT(_In_ PCHANNEL_DATA_PATA ChanData, _In_range_(>, 0) ULONG Timeout, _In_ UCHAR Mask, _In_ UCHAR Value)
struct _ATA_TIMING * PATA_TIMING
struct _PCIIDE_PRD_TABLE_ENTRY PCIIDE_PRD_TABLE_ENTRY
#define CMD_FLAG_DATA_OUT
#define CMD_FLAG_AWAIT_INTERRUPT
#define WRITE_PORT_UCHAR(p, d)
#define CHANNEL_FLAG_IO32
#define CHANNEL_FLAG_CBUS
ULONG Length
0 means 0x10000 bytes
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value