[edk2-devel] [edk2-platforms][PATCH V1 03/11] Platform/ARM/SgiPkg: Add Initial SMBIOS support

Pranav Madhu pranav.madhu at arm.com
Fri Jan 15 18:26:40 UTC 2021


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 at arm.com>
---
 Platform/ARM/SgiPkg/SgiPlatform.dsc.inc                              |  10 ++
 Platform/ARM/SgiPkg/SgiPlatform.fdf                                  |   8 +-
 Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf  |  56 ++++++++++
 Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h    |  18 ++++
 Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c    |  74 ++++++++++++++
 Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/Type0BiosInformation.c | 108 ++++++++++++++++++++
 6 files changed, 273 insertions(+), 1 deletion(-)

diff --git a/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc b/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc
index f5c3ccd13069..806f570c637f 100644
--- a/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc
+++ b/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc
@@ -119,6 +119,10 @@
   # ACPI Table Version
   gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions|0x20
 
+  # SMBIOS entry point version
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion|0x0304
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosDocRev|0x0
+
   #
   # PCIe
   #
@@ -260,6 +264,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
   #
diff --git a/Platform/ARM/SgiPkg/SgiPlatform.fdf b/Platform/ARM/SgiPkg/SgiPlatform.fdf
index 18fd09e5d2e2..d94e4633e36c 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
 #
@@ -109,6 +109,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
 
diff --git a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
new file mode 100644
index 000000000000..8996c521de54
--- /dev/null
+++ b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
@@ -0,0 +1,56 @@
+## @file
+#  This driver installs SMBIOS information for RD Platforms
+#
+#  Copyright (c) 2020-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
+
+#
+# The following information is for reference only and not required by the build
+# tools.
+#
+#  VALID_ARCHITECTURES           = AARCH64
+#
+
+[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/SmbiosPlatformDxe.h b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h
new file mode 100644
index 000000000000..9a10bbf15e9e
--- /dev/null
+++ b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h
@@ -0,0 +1,18 @@
+/** @file
+*
+*  Copyright (c) 2020-2021, ARM Limited. All rights reserved.
+*
+*  SPDX-License-Identifier: BSD-2-Clause-Patent
+*
+**/
+
+#ifndef SMBIOS_PLATFORM_DXE_H_
+#define SMBIOS_PLATFORM_DXE_H_
+
+EFI_STATUS
+EFIAPI
+InstallBiosInformation (
+  IN     EFI_SMBIOS_PROTOCOL    *Smbios
+  );
+
+#endif // SMBIOS_PLATFORM_DXE_H_
diff --git a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
new file mode 100644
index 000000000000..f00ef5f8c415
--- /dev/null
+++ b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
@@ -0,0 +1,74 @@
+/** @file
+  Install SMBIOS information for Arm's SGI/RD platforms
+
+  Copyright (c) 2020-2021, ARM Limited. All rights reserved.
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#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
+ARM_RD_SMBIOS_TABLE_INSTALL_FPTR mSmbiosTableList[] = {
+  &InstallBiosInformation,
+};
+
+/**
+  Driver entry point. Installs SMBIOS information
+
+  @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
+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) {
+    return EFI_NOT_FOUND;
+  }
+
+  /* Find the SMBIOS protocol */
+  Status = gBS->LocateProtocol (
+                  &gEfiSmbiosProtocolGuid,
+                  NULL,
+                  (VOID **)&Smbios
+                  );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  /* Install the tables listed in mSmbiosTableList */
+  for (Idx = 0; Idx < ARRAY_SIZE (mSmbiosTableList); Idx++) {
+    Status = (*mSmbiosTableList[Idx]) (Smbios);
+    if (Status != EFI_SUCCESS) {
+      CountFail++;
+    }
+  }
+
+  DEBUG ((DEBUG_INFO, "Installed %d SMBIOS tables\n",
+            ARRAY_SIZE (mSmbiosTableList) - CountFail));
+  return Status;
+}
diff --git a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/Type0BiosInformation.c b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/Type0BiosInformation.c
new file mode 100644
index 000000000000..ef39178b595e
--- /dev/null
+++ b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/Type0BiosInformation.c
@@ -0,0 +1,108 @@
+/** @file
+  SMBIOS Type 0 (BIOS information) table for ARM RD platforms.
+
+  Copyright (c) 2020-2021, ARM Limited. All rights reserved.
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Protocol/Smbios.h>
+
+#define TYPE0_STRINGS                                   \
+  "ARM LTD\0"                   /* Vendor */            \
+  "EDK II\0"                    /* BiosVersion */       \
+  __DATE__"\0"                  /* BiosReleaseDate */   \
+  "\0"
+
+/* SMBIOS Type0 structure */
+#pragma pack(1)
+struct ArmRdSmbiosType0 {
+  SMBIOS_TABLE_TYPE0  Base;
+  INT8                Strings[sizeof (TYPE0_STRINGS)];
+};
+#pragma pack()
+
+/* BIOS information (SMBIOS 3.4 spec, section 7.1) */
+static struct ArmRdSmbiosType0 mArmRdSmbiosType0 = {
+  {
+    {
+      // SMBIOS header
+      EFI_SMBIOS_TYPE_BIOS_INFORMATION, // Type 0
+      sizeof (SMBIOS_TABLE_TYPE0),      // Length
+      SMBIOS_HANDLE_PI_RESERVED,        // Assign an unused handle number
+    },
+    1,              // String number of vendor name in TYPE0_STRINGS
+    2,              // String number of BiosVersion
+    0,              // Bios starting address segment
+    3,              // String number of BiosReleaseDate
+    0,              // Bios ROM size
+    {               // MISC_BIOS_CHARACTERISTICS BiosCharacteristics
+      0,            // Reserved
+      0,            // Unknown
+      0,            // BIOS Characteristics are not supported
+      0,            // ISA is supported
+      0,            // MCA is supported
+      0,            // EISA is supported
+      1,            // PCI supported
+      0,            // PC card (PCMCIA) is supported
+      1,            // Plug and Play is supported
+      0,            // APM is supported
+      1,            // BIOS upgradable
+      0,            // BIOS shadowing is allowed
+      0,            // VL-VESA is supported
+      0,            // ESCD support is available
+      0,            // Boot from CD is 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
+  },
+  // Text strings (unformatted area)
+  TYPE0_STRINGS
+};
+
+/**
+  Install SMBIOS Bios information Table
+
+  @retval EFI_SUCCESS           Record was added.
+  @retval EFI_OUT_OF_RESOURCES  Record was not added.
+  @retval EFI_ALREADY_STARTED   The SmbiosHandle passed in is already in use.
+**/
+EFI_STATUS
+InstallBiosInformation (
+  IN     EFI_SMBIOS_PROTOCOL    *Smbios
+  )
+{
+  EFI_STATUS Status;
+  EFI_SMBIOS_HANDLE SmbiosHandle;
+
+  SmbiosHandle = ((EFI_SMBIOS_TABLE_HEADER *)&mArmRdSmbiosType0)->Handle;
+
+  /* Update firmware revision dynamicaly */
+  mArmRdSmbiosType0.Base.SystemBiosMajorRelease =
+    (PcdGet32 ( PcdFirmwareRevision ) >> 16) & 0xFF;
+  mArmRdSmbiosType0.Base.SystemBiosMinorRelease =
+    PcdGet32 ( PcdFirmwareRevision ) & 0xFF;
+
+  Status = Smbios->Add (
+                     Smbios,
+                     NULL,
+                     &SmbiosHandle,
+                     (EFI_SMBIOS_TABLE_HEADER *)&mArmRdSmbiosType0
+                     );
+
+  return Status;
+}
-- 
2.17.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#70440): https://edk2.groups.io/g/devel/message/70440
Mute This Topic: https://groups.io/mt/79709185/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-






More information about the edk2-devel-archive mailing list