10#define AHCI_MAX_PORTS 32
11#define AHCI_MAX_PORT_DEVICES 1
12#define AHCI_MAX_PMP_DEVICES 15
13#define AHCI_MAX_COMMAND_SLOTS 32
15#define AHCI_MAX_PRDT_ENTRIES 0x000FFFFF
16#define AHCI_MAX_PRD_LENGTH 0x003FFFFF
18#define AHCI_PMP_CONTROL_PORT 15
20#define AHCI_COMMAND_TABLE_ALIGNMENT 128
21#define AHCI_RECEIVED_FIS_ALIGNMENT 256
22#define AHCI_COMMAND_LIST_ALIGNMENT 1024
23#define AHCI_RECEIVED_FIS_FBS_ALIGNMENT 4096
25#define AHCI_FBS_RECEIVE_AREA_SIZE 4096
27#define AHCI_DELAY_1_SECOND (1000 / PORT_TIMER_TICK_MS)
28#define AHCI_DELAY_CR_START_STOP (500 / PORT_TIMER_TICK_MS)
29#define AHCI_DELAY_FR_START_STOP (500 / PORT_TIMER_TICK_MS)
30#define AHCI_DELAY_DET_PRESENCE (40 / PORT_TIMER_TICK_MS)
31#define AHCI_DELAY_DET_STABLE (200 / PORT_TIMER_TICK_MS)
32#define AHCI_DELAY_READY_DRIVE (10000 / PORT_TIMER_TICK_MS)
33#define AHCI_DELAY_PMP_READY_DRIVE (400 / PORT_TIMER_TICK_MS)
34#define AHCI_DELAY_PMP_DET_PRESENSE (100 / PORT_TIMER_TICK_MS)
35#define AHCI_DELAY_PMP_DET_STABLE (300 / PORT_TIMER_TICK_MS)
36#define AHCI_DELAY_CLO_CLEAR (10 / PORT_TIMER_TICK_MS)
37#define AHCI_DELAY_INTERFACE_CHANGE (10 / PORT_TIMER_TICK_MS)
39#define AHCI_FIS_REGISTER_HOST_TO_DEVICE 0x27
40#define AHCI_FIS_REGISTER_DEVICE_TO_HOST 0x34
41#define AHCI_FIS_DMA_ACTIVATE_DEVICE_TO_HOST 0x39
42#define AHCI_FIS_DMA_SETUP 0x41
43#define AHCI_FIS_DATA 0x46
44#define AHCI_FIS_BIST_ACTIVATE 0x58
45#define AHCI_FIS_PIO_SETUP_DEVICE_TO_HOST 0x5F
46#define AHCI_FIS_SET_DEVICE_BITS_DEVICE_TO_HOST 0xA1
48#define IDE_COMMAND_READ_PORT_MULTIPLIER 0xE4
49#define IDE_COMMAND_WRITE_PORT_MULTIPLIER 0xE8
60#define AHCI_INTERNAL_SLOT 0
75#define AHCI_PMP_BIST 0x00000001
76#define AHCI_PMP_PMREQ 0x00000002
77#define AHCI_PMP_SSC 0x00000004
78#define AHCI_PMP_SNTF 0x00000008
120#define AHCI_PXIRQ_DHRS 0x00000001
121#define AHCI_PXIRQ_PSS 0x00000002
122#define AHCI_PXIRQ_DSS 0x00000004
123#define AHCI_PXIRQ_SDBS 0x00000008
124#define AHCI_PXIRQ_UFS 0x00000010
125#define AHCI_PXIRQ_DPS 0x00000020
126#define AHCI_PXIRQ_PCS 0x00000040
127#define AHCI_PXIRQ_DMPS 0x00000080
128#define AHCI_PXIRQ_RSV1 0x003FFF00
129#define AHCI_PXIRQ_PRCS 0x00400000
130#define AHCI_PXIRQ_IPMS 0x00800000
131#define AHCI_PXIRQ_OFS 0x01000000
132#define AHCI_PXIRQ_RSV2 0x02000000
133#define AHCI_PXIRQ_INFS 0x04000000
134#define AHCI_PXIRQ_IFS 0x08000000
135#define AHCI_PXIRQ_HBDS 0x10000000
136#define AHCI_PXIRQ_HBFS 0x20000000
137#define AHCI_PXIRQ_TFES 0x40000000
138#define AHCI_PXIRQ_CPDS 0x80000000
140#define AHCI_PXIRQ_FATAL_ERROR \
141 (AHCI_PXIRQ_TFES | AHCI_PXIRQ_IFS | AHCI_PXIRQ_HBDS | AHCI_PXIRQ_HBFS)
143#define AHCI_PXIRQ_PORT_STATUS \
144 (AHCI_PXIRQ_PCS | AHCI_PXIRQ_PRCS | AHCI_PXIRQ_DMPS)
149#define AHCI_PXCMD_ST 0x00000001
150#define AHCI_PXCMD_SUD 0x00000002
151#define AHCI_PXCMD_POD 0x00000004
152#define AHCI_PXCMD_CLO 0x00000008
153#define AHCI_PXCMD_FRE 0x00000010
154#define AHCI_PXCMD_RSV 0x000000E0
155#define AHCI_PXCMD_CCS_MASK 0x00001F00
156#define AHCI_PXCMD_MPSS 0x00002000
157#define AHCI_PXCMD_FR 0x00004000
158#define AHCI_PXCMD_CR 0x00008000
159#define AHCI_PXCMD_CPS 0x00010000
160#define AHCI_PXCMD_PMA 0x00020000
161#define AHCI_PXCMD_HPCP 0x00040000
162#define AHCI_PXCMD_MPSP 0x00080000
163#define AHCI_PXCMD_CPD 0x00100000
164#define AHCI_PXCMD_ESP 0x00200000
165#define AHCI_PXCMD_FBSCP 0x00400000
166#define AHCI_PXCMD_APSTE 0x00800000
167#define AHCI_PXCMD_ATAPI 0x01000000
168#define AHCI_PXCMD_DLAE 0x02000000
169#define AHCI_PXCMD_ALPE 0x04000000
170#define AHCI_PXCMD_ASP 0x08000000
171#define AHCI_PXCMD_ICC_MASK 0xF0000000
173#define AHCI_PXCMD_ICC_IDLE 0x00000000
174#define AHCI_PXCMD_ICC_ACTIVE 0x10000000
175#define AHCI_PXCMD_ICC_PARTIAL 0x20000000
176#define AHCI_PXCMD_ICC_SLUMBER 0x60000000
177#define AHCI_PXCMD_ICC_DEVSLEEP 0x80000000
179#define AHCI_PXCMD_ICC_DEVSLEEP 0x80000000
181#define AHCI_PXCMD_CCS_SHIFT 8
183#define AHCI_PXCMD_CCS(Value) (((Value) & AHCI_PXCMD_CCS_MASK) >> AHCI_PXCMD_CCS_SHIFT)
188#define AHCI_PXTFD_STATUS_MASK 0x000000FF
189#define AHCI_PXTFD_ERROR_MASK 0x0000FF00
191#define AHCI_PXTFD_ERROR_SHIFT 8
196#define AHCI_PXSIG_INVALID 0xFFFFFFFF
197#define AHCI_PXSIG_ATAPI 0xEB140101
198#define AHCI_PXSIG_PMP 0x96690101
204#define AHCI_PXSIG_MASK 0xFFFF0000
209#define AHCI_PXSSTS_DET_MASK 0x0000000F
210#define AHCI_PXSSTS_SPD_MASK 0x000000F0
211#define AHCI_PXSSTS_IPM_MASK 0x00000F00
213#define AHCI_PXSSTS_DET_NO_DEVICE 0x00000000
214#define AHCI_PXSSTS_DET_PHY_NOT_READY 0x00000001
215#define AHCI_PXSSTS_DET_PHY_OK 0x00000003
216#define AHCI_PXSSTS_DET_PHY_OFFLINE 0x00000004
218#define AHCI_PXSSTS_SPD_UNKNOWN 0x00000000
219#define AHCI_PXSSTS_SPD_SATA1 0x00000010
220#define AHCI_PXSSTS_SPD_SATA2 0x00000020
221#define AHCI_PXSSTS_SPD_SATA3 0x00000030
223#define AHCI_PXSSTS_IPM_NO_DEVICE 0x00000000
224#define AHCI_PXSSTS_IPM_ACTIVE 0x00000100
225#define AHCI_PXSSTS_IPM_PARTIAL 0x00000200
226#define AHCI_PXSSTS_IPM_SLUMBER 0x00000600
227#define AHCI_PXSSTS_IPM_DEVSLEEP 0x00000800
232#define AHCI_PXCTL_DET_MASK 0x0000000F
233#define AHCI_PXCTL_SPD_MASK 0x000000F0
234#define AHCI_PXCTL_IPM_MASK 0x00000F00
236#define AHCI_PXCTL_DET_IDLE 0x00000000
237#define AHCI_PXCTL_DET_RESET 0x00000001
238#define AHCI_PXCTL_DET_DISABLE_SATA 0x00000004
240#define AHCI_PXCTL_SPD_LIMIT_NONE 0x00000000
241#define AHCI_PXCTL_SPD_LIMIT_SATA1 0x00000010
242#define AHCI_PXCTL_SPD_LIMIT_SATA2 0x00000020
243#define AHCI_PXCTL_SPD_LIMIT_SATA3 0x00000030
245#define AHCI_PXCTL_SPD_LIMIT_LEVEL 0x00000010
247#define AHCI_PXCTL_IPM_DISABLE_NONE 0x00000000
248#define AHCI_PXCTL_IPM_DISABLE_PARTIAL 0x00000100
249#define AHCI_PXCTL_IPM_DISABLE_SLUMBER 0x00000200
250#define AHCI_PXCTL_IPM_DISABLE_DEVSLEEP 0x00000400
252#define AHCI_PXCTL_IPM_DISABLE_ALL 0x00000700
257#define AHCI_FBS_ENABLE 0x00000001
258#define AHCI_FBS_DEV_ERROR_CLEAR 0x00000002
259#define AHCI_FBS_SINGLE_DEV_ERROR 0x00000004
260#define AHCI_FBS_ISSUE_MASK 0x00000F00
261#define AHCI_FBS_ACTIVE_DEV_OPT_MASK 0x0000F000
262#define AHCI_FBS_DEV_WITH_ERROR_MASK 0x000F0000
264#define AHCI_FBS_ISSUE_SHIFT 8
269#define AHCI_PXDEVSLP_ADSE 0x00000001
270#define AHCI_PXDEVSLP_DSP 0x00000002
271#define AHCI_PXDEVSLP_DETO_MASK 0x000003FC
272#define AHCI_PXDEVSLP_MDAT_MASK 0x00007C00
273#define AHCI_PXDEVSLP_DITO_MASK 0x01FF8000
274#define AHCI_PXDEVSLP_DM_MASK 0x1E000000
276#define AHCI_PORT_INTERRUPT_MASK \
298#define AHCI_VERSION_0_95 0x00000905
299#define AHCI_VERSION_1_0 0x00010000
300#define AHCI_VERSION_1_2 0x00010200
301#define AHCI_VERSION_1_3_0 0x00010300
302#define AHCI_VERSION_1_3_1 0x00010301
307#define AHCI_GHC_HR 0x00000001
308#define AHCI_GHC_IE 0x00000002
309#define AHCI_GHC_MRSM 0x00000004
310#define AHCI_GHC_AE 0x80000000
315#define AHCI_CAP_NP 0x0000001F
316#define AHCI_CAP_SXS 0x00000020
317#define AHCI_CAP_EMS 0x00000040
318#define AHCI_CAP_CCCS 0x00000080
319#define AHCI_CAP_NCS 0x00001F00
320#define AHCI_CAP_PSC 0x00002000
321#define AHCI_CAP_SSC 0x00004000
322#define AHCI_CAP_PMD 0x00008000
323#define AHCI_CAP_FBSS 0x00010000
324#define AHCI_CAP_SPM 0x00020000
325#define AHCI_CAP_SAM 0x00040000
326#define AHCI_CAP_RSV 0x00080000
327#define AHCI_CAP_ISS 0x00F00000
328#define AHCI_CAP_SCLO 0x01000000
329#define AHCI_CAP_SAL 0x02000000
330#define AHCI_CAP_SALP 0x04000000
331#define AHCI_CAP_SSS 0x08000000
332#define AHCI_CAP_SMPS 0x10000000
333#define AHCI_CAP_SSNTF 0x20000000
334#define AHCI_CAP_SNCQ 0x40000000
335#define AHCI_CAP_S64A 0x80000000
340#define AHCI_CAP2_BOH 0x00000001
341#define AHCI_CAP2_NVMP 0x00000002
342#define AHCI_CAP2_APST 0x00000004
343#define AHCI_CAP2_SDS 0x00000008
344#define AHCI_CAP2_SADM 0x00000010
345#define AHCI_CAP2_DESO 0x00000020
347#define AHCI_BOHC_BIOS_SEMAPHORE 0x00000001
348#define AHCI_BOHC_OS_SEMAPHORE 0x00000002
349#define AHCI_BOHC_SMI_ON_OS_OWNERSHIP_CHANGE 0x00000004
350#define AHCI_BOHC_OS_OWNERSHIP_CHANGE 0x00000008
351#define AHCI_BOHC_BIOS_BUSY 0x00000010
360#define UPDATE_COMMAND 0x80
361#define PMP_NUMBER 0x0F
469#define AHCI_COMMAND_HEADER_COMMAND_FIS_LENGTH 0x0000001F
470#define AHCI_COMMAND_HEADER_ATAPI 0x00000020
471#define AHCI_COMMAND_HEADER_WRITE 0x00000040
472#define AHCI_COMMAND_HEADER_PREFETCHABLE 0x00000080
473#define AHCI_COMMAND_HEADER_RESET 0x00000100
474#define AHCI_COMMAND_HEADER_BIST 0x00000200
475#define AHCI_COMMAND_HEADER_CLEAR_BUSY_UPON_OK 0x00000400
476#define AHCI_COMMAND_HEADER_PMP 0x0000F000
477#define AHCI_COMMAND_HEADER_PRDT_LENGTH 0xFFFF0000
479#define AHCI_COMMAND_HEADER_PRDT_LENGTH_SHIFT 16
480#define AHCI_COMMAND_HEADER_PMP_SHIFT 12
502#define AHCI_PRD_INTERRUPT_ON_COMPLETION 0x80000000
524#define AHCI_PORT_BASE(HbaIoBase, PortNumber) \
525 (PULONG)((ULONG_PTR)(HbaIoBase) + (PortNumber) * 0x80 + 0x100)
struct _AHCI_FIS_PIO_SETUP * PAHCI_FIS_PIO_SETUP
struct _AHCI_COMMAND_TABLE * PAHCI_COMMAND_TABLE
struct _AHCI_FIS_HOST_TO_DEVICE * PAHCI_FIS_HOST_TO_DEVICE
FORCEINLINE VOID AHCI_PORT_WRITE(_In_ PVOID PortIoBase, _In_ AHCI_PORT_REGISTER Register, _In_ ULONG Value)
struct _AHCI_COMMAND_TABLE AHCI_COMMAND_TABLE
struct _AHCI_COMMAND_LIST * PAHCI_COMMAND_LIST
struct _AHCI_PRD_TABLE_ENTRY * PAHCI_PRD_TABLE_ENTRY
struct _AHCI_FIS_PIO_SETUP AHCI_FIS_PIO_SETUP
enum _AHCI_PORT_REGISTER AHCI_PORT_REGISTER
struct _AHCI_RECEIVED_FIS AHCI_RECEIVED_FIS
enum _SATA_SCR_REGISTER SATA_SCR_REGISTER
struct _AHCI_COMMAND_HEADER * PAHCI_COMMAND_HEADER
struct _AHCI_FIS_DEVICE_TO_HOST * PAHCI_FIS_DEVICE_TO_HOST
FORCEINLINE ULONG AHCI_PORT_READ(_In_ PVOID PortIoBase, _In_ AHCI_PORT_REGISTER Register)
struct _AHCI_RECEIVED_FIS * PAHCI_RECEIVED_FIS
_AHCI_PORT_MULTIPLIER_REGISTER
@ PmpPhyEventCounterControl
struct _AHCI_COMMAND_LIST AHCI_COMMAND_LIST
struct _AHCI_FIS_SET_DEVICE_BITS AHCI_FIS_SET_DEVICE_BITS
FORCEINLINE ULONG AHCI_HBA_READ(_In_ PVOID HbaIoBase, _In_ AHCI_HOST_BUS_ADAPTER_REGISTER Register)
struct _AHCI_PRD_TABLE_ENTRY AHCI_PRD_TABLE_ENTRY
enum _AHCI_PORT_MULTIPLIER_REGISTER AHCI_PORT_MULTIPLIER_REGISTER
struct _AHCI_FIS_DEVICE_TO_HOST AHCI_FIS_DEVICE_TO_HOST
FORCEINLINE VOID AHCI_HBA_WRITE(_In_ PVOID HbaIoBase, _In_ AHCI_HOST_BUS_ADAPTER_REGISTER Register, _In_ ULONG Value)
struct _AHCI_FIS_SET_DEVICE_BITS * PAHCI_FIS_SET_DEVICE_BITS
struct _AHCI_FIS_HOST_TO_DEVICE AHCI_FIS_HOST_TO_DEVICE
struct _AHCI_COMMAND_HEADER AHCI_COMMAND_HEADER
enum _AHCI_HOST_BUS_ADAPTER_REGISTER AHCI_HOST_BUS_ADAPTER_REGISTER
_AHCI_HOST_BUS_ADAPTER_REGISTER
@ HbaEnclosureManagementLocation
@ HbaEnclosureManagementControl
#define WRITE_REGISTER_ULONG(r, v)
#define READ_REGISTER_ULONG(r)
ULONG CommandTableBaseLow
ULONG CommandTableBaseHigh
AHCI_COMMAND_HEADER CommandHeader[ANYSIZE_ARRAY]
AHCI_FIS_HOST_TO_DEVICE HostToDeviceFis
AHCI_PRD_TABLE_ENTRY PrdTable[ANYSIZE_ARRAY]
AHCI_FIS_DEVICE_TO_HOST DeviceToHostFis
AHCI_FIS_SET_DEVICE_BITS SetDeviceBitsFis
AHCI_FIS_PIO_SETUP PioSetupFis
#define FIELD_OFFSET(t, f)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_Reserved_ PVOID Reserved