[edk2-devel] [edk2-platforms][PATCH V2 06/11] Platform/Sgi: Add SMBIOS Type4 Table

Pranav Madhu pranav.madhu at arm.com
Sun May 16 09:29:12 UTC 2021


Add the SMBIOS type 4 table (Processor Information) that includes
information about manufacture, family, processor id, maximum operating
frequency, and other information related to the processor.

Signed-off-by: Pranav Madhu <pranav.madhu at arm.com>
---
 Platform/ARM/SgiPkg/SgiPlatform.dsc.inc                                   |   1 +
 Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf       |   6 +
 Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h         |  12 ++
 Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c         |   1 +
 Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/Type4ProcessorInformation.c | 209 ++++++++++++++++++++
 5 files changed, 229 insertions(+)

diff --git a/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc b/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc
index a0f217f5107c..091de0c99c74 100644
--- a/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc
+++ b/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc
@@ -56,6 +56,7 @@
   HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
   MemoryAllocationLib|MdeModulePkg/Library/DxeCoreMemoryAllocationLib/DxeCoreMemoryAllocationLib.inf
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+  PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
 
 [LibraryClasses.common.DXE_DRIVER]
   FdtLib|EmbeddedPkg/Library/FdtLib/FdtLib.inf
diff --git a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
index b3c1619ddc66..4652a9c62b88 100644
--- a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
+++ b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
@@ -18,6 +18,7 @@
   Type0BiosInformation.c
   Type1SystemInformation.c
   Type3SystemEnclosure.c
+  Type4ProcessorInformation.c
 
 [Packages]
   ArmPkg/ArmPkg.dec
@@ -27,9 +28,11 @@
   Platform/ARM/SgiPkg/SgiPlatform.dec
 
 [LibraryClasses]
+  ArmLib
   ArmPlatformLib
   DebugLib
   HobLib
+  PrintLib
   UefiDriverEntryPoint
 
 [Guids]
@@ -37,6 +40,9 @@
   gArmSgiPlatformIdDescriptorGuid
 
 [FixedPcd]
+  gArmPlatformTokenSpaceGuid.PcdClusterCount
+  gArmPlatformTokenSpaceGuid.PcdCoreCount
+  gArmSgiTokenSpaceGuid.PcdChipCount
   gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareRevision
 
 [Protocols]
diff --git a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h
index 4a6f8be2a2c2..8a9be0cfc4c8 100644
--- a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h
+++ b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h
@@ -29,8 +29,20 @@ InstallSystemEnclosure (
   IN     EFI_SMBIOS_PROTOCOL    *Smbios
   );
 
+EFI_STATUS
+EFIAPI
+InstallProcessorInformation (
+  IN     EFI_SMBIOS_PROTOCOL    *Smbios
+  );
+
 enum SMBIOS_REFRENCE_HANDLES {
   SMBIOS_HANDLE_ENCLOSURE = 0x1000,
+  SMBIOS_HANDLE_CLUSTER1,
+  SMBIOS_HANDLE_L1I_CACHE,
+  SMBIOS_HANDLE_L1D_CACHE,
+  SMBIOS_HANDLE_L2_CACHE,
+  SMBIOS_HANDLE_L3_CACHE,
+  SMBIOS_HANDLE_L4_CACHE,
 };
 
 #endif // SMBIOS_PLATFORM_DXE_H_
diff --git a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
index 5f4b833dc9fe..269bd0f9d843 100644
--- a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
+++ b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
@@ -29,6 +29,7 @@ ARM_RD_SMBIOS_TABLE_INSTALL_FPTR mSmbiosTableList[] = {
   &InstallBiosInformation,
   &InstallSystemInformation,
   &InstallSystemEnclosure,
+  &InstallProcessorInformation,
 };
 
 /**
diff --git a/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/Type4ProcessorInformation.c b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/Type4ProcessorInformation.c
new file mode 100644
index 000000000000..fda532b558af
--- /dev/null
+++ b/Platform/ARM/SgiPkg/Drivers/SmbiosPlatformDxe/Type4ProcessorInformation.c
@@ -0,0 +1,209 @@
+/** @file
+  SMBIOS Type 4 (Processor information) table for ARM RD platforms.
+
+  This file installs SMBIOS Type 4 (Processor information) Table for Arm's
+  Reference Design platforms. It includes information about manufacture,
+  family, processor id, maximum operating frequency, and other information
+  related to the processor.
+
+  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.5
+**/
+
+#include <Library/ArmLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PrintLib.h>
+#include <Protocol/Smbios.h>
+
+#include "SgiPlatform.h"
+#include "SmbiosPlatformDxe.h"
+
+#define NEOVERSE_E1_THREADS_PER_CORE    2
+
+#define SOCKET_TYPE_BASE        3
+#define SOCKET_TYPE_NUM         1
+#define PROCESSOR_VERSION_BASE  (SOCKET_TYPE_BASE + SOCKET_TYPE_NUM)
+#define PROCESSOR_VERSION_NUM   8
+#define SERIAL_NUMBER_BASE      (PROCESSOR_VERSION_BASE + PROCESSOR_VERSION_NUM)
+#define TYPE4_STRINGS                                   \
+  "0x000\0"                     /* Part Number */       \
+  "ARM LTD\0"                   /* manufactuer */       \
+  "Other\0"                     /* socket type */       \
+  "Unknown\0"                   /* Processor Version */ \
+  "Cortex-A75\0"                                        \
+  "Neoverse-N1\0"                                       \
+  "Neoverse-N1\0"                                       \
+  "Neoverse-E1\0"                                       \
+  "Neoverse-V1\0"                                       \
+  "Neoverse-V1\0"                                       \
+  "Neoverse-N2\0"                                       \
+  "000-0\0"                     /* Serial number */     \
+  "783-3\0"                                             \
+  "786-1\0"                                             \
+  "786-1\0"                                             \
+  "786-2\0"                                             \
+  "78A-1\0"                                             \
+  "78A-2\0"                                             \
+  "7B7-1\0"
+
+/* SMBIOS Type4 structure */
+#pragma pack(1)
+struct ArmRdSmbiosType4 {
+  SMBIOS_TABLE_TYPE4  Base;
+  UINT8               Strings[sizeof (TYPE4_STRINGS)];
+} ARM_TYPE4;
+#pragma pack()
+
+/* Processor information */
+static struct ArmRdSmbiosType4 mArmRdSmbiosType4 = {
+  {
+    {
+      // SMBIOS header
+      EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION, // Type 4
+      sizeof (SMBIOS_TABLE_TYPE4),           // Length
+      SMBIOS_HANDLE_CLUSTER1,                // handle number
+    },
+    SOCKET_TYPE_BASE,        // Socket type
+    CentralProcessor,        // Processor type
+    ProcessorFamilyIndicatorFamily2,
+                             // Use Processor Family 2 field
+    2,                       // Manufacturer string number
+    {{0}, {0}},              // Processor id, update dynamically
+    PROCESSOR_VERSION_BASE,  // Processor version, update dynamically
+    {0, 0, 0, 0, 0, 1},      // Non legacy mode for processor voltage
+    0,                       // External clock frequency unknown
+    2600,                    // Max speed in MHz
+    2600,                    // Current speed in MHz
+    (                        // Status
+     (1 << 6) |              // CPU Socket Populated
+     (1 << 0)                // CPU Enabled
+    ),
+    ProcessorUpgradeOther,   // Processor Upgrade
+    SMBIOS_HANDLE_L1I_CACHE, // L1 Cache handle
+    SMBIOS_HANDLE_L2_CACHE,  // L2 Cache handle
+    SMBIOS_HANDLE_L3_CACHE,  // L3 Cache handle
+    0,                       // Processor serial number not set
+    0,                       // Processor asset tag not set
+    1,                       // Part number, update dynamically
+    0,                       // Core count, update dynamically
+    0,                       // Enabled core count, update dynamically
+    0,                       // Thread per socket count
+    (                        // Processor characteristics
+      (1 << 2) |             // 64-bit Capable
+      (1 << 3) |             // Multi-Core
+      (1 << 5) |             // Execute Protection
+      (1 << 6) |             // Enhanced Virtualization
+      (1 << 7)               // Power/Performance Control
+    ),
+    ProcessorFamilyARM       // Processor Family 2
+    },
+  TYPE4_STRINGS
+};
+
+/**
+  Update the part-number string.
+
+  Get the part number from ProcessorId and update TYPE4_STRINGS
+
+  @param  ProcessorId    The processor Id read from MIDR register
+**/
+STATIC
+VOID
+UpdatePartNumber (
+  IN     UINT64 ProcessorId
+  )
+{
+  CHAR8  PartNumber[4] = {0};
+  UINT16 PartNum;
+
+  PartNum = (UINT16)((ProcessorId >> 4) & 0xFFF);
+
+  /* Convert 3 digit hexadecimal partnumber to ASCII and update TYPE4_STRINGS */
+  AsciiSPrint(PartNumber, sizeof (PartNumber), "%03x", PartNum);
+  CopyMem (&mArmRdSmbiosType4.Strings[2], PartNumber, sizeof (PartNumber));
+}
+
+/**
+  Install SMBIOS Processor information Table
+
+  Install the SMBIOS Processor information (type 4) table for Arm's Reference
+  Design platforms.
+
+  @param[in]  Smbios   SMBIOS protocol.
+
+  @retval EFI_SUCCESS           Record was added.
+  @retval EFI_NOT_FOUND         Unknown product id.
+  @retval EFI_OUT_OF_RESOURCES  Record was not added.
+  @retval EFI_ALREADY_STARTED   The SmbiosHandle passed in is already in use.
+**/
+EFI_STATUS
+InstallProcessorInformation (
+  IN     EFI_SMBIOS_PROTOCOL    *Smbios
+  )
+{
+  EFI_STATUS Status;
+  EFI_SMBIOS_HANDLE SmbiosHandle;
+  UINT32 CoreCount;
+  UINT64 *ProcessorId = (UINT64 *)&(mArmRdSmbiosType4.Base.ProcessorId);
+
+  SmbiosHandle = ((EFI_SMBIOS_TABLE_HEADER *)&mArmRdSmbiosType4)->Handle;
+  CoreCount = (FixedPcdGet32 (PcdCoreCount) * FixedPcdGet32 (PcdClusterCount));
+
+  /* Set the core count and processor speed for all platforms */
+  switch (SgiGetProductId ()) {
+  case Sgi575:
+  case RdN1Edge:
+  case RdV1:
+    mArmRdSmbiosType4.Base.CoreCount = CoreCount;
+    mArmRdSmbiosType4.Base.EnabledCoreCount = CoreCount;
+    mArmRdSmbiosType4.Base.ThreadCount = CoreCount;
+    break;
+  case RdN2:
+    mArmRdSmbiosType4.Base.CoreCount = CoreCount;
+    mArmRdSmbiosType4.Base.EnabledCoreCount = CoreCount;
+    mArmRdSmbiosType4.Base.ThreadCount = CoreCount;
+    mArmRdSmbiosType4.Base.MaxSpeed = 3200;      // Frequency in MHz
+    mArmRdSmbiosType4.Base.CurrentSpeed = 3200;  // Frequency in MHz
+    break;
+  case RdN1EdgeX2:
+  case RdV1Mc:
+    mArmRdSmbiosType4.Base.CoreCount = CoreCount * FixedPcdGet32 (PcdChipCount);
+    mArmRdSmbiosType4.Base.EnabledCoreCount = CoreCount * FixedPcdGet32 (PcdChipCount);
+    mArmRdSmbiosType4.Base.ThreadCount = CoreCount * FixedPcdGet32 (PcdChipCount);
+    break;
+  case RdE1Edge:
+    mArmRdSmbiosType4.Base.CoreCount = CoreCount / NEOVERSE_E1_THREADS_PER_CORE;
+    mArmRdSmbiosType4.Base.EnabledCoreCount = CoreCount / NEOVERSE_E1_THREADS_PER_CORE;
+    mArmRdSmbiosType4.Base.ThreadCount = CoreCount;
+    mArmRdSmbiosType4.Base.MaxSpeed = 2300;      // Frequency in MHz
+    mArmRdSmbiosType4.Base.CurrentSpeed = 2300;  // Frequency in MHz
+    break;
+  }
+
+  mArmRdSmbiosType4.Base.ProcessorVersion = PROCESSOR_VERSION_BASE + SgiGetProductId ();
+  mArmRdSmbiosType4.Base.SerialNumber = SERIAL_NUMBER_BASE + SgiGetProductId ();
+
+  /* Update processor-id and part number */
+  *ProcessorId = ArmReadMidr();
+  UpdatePartNumber (*ProcessorId);
+
+  /* Install type 4 table */
+  Status = Smbios->Add (
+                     Smbios,
+                     NULL,
+                     &SmbiosHandle,
+                     (EFI_SMBIOS_TABLE_HEADER *)&mArmRdSmbiosType4
+                     );
+  if (Status != EFI_SUCCESS) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "SMBIOS: Failed to install Type4 SMBIOS table.\n"
+      ));
+  }
+
+  return Status;
+}
-- 
2.17.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#75150): https://edk2.groups.io/g/devel/message/75150
Mute This Topic: https://groups.io/mt/82861602/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