Copy SmbiosPlatformDxe from Juno

This commit is contained in:
Zhuowei Zhang 2019-02-23 20:04:56 -08:00
parent 8e76e86bf4
commit ea7f4efd1f
2 changed files with 933 additions and 0 deletions

View File

@ -0,0 +1,865 @@
/** @file
This driver installs SMBIOS information for ARM Juno platforms
Copyright (c) 2015, ARM Limited. All rights reserved.
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include <ArmPlatform.h>
#include <IndustryStandard/SmBios.h>
#include <Library/ArmLib.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/IoLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <PiDxe.h>
#include <Protocol/Smbios.h>
#define TYPE0_STRINGS \
"EFI Development Kit II / ARM LTD\0" /* Vendor */ \
"EDK II\0" /* BiosVersion */ \
__DATE__"\0" /* BiosReleaseDate */
#define TYPE1_STRINGS \
"ARM LTD\0" /* Manufacturer */ \
"ARM Juno Development Platform\0" /* Product Name */ \
"None\0" /* Version */ \
" \0" /* 20 character buffer */
#define TYPE2_STRINGS \
"ARM LTD\0" /* Manufacturer */ \
"ARM Juno Development Platform\0" /* Product Name */ \
"R0\0" /* Version */ \
"Serial Not Set\0" /* Serial */ \
"Base of Chassis\0" /* board location */ \
"R1\0" /* Version */ \
"R2\0" /* Version */
#define TYPE3_STRINGS \
"ARM LTD\0" /* Manufacturer */ \
"None\0" /* Version */ \
"Serial Not Set\0" /* Serial */
#define TYPE4_STRINGS \
"BGA-1156\0" /* socket type */ \
"ARM LTD\0" /* manufactuer */ \
"Cortex-A57\0" /* processor 1 description */ \
"Cortex-A53\0" /* processor 2 description */ \
"Cortex-A72\0" /* processor 2 description */ \
"0xd03\0" /* A53 part number */ \
"0xd07\0" /* A57 part number */ \
"0xd08\0" /* A72 part number */
#define TYPE7_STRINGS \
"L1 Instruction\0" /* L1I */ \
"L1 Data\0" /* L1D */ \
"L2\0" /* L2 */
#define TYPE9_STRINGS \
"PCIE_SLOT0\0" /* Slot0 */ \
"PCIE_SLOT1\0" /* Slot1 */ \
"PCIE_SLOT2\0" /* Slot2 */ \
"PCIE_SLOT3\0" /* Slot3 */
#define TYPE16_STRINGS \
"\0" /* nothing */
#define TYPE17_STRINGS \
"RIGHT SIDE\0" /* location */ \
"BANK 0\0" /* bank description */
#define TYPE19_STRINGS \
"\0" /* nothing */
#define TYPE32_STRINGS \
"\0" /* nothing */
//
// 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)
//
#pragma pack(1)
typedef struct {
SMBIOS_TABLE_TYPE0 Base;
INT8 Strings[sizeof(TYPE0_STRINGS)];
} ARM_TYPE0;
typedef struct {
SMBIOS_TABLE_TYPE1 Base;
UINT8 Strings[sizeof(TYPE1_STRINGS)];
} ARM_TYPE1;
typedef struct {
SMBIOS_TABLE_TYPE2 Base;
UINT8 Strings[sizeof(TYPE2_STRINGS)];
} ARM_TYPE2;
typedef struct {
SMBIOS_TABLE_TYPE3 Base;
UINT8 Strings[sizeof(TYPE3_STRINGS)];
} ARM_TYPE3;
typedef struct {
SMBIOS_TABLE_TYPE4 Base;
UINT8 Strings[sizeof(TYPE4_STRINGS)];
} ARM_TYPE4;
typedef struct {
SMBIOS_TABLE_TYPE7 Base;
UINT8 Strings[sizeof(TYPE7_STRINGS)];
} ARM_TYPE7;
typedef struct {
SMBIOS_TABLE_TYPE9 Base;
UINT8 Strings[sizeof(TYPE9_STRINGS)];
} ARM_TYPE9;
typedef struct {
SMBIOS_TABLE_TYPE16 Base;
UINT8 Strings[sizeof(TYPE16_STRINGS)];
} ARM_TYPE16;
typedef struct {
SMBIOS_TABLE_TYPE17 Base;
UINT8 Strings[sizeof(TYPE17_STRINGS)];
} ARM_TYPE17;
typedef struct {
SMBIOS_TABLE_TYPE19 Base;
UINT8 Strings[sizeof(TYPE19_STRINGS)];
} ARM_TYPE19;
typedef struct {
SMBIOS_TABLE_TYPE32 Base;
UINT8 Strings[sizeof(TYPE32_STRINGS)];
} ARM_TYPE32;
// 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_A57_L1I = 0x1000,
SMBIOS_HANDLE_A57_L1D,
SMBIOS_HANDLE_A57_L2,
SMBIOS_HANDLE_A53_L1I,
SMBIOS_HANDLE_A53_L1D,
SMBIOS_HANDLE_A53_L2,
SMBIOS_HANDLE_MOTHERBOARD,
SMBIOS_HANDLE_CHASSIS,
SMBIOS_HANDLE_A72_CLUSTER,
SMBIOS_HANDLE_A57_CLUSTER,
SMBIOS_HANDLE_A53_CLUSTER,
SMBIOS_HANDLE_MEMORY,
SMBIOS_HANDLE_DIMM
};
#define SERIAL_LEN 10 //this must be less than the buffer len allocated in the type1 structure
#pragma pack()
// BIOS information (section 7.1)
STATIC ARM_TYPE0 mArmDefaultType0 = {
{
{ // 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,
1, //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
},
// Text strings (unformatted area)
TYPE0_STRINGS
};
// System information (section 7.2)
STATIC CONST ARM_TYPE1 mArmDefaultType1 = {
{
{ // 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
{ 0x8a95d198, 0x7f46, 0x11e5, { 0xbf,0x8b,0x08,0x00,0x27,0x04,0xd4,0x8e }}, //UUID
6, //Wakeup type
0, //SKU
0, //Family
},
// Text strings (unformatted)
TYPE1_STRINGS
};
// Baseboard (section 7.3)
STATIC ARM_TYPE2 mArmDefaultType2 = {
{
{ // 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_A53_CLUSTER}, //,SMBIOS_HANDLE_A53_CLUSTER,SMBIOS_HANDLE_MEMORY},
},
TYPE2_STRINGS
};
// Enclosure
STATIC CONST ARM_TYPE3 mArmDefaultType3 = {
{
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE3), // UINT8 Length
SMBIOS_HANDLE_CHASSIS,
},
1, //Manufacturer
4, //enclosure type (low profile desktop)
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
},
TYPE3_STRINGS
};
// Processor
STATIC CONST ARM_TYPE4 mArmDefaultType4_a72 = {
{
{ // 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
5, //version
{0,0,0,0,0,1}, //voltage
0, //external clock
1200, //max speed
1200, //current speed
0x41, //status
ProcessorUpgradeOther,
SMBIOS_HANDLE_A57_L1I, //l1 cache handle
SMBIOS_HANDLE_A57_L2, //l2 cache handle
0xFFFF, //l3 cache handle
0, //serial not set
0, //asset not set
8, //part number
2, //core count in socket
2, //enabled core count in socket
0, //threads per socket
0xEC, // processor characteristics
ProcessorFamilyARM, //ARM core
},
TYPE4_STRINGS
};
STATIC CONST ARM_TYPE4 mArmDefaultType4_a57 = {
{
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE4), // UINT8 Length
SMBIOS_HANDLE_A57_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
1200, //max speed
1200, //current speed
0x41, //status
ProcessorUpgradeOther,
SMBIOS_HANDLE_A57_L1I, //l1 cache handle
SMBIOS_HANDLE_A57_L2, //l2 cache handle
0xFFFF, //l3 cache handle
0, //serial not set
0, //asset not set
7, //part number
2, //core count in socket
2, //enabled core count in socket
0, //threads per socket
0xEC, // processor characteristics
ProcessorFamilyARM, //ARM core
},
TYPE4_STRINGS
};
STATIC CONST ARM_TYPE4 mArmDefaultType4_a53 = {
{
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE4), // UINT8 Length
SMBIOS_HANDLE_A53_CLUSTER,
},
1, //socket type
3, //processor type CPU
ProcessorFamilyIndicatorFamily2, //processor family, acquire from field2
2, //manufactuer
{{0,},{0.}}, //processor id
4, //version
{0,0,0,0,0,1}, //voltage
0, //external clock
650, //max speed
650, //current speed
0x41, //status
ProcessorUpgradeOther,
SMBIOS_HANDLE_A53_L1I, //l1 cache handle
SMBIOS_HANDLE_A53_L2, //l2 cache handle
0xFFFF, //l3 cache handle
0, //serial not set
0, //asset not set
6, //part number
4, //core count in socket
4, //enabled core count in socket
0, //threads per socket
0xEC, // processor characteristics
ProcessorFamilyARM, //ARM core
},
TYPE4_STRINGS
};
// Cache
STATIC CONST ARM_TYPE7 mArmDefaultType7_a57_l1i = {
{
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_CACHE_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE7), // UINT8 Length
SMBIOS_HANDLE_A57_L1I,
},
1,
0x380, //L1 enabled, unknown WB
48, //48k i cache max
48, //48k installed
{0,1}, //SRAM type
{0,1}, //SRAM type
0, //unkown speed
CacheErrorParity, //parity checking
CacheTypeInstruction, //instruction cache
CacheAssociativityOther, //three way
},
TYPE7_STRINGS
};
STATIC CONST ARM_TYPE7 mArmDefaultType7_a53_l1i = {
{
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_CACHE_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE7), // UINT8 Length
SMBIOS_HANDLE_A53_L1I,
},
1,
0x380, //L1 enabled, unknown WB
32, //32k i cache max
32, //32k installed
{0,1}, //SRAM type
{0,1}, //SRAM type
0, //unkown speed
CacheErrorParity, //parity checking
CacheTypeInstruction, //instruction cache
CacheAssociativity2Way, //two way
},
TYPE7_STRINGS
};
STATIC CONST ARM_TYPE7 mArmDefaultType7_a57_l1d = {
{
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_CACHE_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE7), // UINT8 Length
SMBIOS_HANDLE_A57_L1D,
},
2,
0x180, //L1 enabled, WB
32, //32k d cache max
32, //32k installed
{0,1}, //SRAM type
{0,1}, //SRAM type
0, //unkown speed
CacheErrorSingleBit, //ECC checking
CacheTypeData, //instruction cache
CacheAssociativity2Way, //two way associative
},
TYPE7_STRINGS
};
STATIC CONST ARM_TYPE7 mArmDefaultType7_a53_l1d = {
{
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_CACHE_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE7), // UINT8 Length
SMBIOS_HANDLE_A53_L1D,
},
2,
0x180, //L1 enabled, WB
32, //32k d cache max
32, //32k installed
{0,1}, //SRAM type
{0,1}, //SRAM type
0, //unkown speed
CacheErrorSingleBit, //ECC checking
CacheTypeData, //instruction cache
CacheAssociativity4Way, //four way associative
},
TYPE7_STRINGS
};
STATIC CONST ARM_TYPE7 mArmDefaultType7_a57_l2 = {
{
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_CACHE_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE7), // UINT8 Length
SMBIOS_HANDLE_A57_L2,
},
3,
0x181, //L2 enabled, WB
2048, //2M d cache max
2048, //2M installed
{0,1}, //SRAM type
{0,1}, //SRAM type
0, //unkown speed
CacheErrorSingleBit, //ECC checking
CacheTypeUnified, //instruction cache
CacheAssociativity16Way, //16 way associative
},
TYPE7_STRINGS
};
STATIC CONST ARM_TYPE7 mArmDefaultType7_a53_l2 = {
{
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_CACHE_INFORMATION, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE7), // UINT8 Length
SMBIOS_HANDLE_A53_L2,
},
3,
0x181, //L2 enabled, WB
1024, //1M D cache max
1024, //1M installed
{0,1}, //SRAM type
{0,1}, //SRAM type
0, //unkown speed
CacheErrorSingleBit, //ECC checking
CacheTypeUnified, //instruction cache
CacheAssociativity16Way, //16 way associative
},
TYPE7_STRINGS
};
// Slots
STATIC CONST ARM_TYPE9 mArmDefaultType9_0 = {
{
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE9), // UINT8 Length
SMBIOS_HANDLE_PI_RESERVED,
},
1, //slot 0
SlotTypePciExpressGen2X4,
SlotDataBusWidth1X,
SlotUsageUnknown,
SlotLengthShort,
0,
{1}, //unknown
{1,0,1}, //PME and SMBUS
0,
2,
1,
},
TYPE9_STRINGS
};
STATIC CONST ARM_TYPE9 mArmDefaultType9_1 = {
{
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE9), // UINT8 Length
SMBIOS_HANDLE_PI_RESERVED,
},
1, //slot 0
SlotTypePciExpressGen2X4,
SlotDataBusWidth1X,
SlotUsageUnknown,
SlotLengthShort,
0,
{1},
{1,0,1}, //PME and SMBUS
0,
2,
2,
},
TYPE9_STRINGS
};
STATIC CONST ARM_TYPE9 mArmDefaultType9_2 = {
{
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE9), // UINT8 Length
SMBIOS_HANDLE_PI_RESERVED,
},
1, //slot 0
SlotTypePciExpressGen2X8,
SlotDataBusWidth4X,
SlotUsageUnknown,
SlotLengthShort,
0,
{1},
{1,0,1}, //PME and SMBUS
0,
2,
3,
},
TYPE9_STRINGS
};
STATIC CONST ARM_TYPE9 mArmDefaultType9_3 = {
{
{ // SMBIOS_STRUCTURE Hdr
EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
sizeof (SMBIOS_TABLE_TYPE9), // UINT8 Length
SMBIOS_HANDLE_PI_RESERVED,
},
1, //slot 0
SlotTypePciExpressGen2X16,
SlotDataBusWidth4X,
SlotUsageUnknown,
SlotLengthShort,
0,
{1},
{1,0,1}, //PME and SMBUS
0,
2,
0xc,
},
TYPE9_STRINGS
};
// Memory array
STATIC CONST ARM_TYPE16 mArmDefaultType16 = {
{
{ // 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, //Juno doesn't have ECC RAM
0x800000, //8GB
0xFFFE, //No error information structure
0x1, //soldered memory
},
TYPE16_STRINGS
};
// Memory device
STATIC CONST ARM_TYPE17 mArmDefaultType17 = {
{
{ // 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)
64, //data width of this device (64-bits)
0x2000, //8GB
0x0B, //row of chips
0, //not part of a set
1, //right side of board
2, //bank 0
// MemoryTypeLpddr3, //LP DDR3, isn't defined yet
MemoryTypeDdr3, //LP DDR3
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, //unbuffered
1600, //1600Mhz DDR
0, //varies between diffrent production runs
0, //serial
0, //asset tag
0, //part number
0, //rank
},
TYPE17_STRINGS
};
// Memory array mapped address, this structure
// is overridden by InstallMemoryStructure
STATIC CONST ARM_TYPE19 mArmDefaultType19 = {
{
{ // 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
},
TYPE19_STRINGS
};
// System boot info
STATIC CONST ARM_TYPE32 mArmDefaultType32 = {
{
{ // 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,
},
TYPE32_STRINGS
};
STATIC CONST VOID *DefaultCommonTables[]=
{
&mArmDefaultType0,
&mArmDefaultType1,
&mArmDefaultType2,
&mArmDefaultType3,
&mArmDefaultType7_a53_l1i,
&mArmDefaultType7_a53_l1d,
&mArmDefaultType7_a53_l2,
&mArmDefaultType4_a53,
&mArmDefaultType9_0,
&mArmDefaultType9_1,
&mArmDefaultType9_2,
&mArmDefaultType9_3,
&mArmDefaultType16,
&mArmDefaultType17,
// &mArmDefaultType19, //memory range type 19 dynamically generated
&mArmDefaultType32,
NULL
};
STATIC CONST VOID *DefaultTablesR0R1[]=
{
&mArmDefaultType7_a57_l1i,
&mArmDefaultType7_a57_l1d,
&mArmDefaultType7_a57_l2,
&mArmDefaultType4_a57,
NULL
};
STATIC CONST VOID *DefaultTablesR2[]=
{
&mArmDefaultType7_a57_l1i, // Cache layout is the same on the A72 vs A57
&mArmDefaultType7_a57_l1d,
&mArmDefaultType7_a57_l2,
&mArmDefaultType4_a72,
NULL
};
/**
Installs a memory descriptor (type19) for the given address range
@param Smbios SMBIOS protocol
**/
EFI_STATUS
InstallMemoryStructure (
IN EFI_SMBIOS_PROTOCOL *Smbios,
IN UINT64 StartingAddress,
IN UINT64 RegionLength
)
{
EFI_SMBIOS_HANDLE SmbiosHandle;
ARM_TYPE19 MemoryDescriptor;
EFI_STATUS Status = EFI_SUCCESS;
CopyMem( &MemoryDescriptor, &mArmDefaultType19, sizeof(ARM_TYPE19));
MemoryDescriptor.Base.ExtendedStartingAddress = StartingAddress;
MemoryDescriptor.Base.ExtendedEndingAddress = StartingAddress+RegionLength;
SmbiosHandle = MemoryDescriptor.Base.Hdr.Handle;
Status = Smbios->Add (
Smbios,
NULL,
&SmbiosHandle,
(EFI_SMBIOS_TABLE_HEADER*) &MemoryDescriptor
);
return Status;
}
/**
Install a whole table worth of structructures
@parm
**/
EFI_STATUS
InstallStructures (
IN EFI_SMBIOS_PROTOCOL *Smbios,
IN CONST VOID *DefaultTables[]
)
{
EFI_STATUS Status = EFI_SUCCESS;
EFI_SMBIOS_HANDLE SmbiosHandle;
int TableEntry;
for ( TableEntry=0; DefaultTables[TableEntry] != NULL; TableEntry++)
{
SmbiosHandle = ((EFI_SMBIOS_TABLE_HEADER*)DefaultTables[TableEntry])->Handle;
Status = Smbios->Add (
Smbios,
NULL,
&SmbiosHandle,
(EFI_SMBIOS_TABLE_HEADER*) DefaultTables[TableEntry]
);
if (EFI_ERROR(Status))
break;
}
return Status;
}
/**
Install all structures from the DefaultTables structure
@param Smbios SMBIOS protocol
**/
EFI_STATUS
InstallAllStructures (
IN EFI_SMBIOS_PROTOCOL *Smbios
)
{
EFI_STATUS Status = EFI_SUCCESS;
UINT32 JunoRevision;
VOID *ExtraTables = DefaultTablesR0R1;
GetJunoRevision(JunoRevision);
// Fixup some table values
mArmDefaultType0.Base.SystemBiosMajorRelease = (PcdGet32 ( PcdFirmwareRevision ) >> 16) & 0xFF;
mArmDefaultType0.Base.SystemBiosMinorRelease = PcdGet32 ( PcdFirmwareRevision ) & 0xFF;
if ( JunoRevision == JUNO_REVISION_R1 )
{
mArmDefaultType2.Base.Version = 6;
}
else if ( JunoRevision == JUNO_REVISION_R2 )
{
mArmDefaultType2.Base.Version = 7;
ExtraTables=DefaultTablesR2;
}
//
// Add all Juno table entries
//
Status=InstallStructures (Smbios,DefaultCommonTables);
ASSERT_EFI_ERROR (Status);
Status=InstallStructures (Smbios,ExtraTables);
ASSERT_EFI_ERROR (Status);
// Generate memory descriptors for the two memory ranges we know about
Status = InstallMemoryStructure ( Smbios, PcdGet64 (PcdSystemMemoryBase), PcdGet64 (PcdSystemMemorySize));
ASSERT_EFI_ERROR (Status);
Status = InstallMemoryStructure ( Smbios, ARM_JUNO_EXTRA_SYSTEM_MEMORY_BASE, ARM_JUNO_EXTRA_SYSTEM_MEMORY_SZ);
ASSERT_EFI_ERROR (Status);
return Status;
}
/**
Installs SMBIOS information for ARM 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
SmbiosTablePublishEntry (
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 = InstallAllStructures (Smbios);
return Status;
}

View File

@ -0,0 +1,68 @@
## @file
# This driver installs SMBIOS information for ArmJuno
#
# Copyright (c) 2011, Bei Guan <gbtju85@gmail.com>
# Copyright (c) 2011, Intel Corporation. All rights reserved.
# Copyright (c) 2015, ARM Limited. All rights reserved.
#
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = SmbiosPlatformDxe
FILE_GUID = 4110465d-5ff3-4f4b-b580-24ed0d06747a
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = SmbiosTablePublishEntry
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = AARCH64
#
[Sources]
SmbiosPlatformDxe.c
[Packages]
ArmPkg/ArmPkg.dec
ArmPlatformPkg/ArmPlatformPkg.dec
MdeModulePkg/MdeModulePkg.dec
MdePkg/MdePkg.dec
Platform/ARM/JunoPkg/ArmJuno.dec
[LibraryClasses]
ArmLib
BaseMemoryLib
BaseLib
DebugLib
HobLib
IoLib
MemoryAllocationLib
PcdLib
UefiBootServicesTableLib
UefiDriverEntryPoint
[Guids]
gEfiGlobalVariableGuid
[FixedPcd]
gArmTokenSpaceGuid.PcdSystemMemoryBase
gArmTokenSpaceGuid.PcdSystemMemorySize
gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareRevision
[Protocols]
gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED
[Guids]
[Depex]
gEfiSmbiosProtocolGuid