NT4/private/ntos/nthals/halalpha/halp.h

1096 lines
17 KiB
C
Raw Normal View History

2001-01-01 00:00:00 +01:00
/*++ BUILD Version: 0003 // Increment this if a change has global effects
Copyright (c) 1991 Microsoft Corporation
Copyright (c) 1992,1993 Digital Equipment Corporation
Module Name:
halp.h
Abstract:
This header file defines the private Hardware Architecture Layer (HAL)
interfaces.
Author:
David N. Cutler (davec) 25-Apr-1991
Miche Baker-Harvey (miche) 22-Apr-1992
Revision History:
09-Jul-1992 Jeff McLeman (mcleman)
If processor is an Alpha, include XXHALP.C for Alpha.
24-Sep-1993 Joe Notarangelo
Incorporate definitions from xxhalp.h and jxhalp.h.
Restructure so that related modules are together.
5-Jan-1994 Eric Rehm
Incorport support for PCI and IoAssignResources.
--*/
#ifndef _HALP_
#define _HALP_
#include "nthal.h"
#include "hal.h"
#include "pci.h"
#include "errframe.h"
//
// Declare HAL spinlocks.
//
extern KSPIN_LOCK HalpBeepLock;
extern KSPIN_LOCK HalpDisplayAdapterLock;
extern KSPIN_LOCK HalpSystemInterruptLock;
//
// Define external references.
//
extern ULONG HalpClockFrequency;
extern ULONG HalpClockMegaHertz;
extern ULONG HalpProfileCountRate;
extern PADAPTER_OBJECT MasterAdapterObject;
extern BOOLEAN LessThan16Mb;
extern KAFFINITY HalpActiveProcessors;
//
// Map buffer prameters. These are initialized in HalInitSystem
//
extern PHYSICAL_ADDRESS HalpMapBufferPhysicalAddress;
extern ULONG HalpMapBufferSize;
extern ULONG HalpBusType;
//
// Define global data used to relate PCI devices to their interrupt
// vector.
//
extern ULONG *HalpPCIPinToLineTable;
//
// Define global data used to locate the EISA control space and the realtime
// clock registers.
//
extern PVOID HalpEisaControlBase;
extern PVOID HalpEisaIntAckBase;
extern PVOID HalpCMOSRamBase;
extern PVOID HalpRtcAddressPort;
extern PVOID HalpRtcDataPort;
extern POBJECT_TYPE *IoAdapterObjectType;
//
// Determine if a virtual address is really a physical address.
//
#define HALP_IS_PHYSICAL_ADDRESS(Va) \
((((ULONG)Va >= KSEG0_BASE) && ((ULONG)Va < KSEG2_BASE)) ? TRUE : FALSE)
//
// Define the different address spaces.
//
typedef enum _ADDRESS_SPACE_TYPE{
BusMemory=0,
BusIo = 1,
UserBusMemory = 2,
UserBusIo = 3,
KernelPciDenseMemory = 4,
UserPciDenseMemory = 6,
} ADDRESS_SPACE_TYPE, *PADDRESS_SPACE_TYPE;
//
// Prototype for Memory Size determination routine
//
ULONGLONG
HalpGetMemorySize(
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
ULONGLONG
HalpGetContiguousMemorySize(
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
//
// Prototype for BCache Size determination routine
//
ULONG
HalpGetBCacheSize(
ULONGLONG ContiguousMemorySize
);
//
// Define initialization routine prototypes.
//
BOOLEAN
HalpCreateDmaStructures (
PLOADER_PARAMETER_BLOCK LoaderBlock
);
VOID
HalpEstablishErrorHandler(
VOID
);
VOID
HalpInitializeClockInterrupts(
VOID
);
VOID
HalpInitializeProfiler(
VOID
);
BOOLEAN
HalpInitializeDisplay (
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
BOOLEAN
HalpInitializeInterrupts (
VOID
);
VOID
HalpInitializeMachineDependent(
IN ULONG Phase,
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
BOOLEAN
HalpMapIoSpace (
VOID
);
ULONG
HalpMapDebugPort (
IN ULONG ComPort,
OUT PULONG ReadQva,
OUT PULONG WriteQva
);
VOID
HalpSetTimeIncrement(
VOID
);
VOID
HalpParseLoaderBlock(
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
VOID
HalpInitializeProcessorParameters(
VOID
);
//
// Error Frame Initialization and Support Routines
//
VOID
HalpAllocateUncorrectableFrame(
VOID
);
VOID
HalpGetMachineDependentErrorFrameSizes(
PULONG RawProcessorSize,
PULONG RawSystemInfoSize
);
VOID
HalpInitializeUncorrectableErrorFrame (
VOID
);
VOID
HalpGetProcessorInfo(
PPROCESSOR_INFO pProcessorInfo
);
VOID
HalpGetSystemInfo(
SYSTEM_INFORMATION *SystemInfo
);
//
// Define profiler function prototypes.
//
NTSTATUS
HalpProfileSourceInformation (
OUT PVOID Buffer,
IN ULONG BufferLength,
OUT PULONG ReturnedLength
);
NTSTATUS
HalpProfileSourceInterval (
OUT PVOID Buffer,
IN ULONG BufferLength
);
//
// Define interrupt function prototypes.
//
VOID
HalpProgramIntervalTimer(
IN ULONG RateSelect
);
VOID
HalpClockInterrupt (
VOID
);
VOID
HalpSecondaryClockInterrupt (
VOID
);
VOID
HalpIpiInterruptHandler (
VOID
);
BOOLEAN
HalpDmaDispatch(
IN PKINTERRUPT Interrupt,
IN PVOID ServiceContext
);
VOID
HalpPerformanceCounter0Interrupt (
VOID
);
VOID
HalpPerformanceCounter1Interrupt (
VOID
);
VOID
HalpPerformanceCounter2Interrupt (
VOID
);
VOID
HalpStallInterrupt (
VOID
);
VOID
HalpVideoReboot(
VOID
);
//
// Define microprocessor-specific function prototypes and structures.
//
//
// 21064 (EV4) processor family.
//
typedef enum _EV4Irq{
Irq0 = 0,
Irq1 = 1,
Irq2 = 2,
Irq3 = 3,
Irq4 = 4,
Irq5 = 5,
MaximumIrq
} EV4Irq, *PEV4Irq;
typedef struct _EV4IrqStatus{
ULONG Vector;
BOOLEAN Enabled;
KIRQL Irql;
UCHAR Priority;
} EV4IrqStatus, *PEV4IrqStatus;
typedef struct _EV4ProfileCount {
ULONG ProfileCount[2];
ULONG ProfileCountReload[2];
} EV4ProfileCount, *PEV4ProfileCount;
VOID
HalpInitialize21064Interrupts(
VOID
);
VOID
HalpDisable21064HardwareInterrupt(
IN ULONG Irq
);
VOID
HalpDisable21064SoftwareInterrupt(
IN KIRQL Irql
);
VOID
HalpDisable21064PerformanceInterrupt(
IN ULONG Vector
);
VOID
HalpEnable21064HardwareInterrupt(
IN ULONG Irq,
IN KIRQL Irql,
IN ULONG Vector,
IN UCHAR Priority
);
VOID
HalpEnable21064SoftwareInterrupt(
IN KIRQL Irql
);
VOID
HalpInitialize21064Interrupts(
VOID
);
VOID
HalpEnable21064PerformanceInterrupt(
IN ULONG Vector,
IN KIRQL Irql
);
ULONG
HalpGet21064PerformanceVector(
IN ULONG BusInterruptLevel,
OUT PKIRQL Irql
);
ULONG
HalpGet21064CorrectableVector(
IN ULONG BusInterruptLevel,
OUT PKIRQL Irql
);
//
// 21164 processor family.
//
#ifdef EV5
typedef struct _EV5ProfileCount {
ULONG ProfileCount[3];
ULONG ProfileCountReload[3];
} EV5ProfileCount, *PEV5ProfileCount;
VOID
HalpInitialize21164Interrupts(
VOID
);
VOID
HalpStart21164Interrupts(
VOID
);
ULONG
HalpGet21164PerformanceVector(
IN ULONG BusInterruptLevel,
OUT PKIRQL Irql
);
ULONGLONG
HalpRead21164PerformanceCounter(
VOID
);
VOID
HalpWrite21164PerformanceCounter(
ULONGLONG PmCtr,
ULONG CBOXMux1,
ULONG CBOXMux2
);
ULONG
HalpGet21164CorrectableVector(
IN ULONG BusInterruptLevel,
OUT PKIRQL Irql
);
#endif // EV5 specific definitions
//
// Define the context structure for use by interrupt service routines.
//
typedef BOOLEAN (*PSECONDARY_DISPATCH)(
PVOID InterruptRoutine,
PKTRAP_FRAME TrapFrame
);
//
// Define memory utility function prototypes.
//
ULONG
HalpAllocPhysicalMemory(
IN PLOADER_PARAMETER_BLOCK LoaderBlock,
IN ULONG MaxPhysicalAddress,
IN ULONG NumberOfPages,
IN BOOLEAN bAlignOn64k
);
PVOID
HalpMapPhysicalMemory(
IN PVOID PhysicalAddress,
IN ULONG NumberOfPages
);
PVOID
HalpRemapVirtualAddress(
IN PVOID VirtualAddress,
IN PVOID PhysicalAddress
);
#if HALDBG
VOID
HalpDumpMemoryDescriptors(
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
#endif
//
// Low-level routine interfaces.
//
VOID
HalpReboot(
VOID
);
VOID
HalpImb(
VOID
);
VOID
HalpMb(
VOID
);
ULONG
HalpRpcc(
VOID
);
MCES
HalpReadMces(
VOID
);
MCES
HalpWriteMces(
IN MCES Mces
);
VOID
HalpWritePerformanceCounter(
IN ULONG PerformanceCounter,
IN BOOLEAN Enable,
IN ULONG MuxControl OPTIONAL,
IN ULONG EventCount OPTIONAL
);
//
// Define synonym for KeStallExecutionProcessor.
//
#define HalpStallExecution KeStallExecutionProcessor
//
// Define Bus Handler support function prototypes.
//
VOID
HalpRegisterInternalBusHandlers (
VOID
);
ULONG
HalpGetSystemInterruptVector(
IN PBUS_HANDLER BusHandler,
IN PBUS_HANDLER RootHandler,
IN ULONG BusInterruptLevel,
IN ULONG BusInterruptVector,
OUT PKIRQL Irql,
OUT PKAFFINITY Affinity
);
BOOLEAN
HalpTranslateSystemBusAddress(
IN PBUS_HANDLER BusHandler,
IN PBUS_HANDLER RootHandler,
IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress
);
VOID
HalpAdjustResourceListUpperLimits (
IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList,
IN LARGE_INTEGER MaximumPortAddress,
IN LARGE_INTEGER MaximumMemoryAddress,
IN ULONG MaximumInterruptVector,
IN ULONG MaximumDmaChannel
);
//
// Define SIO support function prototypes.
//
VOID
HalpInitializeSioInterrupts(
VOID
);
VOID
HalpEnableSioInterrupt(
IN ULONG Vector,
IN KINTERRUPT_MODE InterruptMode
);
VOID
HalpDisableSioInterrupt(
IN ULONG Vector
);
BOOLEAN
HalpSioDispatch(
VOID
);
//
// Define EISA support function prototypes.
//
BOOLEAN
HalpInitializeEisaInterrupts(
VOID
);
VOID
HalpEnableEisaInterrupt(
IN ULONG Vector,
IN KINTERRUPT_MODE InterruptMode
);
VOID
HalpDisableEisaInterrupt(
IN ULONG Vector
);
BOOLEAN
HalpEisaDispatch(
IN PKINTERRUPT Interrupt,
IN PVOID ServiceContext,
IN PKTRAP_FRAME TrapFrame
);
BOOLEAN
HalpEisaInterruptHandler(
IN PKINTERRUPT Interrupt,
IN PVOID ServiceContext
);
VOID
HalpEisaInitializeDma(
VOID
);
PADAPTER_OBJECT
HalpAllocateAdapter(
VOID
);
PADAPTER_OBJECT
HalpAllocateEisaAdapter(
IN PDEVICE_DESCRIPTION DeviceDescription,
OUT PULONG NumberOfMapRegisters
);
BOOLEAN
HalpMapEisaTransfer(
IN PADAPTER_OBJECT AdapterObject,
IN ULONG LogicalAddress,
IN ULONG Length,
IN BOOLEAN WriteToDevice
);
BOOLEAN
HalpFlushEisaAdapter(
IN PADAPTER_OBJECT AdapterObject,
IN PMDL Mdl,
IN PVOID MapRegisterBase,
IN PVOID CurrentVa,
IN ULONG Length,
IN BOOLEAN WriteToDevice
);
ULONG
HalpReadEisaDmaCounter(
IN PADAPTER_OBJECT AdapterObject
);
ULONG
HalpGetEisaData(
IN PBUS_HANDLER BusHandler,
IN PBUS_HANDLER RootHandler,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length
);
NTSTATUS
HalpAdjustEisaResourceList (
IN PBUS_HANDLER BusHandler,
IN PBUS_HANDLER RootHandler,
IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList
);
NTSTATUS
HalpAdjustIsaResourceList (
IN PBUS_HANDLER BusHandler,
IN PBUS_HANDLER RootHandler,
IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList
);
//
// Define PCI support function prototypes.
//
VOID
HalpInitializePCIBus (
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
PBUS_HANDLER
HalpAllocateAndInitPCIBusHandler (
IN ULONG BusNo,
IN ULONG HwBusNo,
IN BOOLEAN BusIsAcrossPPB,
IN ULONG PPBBusNumber,
IN PCI_SLOT_NUMBER PPBSlotNumber
);
VOID
HalpRegisterPCIInstallHandler(
IN PINSTALL_BUS_HANDLER MachineSpecificPCIInstallHandler
);
NTSTATUS
HalpDefaultPCIInstallHandler(
IN PBUS_HANDLER Bus
);
VOID
HalpDeterminePCIDevicesPresent(
IN PBUS_HANDLER Bus
);
BOOLEAN
HalpInitializePCIInterrupts(
VOID
);
VOID
HalpEnablePCIInterrupt(
IN ULONG Vector
);
VOID
HalpDisablePCIInterrupt(
IN ULONG Vector
);
BOOLEAN
HalpPCIInterruptHandler(
IN PKINTERRUPT Interrupt,
IN PVOID ServiceContext
);
//
// Environment variable support
//
ARC_STATUS
HalpReadNVRamBuffer(
OUT PCHAR DataPtr,
IN PCHAR NvRamPtr,
IN ULONG Length
);
ARC_STATUS
HalpWriteNVRamBuffer(
IN PCHAR NvRamPtr,
IN PCHAR DataPtr,
IN ULONG Length
);
ARC_STATUS
HalpCopyNVRamBuffer(
IN PCHAR NvDestPtr,
IN PCHAR NvSrcPtr,
IN ULONG Length
);
#if defined(TAGGED_NVRAM)
//
// NVRAM API
//
UCHAR
HalpGetNVRamUchar(
IN ULONG Offset
);
VOID
HalpSetNVRamUchar(
IN ULONG Offset,
IN UCHAR Data
);
USHORT
HalpGetNVRamUshort(
IN ULONG Offset
);
VOID
HalpSetNVRamUshort(
IN ULONG Offset,
IN USHORT Data
);
ULONG
HalpGetNVRamUlong(
IN ULONG Offset
);
VOID
HalpSetNVRamUlong(
IN ULONG Offset,
IN ULONG Data
);
VOID
HalpMoveMemoryToNVRam(
IN ULONG Offset,
IN PVOID Data,
IN ULONG Length
);
VOID
HalpMoveNVRamToMemory(
IN PVOID Data,
IN ULONG Offset,
IN ULONG Length
);
VOID
HalpMoveNVRamToNVRam(
IN ULONG Destination,
IN ULONG Source,
IN ULONG Length
);
ULONG
HalpGetNVRamStringLength(
IN ULONG Offset
);
VOID
HalpMoveMemoryStringToNVRam(
IN ULONG Offset,
IN PCHAR Data
);
VOID
HalpMoveNVRamStringToMemory(
IN PUCHAR Data,
IN ULONG Offset
);
VOID
HalpZeroNVRam(
IN ULONG Offset,
IN ULONG Length
);
ULONG
HalpComputeNVRamChecksum(
IN ULONG Offset,
IN ULONG Length
);
BOOLEAN
HalpIsNVRamRegion0Valid(
VOID
);
BOOLEAN
HalpSynchronizeNVRamRegion0(
IN BOOLEAN RecomputeChecksum
);
BOOLEAN
HalpInitializeNVRamRegion0(
IN BOOLEAN Synchronize
);
ULONG
HalpGetNVRamFwConfigOffset(
VOID
);
ULONG
HalpGetNVRamFwConfigLength(
VOID
);
ULONG
HalpGetNVRamLanguageOffset(
VOID
);
ULONG
HalpGetNVRamLanguageLength(
VOID
);
ULONG
HalpGetNVRamEnvironmentOffset(
VOID
);
ULONG
HalpGetNVRamEnvironmentLength(
VOID
);
#if defined(EISA_PLATFORM)
BOOLEAN
HalpIsNVRamRegion1Valid(
VOID
);
BOOLEAN
HalpSynchronizeNVRamRegion1(
IN BOOLEAN RecomputeChecksum
);
BOOLEAN
HalpInitializeNVRamRegion1(
IN BOOLEAN Synchronize
);
#endif // EISA_PLATFORM
#endif // TAGGED_NVRAM
//
// Error handling function prototype.
//
typedef
BOOLEAN
KBUS_ERROR_ROUTINE(
IN struct _EXCEPTION_RECORD *ExceptionRecord,
IN struct _KEXCEPTION_FRAME *ExceptionFrame,
IN struct _KTRAP_FRAME *TrapFrame
);
KBUS_ERROR_ROUTINE HalMachineCheck;
VOID
HalpInitializeMachineChecks(
IN BOOLEAN ReportCorrectableErrors
);
//
// Low-level I/O function prototypes.
//
VOID
HalpAcknowledgeClockInterrupt(
VOID
);
UCHAR
HalpAcknowledgeEisaInterrupt(
IN PVOID ServiceContext
);
UCHAR
HalpReadClockRegister(
IN UCHAR Register
);
VOID
HalpWriteClockRegister(
IN UCHAR Register,
IN UCHAR Value
);
UCHAR
READ_CONFIG_UCHAR(
IN PVOID ConfigurationAddress,
IN ULONG ConfigurationType
);
USHORT
READ_CONFIG_USHORT(
IN PVOID ConfigurationAddress,
IN ULONG ConfigurationType
);
ULONG
READ_CONFIG_ULONG(
IN PVOID ConfigurationAddress,
IN ULONG ConfigurationType
);
VOID
WRITE_CONFIG_UCHAR(
IN PVOID ConfigurationAddress,
IN UCHAR ConfigurationData,
IN ULONG ConfigurationType
);
VOID
WRITE_CONFIG_USHORT(
IN PVOID ConfigurationAddress,
IN USHORT ConfigurationData,
IN ULONG ConfigurationType
);
VOID
WRITE_CONFIG_ULONG(
IN PVOID ConfigurationAddress,
IN ULONG ConfigurationData,
IN ULONG ConfigurationType
);
//
// Define the I/O superpage enable VA base.
//
#define SUPERPAGE_ENABLE ((ULONGLONG)0xfffffc0000000000)
//
// Numeric constants used in the HAL.
//
#define __1K (0x400)
#define __2K (0x800)
#define __4K (0x1000)
#define __8K (0x2000)
#define __16K (0x4000)
#define __32K (0x8000)
#define __64K (0x10000)
#define __128K (0x20000)
#define __256K (0x40000)
#define __512K (0x80000)
#define __1MB (0x100000)
#define __2MB (0x200000)
#define __4MB (0x400000)
#define __8MB (0x800000)
#define __16MB (0x1000000)
#define __32MB (0x2000000)
#define __64MB (0x4000000)
#define __128MB (0x8000000)
#define __256MB (0x10000000)
#define __512MB (0x20000000)
#define __1GB (0x40000000)
#define __2GB (0x80000000)
//
// CPU mask values. Used to interpret cpu bitmap values.
//
#define HAL_CPU0_MASK ((ULONG)0x1)
#define HAL_CPU1_MASK ((ULONG)0x2)
#define HAL_CPU2_MASK ((ULONG)0x4)
#define HAL_CPU3_MASK ((ULONG)0x8)
//
// HAL Debugging Support.
//
#if HALDBG
#define DebugPrint(x) HalDebugPrint x
VOID
HalDebugPrint(
ULONG DebugPrintLevel,
PCCHAR DebugMessage,
...
);
#else //HALDBG
#define DebugPrint(x)
#endif //HALDBG
//
// Define HAL debugging masks.
//
//
// Trace IoMapTransfer, IoFlushAdapterBuffers
//
#define HALDBG_IOMT (0x1)
//
// Trace Map Register allocations and frees
//
#define HALDBG_MAPREG (0x2)
//
// Include machine-dependent definitions.
//
// N.B. - Each platform that includes this file must have a machdep.h
// include file in its private directory.
//
#include <machdep.h>
#endif // _HALP_