windows-nt/Source/XPSP1/NT/public/processorkit/inc/ntacpi.h
2020-09-26 16:20:57 +08:00

466 lines
11 KiB
C

;/*++
;
; Copyright (c) Microsoft Corporation. All rights reserved.
;
; Module Name:
;
; ntacpi.h
;
; Abstract:
;
;
; This module contains definitions specific to the HAL's
; ACPI function.
;
; Author:
;
; Jake Oshins (jakeo) Feb. 18, 1997
;
; Revision History:
;
;-
if 0 ; Begin C only code */
#ifndef _ACPI_H_
#define _ACPI_H_
#define SLEEP_STATE_FLUSH_CACHE 0x1
#define SLEEP_STATE_FIRMWARE_RESTART 0x2
#define SLEEP_STATE_SAVE_MOTHERBOARD 0x4
#define SLEEP_STATE_OFF 0x8
#define SLEEP_STATE_RESTART_OTHER_PROCESSORS 0x10
typedef struct {
union {
struct {
ULONG Pm1aVal:4;
ULONG Pm1bVal:4;
ULONG Flags:24;
} bits;
ULONG AsULONG;
};
} SLEEP_STATE_CONTEXT, *PSLEEP_STATE_CONTEXT;
//
// ACPI Register definitions
//
#define P_LVL2 4
#define PBLK_THT_EN 0x10
//
// Register layout of PM1x_EVT register
// Note also defined in acpiregs.h
//
#define PM1_PWRBTN_STS_BIT 8
#define PM1_PWRBTN_STS (1 << PM1_PWRBTN_STS_BIT)
//
// Register layout of PM1x_CTL
//
#define SCI_EN 1
#define BM_RLD 2
#define CTL_IGNORE 0x200
#define SLP_TYP_SHIFT 10
#define SLP_EN 0x2000
#define CTL_PRESERVE (SCI_EN + BM_RLD + CTL_IGNORE)
#define PM_TMR_FREQ 3579545
//
// HAL's table
//
typedef enum {
HalAcpiTimerInit,
HalAcpiTimerInterrupt,
HalAcpiMachineStateInit,
HalAcpiQueryFlags,
HalPicStateIntact,
HalRestorePicState,
HalPciInterfaceReadConfig,
HalPciInterfaceWriteConfig,
HalSetVectorState,
HalGetIOApicVersion,
HalSetMaxLegacyPciBusNumber,
HalIsVectorValid,
HalAcpiMaxFunction
} HAL_DISPATCH_FUNCTION;
typedef
VOID
(*pHalAcpiTimerInit)(
IN ULONG TimerPort,
IN BOOLEAN TimerValExt
);
typedef
VOID
(*pHalAcpiTimerInterrupt)(
VOID
);
typedef struct {
ULONG Count;
ULONG Pblk[1];
} PROCESSOR_INIT, *PPROCESSOR_INIT;
#define HAL_C1_SUPPORTED 0x01
#define HAL_C2_SUPPORTED 0x02
#define HAL_C3_SUPPORTED 0x04
#define HAL_S1_SUPPORTED 0x08
#define HAL_S2_SUPPORTED 0x10
#define HAL_S3_SUPPORTED 0x20
#define HAL_S4_SUPPORTED 0x40
#define HAL_S5_SUPPORTED 0x80
typedef struct {
BOOLEAN Supported;
UCHAR Pm1aVal;
UCHAR Pm1bVal;
} HAL_SLEEP_VAL, *PHAL_SLEEP_VAL;
typedef
VOID
(*pHalAcpiMachineStateInit)(
IN PPROCESSOR_INIT ProcInit,
IN PHAL_SLEEP_VAL SleepValues,
OUT PULONG PicVal
);
typedef
ULONG
(*pHalAcpiQueryFlags)(
VOID
);
typedef
BOOLEAN
(*pHalPicStateIntact)(
VOID
);
typedef
VOID
(*pHalRestorePicState)(
VOID
);
typedef
ULONG
(*pHalInterfaceReadWriteConfig)(
IN PVOID Context,
IN UCHAR BusOffset,
IN ULONG Slot,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length
);
//
// Flags for interrupt vectors
//
#define VECTOR_MODE 1
#define VECTOR_LEVEL 1
#define VECTOR_EDGE 0
#define VECTOR_POLARITY 2
#define VECTOR_ACTIVE_LOW 2
#define VECTOR_ACTIVE_HIGH 0
//
// Vector Type:
//
// VECTOR_SIGNAL = standard edge-triggered or
// level-sensitive interrupt vector
//
// VECTOR_MESSAGE = an MSI (Message Signalled Interrupt) vector
//
#define VECTOR_TYPE 4
#define VECTOR_SIGNAL 0
#define VECTOR_MESSAGE 4
#define IS_LEVEL_TRIGGERED(vectorFlags) \
(vectorFlags & VECTOR_LEVEL)
#define IS_EDGE_TRIGGERED(vectorFlags) \
!(vectorFlags & VECTOR_LEVEL)
#define IS_ACTIVE_LOW(vectorFlags) \
(vectorFlags & VECTOR_ACTIVE_LOW)
#define IS_ACTIVE_HIGH(vectorFlags) \
!(vectorFlags & VECTOR_ACTIVE_LOW)
typedef
VOID
(*pHalSetVectorState)(
IN ULONG Vector,
IN ULONG Flags
);
VOID
HaliSetVectorState(
IN ULONG Vector,
IN ULONG Flags
);
#define HAL_ACPI_PCI_RESOURCES 0x01
#define HAL_ACPI_PRT_SUPPORT 0x02
typedef
ULONG
(*pHalGetIOApicVersion)(
IN ULONG ApicNo
);
typedef
VOID
(*pHalSetMaxLegacyPciBusNumber)(
IN ULONG BusNumber
);
typedef
BOOLEAN
(*pHalIsVectorValid)(
IN ULONG Vector
);
BOOLEAN
HaliIsVectorValid(
IN ULONG Vector
);
//
// typedef struct _PM_DISPATCH_TABLE {
// ULONG Signature;
// ULONG Version;
// PVOID Function[1];
// } PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
//
typedef struct {
ULONG Signature;
ULONG Version;
pHalAcpiTimerInit HalpAcpiTimerInit;
pHalAcpiTimerInterrupt HalpAcpiTimerInterrupt;
pHalAcpiMachineStateInit HalpAcpiMachineStateInit;
pHalAcpiQueryFlags HalpAcpiQueryFlags;
pHalPicStateIntact HalxPicStateIntact;
pHalRestorePicState HalxRestorePicState;
pHalInterfaceReadWriteConfig HalpPciInterfaceReadConfig;
pHalInterfaceReadWriteConfig HalpPciInterfaceWriteConfig;
pHalSetVectorState HalpSetVectorState;
pHalGetIOApicVersion HalpGetIOApicVersion;
pHalSetMaxLegacyPciBusNumber HalpSetMaxLegacyPciBusNumber;
pHalIsVectorValid HalpIsVectorValid;
} HAL_ACPI_DISPATCH_TABLE, *PHAL_ACPI_DISPATCH_TABLE;
#define HAL_ACPI_DISPATCH_SIGNATURE 'HAL '
#define HAL_ACPI_DISPATCH_VERSION 2
#define HalAcpiTimerInit ((pHalAcpiTimerInit)PmHalDispatchTable->Function[HalAcpiTimerInit])
#define HalAcpiTimerInterrupt ((pHalAcpiTimerInterrupt)PmHalDispatchTable->Function[HalAcpiTimerInterrupt])
#define HalAcpiMachineStateInit ((pHalAcpiMachineStateInit)PmHalDispatchTable->Function[HalAcpiMachineStateInit])
#define HalPicStateIntact ((pHalPicStateIntact)PmHalDispatchTable->Function[HalPicStateIntact])
#define HalRestorePicState ((pHalRestorePicState)PmHalDispatchTable->Function[HalRestorePicState])
#define HalPciInterfaceReadConfig ((pHalInterfaceReadWriteConfig)PmHalDispatchTable->Function[HalPciInterfaceReadConfig])
#define HalPciInterfaceWriteConfig ((pHalInterfaceReadWriteConfig)PmHalDispatchTable->Function[HalPciInterfaceWriteConfig])
#define HalSetVectorState ((pHalSetVectorState)PmHalDispatchTable->Function[HalSetVectorState])
#define HalGetIOApicVersion ((pHalGetIOApicVersion)PmHalDispatchTable->Function[HalGetIOApicVersion])
#define HalSetMaxLegacyPciBusNumber ((pHalSetMaxLegacyPciBusNumber)PmHalDispatchTable->Function[HalSetMaxLegacyPciBusNumber])
#define HalIsVectorValid ((pHalIsVectorValid)PmHalDispatchTable->Function[HalIsVectorValid])
extern PPM_DISPATCH_TABLE PmAcpiDispatchTable;
extern PPM_DISPATCH_TABLE PmHalDispatchTable;
//
// ACPI driver's table
//
typedef enum {
AcpiEnableDisableGPEvents,
AcpiInitEnableAcpi,
AcpiGpeEnableWakeEvents,
AcpiMaxFunction
} ACPI_DISPATCH_FUNCTION;
typedef
VOID
(*pAcpiEnableDisableGPEvents) (
IN BOOLEAN Enable
);
typedef
VOID
(*pAcpiInitEnableAcpi) (
IN BOOLEAN ReEnable
);
typedef
VOID
(*pAcpiGpeEnableWakeEvents)(
VOID
);
typedef struct {
ULONG Signature;
ULONG Version;
pAcpiEnableDisableGPEvents AcpipEnableDisableGPEvents;
pAcpiInitEnableAcpi AcpipInitEnableAcpi;
pAcpiGpeEnableWakeEvents AcpipGpeEnableWakeEvents;
} ACPI_HAL_DISPATCH_TABLE, *PACPI_HAL_DISPATCH_TABLE;
#define ACPI_HAL_DISPATCH_SIGNATURE 'ACPI'
#define ACPI_HAL_DISPATCH_VERSION 1
#define AcpiEnableDisableGPEvents (*(pAcpiEnableDisableGPEvents)PmAcpiDispatchTable->Function[AcpiEnableDisableGPEvents])
#define AcpiInitEnableAcpi (*(pAcpiInitEnableAcpi)PmAcpiDispatchTable->Function[AcpiInitEnableAcpi])
#define AcpiGpeEnableWakeEvents (*(pAcpiGpeEnableWakeEvents)PmAcpiDispatchTable->Function[AcpiGpeEnableWakeEvents])
// from detect\i386\acpibios.h
typedef struct {
PHYSICAL_ADDRESS Base;
LARGE_INTEGER Length;
ULONGLONG Type;
} ACPI_E820_ENTRY, *PACPI_E820_ENTRY;
typedef struct _ACPI_BIOS_MULTI_NODE {
PHYSICAL_ADDRESS RsdtAddress; // 64-bit physical address of RSDT
ULONGLONG Count;
ACPI_E820_ENTRY E820Entry[1];
} ACPI_BIOS_MULTI_NODE;
typedef ACPI_BIOS_MULTI_NODE UNALIGNED *PACPI_BIOS_MULTI_NODE;
typedef enum {
AcpiAddressRangeMemory = 1,
AcpiAddressRangeReserved,
AcpiAddressRangeACPI,
AcpiAddressRangeNVS,
AcpiAddressRangeMaximum,
} ACPI_BIOS_E820_TYPE, *PACPI_BIOS_E820_TYPE;
NTSTATUS
HalpAcpiFindRsdt (
OUT PACPI_BIOS_MULTI_NODE *AcpiMulti
);
#endif //_ACPI_H_
/*
endif
;
; Begin assembly part of the definitions
;
;
; Register layout of ACPI processor register block
;
P_CNT equ 0
P_LVL2 equ 4
P_LVL3 equ 5
;
; Register layout of PM1x_EVT register
;
BM_STS equ 10h
WAK_STS equ 8000h
;
; Register layout of PM1x_Enable
;
TMR_EN equ 0001h
GBL_EN equ 0020h
PWRBTN_EN equ 0100h
SLPBTN_EN equ 0200h
RTC_EN equ 0400h
;
; Register layout of PM1x_CTL
;
SCI_EN equ 1
BM_RLD equ 2
CTL_IGNORE equ 200h
SLP_TYP_SHIFT equ 10
SLP_EN equ 2000h
CTL_PRESERVE equ (SCI_EN + BM_RLD + CTL_IGNORE)
;
; Register layout of PM2_CNT
;
ARB_DIS equ 1
;
; ACPI registers, as laid out in HalpFixedAcpiDescTable
;
PM1a_EVT EQU _HalpFixedAcpiDescTable + 56
PM1b_EVT EQU _HalpFixedAcpiDescTable + 60
PM1_EVT_LEN EQU _HalpFixedAcpiDescTable + 88
PM1a_CNT EQU _HalpFixedAcpiDescTable + 64
PM1b_CNT EQU _HalpFixedAcpiDescTable + 68
PM2_CNT_BLK EQU _HalpFixedAcpiDescTable + 72
PM_TMR_BLK EQU _HalpFixedAcpiDescTable + 76
PM_TMR_FREQ EQU 3579545
GPE0_BLK EQU _HalpFixedAcpiDescTable + 80
GPE1_BLK EQU _HalpFixedAcpiDescTable + 84
GPE0_BLK_LEN EQU _HalpFixedAcpiDescTable + 92
GPE1_BLK_LEN EQU _HalpFixedAcpiDescTable + 93
FLUSH_SIZE EQU _HalpFixedAcpiDescTable + 100
FLUSH_STRIDE EQU _HalpFixedAcpiDescTable + 102
DUTY_OFFSET EQU _HalpFixedAcpiDescTable + 104
RTC_DAY_ALRM EQU _HalpFixedAcpiDescTable + 106
RTC_MON_ALRM EQU _HalpFixedAcpiDescTable + 107
RTC_CENTURY EQU _HalpFixedAcpiDescTable + 108
FADT_FLAGS EQU _HalpFixedAcpiDescTable + 112
;
; FADT flag values
;
WBINVD_SUPPORTED EQU 1
WBINVD_FLUSH EQU 2
;
GeneralWakeupEnable EQU 0
RtcWakeupEnable EQU 1
;
; Constants used in the Context parameter to HaliAcpiSleep
; (must match C code above)
;
SLEEP_STATE_FLUSH_CACHE EQU 1
SLEEP_STATE_FIRMWARE_RESTART EQU 2
SLEEP_STATE_SAVE_MOTHERBOARD EQU 4
SLEEP_STATE_OFF EQU 8
SLEEP_STATE_RESTART_OTHER_PROCESSORS EQU 10h
CONTEXT_FLAG_SHIFT EQU 8
;*/