ReactOS 0.4.17-dev-1190-g4c812f4
pata.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS ATA Bus Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: PATA definitions
5 * COPYRIGHT: Copyright 2026 <di.sean@protonmail.com>
6 */
7
8#pragma once
9
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_HIGHPOINT 0x1103
16#define PCI_VEN_VIA 0x1106
17#define PCI_VEN_SERVERWORKS 0x1166
18#define PCI_VEN_TOSHIBA 0x1179
19#define PCI_VEN_CAVIUM 0x177D
20#define PCI_VEN_INTEL 0x8086
21
23#define CHANNEL_PCAT_MAX_DEVICES 2
24
26#define CHANNEL_PC98_MAX_DEVICES 4
27
29#define PC98_ATA_BANK 0x432
30#define PC98_ATA_BANK_32BIT_PORT 0x08
31
33#define ATA_IO_WAIT() KeStallExecutionProcessor(1)
34
35#define NUM_TO_BITMAP(num) (0xFFFFFFFF >> (RTL_BITS_OF(ULONG) - (num)))
36
38#define SATA_ALL \
39 (PIO_ALL | MWDMA_ALL | UDMA_ALL)
40
42#define UDMA_80C_ALL \
43 (UDMA_MODE3 | UDMA_MODE4 | UDMA_MODE5 | UDMA_MODE6)
44
46#define MWDMA_MODES(MinMode, MaxMode) \
47 (NUM_TO_BITMAP(MWDMA_MODE((MaxMode) + 1)) & ~NUM_TO_BITMAP(MWDMA_MODE(MinMode)))
48
50#define UDMA_MODES(MinMode, MaxMode) \
51 (NUM_TO_BITMAP(UDMA_MODE((MaxMode) + 1)) & ~NUM_TO_BITMAP(UDMA_MODE(MinMode)))
52
53#define IDE_DC_ALWAYS 0x08
54#define IDE_DRIVE_SELECT 0xA0
55
56#define IDE_HIGH_ORDER_BYTE 0x80
57
58#define IDE_FEATURE_PIO 0x00
59#define IDE_FEATURE_DMA 0x01
60#define IDE_FEATURE_DMADIR 0x04
61
66#define ATAPI_MAX_DRQ_DATA_BLOCK 0xFFFE
67
72#define PCIIDE_LEGACY_RESOURCE_COUNT 3
73#define PCIIDE_LEGACY_COMMAND_IO_RANGE_LENGTH 8
74#define PCIIDE_LEGACY_CONTROL_IO_RANGE_LENGTH 1
75#define PCIIDE_LEGACY_PRIMARY_COMMAND_BASE 0x1F0
76#define PCIIDE_LEGACY_PRIMARY_CONTROL_BASE 0x3F6
77#define PCIIDE_LEGACY_PRIMARY_IRQ 14
78#define PCIIDE_LEGACY_SECONDARY_COMMAND_BASE 0x170
79#define PCIIDE_LEGACY_SECONDARY_CONTROL_BASE 0x376
80#define PCIIDE_LEGACY_SECONDARY_IRQ 15
83#define PCIIDE_COMMAND_IO_RANGE_LENGTH 8
84#define PCIIDE_CONTROL_IO_RANGE_LENGTH 4
85#define PCIIDE_CONTROL_IO_BAR_OFFSET 2
86#define PCIIDE_DMA_IO_BAR 4
87#define PCIIDE_DMA_IO_RANGE_LENGTH 16
88
90#define PCIIDE_DMA_SECONDARY_CHANNEL_OFFSET 8
91
96#define PCIIDE_PROGIF_PRIMARY_CHANNEL_NATIVE_MODE 0x01
97#define PCIIDE_PROGIF_PRIMARY_CHANNEL_NATIVE_MODE_CAPABLE 0x02
98#define PCIIDE_PROGIF_SECONDARY_CHANNEL_NATIVE_MODE 0x04
99#define PCIIDE_PROGIF_SECONDARY_CHANNEL_NATIVE_MODE_CAPABLE 0x08
100#define PCIIDE_PROGIF_DMA_CAPABLE 0x80
107#define PCIIDE_DMA_COMMAND 0
108#define PCIIDE_DMA_STATUS 2
109#define PCIIDE_DMA_PRDT_PHYSICAL_ADDRESS 4
116#define PCIIDE_DMA_COMMAND_STOP 0x00
117#define PCIIDE_DMA_COMMAND_START 0x01
118#define PCIIDE_DMA_COMMAND_READ_FROM_SYSTEM_MEMORY 0x00
119#define PCIIDE_DMA_COMMAND_WRITE_TO_SYSTEM_MEMORY 0x08
126#define PCIIDE_DMA_STATUS_ACTIVE 0x01
127#define PCIIDE_DMA_STATUS_ERROR 0x02
128#define PCIIDE_DMA_STATUS_INTERRUPT 0x04
129#define PCIIDE_DMA_STATUS_RESERVED1 0x08
130#define PCIIDE_DMA_STATUS_RESERVED2 0x10
131#define PCIIDE_DMA_STATUS_DRIVE0_DMA_CAPABLE 0x20
132#define PCIIDE_DMA_STATUS_DRIVE1_DMA_CAPABLE 0x40
133#define PCIIDE_DMA_STATUS_SIMPLEX 0x80
141#define ATAPI_INT_REASON_COD 0x01
142
144#define ATAPI_INT_REASON_IO 0x02
145
147#define ATAPI_INT_REASON_RELEASE 0x04
148
150#define ATAPI_INT_REASON_TAG 0xF8
151
152#define ATAPI_INT_REASON_MASK (ATAPI_INT_REASON_IO | ATAPI_INT_REASON_COD)
153
155#define ATAPI_INT_REASON_STATUS_NEC 0x00
156
158#define ATAPI_INT_REASON_STATUS (ATAPI_INT_REASON_IO | ATAPI_INT_REASON_COD)
159
161#define ATAPI_INT_REASON_DATA_OUT IDE_STATUS_DRQ
162
164#define ATAPI_INT_REASON_AWAIT_CDB (IDE_STATUS_DRQ | ATAPI_INT_REASON_COD)
165
167#define ATAPI_INT_REASON_DATA_IN (ATAPI_INT_REASON_IO | IDE_STATUS_DRQ)
170#define ATA_TIME_BUSY_SELECT 3000
171#define ATA_TIME_BUSY_NORMAL 50000
172#define ATA_TIME_BUSY_POLL 5
173#define ATA_TIME_DRQ_CLEAR 1000
174#define ATA_TIME_PHASE_CHANGE 100
175
176/* We keep the value as small as possible, since large timeout can break our error handling */
177#define ATA_TIME_DRQ_ASSERT 15
178
179#define ATA_TIME_RESET_SELECT (2000 / PORT_TIMER_TICK_MS)
180#define ATA_TIME_BUSY_RESET (10000 / PORT_TIMER_TICK_MS)
181
182#define CMD_FLAG_NONE 0x00000000
183#define CMD_FLAG_TRANSFER_MASK 0x00000003
184#define CMD_FLAG_AWAIT_CDB 0x00000004
185#define CMD_FLAG_DATA_IN 0x00000040
186#define CMD_FLAG_DATA_OUT 0x00000080
187#define CMD_FLAG_AWAIT_INTERRUPT 0x80000000
188
189#define CMD_FLAG_ATAPI_PIO_TRANSFER 0x00000001
190#define CMD_FLAG_ATA_PIO_TRANSFER 0x00000002
191#define CMD_FLAG_DMA_TRANSFER 0x00000003
192
194#define PATA_CHANNEL_SLOT 0
195#define PATA_CHANNEL_QUEUE_DEPTH 1
196
201
202#include <pshpack1.h>
207{
210#define PCIIDE_PRD_LENGTH_MASK 0xFFFF
211#define PCIIDE_PRD_END_OF_TABLE 0x80000000
213#include <poppack.h>
214
216#define PCIIDE_PRD_LIMIT 0x10000
217
219
220typedef struct _ATA_TIMING
221{
223 /* Register transfers (8-bit) */
226 /* PIO data transfers (16-bit) */
230
231#define SHARED_CMD_TIMINGS 0x00000001
232#define SHARED_DATA_TIMINGS 0x00000002
233#define SHARED_ADDR_TIMINGS 0x00000004
234
236ATATIM
239 _In_ ATATIM Minimum,
240 _In_ ATATIM Maximum)
241{
242 if (Value < Minimum)
243 return Minimum;
244 if (Value > Maximum)
245 return Maximum;
246 return Value;
247}
248
249#define ATA_READ_BLOCK_16(Port, Buffer, Count, Ctx, MmioFlag) \
250 AtaReadBlock16(Port, Buffer, Count, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
251
252#define ATA_WRITE_BLOCK_16(Port, Buffer, Count, Ctx, MmioFlag) \
253 AtaWriteBlock16(Port, Buffer, Count, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
254
255#define ATA_READ_BLOCK_32(Port, Buffer, Count, Ctx, MmioFlag) \
256 AtaReadBlock32(Port, Buffer, Count, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
257
258#define ATA_WRITE_BLOCK_32(Port, Buffer, Count, Ctx, MmioFlag) \
259 AtaWriteBlock32(Port, Buffer, Count, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
260
261#define ATA_READ(Port, Ctx, MmioFlag) \
262 AtaReadPortUchar(Port, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
263
264#define ATA_WRITE(Port, Value, Ctx, MmioFlag) \
265 AtaWritePortUchar(Port, Value, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
266
267#define ATA_WRITE_ULONG(Port, Value, Ctx, MmioFlag) \
268 AtaWritePortUlong(Port, Value, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
269
271VOID
273 _In_ PCHANNEL_DATA_PATA ChanData,
275 _In_ UCHAR DeviceSelect)
276{
277#if defined(_M_IX86)
278 /* NEC extension to allow 4 drives per channel */
279 if ((ChanData->ChanInfo & CHANNEL_FLAG_CBUS) &&
280 (ChanData->LastAtaBankId != DeviceNumber))
281 {
282 UCHAR AtaBank;
283
284 ChanData->LastAtaBankId = DeviceNumber;
285
286 /* The 0x432 port is used to select the primary (0) or secondary (1) IDE channel */
287 AtaBank = DeviceNumber >> 1;
288
289 if (ChanData->ChanInfo & CHANNEL_FLAG_IO32)
290 AtaBank |= PC98_ATA_BANK_32BIT_PORT;
291
293 }
294#endif
295
296 ATA_WRITE(ChanData->Regs.Device, DeviceSelect, ChanData, MRES_TF);
297 ATA_IO_WAIT();
298}
299
301UCHAR
303 _In_ PCHANNEL_DATA_PATA ChanData,
307{
308 UCHAR IdeStatus;
309 ULONG i;
310
311 for (i = 0; i < Timeout; ++i)
312 {
313 IdeStatus = ChanData->ReadStatus(ChanData);
314 if ((IdeStatus & Mask) == Value)
315 break;
316
317 if (IdeStatus == 0xFF)
318 break;
319
321 }
322
323 return IdeStatus;
324}
#define REQUEST_FLAG_DATA_IN
Definition: ata_shared.h:287
#define REQUEST_FLAG_DATA_OUT
Definition: ata_shared.h:290
#define REQUEST_FLAG_POLL
Definition: ata_shared.h:353
_In_ PCHAR _In_ ULONG DeviceNumber
Definition: classpnp.h:1230
unsigned int Mask
Definition: fpcontrol.c:82
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
Definition: glfuncs.h:248
#define C_ASSERT(e)
Definition: intsafe.h:73
#define KeStallExecutionProcessor(MicroSeconds)
Definition: precomp.h:27
#define _In_
Definition: no_sal2.h:158
#define _In_range_(l, h)
Definition: no_sal2.h:368
struct _ATA_TIMING ATA_TIMING
#define ATA_IO_WAIT()
Definition: pata.h:33
#define ATA_WRITE(Port, Value, Ctx, MmioFlag)
Definition: pata.h:264
#define CMD_FLAG_ATAPI_PIO_TRANSFER
Definition: pata.h:189
#define CMD_FLAG_ATA_PIO_TRANSFER
Definition: pata.h:190
FORCEINLINE ATATIM CLAMP_TIMING(_In_ ATATIM Value, _In_ ATATIM Minimum, _In_ ATATIM Maximum)
Definition: pata.h:237
#define PC98_ATA_BANK
Definition: pata.h:29
#define CMD_FLAG_DMA_TRANSFER
Definition: pata.h:191
#define PC98_ATA_BANK_32BIT_PORT
Definition: pata.h:30
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)
Definition: pata.h:272
FORCEINLINE UCHAR ATA_WAIT(_In_ PCHANNEL_DATA_PATA ChanData, _In_range_(>, 0) ULONG Timeout, _In_ UCHAR Mask, _In_ UCHAR Value)
Definition: pata.h:302
struct _ATA_TIMING * PATA_TIMING
struct _PCIIDE_PRD_TABLE_ENTRY PCIIDE_PRD_TABLE_ENTRY
#define CMD_FLAG_DATA_OUT
Definition: pata.h:186
#define CMD_FLAG_AWAIT_INTERRUPT
Definition: pata.h:187
#define CMD_FLAG_DATA_IN
Definition: pata.h:185
USHORT ATATIM
Definition: pata.h:218
#define WRITE_PORT_UCHAR(p, d)
Definition: pc98vid.h:21
#define CHANNEL_FLAG_IO32
Definition: pciidex.h:261
#define CHANNEL_FLAG_CBUS
Definition: pciidex.h:284
unsigned short USHORT
Definition: pedump.c:61
static ULONG Timeout
Definition: ping.c:61
ATATIM CmdRecovery
Definition: pata.h:225
ATATIM CmdActive
Definition: pata.h:224
ATATIM DataRecovery
Definition: pata.h:228
ATATIM AddressSetup
Definition: pata.h:222
ATATIM DataActive
Definition: pata.h:227
Definition: pata.h:207
ULONG Address
Definition: pata.h:208
ULONG Length
0 means 0x10000 bytes
Definition: pata.h:209
unsigned char UCHAR
Definition: typedefs.h:53
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
#define FORCEINLINE
Definition: wdftypes.h:67