18#define PCI_DEV_PCI0640 0x0640
19#define PCI_DEV_PCI0643 0x0643
20#define PCI_DEV_PCI0646 0x0646
21#define PCI_DEV_PCI0648 0x0648
22#define PCI_DEV_CMD0649 0x0649
24#define HW_FLAGS_PRIMARY_ENABLED 0x0001
25#define HW_FLAGS_HAS_UDMA_REG 0x0002
26#define HW_FLAGS_NEED_PIO_FIX 0x0004
27#define HW_FLAGS_NO_PREFETCH 0x0008
29#define CMD_PCI_CLOCK 30000
31#define CMD_REG_CFR 0x50
32#define CMD_REG_CNTRL 0x51
33#define CMD_REG_CMDTIM 0x52
34#define CMD_REG_ARTTIM0 0x53
35#define CMD_REG_DRWTIM0 0x54
36#define CMD_REG_ARTTIM1 0x55
37#define CMD_REG_DRWTIM1 0x56
38#define CMD_REG_ARTTIM23 0x57
39#define CMD_REG_DRWTIM2 0x58
40#define CMD_REG_DRWTIM23 0x58
41#define CMD_REG_DRWTIM3 0x5B
42#define CMD_REG_MRDMODE 0x71
43#define CMD_REG_BMIDECSR 0x79
44#define CMD_REG_UDIDETCR(Channel) (((Channel) == 0) ? 0x73 : 0x7B)
46#define CMD_CFR_INTR(Channel) (((Channel) == 0) ? 0x04 : 0x10)
48#define CMD_CNTRL_CHAN_EN(Channel) (0x04 << (Channel))
50#define CMD_ARTTIM_ART_MASK 0xC0
52#define CMD_MRDMODE_READ_MULTIPLE 0x01
53#define CMD_MRDMODE_INTR(Channel) (0x04 << (Channel))
54#define CMD_MRDMODE_INTR_CH0_BLOCK 0x10
55#define CMD_MRDMODE_INTR_CH1_BLOCK 0x20
57#define CMD_BMIDECSR_CR(Channel) (0x01 << (Channel))
59#define CMD_UDIDETCR_CLEAR(Drive) (((Drive) == 0) ? 0x35 : 0xCA)
60#define CMD_UDIDETCR_EN(Drive) (0x01 << (Drive))
129 if (((Timing->DataActive + Timing->DataRecovery) > CycleTimeClocks) ||
132 if (Timing->CmdActive < CmdActiveClocks)
133 Timing->CmdActive = CmdActiveClocks;
134 if (Timing->CmdRecovery < CmdRecoveryClocks)
135 Timing->CmdRecovery = CmdRecoveryClocks;
137 if (Timing->DataActive < DataActiveClocks)
138 Timing->DataActive = DataActiveClocks;
139 if (Timing->DataRecovery < DataRecoveryClocks)
140 Timing->DataRecovery = DataRecoveryClocks;
145 Timing->CmdActive = CmdActiveClocks;
146 Timing->CmdRecovery = CmdRecoveryClocks;
147 Timing->DataActive = DataActiveClocks;
148 Timing->DataRecovery = DataRecoveryClocks;
206 if (Controller->Pci.RevisionID > 1)
211 else if (Recovery > 2)
221 else if (Recovery < 2)
232 else if (Recovery > 1)
238 return (
Active << 4) | Recovery;
295 UdmaTimReg &= ~CMD_UDIDETCR_CLEAR(
i);
300 UdmaTimReg &= ~CMD_UDIDETCR_EN(
i);
323 Value &= ~CMD_ARTTIM_ART_MASK;
345 if ((DeviceTimings[0].CmdActive != 0) || (DeviceTimings[0].CmdRecovery != 0))
348 DeviceTimings[0].CmdActive,
349 DeviceTimings[0].CmdRecovery);
382 if (ChanData->Regs.Dma)
388 if (!(
Control & InterruptMask))
397 if (ChanData->Regs.Dma)
419 return !!(
Status & InterruptMask);
464 ULONG i, SupportedMode, HwFlags = 0;
470 switch (Controller->Pci.DeviceID)
487 if (Controller->Pci.RevisionID < 6)
495 if (Controller->Pci.RevisionID < 3)
500 if (Controller->Pci.RevisionID == 5 || Controller->Pci.RevisionID == 6)
508 else if (Controller->Pci.RevisionID > 6)
525 if (Controller->Pci.RevisionID == 2)
545 if (!Controller->HwExt)
548 for (
i = 0;
i < Controller->MaxChannels; ++
i)
555 ChanData->TransferModeSupported = SupportedMode;
559 ChanData->ChanInfo &= ~CHANNEL_FLAG_IO32;
569 INFO(
"CH %lu: BIOS detected 40-conductor cable\n", ChanData->Channel);
570 ChanData->TransferModeSupported &= ~UDMA_80C_ALL;
#define NT_SUCCESS(StatCode)
static VOID CmdSetTransferMode(_In_ PATA_CONTROLLER Controller, _In_ ULONG Channel, _In_reads_(MAX_IDE_DEVICE) PCHANNEL_DEVICE_CONFIG *DeviceList)
static const UCHAR CmdPrefetchDisable[MAX_IDE_CHANNEL][MAX_IDE_DEVICE]
#define CMD_MRDMODE_INTR_CH0_BLOCK
static const ULONG CmdDrwTimRegs[MAX_IDE_CHANNEL][MAX_IDE_DEVICE]
static BOOLEAN CmdCheckInterruptPci(_In_ PCHANNEL_DATA_PATA ChanData)
#define CMD_BMIDECSR_CR(Channel)
static IDE_CHANNEL_STATE CmdChannelEnabledTest(_In_ PATA_CONTROLLER Controller, _In_ ULONG Channel)
NTSTATUS CmdGetControllerProperties(_Inout_ PATA_CONTROLLER Controller)
struct _CMD_HW_EXTENSION CMD_HW_EXTENSION
static UCHAR CmdPackTimings(_In_ PATA_CONTROLLER Controller, _In_ ATATIM Active, _In_ ATATIM Recovery)
#define HW_FLAGS_HAS_UDMA_REG
#define CMD_MRDMODE_READ_MULTIPLE
static VOID CmdFixRecoveryTiming(_In_ PCHANNEL_DEVICE_CONFIG Device, _Inout_ PATA_TIMING Timing, _In_ ATATIM CycleTimeClocks, _In_ ATATIM CmdActiveClocks, _In_ ATATIM CmdRecoveryClocks, _In_ ATATIM DataActiveClocks, _In_ ATATIM DataRecoveryClocks)
static const ULONG CmdPrefetchRegs[MAX_IDE_CHANNEL]
static VOID CmdDerateTimings(_In_ PCHANNEL_DEVICE_CONFIG Device, _Inout_ PATA_TIMING Timing)
static const UCHAR CmdArtTimings[]
#define HW_FLAGS_NEED_PIO_FIX
static BOOLEAN CmdCheckInterruptMrdMode(_In_ PCHANNEL_DATA_PATA ChanData)
#define CMD_MRDMODE_INTR_CH1_BLOCK
#define CMD_CNTRL_CHAN_EN(Channel)
static VOID CmdControllerStart(_In_ PATA_CONTROLLER Controller)
#define HW_FLAGS_PRIMARY_ENABLED
struct _CMD_HW_EXTENSION * PCMD_HW_EXTENSION
#define CMD_CFR_INTR(Channel)
static const UCHAR CmdUdmaTimings[6][MAX_IDE_DEVICE]
#define CMD_MRDMODE_INTR(Channel)
static const ULONG CmdArtTimRegs[MAX_IDE_CHANNEL][MAX_IDE_DEVICE]
#define CMD_REG_UDIDETCR(Channel)
#define HW_FLAGS_NO_PREFETCH
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 ATA_WRITE(Port, Value)
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
#define SHARED_DATA_TIMINGS
#define UDMA_MODES(MinMode, MaxMode)
#define SHARED_ADDR_TIMINGS
VOID AtaSelectTimings(_In_reads_(MAX_IDE_DEVICE) PCHANNEL_DEVICE_CONFIG *DeviceList, _Out_writes_all_(MAX_IDE_DEVICE) PATA_TIMING Timings, _In_range_(>, 0) ULONG ClockPeriodPs, _In_ ULONG Flags)
NTSTATUS PciIdeCreateChannelData(_In_ PATA_CONTROLLER Controller, _In_ ULONG HwExtensionSize)
FORCEINLINE UCHAR PciRead8(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset)
#define CTRL_FLAG_USE_TEST_FUNCTION
CHANNEL_CHECK_INTERRUPT * PCHANNEL_CHECK_INTERRUPT
FORCEINLINE VOID PciWrite8(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset, _In_ UCHAR Value)
#define CTRL_FLAG_IS_SIMPLEX
PCHANNEL_CHECK_INTERRUPT CheckInterrupt
ATATIM CmdActive[MAX_IDE_CHANNEL *MAX_IDE_DEVICE]
ATATIM CmdRecovery[MAX_IDE_CHANNEL *MAX_IDE_DEVICE]
#define STATUS_INSUFFICIENT_RESOURCES
_Must_inspect_result_ _In_ WDFDEVICE Device
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_In_ WDF_WMI_PROVIDER_CONTROL Control
_In_ ULONG _In_ BOOLEAN Active