Platform/Sgi: Add Initial SMBIOS support

SMBIOS provides basic hardware and firmware configuration information
through table-driven data structure. This patch adds SMBIOS driver
support that allows for installation of multiple SMBIOS types. Also add
SMBIOS Type0 (BIOS Information) table, that include information about
BIOS vendor name, version, SMBIOS version and other information related
to BIOS.

Signed-off-by: Pranav Madhu <pranav.madhu@arm.com>
Reviewed-by: Thomas Abraham <thomas.abraham@arm.com>
Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
This commit is contained in:
Pranav Madhu
2021-05-24 19:58:08 +05:30
committed by Sami Mujawar
parent ef679d0d67
commit d6fcd01ee9
6 changed files with 328 additions and 1 deletions

View File

@@ -0,0 +1,98 @@
/** @file
Install SMBIOS tables for Arm's SGI/RD platforms.
This file is the driver entry point for installing SMBIOS tables on Arm's
Reference Design platforms. For each SMBIOS table installation handler
registered, the driver invokes the handler to register the respective table.
Copyright (c) 2021, ARM Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Specification Reference:
- SMBIOS Reference Specification 3.4.0
**/
#include <IndustryStandard/SmBios.h>
#include <Library/DebugLib.h>
#include <Library/HobLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <PiDxe.h>
#include <Protocol/Smbios.h>
#include "SgiPlatform.h"
#include "SmbiosPlatformDxe.h"
typedef EFI_STATUS (*ARM_RD_SMBIOS_TABLE_INSTALL_FPTR)(EFI_SMBIOS_PROTOCOL *);
STATIC CONST
ARM_RD_SMBIOS_TABLE_INSTALL_FPTR mSmbiosTableList[] = {
&InstallType0BiosInformation,
};
/**
Driver entry point. Installs SMBIOS information.
For all the available SMBIOS table installation handlers, invoke each of
those handlers and let the handlers install the SMBIOS tables. The count
of handlers that fail to install the SMBIOS tables is maintained for
additional logging.
@param ImageHandle Module's image handle.
@param SystemTable Pointer of EFI_SYSTEM_TABLE.
@retval EFI_SUCCESS All SMBIOS table install handlers invoked.
@retval EFI_NOT_FOUND Unsupported platform.
@retval Others Failed to invoke SMBIOS table install handlders.
**/
EFI_STATUS
EFIAPI
SmbiosTableEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_SMBIOS_PROTOCOL *Smbios = NULL;
UINT8 CountFail = 0;
UINT8 Idx;
/* Install SMBIOS table only for supported product */
if (SgiGetProductId () == UnknownId) {
DEBUG ((
DEBUG_ERROR,
"Failed to install SMBIOS: Unknown product\n"
));
return EFI_NOT_FOUND;
}
/* Find the SMBIOS protocol */
Status = gBS->LocateProtocol (
&gEfiSmbiosProtocolGuid,
NULL,
(VOID **)&Smbios
);
if (EFI_ERROR (Status)) {
DEBUG ((
DEBUG_ERROR,
"Failed to install SMBIOS: Unable to locate protocol\n"
));
return Status;
}
/* Install the tables listed in mSmbiosTableList */
for (Idx = 0; Idx < ARRAY_SIZE (mSmbiosTableList); Idx++) {
Status = (*mSmbiosTableList[Idx]) (Smbios);
if (EFI_ERROR (Status)) {
CountFail++;
}
}
DEBUG ((
DEBUG_INFO,
"Installed %d of %d available SMBIOS tables\n",
ARRAY_SIZE (mSmbiosTableList) - CountFail,
ARRAY_SIZE (mSmbiosTableList)
));
return EFI_SUCCESS;
}

View File

@@ -0,0 +1,32 @@
/** @file
Declarations required for SMBIOS DXE driver.
Functions declarations and data type declarations required for SMBIOS DXE
driver of the Arm Reference Design platforms.
Copyright (c) 2021, ARM Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef SMBIOS_PLATFORM_DXE_H_
#define SMBIOS_PLATFORM_DXE_H_
/**
Install SMBIOS BIOS information Table.
Install the SMBIOS BIOS information (type 0) table for Arm's reference design
platforms.
@param[in] Smbios SMBIOS protocol.
@retval EFI_SUCCESS Record was added.
@retval EFI_OUT_OF_RESOURCES Record was not added.
@retval EFI_ALREADY_STARTED The SmbiosHandle passed is already in use.
**/
EFI_STATUS
EFIAPI
InstallType0BiosInformation (
IN EFI_SMBIOS_PROTOCOL *Smbios
);
#endif // SMBIOS_PLATFORM_DXE_H_

View File

@@ -0,0 +1,46 @@
## @file
# This driver installs SMBIOS information for RD Platforms
#
# Copyright (c) 2021, ARM Limited. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent
##
[Defines]
INF_VERSION = 0x0001001A
BASE_NAME = SmbiosPlatformDxe
FILE_GUID = 86e0aa8b-4f8d-44a5-a140-1f693d529c76
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = SmbiosTableEntryPoint
[Sources]
SmbiosPlatformDxe.c
Type0BiosInformation.c
[Packages]
ArmPkg/ArmPkg.dec
ArmPlatformPkg/ArmPlatformPkg.dec
MdeModulePkg/MdeModulePkg.dec
MdePkg/MdePkg.dec
Platform/ARM/SgiPkg/SgiPlatform.dec
[LibraryClasses]
ArmPlatformLib
DebugLib
HobLib
UefiDriverEntryPoint
[Guids]
gEfiGlobalVariableGuid
gArmSgiPlatformIdDescriptorGuid
[FixedPcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareRevision
[Protocols]
gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED
[Guids]
[Depex]
gEfiSmbiosProtocolGuid

View File

@@ -0,0 +1,135 @@
/** @file
SMBIOS Type 0 (BIOS information) table for ARM RD platforms.
Install SMBIOS Type 0 (BIOS information) table for Arm's Reference Design
platforms.
Copyright (c) 2021, ARM Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Specification Reference:
- SMBIOS Reference Specification 3.4.0, Chapter 7.1
**/
#include <Library/DebugLib.h>
#include <Protocol/Smbios.h>
#define TYPE0_STRINGS \
"ARM LTD\0" /* Vendor */ \
"EDK II\0" /* BiosVersion */ \
__DATE__"\0" /* BiosReleaseDate */ \
"\0"
typedef enum {
VendorName = 1,
BiosVersion,
BiosReleaseDate
} TYPE0_STRING_ELEMENTS;
/* SMBIOS Type0 structure */
#pragma pack(1)
typedef struct {
SMBIOS_TABLE_TYPE0 Base;
CHAR8 Strings[sizeof (TYPE0_STRINGS)];
} ARM_RD_SMBIOS_TYPE0;
#pragma pack()
/* BIOS information */
STATIC ARM_RD_SMBIOS_TYPE0 mArmRdSmbiosType0 = {
{
{
// SMBIOS header
EFI_SMBIOS_TYPE_BIOS_INFORMATION, // Type 0
sizeof (SMBIOS_TABLE_TYPE0), // Length
SMBIOS_HANDLE_PI_RESERVED, // Assign an unused handle number
},
VendorName, // String number of vendor name in TYPE0_STRINGS
BiosVersion, // String number of BiosVersion
0, // Bios starting address segment
BiosReleaseDate, // String number of BiosReleaseDate
0xFF, // Bios ROM size
{ // MISC_BIOS_CHARACTERISTICS
0, // Reserved
0, // Unknown
0, // BIOS Characteristics are not supported
0, // ISA not supported
0, // MCA not supported
0, // EISA not supported
1, // PCI supported
0, // PC card (PCMCIA) not supported
1, // Plug and Play is supported
0, // APM not supported
1, // BIOS upgradable
0, // BIOS shadowing is not allowed
0, // VL-VESA not supported
0, // ESCD support is not available
0, // Boot from CD not supported
1, // selectable boot
},
{ // BIOSCharacteristicsExtensionBytes
(
(1 << 0) | // ACPI Supported
(1 << 1) // Legacy USB supported
),
(
(1 << 3) | // Content distribution enabled
(1 << 4) // UEFI spec supported
)
},
0, // SMBIOS Major Release, updated dynamically
0, // SMBIOS Minor Release, updated dynamically
0xFF, // Embedded Controller Firmware Major Release
0xFF, // Embedded Controller Firmware Minor Release
{ // EXTENDED_BIOS_ROM_SIZE
64, // Size
0 // Unit MB
}
},
// Text strings (unformatted area)
TYPE0_STRINGS
};
/**
Install SMBIOS BIOS information Table.
Install the SMBIOS BIOS information (type 0) table for Arm's reference design
platforms.
@param[in] Smbios SMBIOS protocol.
@retval EFI_SUCCESS Record was added.
@retval EFI_OUT_OF_RESOURCES Record was not added.
@retval EFI_ALREADY_STARTED The SmbiosHandle passed is already in use.
**/
EFI_STATUS
InstallType0BiosInformation (
IN EFI_SMBIOS_PROTOCOL *Smbios
)
{
EFI_STATUS Status;
EFI_SMBIOS_HANDLE SmbiosHandle;
SmbiosHandle = ((EFI_SMBIOS_TABLE_HEADER *)&mArmRdSmbiosType0)->Handle;
/* Update firmware revision */
mArmRdSmbiosType0.Base.SystemBiosMajorRelease =
(PcdGet32 (PcdFirmwareRevision) >> 16) & 0xFF;
mArmRdSmbiosType0.Base.SystemBiosMinorRelease =
PcdGet32 (PcdFirmwareRevision) & 0xFF;
/* Install type 0 table */
Status = Smbios->Add (
Smbios,
NULL,
&SmbiosHandle,
(EFI_SMBIOS_TABLE_HEADER *)&mArmRdSmbiosType0
);
if (EFI_ERROR (Status)) {
DEBUG ((
DEBUG_ERROR,
"SMBIOS: Failed to install Type0 SMBIOS table.\n"
));
}
return Status;
}

View File

@@ -109,6 +109,10 @@
# ACPI Table Version
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions|0x20
# SMBIOS entry point version
gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion|0x0304
gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosDocRev|0x0
#
# PCIe
#
@@ -247,6 +251,12 @@
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
#
# SMBIOS/DMI
#
MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
#
# platform driver
#

View File

@@ -1,5 +1,5 @@
#
# Copyright (c) 2018, ARM Limited. All rights reserved.
# Copyright (c) 2018-2021, ARM Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
@@ -102,6 +102,12 @@ READ_LOCK_STATUS = TRUE
INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
!include $(BOARD_DXE_FV_COMPONENTS)
#
# SMBIOS/DMI
#
INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
INF Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
# Required by PCI
INF ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf