mirror of
https://github.com/reactos/reactos.git
synced 2024-11-19 13:33:42 +00:00
291 lines
7.4 KiB
C
291 lines
7.4 KiB
C
#pragma once
|
|
|
|
//
|
|
// Helper Macros
|
|
//
|
|
#define PASTE2(x,y) x ## y
|
|
#define POINTER_TO_(x) PASTE2(P,x)
|
|
#define READ_FROM(x) PASTE2(READ_PORT_, x)
|
|
#define WRITE_TO(x) PASTE2(WRITE_PORT_, x)
|
|
|
|
//
|
|
// Declares a PCI Register Read/Write Routine
|
|
//
|
|
#define TYPE_DEFINE(x, y) \
|
|
ULONG \
|
|
NTAPI \
|
|
x( \
|
|
IN PPCIPBUSDATA BusData, \
|
|
IN y PciCfg, \
|
|
IN PUCHAR Buffer, \
|
|
IN ULONG Offset \
|
|
)
|
|
#define TYPE1_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS);
|
|
#define TYPE2_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS);
|
|
|
|
//
|
|
// Defines a PCI Register Read/Write Type 1 Routine Prologue and Epilogue
|
|
//
|
|
#define TYPE1_START(x, y) \
|
|
TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS) \
|
|
{ \
|
|
ULONG i = Offset % sizeof(ULONG); \
|
|
PciCfg->u.bits.RegisterNumber = Offset / sizeof(ULONG); \
|
|
WRITE_PORT_ULONG(BusData->Config.Type1.Address, PciCfg->u.AsULONG);
|
|
#define TYPE1_END(y) \
|
|
return sizeof(y); }
|
|
#define TYPE2_END TYPE1_END
|
|
|
|
//
|
|
// PCI Register Read Type 1 Routine
|
|
//
|
|
#define TYPE1_READ(x, y) \
|
|
TYPE1_START(x, y) \
|
|
*((POINTER_TO_(y))Buffer) = \
|
|
READ_FROM(y)((POINTER_TO_(y))(BusData->Config.Type1.Data + i)); \
|
|
TYPE1_END(y)
|
|
|
|
//
|
|
// PCI Register Write Type 1 Routine
|
|
//
|
|
#define TYPE1_WRITE(x, y) \
|
|
TYPE1_START(x, y) \
|
|
WRITE_TO(y)((POINTER_TO_(y))(BusData->Config.Type1.Data + i), \
|
|
*((POINTER_TO_(y))Buffer)); \
|
|
TYPE1_END(y)
|
|
|
|
//
|
|
// Defines a PCI Register Read/Write Type 2 Routine Prologue and Epilogue
|
|
//
|
|
#define TYPE2_START(x, y) \
|
|
TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS) \
|
|
{ \
|
|
PciCfg->u.bits.RegisterNumber = (USHORT)Offset;
|
|
|
|
//
|
|
// PCI Register Read Type 2 Routine
|
|
//
|
|
#define TYPE2_READ(x, y) \
|
|
TYPE2_START(x, y) \
|
|
*((POINTER_TO_(y))Buffer) = \
|
|
READ_FROM(y)((POINTER_TO_(y))(ULONG)PciCfg->u.AsUSHORT); \
|
|
TYPE2_END(y)
|
|
|
|
//
|
|
// PCI Register Write Type 2 Routine
|
|
//
|
|
#define TYPE2_WRITE(x, y) \
|
|
TYPE2_START(x, y) \
|
|
WRITE_TO(y)((POINTER_TO_(y))(ULONG)PciCfg->u.AsUSHORT, \
|
|
*((POINTER_TO_(y))Buffer)); \
|
|
TYPE2_END(y)
|
|
|
|
typedef struct _PCIPBUSDATA
|
|
{
|
|
PCIBUSDATA CommonData;
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
PULONG Address;
|
|
ULONG Data;
|
|
} Type1;
|
|
struct
|
|
{
|
|
PUCHAR CSE;
|
|
PUCHAR Forward;
|
|
ULONG Base;
|
|
} Type2;
|
|
} Config;
|
|
ULONG MaxDevice;
|
|
} PCIPBUSDATA, *PPCIPBUSDATA;
|
|
|
|
typedef ULONG
|
|
(NTAPI *FncConfigIO)(
|
|
IN PPCIPBUSDATA BusData,
|
|
IN PVOID State,
|
|
IN PUCHAR Buffer,
|
|
IN ULONG Offset
|
|
);
|
|
|
|
typedef VOID
|
|
(NTAPI *FncSync)(
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN PCI_SLOT_NUMBER Slot,
|
|
IN PKIRQL Irql,
|
|
IN PVOID State
|
|
);
|
|
|
|
typedef VOID
|
|
(NTAPI *FncReleaseSync)(
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN KIRQL Irql
|
|
);
|
|
|
|
typedef struct _PCI_CONFIG_HANDLER
|
|
{
|
|
FncSync Synchronize;
|
|
FncReleaseSync ReleaseSynchronzation;
|
|
FncConfigIO ConfigRead[3];
|
|
FncConfigIO ConfigWrite[3];
|
|
} PCI_CONFIG_HANDLER, *PPCI_CONFIG_HANDLER;
|
|
|
|
typedef struct _PCI_REGISTRY_INFO_INTERNAL
|
|
{
|
|
UCHAR MajorRevision;
|
|
UCHAR MinorRevision;
|
|
UCHAR NoBuses;
|
|
UCHAR HardwareMechanism;
|
|
ULONG ElementCount;
|
|
PCI_CARD_DESCRIPTOR CardList[ANYSIZE_ARRAY];
|
|
} PCI_REGISTRY_INFO_INTERNAL, *PPCI_REGISTRY_INFO_INTERNAL;
|
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
VOID
|
|
NTAPI
|
|
HalpPCISynchronizeType1(
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN PCI_SLOT_NUMBER Slot,
|
|
IN PKIRQL Irql,
|
|
IN PPCI_TYPE1_CFG_BITS PciCfg
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
HalpPCIReleaseSynchronzationType1(
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN KIRQL Irql
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
HalpPCISynchronizeType2(
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN PCI_SLOT_NUMBER Slot,
|
|
IN PKIRQL Irql,
|
|
IN PPCI_TYPE2_ADDRESS_BITS PciCfg
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
HalpPCIReleaseSynchronzationType2(
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN KIRQL Irql
|
|
);
|
|
|
|
TYPE1_DEFINE(HalpPCIReadUcharType1);
|
|
TYPE1_DEFINE(HalpPCIReadUshortType1);
|
|
TYPE1_DEFINE(HalpPCIReadUlongType1);
|
|
TYPE2_DEFINE(HalpPCIReadUcharType2);
|
|
TYPE2_DEFINE(HalpPCIReadUshortType2);
|
|
TYPE2_DEFINE(HalpPCIReadUlongType2);
|
|
TYPE1_DEFINE(HalpPCIWriteUcharType1);
|
|
TYPE1_DEFINE(HalpPCIWriteUshortType1);
|
|
TYPE1_DEFINE(HalpPCIWriteUlongType1);
|
|
TYPE2_DEFINE(HalpPCIWriteUcharType2);
|
|
TYPE2_DEFINE(HalpPCIWriteUshortType2);
|
|
TYPE2_DEFINE(HalpPCIWriteUlongType2);
|
|
|
|
BOOLEAN
|
|
NTAPI
|
|
HalpValidPCISlot(
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN PCI_SLOT_NUMBER Slot
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
HalpReadPCIConfig(
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN PCI_SLOT_NUMBER Slot,
|
|
IN PVOID Buffer,
|
|
IN ULONG Offset,
|
|
IN ULONG Length
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
HalpWritePCIConfig(
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN PCI_SLOT_NUMBER Slot,
|
|
IN PVOID Buffer,
|
|
IN ULONG Offset,
|
|
IN ULONG Length
|
|
);
|
|
|
|
ULONG
|
|
NTAPI
|
|
HalpGetSystemInterruptVector(
|
|
ULONG BusNumber,
|
|
ULONG BusInterruptLevel,
|
|
ULONG BusInterruptVector,
|
|
PKIRQL Irql,
|
|
PKAFFINITY Affinity
|
|
);
|
|
|
|
ULONG
|
|
NTAPI
|
|
HalpGetCmosData(
|
|
IN ULONG BusNumber,
|
|
IN ULONG SlotNumber,
|
|
IN PVOID Buffer,
|
|
IN ULONG Length
|
|
);
|
|
|
|
ULONG
|
|
NTAPI
|
|
HalpSetCmosData(
|
|
IN ULONG BusNumber,
|
|
IN ULONG SlotNumber,
|
|
IN PVOID Buffer,
|
|
IN ULONG Length
|
|
);
|
|
|
|
ULONG
|
|
NTAPI
|
|
HalpGetPCIData(
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN PBUS_HANDLER RootBusHandler,
|
|
IN PCI_SLOT_NUMBER SlotNumber,
|
|
IN PUCHAR Buffer,
|
|
IN ULONG Offset,
|
|
IN ULONG Length
|
|
);
|
|
|
|
ULONG
|
|
NTAPI
|
|
HalpSetPCIData(
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN PBUS_HANDLER RootBusHandler,
|
|
IN PCI_SLOT_NUMBER SlotNumber,
|
|
IN PUCHAR Buffer,
|
|
IN ULONG Offset,
|
|
IN ULONG Length
|
|
);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
HalpAssignPCISlotResources(
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN PBUS_HANDLER RootHandler,
|
|
IN PUNICODE_STRING RegistryPath,
|
|
IN PUNICODE_STRING DriverClassName OPTIONAL,
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN PDEVICE_OBJECT DeviceObject OPTIONAL,
|
|
IN ULONG Slot,
|
|
IN OUT PCM_RESOURCE_LIST *pAllocatedResources
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
HalpInitializePciBus(
|
|
VOID
|
|
);
|
|
|
|
extern ULONG HalpBusType;
|
|
extern BOOLEAN HalpPCIConfigInitialized;
|
|
extern BUS_HANDLER HalpFakePciBusHandler;
|
|
extern ULONG HalpMinPciBus, HalpMaxPciBus;
|
|
|
|
/* EOF */
|