19#define PCI_DEV_VT82C576M_IDE 0x1571
20#define PCI_DEV_VT82C586A_IDE 0x0571
21#define PCI_DEV_VT6410_IDE_RAID 0x3164
22#define PCI_DEV_VT6415_IDE 0x0415
23#define PCI_DEV_VT6420_IDE 0x4149
24#define PCI_DEV_VT6421A_RAID 0x3249
25#define PCI_DEV_CX700M2_IDE_SATA 0x5324
26#define PCI_DEV_CX700M2_IDE_SATA_RAID 0x0581
27#define PCI_DEV_VX855_IDE 0xC409
29#define PCI_DEV_VT8237_SATA 0x3149
30#define PCI_DEV_VT8237A_SATA 0x0591
31#define PCI_DEV_VT8237A_SATA_2 0x5337
32#define PCI_DEV_VT8237S_SATA 0x5372
33#define PCI_DEV_VT8237S_SATA_RAID 0x7372
34#define PCI_DEV_VT8251_SATA_AHCI 0x3349
35#define PCI_DEV_VT8251_SATA_2 0x5287
36#define PCI_DEV_VT8261_SATA 0x9000
37#define PCI_DEV_VT8261_SATA_RAID 0x9040
38#define PCI_DEV_VX900_SATA 0x9001
39#define PCI_DEV_VX900_SATA_RAID 0x9041
41#define PCI_DEV_BRIDGE_VT82C586 0x0586
42#define PCI_DEV_BRIDGE_VT82C596A 0x0596
43#define PCI_DEV_BRIDGE_VT82C686A 0x0686
44#define PCI_DEV_BRIDGE_VT8231 0x8231
45#define PCI_DEV_BRIDGE_VT8233 0x3074
46#define PCI_DEV_BRIDGE_VT8233A 0x3147
47#define PCI_DEV_BRIDGE_VT8233C 0x3109
48#define PCI_DEV_BRIDGE_VT8235 0x3177
49#define PCI_DEV_BRIDGE_VT8237 0x3227
50#define PCI_DEV_BRIDGE_VT8237A 0x3337
51#define PCI_DEV_BRIDGE_VT8237S 0x3372
52#define PCI_DEV_BRIDGE_VT8251 0x3287
53#define PCI_DEV_BRIDGE_VT8261 0x3402
55#define HW_FLAGS_TYPE_MASK 0x000F
56#define HW_FLAGS_CHECK_BRIDGE 0x0010
57#define HW_FLAGS_HAS_UDMA_CLOCK 0x0020
58#define HW_FLAGS_SINGLE_CHAN 0x0040
59#define HW_FLAGS_SINGLE_PORT 0x0080
60#define HW_FLAGS_PCI_SCR 0x0100
69#define GET_TYPE(Flags) ((Flags) & HW_FLAGS_TYPE_MASK)
71#define VIA_PCI_CLOCK 30000
73#define VIA_REG_ENABLE_CTRL 0x40
74#define VIA_REG_DRIVE_TIMING 0x48
75#define VIA_REG_PORT_TIMING(Channel) (0x4F - (Channel))
76#define VIA_REG_ADDRESS_SETUP 0x4C
77#define VIA_REG_UDMA_CTRL 0x50
78#define VIA_REG_SSTATUS 0xA0
79#define VIA_REG_SCONTROL 0xA4
80#define VIA_REG_SERROR 0xA8
81#define VIA_REG_SERROR_VT8237 0xB0
83#define VIA_UDMA_CLOCK_UDMA66 0x08
84#define VIA_UDMA_CABLE_BITS 0x10
85#define VIA_UDMA_CLEAR_MASK 0xEF
87#define VIA_UDMA_CLOCK_ENABLED(Reg32, Channel) \
88 (((Reg32) & (0x00080000 >> ((Channel) * 16))) != 0)
90#define VIA_UDMA_CABLE_PRESENT(Reg32, Channel) \
91 (((Reg32) & (0x10100000 >> ((Channel) * 16))) != 0)
93#define VIA_SINGLE_CHAN_UDMA_CABLE_PRESENT(Controller) \
94 ((PciRead16(Controller, 0x50) & 0x1010) != 0)
97#define VT6421A_UDMA_CABLE_PRESENT(Controller) \
98 ((PciRead16(Controller, 0xB2) & 0x1010) == 0)
100#define VIA_REG_SATA_PORT_MAP 0x49
102#define VT6421A_REG_SATA_CTRL 0x52
103#define VT6421A_REG_TIMING_CTRL(Drive) (0xAB - (Drive))
104#define VT6421A_REG_UDMA_CTRL(Drive) (0xB3 - (Drive))
106#define VT6421A_UDMA_SLOW 0x0F
107#define VT6421A_FIFO_WATERMARK_64DW 0x04
142 { 0x03, { 0xE2, 0xE1, 0xE0 } },
143 { 0x03, { 0xE6, 0xE4, 0xE2, 0xE1, 0xE0 } },
144 { 0x07, { 0xEA, 0xE6, 0xE4, 0xE2, 0xE1, 0xE0 } },
145 { 0x07, { 0xEE, 0xE8, 0xE6, 0xE4, 0xE2, 0xE1, 0xE0 } },
151 { 0x40, 0x02, 0x02 },
152 { 0x40, 0x01, 0x01 },
158 { 0x40, 0x02, 0x02 },
159 { 0xC0, 0x01, 0x01 },
168 Timing->AddressSetup =
CLAMP_TIMING(Timing->AddressSetup, 1, 4) - 1;
169 Timing->CmdRecovery =
CLAMP_TIMING(Timing->CmdRecovery, 1, 16) - 1;
170 Timing->CmdActive =
CLAMP_TIMING(Timing->CmdActive, 1, 16) - 1;
171 Timing->DataRecovery =
CLAMP_TIMING(Timing->DataRecovery, 1, 16) - 1;
172 Timing->DataActive =
CLAMP_TIMING(Timing->DataActive, 1, 16) - 1;
185 ULONG DriveTimReg, UdmaTimReg;
190 INFO(
"CH %lu: Config (before)\n"
243 DriveTimReg &= ~(0xFF <<
Shift);
255 INFO(
"CH %lu: Config (after)\n"
290 WARN(
"Enabling workaround for the '%s' drive\n",
Device->FriendlyName);
496 PUCHAR CommandPortBase, ControlPortBase, DmaBase, ScrBase;
510 if (!CommandPortBase)
521 ChanData->Regs.Dma = DmaBase + (PortIndex * 8);
522 ChanData->Regs.Scr = ScrBase + (PortIndex * 64);
549 Controller->MaxChannels = 3;
556 for (
i = 0;
i < Controller->MaxChannels; ++
i)
568 INFO(
"CH %lu: BIOS detected 40-conductor cable\n", ChanData->Channel);
569 ChanData->TransferModeSupported &= ~UDMA_80C_ALL;
576 ChanData->TransferModeSupported =
SATA_ALL;
610 for (
i = 0;
i < Controller->MaxChannels; ++
i)
617 ChanData->TransferModeSupported =
SATA_ALL;
629 INFO(
"CH %lu: BIOS detected 40-conductor cable\n", ChanData->Channel);
630 ChanData->TransferModeSupported &= ~UDMA_80C_ALL;
672 UCHAR MinimumRevisionID;
704 if ((
PciConfig->DeviceID == ViaBridgeList[
i].DeviceID) &&
705 (
PciConfig->RevisionID >= ViaBridgeList[
i].MinimumRevisionID))
707 INFO(
"Found %04X:%04X.%02X VIA bridge\n",
710 *HwFlags = ViaBridgeList[
i].Flags;
738 ERR(
"Unable to find the VIA bridge\n");
754 for (
i = 0;
i < Controller->MaxChannels; ++
i)
781 INFO(
"CH %lu: BIOS detected 40-conductor cable "
782 "or this chip is ATA/33 capable\n", ChanData->Channel);
783 ChanData->TransferModeSupported &= ~UDMA_80C_ALL;
786 ChanData->
HwFlags &= ~HW_FLAGS_TYPE_MASK;
797 INFO(
"CH %lu: BIOS detected 40-conductor cable\n", ChanData->Channel);
798 ChanData->TransferModeSupported &= ~UDMA_80C_ALL;
808 INFO(
"CH %lu: BIOS detected 40-conductor cable\n", ChanData->Channel);
809 ChanData->TransferModeSupported &= ~UDMA_80C_ALL;
836 for (
i = 0;
i < Controller->MaxChannels; ++
i)
841 ChanData->TransferModeSupported =
SATA_ALL;
889 Controller->MaxChannels = 1;
#define AHCI_PXCTL_DET_RESET
#define AHCI_PXSSTS_IPM_PARTIAL
#define AHCI_PXCTL_IPM_DISABLE_PARTIAL
#define AHCI_PXSSTS_IPM_SLUMBER
#define AHCI_PXSSTS_SPD_SATA1
enum _SATA_SCR_REGISTER SATA_SCR_REGISTER
#define AHCI_PXSSTS_SPD_SATA2
#define AHCI_PXCTL_IPM_DISABLE_SLUMBER
#define AHCI_PXCTL_DET_DISABLE_SATA
#define AHCI_PXSSTS_IPM_ACTIVE
#define NT_SUCCESS(StatCode)
#define _strnicmp(_String1, _String2, _MaxCount)
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
ULONG NTAPI READ_PORT_ULONG(IN PULONG Port)
VOID NTAPI WRITE_PORT_ULONG(IN PULONG Port, IN ULONG Value)
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG Offset
#define STATUS_DEVICE_CONFIGURATION_ERROR
#define SHARED_CMD_TIMINGS
#define UDMA_MODES(MinMode, MaxMode)
#define PCIIDE_COMMAND_IO_RANGE_LENGTH
FORCEINLINE ATATIM CLAMP_TIMING(_In_ ATATIM Value, _In_ ATATIM Minimum, _In_ ATATIM Maximum)
#define PCIIDE_CONTROL_IO_BAR_OFFSET
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)
VOID PciIdeInitTaskFileIoResources(_In_ PCHANNEL_DATA_PATA ChanData, _In_ ULONG_PTR CommandPortBase, _In_ ULONG_PTR ControlPortBase, _In_ ULONG CommandBlockSpare)
BOOLEAN PciFindDevice(_In_ __callback PATA_PCI_MATCH_FN MatchFunction, _In_ PVOID Context)
FORCEINLINE UCHAR PciRead8(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset)
_In_ ULONG _In_ PCI_SLOT_NUMBER PciSlot
#define CHANNEL_FLAG_NO_SLAVE
#define PCIIDEX_PAGED_DATA
FORCEINLINE VOID PciWrite8(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset, _In_ UCHAR Value)
#define CTRL_FLAG_MANUAL_RES
FORCEINLINE VOID PciWrite32(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset, _In_ ULONG Value)
CHANNEL_SET_MODE_EX SataSetTransferMode
_In_ ULONG _In_ PCI_SLOT_NUMBER _In_ PPCI_COMMON_HEADER PciConfig
FORCEINLINE ULONG PciRead32(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset)
PVOID AtaCtrlPciMapBar(_In_ PATA_CONTROLLER Controller, _In_range_(0, PCI_TYPE0_ADDRESSES) ULONG Index, _In_ ULONG MinimumIoLength)
PCHANNEL_WRITE_SCR ScrWrite
PCHANNEL_READ_SCR ScrRead
#define PCI_DEV_BRIDGE_VT8233A
static NTSTATUS Via6421GetControllerProperties(_Inout_ PATA_CONTROLLER Controller)
#define PCI_DEV_VT82C576M_IDE
#define PCI_DEV_BRIDGE_VT82C596A
static BOOLEAN ViaQuerySouthBridgeInformation(_In_ PVOID Context, _In_ ULONG BusNumber, _In_ PCI_SLOT_NUMBER PciSlot, _In_ PPCI_COMMON_HEADER PciConfig)
#define VIA_REG_ENABLE_CTRL
#define VT6421A_REG_UDMA_CTRL(Drive)
#define VIA_UDMA_CLOCK_ENABLED(Reg32, Channel)
#define VIA_REG_DRIVE_TIMING
static VOID Via6421SetTransferMode(_In_ PATA_CONTROLLER Controller, _In_ ULONG Channel, _In_reads_(MAX_IDE_DEVICE) PCHANNEL_DEVICE_CONFIG *DeviceList)
#define PCI_DEV_VX900_SATA_RAID
static BOOLEAN ViaScrReadIoPort(_In_ PCHANNEL_DATA_PATA ChanData, _In_ SATA_SCR_REGISTER Register, _In_ ULONG PortNumber, _In_ PULONG Result)
#define PCI_DEV_VT8251_SATA_2
static VOID ViaSataSetTransferMode(_In_ PATA_CONTROLLER Controller, _In_ ULONG Channel, _In_reads_(MAX_IDE_DEVICE) PCHANNEL_DEVICE_CONFIG *DeviceList)
#define PCI_DEV_BRIDGE_VT8251
static PCIIDEX_PAGED_DATA const ATA_PCI_ENABLE_BITS ViaCx700EnableBits[MAX_IDE_CHANNEL]
static NTSTATUS ViaCx700GetControllerProperties(_Inout_ PATA_CONTROLLER Controller)
#define HW_FLAGS_HAS_UDMA_CLOCK
static BOOLEAN ViaScrWritePci(_In_ PCHANNEL_DATA_PATA ChanData, _In_ SATA_SCR_REGISTER Register, _In_ ULONG PortNumber, _In_ ULONG Value)
#define PCI_DEV_CX700M2_IDE_SATA_RAID
#define PCI_DEV_VT8237A_SATA_2
#define PCI_DEV_BRIDGE_VT8235
#define PCI_DEV_BRIDGE_VT8231
#define VIA_REG_PORT_TIMING(Channel)
#define PCI_DEV_VT8237S_SATA
static NTSTATUS Via6421ParseResources(_Inout_ PCHANNEL_DATA_PATA ChanData, _In_ ULONG PortIndex)
#define VT6421A_REG_TIMING_CTRL(Drive)
#define VIA_UDMA_CABLE_PRESENT(Reg32, Channel)
#define VIA_UDMA_CLOCK_UDMA66
#define VT6421A_FIFO_WATERMARK_64DW
VOID ViaClampTimings(_Inout_ PATA_TIMING Timing)
static const struct @1178 ViaUdmaTimings[]
#define PCI_DEV_BRIDGE_VT8237
#define VIA_SINGLE_CHAN_UDMA_CABLE_PRESENT(Controller)
#define VIA_UDMA_CABLE_BITS
#define PCI_DEV_BRIDGE_VT8261
#define PCI_DEV_VT6415_IDE
#define HW_FLAGS_CHECK_BRIDGE
#define PCI_DEV_BRIDGE_VT8233C
#define PCI_DEV_VT8237A_SATA
#define PCI_DEV_VT8251_SATA_AHCI
static ULONG ViaGetSerrOffset(_In_ PATA_CONTROLLER Controller)
#define VT6421A_UDMA_SLOW
static PCIIDEX_PAGED_DATA const ATA_PCI_ENABLE_BITS ViaPataEnableBits[MAX_IDE_CHANNEL]
#define PCI_DEV_VT6410_IDE_RAID
#define PCI_DEV_VX900_SATA
#define PCI_DEV_CX700M2_IDE_SATA
#define PCI_DEV_VT8261_SATA_RAID
static NTSTATUS ViaPataGetControllerProperties(_Inout_ PATA_CONTROLLER Controller, _In_ ULONG HwFlags)
#define PCI_DEV_VT8237S_SATA_RAID
NTSTATUS ViaGetControllerProperties(_Inout_ PATA_CONTROLLER Controller)
#define VIA_REG_SERROR_VT8237
static VOID Via6410ControllerStart(_In_ PATA_CONTROLLER Controller)
#define PCI_DEV_BRIDGE_VT82C686A
#define VT6421A_UDMA_CABLE_PRESENT(Controller)
static BOOLEAN ViaScrWriteIoPort(_In_ PCHANNEL_DATA_PATA ChanData, _In_ SATA_SCR_REGISTER Register, _In_ ULONG PortNumber, _In_ ULONG Value)
#define PCI_DEV_VT6421A_RAID
static BOOLEAN ViaScrReadPci(_In_ PCHANNEL_DATA_PATA ChanData, _In_ SATA_SCR_REGISTER Register, _In_ ULONG PortNumber, _In_ PULONG Result)
#define PCI_DEV_BRIDGE_VT8237S
#define VT6421A_REG_SATA_CTRL
#define HW_FLAGS_SINGLE_CHAN
#define VIA_REG_UDMA_CTRL
#define PCI_DEV_VT8237_SATA
#define PCI_DEV_VX855_IDE
static NTSTATUS ViaSataGetControllerProperties(_Inout_ PATA_CONTROLLER Controller, _In_ ULONG HwFlags)
#define HW_FLAGS_SINGLE_PORT
static PCIIDEX_PAGED_DATA const struct @1177 ViaControllerList[]
#define PCI_DEV_VT6420_IDE
#define PCI_DEV_BRIDGE_VT8233
#define VIA_REG_SATA_PORT_MAP
#define PCI_DEV_VT82C586A_IDE
#define PCI_DEV_BRIDGE_VT82C586
static VOID ViaSetTransferMode(_In_ PATA_CONTROLLER Controller, _In_ ULONG Channel, _In_reads_(MAX_IDE_DEVICE) PCHANNEL_DEVICE_CONFIG *DeviceList)
#define PCI_DEV_VT8261_SATA
#define VIA_UDMA_CLEAR_MASK
#define PCI_DEV_BRIDGE_VT8237A
_Must_inspect_result_ _In_ WDFDEVICE Device
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO