Pci reg access example.
#define LSZ sizeof(ULONG)
#define HEADERSIZE (FIELD_OFFSET (PCI_COMMON_CONFIG, DeviceSpecific)) / LSZ
typedef struct {
ULONG Reserved[HEADERSIZE];
} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
PCI_COMMON_HEADER Header;
PCI_COMMON_CONFIG *pPciConfig = (PCI_COMMON_CONFIG *)&Header;
PCI_PM_CAPABILITY PowerMgmtCapability;
PCI_PM_CAPABILITY *pPowerMgmtCapability = &Capability;
UCHAR CapabilityOffset;
BusInterface.GetBusData(Context,
PCI_WHICHSPACE_CONFIG,
pPciConfig,
0,
sizeof(PCI_COMMON_HEADER));
if ((pPciConfig->Status &
PCI_STATUS_CAPABILITIES_LIST) == 0) {
return(STATUS_NOT_IMPLEMENTED);
}
if ((pPciConfig->HeaderType &
(~PCI_MULTIFUNCTION)) == PCI_BRIDGE_TYPE) {
CapabilityOffset =
pPciConfig->u.type1.CapabilitiesPtr;
} else if ((pPciConfig->HeaderType &
(~PCI_MULTIFUNCTION)) == PCI_CARDBUS_TYPE) {
CapabilityOffset =
pPciConfig->u.type2.CapabilitiesPtr;
} else {
CapabilityOffset =
pPciConfig->u.type0.CapabilitiesPtr;
}
while (CapabilityOffset != 0) {
BusInterface.GetBusData(Context,
PCI_WHICHSPACE_CONFIG,
pPowerMgmtCapability,
CapabilityOffset,
sizeof(PCI_CAPABILITIES_HEADER));
if (Capability->Header.CapabilityID ==
PCI_CAPABILITY_ID_POWER_MANAGEMENT) {
break;
} else {
CapabilityOffset = Capability->Header.Next;
}
}
if (CapabilityOffset == 0) {
return(STATUS_NOT_IMPLEMENTED);
}
BusInterface.GetBusData(Context,
PCI_WHICHSPACE_CONFIG,
& (pPowerMgmtCapability->Header) + 1,
CapabilityOffset +
sizeof(PCI_CAPABILITIES_HEADER),
sizeof(PCI_PM_CAPABILITY) -
sizeof(PCI_CAPABILITIES_HEADER)
);
ref
https://docs.microsoft.com/en-gb/windows-hardware/drivers/pci/accessing-pci-device-configuration-space