From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web12.23863.1621866512954387801 for ; Mon, 24 May 2021 07:28:33 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: pranav.madhu@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 77D6EED1; Mon, 24 May 2021 07:28:32 -0700 (PDT) Received: from usa.arm.com (a074742.blr.arm.com [10.162.16.32]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 4DA8D3F719; Mon, 24 May 2021 07:28:31 -0700 (PDT) From: "Pranav Madhu" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Sami Mujawar Subject: [edk2-platforms][PATCH V4 03/11] Platform/Sgi: Add Initial SMBIOS support Date: Mon, 24 May 2021 19:58:08 +0530 Message-Id: <20210524142816.9967-4-pranav.madhu@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210524142816.9967-1-pranav.madhu@arm.com> References: <20210524142816.9967-1-pranav.madhu@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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 Reviewed-by: Sami Mujawar --- Platform/ARM/SgiPkg/SgiPlatform.dsc.inc | = 10 ++ Platform/ARM/SgiPkg/SgiPlatform.fdf | = 8 +- Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf | = 46 +++++++ Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h | = 32 +++++ Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c | = 98 ++++++++++++++ Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/Type0BiosInformation.c | 1= 35 ++++++++++++++++++++ 6 files changed, 328 insertions(+), 1 deletion(-) diff --git a/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc b/Platform/ARM/SgiPk= g/SgiPlatform.dsc.inc index 42e3600d15f4..a0f217f5107c 100644 --- a/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc +++ b/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc @@ -109,6 +109,10 @@ # ACPI Table Version gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions|0x20 =20 + # 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 =20 + # + # SMBIOS/DMI + # + MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf + Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf + # # platform driver # diff --git a/Platform/ARM/SgiPkg/SgiPlatform.fdf b/Platform/ARM/SgiPkg/Sg= iPlatform.fdf index da23804828e5..e11d943d6efc 100644 --- a/Platform/ARM/SgiPkg/SgiPlatform.fdf +++ b/Platform/ARM/SgiPkg/SgiPlatform.fdf @@ -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 =3D TRUE INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf !include $(BOARD_DXE_FV_COMPONENTS) =20 + # + # SMBIOS/DMI + # + INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf + INF Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.in= f + # Required by PCI INF ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf =20 diff --git a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatform= Dxe.inf b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe= .inf new file mode 100644 index 000000000000..3568380f8404 --- /dev/null +++ b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf @@ -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 =3D 0x0001001A + BASE_NAME =3D SmbiosPlatformDxe + FILE_GUID =3D 86e0aa8b-4f8d-44a5-a140-1f693d529c7= 6 + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D 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 diff --git a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatform= Dxe.h b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h new file mode 100644 index 000000000000..a09f89ebe5bc --- /dev/null +++ b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h @@ -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 us= e. +**/ +EFI_STATUS +EFIAPI +InstallType0BiosInformation ( + IN EFI_SMBIOS_PROTOCOL *Smbios + ); + +#endif // SMBIOS_PLATFORM_DXE_H_ diff --git a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatform= Dxe.c b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c new file mode 100644 index 000000000000..20d4dedccb82 --- /dev/null +++ b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c @@ -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 Ar= m'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 +#include +#include +#include +#include +#include + +#include "SgiPlatform.h" +#include "SmbiosPlatformDxe.h" + +typedef EFI_STATUS (*ARM_RD_SMBIOS_TABLE_INSTALL_FPTR)(EFI_SMBIOS_PROTOC= OL *); + +STATIC CONST +ARM_RD_SMBIOS_TABLE_INSTALL_FPTR mSmbiosTableList[] =3D { + &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 cou= nt + 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 =3D NULL; + UINT8 CountFail =3D 0; + UINT8 Idx; + + /* Install SMBIOS table only for supported product */ + if (SgiGetProductId () =3D=3D UnknownId) { + DEBUG (( + DEBUG_ERROR, + "Failed to install SMBIOS: Unknown product\n" + )); + return EFI_NOT_FOUND; + } + + /* Find the SMBIOS protocol */ + Status =3D 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 =3D 0; Idx < ARRAY_SIZE (mSmbiosTableList); Idx++) { + Status =3D (*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; +} diff --git a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/Type0BiosInfor= mation.c b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/Type0BiosInforma= tion.c new file mode 100644 index 000000000000..f5c1b2366d04 --- /dev/null +++ b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/Type0BiosInformation.= c @@ -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 Des= ign + 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 +#include + +#define TYPE0_STRINGS \ + "ARM LTD\0" /* Vendor */ \ + "EDK II\0" /* BiosVersion */ \ + __DATE__"\0" /* BiosReleaseDate */ \ + "\0" + +typedef enum { + VendorName =3D 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 =3D { + { + { + // SMBIOS header + EFI_SMBIOS_TYPE_BIOS_INFORMATION, // Type 0 + sizeof (SMBIOS_TABLE_TYPE0), // Length + SMBIOS_HANDLE_PI_RESERVED, // Assign an unused handle numbe= r + }, + 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 us= e. +**/ +EFI_STATUS +InstallType0BiosInformation ( + IN EFI_SMBIOS_PROTOCOL *Smbios + ) +{ + EFI_STATUS Status; + EFI_SMBIOS_HANDLE SmbiosHandle; + + SmbiosHandle =3D ((EFI_SMBIOS_TABLE_HEADER *)&mArmRdSmbiosType0)->Hand= le; + + /* Update firmware revision */ + mArmRdSmbiosType0.Base.SystemBiosMajorRelease =3D + (PcdGet32 (PcdFirmwareRevision) >> 16) & 0xFF; + mArmRdSmbiosType0.Base.SystemBiosMinorRelease =3D + PcdGet32 (PcdFirmwareRevision) & 0xFF; + + /* Install type 0 table */ + Status =3D 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; +} --=20 2.17.1