|
|
//
//
// Module name
// i64fw.h
// Author
// Arad Rostampour ([email protected]) Mar-22-99
// Description
// Defines SAL/PAL data structures and prototypes
//
#ifndef _I64FW_H_
#define _I64FW_H_
#define SET_ITR_AND_DTR 3
#define SET_DTR_ONLY 2
#define SET_ITR_ONLY 1
// TR for PAL is:
// ed=1, PPN=0 (to be ORed in), RWX privledge only for ring 0, dirty/accessed bit set,
// cacheable memory, present bit set.
#define HAL_SAL_PAL_TR_ATTRIB TR_VALUE(1,0,3,0,1,1,0,1)
#define HAL_TR_ATTRIBUTE_PPN_MASK 0x0000FFFFFFFFF000I64
#define HAL_RID_MASK 0x00000000FFFFFF00I64
#define HAL_RR_PS_VE 0x69
#define HAL_ITIR_PPN_MASK 0x7FFF000000000000I64
#define PAL_HIGHEST_STATIC_FUNCTION_ID 255
#define REGULAR_MEMORY 0
#define PAL_CODE_MEM 1
#define SAL_CODE_MEM 4
#define SAL_DATA_MEM 5
#define FW_RESERVED 12
#define FIRMWARE_CODE 4
#define FW_SAL_PAL 0
#define OEM_ID_LENGTH RTL_NUMBER_OF_FIELD( SST_HEADER, OemId )
#define OEM_PRODUCT_ID_LENGTH RTL_NUMBER_OF_FIELD( SST_HEADER, ProductId )
#define MASK_16KB 0xffffffffffffc000I64
#define MASK_16MB 0xffffffffff000000I64
#define SIZE_IN_BYTES_16KB 16384
//
// Define the size of the stack and backing store needed by calls to the
// PAL and SAL. PAL needs 8KB of each and SAL needs 16KB of each so we'll
// set this value to the larger of the two. The EFI specification defers
// to the SAL specification when discussing stack and backing store needs
// for its runtime services so these stack sizes should accomodate EFI calls
// as well.
//
#define HALP_FW_MEMORY_STACK_SIZE 16384
#define HALP_FW_BACKING_STORE_SIZE 16384
//
// The stack and backing store for physical mode firmware calls are allocated
// in one large block. These macros extract the top of the stack and the
// bottom of the backing store, respectively, given the base of the combined
// block.
//
#define GET_FW_STACK_POINTER(StackBase) \
((StackBase) + HALP_FW_MEMORY_STACK_SIZE - 16)
#define GET_FW_BACKING_STORE_POINTER(StackBase) \
((StackBase) + HALP_FW_MEMORY_STACK_SIZE)
// SAL_STATUS and PAL_STATUS is a 64-bit copy of the value in ReturnValues[0]
typedef LONGLONG SAL_STATUS; typedef LONGLONG PAL_STATUS;
// SAL and PAL return up to 4 64-bit return values; HalpSalCall() and
// HalpPalCall() will return a pointer to this structure
typedef struct _SAL_PAL_RETURN_VALUES { LONGLONG ReturnValues[4]; } SAL_PAL_RETURN_VALUES, *PSAL_PAL_RETURN_VALUES;
typedef struct _HAL_PLATFORM_ID { ANSI_STRING VendorId; ANSI_STRING DeviceId; } HAL_PLATFORM_ID, *PHAL_PLATFORM_ID;
typedef struct _SST_MEMORY_LIST { ULONGLONG PhysicalAddress; ULONGLONG VirtualAddress; ULONGLONG Length; UCHAR NeedVaReg; struct _SST_MEMORY_LIST *Next; } SST_MEMORY_LIST, *PSST_MEMORY_LIST;
// Function Prototypes: SAL takes 8 arguments, PAL takes 4
VOID HalpSetupTranslationRegisters( ULONGLONG VAddr, ULONGLONG PAddr, ULONG PageSize, ULONG TrNumber, ULONG RidValue, ULONG Mode );
SAL_STATUS HalpSalCall( IN LONGLONG FunctionId, IN LONGLONG Arg1, IN LONGLONG Arg2, IN LONGLONG Arg3, IN LONGLONG Arg4, IN LONGLONG Arg5, IN LONGLONG Arg6, IN LONGLONG Arg7, OUT PSAL_PAL_RETURN_VALUES ReturnValues );
PAL_STATUS HalpPalCall( IN LONGLONG FunctionId, IN LONGLONG Arg1, IN LONGLONG Arg2, IN LONGLONG Arg3, OUT PSAL_PAL_RETURN_VALUES ReturnValues );
//
// Define a function prototype for the virtual and physical mode SAL call
// dispatchers.
//
typedef SAL_PAL_RETURN_VALUES (*HALP_SAL_PROC) ( LONGLONG FunctionId, LONGLONG Arg1, LONGLONG Arg2, LONGLONG Arg3, LONGLONG Arg4, LONGLONG Arg5, LONGLONG Arg6, LONGLONG Arg7 );
SAL_PAL_RETURN_VALUES HalpSalProc( LONGLONG FunctionId, LONGLONG Arg1, LONGLONG Arg2, LONGLONG Arg3, LONGLONG Arg4, LONGLONG Arg5, LONGLONG Arg6, LONGLONG Arg7 );
SAL_PAL_RETURN_VALUES HalpSalProcPhysical( LONGLONG FunctionId, LONGLONG Arg1, LONGLONG Arg2, LONGLONG Arg3, LONGLONG Arg4, LONGLONG Arg5, LONGLONG Arg6, LONGLONG Arg7 );
SAL_PAL_RETURN_VALUES HalpSalProcPhysicalEx( LONGLONG FunctionId, LONGLONG Arg1, LONGLONG Arg2, LONGLONG Arg3, LONGLONG Arg4, LONGLONG Arg5, LONGLONG Arg6, LONGLONG Arg7, LONGLONG StackPointer, LONGLONG BackingStorePointer );
SAL_PAL_RETURN_VALUES HalpPalProc( LONGLONG FunctionId, LONGLONG Arg1, LONGLONG Arg2, LONGLONG Arg3 );
SAL_PAL_RETURN_VALUES HalpPalProcPhysicalStatic( LONGLONG FunctionId, LONGLONG Arg1, LONGLONG Arg2, LONGLONG Arg3 );
SAL_PAL_RETURN_VALUES HalpPalProcPhysicalStacked( LONGLONG FunctionId, LONGLONG Arg1, LONGLONG Arg2, LONGLONG Arg3, LONGLONG StackPointer, LONGLONG BackingStorePointer );
NTSTATUS HalpGetPlatformId( OUT PHAL_PLATFORM_ID PlatformId );
VOID InternalTestSal( IN LONGLONG FunctionId, IN LONGLONG Arg1, IN LONGLONG Arg2, IN LONGLONG Arg3, IN LONGLONG Arg4, IN LONGLONG Arg5, IN LONGLONG Arg6, IN LONGLONG Arg7, OUT PSAL_PAL_RETURN_VALUES ReturnValues );
VOID InternalTestPal( IN LONGLONG FunctionId, IN LONGLONG Arg1, IN LONGLONG Arg2, IN LONGLONG Arg3, OUT PSAL_PAL_RETURN_VALUES ReturnValues );
// For SAL cache flush
#define FLUSH_INSTRUCTION_CACHE 1
#define FLUSH_DATA_CACHE 2
#define FLUSH_INSTRUCTION_AND_DATA_CACHE 3
#define FLUSH_COHERENT 4
// iA-64 defined SAL function IDs in hex format as in the SAL spec
#define SAL_SET_VECTORS 0x01000000I64
#define SAL_GET_STATE_INFO 0x01000001I64
#define SAL_GET_STATE_INFO_SIZE 0x01000002I64
#define SAL_CLEAR_STATE_INFO 0x01000003I64
#define SAL_MC_RENDEZ 0x01000004I64
#define SAL_MC_SET_PARAMS 0x01000005I64
#define SAL_REGISTER_VIRTUAL_ADDR 0x01000050I64
#define SAL_REGISTER_PHYSICAL_ADDR 0x01000006I64
#define SAL_CACHE_FLUSH 0x01000008I64
#define SAL_CACHE_INIT 0x01000009I64
#define SAL_PCI_CONFIG_READ 0x01000010I64
#define SAL_PCI_CONFIG_WRITE 0x01000011I64
#define SAL_FREQ_BASE 0x01000012I64
#define SAL_UPDATE_PAL 0x01000020I64
// iA-64 defined SAL return values
#define SAL_STATUS_SUCCESS 0I64
#define SAL_STATUS_SUCCESS_WITH_OVERFLOW 1I64
#define SAL_STATUS_SUCCESS_MORE_RECORDS 3I64
#define SAL_STATUS_NOT_IMPLEMENTED -1I64
#define SAL_STATUS_INVALID_ARGUMENT -2I64
#define SAL_STATUS_ERROR -3I64
#define SAL_STATUS_VA_NOT_REGISTERED -4I64
#define SAL_STATUS_NO_INFORMATION_AVAILABLE -5I64
#define SAL_STATUS_INSUFFICIENT_NVM_MEMORY -6I64
#define SAL_STATUS_INSUFFICIENT_SCRATCH_BUFFER -7I64
#define SAL_STATUS_INVALID_INTERRUPT_VECTOR -8I64
#define SAL_STATUS_PARTITION_TYPE_EXISTS -9I64
#define SAL_STATUS_REQUESTED_MEMORY_UNAVAILABLE -9I64
#define SAL_STATUS_UNABLE_TO_WRITE_NVM -10I64
#define SAL_STATUS_INVALID_PARTITION_TYPE -11I64
#define SAL_STATUS_INVALID_NVM_OBJECT_ID -12I64
#define SAL_STATUS_NVM_OBJECT_MAXIMUM_PARITIONS -13I64
#define SAL_STATUS_INSUFFICIENT_SPACE_FOR_WRITE -14I64
#define SAL_STATUS_INSUFFICIENT_SPACE_FOR_READ -15I64
#define SAL_STATUS_SCRATCH_BUFFER_REQUIRED -16I64
#define SAL_STATUS_INSUFFICIENT_NVM_SPACE_FOR_SUBFUNCTION -17I64
#define SAL_STATUS_INVALID_PARTITION_VALUE -18I64
#define SAL_STATUS_RECORD_ORIENTED_IO_NOT_SUPPORTED -19I64
#define SAL_STATUS_BAD_RECORD_FORMAT_OR_KEYWORD_VARIABLE -20I64
#define SAL_SUCCESSFUL( /* SAL_PAL_RETURN_VALUE */ _rv ) (((_rv).ReturnValues[0]) >= (LONGLONG)0)
//
// SAL descriptor types
//
typedef enum { SAL_PAL_ENTRY_POINT_TYPE = 0, SST_MEMORY_DESCRIPTOR_TYPE, PLATFORM_FEATURES_TYPE, TRANSLATION_REGISTER_TYPE, PTC_COHERENCE_DOMAIN_TYPE, AP_WAKEUP_DESCRIPTOR_TYPE };
//
// IA64 PAL: PAL_VERSION
//
typedef union _PAL_VERSION_STRUCT { struct { UCHAR PAL_B_Revision; UCHAR PAL_B_Model; UCHAR PAL_Reserved1; UCHAR PAL_Vendor; UCHAR PAL_A_Revision; UCHAR PAL_A_Model; UCHAR PAL_Reserved2[2]; };
ULONGLONG ReturnValue;
}PAL_VERSION_STRUCT, *PPAL_VERSION_STRUCT;
//
// IA64 SAL: SAL_REVISION definitions
//
typedef union _SAL_REVISION { USHORT Revision; // Major and Minor revision:
struct { UCHAR Minor; // Byte0: Minor.
UCHAR Major; // Byte1: Major.
}; } SAL_REVISION, *PSAL_REVISION;
#define HALP_SAL_REVISION_2_90 0x0290 /* v2.9 */
#define HALP_SAL_REVISION_MAX 0xffff
//
// Format of the SAL System Table (SST) Header. SAL Specs July 2000, Revision: 2.9.
// The SST is followed by a variable number of entries with varying length.
//
typedef struct _SST_HEADER { ULONG Signature; ULONG Length; USHORT SalRev; USHORT EntryCount; UCHAR CheckSum; UCHAR Reserved1[7]; USHORT Sal_A_Version; USHORT Sal_B_Version; UCHAR OemId[32]; UCHAR ProductId[32]; UCHAR Reserved2[8]; } SST_HEADER, *PSST_HEADER;
//
// Global Data used by the SAL/PAL support routines
//
// _HALP_SAL_PAL_DATA.Flags:
#define HALP_SALPAL_FIX_MCE_LOG_ID 0x0001
#define HALP_SALPAL_FIX_MP_SAFE 0x0002
#define HALP_SALPAL_CMC_BROKEN 0x0004
#define HALP_SALPAL_CPE_BROKEN 0x0008
typedef struct _HALP_SAL_PAL_DATA { PSST_HEADER SalSystemTable; ULONGLONG PalTrBase; ULONGLONG PalTrSize; NTSTATUS Status; SAL_REVISION SalRevision; // Copy of SalSystemTable.SalRev in case we unmap SST.
USHORT Flags; PAL_VERSION_STRUCT PalVersion; PUCHAR SmBiosVersion; ULONGLONG Reserved[4]; } HALP_SAL_PAL_DATA, *PHALP_SAL_PAL_DATA;
#define SMBIOS_STRUCT_HEADER_TYPE_FIELD 0
#define SMBIOS_STRUCT_HEADER_LENGTH_FIELD 1
#define SMBIOS_STRUCT_HEADER_HANDLE_FIELD 2
#define SMBIOS_TYPE0_STRUCT_BIOSVER_FIELD 5
//
// Listing of Descriptors in the SAL System Table and their formats
//
typedef struct _SAL_PAL_ENTRY_POINT { UCHAR EntryType; UCHAR Reserved0[7]; ULONGLONG PalEntryPoint; ULONGLONG SalEntryPoint; ULONGLONG GlobalPointer; UCHAR Reserved1[16]; } SAL_PAL_ENTRY_POINT, *PSAL_PAL_ENTRY_POINT;
typedef struct _SST_MEMORY_DESCRIPTOR { UCHAR EntryType; UCHAR NeedVaReg; UCHAR CurrentAttribute; UCHAR PageAccessRights; UCHAR SupportedAttribute; UCHAR Reserved1[1]; UCHAR MemoryType; UCHAR MemoryUsage; ULONGLONG MemoryAddress; ULONG Length; UCHAR Reserved[4]; UCHAR OemReserved[8]; } SST_MEMORY_DESCRIPTOR, *PSST_MEMORY_DESCRIPTOR;
typedef struct _PLATFORM_FEATURES { UCHAR EntryType; UCHAR FeatureList; UCHAR Reserved[14]; } PLATFORM_FEATURES, *PPLATFORM_FEATURES;
typedef struct _PTC_COHERENCE_DOMAIN { UCHAR EntryType; UCHAR Reserved[3]; ULONG NumberOfDomains; ULONGLONG CoherenceDomainInfo; } PTC_COHERENCE_DOMAIN, *PPTC_COHERENCE_DOMAIN;
typedef struct _COHERENCE_DOMAIN_INFO { ULONGLONG NumberOfProcessors; ULONGLONG LocalIdRegisters; } COHERENCE_DOMAIN_INFO, *PCOHERENCE_DOMAIN_INFO;
typedef struct _AP_WAKEUP_DESCRIPTOR { UCHAR EntryType; UCHAR WakeupMechanism; UCHAR Reserved[6]; ULONGLONG WakeupVector; } AP_WAKEUP_DESCRIPTOR, *PAP_WAKEUP_DESCRIPTOR;
typedef struct _TRANSLATION_REGISTER { UCHAR EntryType; UCHAR TRType; UCHAR TRNumber; UCHAR Reserved1[5]; ULONGLONG VirtualAddress; ULONGLONG PageSize; UCHAR Reserved2[8]; } TRANSLATION_REGISTER, *PTRANSLATION_REGISTER;
#endif // _I64FW_H_
|