public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [edk2-platforms][PATCH 0/4] Add support new SMBIOS Tables and refactor to adapt with ArmPkg/SMBIOS
@ 2023-05-24  0:40 Minh Nguyen
  2023-05-24  0:40 ` [edk2-platforms][PATCH 1/4] JadePkg: Correct PCD names for SMBIOS Type 0 Minh Nguyen
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Minh Nguyen @ 2023-05-24  0:40 UTC (permalink / raw)
  To: devel; +Cc: patches, quic_llindhol, ardb+tianocore, nhi, minhnguyen1

These patches helps to add new SMBIOS Tables (Type 16, 17, 19) and refactor SmbiosPlatformDxe.

Minh Nguyen (4):
  JadePkg: Correct PCD names for SMBIOS Type 0
  JadePkg: Leverage ArmPkg/Smbios (Type 0, 1, 2, 3, 13, 32)
  JadePkg: Refactor SmbiosPlatformDxe
  JadePkg: Add support SMBIOS Table Type 16, 17, 19

 Silicon/Ampere/AmpereSiliconPkg/AmpereSiliconPkg.dec                                                |   14 +-
 Platform/Ampere/JadePkg/Jade.dsc                                                                    |    7 +-
 Platform/Ampere/JadePkg/Jade.fdf                                                                    |    1 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf                             |   43 +-
 Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.inf                                           |   15 +-
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h                               |  201 +++
 Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h                                        |   46 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c                               | 1553 ++++++--------------
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c                      |   96 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorData.c                |  142 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorFunction.c            |   57 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotData.c                   |  268 ++++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotFunction.c               |   58 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringData.c                    |   42 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringFunction.c                |   57 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayData.c          |   48 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayFunction.c      |   44 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceData.c                 |   63 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceFunction.c             |  475 ++++++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressData.c     |   47 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressFunction.c |  150 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityData.c             |   42 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityFunction.c         |   57 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceData.c                   |   46 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceFunction.c               |   39 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedData.c       |   47 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedFunction.c   |   57 +
 Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.c                                             |  246 +++-
 Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLibCommon.c                             |   84 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni                      |   22 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnector.uni                  |   22 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlot.uni                     |   20 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemString.uni                      |   11 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDevice.uni                   |   16 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtended.uni         |   10 +
 35 files changed, 3005 insertions(+), 1141 deletions(-)
 mode change 100644 => 100755 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorData.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorFunction.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotData.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotFunction.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringData.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringFunction.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayData.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayFunction.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceData.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceFunction.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressData.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressFunction.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityData.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityFunction.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceData.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceFunction.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedData.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedFunction.c
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnector.uni
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlot.uni
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemString.uni
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDevice.uni
 create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtended.uni

-- 
2.39.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [edk2-platforms][PATCH 1/4] JadePkg: Correct PCD names for SMBIOS Type 0
  2023-05-24  0:40 [edk2-platforms][PATCH 0/4] Add support new SMBIOS Tables and refactor to adapt with ArmPkg/SMBIOS Minh Nguyen
@ 2023-05-24  0:40 ` Minh Nguyen
  2023-05-24  0:40 ` [edk2-platforms][PATCH 2/4] JadePkg: Leverage ArmPkg/Smbios (Type 0, 1, 2, 3, 13, 32) Minh Nguyen
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Minh Nguyen @ 2023-05-24  0:40 UTC (permalink / raw)
  To: devel; +Cc: patches, quic_llindhol, ardb+tianocore, nhi, minhnguyen1

This corrects "PcdSmbiosTables1MajorVersion" and
"PcdSmbiosTables1MinorVersion" of SMBIOS Type 1,
these PCDs should be for Type 0.

Signed-off-by: Minh Nguyen <minhnguyen1@os.amperecomputing.com>
---
 Silicon/Ampere/AmpereSiliconPkg/AmpereSiliconPkg.dec                    | 14 ++++----------
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf |  6 +++---
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c   |  6 +++---
 3 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/Silicon/Ampere/AmpereSiliconPkg/AmpereSiliconPkg.dec b/Silicon/Ampere/AmpereSiliconPkg/AmpereSiliconPkg.dec
index 625a9b2b1e89..eeaf8cf87435 100644
--- a/Silicon/Ampere/AmpereSiliconPkg/AmpereSiliconPkg.dec
+++ b/Silicon/Ampere/AmpereSiliconPkg/AmpereSiliconPkg.dec
@@ -1,6 +1,6 @@
 ## @file
 #
-# Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR>
+# Copyright (c) 2020 - 2023, Ampere Computing LLC. All rights reserved.<BR>
 #
 # SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -64,19 +64,13 @@ [PcdsFixedAtBuild]
   gAmpereTokenSpaceGuid.PcdPmproDbBaseReg|0x100001540000|UINT64|0x00000004
 
   #
-  # SMBIOS Type 1 Pcd
+  # SMBIOS Type 0 Pcd
   #
-  gAmpereTokenSpaceGuid.PcdSmbiosTables1MajorVersion|0|UINT8|0x00000005
-  gAmpereTokenSpaceGuid.PcdSmbiosTables1MinorVersion|0|UINT8|0x00000006
+  gAmpereTokenSpaceGuid.PcdSmbiosTables0MajorVersion|0|UINT8|0x00000005
+  gAmpereTokenSpaceGuid.PcdSmbiosTables0MinorVersion|0|UINT8|0x00000006
 
 [PcdsFixedAtBuild, PcdsDynamic, PcdsDynamicEx]
   #
   # Firmware Volume Pcds
   #
   gAmpereTokenSpaceGuid.PcdFvBlockSize|0|UINT32|0xB0000001
-
-  #
-  # SMBIOS, default or template values
-  #
-  # SMBIOS Type 0 - BIOS Information
-  gAmpereTokenSpaceGuid.PcdSmbiosTables0BiosReleaseDate|"MM/DD/YYYY"|VOID*|0xB0000002 # Must follow this MM/DD/YYYY SMBIOS date format
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
index a70af6faa212..77148b417b0f 100644
--- a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
@@ -1,6 +1,6 @@
 ## @file
 #
-# Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR>
+# Copyright (c) 2020 - 2023, Ampere Computing LLC. All rights reserved.<BR>
 #
 # SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -40,8 +40,8 @@ [Protocols]
 [Pcd]
   # Type 0
   gAmpereTokenSpaceGuid.PcdSmbiosTables0BiosReleaseDate
-  gAmpereTokenSpaceGuid.PcdSmbiosTables1MajorVersion
-  gAmpereTokenSpaceGuid.PcdSmbiosTables1MinorVersion
+  gAmpereTokenSpaceGuid.PcdSmbiosTables0MajorVersion
+  gAmpereTokenSpaceGuid.PcdSmbiosTables0MinorVersion
   gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString
 
   gArmTokenSpaceGuid.PcdFdSize
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
index add89f5978d6..32735496ecdc 100644
--- a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
@@ -1,6 +1,6 @@
 /** @file
 
-  Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR>
+  Copyright (c) 2020 - 2023, Ampere Computing LLC. All rights reserved.<BR>
 
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
@@ -790,7 +790,7 @@ GetBiosVerMajor (
   VOID
   )
 {
-  return (PcdGet8 (PcdSmbiosTables1MajorVersion));
+  return (PcdGet8 (PcdSmbiosTables0MajorVersion));
 }
 
 STATIC
@@ -799,7 +799,7 @@ GetBiosVerMinor (
   VOID
   )
 {
-  return (PcdGet8 (PcdSmbiosTables1MinorVersion));
+  return (PcdGet8 (PcdSmbiosTables0MinorVersion));
 }
 
 STATIC
-- 
2.39.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [edk2-platforms][PATCH 2/4] JadePkg: Leverage ArmPkg/Smbios (Type 0, 1, 2, 3, 13, 32)
  2023-05-24  0:40 [edk2-platforms][PATCH 0/4] Add support new SMBIOS Tables and refactor to adapt with ArmPkg/SMBIOS Minh Nguyen
  2023-05-24  0:40 ` [edk2-platforms][PATCH 1/4] JadePkg: Correct PCD names for SMBIOS Type 0 Minh Nguyen
@ 2023-05-24  0:40 ` Minh Nguyen
  2023-05-24  0:40 ` [edk2-platforms][PATCH 3/4] JadePkg: Refactor SmbiosPlatformDxe Minh Nguyen
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Minh Nguyen @ 2023-05-24  0:40 UTC (permalink / raw)
  To: devel; +Cc: patches, quic_llindhol, ardb+tianocore, nhi, minhnguyen1

This implementation helps SMBIOS Table (Type 0, 1, 2, 3, 13, 32)
of Altra and AltraMax platform to utilize framework from ArmPkg.

Signed-off-by: Minh Nguyen <minhnguyen1@os.amperecomputing.com>
---
 Platform/Ampere/JadePkg/Jade.dsc                                        |   7 +-
 Platform/Ampere/JadePkg/Jade.fdf                                        |   1 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf |  10 -
 Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.inf               |  15 +-
 Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h            |  22 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c   | 470 --------------------
 Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.c                 | 246 +++++++++-
 Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLibCommon.c |  42 ++
 8 files changed, 326 insertions(+), 487 deletions(-)

diff --git a/Platform/Ampere/JadePkg/Jade.dsc b/Platform/Ampere/JadePkg/Jade.dsc
index f14d286cdfb8..2f530740140d 100644
--- a/Platform/Ampere/JadePkg/Jade.dsc
+++ b/Platform/Ampere/JadePkg/Jade.dsc
@@ -117,8 +117,8 @@ [PcdsFixedAtBuild.common]
   gArmTokenSpaceGuid.PcdProcessorManufacturer|L"Ampere(R)"
   gArmTokenSpaceGuid.PcdProcessorVersion|L"Ampere(R) Altra(R) Processor"
 
-  gAmpereTokenSpaceGuid.PcdSmbiosTables1MajorVersion|$(MAJOR_VER)
-  gAmpereTokenSpaceGuid.PcdSmbiosTables1MinorVersion|$(MINOR_VER)
+  gAmpereTokenSpaceGuid.PcdSmbiosTables0MajorVersion|$(MAJOR_VER)
+  gAmpereTokenSpaceGuid.PcdSmbiosTables0MinorVersion|$(MINOR_VER)
 
   # Clearing BIT0 in this PCD prevents installing a 32-bit SMBIOS entry point,
   # if the entry point version is >= 3.0. AARCH64 OSes cannot assume the
@@ -137,8 +137,6 @@ [PcdsFixedAtBuild.common]
 !endif
 
 [PcdsDynamicDefault.common.DEFAULT]
-  # SMBIOS Type 0 - BIOS Information
-  gAmpereTokenSpaceGuid.PcdSmbiosTables0BiosReleaseDate|"MM/DD/YYYY"
 
 [PcdsPatchableInModule]
   #
@@ -181,6 +179,7 @@ [Components.common]
   MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
   ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
+  ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscDxe.inf
   Platform/Ampere/JadePkg/Drivers/SmbiosMemInfoDxe/SmbiosMemInfoDxe.inf
 
   #
diff --git a/Platform/Ampere/JadePkg/Jade.fdf b/Platform/Ampere/JadePkg/Jade.fdf
index a578d05330ec..7795f0e11115 100644
--- a/Platform/Ampere/JadePkg/Jade.fdf
+++ b/Platform/Ampere/JadePkg/Jade.fdf
@@ -347,6 +347,7 @@ [FV.FvMain]
   INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
   INF Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
   INF ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
+  INF ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscDxe.inf
   INF Platform/Ampere/JadePkg/Drivers/SmbiosMemInfoDxe/SmbiosMemInfoDxe.inf
 
   #
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
index 77148b417b0f..549aa38b1774 100644
--- a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
@@ -28,7 +28,6 @@ [LibraryClasses]
   BaseLib
   BaseMemoryLib
   DebugLib
-  HobLib
   MemoryAllocationLib
   UefiBootServicesTableLib
   UefiDriverEntryPoint
@@ -38,16 +37,7 @@ [Protocols]
   gEfiSmbiosProtocolGuid                     ## CONSUMED
 
 [Pcd]
-  # Type 0
-  gAmpereTokenSpaceGuid.PcdSmbiosTables0BiosReleaseDate
-  gAmpereTokenSpaceGuid.PcdSmbiosTables0MajorVersion
-  gAmpereTokenSpaceGuid.PcdSmbiosTables0MinorVersion
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString
-
   gArmTokenSpaceGuid.PcdFdSize
 
-[Guids]
-  gPlatformInfoHobGuid
-
 [Depex]
   gEfiSmbiosProtocolGuid
diff --git a/Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.inf b/Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.inf
index b67ce01fb27f..9d1a0b7e9e06 100644
--- a/Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.inf
+++ b/Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.inf
@@ -1,7 +1,7 @@
 #/** @file
 #    OemMiscLib.inf
 #
-#    Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
+#    Copyright (c) 2021 - 2023, Ampere Computing LLC. All rights reserved.
 #    Copyright (c) 2021, NUVIA Inc. All rights reserved.
 #    Copyright (c) 2018, Hisilicon Limited. All rights reserved.
 #    Copyright (c) 2018, Linaro Limited. All rights reserved.
@@ -27,6 +27,7 @@ [Packages]
   MdeModulePkg/MdeModulePkg.dec
   MdePkg/MdePkg.dec
   Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dec
+  Silicon/Ampere/AmpereSiliconPkg/AmpereSiliconPkg.dec
 
 [LibraryClasses]
   AmpereCpuLib
@@ -34,3 +35,15 @@ [LibraryClasses]
   BaseLib
   BaseMemoryLib
   DebugLib
+
+[FixedPcd]
+  gArmTokenSpaceGuid.PcdSystemMemoryBase
+  gAmpereTokenSpaceGuid.PcdSmbiosTables0MajorVersion
+  gAmpereTokenSpaceGuid.PcdSmbiosTables0MinorVersion
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString
+
+[Guids]
+  gZeroGuid
+
+[Depex]
+  TRUE
diff --git a/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h b/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h
index 94944cbe3abe..c425ed4431da 100644
--- a/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h
+++ b/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h
@@ -160,6 +160,28 @@ GetNumberOfConfiguredCPMs (
   UINT8 SocketId
   );
 
+/**
+  Get version of SCP.
+
+  @param[out]   ScpVer   Pointer to contain version of SCP value.
+**/
+VOID
+EFIAPI
+GetScpVersion (
+  UINT8 **ScpVer
+  );
+
+/**
+  Get date of build release for SCP.
+
+  @param[out]   ScpBuild   Pointer to contain date of build release for SCP.
+**/
+VOID
+EFIAPI
+GetScpBuild (
+  UINT8 **ScpBuild
+  );
+
 /**
   Set the number of configured CPM per socket.
 
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
index 32735496ecdc..448912f146ec 100644
--- a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
@@ -8,63 +8,19 @@
 
 #include <Uefi.h>
 
-#include <Guid/PlatformInfoHob.h>
 #include <Guid/SmBios.h>
 #include <Library/BaseLib.h>
 #include <Library/BaseMemoryLib.h>
 #include <Library/DebugLib.h>
-#include <Library/HobLib.h>
 #include <Library/MemoryAllocationLib.h>
 #include <Library/PrintLib.h>
 #include <Library/UefiBootServicesTableLib.h>
 #include <Protocol/Smbios.h>
 
-// Type0 Data
-#define VENDOR_TEMPLATE       "Ampere(R)\0"
-#define BIOS_VERSION_TEMPLATE "TianoCore 0.00.00000000 (SYS: 0.00.00000000)\0"
-#define RELEASE_DATE_TEMPLATE "MM/DD/YYYY\0"
-
-#define TYPE0_ADDITIONAL_STRINGS                    \
-  VENDOR_TEMPLATE       /* Vendor */         \
-  BIOS_VERSION_TEMPLATE /* BiosVersion */    \
-  RELEASE_DATE_TEMPLATE /* BiosReleaseDate */
-
-// Type1 Data
-#define MANUFACTURER_TEMPLATE "Ampere(R)\0"
-#define PRODUCT_NAME_TEMPLATE "Mt. Jade\0"
-#define SYS_VERSION_TEMPLATE  "PR010\0"
-#define SERIAL_TEMPLATE       "123456789ABCDEFF123456789ABCDEFF\0"
-#define SKU_TEMPLATE          "FEDCBA9876543211FEDCBA9876543211\0"
-#define FAMILY_TEMPLATE       "Altra\0"
-
-#define TYPE1_ADDITIONAL_STRINGS                  \
-  MANUFACTURER_TEMPLATE /* Manufacturer */  \
-  PRODUCT_NAME_TEMPLATE /* Product Name */  \
-  SYS_VERSION_TEMPLATE  /* Version */       \
-  SERIAL_TEMPLATE       /* Serial Number */ \
-  SKU_TEMPLATE          /* SKU Number */    \
-  FAMILY_TEMPLATE       /* Family */
-
-#define TYPE2_ADDITIONAL_STRINGS                   \
-  MANUFACTURER_TEMPLATE /* Manufacturer */   \
-  PRODUCT_NAME_TEMPLATE /* Product Name */   \
-  "EVT2\0"              /* Version */        \
-  "Serial Not Set\0"    /* Serial */         \
-  "Base of Chassis\0"   /* board location */ \
-  "FF\0"                /* Version */        \
-  "FF\0"                /* Version */
-
 #define CHASSIS_VERSION_TEMPLATE    "None               \0"
 #define CHASSIS_SERIAL_TEMPLATE     "Serial Not Set     \0"
 #define CHASSIS_ASSET_TAG_TEMPLATE  "Asset Tag Not Set  \0"
 
-#define TYPE3_ADDITIONAL_STRINGS                 \
-  MANUFACTURER_TEMPLATE      /* Manufacturer */ \
-  CHASSIS_VERSION_TEMPLATE   /* Version */      \
-  CHASSIS_SERIAL_TEMPLATE    /* Serial  */      \
-  CHASSIS_ASSET_TAG_TEMPLATE /* Asset Tag */    \
-  SKU_TEMPLATE               /* SKU Number */
-
 #define TYPE8_ADDITIONAL_STRINGS      \
   "VGA1 - Rear VGA Connector\0"       \
   "DB-15 Male (VGA)         \0"
@@ -75,9 +31,6 @@
 #define TYPE11_ADDITIONAL_STRINGS       \
   "www.amperecomputing.com\0"
 
-#define TYPE13_ADDITIONAL_STRINGS       \
-  "en|US|iso8859-1\0"
-
 #define TYPE41_ADDITIONAL_STRINGS       \
   "Onboard VGA\0"
 
@@ -94,26 +47,6 @@
 // the SMBIOS specification (section 6.2, version 3.0)
 //
 #pragma pack(1)
-typedef struct {
-  SMBIOS_TABLE_TYPE0 Base;
-  CHAR8              Strings[sizeof (TYPE0_ADDITIONAL_STRINGS)];
-} ARM_TYPE0;
-
-typedef struct {
-  SMBIOS_TABLE_TYPE1 Base;
-  CHAR8              Strings[sizeof (TYPE1_ADDITIONAL_STRINGS)];
-} ARM_TYPE1;
-
-typedef struct {
-  SMBIOS_TABLE_TYPE2 Base;
-  CHAR8              Strings[sizeof (TYPE2_ADDITIONAL_STRINGS)];
-} ARM_TYPE2;
-
-typedef struct {
-  SMBIOS_TABLE_TYPE3 Base;
-  CHAR8              Strings[sizeof (TYPE3_ADDITIONAL_STRINGS)];
-} ARM_TYPE3;
-
 typedef struct {
   SMBIOS_TABLE_TYPE8 Base;
   CHAR8              Strings[sizeof (TYPE8_ADDITIONAL_STRINGS)];
@@ -129,11 +62,6 @@ typedef struct {
   CHAR8               Strings[sizeof (TYPE11_ADDITIONAL_STRINGS)];
 } ARM_TYPE11;
 
-typedef struct {
-  SMBIOS_TABLE_TYPE13 Base;
-  CHAR8               Strings[sizeof (TYPE13_ADDITIONAL_STRINGS)];
-} ARM_TYPE13;
-
 typedef struct {
   SMBIOS_TABLE_TYPE41 Base;
   CHAR8               Strings[sizeof (TYPE41_ADDITIONAL_STRINGS)];
@@ -141,125 +69,6 @@ typedef struct {
 
 #pragma pack()
 
-// Type 0 BIOS information
-STATIC ARM_TYPE0 mArmDefaultType0 = {
-  {
-    {                                   // Header
-      EFI_SMBIOS_TYPE_BIOS_INFORMATION, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE0),      // UINT8 Length, The length of the structure's string-set is not included.
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-
-    ADDITIONAL_STR_INDEX_1,     // SMBIOS_TABLE_STRING       Vendor
-    ADDITIONAL_STR_INDEX_2,     // SMBIOS_TABLE_STRING       BiosVersion
-    0,                          // UINT16                    BiosSegment
-    ADDITIONAL_STR_INDEX_3,     // SMBIOS_TABLE_STRING       BiosReleaseDate
-    0,                          // UINT8                     BiosSize
-
-    // MISC_BIOS_CHARACTERISTICS BiosCharacteristics
-    {
-      0,0,0,0,0,0,
-      1, // PCI supported
-      0,
-      1, // PNP supported
-      0,
-      1, // BIOS upgradable
-      0, 0, 0,
-      0, // Boot from CD
-      1, // selectable boot
-    },
-
-    // BIOSCharacteristicsExtensionBytes[2]
-    {
-      0,
-      0,
-    },
-
-    0,     // UINT8                     SystemBiosMajorRelease
-    0,     // UINT8                     SystemBiosMinorRelease
-
-    // If the system does not have field upgradeable embedded controller
-    // firmware, the value is 0FFh
-    0xFF,  // UINT8                     EmbeddedControllerFirmwareMajorRelease
-    0xFF   // UINT8                     EmbeddedControllerFirmwareMinorRelease
-  },
-
-  // Text strings (unformatted area)
-  TYPE0_ADDITIONAL_STRINGS
-};
-
-// Type 1 System information
-STATIC ARM_TYPE1 mArmDefaultType1 = {
-  {
-    { // Header
-      EFI_SMBIOS_TYPE_SYSTEM_INFORMATION,
-      sizeof (SMBIOS_TABLE_TYPE1),
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-
-    ADDITIONAL_STR_INDEX_1,                                                     // Manufacturer
-    ADDITIONAL_STR_INDEX_2,                                                     // Product Name
-    ADDITIONAL_STR_INDEX_3,                                                     // Version
-    ADDITIONAL_STR_INDEX_4,                                                     // Serial Number
-    { 0x12345678, 0x9ABC, 0xDEFF, { 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xFF }}, // UUID
-    SystemWakeupTypePowerSwitch,                                                // Wakeup type
-    ADDITIONAL_STR_INDEX_5,                                                     // SKU Number
-    ADDITIONAL_STR_INDEX_6,                                                     // Family
-  },
-
-  // Text strings (unformatted)
-  TYPE1_ADDITIONAL_STRINGS
-};
-
-// Type 2 Baseboard
-STATIC ARM_TYPE2 mArmDefaultType2 = {
-  {
-    {                                        // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_BASEBOARD_INFORMATION, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE2),           // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1, // Manufacturer
-    ADDITIONAL_STR_INDEX_2, // Product Name
-    ADDITIONAL_STR_INDEX_3, // Version
-    ADDITIONAL_STR_INDEX_4, // Serial
-    0,                      // Asset tag
-    {1},                    // motherboard, not replaceable
-    ADDITIONAL_STR_INDEX_5, // location of board
-    0xFFFF,                 // chassis handle
-    BaseBoardTypeMotherBoard,
-    0,
-    {0},
-  },
-  TYPE2_ADDITIONAL_STRINGS
-};
-
-// Type 3 Enclosure
-STATIC CONST ARM_TYPE3 mArmDefaultType3 = {
-  {
-    {                                   // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE3),      // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,          // Manufacturer
-    MiscChassisTypeRackMountChassis, // Rack-mounted chassis
-    ADDITIONAL_STR_INDEX_2,          // version
-    ADDITIONAL_STR_INDEX_3,          // serial
-    ADDITIONAL_STR_INDEX_4,          // asset tag
-    ChassisStateUnknown,             // boot chassis state
-    ChassisStateSafe,                // power supply state
-    ChassisStateSafe,                // thermal state
-    ChassisSecurityStatusNone,       // security state
-    {0,0,0,0},                       // OEM defined
-    2,                               // 2U height
-    2,                               // number of power cords
-    0,                               // no contained elements
-    3,                               // ContainedElementRecordLength;
-  },
-  TYPE3_ADDITIONAL_STRINGS
-};
-
 // Type 8 Port Connector Information
 STATIC CONST ARM_TYPE8 mArmDefaultType8Vga = {
   {
@@ -611,22 +420,6 @@ STATIC ARM_TYPE11 mArmDefaultType11 = {
   TYPE11_ADDITIONAL_STRINGS
 };
 
-// Type 13 BIOS Language Information
-STATIC ARM_TYPE13 mArmDefaultType13 = {
-  {
-    {                                            // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE13),              // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    1,
-    0,
-    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-    1,
-  },
-  TYPE13_ADDITIONAL_STRINGS
-};
-
 // Type 24 Hardware Security
 STATIC SMBIOS_TABLE_TYPE24 mArmDefaultType24 = {
   {                                    // SMBIOS_STRUCTURE Hdr
@@ -637,17 +430,6 @@ STATIC SMBIOS_TABLE_TYPE24 mArmDefaultType24 = {
   0
 };
 
-// Type 32 System Boot Information
-STATIC SMBIOS_TABLE_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},
-  0
-};
-
 // Type 38 IPMI Device Information
 STATIC SMBIOS_TABLE_TYPE38 mArmDefaultType38 = {
   {                                          // SMBIOS_STRUCTURE Hdr
@@ -694,9 +476,6 @@ STATIC SMBIOS_TABLE_TYPE42 mArmDefaultType42 = {
 
 STATIC CONST VOID *DefaultCommonTables[] =
 {
-  &mArmDefaultType0,
-  &mArmDefaultType1,
-  &mArmDefaultType2,
   &mArmDefaultType8Vga,
   &mArmDefaultType8USBFront,
   &mArmDefaultType8USBRear,
@@ -714,9 +493,7 @@ STATIC CONST VOID *DefaultCommonTables[] =
   &mArmDefaultType9Sk1NvmeM2Slot1,
   &mArmDefaultType9Sk1NvmeM2Slot2,
   &mArmDefaultType11,
-  &mArmDefaultType13,
   &mArmDefaultType24,
-  &mArmDefaultType32,
   &mArmDefaultType38,
   &mArmDefaultType41,
   &mArmDefaultType42,
@@ -728,80 +505,6 @@ typedef struct {
   CHAR8 DigitStr[3];     // example "01", Smbios date format, month
 } MonthStringDig;
 
-STATIC MonthStringDig MonthMatch[12] = {
-  { "Jan", "01" },
-  { "Feb", "02" },
-  { "Mar", "03" },
-  { "Apr", "04" },
-  { "May", "05" },
-  { "Jun", "06" },
-  { "Jul", "07" },
-  { "Aug", "08" },
-  { "Sep", "09" },
-  { "Oct", "10" },
-  { "Nov", "11" },
-  { "Dec", "12" }
-};
-
-STATIC
-VOID
-ConstructBuildDate (
-  OUT CHAR8 *DateBuf
-  )
-{
-  UINTN i;
-
-  // GCC __DATE__ format is "Feb  2 1996"
-  // If the day of the month is less than 10, it is padded with a space on the left
-  CHAR8 *BuildDate = __DATE__;
-
-  // SMBIOS spec date string: MM/DD/YYYY
-  CHAR8 SmbiosDateStr[sizeof (RELEASE_DATE_TEMPLATE)] = { 0 };
-
-  SmbiosDateStr[sizeof (RELEASE_DATE_TEMPLATE) - 1] = '\0';
-
-  SmbiosDateStr[2] = '/';
-  SmbiosDateStr[5] = '/';
-
-  // Month
-  for (i = 0; i < sizeof (MonthMatch) / sizeof (MonthMatch[0]); i++) {
-    if (AsciiStrnCmp (&BuildDate[0], MonthMatch[i].MonthNameStr, AsciiStrLen (MonthMatch[i].MonthNameStr)) == 0) {
-      CopyMem (&SmbiosDateStr[0], MonthMatch[i].DigitStr, AsciiStrLen (MonthMatch[i].DigitStr));
-      break;
-    }
-  }
-
-  // Day
-  CopyMem (&SmbiosDateStr[3], &BuildDate[4], 2);
-  if (BuildDate[4] == ' ') {
-    // day is less then 10, SAPCE filed by compiler, SMBIOS requires 0
-    SmbiosDateStr[3] = '0';
-  }
-
-  // Year
-  CopyMem (&SmbiosDateStr[6], &BuildDate[7], 4);
-
-  CopyMem (DateBuf, SmbiosDateStr, AsciiStrLen (RELEASE_DATE_TEMPLATE));
-}
-
-STATIC
-UINT8
-GetBiosVerMajor (
-  VOID
-  )
-{
-  return (PcdGet8 (PcdSmbiosTables0MajorVersion));
-}
-
-STATIC
-UINT8
-GetBiosVerMinor (
-  VOID
-  )
-{
-  return (PcdGet8 (PcdSmbiosTables0MinorVersion));
-}
-
 STATIC
 UINTN
 GetStringPackSize (
@@ -881,148 +584,6 @@ UpdateStringPack (
   return EFI_SUCCESS;
 }
 
-STATIC
-EFI_STATUS
-UpdateSmbiosType0 (
-  PLATFORM_INFO_HOB  *PlatformHob
-  )
-{
-  EFI_STATUS                          Status        = EFI_SUCCESS;
-  MISC_BIOS_CHARACTERISTICS_EXTENSION *MiscExt      = NULL;
-  CHAR8                               *ReleaseDateBuf = NULL;
-  CHAR8                               *PcdReleaseDate = NULL;
-  CHAR8                               AsciiVersion[32];
-  UINTN                               Index;
-  CHAR8                               BiosVersionStr[128];
-  CHAR8                               *StringPack;
-  CHAR8                               SizeOfFirmwareVer;
-  UINT16                              *FirmwareVersionPcdPtr;
-
-  //
-  //  Update Type0 information
-  //
-
-  ReleaseDateBuf = &mArmDefaultType0.Strings[0]
-                   + sizeof (VENDOR_TEMPLATE) - 1
-                   + sizeof (BIOS_VERSION_TEMPLATE) - 1;
-  PcdReleaseDate = (CHAR8 *)PcdGetPtr (PcdSmbiosTables0BiosReleaseDate);
-
-  if (AsciiStrnCmp (PcdReleaseDate, RELEASE_DATE_TEMPLATE, AsciiStrLen (RELEASE_DATE_TEMPLATE)) == 0) {
-    // If PCD is still template date MM/DD/YYYY, use compiler date
-    ConstructBuildDate (ReleaseDateBuf);
-  } else {
-    // PCD is updated somehow, use PCD date
-    CopyMem (ReleaseDateBuf, PcdReleaseDate, AsciiStrLen (PcdReleaseDate));
-  }
-
-  if (PcdGet32 (PcdFdSize) < SIZE_16MB) {
-    mArmDefaultType0.Base.BiosSize = (PcdGet32 (PcdFdSize) / SIZE_64KB) - 1;
-
-    mArmDefaultType0.Base.ExtendedBiosSize.Size = 0;
-    mArmDefaultType0.Base.ExtendedBiosSize.Unit = 0;
-  } else {
-    // Need to update Extended BIOS ROM Size
-    mArmDefaultType0.Base.BiosSize = 0xFF;
-
-    // As a reminder
-    ASSERT (FALSE);
-  }
-
-  // Type0 BIOS Characteristics Extension Byte 1
-  MiscExt = (MISC_BIOS_CHARACTERISTICS_EXTENSION *)&(mArmDefaultType0.Base.BIOSCharacteristicsExtensionBytes);
-
-  MiscExt->BiosReserved.AcpiIsSupported = 1;
-
-  // Type0 BIOS Characteristics Extension Byte 2
-  MiscExt->SystemReserved.BiosBootSpecIsSupported = 1;
-  MiscExt->SystemReserved.FunctionKeyNetworkBootIsSupported = 1;
-  MiscExt->SystemReserved.UefiSpecificationSupported = 1;
-
-  // Type0 BIOS Release
-  // Decide another way: If the system does not support the use of this
-  // field, the value is 0FFh
-  mArmDefaultType0.Base.SystemBiosMajorRelease = GetBiosVerMajor ();
-  mArmDefaultType0.Base.SystemBiosMinorRelease = GetBiosVerMinor ();
-
-  //
-  // Format of PcdFirmwareVersionString is
-  // "(MAJOR_VER).(MINOR_VER).(BUILD) Build YYYY.MM.DD", we only need
-  // "(MAJOR_VER).(MINOR_VER).(BUILD)" showed in Bios version. Using
-  // space character to determine this string. Another case uses null
-  // character to end while loop.
-  //
-  SizeOfFirmwareVer = 0;
-  FirmwareVersionPcdPtr = (UINT16 *)PcdGetPtr (PcdFirmwareVersionString);
-  while (*FirmwareVersionPcdPtr != ' ' && *FirmwareVersionPcdPtr != '\0') {
-    SizeOfFirmwareVer++;
-    FirmwareVersionPcdPtr++;
-  }
-
-  AsciiSPrint (
-    BiosVersionStr,
-    sizeof (BiosVersionStr),
-    "TianoCore %.*s (SYS: %a.%a)",
-    SizeOfFirmwareVer,
-    PcdGetPtr (PcdFirmwareVersionString),
-    PlatformHob->SmPmProVer,
-    PlatformHob->SmPmProBuild
-    );
-  StringPack = mArmDefaultType0.Strings;
-
-  UpdateStringPack (StringPack, BiosVersionStr, ADDITIONAL_STR_INDEX_2);
-
-  /* Update SMBIOS Type 0 EC Info */
-  CopyMem (
-    (VOID *)&AsciiVersion,
-    (VOID *)&PlatformHob->SmPmProVer,
-    sizeof (PlatformHob->SmPmProVer)
-    );
-  /* The AsciiVersion is formated as "major.minor" */
-  for (Index = 0; Index < (UINTN)AsciiStrLen (AsciiVersion); Index++) {
-    if (AsciiVersion[Index] == '.') {
-      AsciiVersion[Index] = '\0';
-      break;
-    }
-  }
-
-  mArmDefaultType0.Base.EmbeddedControllerFirmwareMajorRelease =
-    (UINT8)AsciiStrDecimalToUintn (AsciiVersion);
-  mArmDefaultType0.Base.EmbeddedControllerFirmwareMinorRelease =
-    (UINT8)AsciiStrDecimalToUintn (AsciiVersion + Index + 1);
-
-  return Status;
-}
-
-STATIC
-EFI_STATUS
-InstallType3Structure (
-  IN EFI_SMBIOS_PROTOCOL *Smbios
-  )
-{
-  EFI_STATUS          Status = EFI_SUCCESS;
-  EFI_SMBIOS_HANDLE   SmbiosHandle;
-
-  ASSERT (Smbios != NULL);
-
-  SmbiosHandle = ((EFI_SMBIOS_TABLE_HEADER*) &mArmDefaultType3)->Handle;
-  Status = Smbios->Add (
-                     Smbios,
-                     NULL,
-                     &SmbiosHandle,
-                     (EFI_SMBIOS_TABLE_HEADER *)&mArmDefaultType3
-                     );
-  if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "adding SMBIOS type 3 failed\n"));
-    // stop adding rather than continuing
-    return Status;
-  }
-
-  // Save this handle to type 2 table
-  mArmDefaultType2.Base.ChassisHandle = SmbiosHandle;
-
-  return Status;
-}
-
 /**
    Install a whole table worth of structures
 
@@ -1060,31 +621,6 @@ InstallStructures (
   return EFI_SUCCESS;
 }
 
-STATIC
-VOID
-UpdateSmbiosInfo (
-  VOID
-  )
-{
-  VOID               *Hob;
-  PLATFORM_INFO_HOB  *PlatformHob;
-
-  /* Get the Platform HOB */
-  Hob = GetFirstGuidHob (&gPlatformInfoHobGuid);
-  ASSERT (Hob != NULL);
-  if (Hob == NULL) {
-    return;
-  }
-
-  PlatformHob = (PLATFORM_INFO_HOB *)GET_GUID_HOB_DATA (Hob);
-
-  //
-  //  Update Type0 information
-  //
-  UpdateSmbiosType0 (PlatformHob);
-
-}
-
 /**
    Install all structures from the DefaultTables structure
 
@@ -1100,12 +636,6 @@ InstallAllStructures (
 
   ASSERT (Smbios != NULL);
 
-  // Update SMBIOS Tables
-  UpdateSmbiosInfo ();
-
-  // Install Type 3 table
-  InstallType3Structure (Smbios);
-
   // Install Tables
   Status = InstallStructures (Smbios, DefaultCommonTables);
   ASSERT_EFI_ERROR (Status);
diff --git a/Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.c b/Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.c
index 6f5869b1ef1c..0604bf351c89 100644
--- a/Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.c
+++ b/Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.c
@@ -1,7 +1,7 @@
 /** @file
 *  OemMiscLib.c
 *
-*  Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
+*  Copyright (c) 2021 - 2023, Ampere Computing LLC. All rights reserved.
 *  Copyright (c) 2021, NUVIA Inc. All rights reserved.
 *  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
 *  Copyright (c) 2018, Linaro Limited. All rights reserved.
@@ -10,6 +10,7 @@
 *
 **/
 
+#include <PiPei.h>
 #include <Uefi.h>
 #include <IndustryStandard/ArmCache.h>
 #include <Library/AmpereCpuLib.h>
@@ -17,10 +18,21 @@
 #include <Library/BaseMemoryLib.h>
 #include <Library/DebugLib.h>
 #include <Library/HiiLib.h>
+#include <Library/HobLib.h>
+#include <Library/MemoryAllocationLib.h>
 #include <Library/OemMiscLib.h>
+#include <Library/PrintLib.h>
+#include <Guid/PlatformInfoHob.h>
+
+#define PROCESSOR_VERSION_ALTRA       L"Ampere(R) Altra(R) Processor"
+#define PROCESSOR_VERSION_ALTRA_MAX   L"Ampere(R) Altra(R) Max Processor"
 
 #define MHZ_SCALE_FACTOR    1000000
 
+#define SCP_VERSION_STRING_MAX_LENGTH 32
+
+#define OEM_DEFAULT_INFORMATION L"To Be Filled By O.E.M."
+
 UINT32
 GetCacheConfig (
   IN UINT32  CacheLevel,
@@ -216,6 +228,74 @@ OemIsProcessorPresent (
   return FALSE;
 }
 
+/**
+  Update the firmware version in SMBIOS Type 0.
+  This is the combination of UEFI and Ampere system firmware version.
+
+**/
+VOID
+UpdateFirmwareVersionString (
+  OUT CHAR16  *Version
+  )
+{
+  UINT8   UnicodeStrLen;
+  UINT8   FirmwareVersionStrLen;
+  UINT8   FirmwareVersionStrSize;
+  UINT8   *ScpVersion;
+  UINT8   *ScpBuild;
+  CHAR16  UnicodeStr[SMBIOS_STRING_MAX_LENGTH * sizeof (CHAR16)];
+  CHAR16  *FirmwareVersionPcdPtr;
+
+  FirmwareVersionStrLen = 0;
+  ZeroMem (UnicodeStr, sizeof (UnicodeStr));
+  FirmwareVersionPcdPtr  = (CHAR16 *)FixedPcdGetPtr (PcdFirmwareVersionString);
+  FirmwareVersionStrSize = SMBIOS_STRING_MAX_LENGTH * sizeof (CHAR16);
+
+  //
+  // Format of PcdFirmwareVersionString is
+  // "(MAJOR_VER).(MINOR_VER).(BUILD) Build YYYY.MM.DD", we only need
+  // "(MAJOR_VER).(MINOR_VER).(BUILD)" showed in BIOS version. Using
+  // space character to determine this string. Another case uses null
+  // character to end while loop.
+  //
+  while (*FirmwareVersionPcdPtr != ' ' && *FirmwareVersionPcdPtr != '\0') {
+    FirmwareVersionStrLen++;
+    FirmwareVersionPcdPtr++;
+  }
+
+  FirmwareVersionPcdPtr = (CHAR16 *)FixedPcdGetPtr (PcdFirmwareVersionString);
+  UnicodeStrLen         = FirmwareVersionStrLen * sizeof (CHAR16);
+  CopyMem (UnicodeStr, FirmwareVersionPcdPtr, UnicodeStrLen);
+
+  GetScpVersion (&ScpVersion);
+  GetScpBuild (&ScpBuild);
+  if ((ScpVersion == NULL) || (ScpBuild == NULL)) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "%a:%d: Fail to get SMpro/PMpro information\n",
+      __func__,
+      __LINE__
+      ));
+    UnicodeSPrint (
+      Version,
+      FirmwareVersionStrSize,
+      L"TianoCore %.*s (SYS: 0.00.00000000)",
+      FirmwareVersionStrLen,
+      (UINT16 *)UnicodeStr
+      );
+  } else {
+    UnicodeSPrint (
+      Version,
+      FirmwareVersionStrSize,
+      L"TianoCore %.*s (SYS: %a.%a)",
+      FirmwareVersionStrLen,
+      (UINT16 *)UnicodeStr,
+      ScpVersion,
+      ScpBuild
+      );
+  }
+}
+
 /** Updates the HII string for the specified field.
 
   @param HiiHandle     The HII handle.
@@ -230,7 +310,91 @@ OemUpdateSmbiosInfo (
   IN OEM_MISC_SMBIOS_HII_STRING_FIELD Field
   )
 {
-  return;
+  EFI_STRING UnicodeString;
+  UINT8      StringLength;
+
+  StringLength = SMBIOS_STRING_MAX_LENGTH * sizeof (CHAR16);
+  UnicodeString = AllocatePool (StringLength);
+  if (UnicodeString == NULL) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "%a:%d: There is not enough memory remaining to satisfy the request\n",
+      __func__,
+      __LINE__));
+
+    goto Exit;
+  }
+
+  switch (Field) {
+    case ProductNameType01:
+    case SystemManufacturerType01:
+    case VersionType01:
+    case SerialNumType01:
+    case SkuNumberType01:
+      UnicodeSPrint (
+        UnicodeString,
+        StringLength,
+        OEM_DEFAULT_INFORMATION
+        );
+      break;
+
+    case FamilyType01:
+      UnicodeSPrint (
+        UnicodeString,
+        StringLength,
+        IsAc01Processor () ? L"Altra\0" : L"Altra Max\0"
+        );
+      break;
+
+    case ProductNameType02:
+    case AssetTagType02:
+    case VersionType02:
+    case SerialNumberType02:
+    case BoardManufacturerType02:
+      UnicodeSPrint (
+        UnicodeString,
+        StringLength,
+        OEM_DEFAULT_INFORMATION
+        );
+      break;
+
+    case ChassisLocationType02:
+      UnicodeSPrint (
+        UnicodeString,
+        StringLength,
+        L"Base of Chassis"
+        );
+      break;
+
+    case SerialNumberType03:
+    case VersionType03:
+    case ManufacturerType03:
+    case AssetTagType03:
+    case SkuNumberType03:
+      UnicodeSPrint (
+        UnicodeString,
+        StringLength,
+        OEM_DEFAULT_INFORMATION
+        );
+      break;
+
+    case BiosVersionType00:
+      UpdateFirmwareVersionString (UnicodeString);
+      break;
+
+    default:
+      UnicodeSPrint (
+        UnicodeString,
+        StringLength,
+        L"Not Specified"
+        );
+  }
+
+  // Update string value for respective token.
+  HiiSetString (HiiHandle, TokenToUpdate, UnicodeString, NULL);
+
+Exit:
+  FreePool (UnicodeString);
 }
 
 /** Fetches the Type 32 boot information status.
@@ -323,3 +487,81 @@ OemGetChassisNumPowerCords (
 {
   return 2;
 }
+
+/** Fetches the BIOS release.
+
+  @return The BIOS release.
+**/
+UINT16
+EFIAPI
+OemGetBiosRelease (
+  VOID
+  )
+{
+  UINT16 BiosRelease;
+
+  BiosRelease = (UINT16)(((PcdGet8 (PcdSmbiosTables0MajorVersion)) << 8)
+                         | PcdGet8 (PcdSmbiosTables0MinorVersion));
+
+  return BiosRelease;
+}
+
+/**
+  Fetches the embedded controller firmware release.
+
+  @return   UINT16   The embedded controller firmware release.
+**/
+UINT16
+EFIAPI
+OemGetEmbeddedControllerFirmwareRelease (
+  VOID
+  )
+{
+  CHAR8  AsciiScpVer[SCP_VERSION_STRING_MAX_LENGTH];
+  UINT8  *ScpVer = NULL;
+  UINT8  Index;
+  UINT16 FirmwareRelease;
+
+  GetScpVersion (&ScpVer);
+  if (ScpVer == NULL) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "%a:%d: Fail to get SMpro/PMpro information\n",
+      __func__,
+      __LINE__));
+
+      return 0xFFFF;
+  }
+
+  CopyMem ((VOID *)AsciiScpVer, (VOID *)ScpVer, AsciiStrLen ((CHAR8 *)ScpVer));
+  /* The AsciiVersion is formated as "major.minor" */
+  for (Index = 0; Index < (UINTN)AsciiStrLen (AsciiScpVer); Index++) {
+    if (AsciiScpVer[Index] == '.') {
+      AsciiScpVer[Index] = '\0';
+      break;
+    }
+  }
+
+  FirmwareRelease = ((UINT8)AsciiStrDecimalToUintn (AsciiScpVer) << 8)
+                    + (UINT8)AsciiStrDecimalToUintn (AsciiScpVer + Index + 1);
+
+  return FirmwareRelease;
+}
+
+/**
+  Fetches the system UUID.
+
+  @param[out]   SystemUuid   The pointer to the buffer to store the System UUID.
+**/
+VOID
+EFIAPI
+OemGetSystemUuid (
+  OUT GUID  *SystemUuid
+  )
+{
+  if (SystemUuid == NULL) {
+    return;
+  }
+
+  CopyGuid (SystemUuid, &gZeroGuid);
+}
diff --git a/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLibCommon.c b/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLibCommon.c
index 919d9d77b25c..853ab5543f11 100644
--- a/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLibCommon.c
+++ b/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLibCommon.c
@@ -513,6 +513,48 @@ GetNumberOfConfiguredCPMs (
   return Count;
 }
 
+/**
+  Get version of SCP.
+
+  @param[out]   ScpVer   Pointer to contain version of SCP value.
+**/
+VOID
+EFIAPI
+GetScpVersion (
+  UINT8 **ScpVer
+  )
+{
+  PLATFORM_INFO_HOB *PlatformHob;
+
+  PlatformHob = GetPlatformHob ();
+  if (PlatformHob != NULL) {
+    *ScpVer = (UINT8 *)PlatformHob->SmPmProVer;
+  } else {
+    *ScpVer = NULL;
+  }
+}
+
+/**
+  Get date of build release for SCP.
+
+  @param[out]   ScpBuild   Pointer to contain date of build release for SCP.
+**/
+VOID
+EFIAPI
+GetScpBuild (
+  UINT8 **ScpBuild
+  )
+{
+  PLATFORM_INFO_HOB *PlatformHob;
+
+  PlatformHob = GetPlatformHob ();
+  if (PlatformHob != NULL) {
+    *ScpBuild = (UINT8 *)PlatformHob->SmPmProBuild;
+  } else {
+    *ScpBuild = NULL;
+  }
+}
+
 /**
   Set the number of configured CPM per socket.
 
-- 
2.39.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [edk2-platforms][PATCH 3/4] JadePkg: Refactor SmbiosPlatformDxe
  2023-05-24  0:40 [edk2-platforms][PATCH 0/4] Add support new SMBIOS Tables and refactor to adapt with ArmPkg/SMBIOS Minh Nguyen
  2023-05-24  0:40 ` [edk2-platforms][PATCH 1/4] JadePkg: Correct PCD names for SMBIOS Type 0 Minh Nguyen
  2023-05-24  0:40 ` [edk2-platforms][PATCH 2/4] JadePkg: Leverage ArmPkg/Smbios (Type 0, 1, 2, 3, 13, 32) Minh Nguyen
@ 2023-05-24  0:40 ` Minh Nguyen
  2023-05-24  0:40 ` [edk2-platforms][PATCH 4/4] JadePkg: Add support SMBIOS Table Type 16, 17, 19 Minh Nguyen
  2023-06-02 12:48 ` [edk2-platforms][PATCH 0/4] Add support new SMBIOS Tables and refactor to adapt with ArmPkg/SMBIOS Ard Biesheuvel
  4 siblings, 0 replies; 7+ messages in thread
From: Minh Nguyen @ 2023-05-24  0:40 UTC (permalink / raw)
  To: devel; +Cc: patches, quic_llindhol, ardb+tianocore, nhi, minhnguyen1

This refactor is derrived from ArmPkg/SMBIOS and customize to adapt
with platform. These changes help to separate each Type of SMBIOS table
into individual modules. It makes the structure of SmbiosPlatformDxe
module clear and easier to add new type of table.

Signed-off-by: Minh Nguyen <minhnguyen1@os.amperecomputing.com>
---
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf                           |   27 +-
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h                             |  201 ++++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c                             | 1083 ++++++++------------
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c                    |   72 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorData.c              |  142 +++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorFunction.c          |   57 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotData.c                 |  268 +++++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotFunction.c             |   58 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringData.c                  |   42 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringFunction.c              |   57 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityData.c           |   42 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityFunction.c       |   57 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceData.c                 |   46 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceFunction.c             |   39 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedData.c     |   47 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedFunction.c |   57 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni                    |   21 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnector.uni                |   22 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlot.uni                   |   20 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemString.uni                    |   11 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtended.uni       |   10 +
 21 files changed, 1735 insertions(+), 644 deletions(-)

diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
old mode 100644
new mode 100755
index 549aa38b1774..83ff918fc42d
--- a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
@@ -15,7 +15,22 @@ [Defines]
   ENTRY_POINT                    = SmbiosPlatformDxeEntry
 
 [Sources]
+  SmbiosPlatformDxe.h
   SmbiosPlatformDxe.c
+  SmbiosPlatformDxeDataTable.c
+  SmbiosPlatformDxeStrings.uni
+  Type08/PlatformPortConnectorData.c
+  Type08/PlatformPortConnectorFunction.c
+  Type09/PlatformSystemSlotData.c
+  Type09/PlatformSystemSlotFunction.c
+  Type11/PlatformOemStringData.c
+  Type11/PlatformOemStringFunction.c
+  Type24/PlatformHardwareSecurityData.c
+  Type24/PlatformHardwareSecurityFunction.c
+  Type38/PlatformIpmiDeviceData.c
+  Type38/PlatformIpmiDeviceFunction.c
+  Type41/PlatformOnboardDevicesExtendedData.c
+  Type41/PlatformOnboardDevicesExtendedFunction.c
 
 [Packages]
   ArmPkg/ArmPkg.dec
@@ -25,19 +40,23 @@ [Packages]
   Silicon/Ampere/AmpereSiliconPkg/AmpereSiliconPkg.dec
 
 [LibraryClasses]
+  AmpereCpuLib
   BaseLib
   BaseMemoryLib
   DebugLib
+  HiiLib
   MemoryAllocationLib
+  NVParamLib
+  #IOExpanderLib
   UefiBootServicesTableLib
   UefiDriverEntryPoint
   UefiLib
 
 [Protocols]
-  gEfiSmbiosProtocolGuid                     ## CONSUMED
+  gEfiSmbiosProtocolGuid                            ## CONSUMED
 
-[Pcd]
-  gArmTokenSpaceGuid.PcdFdSize
+[Guids]
+  gCpuConfigFormSetGuid
 
 [Depex]
-  gEfiSmbiosProtocolGuid
+  TRUE
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h
new file mode 100644
index 000000000000..df7d44ffecb6
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h
@@ -0,0 +1,201 @@
+/** @file
+  Header file for the SmbiosPlatformDxe Driver.
+
+  Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
+  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef SMBIOS_PLATFORM_DXE_H_
+#define SMBIOS_PLATFORM_DXE_H_
+
+#include <Protocol/Smbios.h>
+#include <IndustryStandard/SmBios.h>
+
+#define NULL_TERMINATED_TYPE             0xFF
+#define NULL_TERMINATED_TOKEN            0xFFFF
+
+#define END_OF_SMBIOS_TABLE_TYPE         127
+#define SMBIOS_UNICODE_STRING_MAX_LENGTH (SMBIOS_STRING_MAX_LENGTH * sizeof (CHAR16))
+
+typedef enum {
+  ADDITIONAL_STR_INDEX_1 = 1,
+  ADDITIONAL_STR_INDEX_2,
+  ADDITIONAL_STR_INDEX_3,
+  ADDITIONAL_STR_INDEX_4,
+  ADDITIONAL_STR_INDEX_5,
+  ADDITIONAL_STR_INDEX_6,
+  ADDITIONAL_STR_INDEX_7,
+  ADDITIONAL_STR_INDEX_8,
+  ADDITIONAL_STR_INDEX_9,
+  ADDITIONAL_STR_INDEX_MAX
+} ADDITIONAl_STR_INDEX;
+
+//
+// Data table entry update function.
+//
+typedef EFI_STATUS (EFIAPI SMBIOS_PLATFORM_DXE_DATA_FUNCTION)(
+  IN VOID *RecordData,
+  IN VOID *StrToken
+);
+
+#pragma pack(1)
+//
+//  Data table entry definition.
+//
+typedef struct {
+  //
+  // Intermediate input data for SMBIOS record
+  //
+  VOID                              *RecordData;
+  VOID                              *StrToken;
+  SMBIOS_PLATFORM_DXE_DATA_FUNCTION *Function;
+} SMBIOS_PLATFORM_DXE_DATA_TABLE;
+
+typedef struct {
+  UINT16 TokenArray[ADDITIONAL_STR_INDEX_MAX];
+  UINT8  TokenLen;
+} STR_TOKEN_INFO;
+#pragma pack()
+
+//
+// SMBIOS table extern definitions.
+//
+#define SMBIOS_PLATFORM_DXE_TABLE_EXTERNS(SMBIOS_TYPE, BASE_NAME) \
+extern SMBIOS_TYPE BASE_NAME ## Data[]; \
+extern STR_TOKEN_INFO BASE_NAME ## StrToken[]; \
+extern SMBIOS_PLATFORM_DXE_DATA_FUNCTION BASE_NAME ## Function;
+
+//
+// SMBIOS data table entries.
+//
+// This is used to define tables for structure pointer, functions and
+// string Tokens in order to iterate through the list of tables, populate
+// them and add them into the system.
+#define SMBIOS_PLATFORM_DXE_TABLE_ENTRY_DATA_AND_FUNCTION(BASE_NAME) \
+{ \
+  BASE_NAME ## Data, \
+  BASE_NAME ## StrToken, \
+  BASE_NAME ## Function \
+}
+
+//
+// Global definition macros.
+//
+#define SMBIOS_PLATFORM_DXE_TABLE_DATA(SMBIOS_TYPE, BASE_NAME) \
+  SMBIOS_TYPE BASE_NAME ## Data[]
+
+#define SMBIOS_PLATFORM_DXE_STRING_TOKEN_DATA(BASE_NAME) \
+  STR_TOKEN_INFO BASE_NAME ## StrToken[]
+
+#define SMBIOS_PLATFORM_DXE_TABLE_FUNCTION(BASE_NAME) \
+  EFI_STATUS EFIAPI BASE_NAME ## Function( \
+  IN VOID *RecordData, \
+  IN VOID *StrToken \
+  )
+
+/**
+  Adds an SMBIOS record.
+
+  @param  Buffer                 The data for the SMBIOS record.
+                                 The format of the record is determined by
+                                 EFI_SMBIOS_TABLE_HEADER.Type. The size of the
+                                 formatted area is defined by EFI_SMBIOS_TABLE_HEADER.Length
+                                 and either followed by a double-null (0x0000) or a set
+                                 of null terminated strings and a null.
+  @param  SmbiosHandle           A unique handle will be assigned to the SMBIOS record
+                                 if not NULL.
+
+  @retval EFI_SUCCESS            Record was added.
+  @retval EFI_OUT_OF_RESOURCES   Record was not added due to lack of system resources.
+  @retval EFI_ALREADY_STARTED    The SmbiosHandle passed in was already in use.
+  @retval EFI_INVALID_PARAMETER  Buffer is NULL.
+**/
+EFI_STATUS
+SmbiosPlatformDxeAddRecord (
+  IN     UINT8             *Buffer,
+  IN OUT EFI_SMBIOS_HANDLE *SmbiosHandle OPTIONAL
+  );
+
+/**
+  Fetches a list of the specified SMBIOS Table types.
+
+  @param[in]   SmbiosType   The type of table to fetch.
+  @param[out]  HandleArray  The array of handles.
+  @param[out]  HandleCount  Number of handles in the array.
+**/
+VOID
+SmbiosPlatformDxeGetLinkTypeHandle (
+  IN  UINT8         SmbiosType,
+  OUT SMBIOS_HANDLE **HandleArray,
+  OUT UINTN         *HandleCount
+  );
+
+/**
+  Create SMBIOS Table Record with additional strings.
+
+  @param[out]  TableRecord    Table Record is created.
+  @param[in]   InputData      Input Table from Data Table.
+  @param[in]   TableTypeSize  Size of Table with specified type.
+  @param[in]   StrToken       Pointer to Token of additional strings in HII Database.
+**/
+VOID
+SmbiosPlatformDxeCreateTable (
+  OUT VOID           **TableRecord,
+  IN  VOID           **InputData,
+  IN  UINT8          TableTypeSize,
+  IN  STR_TOKEN_INFO *StrToken
+  );
+
+/**
+  Save default strings of HII Database in case multiple tables with the same type using
+  these data for setting additional strings. After using, default strings will be set
+  back again in HII Database for other tables with the same type to use.
+
+  @param[in]  StrToken     Pointer to Token of additional strings in HII Database.
+
+  @retval     EFI_SUCCESS  Saved default strings of HII Database successfully.
+              Other        Failed to save default strings of HII Database.
+**/
+EFI_STATUS
+SmbiosPlatformDxeSaveHiiDefaultString (
+  IN STR_TOKEN_INFO *StrToken
+  );
+
+/**
+  Restore default strings of HII Database after using for setting additional strings.
+
+  @param[in]  StrToken     Pointer to Token of additional strings in HII Database.
+
+  @retval     EFI_SUCCESS  Restore default strings off HII Database successfully.
+              Other        Failed to restore default strings of HII Database.
+**/
+EFI_STATUS
+SmbiosPlatformDxeRestoreHiiDefaultString (
+  IN STR_TOKEN_INFO *StrToken
+  );
+
+//
+// Data Table Array
+//
+extern SMBIOS_PLATFORM_DXE_DATA_TABLE mSmbiosPlatformDxeDataTable[];
+
+//
+// Data Table Array Entries
+//
+extern UINTN mSmbiosPlatformDxeDataTableEntries;
+
+//
+// HII Database Handle
+//
+extern EFI_HII_HANDLE mSmbiosPlatformDxeHiiHandle;
+
+extern UINT8  SmbiosPlatformDxeStrings[];
+
+#endif // SMBIOS_PLATFORM_DXE_H_
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
index 448912f146ec..faa49cf9ca6b 100644
--- a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c
@@ -1,657 +1,46 @@
 /** @file
+  This driver parses the mSmbiosPlatformDxeDataTable structure
+  and reports any generated data using SMBIOS protocol.
 
-  Copyright (c) 2020 - 2023, Ampere Computing LLC. All rights reserved.<BR>
+  Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
 
+  Copyright (c) 2022, Ampere Computing LLC. All rights reserved.<BR>
+  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
+  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
 
-#include <Uefi.h>
-
-#include <Guid/SmBios.h>
 #include <Library/BaseLib.h>
 #include <Library/BaseMemoryLib.h>
 #include <Library/DebugLib.h>
+#include <Library/HiiLib.h>
 #include <Library/MemoryAllocationLib.h>
 #include <Library/PrintLib.h>
 #include <Library/UefiBootServicesTableLib.h>
-#include <Protocol/Smbios.h>
 
-#define CHASSIS_VERSION_TEMPLATE    "None               \0"
-#define CHASSIS_SERIAL_TEMPLATE     "Serial Not Set     \0"
-#define CHASSIS_ASSET_TAG_TEMPLATE  "Asset Tag Not Set  \0"
+#include "SmbiosPlatformDxe.h"
 
-#define TYPE8_ADDITIONAL_STRINGS      \
-  "VGA1 - Rear VGA Connector\0"       \
-  "DB-15 Male (VGA)         \0"
+#define SIZE_OF_HII_DATABASE_DEFAULT_STRINGS \
+ADDITIONAL_STR_INDEX_MAX * SMBIOS_UNICODE_STRING_MAX_LENGTH
 
-#define TYPE9_ADDITIONAL_STRINGS       \
-  "Socket 0 Riser 1 x32 - Slot 1\0"
+STATIC EFI_HANDLE          mSmbiosPlatformDxeImageHandle;
+STATIC EFI_STRING          mDefaultHiiDatabaseStr;
+STATIC EFI_SMBIOS_PROTOCOL *mPlatformDxeSmbios = NULL;
 
-#define TYPE11_ADDITIONAL_STRINGS       \
-  "www.amperecomputing.com\0"
-
-#define TYPE41_ADDITIONAL_STRINGS       \
-  "Onboard VGA\0"
-
-#define ADDITIONAL_STR_INDEX_1    0x01
-#define ADDITIONAL_STR_INDEX_2    0x02
-#define ADDITIONAL_STR_INDEX_3    0x03
-#define ADDITIONAL_STR_INDEX_4    0x04
-#define ADDITIONAL_STR_INDEX_5    0x05
-#define ADDITIONAL_STR_INDEX_6    0x06
-
-//
-// 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_TYPE8 Base;
-  CHAR8              Strings[sizeof (TYPE8_ADDITIONAL_STRINGS)];
-} ARM_TYPE8;
-
-typedef struct {
-  SMBIOS_TABLE_TYPE9 Base;
-  CHAR8              Strings[sizeof (TYPE9_ADDITIONAL_STRINGS)];
-} ARM_TYPE9;
-
-typedef struct {
-  SMBIOS_TABLE_TYPE11 Base;
-  CHAR8               Strings[sizeof (TYPE11_ADDITIONAL_STRINGS)];
-} ARM_TYPE11;
-
-typedef struct {
-  SMBIOS_TABLE_TYPE41 Base;
-  CHAR8               Strings[sizeof (TYPE41_ADDITIONAL_STRINGS)];
-} ARM_TYPE41;
-
-#pragma pack()
-
-// Type 8 Port Connector Information
-STATIC CONST ARM_TYPE8 mArmDefaultType8Vga = {
-  {
-    {                                             // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE8),                // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,       // InternalReferenceDesignator String
-    PortConnectorTypeDB15Female,  // InternalConnectorType;
-    ADDITIONAL_STR_INDEX_2,       // ExternalReferenceDesignator String
-    PortTypeOther,                // ExternalConnectorType;
-    PortTypeVideoPort,            // PortType;
-  },
-  "VGA1 - Rear VGA Connector\0" \
-  "DB-15 Male (VGA)\0"
-};
-
-// Type 8 Port Connector Information
-STATIC CONST ARM_TYPE8 mArmDefaultType8USBFront = {
-  {
-    {                                             // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE8),                // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,       // InternalReferenceDesignator String
-    PortConnectorTypeUsb,         // InternalConnectorType;
-    ADDITIONAL_STR_INDEX_2,       // ExternalReferenceDesignator String
-    PortTypeOther,                // ExternalConnectorType;
-    PortTypeUsb,                  // PortType;
-  },
-  "Front Panel USB 3.0\0"  \
-  "USB\0"
-};
-
-// Type 8 Port Connector Information
-STATIC CONST ARM_TYPE8 mArmDefaultType8USBRear = {
-  {
-    {                                             // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE8),                // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,       // InternalReferenceDesignator String
-    PortConnectorTypeUsb,         // InternalConnectorType;
-    ADDITIONAL_STR_INDEX_2,       // ExternalReferenceDesignator String
-    PortTypeOther,                // ExternalConnectorType;
-    PortTypeUsb,                  // PortType;
-  },
-  "Rear Panel USB 3.0\0"   \
-  "USB\0"
-};
-
-// Type 8 Port Connector Information
-STATIC CONST ARM_TYPE8 mArmDefaultType8NetRJ45 = {
-  {
-    {                                             // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE8),                // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,       // InternalReferenceDesignator String
-    PortConnectorTypeRJ45,        // InternalConnectorType;
-    ADDITIONAL_STR_INDEX_2,       // ExternalReferenceDesignator String
-    PortConnectorTypeRJ45,        // ExternalConnectorType;
-    PortTypeNetworkPort,          // PortType;
-  },
-  "RJ1 - BMC RJ45 Port\0" \
-  "RJ45 Connector\0"
-};
-
-// Type 8 Port Connector Information
-STATIC CONST ARM_TYPE8 mArmDefaultType8NetOcp = {
-  {
-    {                                             // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE8),                // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,       // InternalReferenceDesignator String
-    PortTypeOther,                // InternalConnectorType;
-    ADDITIONAL_STR_INDEX_2,       // ExternalReferenceDesignator String
-    PortTypeOther,                // ExternalConnectorType;
-    PortTypeNetworkPort,          // PortType;
-  },
-  "OCP1 - OCP NIC 3.0 Connector\0"  \
-  "OCP NIC 3.0\0"
-};
-
-// Type 8 Port Connector Information
-STATIC CONST ARM_TYPE8 mArmDefaultType8Uart = {
-  {
-    {                                             // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE8),                // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,        // InternalReferenceDesignator String
-    PortTypeOther,                 // InternalConnectorType;
-    ADDITIONAL_STR_INDEX_2,        // ExternalReferenceDesignator String
-    PortConnectorTypeDB9Female,    // ExternalConnectorType;
-    PortTypeSerial16550Compatible, // PortType;
-  },
-  "UART1 - BMC UART5 Connector\0"  \
-  "DB-9 female\0"
-};
-
-// Type 9 System Slots
-STATIC ARM_TYPE9 mArmDefaultType9Sk0RiserX32Slot1 = {
-  {
-    {                               // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE9),  // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,
-    SlotTypePciExpressGen3,
-    SlotDataBusWidth16X,
-    SlotUsageAvailable,
-    SlotLengthLong,
-    0,
-    {0, 0, 1}, // Provides 3.3 Volts
-    {1},       // PME
-    0,
-    0,
-    0,
-  },
-  "S0 Riser 1 x32 - Slot 1\0"
-};
-
-// Type 9 System Slots
-STATIC ARM_TYPE9 mArmDefaultType9Sk0RiserX32Slot2 = {
-  {
-    {                               // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE9),  // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,
-    SlotTypePciExpressGen3,
-    SlotDataBusWidth8X,
-    SlotUsageAvailable,
-    SlotLengthLong,
-    0,
-    {0, 0, 1}, // Provides 3.3 Volts
-    {1},       // PME
-    4,
-    0,
-    0,
-  },
-  "S0 Riser x32 - Slot 2\0"
-};
-
-// Type 9 System Slots
-STATIC ARM_TYPE9 mArmDefaultType9Sk0RiserX32Slot3 = {
-  {
-    {                               // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE9),  // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,
-    SlotTypePciExpressGen3,
-    SlotDataBusWidth8X,
-    SlotUsageAvailable,
-    SlotLengthLong,
-    0,
-    {0, 0, 1}, // Provides 3.3 Volts
-    {1},       // PME
-    5,
-    0,
-    0,
-  },
-  "S0 Riser x32 - Slot 3\0"
-};
-
-// Type 9 System Slots
-STATIC ARM_TYPE9 mArmDefaultType9Sk1RiserX24Slot1 = {
-  {
-    {                               // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE9),  // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,
-    SlotTypePciExpressGen3,
-    SlotDataBusWidth8X,
-    SlotUsageAvailable,
-    SlotLengthLong,
-    0,
-    {0, 0, 1}, // Provides 3.3 Volts
-    {1},       // PME
-    7,
-    0,
-    0,
-  },
-  "S1 Riser x24 - Slot 1\0"
-};
-
-// Type 9 System Slots
-STATIC ARM_TYPE9 mArmDefaultType9Sk1RiserX24Slot2 = {
-  {
-    {                               // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE9),  // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,
-    SlotTypePciExpressGen3,
-    SlotDataBusWidth8X,
-    SlotUsageAvailable,
-    SlotLengthLong,
-    0,
-    {0, 0, 1}, // Provides 3.3 Volts
-    {1},       // PME
-    8,
-    0,
-    0,
-  },
-  "S1 Riser x24 - Slot 2\0"
-};
-
-// Type 9 System Slots
-STATIC ARM_TYPE9 mArmDefaultType9Sk1RiserX24Slot3 = {
-  {
-    {                               // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE9),  // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,
-    SlotTypePciExpressGen3,
-    SlotDataBusWidth8X,
-    SlotUsageAvailable,
-    SlotLengthLong,
-    0,
-    {0, 0, 1}, // Provides 3.3 Volts
-    {1},       // PME
-    9,
-    0,
-    0,
-  },
-  "S1 Riser x24 - Slot 3\0"
-};
-
-// Type 9 System Slots
-STATIC ARM_TYPE9 mArmDefaultType9Sk1RiserX8Slot1 = {
-  {
-    {                               // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE9),  // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,
-    SlotTypePciExpressGen3,
-    SlotDataBusWidth8X,
-    SlotUsageAvailable,
-    SlotLengthLong,
-    0,
-    {0, 0, 1}, // Provides 3.3 Volts
-    {1},       // PME
-    8,
-    0,
-    0,
-  },
-  "S1 Riser x8 - Slot 1\0"
-};
-
-// Type 9 System Slots
-STATIC ARM_TYPE9 mArmDefaultType9Sk0OcpNic = {
-  {
-    {                               // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE9),  // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,
-    SlotTypePciExpressGen3,
-    SlotDataBusWidth16X,
-    SlotUsageAvailable,
-    SlotLengthLong,
-    0,
-    {0, 0, 1}, // Provides 3.3 Volts
-    {1},       // PME
-    1,
-    0,
-    0,
-  },
-  "S0 OCP NIC 3.0\0"
-};
-
-// Type 9 System Slots
-STATIC ARM_TYPE9 mArmDefaultType9Sk1NvmeM2Slot1 = {
-  {
-    {                               // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE9),  // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,
-    SlotTypePciExpressGen3,
-    SlotDataBusWidth4X,
-    SlotUsageAvailable,
-    SlotLengthLong,
-    0,
-    {0, 0, 1}, // Provides 3.3 Volts
-    {1},       // PME
-    5,
-    0,
-    0,
-  },
-  "S1 NVMe M.2 - Slot 1\0"
-};
-
-// Type 9 System Slots
-STATIC ARM_TYPE9 mArmDefaultType9Sk1NvmeM2Slot2 = {
-  {
-    {                               // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE9),  // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1,
-    SlotTypePciExpressGen3,
-    SlotDataBusWidth4X,
-    SlotUsageAvailable,
-    SlotLengthLong,
-    0,
-    {0, 0, 1}, // Provides 3.3 Volts
-    {1},       // PME
-    5,
-    0,
-    0,
-  },
-  "S1 NVMe M.2 - Slot 2\0"
-};
-
-// Type 11 OEM Strings
-STATIC ARM_TYPE11 mArmDefaultType11 = {
-  {
-    {                               // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_OEM_STRINGS,  // UINT8 Type
-      sizeof (SMBIOS_TABLE_TYPE11), // UINT8 Length
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    ADDITIONAL_STR_INDEX_1
-  },
-  TYPE11_ADDITIONAL_STRINGS
-};
-
-// Type 24 Hardware Security
-STATIC SMBIOS_TABLE_TYPE24 mArmDefaultType24 = {
-  {                                    // SMBIOS_STRUCTURE Hdr
-    EFI_SMBIOS_TYPE_HARDWARE_SECURITY, // UINT8 Type
-    sizeof (SMBIOS_TABLE_TYPE24),      // UINT8 Length
-    SMBIOS_HANDLE_PI_RESERVED,
-  },
-  0
-};
-
-// Type 38 IPMI Device Information
-STATIC SMBIOS_TABLE_TYPE38 mArmDefaultType38 = {
-  {                                          // SMBIOS_STRUCTURE Hdr
-    EFI_SMBIOS_TYPE_IPMI_DEVICE_INFORMATION, // UINT8 Type
-    sizeof (SMBIOS_TABLE_TYPE38),            // UINT8 Length
-    SMBIOS_HANDLE_PI_RESERVED,
-  },
-  IPMIDeviceInfoInterfaceTypeSSIF,
-  0x20,
-  0x20,
-  0xFF,
-  0x20
-};
-
-// Type 41 Onboard Devices Extended Information
-STATIC ARM_TYPE41 mArmDefaultType41 = {
-  {
-    { // SMBIOS_STRUCTURE Hdr
-      EFI_SMBIOS_TYPE_ONBOARD_DEVICES_EXTENDED_INFORMATION,
-      sizeof (SMBIOS_TABLE_TYPE41),
-      SMBIOS_HANDLE_PI_RESERVED,
-    },
-    1,
-    0x83,  // OnBoardDeviceExtendedTypeVideo, Enabled
-    1,
-    4,
-    2,
-    0,
-  },
-  TYPE41_ADDITIONAL_STRINGS
-};
-
-// Type 42 System Boot Information
-STATIC SMBIOS_TABLE_TYPE42 mArmDefaultType42 = {
-  { // SMBIOS_STRUCTURE Hdr
-    EFI_SMBIOS_TYPE_MANAGEMENT_CONTROLLER_HOST_INTERFACE,
-    sizeof (SMBIOS_TABLE_TYPE42),
-    SMBIOS_HANDLE_PI_RESERVED,
-  },
-  MCHostInterfaceTypeOemDefined,
-  4,
-  {0xFF, 0, 0, 0}
-};
-
-STATIC CONST VOID *DefaultCommonTables[] =
-{
-  &mArmDefaultType8Vga,
-  &mArmDefaultType8USBFront,
-  &mArmDefaultType8USBRear,
-  &mArmDefaultType8NetRJ45,
-  &mArmDefaultType8NetOcp,
-  &mArmDefaultType8Uart,
-  &mArmDefaultType9Sk0RiserX32Slot1,
-  &mArmDefaultType9Sk0RiserX32Slot2,
-  &mArmDefaultType9Sk0RiserX32Slot3,
-  &mArmDefaultType9Sk1RiserX24Slot1,
-  &mArmDefaultType9Sk1RiserX24Slot2,
-  &mArmDefaultType9Sk1RiserX24Slot3,
-  &mArmDefaultType9Sk1RiserX8Slot1,
-  &mArmDefaultType9Sk0OcpNic,
-  &mArmDefaultType9Sk1NvmeM2Slot1,
-  &mArmDefaultType9Sk1NvmeM2Slot2,
-  &mArmDefaultType11,
-  &mArmDefaultType24,
-  &mArmDefaultType38,
-  &mArmDefaultType41,
-  &mArmDefaultType42,
-  NULL
-};
-
-typedef struct {
-  CHAR8 MonthNameStr[4]; // example "Jan", Compiler build date, month
-  CHAR8 DigitStr[3];     // example "01", Smbios date format, month
-} MonthStringDig;
-
-STATIC
-UINTN
-GetStringPackSize (
-  CHAR8 *StringPack
-  )
-{
-  UINTN StrCount;
-  CHAR8 *StrStart;
-
-  if ((*StringPack == 0) && (*(StringPack + 1) == 0)) {
-    return 0;
-  }
-
-  // String section ends in double-null (0000h)
-  for (StrCount = 0, StrStart = StringPack;
-       ((*StrStart != 0) || (*(StrStart + 1) != 0)); StrStart++, StrCount++)
-  {
-  }
-
-  return StrCount + 2; // Included the double NULL
-}
-
-// Update String at String number to String Pack
-EFI_STATUS
-UpdateStringPack (
-  CHAR8 *StringPack,
-  CHAR8 *String,
-  UINTN StringNumber
-  )
-{
-  CHAR8 *StrStart;
-  UINTN StrIndex;
-  UINTN InputStrLen;
-  UINTN TargetStrLen;
-  UINTN BufferSize;
-  CHAR8 *Buffer;
-
-  StrStart = StringPack;
-  for (StrIndex = 1; StrIndex < StringNumber; StrStart++) {
-    // A string ends in 00h
-    if (*StrStart == 0) {
-      StrIndex++;
-    }
-    // String section ends in double-null (0000h)
-    if ((*StrStart == 0) && (*(StrStart + 1) == 0)) {
-      return EFI_NOT_FOUND;
-    }
-  }
-
-  if (*StrStart == 0) {
-    StrStart++;
-  }
-
-  InputStrLen = AsciiStrLen (String);
-  TargetStrLen = AsciiStrLen (StrStart);
-  BufferSize = GetStringPackSize (StrStart + TargetStrLen + 1);
-
-  // Replace the String if length matched
-  // OR this is the last string
-  if (InputStrLen == TargetStrLen || (BufferSize == 0)) {
-    CopyMem (StrStart, String, InputStrLen);
-  }
-  // Otherwise, buffer is needed to apply new string
-  else {
-    Buffer = AllocateZeroPool (BufferSize);
-    if (Buffer == NULL) {
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    CopyMem (Buffer, StrStart + TargetStrLen + 1, BufferSize);
-    CopyMem (StrStart, String, InputStrLen + 1);
-    CopyMem (StrStart + InputStrLen + 1, Buffer, BufferSize);
-
-    FreePool (Buffer);
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-   Install a whole table worth of structures
-
-   @param  Smbios               SMBIOS protocol.
-   @param  DefaultTables        A pointer to the default SMBIOS table structure.
-**/
-EFI_STATUS
-InstallStructures (
-  IN       EFI_SMBIOS_PROTOCOL *Smbios,
-  IN CONST VOID                *DefaultTables[]
-  )
-{
-  EFI_STATUS        Status = EFI_SUCCESS;
-  EFI_SMBIOS_HANDLE SmbiosHandle;
-  UINTN             TableIndex;
-
-  ASSERT (Smbios != NULL);
-
-  for (TableIndex = 0; DefaultTables[TableIndex] != NULL; TableIndex++) {
-    SmbiosHandle = ((EFI_SMBIOS_TABLE_HEADER *)DefaultTables[TableIndex])->Handle;
-    Status = Smbios->Add (
-                       Smbios,
-                       NULL,
-                       &SmbiosHandle,
-                       (EFI_SMBIOS_TABLE_HEADER *)DefaultTables[TableIndex]
-                       );
-    if (EFI_ERROR (Status)) {
-      DEBUG ((DEBUG_ERROR, "%a: adding %d failed\n", __FUNCTION__, TableIndex));
-
-      // stop adding rather than continuing
-      return Status;
-    }
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-   Install all structures from the DefaultTables structure
-
-   @param  Smbios               SMBIOS protocol
-
-**/
-EFI_STATUS
-InstallAllStructures (
-  IN EFI_SMBIOS_PROTOCOL *Smbios
-  )
-{
-  EFI_STATUS Status = EFI_SUCCESS;
-
-  ASSERT (Smbios != NULL);
-
-  // Install Tables
-  Status = InstallStructures (Smbios, DefaultCommonTables);
-  ASSERT_EFI_ERROR (Status);
-
-  return Status;
-}
+EFI_HII_HANDLE      mSmbiosPlatformDxeHiiHandle;
 
 /**
-   Installs SMBIOS information for ARM platforms
-
-   @param ImageHandle     Module's image handle
-   @param SystemTable     Pointer of EFI_SYSTEM_TABLE
+  Standard EFI driver point. This driver parses the mSmbiosPlatformDataTable
+  structure and reports any generated data using SMBIOS protocol.
 
-   @retval EFI_SUCCESS    Smbios data successfully installed
-   @retval Other          Smbios data was not installed
+  @param  ImageHandle          Handle for the image of this driver.
+  @param  SystemTable          Pointer to the EFI System Table.
 
+  @retval EFI_SUCCESS          The data was successfully stored.
+          EFI_OUT_OF_RESOURCES There is no remaining memory to satisfy the request.
 **/
 EFI_STATUS
 EFIAPI
@@ -660,24 +49,438 @@ SmbiosPlatformDxeEntry (
   IN EFI_SYSTEM_TABLE *SystemTable
   )
 {
-  EFI_STATUS          Status;
-  EFI_SMBIOS_PROTOCOL *Smbios;
+  UINTN      Index;
+  EFI_STATUS Status;
+
+  mSmbiosPlatformDxeImageHandle = ImageHandle;
+
+  //
+  // Allocate buffer to save default strings of HII Database
+  //
+  mDefaultHiiDatabaseStr = AllocateZeroPool (SIZE_OF_HII_DATABASE_DEFAULT_STRINGS);
+  if (mDefaultHiiDatabaseStr == NULL) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] HII Database String allocates memory resource failed.\n",
+      __func__,
+      __LINE__
+      ));
+    return EFI_OUT_OF_RESOURCES;
+  }
 
   //
-  // Find the SMBIOS protocol
+  // Locate SMBIOS protocol and get HII Database Handle
   //
   Status = gBS->LocateProtocol (
                   &gEfiSmbiosProtocolGuid,
                   NULL,
-                  (VOID **)&Smbios
+                  (VOID **)&mPlatformDxeSmbios
                   );
-
   if (EFI_ERROR (Status)) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] Could not locate SMBIOS protocol. %r\n",
+      __func__,
+      __LINE__,
+      Status
+      ));
     return Status;
   }
 
-  Status = InstallAllStructures (Smbios);
-  DEBUG ((DEBUG_ERROR, "SmbiosPlatform install - %r\n", Status));
+  mSmbiosPlatformDxeHiiHandle = HiiAddPackages (
+                                  &gEfiCallerIdGuid,
+                                  mSmbiosPlatformDxeImageHandle,
+                                  SmbiosPlatformDxeStrings,
+                                  NULL
+                                  );
+  if (mSmbiosPlatformDxeHiiHandle == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  //
+  // Iterate through all Data Tables of each Type and call
+  // function pointer to create and add Table accordingly
+  //
+  for (Index = 0; Index < mSmbiosPlatformDxeDataTableEntries; Index++) {
+    Status = (*mSmbiosPlatformDxeDataTable[Index].Function)(
+                mSmbiosPlatformDxeDataTable[Index].RecordData,
+                mSmbiosPlatformDxeDataTable[Index].StrToken
+                );
+    if (EFI_ERROR (Status)) {
+      DEBUG ((
+        DEBUG_ERROR,
+        "[%a]:[%dL] Could not install SMBIOS Table Type%d. %r\n",
+        __func__,
+        __LINE__,
+        ((EFI_SMBIOS_TABLE_HEADER *)(mSmbiosPlatformDxeDataTable[Index].RecordData))->Type,
+        Status
+        ));
+    }
+  }
+
+  //
+  // Free buffer after all Tables were installed
+  //
+  FreePool (mDefaultHiiDatabaseStr);
+
+  return Status;
+}
+
+/**
+  Adds an SMBIOS record.
+
+  @param  Buffer                 The data for the SMBIOS record.
+                                 The format of the record is determined by
+                                 EFI_SMBIOS_TABLE_HEADER.Type. The size of the
+                                 formatted area is defined by EFI_SMBIOS_TABLE_HEADER.Length
+                                 and either followed by a double-null (0x0000) or a set
+                                 of null terminated strings and a null.
+  @param  SmbiosHandle           A unique handle will be assigned to the SMBIOS record
+                                 if not NULL.
+
+  @retval EFI_SUCCESS            Record was added.
+  @retval EFI_OUT_OF_RESOURCES   Record was not added due to lack of system resources.
+  @retval EFI_ALREADY_STARTED    The SmbiosHandle passed in was already in use.
+  @retval EFI_INVALID_PARAMETER  Buffer is NULL.
+**/
+EFI_STATUS
+SmbiosPlatformDxeAddRecord (
+  IN UINT8                 *Buffer,
+  IN OUT EFI_SMBIOS_HANDLE *SmbiosHandle OPTIONAL
+  )
+{
+  EFI_STATUS        Status;
+  EFI_SMBIOS_HANDLE Handle;
+
+  if (Buffer == NULL) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] Buffer is NULL - Invalid parameter. %r\n",
+      __func__,
+      __LINE__
+      ));
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Handle = SMBIOS_HANDLE_PI_RESERVED;
+  if (SmbiosHandle != NULL) {
+    Handle = *SmbiosHandle;
+  }
+
+  Status = mPlatformDxeSmbios->Add (
+                                 mPlatformDxeSmbios,
+                                 NULL,
+                                 &Handle,
+                                 (EFI_SMBIOS_TABLE_HEADER *)Buffer
+                                 );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] SMBIOS Type%d Table Log Failed! %r\n",
+      __func__,
+      __LINE__,
+      ((EFI_SMBIOS_TABLE_HEADER *)Buffer)->Type,
+      Status
+      ));
+  }
+  if (SmbiosHandle != NULL) {
+    *SmbiosHandle = Handle;
+  }
+
+  return Status;
+}
+
+/**
+  Fetches the number of handles of the specified SMBIOS type.
+
+  @param  SmbiosType The type of SMBIOS record to look for.
+
+  @retval UINTN      The number of handles.
+**/
+STATIC
+UINTN
+GetHandleCount (
+  IN UINT8 SmbiosType
+  )
+{
+  UINTN                   HandleCount;
+  EFI_STATUS              Status;
+  EFI_SMBIOS_HANDLE       SmbiosHandle;
+  EFI_SMBIOS_TABLE_HEADER *Record;
+
+  HandleCount = 0;
+  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
+  // Iterate through entries to get the number
+  do {
+    Status = mPlatformDxeSmbios->GetNext (
+                                   mPlatformDxeSmbios,
+                                   &SmbiosHandle,
+                                   &SmbiosType,
+                                   &Record,
+                                   NULL
+                                   );
+
+    if (Status == EFI_SUCCESS) {
+      HandleCount++;
+    }
+  } while (Status != EFI_NOT_FOUND);
+
+  return HandleCount;
+}
+
+/**
+  Fetches a list of the specified SMBIOS Table types.
+
+  @param[in]   SmbiosType   The type of table to fetch.
+  @param[out]  HandleArray  The array of handles.
+  @param[out]  HandleCount  Number of handles in the array.
+**/
+VOID
+SmbiosPlatformDxeGetLinkTypeHandle (
+  IN  UINT8         SmbiosType,
+  OUT SMBIOS_HANDLE **HandleArray,
+  OUT UINTN         *HandleCount
+  )
+{
+  UINTN                   Index;
+  EFI_STATUS              Status;
+  EFI_SMBIOS_HANDLE       SmbiosHandle;
+  EFI_SMBIOS_TABLE_HEADER *Record;
+
+  if (SmbiosType > END_OF_SMBIOS_TABLE_TYPE) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] Invalid SMBIOS Type.\n",
+      __func__,
+      __LINE__
+      ));
+  }
+
+  *HandleCount = GetHandleCount (SmbiosType);
+  *HandleArray = AllocateZeroPool (sizeof (SMBIOS_HANDLE) * (*HandleCount));
+  if (*HandleArray == NULL) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] HandleArray allocates memory resource failed.\n",
+      __func__,
+      __LINE__
+      ));
+    *HandleCount = 0;
+    return;
+  }
+
+  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
+
+  for (Index = 0; Index < (*HandleCount); Index++) {
+    Status = mPlatformDxeSmbios->GetNext (
+                                   mPlatformDxeSmbios,
+                                   &SmbiosHandle,
+                                   &SmbiosType,
+                                   &Record,
+                                   NULL
+                                   );
+
+    if (Status == EFI_SUCCESS) {
+      (*HandleArray)[Index] = Record->Handle;
+    } else {
+      // It should never reach here
+      ASSERT (FALSE);
+      break;
+    }
+  }
+}
+
+/**
+  Create SMBIOS Table Record with additional strings.
+
+  @param[out]  TableRecord    Table Record is created.
+  @param[in]   InputData      Input Table from Data Table.
+  @param[in]   TableTypeSize  Size of Table with specified type.
+  @param[in]   StrToken       Pointer to Token of additional strings in HII Database.
+**/
+VOID
+SmbiosPlatformDxeCreateTable (
+  OUT VOID           **TableRecord,
+  IN  VOID           **InputData,
+  IN  UINT8          TableTypeSize,
+  IN  STR_TOKEN_INFO *StrToken
+  )
+{
+  CHAR8      *StrStart;
+  UINT8      TableSize;
+  UINT8      SmbiosAdditionalStrLen;
+  UINT8      Index;
+  EFI_STRING SmbiosAdditionalStr;
+
+  if (*InputData == NULL ||
+      StrToken == NULL ||
+      TableTypeSize < sizeof (EFI_SMBIOS_TABLE_HEADER)
+      )
+  {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] Invalid parameter to create SMBIOS Table\n",
+      __func__,
+      __LINE__
+      ));
+    return;
+  }
+
+  //
+  // Calculate size of Table.
+  //
+  if (StrToken->TokenLen != 0) {
+    TableSize = TableTypeSize + 1; // Last byte is Null-terminated for Table with Null-terminated additional strings
+    for (Index = 0; Index < StrToken->TokenLen; Index++) {
+      SmbiosAdditionalStr = HiiGetPackageString (
+                              &gEfiCallerIdGuid,
+                              StrToken->TokenArray[Index],
+                              NULL
+                              );
+      TableSize += StrLen (SmbiosAdditionalStr) + 1;
+      FreePool (SmbiosAdditionalStr);
+    }
+  } else {
+    TableSize = TableTypeSize + 1 + 1; // Double-null for Table with no additional strings
+  }
+
+  //
+  // Allocate Table and copy strings from
+  // HII Database for additional strings.
+  //
+  *TableRecord = AllocateZeroPool (TableSize);
+  if (*TableRecord == NULL) {
+    return;
+  }
+  CopyMem (*TableRecord, *InputData, TableTypeSize);
+  StrStart = (CHAR8 *)(*TableRecord + TableTypeSize);
+  for (Index = 0; Index < StrToken->TokenLen; Index++) {
+    SmbiosAdditionalStr = HiiGetPackageString (
+                            &gEfiCallerIdGuid,
+                            StrToken->TokenArray[Index],
+                            NULL
+                            );
+    SmbiosAdditionalStrLen = StrLen (SmbiosAdditionalStr) + 1;
+    UnicodeStrToAsciiStrS (
+      SmbiosAdditionalStr,
+      StrStart,
+      SmbiosAdditionalStrLen
+    );
+    FreePool (SmbiosAdditionalStr);
+    StrStart += SmbiosAdditionalStrLen;
+  }
+}
+
+/**
+  Save default strings of HII Database in case multiple tables with the same type using
+  these data for setting additional strings. After using, default strings will be set
+  back again in HII Database by using SmbiosPlatformDxeRestoreHiiDefaultString function
+  for other tables with the same type to use. Before saving HII Database default strings,
+  buffer for saving need to be available. Otherwise, that means a certain SMBIOS Table used
+  this function but forget using SmbiosPlatformDxeRestoreHiiDefaultString function to free
+  buffer for other Tables to use so this check is for that purpose.
+
+  @param[in]  StrToken     Pointer to Token of additional strings in HII Database.
+
+  @retval     EFI_SUCCESS  Saved default strings of HII Database successfully.
+              Other        Failed to save default strings of HII Database.
+**/
+EFI_STATUS
+SmbiosPlatformDxeSaveHiiDefaultString (
+  IN STR_TOKEN_INFO *StrToken
+  )
+{
+  UINT8      Index;
+  UINT8      HiiDatabaseStrLen;
+  EFI_STRING HiiDatabaseStr;
+
+  if (StrToken == NULL) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] Invalid String Tokens\n",
+      __func__,
+      __LINE__
+      ));
+    return EFI_INVALID_PARAMETER;
+  }
+
+  //
+  // Start saving HII Default Strings
+  //
+  for (Index = 0; Index < StrToken->TokenLen; Index++) {
+    ASSERT (IsZeroBuffer ((VOID *)&mDefaultHiiDatabaseStr[Index * SMBIOS_STRING_MAX_LENGTH], SMBIOS_UNICODE_STRING_MAX_LENGTH - 1));
+    HiiDatabaseStr = HiiGetPackageString (
+                       &gEfiCallerIdGuid,
+                       StrToken->TokenArray[Index],
+                       NULL
+                       );
+    HiiDatabaseStrLen = (StrLen (HiiDatabaseStr) + 1) * sizeof (CHAR16);
+    ASSERT (HiiDatabaseStrLen <= SMBIOS_UNICODE_STRING_MAX_LENGTH);
+    UnicodeSPrint (
+      (CHAR16 *)&mDefaultHiiDatabaseStr[Index * SMBIOS_STRING_MAX_LENGTH],
+      HiiDatabaseStrLen,
+      HiiDatabaseStr
+      );
+    FreePool (HiiDatabaseStr);
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Restore default strings of HII Database after using for setting additional strings.
+
+  @param[in]  StrToken     Pointer to Token of additional strings in HII Database.
+
+  @retval     EFI_SUCCESS  Restore default strings off HII Database successfully.
+              Other        Failed to restore default strings of HII Database.
+**/
+EFI_STATUS
+SmbiosPlatformDxeRestoreHiiDefaultString (
+  IN STR_TOKEN_INFO *StrToken
+  )
+{
+  UINT8      Index;
+  EFI_STATUS Status;
+
+  if (StrToken == NULL) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] Invalid String Tokens\n",
+      __func__,
+      __LINE__
+      ));
+    return EFI_INVALID_PARAMETER;
+  }
+
+  for (Index = 0; Index < StrToken->TokenLen; Index++) {
+    if (IsZeroBuffer ((VOID *)&mDefaultHiiDatabaseStr[Index * SMBIOS_STRING_MAX_LENGTH], SMBIOS_UNICODE_STRING_MAX_LENGTH - 1)) {
+      DEBUG ((
+        DEBUG_ERROR,
+        "[%a]:[%dL] Default strings were not saved previously so failed to restore default strings.\n",
+        __func__,
+        __LINE__
+        ));
+      return EFI_INVALID_PARAMETER;
+    }
+
+    Status = HiiSetString (
+               mSmbiosPlatformDxeHiiHandle,
+               StrToken->TokenArray[Index],
+               (EFI_STRING)&mDefaultHiiDatabaseStr[Index * SMBIOS_STRING_MAX_LENGTH],
+               NULL
+               );
+    if (EFI_ERROR (Status)) {
+      DEBUG ((
+        DEBUG_ERROR,
+        "[%a]:[%dL] Failed to restore default strings\n",
+        __func__,
+        __LINE__
+        ));
+      return Status;
+    }
+    ZeroMem ((VOID *)&mDefaultHiiDatabaseStr[Index * SMBIOS_STRING_MAX_LENGTH], SMBIOS_UNICODE_STRING_MAX_LENGTH - 1);
+  }
 
   return Status;
 }
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c
new file mode 100644
index 000000000000..84a4962d33fc
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c
@@ -0,0 +1,72 @@
+/** @file
+  This file provides SMBIOS Type.
+
+  Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
+  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "SmbiosPlatformDxe.h"
+
+SMBIOS_PLATFORM_DXE_TABLE_EXTERNS (
+  SMBIOS_TABLE_TYPE8,
+  PlatformPortConnector
+  )
+SMBIOS_PLATFORM_DXE_TABLE_EXTERNS (
+  SMBIOS_TABLE_TYPE9,
+  PlatformSystemSlot
+  )
+SMBIOS_PLATFORM_DXE_TABLE_EXTERNS (
+  SMBIOS_TABLE_TYPE9,
+  PlatformOemString
+  )
+SMBIOS_PLATFORM_DXE_TABLE_EXTERNS (
+  SMBIOS_TABLE_TYPE24,
+  PlatformHardwareSecurity
+  )
+SMBIOS_PLATFORM_DXE_TABLE_EXTERNS (
+  SMBIOS_TABLE_TYPE38,
+  PlatformIpmiDevice
+  )
+SMBIOS_PLATFORM_DXE_TABLE_EXTERNS (
+  SMBIOS_TABLE_TYPE41,
+  PlatformOnboardDevicesExtended
+  )
+
+SMBIOS_PLATFORM_DXE_DATA_TABLE mSmbiosPlatformDxeDataTable[] = {
+  // Type8
+  SMBIOS_PLATFORM_DXE_TABLE_ENTRY_DATA_AND_FUNCTION (
+    PlatformPortConnector
+  ),
+  // Type9
+  SMBIOS_PLATFORM_DXE_TABLE_ENTRY_DATA_AND_FUNCTION (
+    PlatformSystemSlot
+  ),
+  // Type11
+  SMBIOS_PLATFORM_DXE_TABLE_ENTRY_DATA_AND_FUNCTION (
+    PlatformOemString
+  ),
+  // Type24
+  SMBIOS_PLATFORM_DXE_TABLE_ENTRY_DATA_AND_FUNCTION (
+    PlatformHardwareSecurity
+  ),
+  // Type38
+  SMBIOS_PLATFORM_DXE_TABLE_ENTRY_DATA_AND_FUNCTION (
+    PlatformIpmiDevice
+  ),
+  // Type41
+  SMBIOS_PLATFORM_DXE_TABLE_ENTRY_DATA_AND_FUNCTION (
+    PlatformOnboardDevicesExtended
+  )
+};
+
+//
+// Number of Data Table entries.
+//
+UINTN mSmbiosPlatformDxeDataTableEntries = ARRAY_SIZE (mSmbiosPlatformDxeDataTable);
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorData.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorData.c
new file mode 100644
index 000000000000..d2db29159a09
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorData.c
@@ -0,0 +1,142 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "SmbiosPlatformDxe.h"
+
+//
+// Define data for SMBIOS Type 8 Table.
+//
+SMBIOS_PLATFORM_DXE_TABLE_DATA (SMBIOS_TABLE_TYPE8, PlatformPortConnector) = {
+  {                                               // Table 1
+    {                                             // Header
+      EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, // Type
+      sizeof (SMBIOS_TABLE_TYPE8),                // Length
+      SMBIOS_HANDLE_PI_RESERVED                   // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,                       // Internal Reference Designator
+    PortConnectorTypeDB15Female,                  // Internal Connector Type
+    ADDITIONAL_STR_INDEX_2,                       // External Reference Designator
+    PortTypeOther,                                // External Connector Type
+    PortTypeVideoPort                             // Port Type
+  },
+  {                                               // Table 2
+    {                                             // Header
+      EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, // Type
+      sizeof (SMBIOS_TABLE_TYPE8),                // Length
+      SMBIOS_HANDLE_PI_RESERVED                   // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,                       // Internal Reference Designator
+    PortConnectorTypeUsb,                         // Internal Connector Type
+    ADDITIONAL_STR_INDEX_2,                       // External Reference Designator
+    PortTypeOther,                                // External Connector Type
+    PortTypeUsb                                   // Port Type
+  },
+  {                                               // Table 3
+    {                                             // Header
+      EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, // Type
+      sizeof (SMBIOS_TABLE_TYPE8),                // Length
+      SMBIOS_HANDLE_PI_RESERVED                   // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,                       // Internal Reference Designator
+    PortConnectorTypeUsb,                         // Internal Connector Type
+    ADDITIONAL_STR_INDEX_2,                       // External Reference Designator
+    PortTypeOther,                                // External Connector Type
+    PortTypeUsb                                   // Port Type
+  },
+  {                                               // Table 4
+    {                                             // Header
+      EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, // Type
+      sizeof (SMBIOS_TABLE_TYPE8),                // Length
+      SMBIOS_HANDLE_PI_RESERVED                   // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,                       // Internal Reference Designator
+    PortConnectorTypeRJ45,                        // Internal Connector Type
+    ADDITIONAL_STR_INDEX_2,                       // External Reference Designator
+    PortConnectorTypeRJ45,                        // External Connector Type
+    PortTypeNetworkPort                           // Port Type
+  },
+  {                                               // Table 5
+    {                                             // Header
+      EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, // Type
+      sizeof (SMBIOS_TABLE_TYPE8),                // Length
+      SMBIOS_HANDLE_PI_RESERVED                   // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,                       // Internal Reference Designator
+    PortTypeOther,                                // Internal Connector Type
+    ADDITIONAL_STR_INDEX_2,                       // External Reference Designator
+    PortTypeOther,                                // External Connector Type
+    PortTypeNetworkPort                           // Port Type
+  },
+  {                                               // Table 6
+    {                                             // Header
+      EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, // Type
+      sizeof (SMBIOS_TABLE_TYPE8),                // Length
+      SMBIOS_HANDLE_PI_RESERVED                   // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,                       // Internal Reference Designator
+    PortTypeOther,                                // Internal Connector Type
+    ADDITIONAL_STR_INDEX_2,                       // External Reference Designator
+    PortConnectorTypeDB9Female,                   // External Connector Type
+    PortTypeSerial16550Compatible                 // Port Type
+  },
+  {                                               // Null-terminated table
+    {
+      NULL_TERMINATED_TYPE,
+      0,
+      0
+    },
+  }
+};
+
+//
+// Define string Tokens for additional strings.
+//
+SMBIOS_PLATFORM_DXE_STRING_TOKEN_DATA (PlatformPortConnector) = {
+  {                                                                                  // Table 1
+    {                                                                                // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_PORT_CONNECTOR_INTERNAL_REFERENCE_DESIGNATOR_1),
+      STRING_TOKEN (STR_PLATFORM_DXE_PORT_CONNECTOR_EXTERNAL_REFERENCE_DESIGNATOR_1)
+    },
+    ADDITIONAL_STR_INDEX_2                                                           // Size of Tokens array
+  },
+  {                                                                                  // Table 2
+    {                                                                                // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_PORT_CONNECTOR_INTERNAL_REFERENCE_DESIGNATOR_2),
+      STRING_TOKEN (STR_PLATFORM_DXE_PORT_CONNECTOR_EXTERNAL_REFERENCE_DESIGNATOR_2)
+    },
+    ADDITIONAL_STR_INDEX_2                                                           // Size of Tokens array
+  },
+  {                                                                                  // Table 3
+    {                                                                                // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_PORT_CONNECTOR_INTERNAL_REFERENCE_DESIGNATOR_3),
+      STRING_TOKEN (STR_PLATFORM_DXE_PORT_CONNECTOR_EXTERNAL_REFERENCE_DESIGNATOR_3)
+    },
+    ADDITIONAL_STR_INDEX_2                                                           // Size of Tokens array
+  },
+  {                                                                                  // Table 4
+    {                                                                                // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_PORT_CONNECTOR_INTERNAL_REFERENCE_DESIGNATOR_4),
+      STRING_TOKEN (STR_PLATFORM_DXE_PORT_CONNECTOR_EXTERNAL_REFERENCE_DESIGNATOR_4)
+    },
+    ADDITIONAL_STR_INDEX_2                                                           // Size of Tokens array
+  },
+  {                                                                                  // Table 5
+    {                                                                                // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_PORT_CONNECTOR_INTERNAL_REFERENCE_DESIGNATOR_5),
+      STRING_TOKEN (STR_PLATFORM_DXE_PORT_CONNECTOR_EXTERNAL_REFERENCE_DESIGNATOR_5)
+    },
+    ADDITIONAL_STR_INDEX_2                                                           // Size of Tokens array
+  },
+  {                                                                                  // Table 6
+    {                                                                                // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_PORT_CONNECTOR_INTERNAL_REFERENCE_DESIGNATOR_6),
+      STRING_TOKEN (STR_PLATFORM_DXE_PORT_CONNECTOR_EXTERNAL_REFERENCE_DESIGNATOR_6)
+    },
+    ADDITIONAL_STR_INDEX_2                                                           // Size of Tokens array
+  }
+};
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorFunction.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorFunction.c
new file mode 100644
index 000000000000..dbf272ce4d34
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorFunction.c
@@ -0,0 +1,57 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+
+#include "SmbiosPlatformDxe.h"
+
+/**
+  This function adds SMBIOS Table (Type 8) records.
+
+  @param  RecordData                 Pointer to SMBIOS Table with default values.
+  @param  Smbios                     SMBIOS protocol.
+
+  @retval EFI_SUCCESS                The SMBIOS Table was successfully added.
+  @retval Other                      Failed to update the SMBIOS Table.
+
+**/
+SMBIOS_PLATFORM_DXE_TABLE_FUNCTION (PlatformPortConnector) {
+  EFI_STATUS         Status;
+  STR_TOKEN_INFO     *InputStrToken;
+  SMBIOS_TABLE_TYPE8 *InputData;
+  SMBIOS_TABLE_TYPE8 *Type8Record;
+
+  InputData = (SMBIOS_TABLE_TYPE8 *)RecordData;
+  InputStrToken = (STR_TOKEN_INFO *)StrToken;
+
+  while (InputData->Hdr.Type != NULL_TERMINATED_TYPE) {
+    SmbiosPlatformDxeCreateTable (
+      (VOID *)&Type8Record,
+      (VOID *)&InputData,
+      sizeof (SMBIOS_TABLE_TYPE8),
+      InputStrToken
+      );
+    if (Type8Record == NULL) {
+      return EFI_OUT_OF_RESOURCES;
+    }
+
+    Status = SmbiosPlatformDxeAddRecord ((UINT8 *)Type8Record, NULL);
+    if (EFI_ERROR (Status)) {
+      FreePool (Type8Record);
+      return Status;
+    }
+
+    FreePool (Type8Record);
+    InputData++;
+    InputStrToken++;
+  }
+
+  return Status;
+}
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotData.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotData.c
new file mode 100644
index 000000000000..5e9bbc1b00a6
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotData.c
@@ -0,0 +1,268 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "SmbiosPlatformDxe.h"
+
+//
+// Define data for SMBIOS Type 9 Table.
+//
+SMBIOS_PLATFORM_DXE_TABLE_DATA (SMBIOS_TABLE_TYPE9, PlatformSystemSlot) = {
+  {                                 // Table 1
+    {                               // Header
+      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // Type
+      sizeof (SMBIOS_TABLE_TYPE9),  // Length
+      SMBIOS_HANDLE_PI_RESERVED     // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,         // Slot Designation
+    SlotTypePciExpressGen4,         // Slot Type
+    SlotDataBusWidth8X,             // Slot Data Bus Width
+    SlotUsageAvailable,             // Current Usage
+    SlotLengthLong,                 // Slot Length
+    1,                              // Slot ID
+    {0, 0, 1},                      // Slot Characteristics 1
+    {1},                            // Slot Characteristics 2
+    5,                              // Segment Group Number
+    0,                              // Bus Number
+    0,                              // Device Function Number
+  },
+  {                                 // Table 2
+    {                               // Header
+      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // Type
+      sizeof (SMBIOS_TABLE_TYPE9),  // Length
+      SMBIOS_HANDLE_PI_RESERVED     // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,         // Slot Designation
+    SlotTypePciExpressGen4,         // Slot Type
+    SlotDataBusWidth16X,            // Slot Data Bus Width
+    SlotUsageAvailable,             // Current Usage
+    SlotLengthLong,                 // Slot Length
+    2,                              // Slot ID
+    {0, 0, 1},                      // Slot Characteristics 1
+    {1},                            // Slot Characteristics 2
+    0,                              // Segment Group Number
+    0,                              // Bus Number
+    0,                              // Device Function Number
+  },
+  {                                 // Table 3
+    {                               // Header
+      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // Type
+      sizeof (SMBIOS_TABLE_TYPE9),  // Length
+      SMBIOS_HANDLE_PI_RESERVED     // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,         // Slot Designation
+    SlotTypePciExpressGen4,         // Slot Type
+    SlotDataBusWidth8X,             // Slot Data Bus Width
+    SlotUsageUnavailable,           // Current Usage
+    SlotLengthLong,                 // Slot Length
+    3,                              // Slot ID
+    {0, 0, 1},                      // Slot Characteristics 1
+    {1},                            // Slot Characteristics 2
+    4,                              // Segment Group Number
+    0,                              // Bus Number
+    0,                              // Device Function Number
+  },
+  {                                 // Table 4
+    {                               // Header
+      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // Type
+      sizeof (SMBIOS_TABLE_TYPE9),  // Length
+      SMBIOS_HANDLE_PI_RESERVED     // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,         // Slot Designation
+    SlotTypePciExpressGen4,         // Slot Type
+    SlotDataBusWidth8X,             // Slot Data Bus Width
+    SlotUsageAvailable,             // Current Usage
+    SlotLengthLong,                 // Slot Length
+    4,                              // Slot ID
+    {0, 0, 1},                      // Slot Characteristics 1
+    {1},                            // Slot Characteristics 2
+    9,                              // Segment Group Number
+    0,                              // Bus Number
+    0,                              // Device Function Number
+  },
+  {                                 // Table 5
+    {                               // Header
+      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // Type
+      sizeof (SMBIOS_TABLE_TYPE9),  // Length
+      SMBIOS_HANDLE_PI_RESERVED     // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,         // Slot Designation
+    SlotTypePciExpressGen4,         // Slot Type
+    SlotDataBusWidth8X,             // Slot Data Bus Width
+    SlotUsageAvailable,             // Current Usage
+    SlotLengthLong,                 // Slot Length
+    5,                              // Slot ID
+    {0, 0, 1},                      // Slot Characteristics 1
+    {1},                            // Slot Characteristics 2
+    7,                              // Segment Group Number
+    0,                              // Bus Number
+    0,                              // Device Function Number
+  },
+  {                                 // Table 6
+    {                               // Header
+      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // Type
+      sizeof (SMBIOS_TABLE_TYPE9),  // Length
+      SMBIOS_HANDLE_PI_RESERVED     // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,         // Slot Designation
+    SlotTypePciExpressGen4,         // Slot Type
+    SlotDataBusWidth8X,             // Slot Data Bus Width
+    SlotUsageAvailable,             // Current Usage
+    SlotLengthLong,                 // Slot Length
+    6,                              // Slot ID
+    {0, 0, 1},                      // Slot Characteristics 1
+    {1},                            // Slot Characteristics 2
+    7,                              // Segment Group Number
+    0,                              // Bus Number
+    0,                              // Device Function Number
+  },
+  {                                 // Table 7
+    {                               // Header
+      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // Type
+      sizeof (SMBIOS_TABLE_TYPE9),  // Length
+      SMBIOS_HANDLE_PI_RESERVED     // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,         // Slot Designation
+    SlotTypePciExpressGen4,         // Slot Type
+    SlotDataBusWidth8X,             // Slot Data Bus Width
+    SlotUsageAvailable,             // Current Usage
+    SlotLengthLong,                 // Slot Length
+    7,                              // Slot ID
+    {0, 0, 1},                      // Slot Characteristics 1
+    {1},                            // Slot Characteristics 2
+    8,                              // Segment Group Number
+    0,                              // Bus Number
+    0,                              // Device Function Number
+  },
+  {                                 // Table 8
+    {                               // Header
+      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // Type
+      sizeof (SMBIOS_TABLE_TYPE9),  // Length
+      SMBIOS_HANDLE_PI_RESERVED     // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,         // Slot Designation
+    SlotTypePciExpressGen4,         // Slot Type
+    SlotDataBusWidth16X,            // Slot Data Bus Width
+    SlotUsageAvailable,             // Current Usage
+    SlotLengthLong,                 // Slot Length
+    8,                              // Slot ID
+    {0, 0, 1},                      // Slot Characteristics 1
+    {1},                            // Slot Characteristics 2
+    1,                              // Segment Group Number
+    0,                              // Bus Number
+    0,                              // Device Function Number
+  },
+  {                                 // Table 9
+    {                               // Header
+      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // Type
+      sizeof (SMBIOS_TABLE_TYPE9),  // Length
+      SMBIOS_HANDLE_PI_RESERVED     // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,         // Slot Designation
+    SlotTypePciExpressGen4,         // Slot Type
+    SlotDataBusWidth4X,             // Slot Data Bus Width
+    SlotUsageAvailable,             // Current Usage
+    SlotLengthShort,                // Slot Length
+    9,                              // Slot ID
+    {0, 0, 1},                      // Slot Characteristics 1
+    {1},                            // Slot Characteristics 2
+    5,                              // Segment Group Number
+    0,                              // Bus Number
+    0,                              // Device Function Number
+  },
+  {                                 // Table 10
+    {                               // Header
+      EFI_SMBIOS_TYPE_SYSTEM_SLOTS, // Type
+      sizeof (SMBIOS_TABLE_TYPE9),  // Length
+      SMBIOS_HANDLE_PI_RESERVED     // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,         // Slot Designation
+    SlotTypePciExpressGen4,         // Slot Type
+    SlotDataBusWidth4X,             // Slot Data Bus Width
+    SlotUsageAvailable,             // Current Usage
+    SlotLengthShort,                // Slot Length
+    10,                             // Slot ID
+    {0, 0, 1},                      // Slot Characteristics 1
+    {1},                            // Slot Characteristics 2
+    5,                              // Segment Group Number
+    0,                              // Bus Number
+    0,                              // Device Function Number
+  },
+  {                                 // Null-terminated table
+    {
+      NULL_TERMINATED_TYPE,
+      0,
+      0
+    },
+  }
+};
+
+//
+// Define string Tokens for additional strings.
+//
+SMBIOS_PLATFORM_DXE_STRING_TOKEN_DATA (PlatformSystemSlot) = {
+  {                                                              // Table 1
+    {                                                            // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_1)
+    },
+    ADDITIONAL_STR_INDEX_1                                       // Size of Tokens array
+  },
+  {                                                              // Table 2
+    {                                                            // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_2)
+    },
+    ADDITIONAL_STR_INDEX_1                                       // Size of Tokens array
+  },
+  {                                                              // Table 3
+    {                                                            // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_3)
+    },
+    ADDITIONAL_STR_INDEX_1                                       // Size of Tokens array
+  },
+  {                                                              // Table 4
+    {                                                            // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_4)
+    },
+    ADDITIONAL_STR_INDEX_1                                       // Size of Tokens array
+  },
+  {                                                              // Table 5
+    {                                                            // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_5)
+    },
+    ADDITIONAL_STR_INDEX_1                                       // Size of Tokens array
+  },
+  {                                                              // Table 6
+    {                                                            // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_6)
+    },
+    ADDITIONAL_STR_INDEX_1                                       // Size of Tokens array
+  },
+  {                                                              // Table 7
+    {                                                            // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_7)
+    },
+    ADDITIONAL_STR_INDEX_1                                       // Size of Tokens array
+  },
+  {                                                              // Table 8
+    {                                                            // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_8)
+    },
+    ADDITIONAL_STR_INDEX_1                                       // Size of Tokens array
+  },
+  {                                                              // Table 9
+    {                                                            // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_9)
+    },
+    ADDITIONAL_STR_INDEX_1                                       // Size of Tokens array
+  },
+  {                                                              // Table 10
+    {                                                            // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_10)
+    },
+    ADDITIONAL_STR_INDEX_1                                       // Size of Tokens array
+  },
+};
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotFunction.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotFunction.c
new file mode 100644
index 000000000000..e91b0eb1cc71
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotFunction.c
@@ -0,0 +1,58 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/AmpereCpuLib.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+
+#include "SmbiosPlatformDxe.h"
+
+/**
+  This function adds SMBIOS Table (Type 9) records.
+
+  @param  RecordData                 Pointer to SMBIOS Table with default values.
+  @param  Smbios                     SMBIOS protocol.
+
+  @retval EFI_SUCCESS                The SMBIOS Table was successfully added.
+  @retval Other                      Failed to update the SMBIOS Table.
+
+**/
+SMBIOS_PLATFORM_DXE_TABLE_FUNCTION (PlatformSystemSlot) {
+  EFI_STATUS         Status;
+  STR_TOKEN_INFO     *InputStrToken;
+  SMBIOS_TABLE_TYPE9 *InputData;
+  SMBIOS_TABLE_TYPE9 *Type9Record;
+
+  InputData = (SMBIOS_TABLE_TYPE9 *)RecordData;
+  InputStrToken = (STR_TOKEN_INFO *)StrToken;
+
+  while (InputData->Hdr.Type != NULL_TERMINATED_TYPE) {
+    SmbiosPlatformDxeCreateTable (
+      (VOID *)&Type9Record,
+      (VOID *)&InputData,
+      sizeof (SMBIOS_TABLE_TYPE9),
+      InputStrToken
+      );
+    if (Type9Record == NULL) {
+      return EFI_OUT_OF_RESOURCES;
+    }
+
+    Status = SmbiosPlatformDxeAddRecord ((UINT8 *)Type9Record, NULL);
+    if (EFI_ERROR (Status)) {
+      FreePool (Type9Record);
+      return Status;
+    }
+
+    FreePool (Type9Record);
+    InputData++;
+    InputStrToken++;
+  }
+
+  return Status;
+}
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringData.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringData.c
new file mode 100644
index 000000000000..183432440e13
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringData.c
@@ -0,0 +1,42 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "SmbiosPlatformDxe.h"
+
+//
+// Define data for SMBIOS Type 11 Table.
+//
+SMBIOS_PLATFORM_DXE_TABLE_DATA (SMBIOS_TABLE_TYPE11, PlatformOemString) = {
+  {                                 // Table 1
+    {                               // Header
+      EFI_SMBIOS_TYPE_OEM_STRINGS,  // Type
+      sizeof (SMBIOS_TABLE_TYPE11), // Length
+      SMBIOS_HANDLE_PI_RESERVED     // Handle
+    },
+    ADDITIONAL_STR_INDEX_1          // String Count
+  },
+  {                                 // Null-terminated table
+    {
+      NULL_TERMINATED_TYPE,
+      0,
+      0
+    },
+  }
+};
+
+//
+// Define string Tokens for additional strings.
+//
+SMBIOS_PLATFORM_DXE_STRING_TOKEN_DATA (PlatformOemString) = {
+  {                                               // Table 1
+    {                                             // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_STRING_1)
+    },
+    ADDITIONAL_STR_INDEX_1                        // Size of Tokens array
+  }
+};
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringFunction.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringFunction.c
new file mode 100644
index 000000000000..a1611a7d5b04
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringFunction.c
@@ -0,0 +1,57 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+
+#include "SmbiosPlatformDxe.h"
+
+/**
+  This function adds SMBIOS Table (Type 11) records.
+
+  @param  RecordData                 Pointer to SMBIOS Table with default values.
+  @param  Smbios                     SMBIOS protocol.
+
+  @retval EFI_SUCCESS                The SMBIOS Table was successfully added.
+  @retval Other                      Failed to update the SMBIOS Table.
+
+**/
+SMBIOS_PLATFORM_DXE_TABLE_FUNCTION (PlatformOemString) {
+  EFI_STATUS          Status;
+  STR_TOKEN_INFO      *InputStrToken;
+  SMBIOS_TABLE_TYPE11 *InputData;
+  SMBIOS_TABLE_TYPE11 *Type11Record;
+
+  InputData = (SMBIOS_TABLE_TYPE11 *)RecordData;
+  InputStrToken = (STR_TOKEN_INFO *)StrToken;
+
+  while (InputData->Hdr.Type != NULL_TERMINATED_TYPE) {
+    SmbiosPlatformDxeCreateTable (
+      (VOID *)&Type11Record,
+      (VOID *)&InputData,
+      sizeof (SMBIOS_TABLE_TYPE11),
+      InputStrToken
+      );
+    if (Type11Record == NULL) {
+      return EFI_OUT_OF_RESOURCES;
+    }
+
+    Status = SmbiosPlatformDxeAddRecord ((UINT8 *)Type11Record, NULL);
+    if (EFI_ERROR (Status)) {
+      FreePool (Type11Record);
+      return Status;
+    }
+
+    FreePool (Type11Record);
+    InputData++;
+    InputStrToken++;
+  }
+
+  return Status;
+}
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityData.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityData.c
new file mode 100644
index 000000000000..a6c7b3686e2e
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityData.c
@@ -0,0 +1,42 @@
+/** @file
+
+  Copyright (c) 2022, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "SmbiosPlatformDxe.h"
+
+//
+// Define data for SMBIOS Type 19 Table.
+//
+SMBIOS_PLATFORM_DXE_TABLE_DATA (SMBIOS_TABLE_TYPE24, PlatformHardwareSecurity) = {
+  {                                        // Table 1
+    {                                      // SMBIOS_STRUCTURE Hdr
+        EFI_SMBIOS_TYPE_HARDWARE_SECURITY, // UINT8 Type
+        sizeof (SMBIOS_TABLE_TYPE24),      // UINT8 Length
+        SMBIOS_HANDLE_PI_RESERVED,
+    },
+    0
+  },
+  {                                        // Null-terminated table
+    {
+      NULL_TERMINATED_TYPE,
+      0,
+      0
+    },
+  }
+};
+
+//
+// Define string Tokens for additional strings.
+//
+SMBIOS_PLATFORM_DXE_STRING_TOKEN_DATA (PlatformHardwareSecurity) = {
+  {                          // Table 1
+    {                        // Tokens array
+      NULL_TERMINATED_TOKEN
+    },
+    0                        // Size of Tokens array
+  }
+};
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityFunction.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityFunction.c
new file mode 100644
index 000000000000..0b6593da1488
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityFunction.c
@@ -0,0 +1,57 @@
+/** @file
+
+  Copyright (c) 2022, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+
+#include "SmbiosPlatformDxe.h"
+
+/**
+  This function adds SMBIOS Table (Type 24) records.
+
+  @param  RecordData                 Pointer to SMBIOS Table with default values.
+  @param  Smbios                     SMBIOS protocol.
+
+  @retval EFI_SUCCESS                The SMBIOS Table was successfully added.
+  @retval Other                      Failed to update the SMBIOS Table.
+
+**/
+SMBIOS_PLATFORM_DXE_TABLE_FUNCTION (PlatformHardwareSecurity) {
+  EFI_STATUS          Status;
+  STR_TOKEN_INFO      *InputStrToken;
+  SMBIOS_TABLE_TYPE24 *InputData;
+  SMBIOS_TABLE_TYPE24 *Type24Record;
+
+  InputData = (SMBIOS_TABLE_TYPE24 *)RecordData;
+  InputStrToken = (STR_TOKEN_INFO *)StrToken;
+
+  while (InputData->Hdr.Type != NULL_TERMINATED_TYPE) {
+    SmbiosPlatformDxeCreateTable (
+      (VOID *)&Type24Record,
+      (VOID *)&InputData,
+      sizeof (SMBIOS_TABLE_TYPE24),
+      InputStrToken
+      );
+    if (Type24Record == NULL) {
+      return EFI_OUT_OF_RESOURCES;
+    }
+
+    Status = SmbiosPlatformDxeAddRecord ((UINT8 *)Type24Record, NULL);
+    if (EFI_ERROR (Status)) {
+      FreePool (Type24Record);
+      return Status;
+    }
+
+    FreePool (Type24Record);
+    InputData++;
+    InputStrToken++;
+  }
+
+  return Status;
+}
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceData.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceData.c
new file mode 100644
index 000000000000..d4b4212e5cd3
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceData.c
@@ -0,0 +1,46 @@
+/** @file
+
+  Copyright (c) 2022, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "SmbiosPlatformDxe.h"
+
+//
+// Define data for SMBIOS Type 38 Table.
+//
+SMBIOS_PLATFORM_DXE_TABLE_DATA (SMBIOS_TABLE_TYPE38, PlatformIpmiDevice) = {
+  {                                            // Table 1
+    {                                          // Header
+      EFI_SMBIOS_TYPE_IPMI_DEVICE_INFORMATION, // Type
+      sizeof (SMBIOS_TABLE_TYPE38),            // Length
+      SMBIOS_HANDLE_PI_RESERVED                // Handle
+    },
+    IPMIDeviceInfoInterfaceTypeSSIF,           // Interface Type
+    0x20,                                      // IPMI Specification Revision
+    0x20,                                      // I2C Slave Address
+    0xFF,                                      // NV Storage Device Address
+    0x20,                                      // Base Address
+  },
+  {                                            // Null-terminated table
+    {
+      NULL_TERMINATED_TYPE,
+      0,
+      0
+    },
+  }
+};
+
+//
+// Define string Tokens for additional strings.
+//
+SMBIOS_PLATFORM_DXE_STRING_TOKEN_DATA (PlatformIpmiDevice) = {
+  {                          // Table 1
+    {                        // Tokens array
+      NULL_TERMINATED_TOKEN
+    },
+    0                        // Size of Tokens array
+  }
+};
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceFunction.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceFunction.c
new file mode 100644
index 000000000000..cda255a034ad
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceFunction.c
@@ -0,0 +1,39 @@
+/** @file
+
+  Copyright (c) 2022, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+
+#include "SmbiosPlatformDxe.h"
+
+/**
+  This function adds SMBIOS Table (Type 38) records.
+
+  @param  RecordData                 Pointer to SMBIOS Table with default values.
+  @param  Smbios                     SMBIOS protocol.
+
+  @retval EFI_SUCCESS                The SMBIOS Table was successfully added.
+  @retval Other                      Failed to update the SMBIOS Table.
+
+**/
+SMBIOS_PLATFORM_DXE_TABLE_FUNCTION (PlatformIpmiDevice) {
+  EFI_STATUS          Status;
+  SMBIOS_TABLE_TYPE38 *InputData;
+
+  InputData = (SMBIOS_TABLE_TYPE38 *)RecordData;
+  while (InputData->Hdr.Type != NULL_TERMINATED_TYPE) {
+    Status = SmbiosPlatformDxeAddRecord ((UINT8 *)InputData, NULL);
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+
+    InputData++;
+  }
+
+  return Status;
+}
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedData.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedData.c
new file mode 100644
index 000000000000..3855cfc4dc57
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedData.c
@@ -0,0 +1,47 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "SmbiosPlatformDxe.h"
+
+//
+// Define data for SMBIOS Type 41 Table.
+//
+SMBIOS_PLATFORM_DXE_TABLE_DATA (SMBIOS_TABLE_TYPE41, PlatformOnboardDevicesExtended) = {
+  {                                                         // Table 1
+    {                                                       // Header
+      EFI_SMBIOS_TYPE_ONBOARD_DEVICES_EXTENDED_INFORMATION, // Type
+      sizeof (SMBIOS_TABLE_TYPE41),                         // Length
+      SMBIOS_HANDLE_PI_RESERVED                             // Handle
+    },
+    ADDITIONAL_STR_INDEX_1,                                 // Reference Designation
+    0x83,                                                   // Device Type
+    1,                                                      // Device Type Instance
+    4,                                                      // Segment Group Number
+    2,                                                      // Bus Number
+    0                                                       // Device Function Number
+  },
+  {                                                         // Null-terminated table
+    {
+      NULL_TERMINATED_TYPE,
+      0,
+      0
+    },
+  }
+};
+
+//
+// Define string Tokens for additional strings.
+//
+SMBIOS_PLATFORM_DXE_STRING_TOKEN_DATA (PlatformOnboardDevicesExtended) = {
+  {                                                                                 // Table 1
+    {                                                                               // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_ONBOARD_DEVICES_EXTENDED_DEVICE_TYPE_INSTANCE)
+    },
+    ADDITIONAL_STR_INDEX_1                                                          // Size of Tokens array
+  }
+};
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedFunction.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedFunction.c
new file mode 100644
index 000000000000..4bc7e4547785
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedFunction.c
@@ -0,0 +1,57 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+
+#include "SmbiosPlatformDxe.h"
+
+/**
+  This function adds SMBIOS Table (Type 41) records.
+
+  @param  RecordData                 Pointer to SMBIOS Table with default values.
+  @param  Smbios                     SMBIOS protocol.
+
+  @retval EFI_SUCCESS                The SMBIOS Table was successfully added.
+  @retval Other                      Failed to update the SMBIOS Table.
+
+**/
+SMBIOS_PLATFORM_DXE_TABLE_FUNCTION (PlatformOnboardDevicesExtended) {
+  EFI_STATUS          Status;
+  STR_TOKEN_INFO      *InputStrToken;
+  SMBIOS_TABLE_TYPE41 *InputData;
+  SMBIOS_TABLE_TYPE41 *Type41Record;
+
+  InputData = (SMBIOS_TABLE_TYPE41 *)RecordData;
+  InputStrToken = (STR_TOKEN_INFO *)StrToken;
+
+  while (InputData->Hdr.Type != NULL_TERMINATED_TYPE) {
+    SmbiosPlatformDxeCreateTable (
+      (VOID *)&Type41Record,
+      (VOID *)&InputData,
+      sizeof (SMBIOS_TABLE_TYPE41),
+      InputStrToken
+      );
+    if (Type41Record == NULL) {
+      return EFI_OUT_OF_RESOURCES;
+    }
+
+    Status = SmbiosPlatformDxeAddRecord ((UINT8 *)Type41Record, NULL);
+    if (EFI_ERROR (Status)) {
+      FreePool (Type41Record);
+      return Status;
+    }
+
+    FreePool (Type41Record);
+    InputData++;
+    InputStrToken++;
+  }
+
+  return Status;
+}
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni
new file mode 100644
index 000000000000..c8176e31ab45
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni
@@ -0,0 +1,21 @@
+/** @file
+ *  Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
+ *
+ *  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+ *  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
+ *  Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+ *  Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
+ *  Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
+ *  SPDX-License-Identifier: BSD-2-Clause-Patent
+ *
+**/
+
+
+/=#
+
+#langdef en-US "English"
+
+#include "Type08/PlatformPortConnector.uni"
+#include "Type09/PlatformSystemSlot.uni"
+#include "Type11/PlatformOemString.uni"
+#include "Type41/PlatformOnboardDevicesExtended.uni"
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnector.uni b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnector.uni
new file mode 100644
index 000000000000..7a373f048594
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnector.uni
@@ -0,0 +1,22 @@
+/** @file
+
+  Copyright (c) 2022, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+/=#
+
+#string STR_PLATFORM_DXE_PORT_CONNECTOR_INTERNAL_REFERENCE_DESIGNATOR_1  #language en-US  "VGA1 - Rear VGA Connector"
+#string STR_PLATFORM_DXE_PORT_CONNECTOR_EXTERNAL_REFERENCE_DESIGNATOR_1  #language en-US  "DB-15 Male (VGA)"
+#string STR_PLATFORM_DXE_PORT_CONNECTOR_INTERNAL_REFERENCE_DESIGNATOR_2  #language en-US  "Front Panel USB 3.0"
+#string STR_PLATFORM_DXE_PORT_CONNECTOR_EXTERNAL_REFERENCE_DESIGNATOR_2  #language en-US  "USB"
+#string STR_PLATFORM_DXE_PORT_CONNECTOR_INTERNAL_REFERENCE_DESIGNATOR_3  #language en-US  "Rear Panel USB 3.0"
+#string STR_PLATFORM_DXE_PORT_CONNECTOR_EXTERNAL_REFERENCE_DESIGNATOR_3  #language en-US  "USB"
+#string STR_PLATFORM_DXE_PORT_CONNECTOR_INTERNAL_REFERENCE_DESIGNATOR_4  #language en-US  "RJ1 - BMC RJ45 Port"
+#string STR_PLATFORM_DXE_PORT_CONNECTOR_EXTERNAL_REFERENCE_DESIGNATOR_4  #language en-US  "RJ45 Connector"
+#string STR_PLATFORM_DXE_PORT_CONNECTOR_INTERNAL_REFERENCE_DESIGNATOR_5  #language en-US  "OCP1 - OCP NIC 3.0 Connector"
+#string STR_PLATFORM_DXE_PORT_CONNECTOR_EXTERNAL_REFERENCE_DESIGNATOR_5  #language en-US  "OCP NIC 3.0"
+#string STR_PLATFORM_DXE_PORT_CONNECTOR_INTERNAL_REFERENCE_DESIGNATOR_6  #language en-US  "UART1 - BMC UART5 Connector"
+#string STR_PLATFORM_DXE_PORT_CONNECTOR_EXTERNAL_REFERENCE_DESIGNATOR_6  #language en-US  "DB-9 female"
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlot.uni b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlot.uni
new file mode 100644
index 000000000000..b1722e14e511
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlot.uni
@@ -0,0 +1,20 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+/=#
+
+#string STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_1   #language en-US  "S0 Riser x32 - Slot 1"
+#string STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_2   #language en-US  "S0 Riser x32 - Slot 2"
+#string STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_3   #language en-US  "S0 Riser x32 - Slot 3"
+#string STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_4   #language en-US  "S1 Riser x24 - Slot 1"
+#string STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_5   #language en-US  "S1 Riser x24 - Slot 2"
+#string STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_6   #language en-US  "S1 Riser x24 - Slot 3"
+#string STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_7   #language en-US  "S1 Riser x8 - Slot 1"
+#string STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_8   #language en-US  "S0 OCP NIC 3.0"
+#string STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_9   #language en-US  "S0 NVMe M.2 - Slot 1"
+#string STR_PLATFORM_DXE_SYSTEM_SLOT_DESIGNATION_10  #language en-US  "S0 NVMe M.2 - Slot 2"
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemString.uni b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemString.uni
new file mode 100644
index 000000000000..ede9f24aabe7
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemString.uni
@@ -0,0 +1,11 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+/=#
+
+#string STR_PLATFORM_DXE_STRING_1  #language en-US  "www.amperecomputing.com"
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtended.uni b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtended.uni
new file mode 100644
index 000000000000..868e06236636
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtended.uni
@@ -0,0 +1,10 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+/=#
+
+#string STR_PLATFORM_DXE_ONBOARD_DEVICES_EXTENDED_DEVICE_TYPE_INSTANCE  #language en-US  "Onboard VGA"
-- 
2.39.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [edk2-platforms][PATCH 4/4] JadePkg: Add support SMBIOS Table Type 16, 17, 19
  2023-05-24  0:40 [edk2-platforms][PATCH 0/4] Add support new SMBIOS Tables and refactor to adapt with ArmPkg/SMBIOS Minh Nguyen
                   ` (2 preceding siblings ...)
  2023-05-24  0:40 ` [edk2-platforms][PATCH 3/4] JadePkg: Refactor SmbiosPlatformDxe Minh Nguyen
@ 2023-05-24  0:40 ` Minh Nguyen
  2023-06-02 12:48 ` [edk2-platforms][PATCH 0/4] Add support new SMBIOS Tables and refactor to adapt with ArmPkg/SMBIOS Ard Biesheuvel
  4 siblings, 0 replies; 7+ messages in thread
From: Minh Nguyen @ 2023-05-24  0:40 UTC (permalink / raw)
  To: devel; +Cc: patches, quic_llindhol, ardb+tianocore, nhi, minhnguyen1

This adds support SMBIOS Tables Type 16, 17, 19 for information of
Physical Memory, Memory Device and Memory Array Mapped Address.

Signed-off-by: Minh Nguyen <minhnguyen1@os.amperecomputing.com>
---
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf                             |   6 +
 Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h                                        |  24 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c                      |  26 +-
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayData.c          |  48 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayFunction.c      |  44 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceData.c                 |  63 +++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceFunction.c             | 475 ++++++++++++++++++++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressData.c     |  47 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressFunction.c | 150 +++++++
 Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLibCommon.c                             |  42 ++
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni                      |   1 +
 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDevice.uni                   |  16 +
 12 files changed, 941 insertions(+), 1 deletion(-)

diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
index 83ff918fc42d..13ae38de01f8 100755
--- a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
@@ -25,6 +25,12 @@ [Sources]
   Type09/PlatformSystemSlotFunction.c
   Type11/PlatformOemStringData.c
   Type11/PlatformOemStringFunction.c
+  Type16/PlatformPhysicalMemoryArrayData.c
+  Type16/PlatformPhysicalMemoryArrayFunction.c
+  Type17/PlatformMemoryDeviceData.c
+  Type17/PlatformMemoryDeviceFunction.c
+  Type19/PlatformMemoryArrayMappedAddressData.c
+  Type19/PlatformMemoryArrayMappedAddressFunction.c
   Type24/PlatformHardwareSecurityData.c
   Type24/PlatformHardwareSecurityFunction.c
   Type38/PlatformIpmiDeviceData.c
diff --git a/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h b/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h
index c425ed4431da..9b4f2c1e325c 100644
--- a/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h
+++ b/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h
@@ -6,6 +6,8 @@
 
 **/
 
+#include <Guid/PlatformInfoHob.h>
+
 #ifndef AMPERE_CPU_LIB_H_
 #define AMPERE_CPU_LIB_H_
 
@@ -182,6 +184,28 @@ GetScpBuild (
   UINT8 **ScpBuild
   );
 
+/**
+  Get information of DIMM List.
+
+  @param[out]   DimmList   Pointer contains information of DIMM List.
+**/
+VOID
+EFIAPI
+GetDimmList (
+  PLATFORM_DIMM_LIST **DimmList
+  );
+
+/**
+  Get information of DRAM.
+
+  @param[out]   DramInfo   Pointer contains information of DRAM.
+**/
+VOID
+EFIAPI
+GetDramInfo (
+  PLATFORM_DRAM_INFO **DramInfo
+  );
+
 /**
   Set the number of configured CPM per socket.
 
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c
index 84a4962d33fc..de5b9b83fb78 100644
--- a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c
@@ -23,9 +23,21 @@ SMBIOS_PLATFORM_DXE_TABLE_EXTERNS (
   PlatformSystemSlot
   )
 SMBIOS_PLATFORM_DXE_TABLE_EXTERNS (
-  SMBIOS_TABLE_TYPE9,
+  SMBIOS_TABLE_TYPE11,
   PlatformOemString
   )
+SMBIOS_PLATFORM_DXE_TABLE_EXTERNS (
+  SMBIOS_TABLE_TYPE16,
+  PlatformPhysicalMemoryArray
+  )
+SMBIOS_PLATFORM_DXE_TABLE_EXTERNS (
+  SMBIOS_TABLE_TYPE17,
+  PlatformMemoryDevice
+  )
+SMBIOS_PLATFORM_DXE_TABLE_EXTERNS (
+  SMBIOS_TABLE_TYPE19,
+  PlatformMemoryArrayMappedAddress
+  )
 SMBIOS_PLATFORM_DXE_TABLE_EXTERNS (
   SMBIOS_TABLE_TYPE24,
   PlatformHardwareSecurity
@@ -52,6 +64,18 @@ SMBIOS_PLATFORM_DXE_DATA_TABLE mSmbiosPlatformDxeDataTable[] = {
   SMBIOS_PLATFORM_DXE_TABLE_ENTRY_DATA_AND_FUNCTION (
     PlatformOemString
   ),
+  //Type16
+  SMBIOS_PLATFORM_DXE_TABLE_ENTRY_DATA_AND_FUNCTION (
+    PlatformPhysicalMemoryArray
+  ),
+  //Type17
+  SMBIOS_PLATFORM_DXE_TABLE_ENTRY_DATA_AND_FUNCTION (
+    PlatformMemoryDevice
+  ),
+  //Type19
+  SMBIOS_PLATFORM_DXE_TABLE_ENTRY_DATA_AND_FUNCTION (
+    PlatformMemoryArrayMappedAddress
+  ),
   // Type24
   SMBIOS_PLATFORM_DXE_TABLE_ENTRY_DATA_AND_FUNCTION (
     PlatformHardwareSecurity
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayData.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayData.c
new file mode 100644
index 000000000000..3c0e6a2ce9a0
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayData.c
@@ -0,0 +1,48 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "SmbiosPlatformDxe.h"
+
+//
+// Define data for SMBIOS Type 16 Table.
+//
+SMBIOS_PLATFORM_DXE_TABLE_DATA (SMBIOS_TABLE_TYPE16, PlatformPhysicalMemoryArray) = {
+  {                                          // Table 1
+    {                                        // Header
+      EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, // Type
+      sizeof (SMBIOS_TABLE_TYPE16),          // Length
+      SMBIOS_HANDLE_PI_RESERVED,             // Handle
+    },
+    MemoryArrayLocationSystemBoard,          // Location
+    MemoryArrayUseSystemMemory,              // Use
+    MemoryErrorCorrectionMultiBitEcc,        // Memory Error Correction
+    0x80000000,                              // Maximum Capacity
+    0xFFFE,                                  // Memory Error Information Handle
+    0x10,                                    // Number Of Memory Device
+    0x40000000000ULL                         // Extended Maximum Capacity
+  },
+  {                                          // Null-terminated table
+    {
+      NULL_TERMINATED_TYPE,
+      0,
+      0
+    },
+  }
+};
+
+//
+// Define string Tokens for additional strings.
+//
+SMBIOS_PLATFORM_DXE_STRING_TOKEN_DATA (PlatformPhysicalMemoryArray) = {
+  {                                         // Table 1
+    {                                       // Tokens array
+      NULL_TERMINATED_TOKEN
+    },
+    0                                       // Size of Tokens array
+  }
+};
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayFunction.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayFunction.c
new file mode 100644
index 000000000000..772fa02cc256
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayFunction.c
@@ -0,0 +1,44 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/AmpereCpuLib.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+
+#include "SmbiosPlatformDxe.h"
+
+/**
+  This function adds SMBIOS Table (Type 16) records.
+
+  @param  RecordData                 Pointer to SMBIOS Table with default values.
+  @param  Smbios                     SMBIOS protocol.
+
+  @retval EFI_SUCCESS                The SMBIOS Table was successfully added.
+  @retval Other                      Failed to update the SMBIOS Table.
+
+**/
+SMBIOS_PLATFORM_DXE_TABLE_FUNCTION (PlatformPhysicalMemoryArray) {
+  UINT8               Index;
+  EFI_STATUS          Status;
+  SMBIOS_TABLE_TYPE16 *InputData;
+
+  for (Index = 0; Index < GetNumberOfSupportedSockets (); Index++) {
+    InputData = (SMBIOS_TABLE_TYPE16 *)RecordData;
+
+    while (InputData->Hdr.Type != NULL_TERMINATED_TYPE) {
+      Status = SmbiosPlatformDxeAddRecord ((UINT8 *)InputData, NULL);
+      if (EFI_ERROR (Status)) {
+        return Status;
+      }
+
+      InputData++;
+    }
+  }
+
+  return Status;
+}
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceData.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceData.c
new file mode 100644
index 000000000000..2b2c2fc3b4df
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceData.c
@@ -0,0 +1,63 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "SmbiosPlatformDxe.h"
+
+//
+// Define data for SMBIOS Type 17 Table.
+//
+SMBIOS_PLATFORM_DXE_TABLE_DATA (SMBIOS_TABLE_TYPE17, PlatformMemoryDevice) = {
+  {                                   // Table 1
+    {                                 // Hdr
+      EFI_SMBIOS_TYPE_MEMORY_DEVICE,  // Type
+      sizeof (SMBIOS_TABLE_TYPE17),   // Length
+      SMBIOS_HANDLE_PI_RESERVED       // Handle
+    },
+    0xFFFF,                           // Memory Array Handle
+    0xFFFE,                           // Memory Error Information Handle
+    72,                               // Total Width
+    64,                               // Data Width
+    0,                                // Size
+    0x09,                             // Form Factor
+    1,                                // Device Set
+    ADDITIONAL_STR_INDEX_1,           // Device Locator
+    ADDITIONAL_STR_INDEX_2,           // Bank Locator
+    MemoryTypeDdr4,                   // Memory Type
+    {},                               // Type Detail
+    0,                                // Speed
+    ADDITIONAL_STR_INDEX_3,           // Manufacturer
+    ADDITIONAL_STR_INDEX_4,           // Serial
+    ADDITIONAL_STR_INDEX_5,           // Asset Tag
+    ADDITIONAL_STR_INDEX_6,           // Part Number
+    0,                                // Attributes
+  },
+  {                                   // Null-terminated table
+    {
+      NULL_TERMINATED_TYPE,
+      0,
+      0
+    },
+  }
+};
+
+//
+// Define string Tokens for additional strings.
+//
+SMBIOS_PLATFORM_DXE_STRING_TOKEN_DATA (PlatformMemoryDevice) = {
+  {                                                                 // Table 1
+    {                                                               // Tokens array
+      STRING_TOKEN (STR_PLATFORM_DXE_MEMORY_DEVICE_DEVICE_LOCATOR),
+      STRING_TOKEN (STR_PLATFORM_DXE_MEMORY_DEVICE_BANK_LOCATOR),
+      STRING_TOKEN (STR_PLATFORM_DXE_MEMORY_DEVICE_MANUFACTURER),
+      STRING_TOKEN (STR_PLATFORM_DXE_MEMORY_DEVICE_SERIAL_NUMBER),
+      STRING_TOKEN (STR_PLATFORM_DXE_MEMORY_DEVICE_ASSET_TAG),
+      STRING_TOKEN (STR_PLATFORM_DXE_MEMORY_DEVICE_PART_NUMBER)
+    },
+    ADDITIONAL_STR_INDEX_6                                          // Size of Tokens array
+  }
+};
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceFunction.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceFunction.c
new file mode 100644
index 000000000000..d15e4d40a01c
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceFunction.c
@@ -0,0 +1,475 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Guid/PlatformInfoHob.h>
+#include <Library/AmpereCpuLib.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/HiiLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/PrintLib.h>
+
+#include "SmbiosPlatformDxe.h"
+
+#define NULL_TERMINATED_ID                         0xFF
+
+#define ASCII_SPACE_CHARACTER_CODE                 0x20
+#define ASCII_TILDE_CHARACTER_CODE                 0x7E
+
+#define SPD_PARITY_BIT_MASK                        0x80
+#define SPD_MEMORY_TYPE_OFFSET                     0x02
+#define SPD_CONTINUATION_CHARACTER                 0x7F
+
+#define DDR2_SPD_MANUFACTURER_MEMORY_TYPE          0x08
+#define DDR2_SPD_MANUFACTURER_ID_CODE_LENGTH       8
+#define DDR2_SPD_MANUFACTURER_ID_CODE_OFFSET       64
+#define DDR2_SPD_MANUFACTURER_PART_NUMBER_OFFSET   73
+#define DDR2_SPD_MANUFACTURER_SERIAL_NUMBER_OFFSET 95
+
+#define DDR3_SPD_MANUFACTURER_MEMORY_TYPE          0x0B
+#define DDR3_SPD_MANUFACTURER_ID_BANK_OFFSET       117
+#define DDR3_SPD_MANUFACTURER_ID_CODE_OFFSET       118
+#define DDR3_SPD_MANUFACTURER_PART_NUMBER_OFFSET   128
+#define DDR3_SPD_MANUFACTURER_SERIAL_NUMBER_OFFSET 122
+
+#define DDR4_SPD_MANUFACTURER_MEMORY_TYPE          0x0C
+#define DDR4_SPD_MANUFACTURER_ID_BANK_OFFSET       320
+#define DDR4_SPD_MANUFACTURER_ID_CODE_OFFSET       321
+#define DDR4_SPD_MANUFACTURER_PART_NUMBER_OFFSET   329
+#define DDR4_SPD_MANUFACTURER_SERIAL_NUMBER_OFFSET 325
+
+#define PRINTABLE_CHARACTER(Character) \
+  (Character >= ASCII_SPACE_CHARACTER_CODE) && (Character <= ASCII_TILDE_CHARACTER_CODE) ? \
+  Character : ASCII_SPACE_CHARACTER_CODE
+
+typedef enum {
+  DEVICE_LOCATOR_TOKEN_INDEX = 0,
+  BANK_LOCATOR_TOKEN_INDEX,
+  MANUFACTURER_TOKEN_INDEX,
+  SERIAL_NUMBER_TOKEN_INDEX,
+  ASSET_TAG_TOKEN_INDEX,
+  PART_NUMBER_TOKEN_INDEX
+} MEMORY_DEVICE_TOKEN_INDEX;
+
+#pragma pack(1)
+typedef struct {
+  UINT8  VendorId;
+  CHAR16 *ManufacturerString;
+} JEDEC_MF_ID;
+#pragma pack()
+
+JEDEC_MF_ID Bank0Table[] = {
+  { 0x01, L"AMD\0" },
+  { 0x04, L"Fujitsu\0" },
+  { 0x07, L"Hitachi\0" },
+  { 0x89, L"Intel\0" },
+  { 0x10, L"NEC\0" },
+  { 0x97, L"Texas Instrument\0" },
+  { 0x98, L"Toshiba\0" },
+  { 0x1C, L"Mitsubishi\0" },
+  { 0x1F, L"Atmel\0" },
+  { 0x20, L"STMicroelectronics\0" },
+  { 0xA4, L"IBM\0" },
+  { 0x2C, L"Micron Technology\0" },
+  { 0xAD, L"SK Hynix\0" },
+  { 0xB0, L"Sharp\0" },
+  { 0xB3, L"IDT\0" },
+  { 0x3E, L"Oracle\0" },
+  { 0xBF, L"SST\0" },
+  { 0x40, L"ProMos/Mosel\0" },
+  { 0xC1, L"Infineon\0" },
+  { 0xC2, L"Macronix\0" },
+  { 0x45, L"SanDisk\0" },
+  { 0xCE, L"Samsung\0" },
+  { 0xDA, L"Winbond\0" },
+  { 0xE0, L"LG Semi\0" },
+  { 0x62, L"Sanyo\0" },
+  { NULL_TERMINATED_ID, L"Undefined\0" }
+};
+
+JEDEC_MF_ID Bank1Table[] = {
+  { 0x98, L"Kingston\0" },
+  { 0xBA, L"PNY\0" },
+  { 0x4F, L"Transcend\0" },
+  { 0x7A, L"Apacer\0" },
+  { NULL_TERMINATED_ID, L"Undefined\0" }
+};
+
+JEDEC_MF_ID Bank2Table[] = {
+  { 0x9E, L"Corsair\0" },
+  { 0xFE, L"Elpida\0" },
+  { NULL_TERMINATED_ID, L"Undefined\0" }
+};
+
+JEDEC_MF_ID Bank3Table[] = {
+  { 0x0B, L"Nanya\0" },
+  { 0x94, L"Mushkin\0" },
+  { 0x25, L"Kingmax\0" },
+  { NULL_TERMINATED_ID, L"Undefined\0" }
+};
+
+JEDEC_MF_ID Bank4Table[] = {
+  { 0xB0, L"OCZ\0" },
+  { 0xCB, L"A-DATA\0" },
+  { 0xCD, L"G Skill\0" },
+  { 0xEF, L"Team\0" },
+  { NULL_TERMINATED_ID, L"Undefined\0" }
+};
+
+JEDEC_MF_ID Bank5Table[] = {
+  { 0x02, L"Patriot\0" },
+  { 0x9B, L"Crucial\0" },
+  { 0x51, L"Qimonda\0" },
+  { 0x57, L"AENEON\0" },
+  { 0xF7, L"Avant\0" },
+  { NULL_TERMINATED_ID, L"Undefined\0" }
+};
+
+JEDEC_MF_ID Bank6Table[] = {
+  { 0x34, L"Super Talent\0" },
+  { 0xD3, L"Silicon Power\0" },
+  { NULL_TERMINATED_ID, L"Undefined\0" }
+};
+
+JEDEC_MF_ID Bank7Table[] = {
+  { NULL_TERMINATED_ID, L"Undefined\0" }
+};
+
+JEDEC_MF_ID *ManufacturerJedecIdBankTable[] = {
+  Bank0Table,
+  Bank1Table,
+  Bank2Table,
+  Bank3Table,
+  Bank4Table,
+  Bank5Table,
+  Bank6Table,
+  Bank7Table
+};
+
+VOID
+UpdateManufacturer (
+  IN UINT8  *SpdData,
+  IN UINT16 ManufacturerToken
+  )
+{
+  UINTN       Index;
+  UINT8       VendorId;
+  UINT8       MemType;
+  UINT8       NumberOfJedecIdBankTables;
+  JEDEC_MF_ID *IdTblPtr = NULL;
+
+  MemType = SpdData[SPD_MEMORY_TYPE_OFFSET];
+  switch (MemType) {
+  case DDR2_SPD_MANUFACTURER_MEMORY_TYPE:
+    for (Index = 0; Index < DDR2_SPD_MANUFACTURER_ID_CODE_LENGTH; Index++) {
+      VendorId = SpdData[DDR2_SPD_MANUFACTURER_ID_CODE_OFFSET + Index];
+      if (VendorId != SPD_CONTINUATION_CHARACTER) {
+        break;
+      }
+    }
+    break;
+
+  case DDR3_SPD_MANUFACTURER_MEMORY_TYPE:
+    Index = SpdData[DDR3_SPD_MANUFACTURER_ID_BANK_OFFSET] & (~SPD_PARITY_BIT_MASK); // Remove parity bit
+    VendorId = SpdData[DDR4_SPD_MANUFACTURER_ID_CODE_OFFSET];
+    break;
+
+  case DDR4_SPD_MANUFACTURER_MEMORY_TYPE:
+    Index = SpdData[DDR4_SPD_MANUFACTURER_ID_BANK_OFFSET] & (~SPD_PARITY_BIT_MASK); // Remove parity bit
+    VendorId = SpdData[DDR4_SPD_MANUFACTURER_ID_CODE_OFFSET];
+    break;
+
+  default: // Not supported
+    return;
+  }
+
+  NumberOfJedecIdBankTables = ARRAY_SIZE (ManufacturerJedecIdBankTable) - 1; // Exclude NULL-terminated table
+  if (Index > NumberOfJedecIdBankTables) {
+    Index = NumberOfJedecIdBankTables;
+  }
+  IdTblPtr = ManufacturerJedecIdBankTable[Index];
+
+  // Search in Manufacturer table and update vendor name accordingly in HII Database
+  while (IdTblPtr->VendorId != NULL_TERMINATED_ID) {
+    if (IdTblPtr->VendorId == VendorId) {
+      HiiSetString (mSmbiosPlatformDxeHiiHandle, ManufacturerToken, IdTblPtr->ManufacturerString, NULL);
+      break;
+    }
+    IdTblPtr++;
+  }
+}
+
+VOID
+UpdateSerialNumber (
+  IN UINT8  *SpdData,
+  IN UINT16 SerialNumberToken
+  )
+{
+  UINT8  MemType;
+  UINTN  Offset;
+  CHAR16 SerialNumberStr[SMBIOS_UNICODE_STRING_MAX_LENGTH];
+
+  MemType = SpdData[SPD_MEMORY_TYPE_OFFSET];
+  switch (MemType) {
+  case DDR2_SPD_MANUFACTURER_MEMORY_TYPE:
+    Offset = DDR2_SPD_MANUFACTURER_SERIAL_NUMBER_OFFSET;
+    break;
+
+  case DDR3_SPD_MANUFACTURER_MEMORY_TYPE:
+    Offset = DDR3_SPD_MANUFACTURER_SERIAL_NUMBER_OFFSET;
+    break;
+
+  case DDR4_SPD_MANUFACTURER_MEMORY_TYPE:
+    Offset = DDR4_SPD_MANUFACTURER_SERIAL_NUMBER_OFFSET;
+    break;
+
+  default: // Not supported
+    return;
+  }
+
+  UnicodeSPrint (
+    SerialNumberStr,
+    sizeof (SerialNumberStr),
+    L"%02X%02X%02X%02X",
+    SpdData[Offset],
+    SpdData[Offset + 1],
+    SpdData[Offset + 2],
+    SpdData[Offset + 3]
+    );
+  HiiSetString (mSmbiosPlatformDxeHiiHandle, SerialNumberToken, SerialNumberStr, NULL);
+}
+
+VOID
+UpdatePartNumber (
+  IN UINT8  *SpdData,
+  IN UINT16 PartNumberToken
+  )
+{
+  UINT8  MemType;
+  UINTN  Offset;
+  CHAR16 PartNumberStr[SMBIOS_UNICODE_STRING_MAX_LENGTH];
+
+  MemType = SpdData[SPD_MEMORY_TYPE_OFFSET];
+  switch (MemType) {
+  case DDR2_SPD_MANUFACTURER_MEMORY_TYPE:
+    Offset = DDR2_SPD_MANUFACTURER_PART_NUMBER_OFFSET;
+    break;
+
+  case DDR3_SPD_MANUFACTURER_MEMORY_TYPE:
+    Offset = DDR3_SPD_MANUFACTURER_PART_NUMBER_OFFSET;
+    break;
+
+  case DDR4_SPD_MANUFACTURER_MEMORY_TYPE:
+    Offset = DDR4_SPD_MANUFACTURER_PART_NUMBER_OFFSET;
+    break;
+
+  default: // Not supported
+    return;
+  }
+
+  UnicodeSPrint (
+    PartNumberStr,
+    sizeof (PartNumberStr),
+    L"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
+    PRINTABLE_CHARACTER (SpdData[Offset]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 1]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 2]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 3]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 4]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 5]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 6]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 7]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 8]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 9]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 10]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 11]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 12]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 13]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 14]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 15]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 16]),
+    PRINTABLE_CHARACTER (SpdData[Offset + 17])
+    );
+  HiiSetString (mSmbiosPlatformDxeHiiHandle, PartNumberToken, PartNumberStr, NULL);
+}
+
+/**
+  This function adds SMBIOS Table (Type 17) records.
+
+  @param  RecordData                 Pointer to SMBIOS Table with default values.
+  @param  Smbios                     SMBIOS protocol.
+
+  @retval EFI_SUCCESS                The SMBIOS Table was successfully added.
+  @retval Other                      Failed to update the SMBIOS Table.
+
+**/
+SMBIOS_PLATFORM_DXE_TABLE_FUNCTION (PlatformMemoryDevice) {
+  UINT8               Index;
+  UINT8               SlotIndex;
+  UINTN               HandleCount;
+  UINTN               MemorySize;
+  UINT16              *HandleArray;
+  CHAR16              UnicodeStr[SMBIOS_UNICODE_STRING_MAX_LENGTH];
+  EFI_STATUS          Status;
+  SMBIOS_HANDLE       MemoryArrayHandle;
+  PLATFORM_DIMM       *Dimm;
+  STR_TOKEN_INFO      *InputStrToken;
+  PLATFORM_DIMM_LIST  *DimmList;
+  PLATFORM_DRAM_INFO  *DramInfo;
+  SMBIOS_TABLE_TYPE17 *InputData;
+  SMBIOS_TABLE_TYPE17 *Type17Record;
+
+  HandleCount   = 0;
+  HandleArray   = NULL;
+
+  GetDimmList (&DimmList);
+  if (DimmList == NULL) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] Failed to get Dimm List\n",
+      __func__,
+      __LINE__
+      ));
+    return EFI_NOT_FOUND;
+  }
+
+  GetDramInfo (&DramInfo);
+  if (DramInfo == NULL) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] Failed to get DRAM Information\n",
+      __func__,
+      __LINE__
+      ));
+    return EFI_NOT_FOUND;
+  }
+
+  SmbiosPlatformDxeGetLinkTypeHandle (
+    EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY,
+    &HandleArray,
+    &HandleCount
+    );
+  if (HandleArray == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+  if (HandleCount != GetNumberOfSupportedSockets ()) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] Failed to get Memory Array Handle\n",
+      __func__,
+      __LINE__
+      ));
+    FreePool (HandleArray);
+    return EFI_NOT_FOUND;
+  }
+
+  for (Index = 0; Index < GetNumberOfSupportedSockets (); Index++) {
+    InputData = (SMBIOS_TABLE_TYPE17 *)RecordData;
+    InputStrToken = (STR_TOKEN_INFO *)StrToken;
+    MemoryArrayHandle = HandleArray[Index];
+
+    while (InputData->Hdr.Type != NULL_TERMINATED_TYPE) {
+      for (SlotIndex = 0; SlotIndex < DimmList->BoardDimmSlots; SlotIndex++) {
+        //
+        // Prepare additional strings for SMBIOS Table.
+        //
+        Dimm = &DimmList->Dimm[SlotIndex];
+        if (Dimm->NodeId != Index) {
+          continue;
+        }
+
+        Status = SmbiosPlatformDxeSaveHiiDefaultString (InputStrToken);
+        if (EFI_ERROR (Status)) {
+          FreePool (HandleArray);
+          return Status;
+        }
+        if (Dimm->Info.DimmStatus == DIMM_INSTALLED_OPERATIONAL) {
+          UpdateManufacturer (Dimm->SpdData.Data, InputStrToken->TokenArray[MANUFACTURER_TOKEN_INDEX]);
+          UpdateSerialNumber (Dimm->SpdData.Data, InputStrToken->TokenArray[SERIAL_NUMBER_TOKEN_INDEX]);
+          UpdatePartNumber (Dimm->SpdData.Data, InputStrToken->TokenArray[PART_NUMBER_TOKEN_INDEX]);
+        }
+        UnicodeSPrint (UnicodeStr, sizeof (UnicodeStr), L"Socket %d DIMM %d", Index, SlotIndex);
+        HiiSetString (mSmbiosPlatformDxeHiiHandle, InputStrToken->TokenArray[DEVICE_LOCATOR_TOKEN_INDEX], UnicodeStr, NULL);
+        UnicodeSPrint (UnicodeStr, sizeof (UnicodeStr), L"Bank %d", SlotIndex);
+        HiiSetString (mSmbiosPlatformDxeHiiHandle, InputStrToken->TokenArray[BANK_LOCATOR_TOKEN_INDEX], UnicodeStr, NULL);
+        UnicodeSPrint (UnicodeStr, sizeof (UnicodeStr), L"Array %d Asset Tag %d", Index, SlotIndex);
+        HiiSetString (mSmbiosPlatformDxeHiiHandle, InputStrToken->TokenArray[ASSET_TAG_TOKEN_INDEX], UnicodeStr, NULL);
+
+        //
+        // Create Table and fill up information.
+        //
+        SmbiosPlatformDxeCreateTable (
+          (VOID *)&Type17Record,
+          (VOID *)&InputData,
+          sizeof (SMBIOS_TABLE_TYPE17),
+          InputStrToken
+          );
+        if (Type17Record == NULL) {
+          FreePool (HandleArray);
+          return EFI_OUT_OF_RESOURCES;
+        }
+
+        if (Dimm->Info.DimmStatus == DIMM_INSTALLED_OPERATIONAL) {
+          MemorySize = Dimm->Info.DimmSize * 1024;
+          if (MemorySize >= 0x7FFF) {
+            Type17Record->Size = 0x7FFF;
+            Type17Record->ExtendedSize = MemorySize;
+          } else {
+            Type17Record->Size = (UINT16)MemorySize;
+            Type17Record->ExtendedSize = 0;
+          }
+
+          Type17Record->MemoryType                 = 0x1A; // DDR4
+          Type17Record->Speed                      = (UINT16)DramInfo->MaxSpeed;
+          Type17Record->ConfiguredMemoryClockSpeed = (UINT16)DramInfo->MaxSpeed;
+          Type17Record->Attributes                 = Dimm->Info.DimmNrRank & 0x0F;
+          Type17Record->ConfiguredVoltage          = 1200;
+          Type17Record->MinimumVoltage             = 1140;
+          Type17Record->MaximumVoltage             = 1260;
+          Type17Record->DeviceSet                  = 0; // None
+
+          if (Dimm->Info.DimmType == UDIMM || Dimm->Info.DimmType == SODIMM) {
+            Type17Record->TypeDetail.Unbuffered = 1; // BIT 14: unregistered
+          } else if (Dimm->Info.DimmType == RDIMM
+                    || Dimm->Info.DimmType == LRDIMM
+                    || Dimm->Info.DimmType == RSODIMM)
+          {
+            Type17Record->TypeDetail.Registered = 1; // BIT 13: registered
+          }
+          /* FIXME: Determine if need to set technology to NVDIMM-* when supported */
+          Type17Record->MemoryTechnology = 0x3; // DRAM
+        }
+        // Update Type 16 handle
+        Type17Record->MemoryArrayHandle = MemoryArrayHandle;
+
+        //
+        // Add Table record and free pool.
+        //
+        Status = SmbiosPlatformDxeAddRecord ((UINT8 *)Type17Record, NULL);
+        if (EFI_ERROR (Status)) {
+          FreePool (HandleArray);
+          FreePool (Type17Record);
+          return Status;
+        }
+
+        FreePool (Type17Record);
+        Status = SmbiosPlatformDxeRestoreHiiDefaultString (InputStrToken);
+        if (EFI_ERROR (Status)) {
+          FreePool (HandleArray);
+          return Status;
+        }
+      }
+
+      InputData++;
+      InputStrToken++;
+    }
+  }
+  FreePool (HandleArray);
+
+  return Status;
+}
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressData.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressData.c
new file mode 100644
index 000000000000..d14099ae8852
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressData.c
@@ -0,0 +1,47 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "SmbiosPlatformDxe.h"
+
+//
+// Define data for SMBIOS Type 19 Table.
+//
+SMBIOS_PLATFORM_DXE_TABLE_DATA (SMBIOS_TABLE_TYPE19, PlatformMemoryArrayMappedAddress) = {
+  {                                                 // Table 1
+    {                                               // Header
+      EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS,  // Type
+      sizeof (SMBIOS_TABLE_TYPE19),                 // Length
+      SMBIOS_HANDLE_PI_RESERVED                     // Handle
+    },
+    0xFFFFFFFF,                                     // Starting Address
+    0xFFFFFFFF,                                     // Ending Address
+    0xFFFF,                                         // Memory Array Handle
+    1,                                              // Partition Width
+    0x0,                                            // Extended Starting Address
+    0x0                                             // Extended Ending Address
+  },
+  {                                                 // Null-terminated table
+    {
+      NULL_TERMINATED_TYPE,
+      0,
+      0
+    },
+  }
+};
+
+//
+// Define string Tokens for additional strings.
+//
+SMBIOS_PLATFORM_DXE_STRING_TOKEN_DATA (PlatformMemoryArrayMappedAddress) = {
+  {                          // Table 1
+    {                        // Tokens array
+      NULL_TERMINATED_TOKEN
+    },
+    0                        // Size of Tokens array
+  }
+};
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressFunction.c b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressFunction.c
new file mode 100644
index 000000000000..c57eaef26bf5
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressFunction.c
@@ -0,0 +1,150 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Guid/PlatformInfoHob.h>
+#include <Library/AmpereCpuLib.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+
+#include "SmbiosPlatformDxe.h"
+
+/**
+  This function adds SMBIOS Table (Type 19) records.
+
+  @param  RecordData                 Pointer to SMBIOS Table with default values.
+  @param  Smbios                     SMBIOS protocol.
+
+  @retval EFI_SUCCESS                The SMBIOS Table was successfully added.
+  @retval Other                      Failed to update the SMBIOS Table.
+
+**/
+SMBIOS_PLATFORM_DXE_TABLE_FUNCTION (PlatformMemoryArrayMappedAddress) {
+  UINT8               Index;
+  UINT8               SlotIndex;
+  UINT8               MemRegionIndex;
+  UINTN               HandleCount;
+  UINTN               MemorySize;
+  UINT16              *HandleArray;
+  EFI_STATUS          Status;
+  PLATFORM_DIMM       *Dimm;
+  STR_TOKEN_INFO      *InputStrToken;
+  PLATFORM_DIMM_LIST  *DimmList;
+  PLATFORM_DRAM_INFO  *DramInfo;
+  SMBIOS_TABLE_TYPE19 *InputData;
+  SMBIOS_TABLE_TYPE19 *Type19Record;
+
+  HandleCount   = 0;
+  HandleArray   = NULL;
+
+  GetDimmList (&DimmList);
+  if (DimmList == NULL) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] Failed to get Dimm List\n",
+      __func__,
+      __LINE__
+      ));
+    return EFI_NOT_FOUND;
+  }
+
+  GetDramInfo (&DramInfo);
+  if (DramInfo == NULL) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] Failed to get DRAM Information\n",
+      __func__,
+      __LINE__
+      ));
+    return EFI_NOT_FOUND;
+  }
+
+  SmbiosPlatformDxeGetLinkTypeHandle (
+    EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY,
+    &HandleArray,
+    &HandleCount
+    );
+  if (HandleArray == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+  if (HandleCount != GetNumberOfSupportedSockets ()) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "[%a]:[%dL] Failed to get Memory Array Handle\n",
+      __func__,
+      __LINE__
+      ));
+    FreePool (HandleArray);
+    return EFI_NOT_FOUND;
+  }
+
+  for (Index = 0; Index < GetNumberOfSupportedSockets (); Index++) {
+    InputData = (SMBIOS_TABLE_TYPE19 *)RecordData;
+    InputStrToken = (STR_TOKEN_INFO *)StrToken;
+    while (InputData->Hdr.Type != NULL_TERMINATED_TYPE) {
+      //
+      // Calculate memory size
+      //
+      for (SlotIndex = 0; SlotIndex < DimmList->BoardDimmSlots; SlotIndex++) {
+        Dimm = &DimmList->Dimm[SlotIndex];
+        if (Dimm->NodeId != Index) {
+          continue;
+        }
+
+        if (Dimm->Info.DimmStatus == DIMM_INSTALLED_OPERATIONAL) {
+          MemorySize = Dimm->Info.DimmSize * 1024;
+        }
+      }
+
+      //
+      // Create Table and fill up information
+      //
+      for (MemRegionIndex = 0; MemRegionIndex < DramInfo->NumRegion; MemRegionIndex++) {
+        SmbiosPlatformDxeCreateTable (
+          (VOID *)&Type19Record,
+          (VOID *)&InputData,
+          sizeof (SMBIOS_TABLE_TYPE19),
+          InputStrToken
+          );
+        if (Type19Record == NULL) {
+          FreePool (HandleArray);
+          return EFI_OUT_OF_RESOURCES;
+        }
+
+        if (DramInfo->NvdRegion[MemRegionIndex] > 0
+            || DramInfo->Socket[MemRegionIndex] != Index)
+        {
+          continue;
+        }
+
+        Type19Record->ExtendedStartingAddress = DramInfo->Base[MemRegionIndex];
+        Type19Record->ExtendedEndingAddress   = DramInfo->Base[MemRegionIndex] +
+                                                DramInfo->Size[MemRegionIndex] -1;
+        if (MemorySize != 0) {
+          Type19Record->PartitionWidth = (DramInfo->Size[MemRegionIndex] - 1) / MemorySize + 1;
+        }
+        Type19Record->MemoryArrayHandle = HandleArray[Index];
+
+        Status = SmbiosPlatformDxeAddRecord ((UINT8 *)Type19Record, NULL);
+        if (EFI_ERROR (Status)) {
+          FreePool (HandleArray);
+          FreePool (Type19Record);
+          return Status;
+        }
+
+        FreePool (Type19Record);
+      }
+
+      InputData++;
+      InputStrToken++;
+    }
+  }
+  FreePool (HandleArray);
+
+  return Status;
+}
diff --git a/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLibCommon.c b/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLibCommon.c
index 853ab5543f11..0d72853e3d5f 100644
--- a/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLibCommon.c
+++ b/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLibCommon.c
@@ -555,6 +555,48 @@ GetScpBuild (
   }
 }
 
+/**
+  Get information of DIMM List.
+
+  @param[out]   DimmList   Pointer contains information of DIMM List.
+**/
+VOID
+EFIAPI
+GetDimmList (
+  PLATFORM_DIMM_LIST **DimmList
+  )
+{
+  PLATFORM_INFO_HOB *PlatformHob;
+
+  PlatformHob = GetPlatformHob ();
+  if (PlatformHob != NULL) {
+    *DimmList = &PlatformHob->DimmList;
+  } else {
+    *DimmList = NULL;
+  }
+}
+
+/**
+  Get information of DRAM.
+
+  @param[out]   DramInfo   Pointer contains information of DRAM.
+**/
+VOID
+EFIAPI
+GetDramInfo (
+  PLATFORM_DRAM_INFO **DramInfo
+  )
+{
+  PLATFORM_INFO_HOB *PlatformHob;
+
+  PlatformHob = GetPlatformHob ();
+  if (PlatformHob != NULL) {
+    *DramInfo = &PlatformHob->DramInfo;
+  } else {
+    *DramInfo = NULL;
+  }
+}
+
 /**
   Set the number of configured CPM per socket.
 
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni
index c8176e31ab45..83a76202d614 100644
--- a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni
@@ -18,4 +18,5 @@
 #include "Type08/PlatformPortConnector.uni"
 #include "Type09/PlatformSystemSlot.uni"
 #include "Type11/PlatformOemString.uni"
+#include "Type17/PlatformMemoryDevice.uni"
 #include "Type41/PlatformOnboardDevicesExtended.uni"
diff --git a/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDevice.uni b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDevice.uni
new file mode 100644
index 000000000000..012bc241f78a
--- /dev/null
+++ b/Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDevice.uni
@@ -0,0 +1,16 @@
+/** @file
+
+  Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+/=#
+
+#string STR_PLATFORM_DXE_MEMORY_DEVICE_DEVICE_LOCATOR  #language en-US  "Not set"
+#string STR_PLATFORM_DXE_MEMORY_DEVICE_BANK_LOCATOR    #language en-US  "Not set"
+#string STR_PLATFORM_DXE_MEMORY_DEVICE_MANUFACTURER    #language en-US  "Not set"
+#string STR_PLATFORM_DXE_MEMORY_DEVICE_SERIAL_NUMBER   #language en-US  "Not set"
+#string STR_PLATFORM_DXE_MEMORY_DEVICE_ASSET_TAG       #language en-US  "Not set"
+#string STR_PLATFORM_DXE_MEMORY_DEVICE_PART_NUMBER     #language en-US  "Not set"
-- 
2.39.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [edk2-platforms][PATCH 0/4] Add support new SMBIOS Tables and refactor to adapt with ArmPkg/SMBIOS
  2023-05-24  0:40 [edk2-platforms][PATCH 0/4] Add support new SMBIOS Tables and refactor to adapt with ArmPkg/SMBIOS Minh Nguyen
                   ` (3 preceding siblings ...)
  2023-05-24  0:40 ` [edk2-platforms][PATCH 4/4] JadePkg: Add support SMBIOS Table Type 16, 17, 19 Minh Nguyen
@ 2023-06-02 12:48 ` Ard Biesheuvel
  2023-06-06  6:11   ` Nhi Pham
  4 siblings, 1 reply; 7+ messages in thread
From: Ard Biesheuvel @ 2023-06-02 12:48 UTC (permalink / raw)
  To: Minh Nguyen; +Cc: devel, patches, quic_llindhol, nhi

On Wed, 24 May 2023 at 02:41, Minh Nguyen
<minhnguyen1@os.amperecomputing.com> wrote:
>
> These patches helps to add new SMBIOS Tables (Type 16, 17, 19) and refactor SmbiosPlatformDxe.
>
> Minh Nguyen (4):
>   JadePkg: Correct PCD names for SMBIOS Type 0
>   JadePkg: Leverage ArmPkg/Smbios (Type 0, 1, 2, 3, 13, 32)
>   JadePkg: Refactor SmbiosPlatformDxe
>   JadePkg: Add support SMBIOS Table Type 16, 17, 19
>

Pushed as 38170a4175a6..6fe5a2309118

I tried to do a build test of Jade.dsc but I got an error related to
PcdValueInit. Any idea what is going on here?

>  Silicon/Ampere/AmpereSiliconPkg/AmpereSiliconPkg.dec                                                |   14 +-
>  Platform/Ampere/JadePkg/Jade.dsc                                                                    |    7 +-
>  Platform/Ampere/JadePkg/Jade.fdf                                                                    |    1 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf                             |   43 +-
>  Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.inf                                           |   15 +-
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h                               |  201 +++
>  Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h                                        |   46 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c                               | 1553 ++++++--------------
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c                      |   96 ++
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorData.c                |  142 ++
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorFunction.c            |   57 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotData.c                   |  268 ++++
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotFunction.c               |   58 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringData.c                    |   42 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringFunction.c                |   57 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayData.c          |   48 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayFunction.c      |   44 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceData.c                 |   63 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceFunction.c             |  475 ++++++
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressData.c     |   47 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressFunction.c |  150 ++
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityData.c             |   42 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityFunction.c         |   57 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceData.c                   |   46 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceFunction.c               |   39 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedData.c       |   47 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedFunction.c   |   57 +
>  Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.c                                             |  246 +++-
>  Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLibCommon.c                             |   84 ++
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni                      |   22 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnector.uni                  |   22 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlot.uni                     |   20 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemString.uni                      |   11 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDevice.uni                   |   16 +
>  Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtended.uni         |   10 +
>  35 files changed, 3005 insertions(+), 1141 deletions(-)
>  mode change 100644 => 100755 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorData.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorFunction.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotData.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotFunction.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringData.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringFunction.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayData.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayFunction.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceData.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceFunction.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressData.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressFunction.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityData.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityFunction.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceData.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceFunction.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedData.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedFunction.c
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnector.uni
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlot.uni
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemString.uni
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDevice.uni
>  create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtended.uni
>
> --
> 2.39.0
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [edk2-platforms][PATCH 0/4] Add support new SMBIOS Tables and refactor to adapt with ArmPkg/SMBIOS
  2023-06-02 12:48 ` [edk2-platforms][PATCH 0/4] Add support new SMBIOS Tables and refactor to adapt with ArmPkg/SMBIOS Ard Biesheuvel
@ 2023-06-06  6:11   ` Nhi Pham
  0 siblings, 0 replies; 7+ messages in thread
From: Nhi Pham @ 2023-06-06  6:11 UTC (permalink / raw)
  To: Ard Biesheuvel; +Cc: Minh Nguyen, devel, patches, quic_llindhol, nhi

Hi Ard,

The error is created by this commit 
https://github.com/tianocore/edk2/commit/e6447d2a08f5ca585816d093e79a01dad3781f98. 
We are investigating and will get back to you soon.

Thanks for merging our patches.

-Nhi

On 6/2/2023 7:48 PM, Ard Biesheuvel wrote:
> On Wed, 24 May 2023 at 02:41, Minh Nguyen
> <minhnguyen1@os.amperecomputing.com> wrote:
>> These patches helps to add new SMBIOS Tables (Type 16, 17, 19) and refactor SmbiosPlatformDxe.
>>
>> Minh Nguyen (4):
>>    JadePkg: Correct PCD names for SMBIOS Type 0
>>    JadePkg: Leverage ArmPkg/Smbios (Type 0, 1, 2, 3, 13, 32)
>>    JadePkg: Refactor SmbiosPlatformDxe
>>    JadePkg: Add support SMBIOS Table Type 16, 17, 19
>>
> Pushed as 38170a4175a6..6fe5a2309118
>
> I tried to do a build test of Jade.dsc but I got an error related to
> PcdValueInit. Any idea what is going on here?
>
>>   Silicon/Ampere/AmpereSiliconPkg/AmpereSiliconPkg.dec                                                |   14 +-
>>   Platform/Ampere/JadePkg/Jade.dsc                                                                    |    7 +-
>>   Platform/Ampere/JadePkg/Jade.fdf                                                                    |    1 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf                             |   43 +-
>>   Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.inf                                           |   15 +-
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h                               |  201 +++
>>   Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h                                        |   46 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.c                               | 1553 ++++++--------------
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c                      |   96 ++
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorData.c                |  142 ++
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorFunction.c            |   57 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotData.c                   |  268 ++++
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotFunction.c               |   58 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringData.c                    |   42 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringFunction.c                |   57 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayData.c          |   48 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayFunction.c      |   44 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceData.c                 |   63 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceFunction.c             |  475 ++++++
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressData.c     |   47 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressFunction.c |  150 ++
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityData.c             |   42 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityFunction.c         |   57 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceData.c                   |   46 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceFunction.c               |   39 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedData.c       |   47 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedFunction.c   |   57 +
>>   Platform/Ampere/JadePkg/Library/OemMiscLib/OemMiscLib.c                                             |  246 +++-
>>   Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLibCommon.c                             |   84 ++
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni                      |   22 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnector.uni                  |   22 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlot.uni                     |   20 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemString.uni                      |   11 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDevice.uni                   |   16 +
>>   Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtended.uni         |   10 +
>>   35 files changed, 3005 insertions(+), 1141 deletions(-)
>>   mode change 100644 => 100755 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxe.h
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeDataTable.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorData.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnectorFunction.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotData.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlotFunction.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringData.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemStringFunction.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayData.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type16/PlatformPhysicalMemoryArrayFunction.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceData.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDeviceFunction.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressData.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type19/PlatformMemoryArrayMappedAddressFunction.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityData.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type24/PlatformHardwareSecurityFunction.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceData.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type38/PlatformIpmiDeviceFunction.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedData.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtendedFunction.c
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/SmbiosPlatformDxeStrings.uni
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type08/PlatformPortConnector.uni
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type09/PlatformSystemSlot.uni
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type11/PlatformOemString.uni
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type17/PlatformMemoryDevice.uni
>>   create mode 100644 Platform/Ampere/JadePkg/Drivers/SmbiosPlatformDxe/Type41/PlatformOnboardDevicesExtended.uni
>>
>> --
>> 2.39.0
>>

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-06-06  6:11 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-24  0:40 [edk2-platforms][PATCH 0/4] Add support new SMBIOS Tables and refactor to adapt with ArmPkg/SMBIOS Minh Nguyen
2023-05-24  0:40 ` [edk2-platforms][PATCH 1/4] JadePkg: Correct PCD names for SMBIOS Type 0 Minh Nguyen
2023-05-24  0:40 ` [edk2-platforms][PATCH 2/4] JadePkg: Leverage ArmPkg/Smbios (Type 0, 1, 2, 3, 13, 32) Minh Nguyen
2023-05-24  0:40 ` [edk2-platforms][PATCH 3/4] JadePkg: Refactor SmbiosPlatformDxe Minh Nguyen
2023-05-24  0:40 ` [edk2-platforms][PATCH 4/4] JadePkg: Add support SMBIOS Table Type 16, 17, 19 Minh Nguyen
2023-06-02 12:48 ` [edk2-platforms][PATCH 0/4] Add support new SMBIOS Tables and refactor to adapt with ArmPkg/SMBIOS Ard Biesheuvel
2023-06-06  6:11   ` Nhi Pham

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox