/** @file
PlatformCpuPolicy.h -- Header for PlatformCpuPolicy
Copyright (c) HR650X BIOS Decompilation Project
**/
#ifndef __PLATFORMCPUPOLICY_H__
#define __PLATFORMCPUPOLICY_H__
#include "../uefi_headers/Uefi.h"
//
// Function Prototypes
//
EFI_STATUS
EFIAPI
SerialPortSetBaudRate(
VOID
);
EFI_STATUS
EFIAPI
SerialPortWrite(
VOID
);
EFI_STATUS
EFIAPI
ZeroMem(
VOID
);
EFI_STATUS
EFIAPI
InternalZeroMem(
VOID
);
EFI_STATUS
EFIAPI
MsrReadRange(
VOID
);
EFI_STATUS
EFIAPI
IoWrite8(
VOID
);
EFI_STATUS
EFIAPI
IoRead8(
VOID
);
EFI_STATUS
EFIAPI
IoRead16(
VOID
);
EFI_STATUS
EFIAPI
IoWrite16(
VOID
);
EFI_STATUS
EFIAPI
PlatformCpuPolicyEntryPoint(
VOID
);
EFI_STATUS
EFIAPI
DetectAndSetUartBaudRate(
VOID
);
EFI_STATUS
EFIAPI
PlatformCpuPolicyInit(
VOID
);
EFI_STATUS
EFIAPI
GetPcdValue(
VOID
);
EFI_STATUS
EFIAPI
SetPcdValue(
VOID
);
EFI_STATUS
EFIAPI
GetConfigTable(
VOID
);
EFI_STATUS
EFIAPI
ConfigureSocketIdInfo(
VOID
);
EFI_STATUS
EFIAPI
AllocateIedTraceBuffer(
VOID
);
EFI_STATUS
EFIAPI
SetupPpmStructures(
VOID
);
EFI_STATUS
EFIAPI
InstallPlatformCpuPolicy(
VOID
);
EFI_STATUS
EFIAPI
TlsAuthConfigExtractConfig(
VOID
);
EFI_STATUS
EFIAPI
TlsCaCertificateRouteConfig(
VOID
);
EFI_STATUS
EFIAPI
TlsCaCertificateCallback(
VOID
);
EFI_STATUS
EFIAPI
GetSetupVariables(
VOID
);
EFI_STATUS
EFIAPI
DebugPrint(
VOID
);
EFI_STATUS
EFIAPI
AssertHandler(
VOID
);
EFI_STATUS
EFIAPI
AsciiStrCpyS(
VOID
);
EFI_STATUS
EFIAPI
AsciiStrLen(
VOID
);
EFI_STATUS
EFIAPI
AsciiVSPrint(
VOID
);
EFI_STATUS
EFIAPI
AsciiSPrint(
VOID
);
EFI_STATUS
EFIAPI
Data (stored in .data section)(
VOID
);
EFI_STATUS
EFIAPI
interface pointers (populated by PlatformCpuPolicyInit)(
VOID
);
EFI_STATUS
EFIAPI
gImageHandle = NULL;(
VOID
);
EFI_STATUS
EFIAPI
ptr(
VOID
);
EFI_STATUS
EFIAPI
located protocol pointers(
VOID
);
EFI_STATUS
EFIAPI
*mPcdProtocol = NULL; // PCD protocol(
VOID
);
EFI_STATUS
EFIAPI
PCI USRA protocol(
VOID
);
EFI_STATUS
EFIAPI
list pointer(
VOID
);
EFI_STATUS
EFIAPI
initialized flag(
VOID
);
EFI_STATUS
EFIAPI
ctl hook protocol(
VOID
);
EFI_STATUS
EFIAPI
policy data (from HOB + PCD)(
VOID
);
EFI_STATUS
EFIAPI
gCpuPolicyData; // Base address of CPU policy data(
VOID
);
EFI_STATUS
EFIAPI
register interface ptr(
VOID
);
EFI_STATUS
EFIAPI
topology and configuration arrays(
VOID
);
EFI_STATUS
EFIAPI
*gSocketNameTable[4]; // Socket name table for debug(
VOID
);
EFI_STATUS
EFIAPI
ID map (2 per socket)(
VOID
);
EFI_STATUS
EFIAPI
of active sockets(
VOID
);
EFI_STATUS
EFIAPI
socket configuration val(
VOID
);
EFI_STATUS
EFIAPI
gPpmBuffer;(
VOID
);
EFI_STATUS
EFIAPI
token space GUID structure(
VOID
);
EFI_STATUS
EFIAPI
gPcdTokenSpace;(
VOID
);
EFI_STATUS
EFIAPI
declarations for internal helpers(
VOID
);
EFI_STATUS
EFIAPI
wrapper functions (linked from BaseLib)(
VOID
);
EFI_STATUS
EFIAPI
stosb sequence on Buffer with Size count.(
VOID
);
EFI_STATUS
EFIAPI
is a leaf function (no callees), 0x20 bytes.(
VOID
);
EFI_STATUS
EFIAPI
-- accesses MSR via PCI or direct rdmsr(
VOID
);
EFI_STATUS
EFIAPI
to a protocol call depending on socket.(
VOID
);
EFI_STATUS
EFIAPI
Entry Point(
VOID
);
EFI_STATUS
EFIAPI
1: Initialize globals, locate protocols(
VOID
);
EFI_STATUS
EFIAPI
(ImageHandle, SystemTable);(
VOID
);
EFI_STATUS
EFIAPI
2: Install CPU platform policy(
VOID
);
EFI_STATUS
EFIAPI
InstallPlatformCpuPolicy ();(
VOID
);
EFI_STATUS
EFIAPI
Initialization(
VOID
);
EFI_STATUS
EFIAPI
CMOS high byte of baud configuration(
VOID
);
EFI_STATUS
EFIAPI
(RTC_INDEX_PORT, CMOS_BAUD_HIGH);(
VOID
);
EFI_STATUS
EFIAPI
baud rate from CMOS nibble(
VOID
);
EFI_STATUS
EFIAPI
(CmosByte) {(
VOID
);
EFI_STATUS
EFIAPI
divisor: 0x1C200 / BaudRate(
VOID
);
EFI_STATUS
EFIAPI
= 115200 / BaudRate;(
VOID
);
EFI_STATUS
EFIAPI
UART base: check if COM1 (0x3F8) or COM2 (0x2F8)(
VOID
);
EFI_STATUS
EFIAPI
offset 0x5C bit 0 selects COM2 if set.(
VOID
);
EFI_STATUS
EFIAPI
= UART_BASE_PORT;(
VOID
);
EFI_STATUS
EFIAPI
if UART is already configured for the correct divisor(
VOID
);
EFI_STATUS
EFIAPI
= __inbyte (UartBase + 3); // LCR(
VOID
);
EFI_STATUS
EFIAPI
DLAB(
VOID
);
EFI_STATUS
EFIAPI
LCR(
VOID
);
EFI_STATUS
EFIAPI
reconfigure if the divisor doesn't match AND the UART is(
VOID
);
EFI_STATUS
EFIAPI
(LSR bits 6 and 5 indicate THR/TEMT empty)(
VOID
);
EFI_STATUS
EFIAPI
(CurrentDivisor != (UINT16)Divisor || (LcrShadow & 0x3F) != 3) {(
VOID
);
EFI_STATUS
EFIAPI
for UART to be ready(
VOID
);
EFI_STATUS
EFIAPI
((__inbyte (UartBase + 5) & 0x60) != 0x60);(
VOID
);
EFI_STATUS
EFIAPI
new divisor(
VOID
);
EFI_STATUS
EFIAPI
(UartBase + 3, 0x80); // set DLAB(
VOID
);
EFI_STATUS
EFIAPI
__outbyte (UartBase, (UINT8)Divisor); // LSB(
VOID
);
EFI_STATUS
EFIAPI
FCR(
VOID
);
EFI_STATUS
EFIAPI
FIFO(
VOID
);
EFI_STATUS
EFIAPI
MCR(
VOID
);
EFI_STATUS
EFIAPI
UEFI global pointers(
VOID
);
EFI_STATUS
EFIAPI
= ImageHandle;(
VOID
);
EFI_STATUS
EFIAPI
UART debug output (detect and set baud rate)(
VOID
);
EFI_STATUS
EFIAPI
();(
VOID
);
EFI_STATUS
EFIAPI
the EFI_DS (Driver Services) protocol via config table(
VOID
);
EFI_STATUS
EFIAPI
= GetConfigTable (&gEfiDsGuid, (VOID **)&gBootServices);(
VOID
);
EFI_STATUS
EFIAPI
the PCD protocol (required for platform configuration)(
VOID
);
EFI_STATUS
EFIAPI
= GetPcdProtocol ();(
VOID
);
EFI_STATUS
EFIAPI
the MM PCI USRA protocol for PCI config space access(
VOID
);
EFI_STATUS
EFIAPI
= gBS->LocateProtocol ((
VOID
);
EFI_STATUS
EFIAPI
the HOB list(
VOID
);
EFI_STATUS
EFIAPI
the SMM Ctl Hook protocol pointer(
VOID
);
EFI_STATUS
EFIAPI
= GetPcdProtocol (); // reuse for token space reference(
VOID
);
EFI_STATUS
EFIAPI
CPU policy MSR value (token 5 -> qword_5B00)(
VOID
);
EFI_STATUS
EFIAPI
= GetPcdProtocol ()->GetPcdValue (5);(
VOID
);
EFI_STATUS
EFIAPI
Protocol Access(
VOID
);
EFI_STATUS
EFIAPI
Table / HOB Lookup(
VOID
);
EFI_STATUS
EFIAPI
ID Configuration(
VOID
);
EFI_STATUS
EFIAPI
((DEBUG_INFO, "::SocketCount %08x\n", MAX_SOCKET_COUNT));(
VOID
);
EFI_STATUS
EFIAPI
the CPU_SOCKET_ID_INFO PCD(
VOID
);
EFI_STATUS
EFIAPI
socket ID data into platform policy structure(
VOID
);
EFI_STATUS
EFIAPI
socket IDs: for each socket that is present, copy its PPIN(
VOID
);
EFI_STATUS
EFIAPI
the socket ID table; otherwise mark as -1 (disabled socket).(
VOID
);
EFI_STATUS
EFIAPI
(SocketIndex = 0; SocketIndex < MAX_SOCKET_COUNT; SocketIndex++) {(
VOID
);
EFI_STATUS
EFIAPI
socket configuration from MSR 11(
VOID
);
EFI_STATUS
EFIAPI
(CPU_POLICY_MSR_11, 1, &gSocketConfig, 0, 0, 0);(
VOID
);
EFI_STATUS
EFIAPI
topology-based encoding to socket ID table(
VOID
);
EFI_STATUS
EFIAPI
not present(
VOID
);
EFI_STATUS
EFIAPI
more information — can't determine mask(
VOID
);
EFI_STATUS
EFIAPI
((DEBUG_INFO, "::Need more info to make sure we can support!!!\n"));(
VOID
);
EFI_STATUS
EFIAPI
Trace Buffer Allocation(
VOID
);
EFI_STATUS
EFIAPI
the IED trace size(
VOID
);
EFI_STATUS
EFIAPI
((
VOID
);
EFI_STATUS
EFIAPI
{(
VOID
);
EFI_STATUS
EFIAPI
failed — halve the size and retry(
VOID
);
EFI_STATUS
EFIAPI
>>= 1;(
VOID
);
EFI_STATUS
EFIAPI
the buffer to a 2 MB boundary(
VOID
);
EFI_STATUS
EFIAPI
((BufferAddress & 0x100000) != 0) {(
VOID
);
EFI_STATUS
EFIAPI
the allocated buffer and tag it as "INTEL RSVD"(
VOID
);
EFI_STATUS
EFIAPI
the IED base address and size into the system address map(
VOID
);
EFI_STATUS
EFIAPI
each present socket(
VOID
);
EFI_STATUS
EFIAPI
IED base (in MB units) to system address map register(
VOID
);
EFI_STATUS
EFIAPI
IED size (in MB units) to system address map register(
VOID
);
EFI_STATUS
EFIAPI
(Processor Power Management) Structure Setup(
VOID
);
EFI_STATUS
EFIAPI
CPU policy HOB(
VOID
);
EFI_STATUS
EFIAPI
= GetHobList ();(
VOID
);
EFI_STATUS
EFIAPI
socket count from the CPU policy protocol(
VOID
);
EFI_STATUS
EFIAPI
socket name table (array of CHAR16 pointers for debug)(
VOID
);
EFI_STATUS
EFIAPI
= AllocatePool (SocketCount * sizeof (CHAR16 *));(
VOID
);
EFI_STATUS
EFIAPI
PPM data buffers (8 bytes per socket)(
VOID
);
EFI_STATUS
EFIAPI
= AllocatePool (SocketCount * 8);(
VOID
);
EFI_STATUS
EFIAPI
the name buffer and report out-of-resources(
VOID
);
EFI_STATUS
EFIAPI
((DEBUG_ERROR, "\nEFI_OUT_OF_RESOURCES!!! AllocatePool() returned NULL pointer.\n"));(
VOID
);
EFI_STATUS
EFIAPI
socket name table(
VOID
);
EFI_STATUS
EFIAPI
(Index = 0; Index < SocketCount; Index++) {(
VOID
);
EFI_STATUS
EFIAPI
in the name from a static table:(
VOID
);
EFI_STATUS
EFIAPI
data: set to "UNKNOWN" initially(
VOID
);
EFI_STATUS
EFIAPI
- was L"CPU1" etc(
VOID
);
EFI_STATUS
EFIAPI
PPM buffers with PCD system(
VOID
);
EFI_STATUS
EFIAPI
(((
VOID
);
EFI_STATUS
EFIAPI
Platform CPU Policy Installation(
VOID
);
EFI_STATUS
EFIAPI
the CPU policy HOB(
VOID
);
EFI_STATUS
EFIAPI
PCD protocol interface(
VOID
);
EFI_STATUS
EFIAPI
IED trace size from PCD or HOB(
VOID
);
EFI_STATUS
EFIAPI
= Policy->IedTraceSize;(
VOID
);
EFI_STATUS
EFIAPI
MB default(
VOID
);
EFI_STATUS
EFIAPI
IED trace buffer for socket 0 (BSP)(
VOID
);
EFI_STATUS
EFIAPI
= AllocateIedTraceBuffer (IedTraceSize);(
VOID
);
EFI_STATUS
EFIAPI
= SetupPpmStructures ();(
VOID
);
EFI_STATUS
EFIAPI
= (UINT32)(AsmReadMsr64 (0x13FE) >> 32); // AYP debug scratchpad7(
VOID
);
EFI_STATUS
EFIAPI
stepping(
VOID
);
EFI_STATUS
EFIAPI
= (Policy->MemoryMode == 2LM_MODE);(
VOID
);
EFI_STATUS
EFIAPI
MONITOR/MWAIT via MSR or CPU policy register(
VOID
);
EFI_STATUS
EFIAPI
(Policy->NmFwEfficientBoot) {(
VOID
);
EFI_STATUS
EFIAPI
Efficient Boot frequency MSR(
VOID
);
EFI_STATUS
EFIAPI
(MSR_NM_FW_EFFICIENT_BOOST, Policy->EfficientBootFrequency);(
VOID
);
EFI_STATUS
EFIAPI
Performance Boot frequency MSR(
VOID
);
EFI_STATUS
EFIAPI
(MSR_NM_FW_PERF_BOOST, Policy->PerformanceBootFrequency);(
VOID
);
EFI_STATUS
EFIAPI
current per-socket HWPM/PBF values from MSR(
VOID
);
EFI_STATUS
EFIAPI
= AsmReadMsr64 (MSR_HWPM_PBF_CONFIG);(
VOID
);
EFI_STATUS
EFIAPI
= Policy->PbfEnabled;(
VOID
);
EFI_STATUS
EFIAPI
= Policy->PolicyEx1;(
VOID
);
EFI_STATUS
EFIAPI
the final MSR value for the CPU policy(
VOID
);
EFI_STATUS
EFIAPI
(MSR_CPU_POLICY_EX1, CpuPolicyEx1);(
VOID
);
EFI_STATUS
EFIAPI
the current TlsCaCertificate variable(
VOID
);
EFI_STATUS
EFIAPI
= 0;(
VOID
);
EFI_STATUS
EFIAPI
the binary variable data to an HII config string(
VOID
);
EFI_STATUS
EFIAPI
return via Results(
VOID
);
EFI_STATUS
EFIAPI
(VariableData != NULL) {(
VOID
);
EFI_STATUS
EFIAPI
config implementation(
VOID
);
EFI_STATUS
EFIAPI
Variable Setup for NVRAM storage(
VOID
);
EFI_STATUS
EFIAPI
the SetupLib protocol interface(
VOID
);
EFI_STATUS
EFIAPI
the combined variable buffer(
VOID
);
EFI_STATUS
EFIAPI
(&gVariableStorage, sizeof (gVariableStorage));(
VOID
);
EFI_STATUS
EFIAPI
the static variable table and read each variable(
VOID
);
EFI_STATUS
EFIAPI
= &gSetupVariableTable;(
VOID
);
EFI_STATUS
EFIAPI
= ((SETUP_PROTOCOL *)SetupProtocol)->GetVariable ((
VOID
);
EFI_STATUS
EFIAPI
UEFI Runtime Services GetVariable directly(
VOID
);
EFI_STATUS
EFIAPI
= AllocatePool (VarSize);(
VOID
);
EFI_STATUS
EFIAPI
= gRT->SetVariable ((
VOID
);
EFI_STATUS
EFIAPI
(SetupLibReady) {(
VOID
);
EFI_STATUS
EFIAPI
+= VarSize;(
VOID
);
EFI_STATUS
EFIAPI
Output Helpers(
VOID
);
EFI_STATUS
EFIAPI
BIOS debug level from CMOS 0x4B(
VOID
);
EFI_STATUS
EFIAPI
= __inbyte (0x70);(
VOID
);
EFI_STATUS
EFIAPI
= (*(UINT8 *)0xFDAF0490 & 2) | 1;(
VOID
);
EFI_STATUS
EFIAPI
(BiosDebugLevel) {(
VOID
);
EFI_STATUS
EFIAPI
((DebugLevel & ErrorLevel) != 0) {(
VOID
);
EFI_STATUS
EFIAPI
the string(
VOID
);
EFI_STATUS
EFIAPI
(Buffer, sizeof (Buffer), Format, VaList);(
VOID
);
EFI_STATUS
EFIAPI
to serial port(
VOID
);
EFI_STATUS
EFIAPI
= AsciiStrLen (Buffer);(
VOID
);
EFI_STATUS
EFIAPI
(TRUE) {(
VOID
);
EFI_STATUS
EFIAPI
until THR (Transmitter Holding Register) is empty(
VOID
);
EFI_STATUS
EFIAPI
((__inbyte (UART_BASE_PORT + 5) & 0x20) == 0);(
VOID
);
EFI_STATUS
EFIAPI
(UART_BASE_PORT, Buffer[Index]);(
VOID
);
EFI_STATUS
EFIAPI
functions imported from BaseLib / BaseMemoryLib(
VOID
);
EFI_STATUS
EFIAPI
(StartOfBuffer, BufferSize, FormatString, VaList);(
VOID
);
EFI_STATUS
EFIAPI
variable table for setup(
VOID
);
EFI_STATUS
EFIAPI
definitions table for GetSetupVariables(
VOID
);
EFI_STATUS
EFIAPI
SETUP_VARIABLE mSetupVariableTable[] = {(
VOID
);
EFI_STATUS
EFIAPI
Trace buffer size(
VOID
);
EFI_STATUS
EFIAPI
configuration(
VOID
);
EFI_STATUS
EFIAPI
//(
VOID
);
EFI_STATUS
EFIAPI
global variable storage(
VOID
);
EFI_STATUS
EFIAPI
UINT8 mGlobalVariableStorage[0x2A3B];(
VOID
);
#endif /* __PLATFORMCPUPOLICY_H__ */