Newer
Older
AMI-Aptio-BIOS-Reversed / FpgaConfigDataDxeNeonCityFPGA / FpgaConfigDataDxeNeonCityFPGA.md
@Ajax Dong Ajax Dong 2 days ago 7 KB Init

FpgaConfigDataDxeNeonCityFPGA

Function Table

Address Name Description
DebugAssert
GetCmosDebugLevel
DebugPrint
CompareGuid
ReadUnaligned64
FreePool
GetFpgaConfigHob
FpgaConfigDataEntry
GetFpgaConfigData
_ModuleEntryPoint
GUID Definitions
HSSI Card Configuration Table (0x3ED0, 2 entries x 24 bytes = 48 bytes)
This table maps (socket, card_type) pairs to PXB config data and callback
Entry 0: Socket=0, CardType=0x04, PxbConfig=Ptr(0x14C0), ConfigData=0x448
Entry 1: Socket=0, CardType=0x06, PxbConfig=Ptr(0x3F00), ConfigData=0x448
The PxbConfig entries at 0x14C0 and 0x3F00 are arrays of PXB register
configuration tuples. Each tuple is 8 bytes:
HSSI_CARD_CONFIG_ENTRY mHssiCardConfigTable[MAX_HSSI_CONFIG_ENTRIES] = {
Global Variables (.data / .bss section, 0x6920-0x6986)
Standard UEFI globals (populated by _ModuleEntryPoint).
EFI_SYSTEM_TABLE *gST = NULL; // 0x6920
0x6928 EFI_HANDLE gImageHandle = NULL; // 0x6930
0x6938 //
Cached protocol/state pointers.
VOID *mDebugProtocol = NULL; // 0x6940 cached DebugLib protocol
0x6948 -- cached HOB list pointer
0x6950 -- cached CMOS debug level byte
FPGA configuration data (0x6960, 38 bytes).
FPGA_CONFIG_DATA mFpgaConfigData = { 0 };
Zero aligned 8-byte chunks.
Zero remaining bytes (0-7).
Assert Handler (sub_830, 0x830-0x86D)
Call DebugLib protocol's Assert at offset +0x08.
CMOS Debug Level Reader (sub_7A8 inner logic, inline)
Read CMOS register 0x4B.
Preserve NMI disable bit (bit 7) on port 0x70.
If CMOS level is 0, fall back to MMIO register at 0xFDAF0490.
if (DebugLevel == 0) {
Debug Print (sub_7A8, 0x7A8-0x82F)
Map CMOS debug level to allowed error level mask.
if (DebugLevel <= 3) {
Level 0-3: allow only up to a threshold.
Level 0 -> no output (AllowedLevel stays 0).
0x80000000 } else if (DebugLevel == 2) {
DEBUG_ERROR ** DEBUG_INFO**
Level 4 or above: allow all.
AllowedLevel = (UINTN)-1;
Call DebugLib protocol's DebugPrint at offset +0x00.
GetDebugProtocol (sub_728, 0x728-0x7A6)
Allocate and immediately free a 0-byte pool as a canary to verify
that UEFI boot services are functional.
TestBuffer = AllocatePool(EfiBootServicesData, 0);
On a functional UEFI, AllocatePool(0) returns a non-NULL pointer with
a valid address (> 0x10). If TestBuffer <= 0x10, boot services are not
if ((UINTN)TestBuffer <= 0x10) {
Locate the DebugLib protocol.
Protocol = NULL;
GUID Comparison (sub_BA4, 0xBA4-0xC0A)
ReadUnaligned64 (sub_C0C, 0xC0C-0xC3A)
Allocate Pool (sub_C3C, 0xC3C-0xC6A)
Free Pool (sub_C6C, 0xC6C-0xCAE)
HOB List Locator (sub_870, 0x870-0x94C)
Found the HOB list extract the pointer at offset +0x10 within
the configuration table entry (after the 16-byte GUID).
HobList = *(VOID )((UINTN)gST->ConfigurationTable +**
HOB Walk Sub-function (sub_950, 0x950-0x99C)
return NULL;
EFI_HOB_TYPE_GUID_EXT (type 4) this is a GUID-extension HOB.
Advance to next HOB: HobLength is at offset +0x02.
Hob = (UINT16 *)((UINTN)Hob + Hob[1]);
Get FPGA Config HOB (sub_9A0, 0x9A0-0xBA2)
Walk HOBs looking for a GUID-extension HOB that matches the FPGA
config pattern (dual-GUID check: gFpgaConfigProtocolGuid +
GuidHob = FindGuidHob(HobList);
if (CompareGuid(
Found the FPGA config HOB. Return pointer to payload.
Continue walking.
GuidHob = FindGuidHob((VOID )((UINTN)GuidHob + (UINT16 *)((UINTN)GuidHob + 2)));
HOB not found create one.
Initialize new HOB with ZeroMem.
Set default values in the new HOB.
Initialize HSSI card IDs to 0xFF (unknown/uninitialized).
for (Index = 0; Index < MAX_SOCKET_COUNT; Index++) {
Default sub-ID for unknown card
Set initial bifurcation and APIC values.
Try to load saved configuration from UEFI variable "FpgaSocketConfig".
VariableSize = sizeof(FPGA_CONFIG_DATA);
Read the UEFI variable.
if (gRT->GetVariable(
Copy fields from the variable into the HOB.
Copy HSSI card data per socket.
For each socket i:
HssiCardSubId = VarData.HssiCardSubId[i]
Bifurcation = VarData.Bifurcation[i]
offset depends on layout
source bifurcation
Return the newly created HOB data pointer.
FPGA Configuration Data Entry (sub_51C, 0x51C-0x725)
Log module identification string.
Get FPGA configuration data from HOB.
Status = GetFpgaConfigHob(&ConfigBuffer);
Extract configuration fields from the HOB data.
Data = (UINT8 *)ConfigBuffer;
Copy the raw first two bytes.
offset +0x00
offset +0x01
Copy HSSI card data and bifurcation from HOB offset +0x0B to +0x1F.
for (Index = 0; Index < 4; Index++) {
Log active socket mask.
Check if any FPGA sockets are active.
if (mFpgaConfigData.FpgaSktActive == 0) {
Check for HSSI cards on each socket.
for (SocketIndex = 0; SocketIndex < MAX_SOCKET_COUNT; SocketIndex++) {
0 = no card, 7 = reserved type. If we find a real card, continue.
if (HssiCardType != 0 && HssiCardType != 7) {
If no HSSI card found on any socket, log and return.
if (SocketIndex >= MAX_SOCKET_COUNT) {
Install the FPGA Configuration protocol.
Protocol GUID at 0x1460, interface at off_14B0 which points to GetFpgaConfigData.
NewHandle = ImageHandle;
GetFpgaConfigData Protocol Callback (sub_448, 0x448-0x51B)
NULL pointer validation.
if **(PxbConfig == NULL ConfigDataPtr == NULL) {**
Check if the requested socket is active.
FpgaSktActive bitmask: bit 0 = socket 0, bit 1 = socket 1, etc.
if ((mFpgaConfigData.FpgaSktActive & (1 << Socket)) == 0) {
Validate HSSI card type.
Supported types: 4, 6 (other types up to 5 and type 5 itself are invalid).
if **((HssiCardType <= 3) (HssiCardType == 5)) {**
Linear search the HSSI card config table.
mHssiCardConfigTable has 2 entries of sizeof(HSSI_CARD_CONFIG_ENTRY) = 24 bytes.
EntryOffset = 0;
Match found return the PXB config and data pointer.
No matching entry found.
return EFI_NOT_FOUND;
Module Entry Point (_ModuleEntryPoint, 0x390-0x447)
Initialize global image handle.
gImageHandle = (EFI_HANDLE)ImageHandle;
Initialize global system table pointer.
gST = SystemTable;
Initialize global boot services pointer.
gBS = SystemTable->BootServices;
Initialize global runtime services pointer.
gRT = SystemTable->RuntimeServices;
Resolve HOB list and perform FPGA configuration setup.

Generated by HR650X BIOS Decompilation Project