/** @file
This driver installs SMBIOS information for Marvell Armada platforms
Copyright (c) 2015-2020, Arm Limited. All rights reserved.
Copyright (c) 2019, Marvell International Ltd. and its affiliates
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//
// SMBIOS tables often reference each other using
// fixed constants, define a list of these constants
// for our hardcoded tables
//
enum SMBIOS_REFRENCE_HANDLES {
SMBIOS_HANDLE_A72_L1I = 0x1000,
SMBIOS_HANDLE_A72_L1D,
SMBIOS_HANDLE_A72_L2,
SMBIOS_HANDLE_L3,
SMBIOS_HANDLE_MOTHERBOARD,
SMBIOS_HANDLE_CHASSIS,
SMBIOS_HANDLE_A72_CLUSTER,
SMBIOS_HANDLE_MEMORY,
SMBIOS_HANDLE_DIMM
};
//
// Type definition and contents of the default SMBIOS table.
// This table covers only the minimum structures required by
// the SMBIOS specification (section 6.2, version 3.0)
//
// BIOS information (section 7.1)
STATIC SMBIOS_TABLE_TYPE0 mArmadaDefaultType0 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_BIOS_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE0), // UINT8 Length
SMBIOS_HANDLE_PI_RESERVED,
},
1, // SMBIOS_TABLE_STRING Vendor
2, // SMBIOS_TABLE_STRING BiosVersion
0xE800,// UINT16 BiosSegment
3, // SMBIOS_TABLE_STRING BiosReleaseDate
0, // UINT8 BiosSize
{
0,0,0,0,0,0,
1, //PCI supported
0,
1, //PNP supported
0,
1, //BIOS upgradable
0, 0, 0,
0, //Boot from CD
1, //selectable boot
}, // MISC_BIOS_CHARACTERISTICS BiosCharacteristics
{ // BIOSCharacteristicsExtensionBytes[2]
0x3,
0xC,
},
0, // UINT8 SystemBiosMajorRelease
0, // UINT8 SystemBiosMinorRelease
0xFF, // UINT8 EmbeddedControllerFirmwareMajorRelease
0xFF, // UINT8 EmbeddedControllerFirmwareMinorRelease
};
STATIC CHAR8 CONST *mArmadaDefaultType0Strings[] = {
(CHAR8 CONST *)PcdGetPtr (PcdFirmwareVendor), /* Vendor */
(CHAR8 CONST *)PcdGetPtr (PcdFirmwareVersion), /* BiosVersion */
__DATE__"\0", /* BiosReleaseDate */
NULL
};
// System information (section 7.2)
STATIC SMBIOS_TABLE_TYPE1 mArmadaDefaultType1 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_SYSTEM_INFORMATION,
sizeof (SMBIOS_TABLE_TYPE1),
SMBIOS_HANDLE_PI_RESERVED,
},
1, //Manufacturer
2, //Product Name
3, //Version
4, //Serial
{ 0x97c93925, 0x1273, 0x4f03, { 0x9f,0x75,0x2f,0x2b,0x7e,0xd1,0x94,0x80 }}, //UUID
6, //Wakeup type
0, //SKU
0, //Family
};
STATIC CHAR8 CONST *mArmadaDefaultType1Strings[] = {
(CHAR8 CONST *)PcdGetPtr (PcdProductManufacturer),
(CHAR8 CONST *)PcdGetPtr (PcdProductPlatformName),
(CHAR8 CONST *)PcdGetPtr (PcdProductVersion),
(CHAR8 CONST *)PcdGetPtr (PcdProductSerial),
NULL
};
// Baseboard (section 7.3)
STATIC SMBIOS_TABLE_TYPE2 mArmadaDefaultType2 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_BASEBOARD_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE2), // UINT8 Length
SMBIOS_HANDLE_MOTHERBOARD,
},
1, //Manufacturer
2, //Product Name
3, //Version
4, //Serial
0, //Asset tag
{1}, //motherboard, not replaceable
5, //location of board
SMBIOS_HANDLE_CHASSIS,
BaseBoardTypeMotherBoard,
1,
{SMBIOS_HANDLE_A72_CLUSTER},
};
STATIC CHAR8 CONST *mArmadaDefaultType2Strings[] = {
(CHAR8 CONST *)PcdGetPtr (PcdProductManufacturer),
(CHAR8 CONST *)PcdGetPtr (PcdProductPlatformName),
(CHAR8 CONST *)PcdGetPtr (PcdProductVersion),
(CHAR8 CONST *)PcdGetPtr (PcdProductSerial),
"Base of Chassis \0",/* Board location */
NULL
};
// Enclosure
STATIC SMBIOS_TABLE_TYPE3 mArmadaDefaultType3 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE3), // UINT8 Length
SMBIOS_HANDLE_CHASSIS,
},
1, //Manufacturer
2, //enclosure type
2, //version
3, //serial
0, //asset tag
ChassisStateUnknown, //boot chassis state
ChassisStateSafe, //power supply state
ChassisStateSafe, //thermal state
ChassisSecurityStatusNone, //security state
{0,0,0,0,}, //OEM defined
1, //1U height
1, //number of power cords
0, //no contained elements
};
STATIC CHAR8 CONST *mArmadaDefaultType3Strings[] = {
(CHAR8 CONST *)PcdGetPtr (PcdProductManufacturer),
(CHAR8 CONST *)PcdGetPtr (PcdProductVersion),
(CHAR8 CONST *)PcdGetPtr (PcdProductSerial),
NULL
};
// Processor
STATIC SMBIOS_TABLE_TYPE4 mArmadaDefaultType4 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE4), // UINT8 Length
SMBIOS_HANDLE_A72_CLUSTER,
},
1, //socket type
3, //processor type CPU
ProcessorFamilyIndicatorFamily2, //processor family, acquire from field2
2, //manufactuer
{{0,},{0.}}, //processor id
3, //version
{0,0,0,0,0,1}, //voltage
0, //external clock
2200, //max speed
0, //current speed - requires update
0x41, //status
ProcessorUpgradeOther,
SMBIOS_HANDLE_A72_L1I, //l1 cache handle
SMBIOS_HANDLE_A72_L2, //l2 cache handle
SMBIOS_HANDLE_L3, //l3 cache handle
0, //serial not set
0, //asset not set
4, //part number
4, //core count in socket
4, //enabled core count in socket
4, //threads per socket
0xEC, //processor characteristics
ProcessorFamilyARM, //ARM core
0, // CoreCount2;
0, // EnabledCoreCount2;
0, // ThreadCount2;
};
STATIC CHAR8 CONST *mArmadaDefaultType4Strings[] = {
"Socket type unknown \0", /* Socket type placeholder */
"Marvell\0", /* manufactuer */
"Cortex-A72\0", /* processor description */
"0xd08\0", /* A72 part number */
NULL
};
// Cache
STATIC SMBIOS_TABLE_TYPE7 mArmadaDefaultType7_a72_l1i = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_CACHE_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE7), // UINT8 Length
SMBIOS_HANDLE_A72_L1I,
},
1,
0x380, //L1 enabled, unknown WB
48, //48k I-cache max
48, //48k installed
{0,1}, //SRAM type
{0,1}, //SRAM type
0, //speed unknown
CacheErrorParity, //parity checking
CacheTypeInstruction, //instruction cache
CacheAssociativityOther, //three way
// SMBIOS 3.1.0 fields
48, //48k I-cache max
48, //48k installed
};
STATIC SMBIOS_TABLE_TYPE7 mArmadaDefaultType7_a72_l1d = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_CACHE_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE7), // UINT8 Length
SMBIOS_HANDLE_A72_L1D,
},
2,
0x380, //L1 enabled, unknown WB
32, //32k D-cache max
32, //32k installed
{0,1}, //SRAM type
{0,1}, //SRAM type
0, //speed unknown
CacheErrorSingleBit, //ECC checking
CacheTypeData, //data cache
CacheAssociativity2Way, //two way
// SMBIOS 3.1.0 fields
32, //32k D-cache max
32, //32k installed
};
STATIC SMBIOS_TABLE_TYPE7 mArmadaDefaultType7_a72_l2 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_CACHE_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE7), // UINT8 Length
SMBIOS_HANDLE_A72_L2,
},
3,
0x181, //L2 enabled, WB
512, //512k D-cache max
512, //512k installed
{0,1}, //SRAM type
{0,1}, //SRAM type
0, //speed unknown
CacheErrorSingleBit, //ECC checking
CacheTypeUnified, //instruction cache
CacheAssociativity16Way, //16 way associative
// SMBIOS 3.1.0 fields
512, //512k D-cache max
512, //512k installed
};
STATIC SMBIOS_TABLE_TYPE7 mArmadaDefaultType7_l3 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_CACHE_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE7), // UINT8 Length
SMBIOS_HANDLE_L3,
},
4,
0x182, //L3 enabled, WB
1024, //1M cache max
1024, //1M installed
{0,1}, //SRAM type
{0,1}, //SRAM type
0, //speed unknown
CacheErrorSingleBit, //ECC checking
CacheTypeUnified, //instruction cache
CacheAssociativity8Way, //8 way associative
// SMBIOS 3.1.0 fields
1024, //1M cache max
1024, //1M installed
};
STATIC CONST CHAR8 *mArmadaDefaultType7Strings[] = {
"L1 Instruction\0", /* L1I */
"L1 Data\0", /* L1D */
"L2\0", /* L2 */
"L3\0", /* L3 */
NULL
};
// Slots
STATIC SMBIOS_TABLE_TYPE9 mArmadaDefaultType9_0 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_INACTIVE, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE9), // UINT8 Length
SMBIOS_HANDLE_PI_RESERVED,
},
1, // CP0 PCIE0
SlotTypePciExpressGen2X1,
SlotDataBusWidth1X,
SlotUsageUnknown,
SlotLengthShort,
0,
{1}, //Unknown
{1,0,1}, //PME and SMBUS
0,
0,
1,
};
STATIC SMBIOS_TABLE_TYPE9 mArmadaDefaultType9_1 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_INACTIVE, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE9), // UINT8 Length
SMBIOS_HANDLE_PI_RESERVED,
},
2, // CP0 PCIE1
SlotTypePciExpressGen2X1,
SlotDataBusWidth1X,
SlotUsageUnknown,
SlotLengthShort,
0,
{1},
{1,0,1}, //PME and SMBUS
0,
0,
2,
};
STATIC SMBIOS_TABLE_TYPE9 mArmadaDefaultType9_2 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_INACTIVE, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE9), // UINT8 Length
SMBIOS_HANDLE_PI_RESERVED,
},
3, // CP0 PCIE2
SlotTypePciExpressGen2X1,
SlotDataBusWidth1X,
SlotUsageUnknown,
SlotLengthShort,
0,
{1},
{1,0,1}, //PME and SMBUS
0,
0,
3,
};
STATIC SMBIOS_TABLE_TYPE9 mArmadaDefaultType9_3 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_INACTIVE, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE9), // UINT8 Length
SMBIOS_HANDLE_PI_RESERVED,
},
4, // CP1 PCIE0
SlotTypePciExpressGen2X1,
SlotDataBusWidth1X,
SlotUsageUnknown,
SlotLengthShort,
0,
{1},
{1,0,1}, //PME and SMBUS
0,
0,
0xc,
};
STATIC SMBIOS_TABLE_TYPE9 mArmadaDefaultType9_4 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_INACTIVE, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE9), // UINT8 Length
SMBIOS_HANDLE_PI_RESERVED,
},
5, // CP1 PCIE1
SlotTypePciExpressGen2X1,
SlotDataBusWidth1X,
SlotUsageUnknown,
SlotLengthShort,
0,
{1},
{1,0,1}, //PME and SMBUS
0,
0,
0xc,
};
STATIC SMBIOS_TABLE_TYPE9 mArmadaDefaultType9_5 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_INACTIVE, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE9), // UINT8 Length
SMBIOS_HANDLE_PI_RESERVED,
},
6, // CP1 PCIE2
SlotTypePciExpressGen2X1,
SlotDataBusWidth1X,
SlotUsageUnknown,
SlotLengthShort,
0,
{1},
{1,0,1}, //PME and SMBUS
0,
0,
0xc,
};
STATIC CHAR8 CONST *mArmadaDefaultType9Strings[] = {
"PCIE0 CP0 \0",/* Slot0 */
"PCIE1 CP0 \0",/* Slot1 */
"PCIE2 CP0 \0",/* Slot2 */
"PCIE0 CP1 \0",/* Slot3 */
"PCIE1 CP1 \0",/* Slot4 */
"PCIE2 CP1 \0",/* Slot5 */
NULL
};
// Memory array
STATIC SMBIOS_TABLE_TYPE16 mArmadaDefaultType16 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE16), // UINT8 Length
SMBIOS_HANDLE_MEMORY,
},
MemoryArrayLocationSystemBoard, //on motherboard
MemoryArrayUseSystemMemory, //system RAM
MemoryErrorCorrectionNone, //ECC RAM
0x1000000, //16GB
0xFFFE, //No error information structure
0x1, //soldered memory
};
STATIC CHAR8 CONST *mArmadaDefaultType16Strings[] = {
NULL
};
// Memory device
STATIC SMBIOS_TABLE_TYPE17 mArmadaDefaultType17 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_MEMORY_DEVICE, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE17), // UINT8 Length
SMBIOS_HANDLE_DIMM,
},
SMBIOS_HANDLE_MEMORY, //array to which this module belongs
0xFFFE, //no errors
64, //single DIMM, no ECC is 64bits (for ecc this would be 72)
32, //data width of this device (32-bits)
0, //Memory size obtained dynamically
MemoryFormFactorRowOfChips, //Memory factor
0, //Not part of a set
1, //Location
2, //Bank 0
MemoryTypeDdr4, //DDR4
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, //unbuffered
0, //DRAM speed - requires update
0, //varies between diffrent production runs
0, //serial
0, //asset tag
0, //part number
0, //rank
0, // ExtendedSize; (since Size < 32GB-1)
0, // ConfiguredMemoryClockSpeed - initialized at runtime
0, // MinimumVoltage; (unknown)
0, // MaximumVoltage; (unknown)
0, // ConfiguredVoltage; (unknown)
MemoryTechnologyDram, // MemoryTechnology
{{ // MemoryOperatingModeCapability
0, // Reserved :1;
0, // Other :1;
0, // Unknown :1;
1, // VolatileMemory :1;
0, // ByteAccessiblePersistentMemory :1;
0, // BlockAccessiblePersistentMemory :1;
0 // Reserved :10;
}},
0, // FirwareVersion
0, // ModuleManufacturerID (unknown)
0, // ModuleProductID (unknown)
0, // MemorySubsystemControllerManufacturerID (unknown)
0, // MemorySubsystemControllerProductID (unknown)
0, // NonVolatileSize
0, // VolatileSize - initialized at runtime
0, // CacheSize
0, // LogicalSize
0, // ExtendedSpeed,
0 // ExtendedConfiguredMemorySpeed
};
STATIC CHAR8 CONST *mArmadaDefaultType17Strings[] = {
"DIMM SLOT\0", /* location */
"BANK 0\0", /* bank description */
NULL
};
//
// Memory array mapped address, this structure
// is overridden by SmbiosInstallMemoryStructure.
//
STATIC SMBIOS_TABLE_TYPE19 mArmadaDefaultType19 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE19), // UINT8 Length
SMBIOS_HANDLE_PI_RESERVED,
},
0xFFFFFFFF, //invalid, look at extended addr field
0xFFFFFFFF,
SMBIOS_HANDLE_DIMM, //handle
1,
0x080000000, //starting addr of first 2GB
0x100000000, //ending addr of first 2GB
};
// System boot infomArmadaDefaultType4.
STATIC SMBIOS_TABLE_TYPE32 mArmadaDefaultType32 = {
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE32), // UINT8 Length
SMBIOS_HANDLE_PI_RESERVED,
},
{0, 0, 0, 0, 0, 0}, //reserved
BootInformationStatusNoError,
};
STATIC CHAR8 CONST *mArmadaDefaultType32Strings[] = {
NULL
};
STATIC CONST VOID *DefaultCommonTables[][2] =
{
{ &mArmadaDefaultType0, mArmadaDefaultType0Strings },
{ &mArmadaDefaultType1, mArmadaDefaultType1Strings },
{ &mArmadaDefaultType2, mArmadaDefaultType2Strings },
{ &mArmadaDefaultType3, mArmadaDefaultType3Strings },
{ &mArmadaDefaultType4, mArmadaDefaultType4Strings },
{ &mArmadaDefaultType7_a72_l1i, mArmadaDefaultType7Strings },
{ &mArmadaDefaultType7_a72_l1d, mArmadaDefaultType7Strings },
{ &mArmadaDefaultType7_a72_l2, mArmadaDefaultType7Strings },
{ &mArmadaDefaultType7_l3, mArmadaDefaultType7Strings },
{ &mArmadaDefaultType9_0, mArmadaDefaultType9Strings },
{ &mArmadaDefaultType9_1, mArmadaDefaultType9Strings },
{ &mArmadaDefaultType9_2, mArmadaDefaultType9Strings },
{ &mArmadaDefaultType9_3, mArmadaDefaultType9Strings },
{ &mArmadaDefaultType9_4, mArmadaDefaultType9Strings },
{ &mArmadaDefaultType9_5, mArmadaDefaultType9Strings },
{ &mArmadaDefaultType16, mArmadaDefaultType16Strings },
{ &mArmadaDefaultType17, mArmadaDefaultType17Strings },
{ &mArmadaDefaultType32, mArmadaDefaultType32Strings },
{ NULL, NULL },
};
/**
Create SMBIOS record.
Converts a fixed SMBIOS structure and an array of pointers to strings into
an SMBIOS record where the strings are cat'ed on the end of the fixed record
and terminated via a double NULL and add to SMBIOS table.
SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
{ EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
1 // StringCount
};
CHAR8 *gSmbiosType12Strings[] = {
"Not Found",
NULL
};
...
LogSmbiosData (
(EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
gSmbiosType12Strings
);
@param Smbios SMBIOS protocol
@param Template Fixed SMBIOS structure, required.
@param StringArray Array of strings to convert to an SMBIOS string pack.
NULL is OK.
**/
STATIC
EFI_STATUS
EFIAPI
LogSmbiosData (
IN EFI_SMBIOS_PROTOCOL *Smbios,
IN EFI_SMBIOS_TABLE_HEADER *Template,
IN CONST CHAR8 * CONST *StringArray
)
{
EFI_STATUS Status;
EFI_SMBIOS_TABLE_HEADER *Record;
UINTN Index;
UINTN StringSize;
UINTN Size;
CHAR8 *Str;
// Calculate the size of the fixed record and optional string pack
Size = Template->Length;
if (StringArray == NULL) {
// At least a double null is required
Size += 1;
} else {
for (Index = 0; StringArray[Index] != NULL; Index++) {
StringSize = AsciiStrSize (StringArray[Index]);
Size += StringSize;
}
if (StringArray[0] == NULL) {
// At least a double null is required
Size += 1;
}
// Don't forget the terminating double null
Size += 1;
}
// Copy over Template
Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
if (Record == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (Record, Template, Template->Length);
// Append string pack
Str = (CHAR8*)((UINTN)Record + Record->Length);
for (Index = 0; StringArray[Index] != NULL; Index++) {
StringSize = AsciiStrSize (StringArray[Index]);
CopyMem (Str, StringArray[Index], StringSize);
Str += StringSize;
}
*Str = 0;
Status = Smbios->Add (Smbios,
NULL,
&Record->Handle,
Record);
ASSERT_EFI_ERROR (Status);
FreePool (Record);
return Status;
}
/**
Installs a memory descriptor (type19) for the given address range
@param Smbios SMBIOS protocol.
@param StartingAddress Start address of the memory chunk.
@param RegionLength Memory chunk size.
**/
EFI_STATUS
SmbiosInstallMemoryStructure (
IN EFI_SMBIOS_PROTOCOL *Smbios,
IN UINT64 StartingAddress,
IN UINT64 RegionLength
)
{
EFI_SMBIOS_HANDLE SmbiosHandle;
SMBIOS_TABLE_TYPE19 MemoryDescriptor;
EFI_STATUS Status = EFI_SUCCESS;
CopyMem (&MemoryDescriptor,
&mArmadaDefaultType19,
sizeof (SMBIOS_TABLE_TYPE19));
MemoryDescriptor.ExtendedStartingAddress = StartingAddress;
MemoryDescriptor.ExtendedEndingAddress = StartingAddress + RegionLength;
SmbiosHandle = MemoryDescriptor.Hdr.Handle;
Status = Smbios->Add (Smbios,
NULL,
&SmbiosHandle,
(EFI_SMBIOS_TABLE_HEADER*) &MemoryDescriptor);
return Status;
}
/**
Install a whole table worth of structructures
@param Smbios SMBIOS protocol.
@param DefaultTables A pointer to the default SMBIOS table structure.
**/
EFI_STATUS
SmbiosInstallStructures (
IN EFI_SMBIOS_PROTOCOL *Smbios,
IN CONST VOID *DefaultTables[][2]
)
{
EFI_STATUS Status = EFI_SUCCESS;
INTN TableEntry;
for (TableEntry = 0; DefaultTables[TableEntry][0] != NULL; TableEntry++) {
// Omit disabled tables
if (((EFI_SMBIOS_TABLE_HEADER *)DefaultTables[TableEntry][0])->Type ==
EFI_SMBIOS_TYPE_INACTIVE) {
continue;
}
Status = LogSmbiosData (Smbios,
((EFI_SMBIOS_TABLE_HEADER *)DefaultTables[TableEntry][0]),
DefaultTables[TableEntry][1]);
if (EFI_ERROR (Status))
break;
}
return Status;
}
/**
Update memory information basing on the HOB list.
@param Smbios SMBIOS protocol
**/
STATIC
EFI_STATUS
SmbiosMemoryInstall (
IN EFI_SMBIOS_PROTOCOL *Smbios
)
{
EFI_PEI_HOB_POINTERS Hob;
UINT64 MemorySize;
EFI_STATUS Status;
MemorySize = 0;
//
// Get the HOB list for processing
//
Hob.Raw = GetHobList ();
//
// Collect memory ranges
//
while (!END_OF_HOB_LIST (Hob)) {
if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
if (Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {
MemorySize += (UINT64)(Hob.ResourceDescriptor->ResourceLength);
Status = SmbiosInstallMemoryStructure (Smbios,
Hob.ResourceDescriptor->PhysicalStart,
Hob.ResourceDescriptor->ResourceLength);
if (EFI_ERROR(Status)) {
return Status;
}
}
}
Hob.Raw = GET_NEXT_HOB (Hob);
}
//
// Update TYPE17 memory size fields
//
mArmadaDefaultType17.Size = (UINT16)(MemorySize >> 20);
mArmadaDefaultType17.VolatileSize = MemorySize;
return EFI_SUCCESS;
}
/**
Install all structures from the DefaultTables structure
@param Smbios SMBIOS protocol
**/
EFI_STATUS
SmbiosInstallAllStructures (
IN EFI_SMBIOS_PROTOCOL *Smbios
)
{
EFI_STATUS Status;
UINT32 FirmwareMajorRevisionNumber;
UINT32 FirmwareMinorRevisionNumber;
FirmwareMajorRevisionNumber = (PcdGet32 (PcdFirmwareRevision) >> 16) & 0xFF;
FirmwareMinorRevisionNumber = PcdGet32 (PcdFirmwareRevision) & 0xFF;
//
// Update Firmware Revision, CPU and DRAM frequencies.
//
mArmadaDefaultType0.SystemBiosMajorRelease = FirmwareMajorRevisionNumber;
mArmadaDefaultType0.SystemBiosMinorRelease = FirmwareMinorRevisionNumber;
mArmadaDefaultType4.CurrentSpeed = SampleAtResetGetCpuFrequency ();
mArmadaDefaultType17.Speed = SampleAtResetGetDramFrequency ();
mArmadaDefaultType17.ConfiguredMemoryClockSpeed = SampleAtResetGetDramFrequency ();
//
// Generate memory descriptors.
//
Status = SmbiosMemoryInstall (Smbios);
ASSERT_EFI_ERROR (Status);
//
// Install all tables.
//
Status = SmbiosInstallStructures (Smbios, DefaultCommonTables);
ASSERT_EFI_ERROR (Status);
return EFI_SUCCESS;
}
/**
Installs SMBIOS information for Armada platforms
@param ImageHandle Module's image handle
@param SystemTable Pointer of EFI_SYSTEM_TABLE
@retval EFI_SUCCESS Smbios data successfully installed
@retval Other Smbios data was not installed
**/
EFI_STATUS
EFIAPI
SmbiosPlatformDriverEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_SMBIOS_PROTOCOL *Smbios;
//
// Find the SMBIOS protocol
//
Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid,
NULL,
(VOID **)&Smbios);
if (EFI_ERROR (Status)) {
return Status;
}
Status = SmbiosInstallAllStructures (Smbios);
return Status;
}