ReactOS 0.4.16-dev-2633-g8dc9e50
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_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
20
22#define CHANNEL_PCAT_MAX_DEVICES 2
23
25#define CHANNEL_PC98_MAX_DEVICES 4
26
28#define PC98_ATA_BANK 0x432
29#define PC98_ATA_BANK_32BIT_PORT 0x08
30
32#define ATA_IO_WAIT() KeStallExecutionProcessor(1)
33
34#define NUM_TO_BITMAP(num) (0xFFFFFFFF >> (RTL_BITS_OF(ULONG) - (num)))
35
37#define SATA_ALL \
38 (PIO_ALL | MWDMA_ALL | UDMA_ALL)
39
41#define UDMA_80C_ALL \
42 (UDMA_MODE3 | UDMA_MODE4 | UDMA_MODE5 | UDMA_MODE6)
43
45#define MWDMA_MODES(MinMode, MaxMode) \
46 (NUM_TO_BITMAP(MWDMA_MODE((MaxMode) + 1)) & ~NUM_TO_BITMAP(MWDMA_MODE(MinMode)))
47
49#define UDMA_MODES(MinMode, MaxMode) \
50 (NUM_TO_BITMAP(UDMA_MODE((MaxMode) + 1)) & ~NUM_TO_BITMAP(UDMA_MODE(MinMode)))
51
52#define IDE_DC_ALWAYS 0x08
53#define IDE_DRIVE_SELECT 0xA0
54
55#define IDE_HIGH_ORDER_BYTE 0x80
56
57#define IDE_FEATURE_PIO 0x00
58#define IDE_FEATURE_DMA 0x01
59#define IDE_FEATURE_DMADIR 0x04
60
65#define ATAPI_MAX_DRQ_DATA_BLOCK 0xFFFE
66
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
87
89#define PCIIDE_DMA_SECONDARY_CHANNEL_OFFSET 8
90
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
141
143#define ATAPI_INT_REASON_IO 0x02
144
146#define ATAPI_INT_REASON_RELEASE 0x04
147
149#define ATAPI_INT_REASON_TAG 0xF8
150
151#define ATAPI_INT_REASON_MASK (ATAPI_INT_REASON_IO | ATAPI_INT_REASON_COD)
152
154#define ATAPI_INT_REASON_STATUS_NEC 0x00
155
157#define ATAPI_INT_REASON_STATUS (ATAPI_INT_REASON_IO | ATAPI_INT_REASON_COD)
158
160#define ATAPI_INT_REASON_DATA_OUT IDE_STATUS_DRQ
161
163#define ATAPI_INT_REASON_AWAIT_CDB (IDE_STATUS_DRQ | ATAPI_INT_REASON_COD)
164
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
174
175/* We keep the value as small as possible, since large timeout can break our error handling */
176#define ATA_TIME_DRQ_ASSERT 15
177
178#define ATA_TIME_RESET_SELECT (2000 / PORT_TIMER_TICK_MS)
179#define ATA_TIME_BUSY_RESET (10000 / PORT_TIMER_TICK_MS)
180
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
187
188#define CMD_FLAG_ATAPI_PIO_TRANSFER 0x00000001
189#define CMD_FLAG_ATA_PIO_TRANSFER 0x00000002
190#define CMD_FLAG_DMA_TRANSFER 0x00000003
191
193#define PATA_CHANNEL_SLOT 0
194#define PATA_CHANNEL_QUEUE_DEPTH 1
195
200
201#include <pshpack1.h>
206{
209#define PCIIDE_PRD_LENGTH_MASK 0xFFFF
210#define PCIIDE_PRD_END_OF_TABLE 0x80000000
212#include <poppack.h>
213
215#define PCIIDE_PRD_LIMIT 0x10000
216
218
219typedef struct _ATA_TIMING
220{
222 /* Register transfers (8-bit) */
225 /* PIO data transfers (16-bit) */
229
230#define SHARED_CMD_TIMINGS 0x00000001
231#define SHARED_DATA_TIMINGS 0x00000002
232#define SHARED_ADDR_TIMINGS 0x00000004
233
235ATATIM
238 _In_ ATATIM Minimum,
239 _In_ ATATIM Maximum)
240{
241 if (Value < Minimum)
242 return Minimum;
243 if (Value > Maximum)
244 return Maximum;
245 return Value;
246}
247
248#define ATA_READ_BLOCK_16(Port, Buffer, Count, Ctx, MmioFlag) \
249 AtaReadBlock16(Port, Buffer, Count, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
250
251#define ATA_WRITE_BLOCK_16(Port, Buffer, Count, Ctx, MmioFlag) \
252 AtaWriteBlock16(Port, Buffer, Count, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
253
254#define ATA_READ_BLOCK_32(Port, Buffer, Count, Ctx, MmioFlag) \
255 AtaReadBlock32(Port, Buffer, Count, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
256
257#define ATA_WRITE_BLOCK_32(Port, Buffer, Count, Ctx, MmioFlag) \
258 AtaWriteBlock32(Port, Buffer, Count, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
259
260#define ATA_READ(Port, Ctx, MmioFlag) \
261 AtaReadPortUchar(Port, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
262
263#define ATA_WRITE(Port, Value, Ctx, MmioFlag) \
264 AtaWritePortUchar(Port, Value, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
265
266#define ATA_WRITE_ULONG(Port, Value, Ctx, MmioFlag) \
267 AtaWritePortUlong(Port, Value, (Ctx)->ChanInfo & CHANNEL_FLAG_##MmioFlag)
268
270VOID
272 _In_ PCHANNEL_DATA_PATA ChanData,
274 _In_ UCHAR DeviceSelect)
275{
276#if defined(_M_IX86)
277 /* NEC extension to allow 4 drives per channel */
278 if ((ChanData->ChanInfo & CHANNEL_FLAG_CBUS) &&
279 (ChanData->LastAtaBankId != DeviceNumber))
280 {
281 UCHAR AtaBank;
282
283 ChanData->LastAtaBankId = DeviceNumber;
284
285 /* The 0x432 port is used to select the primary (0) or secondary (1) IDE channel */
286 AtaBank = DeviceNumber >> 1;
287
288 if (ChanData->ChanInfo & CHANNEL_FLAG_IO32)
289 AtaBank |= PC98_ATA_BANK_32BIT_PORT;
290
292 }
293#endif
294
295 ATA_WRITE(ChanData->Regs.Device, DeviceSelect, ChanData, MRES_TF);
296 ATA_IO_WAIT();
297}
298
300UCHAR
302 _In_ PCHANNEL_DATA_PATA ChanData,
306{
307 UCHAR IdeStatus;
308 ULONG i;
309
310 for (i = 0; i < Timeout; ++i)
311 {
312 IdeStatus = ChanData->ReadStatus(ChanData);
313 if ((IdeStatus & Mask) == Value)
314 break;
315
316 if (IdeStatus == 0xFF)
317 break;
318
320 }
321
322 return IdeStatus;
323}
#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:32
#define ATA_WRITE(Port, Value, Ctx, MmioFlag)
Definition: pata.h:263
#define CMD_FLAG_ATAPI_PIO_TRANSFER
Definition: pata.h:188
#define CMD_FLAG_ATA_PIO_TRANSFER
Definition: pata.h:189
FORCEINLINE ATATIM CLAMP_TIMING(_In_ ATATIM Value, _In_ ATATIM Minimum, _In_ ATATIM Maximum)
Definition: pata.h:236
#define PC98_ATA_BANK
Definition: pata.h:28
#define CMD_FLAG_DMA_TRANSFER
Definition: pata.h:190
#define PC98_ATA_BANK_32BIT_PORT
Definition: pata.h:29
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:271
FORCEINLINE UCHAR ATA_WAIT(_In_ PCHANNEL_DATA_PATA ChanData, _In_range_(>, 0) ULONG Timeout, _In_ UCHAR Mask, _In_ UCHAR Value)
Definition: pata.h:301
struct _ATA_TIMING * PATA_TIMING
struct _PCIIDE_PRD_TABLE_ENTRY PCIIDE_PRD_TABLE_ENTRY
#define CMD_FLAG_DATA_OUT
Definition: pata.h:185
#define CMD_FLAG_AWAIT_INTERRUPT
Definition: pata.h:186
#define CMD_FLAG_DATA_IN
Definition: pata.h:184
USHORT ATATIM
Definition: pata.h:217
#define WRITE_PORT_UCHAR(p, d)
Definition: pc98vid.h:21
#define CHANNEL_FLAG_IO32
Definition: pciidex.h:260
#define CHANNEL_FLAG_CBUS
Definition: pciidex.h:283
unsigned short USHORT
Definition: pedump.c:61
static ULONG Timeout
Definition: ping.c:61
ATATIM CmdRecovery
Definition: pata.h:224
ATATIM CmdActive
Definition: pata.h:223
ATATIM DataRecovery
Definition: pata.h:227
ATATIM AddressSetup
Definition: pata.h:221
ATATIM DataActive
Definition: pata.h:226
Definition: pata.h:206
ULONG Address
Definition: pata.h:207
ULONG Length
0 means 0x10000 bytes
Definition: pata.h:208
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