[edk2-devel] [PATCH v3 3/3] ArmPkg: add Universal/Smbios as a generic SMBIOS library

Leif Lindholm leif at nuviainc.com
Thu Nov 19 12:58:27 UTC 2020


On Tue, Nov 10, 2020 at 17:17:48 -0700, Rebecca Cran wrote:
> Much of the data for the SMBIOS tables is generic, and need not be
> duplicated for each platform.
> 
> Adapt code from edk2-platforms/Silicon/HiSilicon/Drivers/Smbios and
> edk2-platforms/Silicon/HiSilicon/Drivers/VersionInfoPeim, making them
> generic, and place them into edk2/ArmPkg/Universal/Smbios and
> edk2/ArmPkg/Drivers/VersionInfoPeim respectively.
> 
> They depend on each platform implementing an OemMiscLib that provides
> OEM specific information such as CPU and cache information.
> 
> The VersionInfoPeim generates the release date from the build time, and
> fetches the version string from PcdFirmwareVersionString.
> 
> Signed-off-by: Rebecca Cran <rebecca at nuviainc.com>
> ---
>  ArmPkg/ArmPkg.dec                             |  16 +
>  .../VersionInfoPeim/VersionInfoPeim.inf       |  46 ++
>  .../ProcessorSubClassDxe.inf                  |  55 ++
>  .../Smbios/SmbiosMiscDxe/SmbiosMiscDxe.inf    |  89 +++
>  ArmPkg/Include/Chipset/AArch64.h              |   4 +
>  ArmPkg/Include/Guid/VersionInfoHobGuid.h      |  29 +
>  ArmPkg/Include/Library/ArmLib.h               |   6 +
>  ArmPkg/Include/Library/OemMiscLib.h           |  86 +++
>  ArmPkg/Library/ArmLib/AArch64/AArch64Lib.h    |   6 +
>  ArmPkg/Library/ArmLib/ArmLibPrivate.h         | 100 ++-
>  .../ProcessorSubClassDxe/ProcessorSubClass.h  |  34 +
>  .../Smbios/SmbiosMiscDxe/SmbiosMisc.h         | 217 ++++++
>  .../Drivers/VersionInfoPeim/VersionInfoPeim.c |  90 +++
>  ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c    |  15 +
>  ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c          |  17 +
>  .../ProcessorSubClassDxe/ProcessorSubClass.c  | 723 ++++++++++++++++++
>  .../SmbiosMiscDxe/SmbiosMiscDataTable.c       |  50 ++
>  .../SmbiosMiscDxe/SmbiosMiscEntryPoint.c      | 167 ++++
>  .../SmbiosMiscDxe/Type00/MiscBiosVendorData.c |  99 +++
>  .../Type00/MiscBiosVendorFunction.c           | 232 ++++++
>  .../Type01/MiscSystemManufacturerData.c       |  43 ++
>  .../Type01/MiscSystemManufacturerFunction.c   | 171 +++++
>  .../Type02/MiscBaseBoardManufacturerData.c    |  51 ++
>  .../MiscBaseBoardManufacturerFunction.c       | 184 +++++
>  .../Type03/MiscChassisManufacturerData.c      |  58 ++
>  .../Type03/MiscChassisManufacturerFunction.c  | 182 +++++
>  .../MiscNumberOfInstallableLanguagesData.c    |  39 +
>  ...MiscNumberOfInstallableLanguagesFunction.c | 154 ++++
>  .../Type32/MiscBootInformationData.c          |  41 +
>  .../Type32/MiscBootInformationFunction.c      |  66 ++
>  .../Library/ArmLib/AArch64/AArch64Support.S   |   3 +
>  .../Library/ArmLib/AArch64/ArmLibSupportV8.S  |   2 +-
>  ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.S   |   4 +
>  ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.asm |   6 +-
>  .../ProcessorSubClassStrings.uni              |  23 +
>  .../SmbiosMiscDxe/SmbiosMiscLibString.uni     |  21 +
>  .../SmbiosMiscDxe/Type00/MiscBiosVendor.uni   |  18 +
>  .../Type01/MiscSystemManufacturer.uni         |  21 +
>  .../Type02/MiscBaseBoardManufacturer.uni      |  21 +
>  .../Type03/MiscChassisManufacturer.uni        |  18 +
>  .../MiscNumberOfInstallableLanguages.uni      |  43 ++
>  41 files changed, 3213 insertions(+), 37 deletions(-)

Please use --stat=1000 --stat-graph-width=20 when generating
patches, to avoid above ellipses.

>  create mode 100644 ArmPkg/Drivers/VersionInfoPeim/VersionInfoPeim.inf
>  create mode 100644 ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscDxe.inf
>  create mode 100644 ArmPkg/Include/Guid/VersionInfoHobGuid.h
>  create mode 100644 ArmPkg/Include/Library/OemMiscLib.h
>  create mode 100644 ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClass.h
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMisc.h
>  create mode 100644 ArmPkg/Drivers/VersionInfoPeim/VersionInfoPeim.c
>  create mode 100644 ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClass.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscDataTable.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscEntryPoint.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type00/MiscBiosVendorData.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type00/MiscBiosVendorFunction.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type01/MiscSystemManufacturerData.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type01/MiscSystemManufacturerFunction.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturerData.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturerFunction.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerData.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguagesData.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguagesFunction.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type32/MiscBootInformationData.c
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type32/MiscBootInformationFunction.c
>  create mode 100644 ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassStrings.uni
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscLibString.uni
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type00/MiscBiosVendor.uni
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type01/MiscSystemManufacturer.uni
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturer.uni
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturer.uni
>  create mode 100644 ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguages.uni
> 
> diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec
> index eaf1072d9ef3..64cfb7dc65e3 100644
> --- a/ArmPkg/ArmPkg.dec
> +++ b/ArmPkg/ArmPkg.dec
> @@ -45,6 +45,8 @@ [Guids.common]
>    # Include/Guid/ArmMpCoreInfo.h
>    gArmMpCoreInfoGuid = { 0xa4ee0728, 0xe5d7, 0x4ac5,  {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }
>  
> +  gVersionInfoHobGuid = { 0xe13a14c, 0x859c, 0x4f22, {0x82, 0xbd, 0x18, 0xe, 0xe1, 0x42, 0x12, 0xbf } }

What version? FirmwareVersion? Would make sense to be explicit in the
name.

> +
>  [Protocols.common]
>    ## Arm System Control and Management Interface(SCMI) Base protocol
>    ## ArmPkg/Include/Protocol/ArmScmiBaseProtocol.h
> @@ -115,6 +117,20 @@ [PcdsFixedAtBuild.common]
>    # The Primary Core is ClusterId[0] & CoreId[0]
>    gArmTokenSpaceGuid.PcdArmPrimaryCore|0|UINT32|0x00000037
>  
> +  #
> +  # SMBIOS PCDs
> +  #
> +  gArmTokenSpaceGuid.PcdSystemProductName|L""|VOID*|0x30000053
> +  gArmTokenSpaceGuid.PcdSystemVersion|L""|VOID*|0x30000054
> +  gArmTokenSpaceGuid.PcdBaseBoardManufacturer|L""|VOID*|0x30000055
> +  gArmTokenSpaceGuid.PcdBaseBoardProductName|L""|VOID*|0x30000056
> +  gArmTokenSpaceGuid.PcdBaseBoardVersion|L""|VOID*|0x30000057
> +  gArmTokenSpaceGuid.PcdProcessorManufacturer|L""|VOID*|0x30000071
> +  gArmTokenSpaceGuid.PcdProcessorVersion|L""|VOID*|0x30000072
> +  gArmTokenSpaceGuid.PcdProcessorSerialNumber|L""|VOID*|0x30000073
> +  gArmTokenSpaceGuid.PcdProcessorAssetTag|L""|VOID*|0x30000074
> +  gArmTokenSpaceGuid.PcdProcessorPartNumber|L""|VOID*|0x30000075
> +
>    #
>    # ARM L2x0 PCDs
>    #
> diff --git a/ArmPkg/Drivers/VersionInfoPeim/VersionInfoPeim.inf b/ArmPkg/Drivers/VersionInfoPeim/VersionInfoPeim.inf
> new file mode 100644
> index 000000000000..c813dd84de4c
> --- /dev/null
> +++ b/ArmPkg/Drivers/VersionInfoPeim/VersionInfoPeim.inf
> @@ -0,0 +1,46 @@
> +#/** @file
> +#
> +#    Copyright (c) 2016, Hisilicon Limited. All rights reserved.
> +#    Copyright (c) 2016, Linaro Limited. All rights reserved.
> +#
> +#    SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#**/
> +
> +[Defines]
> +  INF_VERSION                    = 1.29
> +  BASE_NAME                      = VersionInfoPeim
> +  FILE_GUID                      = 3d45d0a0-4ded-4c01-b16f-2b3007c1fbe2
> +  MODULE_TYPE                    = PEIM
> +  VERSION_STRING                 = 1.0
> +  ENTRY_POINT                    = VersionInfoEntry
> +
> +[Sources.common]
> +  VersionInfoPeim.c
> +
> +[Packages]
> +  ArmPkg/ArmPkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  MdePkg/MdePkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  DebugLib
> +  HobLib
> +  PcdLib
> +  PeimEntryPoint
> +  PrintLib
> +  SerialPortLib
> +
> +[Pcd]
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString
> +
> +[Guids]
> +  gVersionInfoHobGuid
> +
> +[Depex]
> +  TRUE
> +
> +[BuildOptions]
> +
> diff --git a/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
> new file mode 100644
> index 000000000000..715f66912983
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
> @@ -0,0 +1,55 @@
> +#/** @file
> +#
> +#    Copyright (c) 2015, Hisilicon Limited. All rights reserved.
> +#    Copyright (c) 2015, Linaro Limited. All rights reserved.
> +#
> +#    SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#**/
> +
> +
> +[Defines]
> +  INF_VERSION                    = 1.29
> +  BASE_NAME                      = ProcessorSubClass
> +  FILE_GUID                      = f3fe0e33-ea38-4069-9fb5-be23407207c7
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  ENTRY_POINT                    = ProcessorSubClassEntryPoint
> +
> +[Sources]
> +  ProcessorSubClass.c
> +  ProcessorSubClassStrings.uni
> +
> +[Packages]
> +  ArmPkg/ArmPkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  MdePkg/MdePkg.dec
> +
> +[LibraryClasses]
> +  ArmSmcLib
> +  BaseLib
> +  BaseMemoryLib
> +  DebugLib
> +  HiiLib
> +  IoLib
> +  MemoryAllocationLib
> +  OemMiscLib
> +  PcdLib
> +  PrintLib
> +  UefiDriverEntryPoint
> +
> +[Protocols]
> +  gEfiSmbiosProtocolGuid                       # PROTOCOL ALWAYS_CONSUMED
> +
> +[Pcd]
> +  gArmTokenSpaceGuid.PcdProcessorManufacturer
> +  gArmTokenSpaceGuid.PcdProcessorVersion
> +  gArmTokenSpaceGuid.PcdProcessorSerialNumber
> +  gArmTokenSpaceGuid.PcdProcessorAssetTag
> +  gArmTokenSpaceGuid.PcdProcessorPartNumber
> +
> +[Guids]
> +
> +
> +[Depex]
> +  gEfiSmbiosProtocolGuid
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscDxe.inf b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscDxe.inf
> new file mode 100644
> index 000000000000..1954f7207267
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscDxe.inf
> @@ -0,0 +1,89 @@
> +## @file
> +# Component description file for SmbiosMisc instance.
> +#
> +# Parses the MiscSubclassDataTable and reports any generated data to the DataHub.
> +#  All .uni file who tagged with "ToolCode="DUMMY"" in following file list is included by
> +#  MiscSubclassDriver.uni file, the StrGather tool will expand MiscSubclassDriver.uni file
> +#  and parse all .uni file.
> +# 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
> +#
> +#
> +# Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +##
> +
> +
> +[Defines]
> +  INF_VERSION                    = 1.29
> +  BASE_NAME                      = SmbiosMiscDxe

Proper capitalisation is SmBios. Please get rid of any occurrences of
Smbios in the patch, including file names. (sorry)

> +  FILE_GUID                      = 7e5e26d4-0be9-401f-b5e1-1c2bda7ca777
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  ENTRY_POINT                    = SmbiosMiscEntryPoint
> +
> +[Sources]
> +  SmbiosMisc.h
> +  SmbiosMiscDataTable.c
> +  SmbiosMiscEntryPoint.c
> +  SmbiosMiscLibString.uni
> +  Type00/MiscBiosVendorData.c
> +  Type00/MiscBiosVendorFunction.c
> +  Type01/MiscSystemManufacturerData.c
> +  Type01/MiscSystemManufacturerFunction.c
> +  Type02/MiscBaseBoardManufacturerData.c
> +  Type02/MiscBaseBoardManufacturerFunction.c
> +  Type03/MiscChassisManufacturerData.c
> +  Type03/MiscChassisManufacturerFunction.c
> +  Type13/MiscNumberOfInstallableLanguagesData.c
> +  Type13/MiscNumberOfInstallableLanguagesFunction.c
> +  Type32/MiscBootInformationData.c
> +  Type32/MiscBootInformationFunction.c
> +
> +[Packages]
> +  ArmPkg/ArmPkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  MdePkg/MdePkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  DebugLib
> +  DevicePathLib
> +  PcdLib
> +  HiiLib
> +  HobLib
> +  MemoryAllocationLib
> +  OemMiscLib
> +  UefiBootServicesTableLib
> +  UefiDriverEntryPoint
> +  UefiLib
> +  UefiRuntimeServicesTableLib
> +
> +[Protocols]
> +  gEfiSmbiosProtocolGuid                       # PROTOCOL ALWAYS_CONSUMED
> +
> +[Pcd]
> +  gArmTokenSpaceGuid.PcdFdSize
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareReleaseDateString
> +  gArmTokenSpaceGuid.PcdSystemProductName
> +  gArmTokenSpaceGuid.PcdSystemVersion
> +  gArmTokenSpaceGuid.PcdBaseBoardManufacturer
> +  gArmTokenSpaceGuid.PcdBaseBoardProductName
> +  gArmTokenSpaceGuid.PcdBaseBoardVersion
> +  gArmTokenSpaceGuid.PcdFdBaseAddress
> +
> +  gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultPlatformLang
> +
> +[Guids]
> +  gEfiGenericVariableGuid
> +  gVersionInfoHobGuid
> +
> +[Depex]
> +  gEfiSmbiosProtocolGuid
> +
> +
> diff --git a/ArmPkg/Include/Chipset/AArch64.h b/ArmPkg/Include/Chipset/AArch64.h
> index 0ade5cce91c3..7c2b592f92ee 100644
> --- a/ArmPkg/Include/Chipset/AArch64.h
> +++ b/ArmPkg/Include/Chipset/AArch64.h
> @@ -112,6 +112,10 @@
>  #define ARM_VECTOR_LOW_A32_FIQ  0x700
>  #define ARM_VECTOR_LOW_A32_SERR 0x780
>  
> +// The ID_AA64MMFR2_EL1 register was added in ARMv8.2. Since we
> +// build for ARMv8.0, we need to define the register here.
> +#define ID_AA64MMFR2_EL1 S3_0_C0_C7_2
> +
>  #define VECTOR_BASE(tbl)          \
>    .section .text.##tbl##,"ax";    \
>    .align 11;                      \
> diff --git a/ArmPkg/Include/Guid/VersionInfoHobGuid.h b/ArmPkg/Include/Guid/VersionInfoHobGuid.h
> new file mode 100644
> index 000000000000..9eeb0a5f7482
> --- /dev/null
> +++ b/ArmPkg/Include/Guid/VersionInfoHobGuid.h
> @@ -0,0 +1,29 @@
> +/** @file
> +*
> +*  Copyright (c) 2016, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2016, Linaro Limited. All rights reserved.
> +*
> +*  SPDX-License-Identifier: BSD-2-Clause-Patent
> +*
> +**/
> +
> +#ifndef _VERSION_INFO_HOB_GUID_H_
> +#define _VERSION_INFO_HOB_GUID_H_

No leading _ in macros.

> +
> +// {0E13A14C-859C-4f22-82BD-180EE14212BF}
> +#define VERSION_INFO_HOB_GUID \
> +  {0xe13a14c, 0x859c, 0x4f22, {0x82, 0xbd, 0x18, 0xe, 0xe1, 0x42, 0x12, 0xbf}}
> +
> +extern GUID gVersionInfoHobGuid;
> +
> +#pragma pack(1)
> +
> +typedef struct {
> +  EFI_TIME BuildTime;
> +  CHAR16   String[1];
> +} VERSION_INFO;
> +
> +#pragma pack()
> +
> +#endif
> +
> diff --git a/ArmPkg/Include/Library/ArmLib.h b/ArmPkg/Include/Library/ArmLib.h
> index 5a27b7c2fc27..4a740b6ca298 100644
> --- a/ArmPkg/Include/Library/ArmLib.h
> +++ b/ArmPkg/Include/Library/ArmLib.h
> @@ -132,6 +132,12 @@ ArmIsArchTimerImplemented (
>    VOID
>    );
>  
> +UINTN
> +EFIAPI
> +ArmIsCcidxImplemented (
> +  VOID
> +  );
> +
>  UINTN
>  EFIAPI
>  ArmReadIdPfr0 (
> diff --git a/ArmPkg/Include/Library/OemMiscLib.h b/ArmPkg/Include/Library/OemMiscLib.h
> new file mode 100644
> index 000000000000..78dc70426e24
> --- /dev/null
> +++ b/ArmPkg/Include/Library/OemMiscLib.h
> @@ -0,0 +1,86 @@
> +/** @file
> +*
> +*  Copyright (c) 2015, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2015, Linaro Limited. All rights reserved.
> +*
> +*  SPDX-License-Identifier: BSD-2-Clause-Patent
> +*
> +**/
> +
> +
> +#ifndef OEM_MISC_LIB_H
> +#define OEM_MISC_LIB_H
> +
> +#include <Uefi.h>
> +#include <IndustryStandard/SmBios.h>
> +
> +typedef enum
> +{
> +  CPU_CACHE_L1 = 0,
> +  CPU_CACHE_L2,
> +  CPU_CACHE_L3,
> +  CPU_CACHE_L4,
> +  CPU_CACHE_L5,
> +  CPU_CACHE_L6,
> +  CPU_CACHE_L7
> +} CPU_CACHE_LEVEL;
> +
> +typedef struct
> +{
> +  UINT8 Voltage;
> +  UINT16 CurrentSpeed;
> +  UINT16 MaxSpeed;
> +  UINT16 ExternalClock;
> +  UINT16 CoreCount;
> +  UINT16 CoresEnabled;
> +  UINT16 ThreadCount;
> +} MISC_PROCESSOR_DATA;
> +
> +typedef enum {
> +    ProductNameType01,
> +    SerialNumType01,
> +    UuidType01,
> +    SystemManufacturerType01,
> +    AssertTagType02,
> +    SrNumType02,
> +    BoardManufacturerType02,
> +    AssetTagType03,
> +    SrNumType03,
> +    VersionType03,
> +    ChassisTypeType03 ,
> +    ManufacturerType03,
> +} GET_INFO_BMC_OFFSET;
> +
> +UINTN OemGetCpuFreq (UINT8 Socket);
> +
> +BOOLEAN
> +OemGetProcessorInformation (
> +  IN UINTN ProcessorNumber,
> +  IN OUT PROCESSOR_STATUS_DATA *ProcessorStatus,
> +  IN OUT PROCESSOR_CHARACTERISTIC_FLAGS *ProcessorCharacteristics,
> +  IN OUT MISC_PROCESSOR_DATA *MiscProcessorData
> +  );
> +
> +BOOLEAN OemGetCacheInformation (
> +  IN UINT8 CacheLevel,
> +  IN OUT SMBIOS_TABLE_TYPE7 *SmbiosCacheTable
> +  );
> +
> +UINT8 OemGetProcessorMaxSockets (VOID);
> +
> +UINTN PlatformGetCpuFreq (IN UINT8 Socket);

Where is this function defined?

> +
> +UINTN PlatformGetCoreCount (VOID);
> +
> +EFI_STATUS OemGetChassisType(OUT UINT8 *ChassisType);
> +
> +BOOLEAN OemIsSocketPresent (UINTN Socket);
> +
> +VOID
> +UpdateSmbiosInfo (
> +  IN EFI_HII_HANDLE mHiiHandle,
> +  IN EFI_STRING_ID TokenToUpdate,
> +  IN UINT8 Offset
> +  );
> +
> +#endif // OEM_MISC_LIB_H
> diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.h b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.h
> index b2c8a8ea0b84..d6bcfc3b82ae 100644
> --- a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.h
> +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.h
> @@ -35,5 +35,11 @@ ArmCleanInvalidateDataCacheEntryBySetWay (
>    IN  UINTN   SetWayFormat
>    );
>  
> +UINTN
> +EFIAPI
> +ArmReadIdMmfr2 (
> +  VOID
> +  );
> +
>  #endif // __AARCH64_LIB_H__
>  
> diff --git a/ArmPkg/Library/ArmLib/ArmLibPrivate.h b/ArmPkg/Library/ArmLib/ArmLibPrivate.h
> index 2e90739eb858..d57c80edb572 100644
> --- a/ArmPkg/Library/ArmLib/ArmLibPrivate.h
> +++ b/ArmPkg/Library/ArmLib/ArmLibPrivate.h

Changes to this file in general seem to be removing unused(?) existing
cache-related macros and adding (architectural) special
purposeregister descriptions as replacements. This feels like two
separate changes (and hence patches).

> @@ -9,46 +9,76 @@
>  #ifndef __ARM_LIB_PRIVATE_H__
>  #define __ARM_LIB_PRIVATE_H__
>  
> -#define CACHE_SIZE_4_KB             (3UL)
> -#define CACHE_SIZE_8_KB             (4UL)
> -#define CACHE_SIZE_16_KB            (5UL)
> -#define CACHE_SIZE_32_KB            (6UL)
> -#define CACHE_SIZE_64_KB            (7UL)
> -#define CACHE_SIZE_128_KB           (8UL)
> +typedef union {
> +  struct {
> +    UINT32    InD           :1;
> +    UINT32    Level         :3;
> +    UINT32    TnD           :1;
> +    UINT32    Reserved      :27;
> +  } Bits;
> +  UINT32 Data;
> +} CSSELR_DATA;
>  
> -#define CACHE_ASSOCIATIVITY_DIRECT  (0UL)
> -#define CACHE_ASSOCIATIVITY_4_WAY   (2UL)
> -#define CACHE_ASSOCIATIVITY_8_WAY   (3UL)
> +typedef enum
> +{
> +  CSSELR_CACHE_TYPE_DATA_OR_UNIFIED = 0,
> +  CSSELR_CACHE_TYPE_INSTRUCTION = 1
> +} CSSELR_CACHE_TYPE;
>  
> -#define CACHE_PRESENT               (0UL)
> -#define CACHE_NOT_PRESENT           (1UL)
> +typedef union {
> +  struct {
> +    UINT64    LineSize           :3;
> +    UINT64    Associativity      :10;
> +    UINT64    NumSets            :15;
> +    UINT64    Unknown            :4;
> +    UINT64    Reserved           :32;
> +  } BitsNonCcidx;
> +  struct {
> +    UINT64    LineSize           :3;
> +    UINT64    Associativity      :21;
> +    UINT64    Reserved1          :8;
> +    UINT64    NumSets            :24;
> +    UINT64    Reserved2          :8;
> +  } BitsCcidx;
> +  UINT64 Data;
> +} CCSIDR_DATA;
>  
> -#define CACHE_LINE_LENGTH_32_BYTES  (2UL)
> +typedef union {
> +  struct {
> +    UINT32 NumSets               :24;
> +    UINT32 Reserved              :8;
> +  } Bits;
> +  UINT32 Data;
> +} CSSIDR2_DATA;
>  
> -#define SIZE_FIELD_TO_CACHE_SIZE(x)           (((x) >> 6) & 0x0F)
> -#define SIZE_FIELD_TO_CACHE_ASSOCIATIVITY(x)  (((x) >> 3) & 0x07)
> -#define SIZE_FIELD_TO_CACHE_PRESENCE(x)       (((x) >> 2) & 0x01)
> -#define SIZE_FIELD_TO_CACHE_LINE_LENGTH(x)    (((x) >> 0) & 0x03)
> +// The lower 32 bits are the same for both AARCH32 and AARCH64
> +// so we can use the same structure for both.
> +typedef union {
> +  struct {
> +    UINT32    Ctype1   : 3;
> +    UINT32    Ctype2   : 3;
> +    UINT32    Ctype3   : 3;
> +    UINT32    Ctype4   : 3;
> +    UINT32    Ctype5   : 3;
> +    UINT32    Ctype6   : 3;
> +    UINT32    Ctype7   : 3;
> +    UINT32    LoUIS    : 3;
> +    UINT32    LoC      : 3;
> +    UINT32    LoUU     : 3;
> +    UINT32    Icb      : 3;
> +  } Bits;
> +  UINT32 Data;
> +} CLIDR_DATA;
>  
> -#define DATA_CACHE_SIZE_FIELD(x)              (((x) >> 12) & 0x0FFF)
> -#define INSTRUCTION_CACHE_SIZE_FIELD(x)       (((x) >>  0) & 0x0FFF)
> +typedef enum {
> +  CLIDR_CACHE_TYPE_NONE = 0,
> +  CLIDR_CACHE_TYPE_INSTRUCTION_ONLY = 1,
> +  CLIDR_CACHE_TYPE_DATA_ONLY = 2,
> +  CLIDR_CACHE_TYPE_SEPARATE = 3,
> +  CLIDR_CACHE_TYPE_UNIFIED = 4
> +} CLIDR_CACHE_TYPE;
>  
> -#define DATA_CACHE_SIZE(x)                    (SIZE_FIELD_TO_CACHE_SIZE(DATA_CACHE_SIZE_FIELD(x)))
> -#define DATA_CACHE_ASSOCIATIVITY(x)           (SIZE_FIELD_TO_CACHE_ASSOCIATIVITY(DATA_CACHE_SIZE_FIELD(x)))
> -#define DATA_CACHE_PRESENT(x)                 (SIZE_FIELD_TO_CACHE_PRESENCE(DATA_CACHE_SIZE_FIELD(x)))
> -#define DATA_CACHE_LINE_LENGTH(x)             (SIZE_FIELD_TO_CACHE_LINE_LENGTH(DATA_CACHE_SIZE_FIELD(x)))
> -
> -#define INSTRUCTION_CACHE_SIZE(x)             (SIZE_FIELD_TO_CACHE_SIZE(INSTRUCTION_CACHE_SIZE_FIELD(x)))
> -#define INSTRUCTION_CACHE_ASSOCIATIVITY(x)    (SIZE_FIELD_TO_CACHE_ASSOCIATIVITY(INSTRUCTION_CACHE_SIZE_FIELD(x)))
> -#define INSTRUCTION_CACHE_PRESENT(x)          (SIZE_FIELD_TO_CACHE_PRESENCE(INSTRUCTION_CACHE_SIZE_FIELD(x)))
> -#define INSTRUCTION_CACHE_LINE_LENGTH(x)      (SIZE_FIELD_TO_CACHE_LINE_LENGTH(INSTRUCTION_CACHE_SIZE_FIELD(x)))
> -
> -#define CACHE_TYPE(x)                         (((x) >> 25) & 0x0F)
> -#define CACHE_TYPE_WRITE_BACK                 (0x0EUL)
> -
> -#define CACHE_ARCHITECTURE(x)                 (((x) >> 24) & 0x01)
> -#define CACHE_ARCHITECTURE_UNIFIED            (0UL)
> -#define CACHE_ARCHITECTURE_SEPARATE           (1UL)
> +#define CLIDR_GET_CACHE_TYPE(x, level) ((x >> (3 * level)) & 0b111)
>  
>  VOID
>  CPSRMaskInsert (
> @@ -61,7 +91,7 @@ CPSRRead (
>    VOID
>    );
>  
> -UINT32
> +UINTN
>  ReadCCSIDR (
>    IN UINT32 CSSELR
>    );
> diff --git a/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClass.h b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClass.h
> new file mode 100644
> index 000000000000..a8a4ab2b1beb
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClass.h
> @@ -0,0 +1,34 @@
> +/** @file
> +*
> +*  Copyright (c) 2015, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2015, Linaro Limited. All rights reserved.
> +*
> +*  SPDX-License-Identifier: BSD-2-Clause-Patent
> +*
> +**/
> +
> +#ifndef PROCESSOR_SUBCLASS_DRIVER_H
> +#define PROCESSOR_SUBCLASS_DRIVER_H
> +
> +#include <Uefi.h>
> +#include <Protocol/Smbios.h>
> +#include <IndustryStandard/ArmStdSmc.h>
> +#include <IndustryStandard/SmBios.h>
> +#include <Library/ArmLib.h>
> +#include <Library/ArmSmcLib.h>
> +#include <Library/ArmLib/ArmLibPrivate.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/HiiLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/OemMiscLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/PrintLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiLib.h>
> +
> +extern UINT8 ProcessorSubClassStrings[];
> +
> +#endif // PROCESSOR_SUBCLASS_DRIVER_H
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMisc.h b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMisc.h
> new file mode 100644
> index 000000000000..80c77517fabc
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMisc.h
> @@ -0,0 +1,217 @@
> +/**@file
> +
> +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
> +
> +Module Name:
> +
> +  SmbiosMisc.h
> +
> +Abstract:
> +
> +  Header file for the SmbiosMisc Driver.
> +
> +Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +**/
> +
> +#ifndef SMBIOS_MISC_DRIVER_H
> +#define SMBIOS_MISC_DRIVER_H
> +
> +#include <Protocol/Smbios.h>
> +#include <IndustryStandard/SmBios.h>
> +#include <Library/HiiLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/BaseLib.h>
> +#include <Library/UefiLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>
> +#include <Guid/DebugMask.h>
> +#include <Library/OemMiscLib.h>
> +
> +#include <Library/PrintLib.h>
> +
> +//
> +// Data table entry update function.
> +//
> +typedef EFI_STATUS (EFIAPI EFI_MISC_SMBIOS_DATA_FUNCTION) (
> +  IN  VOID                 *RecordData,
> +  IN  EFI_SMBIOS_PROTOCOL  *Smbios
> +  );
> +
> +
> +//
> +// Data table entry definition.
> +//
> +typedef struct {
> +  //
> +  // intermediate input data for SMBIOS record
> +  //
> +  VOID                              *RecordData;
> +  EFI_MISC_SMBIOS_DATA_FUNCTION     *Function;
> +} EFI_MISC_SMBIOS_DATA_TABLE;
> +
> +
> +//
> +// Data Table extern definitions.
> +//
> +#define MISC_SMBIOS_TABLE_EXTERNS(NAME1, NAME2, NAME3) \
> +extern NAME1 NAME2 ## Data; \
> +extern EFI_MISC_SMBIOS_DATA_FUNCTION NAME3 ## Function;
> +
> +
> +//
> +// Data Table entries
> +//
> +
> +#define MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION(NAME1, NAME2) \
> +{ \
> +  & NAME1 ## Data, \

Eew.
This is quite possibly very useful, but that '&' made me swear out
loud. Add a comment describing how this is used further down?

> +    NAME2 ## Function \
> +}
> +
> +
> +//
> +// Global definition macros.
> +//
> +#define MISC_SMBIOS_TABLE_DATA(NAME1, NAME2) \
> +  NAME1 NAME2 ## Data
> +
> +#define MISC_SMBIOS_TABLE_FUNCTION(NAME2) \
> +  EFI_STATUS EFIAPI NAME2 ## Function( \
> +  IN  VOID                  *RecordData, \
> +  IN  EFI_SMBIOS_PROTOCOL   *Smbios \
> +  )
> +
> +//
> +// Data Table Array Entries
> +//
> +extern EFI_HII_HANDLE               mHiiHandle;
> +
> +typedef struct _EFI_TYPE11_OEM_STRING{
> +  UINT8                               Offset;
> +  EFI_STRING_ID                       RefOemDefineString;
> +} EFI_TYPE11_OEM_STRING;
> +
> +typedef struct _EFI_TYPE12_SYSTEM_CONFIGURATION_OPTIONS_STRING{
> +  UINT8                               Offset;
> +  EFI_STRING_ID                       RefType12SystemConfigurationOptionsString;
> +} EFI_TYPE12_SYSTEM_CONFIGURATION_OPTIONS_STRING;
> +
> +typedef struct _EFI_TYPE13_BIOS_LANGUAGE_INFORMATION_STRING{
> +  UINT8                               *LanguageSignature;
> +  EFI_STRING_ID                       InstallableLanguageLongString;
> +  EFI_STRING_ID                       InstallableLanguageAbbreviateString;
> +} EFI_TYPE13_BIOS_LANGUAGE_INFORMATION_STRING;
> +
> +typedef struct _EFI_TYPE40_ADDITIONAL_INFORMATION_ENTRY{
> +  UINT8           RefType;
> +  UINT8           RefOffset;
> +  EFI_STRING_ID   RefString;
> +  UINT8           Value;
> +} EFI_TYPE40_ADDITIONAL_INFORMATION_ENTRY;
> +
> +typedef enum {
> +  STRING,
> +  DATA,
> +} OEM_DEFINE_TYPE;
> +
> +typedef struct {
> +  OEM_DEFINE_TYPE                Type;
> +  UINTN                          Token;
> +  UINTN                          DataSize;
> +} OEM_DEFINE_INFO_STRING;
> +
> +typedef struct {
> +  OEM_DEFINE_TYPE                Type;
> +  UINTN                          DataAddress;
> +  UINTN                          DataSize;
> +} OEM_DEFINE_INFO_DATA;
> +
> +typedef union {
> +  OEM_DEFINE_INFO_STRING         DefineString;
> +  OEM_DEFINE_INFO_DATA           DefineData;
> +} EFI_OEM_DEFINE_ARRAY;
> +
> +typedef struct _DMI_STRING_STRUCTURE {
> +  UINT8                                 Type;
> +  UINT8                                 Offset;
> +  UINT8                                 Valid;
> +  UINT16                                Length;
> +  UINT8                                 String[1]; // Variable length field
> +} DMI_STRING_STRUCTURE;
> +
> +typedef struct {
> +  UINT8                                 Type;           // The SMBIOS structure type
> +  UINT8                                 FixedOffset;    // The offset of the string reference
> +                                                        // within the structure's fixed data.
> +} DMI_UPDATABLE_STRING;
> +
> +EFI_STATUS
> +FindString (
> +  IN UINT8                              Type,
> +  IN UINT8                              Offset,
> +  IN EFI_STRING_ID                      TokenToUpdate
> +);
> +
> +EFI_STATUS
> +FindUuid (
> +  EFI_GUID                    *Uuid
> +);
> +
> +EFI_STATUS
> +StringToBiosVeriosn (
> +  IN  EFI_STRING_ID                     BiosVersionToken,
> +  OUT UINT8                             *MajorVersion,
> +  OUT UINT8                             *MinorVersion
> +);
> +
> +
> +/**
> + Logs SMBIOS record.
> +
> + @param [in]   Buffer         Pointer to the data buffer.
> + @param [in]   SmbiosHandle   Pointer for retrieve handle.
> +
> +**/
> +EFI_STATUS
> +LogSmbiosData (
> +  IN       UINT8                      *Buffer,
> +  IN  OUT  EFI_SMBIOS_HANDLE          *SmbiosHandle
> +  );
> +
> +/**
> + Get Link Type Handle.
> +
> + @param [in]   SmbiosType     Get this Type from SMBIOS table
> + @param [out]  HandleArray    Pointer to Hadndler array with has been free by caller
> + @param [out]  HandleCount    Pointer to Hadndler Counter
> +
> +**/
> +VOID
> +GetLinkTypeHandle(
> +  IN  UINT8                 SmbiosType,
> +  OUT UINT16                **HandleArray,
> +  OUT UINTN                 *HandleCount
> +  );
> +
> +//
> +// Data Table Array
> +//
> +extern EFI_MISC_SMBIOS_DATA_TABLE   mSmbiosMiscDataTable[];
> +
> +//
> +// Data Table Array Entries
> +//
> +extern UINTN                        mSmbiosMiscDataTableEntries;
> +
> +extern UINT8                        SmbiosMiscDxeStrings[];

Should also have m-prefix?

> +
> +
> +
> +#endif // SMBIOS_MISC_DRIVER_H
> diff --git a/ArmPkg/Drivers/VersionInfoPeim/VersionInfoPeim.c b/ArmPkg/Drivers/VersionInfoPeim/VersionInfoPeim.c
> new file mode 100644
> index 000000000000..5b5dc47e7ea9
> --- /dev/null
> +++ b/ArmPkg/Drivers/VersionInfoPeim/VersionInfoPeim.c
> @@ -0,0 +1,90 @@
> +/** @file
> +*
> +*  Copyright (c) 2016, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2016, Linaro Limited. All rights reserved.
> +*
> +*  SPDX-License-Identifier: BSD-2-Clause-Patent
> +*
> +**/
> +
> +#include <Uefi.h>
> +#include <PiPei.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/HobLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/PrintLib.h>
> +#include <Library/SerialPortLib.h>
> +
> +#include <Guid/VersionInfoHobGuid.h>
> +
> +struct MonthDescription {
> +  CONST CHAR8* MonthStr;
> +  UINT32    MonthInt;
> +} gMonthDescription[] = {

Not used in any other file - use m prefix over g?

> +  { "Jan", 1 },
> +  { "Feb", 2 },
> +  { "Mar", 3 },
> +  { "Apr", 4 },
> +  { "May", 5 },
> +  { "Jun", 6 },
> +  { "Jul", 7 },
> +  { "Aug", 8 },
> +  { "Sep", 9 },
> +  { "Oct", 10 },
> +  { "Nov", 11 },
> +  { "Dec", 12 },
> +  { "???", 1 },  // Use 1 as default month
> +};
> +
> +VOID GetReleaseTime (EFI_TIME *Time)
> +{
> +  CONST CHAR8      *ReleaseDate = __DATE__;
> +  CONST CHAR8      *ReleaseTime = __TIME__;
> +  UINTN            i;
> +
> +  for (i = 0;i < 12;i++) {
> +    if (AsciiStrnCmp (ReleaseDate, gMonthDescription[i].MonthStr, 3) == 0) {
> +      break;
> +    }
> +  }
> +
> +  Time->Month = gMonthDescription[i].MonthInt;
> +  Time->Day = AsciiStrDecimalToUintn(ReleaseDate+4);
> +  Time->Year = AsciiStrDecimalToUintn(ReleaseDate+7);
> +  Time->Hour = AsciiStrDecimalToUintn(ReleaseTime);
> +  Time->Minute = AsciiStrDecimalToUintn(ReleaseTime+3);
> +  Time->Second = AsciiStrDecimalToUintn(ReleaseTime+6);
> +
> +  return;
> +}
> +
> +EFI_STATUS
> +EFIAPI
> +VersionInfoEntry (
> +  IN       EFI_PEI_FILE_HANDLE  FileHandle,
> +  IN CONST EFI_PEI_SERVICES     **PeiServices
> +  )
> +{
> +  VERSION_INFO *VersionInfo;
> +  EFI_TIME Time = {0};
> +  CONST CHAR16 *ReleaseString =
> +    (CHAR16 *) FixedPcdGetPtr (PcdFirmwareVersionString);

No space after cast.

> +
> +  GetReleaseTime (&Time);
> +
> +  VersionInfo = BuildGuidHob (&gVersionInfoHobGuid,
> +                      sizeof (VERSION_INFO) -
> +                      sizeof (VersionInfo->String) +
> +                      StrSize (ReleaseString));

Indentation looks wrong.

> +  if (VersionInfo == NULL) {
> +    DEBUG ((DEBUG_ERROR, "[%a]:[%d] Build HOB failed!\n", __FILE__, __LINE__));
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  CopyMem (&VersionInfo->BuildTime, &Time, sizeof (EFI_TIME));
> +  CopyMem (VersionInfo->String, ReleaseString, StrSize (ReleaseString));
> +
> +  return EFI_SUCCESS;
> +}
> diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c
> index 3fbd591192e2..134fe56cb387 100644
> --- a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c
> +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c
> @@ -71,3 +71,18 @@ ArmCleanDataCache (
>    ArmDataSynchronizationBarrier ();
>    AArch64DataCacheOperation (ArmCleanDataCacheEntryBySetWay);
>  }
> +
> +UINTN
> +EFIAPI
> +ArmIsCcidxImplemented (
> +  VOID
> +  )
> +{
> +  UINTN Mmfr2;
> +
> +  Mmfr2 = ArmReadIdMmfr2 ();
> +  if (((Mmfr2 >> 20) & 0xF) == 1)
> +    return 1;
> +
> +  return 0;
> +}
> diff --git a/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c b/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c
> index 2c4a23e1a1b2..4466e39dcc28 100644
> --- a/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c
> +++ b/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c
> @@ -71,3 +71,20 @@ ArmCleanDataCache (
>    ArmDataSynchronizationBarrier ();
>    ArmV7DataCacheOperation (ArmCleanDataCacheEntryBySetWay);
>  }
> +
> +UINTN
> +EFIAPI
> +ArmIsCcidxImplemented (
> +  VOID
> +  )
> +{
> +  UINTN Mmfr4;
> +  
> +  Mmfr4 = ArmReadIdMmfr4 ();
> +  if (((Mmfr4 >> 24) & 0xF) == 1) {
> +    return 1;
> +  }
> +
> +  return 0;
> +}
> +
> diff --git a/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClass.c b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClass.c
> new file mode 100644
> index 000000000000..2b29945ce966
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClass.c
> @@ -0,0 +1,723 @@
> +/** @file
> +*
> +*  Copyright (c) 2020, NUVIA Inc. All rights reserved.
> +*  Copyright (c) 2015, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2015, Linaro Limited. All rights reserved.
> +*
> +*  SPDX-License-Identifier: BSD-2-Clause-Patent
> +*
> +**/
> +
> +#include "ProcessorSubClass.h"
> +
> +EFI_HII_HANDLE                  mHiiHandle;
> +
> +EFI_SMBIOS_PROTOCOL             *mSmbios;
> +
> +SMBIOS_TABLE_TYPE4   mSmbiosProcessorTable[] = {
> +  //CPU0
> +  {
> +    {                                               //Header
> +      EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION,          //Type
> +      sizeof (SMBIOS_TABLE_TYPE4),                    //Length
> +      0                                               //Handle
> +    },
> +    1,                                              //Socket
> +    CentralProcessor,                               //ProcessorType
> +    ProcessorFamilyIndicatorFamily2,                //ProcessorFamily
> +    2,                                              //ProcessorManufacture
> +    {                                               //ProcessorId
> +      {                                               //Signature
> +        0
> +      },
> +      {                                               //FeatureFlags
> +        0
> +      }
> +    },
> +    3,                                              //ProcessorVersion
> +    {                                               //Voltage
> +      0
> +    },
> +    0,                                              //ExternalClock
> +    0,                                              //MaxSpeed
> +    0,                                              //CurrentSpeed
> +    0,                                              //Status
> +    ProcessorUpgradeUnknown,                        //ProcessorUpgrade
> +    0xFFFF,                                         //L1CacheHandle
> +    0xFFFF,                                         //L2CacheHandle
> +    0xFFFF,                                         //L3CacheHandle
> +    4,                                              //SerialNumber
> +    5,                                              //AssetTag
> +    6,                                              //PartNumber
> +    0,                                              //CoreCount
> +    0,                                              //EnabledCoreCount
> +    0,                                              //ThreadCount
> +    0,                                              //ProcessorCharacteristics
> +    ProcessorFamilyARM,                             //ProcessorFamily2
> +    0,                                              //CoreCount2
> +    0,                                              //EnabledCoreCount2
> +    0                                               //ThreadCount2
> +  },
> +
> +  //CPU1
> +  {
> +    {                                               //Header
> +      EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION,          //Type
> +      sizeof (SMBIOS_TABLE_TYPE4),                    //Length
> +      0                                               //Handle
> +    },
> +    1,                                              //Socket
> +    CentralProcessor,                               //ProcessorType
> +    ProcessorFamilyIndicatorFamily2,                //ProcessorFamily
> +    2,                                              //ProcessorManufacture
> +    {                                               //ProcessorId
> +      {                                               //Signature
> +        0
> +      },
> +      {                                               //FeatureFlags
> +        0
> +      }
> +    },
> +    3,                                              //ProcessorVersion
> +    {                                               //Voltage
> +      0
> +    },
> +    0,                                              //ExternalClock
> +    0,                                              //MaxSpeed
> +    0,                                              //CurrentSpeed
> +    0,                                              //Status
> +    ProcessorUpgradeUnknown,                        //ProcessorUpgrade
> +    0xFFFF,                                         //L1CacheHandle
> +    0xFFFF,                                         //L2CacheHandle
> +    0xFFFF,                                         //L3CacheHandle
> +    4,                                              //SerialNumber
> +    5,                                              //AssetTag
> +    6,                                              //PartNumber
> +    0,                                              //CoreCount
> +    0,                                              //EnabledCoreCount
> +    0,                                              //ThreadCount
> +    0,                                              //ProcessorCharacteristics
> +    ProcessorFamilyARMv8,                           //ProcessorFamily2
> +    0,                                              //CoreCount2
> +    0,                                              //EnabledCoreCount2
> +    0                                               //ThreadCount2
> +  }
> +};
> +
> +
> +UINT16
> +GetCpuFrequency (
> +  IN  UINT8 ProcessorNumber
> +)

indent )

> +{
> +  return (UINT16)(PlatformGetCpuFreq (ProcessorNumber)/1000/1000);
> +}
> +
> +UINTN
> +GetCacheSocketStr (
> +  IN  UINT8     CacheLevel,
> +  IN  UINT8     CacheSubLevel,
> +  OUT CHAR16    *CacheSocketStr
> +  )
> +{
> +  UINTN CacheSocketStrLen;
> +
> +  if (CacheLevel == CPU_CACHE_L1 && CacheSubLevel == 0) {
> +    CacheSocketStrLen = UnicodeSPrint (CacheSocketStr, SMBIOS_STRING_MAX_LENGTH - 1, L"L%x Instruction Cache", CacheLevel + 1);
> +  } else if (CacheLevel == CPU_CACHE_L1 && CacheSubLevel == 1) {
> +    CacheSocketStrLen = UnicodeSPrint (CacheSocketStr, SMBIOS_STRING_MAX_LENGTH - 1, L"L%x Data Cache", CacheLevel + 1);
> +  } else {
> +    CacheSocketStrLen = UnicodeSPrint (CacheSocketStr, SMBIOS_STRING_MAX_LENGTH - 1, L"L%x Cache", CacheLevel + 1);
> +  }
> +
> +  return CacheSocketStrLen;
> +}
> +
> +/**
> +  Add Type 7 SMBIOS Record for Cache Information.
> +
> +  @param[in]    ProcessorNumber     Processor number of specified processor.
> +  @param[out]   L1CacheHandle       Pointer to the handle of the L1 Cache SMBIOS record.
> +  @param[out]   L2CacheHandle       Pointer to the handle of the L2 Cache SMBIOS record.
> +  @param[out]   L3CacheHandle       Pointer to the handle of the L3 Cache SMBIOS record.
> +
> +**/
> +EFI_STATUS
> +AddSmbiosCacheTypeTable (
> +  IN UINTN                  ProcessorNumber,
> +  OUT EFI_SMBIOS_HANDLE     *L1CacheHandle,
> +  OUT EFI_SMBIOS_HANDLE     *L2CacheHandle,
> +  OUT EFI_SMBIOS_HANDLE     *L3CacheHandle
> +  )
> +{
> +  EFI_STATUS                  Status;
> +  SMBIOS_TABLE_TYPE7          *Type7Record;
> +  EFI_SMBIOS_HANDLE           SmbiosHandle;
> +  UINTN                       TableSize;
> +  UINT8                       CacheLevel;
> +  UINT8                       CacheSubLevel;
> +  CHAR8                       *OptionalStrStart;
> +  EFI_STRING                  CacheSocketStr;
> +  UINTN                       CacheSocketStrLen;
> +  UINTN                       StringBufferSize;
> +
> +  CLIDR_DATA                  Clidr;
> +  CSSELR_DATA                 Csselr;
> +  CCSIDR_DATA                 Ccsidr;
> +
> +  UINT16                      CacheSize16;
> +  UINT32                      CacheSize32;
> +  UINT64                      CacheSize64;
> +  BOOLEAN                     CcidxSupported;
> +  UINT32                      Associativity;
> +  UINT8                       MaxCacheLevel;

The list of local variables tell me this function is going to be too
long and needs to be split up into helpers.

> +
> +  CONST UINT8                 MAX_ARM_CACHE_LEVEL = 7;

This needs to be a #define somewhere under ArmPkg/Include.

> +
> +  Status = EFI_SUCCESS;
> +
> +  MaxCacheLevel = 0;
> +
> +  // Read the CLIDR register to find out what caches are present.
> +  Clidr.Data = ReadCLIDR ();
> +
> +  // Get the cache type for the L1 cache. If it's 0, there are no caches.
> +  if (CLIDR_GET_CACHE_TYPE (Clidr.Data, 0) == CLIDR_CACHE_TYPE_NONE) {
> +    return EFI_SUCCESS;
> +  }
> +
> +  for (CacheLevel = 1; CacheLevel < MAX_ARM_CACHE_LEVEL; CacheLevel++) {
> +    if (CLIDR_GET_CACHE_TYPE (Clidr.Data, CacheLevel) == CLIDR_CACHE_TYPE_NONE) {
> +      MaxCacheLevel = CacheLevel;
> +      break;
> +    }
> +  }
> +
> +  CcidxSupported = ArmIsCcidxImplemented ();
> +
> +  for (CacheLevel = 0; CacheLevel < MaxCacheLevel; CacheLevel++)
> +  {

{ goes on previous line.

> +    Type7Record = NULL;
> +
> +    CLIDR_CACHE_TYPE CacheType = CLIDR_GET_CACHE_TYPE (Clidr.Data, CacheLevel);
> +
> +    // At each level of cache, we can have a single type (unified, instruction or data),
> +    // or two types - separate data and instruction caches. If we have separate
> +    // instruction and data caches, then on the first iteration (CacheSubLevel = 0)
> +    // process the instruction cache.
> +    for (CacheSubLevel = 0; CacheSubLevel <= 1; CacheSubLevel++) {
> +      // If there's no separate data/instruction cache, skip the second iteration
> +      if (CacheSubLevel > 0 && CacheType != CLIDR_CACHE_TYPE_SEPARATE) {
> +        continue;
> +      }
> +
> +      // Allocate and fetch the cache description+++
> +      StringBufferSize = sizeof (CHAR16) * SMBIOS_STRING_MAX_LENGTH;
> +      CacheSocketStr = AllocateZeroPool (StringBufferSize);
> +      if (CacheSocketStr == NULL) {
> +        Status = EFI_OUT_OF_RESOURCES;
> +        goto Exit;
> +      }
> +
> +      CacheSocketStrLen = GetCacheSocketStr (CacheLevel, CacheSubLevel, CacheSocketStr);
> +
> +      TableSize = sizeof (SMBIOS_TABLE_TYPE7) + CacheSocketStrLen + 1 + 1;
> +      Type7Record = AllocateZeroPool (TableSize);
> +      if (Type7Record == NULL) {
> +        Status = EFI_OUT_OF_RESOURCES;
> +        goto Exit;
> +      }
> +
> +      Type7Record->Hdr.Type = EFI_SMBIOS_TYPE_CACHE_INFORMATION;
> +      Type7Record->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE7);
> +      Type7Record->Hdr.Handle = SMBIOS_HANDLE_PI_RESERVED;
> +
> +      Type7Record->SocketDesignation = 1;
> +
> +      Type7Record->SupportedSRAMType.Unknown = 1;
> +      Type7Record->CurrentSRAMType.Unknown = 1;
> +      Type7Record->CacheSpeed = 0;
> +      Type7Record->ErrorCorrectionType = CacheErrorUnknown;
> +
> +      Csselr.Data = 0;
> +      Csselr.Bits.Level = CacheLevel;
> +
> +      if (CacheSubLevel == 0) {
> +        if (CacheType == CLIDR_CACHE_TYPE_INSTRUCTION_ONLY ||
> +            CacheType == CLIDR_CACHE_TYPE_SEPARATE) {
> +          Csselr.Bits.InD = CSSELR_CACHE_TYPE_INSTRUCTION; // Instruction cache
> +          Type7Record->SystemCacheType = CacheTypeInstruction;
> +        } else {
> +          Csselr.Bits.InD = CSSELR_CACHE_TYPE_DATA_OR_UNIFIED;
> +          if (CacheType == CLIDR_CACHE_TYPE_DATA_ONLY) {
> +            Type7Record->SystemCacheType = CacheTypeData;
> +          } else {
> +            Type7Record->SystemCacheType = CacheTypeUnified;
> +          }
> +        }
> +      } else {
> +        Type7Record->SystemCacheType = CacheTypeData;
> +        Csselr.Bits.InD = CSSELR_CACHE_TYPE_DATA_OR_UNIFIED;
> +      }
> +
> +      // Read the CCSIDR register to get the cache architecture
> +      Ccsidr.Data = ReadCCSIDR (Csselr.Data);
> +
> +      if (CcidxSupported) {
> +        CacheSize64 = (UINT64)(1 << (Ccsidr.BitsCcidx.LineSize + 4)) * (Ccsidr.BitsCcidx.Associativity + 1) * (Ccsidr.BitsCcidx.NumSets + 1);
> +        Associativity = Ccsidr.BitsCcidx.Associativity;
> +      } else {
> +        CacheSize64 = (1 << (Ccsidr.BitsNonCcidx.LineSize + 4)) * (Ccsidr.BitsNonCcidx.Associativity + 1) * (Ccsidr.BitsNonCcidx.NumSets + 1);

Very long lines. Wrap.

> +        Associativity = Ccsidr.BitsNonCcidx.Associativity;
> +      }
> +
> +      CacheSize64 /= 1024; // Minimum granularity is 1K
> +
> +      // Encode the cache size into the format SMBIOS wants
> +      if (CacheSize64 < MAX_INT16) {
> +        CacheSize16 = CacheSize64;
> +        CacheSize32 = CacheSize16;
> +      } else if ((CacheSize64 / 64) < MAX_INT16) {
> +        CacheSize16 = (1 << 15) | (CacheSize64 / 64);
> +        CacheSize32 = CacheSize16;
> +      } else {
> +        if ((CacheSize64 / 1024) <= 2047) {
> +          CacheSize32 = CacheSize64;
> +        } else {
> +          CacheSize32 = (1 << 31) | (CacheSize64 / 64);
> +        }
> +
> +        CacheSize16 = -1;
> +      }
> +
> +      Type7Record->Associativity = Associativity + 1;
> +      Type7Record->MaximumCacheSize = CacheSize16;
> +      Type7Record->InstalledSize = CacheSize16;
> +      Type7Record->MaximumCacheSize2 = CacheSize32;
> +      Type7Record->InstalledSize2 = CacheSize32;
> +
> +      switch (Associativity + 1) {
> +        case 2:
> +          Type7Record->Associativity = CacheAssociativity2Way;
> +          break;
> +        case 4:
> +          Type7Record->Associativity = CacheAssociativity4Way;
> +          break;
> +        case 8:
> +          Type7Record->Associativity = CacheAssociativity8Way;
> +          break;
> +        case 16:
> +          Type7Record->Associativity = CacheAssociativity16Way;
> +          break;
> +        case 12:
> +          Type7Record->Associativity = CacheAssociativity12Way;
> +          break;
> +        case 24:
> +          Type7Record->Associativity = CacheAssociativity24Way;
> +          break;
> +        case 32:
> +          Type7Record->Associativity = CacheAssociativity32Way;
> +          break;
> +        case 48:
> +          Type7Record->Associativity = CacheAssociativity48Way;
> +          break;
> +        case 64:
> +          Type7Record->Associativity = CacheAssociativity64Way;
> +          break;
> +        case 20:
> +          Type7Record->Associativity = CacheAssociativity20Way;
> +          break;
> +        default:
> +          Type7Record->Associativity = CacheAssociativityOther;
> +          break;
> +      }
> +
> +      Type7Record->CacheConfiguration = (3 << 8) | (1 << 7) | (3 << 5) | (0 << 3) | CacheLevel;

The line above alone justifies breaking out into a helper function,
and replacing the live-coded values with some descriptively named
macros.

> +
> +      // Allow the platform to fill in other information such as speed, SRAM type etc.
> +      if (!OemGetCacheInformation (CacheLevel, Type7Record)) {
> +        continue;
> +      }
> +
> +      OptionalStrStart = (CHAR8 *) (Type7Record + 1);

No space after cast.

> +      UnicodeStrToAsciiStrS (CacheSocketStr, OptionalStrStart, CacheSocketStrLen + 1);
> +
> +      SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> +      // Finally, install the table
> +      Status = mSmbios->Add (mSmbios, NULL, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER *)Type7Record);
> +      if (EFI_ERROR (Status)) {
> +        goto Exit;
> +      }
> +
> +      // Config L1/L2/L3 Cache Handle
> +      switch (CacheLevel) {
> +        case CPU_CACHE_L1:
> +          *L1CacheHandle = SmbiosHandle;
> +          break;
> +        case CPU_CACHE_L2:
> +          *L2CacheHandle = SmbiosHandle;
> +          break;
> +        case CPU_CACHE_L3:
> +          *L3CacheHandle = SmbiosHandle;
> +          break;
> +        default:
> +            break;
> +      }
> +Exit:

An Exit label *inside* a for loop?
Making some helper functions would get rid of the need.

> +      if (Type7Record != NULL)
> +      {

{ on preceding line.

> +        FreePool (Type7Record);
> +      }
> +      if (CacheSocketStr != NULL)
> +      {

Here too.

> +        FreePool (CacheSocketStr);
> +        CacheSocketStr = NULL;
> +      }
> +    }
> +  }
> +
> +  return Status;
> +}
> +
> +/**
> +  Add Type 4 SMBIOS Record for Processor Information.
> +
> +  @param[in]    ProcessorNumber     Processor number of specified processor.
> +
> +**/
> +EFI_STATUS
> +AddSmbiosProcessorTypeTable (
> +  IN UINTN                  ProcessorNumber
> +  )
> +{
> +  EFI_STATUS                  Status;
> +  SMBIOS_TABLE_TYPE4          *Type4Record;
> +  EFI_SMBIOS_HANDLE           SmbiosHandle;
> +  EFI_SMBIOS_HANDLE           L1CacheHandle;
> +  EFI_SMBIOS_HANDLE           L2CacheHandle;
> +  EFI_SMBIOS_HANDLE           L3CacheHandle;
> +
> +  CHAR8                       *OptionalStrStart;
> +  UINT8                       *LegacyVoltage;
> +  EFI_STRING_ID               ProcessorManu;
> +  EFI_STRING_ID               ProcessorVersion;
> +  EFI_STRING_ID               SerialNumber;
> +  EFI_STRING_ID               AssetTag;
> +  EFI_STRING_ID               PartNumber;
> +  EFI_STRING                  ProcessorSocketStr;
> +  EFI_STRING                  ProcessorManuStr;
> +  EFI_STRING                  ProcessorVersionStr;
> +  EFI_STRING                  SerialNumberStr;
> +  EFI_STRING                  AssetTagStr;
> +  EFI_STRING                  PartNumberStr;
> +  UINTN                       ProcessorSocketStrLen;
> +  UINTN                       ProcessorManuStrLen;
> +  UINTN                       ProcessorVersionStrLen;
> +  UINTN                       SerialNumberStrLen;
> +  UINTN                       AssetTagStrLen;
> +  UINTN                       PartNumberStrLen;
> +  UINTN                       StringBufferSize;
> +  UINTN                       TotalSize;
> +
> +  PROCESSOR_STATUS_DATA       ProcessorStatus = {{0}};
> +  MISC_PROCESSOR_DATA         MiscProcessorData;
> +
> +  ARM_SMC_ARGS                Args;
> +  BOOLEAN                     Arm64SocIdSupported = FALSE;
> +  int                         Jep106Code;
> +  int                         SocRevision;
> +  int                         SmcCallStatus;

There is no "int".

> +  UINT64                      *ProcessorId;

Right, so I said the preceding function needed to be broken down based
on its local variables. I think this one has twice as many.

> +
> +  Type4Record         = NULL;
> +  ProcessorManuStr    = NULL;
> +  ProcessorVersionStr = NULL;
> +  SerialNumberStr     = NULL;
> +  AssetTagStr         = NULL;
> +  PartNumberStr       = NULL;
> +
> +
> +  MiscProcessorData.Voltage             = 0;
> +  MiscProcessorData.CurrentSpeed        = 0;
> +  MiscProcessorData.CoreCount           = 0;
> +  MiscProcessorData.CoresEnabled        = 0;
> +  MiscProcessorData.ThreadCount         = 0;
> +  L1CacheHandle       = 0xFFFF;
> +  L2CacheHandle       = 0xFFFF;
> +  L3CacheHandle       = 0xFFFF;
> +
> +  ProcessorManu       = STRING_TOKEN (STR_PROCESSOR_UNKNOWN);
> +  ProcessorVersion    = STRING_TOKEN (STR_PROCESSOR_UNKNOWN);
> +  SerialNumber        = STRING_TOKEN (STR_PROCESSOR_UNKNOWN);
> +  AssetTag            = STRING_TOKEN (STR_PROCESSOR_UNKNOWN);
> +  PartNumber          = STRING_TOKEN (STR_PROCESSOR_UNKNOWN);
> +
> +  BOOLEAN Populated = OemGetProcessorInformation (ProcessorNumber,
> +                                                  &ProcessorStatus,
> +                                                  (PROCESSOR_CHARACTERISTIC_FLAGS*)&mSmbiosProcessorTable[ProcessorNumber].ProcessorCharacteristics,

Too long.

> +                                                  &MiscProcessorData);
> +  if (Populated)
> +  {

{ on preceding line.
(throughout)

> +    Status = AddSmbiosCacheTypeTable (ProcessorNumber, &L1CacheHandle,
> +                                      &L2CacheHandle, &L3CacheHandle);
> +
> +    ProcessorManu       = STRING_TOKEN (STR_PROCESSOR_MANUFACTURE);
> +    ProcessorVersion    = STRING_TOKEN (STR_PROCESSOR_VERSION);
> +    SerialNumber        = STRING_TOKEN (STR_PROCESSOR_SERIAL_NUMBER);
> +    AssetTag            = STRING_TOKEN (STR_PROCESSOR_ASSET_TAG);
> +    PartNumber          = STRING_TOKEN (STR_PROCESSOR_PART_NUMBER);
> +
> +    ProcessorManuStr = (CHAR16 *) PcdGetPtr (PcdProcessorManufacturer);

No space after cast.

> +
> +    if (StrLen (ProcessorManuStr) > 0)
> +    {
> +      HiiSetString (mHiiHandle, ProcessorManu, ProcessorManuStr, NULL);
> +    }

This pattern seems to be repeated many times, looks like a macro would help.

> +
> +    ProcessorVersionStr = (CHAR16 *) PcdGetPtr (PcdProcessorVersion);
> +
> +    if (StrLen (ProcessorVersionStr) > 0)
> +    {
> +      HiiSetString (mHiiHandle, ProcessorVersion, ProcessorVersionStr, NULL);
> +    }
> +
> +    SerialNumberStr = (CHAR16 *) PcdGetPtr (PcdProcessorSerialNumber);
> +
> +    if (StrLen (SerialNumberStr) > 0)
> +    {
> +      HiiSetString (mHiiHandle, SerialNumber, SerialNumberStr, NULL);
> +    }
> +
> +    AssetTagStr = (CHAR16 *) PcdGetPtr (PcdProcessorAssetTag);
> +
> +    if (StrLen (AssetTagStr) > 0)
> +    {
> +      HiiSetString (mHiiHandle, AssetTag, AssetTagStr, NULL);
> +    }
> +
> +    PartNumberStr = (CHAR16 *) PcdGetPtr (PcdProcessorPartNumber);
> +
> +    if (StrLen (PartNumberStr) > 0)
> +    {
> +      HiiSetString (mHiiHandle, PartNumber, PartNumberStr, NULL);
> +    }
> +  }
> +
> +  // Processor Socket Designation
> +  StringBufferSize = sizeof (CHAR16) * SMBIOS_STRING_MAX_LENGTH;
> +  ProcessorSocketStr = AllocateZeroPool (StringBufferSize);
> +  if (ProcessorSocketStr == NULL)
> +  {
> +    Status = EFI_OUT_OF_RESOURCES;
> +    goto Exit;
> +  }
> +
> +  ProcessorSocketStrLen = UnicodeSPrint (ProcessorSocketStr, StringBufferSize, L"CPU%02d", ProcessorNumber + 1);

Too long.

> +
> +  // Processor Manufacture
> +  ProcessorManuStr = HiiGetPackageString (&gEfiCallerIdGuid, ProcessorManu, NULL);
> +  ProcessorManuStrLen = StrLen (ProcessorManuStr);
> +
> +  // Processor Version
> +  ProcessorVersionStr = HiiGetPackageString (&gEfiCallerIdGuid, ProcessorVersion, NULL);
> +  ProcessorVersionStrLen = StrLen (ProcessorVersionStr);
> +
> +  // Serial Number
> +  SerialNumberStr = HiiGetPackageString (&gEfiCallerIdGuid, SerialNumber, NULL);
> +  SerialNumberStrLen = StrLen (SerialNumberStr);
> +
> +  // Asset Tag
> +  AssetTagStr = HiiGetPackageString (&gEfiCallerIdGuid, AssetTag, NULL);
> +  AssetTagStrLen = StrLen (AssetTagStr);
> +
> +  // Part Number
> +  PartNumberStr = HiiGetPackageString (&gEfiCallerIdGuid, PartNumber, NULL);
> +  PartNumberStrLen = StrLen (PartNumberStr);
> +
> +  TotalSize = sizeof (SMBIOS_TABLE_TYPE4) + ProcessorSocketStrLen + 1 +
> +                                            ProcessorManuStrLen + 1 +
> +                                            ProcessorVersionStrLen + 1 +
> +                                            SerialNumberStrLen + 1 +
> +                                            AssetTagStrLen + 1 +
> +                                            PartNumberStrLen + 1 + 1;
> +  Type4Record = AllocateZeroPool (TotalSize);
> +  if (Type4Record == NULL)
> +  {
> +    Status = EFI_OUT_OF_RESOURCES;
> +    goto Exit;
> +  }
> +
> +  (VOID)CopyMem (Type4Record, &mSmbiosProcessorTable[ProcessorNumber], sizeof (SMBIOS_TABLE_TYPE4));
> +
> +  LegacyVoltage = (UINT8*)&Type4Record->Voltage;
> +
> +  *LegacyVoltage                          = MiscProcessorData.Voltage;
> +  Type4Record->CurrentSpeed               = MiscProcessorData.CurrentSpeed;
> +  Type4Record->MaxSpeed                   = MiscProcessorData.MaxSpeed;
> +  Type4Record->Status                     = ProcessorStatus.Data;
> +  Type4Record->L1CacheHandle              = L1CacheHandle;
> +  Type4Record->L2CacheHandle              = L2CacheHandle;
> +  Type4Record->L3CacheHandle              = L3CacheHandle;
> +  Type4Record->CoreCount                  = MiscProcessorData.CoreCount;
> +  Type4Record->CoreCount2                 = MiscProcessorData.CoreCount;
> +  Type4Record->EnabledCoreCount           = MiscProcessorData.CoresEnabled;
> +  Type4Record->EnabledCoreCount2          = MiscProcessorData.CoresEnabled;
> +  Type4Record->ThreadCount                = MiscProcessorData.ThreadCount;
> +  Type4Record->ThreadCount2               = MiscProcessorData.ThreadCount;
> +
> +  Type4Record->ExternalClock              = (UINT16)(ArmReadCntFrq () / 1000 / 1000);
> +
> +  ProcessorId = (UINT64 *)&Type4Record->ProcessorId;
> +
> +  Args.Arg0 = ARM_SMC_ID_ARCH_VERSION;
> +  ArmCallSmc (&Args);
> +  SmcCallStatus = (int)Args.Arg0;
> +
> +  if (SmcCallStatus < 0 || (SmcCallStatus >> 16) >= 1) {
> +    Args.Arg0 = ARM_SMC_ID_ARCH_FEATURES;
> +    Args.Arg1 = ARM_SMC_ID_ARCH_SOC_ID;
> +    ArmCallSmc (&Args);
> +
> +    if (Args.Arg0 >= 0) {
> +      PROCESSOR_CHARACTERISTIC_FLAGS *ProcessorCharacteristicFlags = (PROCESSOR_CHARACTERISTIC_FLAGS*)&Type4Record->ProcessorCharacteristics;

Too long.

> +      Args.Arg0 = ARM_SMC_ID_ARCH_SOC_ID;
> +      Args.Arg1 = 0;
> +      ArmCallSmc (&Args);
> +      SmcCallStatus = (int)Args.Arg0;
> +
> +      if (SmcCallStatus >= 0) {
> +        Arm64SocIdSupported = TRUE;
> +        ProcessorCharacteristicFlags->ProcessorArm64SocId = 1;
> +        Jep106Code = (int)Args.Arg0;
> +      } else {
> +        ProcessorCharacteristicFlags->ProcessorArm64SocId  = 0;

Stray space before =.

> +      }
> +      Args.Arg0 = ARM_SMC_ID_ARCH_SOC_ID;
> +      Args.Arg1 = 1;
> +      ArmCallSmc (&Args);
> +      SmcCallStatus = (int)Args.Arg0;
> +
> +      if (SmcCallStatus >= 0) {
> +        SocRevision = (int)Args.Arg0;
> +      }
> +    }
> +  }
> +
> +  if (Arm64SocIdSupported) {
> +    *ProcessorId = ((UINT64)Jep106Code << 32) | SocRevision;
> +  } else {
> +    *ProcessorId = ArmReadMidr ();
> +  }
> +
> +  UINTN MainIdRegister = ArmReadMidr ();
> +  if (((MainIdRegister >> 16) & 0xF) < 8) {
> +    Type4Record->ProcessorFamily2 = ProcessorFamilyARM;
> +  } else {
> +    if (sizeof (VOID*) == 4) {
> +      Type4Record->ProcessorFamily2 = ProcessorFamilyARMv7;
> +    } else {
> +      Type4Record->ProcessorFamily2 = ProcessorFamilyARMv8;
> +    }
> +  }
> +
> +  OptionalStrStart = (CHAR8 *) (Type4Record + 1);

No space after cast.

> +  UnicodeStrToAsciiStrS (ProcessorSocketStr, OptionalStrStart, ProcessorSocketStrLen + 1);
> +  UnicodeStrToAsciiStrS (ProcessorManuStr, OptionalStrStart + ProcessorSocketStrLen + 1, ProcessorManuStrLen + 1);
> +  UnicodeStrToAsciiStrS (ProcessorVersionStr, OptionalStrStart + ProcessorSocketStrLen + 1 + ProcessorManuStrLen + 1, ProcessorVersionStrLen + 1);
> +  UnicodeStrToAsciiStrS (SerialNumberStr, OptionalStrStart + ProcessorSocketStrLen + 1 + ProcessorManuStrLen + 1 + ProcessorVersionStrLen + 1, SerialNumberStrLen + 1);
> +  UnicodeStrToAsciiStrS (AssetTagStr, OptionalStrStart + ProcessorSocketStrLen + 1 + ProcessorManuStrLen + 1 + ProcessorVersionStrLen + 1 + SerialNumberStrLen + 1, AssetTagStrLen + 1);
> +  UnicodeStrToAsciiStrS (PartNumberStr, OptionalStrStart + ProcessorSocketStrLen + 1 + ProcessorManuStrLen + 1 + ProcessorVersionStrLen + 1 + SerialNumberStrLen + 1 + AssetTagStrLen + 1, PartNumberStrLen + 1);

Unreadable - use a temporary cariable.

> +
> +  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> +  Status = mSmbios->Add (mSmbios, NULL, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER *)Type4Record);
> +  if (EFI_ERROR (Status))
> +  {
> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Smbios Type04 Table Log Failed! %r \n", __FUNCTION__, __LINE__, Status));

Wrap line.

> +  }
> +  FreePool (Type4Record);
> +
> +Exit:
> +  if (ProcessorSocketStr != NULL)
> +  {
> +    FreePool (ProcessorSocketStr);
> +  }
> +  if (ProcessorManuStr != NULL)
> +  {
> +    FreePool (ProcessorManuStr);
> +  }
> +  if (ProcessorVersionStr != NULL)
> +  {
> +    FreePool (ProcessorVersionStr);
> +  }
> +  if (SerialNumberStr != NULL)
> +  {
> +    FreePool (SerialNumberStr);
> +  }
> +  if (AssetTagStr != NULL)
> +  {
> +    FreePool (AssetTagStr);
> +  }
> +  if (PartNumberStr != NULL)
> +  {
> +    FreePool (PartNumberStr);
> +  }
> +
> +  return Status;
> +}
> +
> +/**
> +  Standard EFI driver point.  This driver locates the ProcessorConfigurationData Variable,
> +  if it exists, add the related SMBIOS tables by PI SMBIOS protocol.
> +
> +  @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_STATUS
> +EFIAPI
> +ProcessorSubClassEntryPoint(
> +  IN EFI_HANDLE         ImageHandle,
> +  IN EFI_SYSTEM_TABLE   *SystemTable
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  UINT32                          SocketIndex;
> +
> +  //
> +  // Locate dependent protocols
> +  //
> +  Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID**)&mSmbios);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "Could not locate SMBIOS protocol.  %r\n", Status));
> +    return Status;
> +  }
> +
> +  //
> +  // Add our default strings to the HII database. They will be modified later.
> +  //
> +  mHiiHandle = HiiAddPackages (
> +              &gEfiCallerIdGuid,

Indentation.

> +              NULL,
> +              ProcessorSubClassStrings,
> +              NULL,
> +              NULL
> +              );
> +  if (mHiiHandle == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  //
> +  // Add SMBIOS tables for populated sockets.
> +  //
> +  for (SocketIndex = 0; SocketIndex < OemGetProcessorMaxSockets(); SocketIndex++) {
> +    Status = AddSmbiosProcessorTypeTable (SocketIndex);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "Add Processor Type Table Failed!  %r.\n", Status));
> +      return Status;
> +    }
> +  }
> +
> +  return Status;
> +}
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscDataTable.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscDataTable.c
> new file mode 100644
> index 000000000000..eff045383991
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscDataTable.c
> @@ -0,0 +1,50 @@
> +/**@file
> +
> +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
> +
> +Module Name:
> +
> +  SmbiosMiscDataTable.c
> +
> +Abstract:
> +
> +  This file provides SMBIOS Misc Type.
> +
> +Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +**/
> +
> +#include "SmbiosMisc.h"
> +
> +  MISC_SMBIOS_TABLE_EXTERNS (SMBIOS_TABLE_TYPE0,  MiscBiosVendor, MiscBiosVendor)

Why the indentation?

> +  MISC_SMBIOS_TABLE_EXTERNS (SMBIOS_TABLE_TYPE1,  MiscSystemManufacturer, MiscSystemManufacturer)
> +  MISC_SMBIOS_TABLE_EXTERNS (SMBIOS_TABLE_TYPE3,  MiscChassisManufacturer, MiscChassisManufacturer)
> +  MISC_SMBIOS_TABLE_EXTERNS (SMBIOS_TABLE_TYPE2,  MiscBaseBoardManufacturer, MiscBaseBoardManufacturer)
> +  MISC_SMBIOS_TABLE_EXTERNS (SMBIOS_TABLE_TYPE13, MiscNumberOfInstallableLanguages, MiscNumberOfInstallableLanguages)
> +  MISC_SMBIOS_TABLE_EXTERNS (SMBIOS_TABLE_TYPE32, MiscBootInformation, MiscBootInformation)

Consider wrapping long lines.

> +
> +
> +EFI_MISC_SMBIOS_DATA_TABLE mSmbiosMiscDataTable[] = {
> +  // Type0
> +  MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION (MiscBiosVendor, MiscBiosVendor),
> +  // Type1
> +  MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION (MiscSystemManufacturer, MiscSystemManufacturer),
> +  // Type3
> +  MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION (MiscChassisManufacturer, MiscChassisManufacturer),
> +  // Type2
> +  MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION (MiscBaseBoardManufacturer, MiscBaseBoardManufacturer),
> +  // Type13
> +  MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION (MiscNumberOfInstallableLanguages, MiscNumberOfInstallableLanguages),
> +  // Type32
> +  MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION (MiscBootInformation, MiscBootInformation),
> +};

Consider wrapping long lines.

> +
> +
> +//
> +// Number of Data Table entries.
> +//
> +UINTN mSmbiosMiscDataTableEntries =
> +  (sizeof (mSmbiosMiscDataTable)) / sizeof (EFI_MISC_SMBIOS_DATA_TABLE);
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscEntryPoint.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscEntryPoint.c
> new file mode 100644
> index 000000000000..fe81367d1c28
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscEntryPoint.c
> @@ -0,0 +1,167 @@
> +/**@file
> +
> +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
> +
> +Module Name:
> +
> +  SmbiosMiscEntryPoint.c
> +
> +Abstract:
> +
> +  This driver parses the mSmbiosMiscDataTable structure and reports
> +  any generated data using SMBIOS protocol.
> +
> +Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +**/
> +
> +#include "SmbiosMisc.h"
> +
> +#define MAX_HANDLE_COUNT  0x10

Why?
Does this belong in a generic header?

> +
> +EFI_HANDLE              mImageHandle;
> +EFI_HII_HANDLE          mHiiHandle;
> +EFI_SMBIOS_PROTOCOL     *mSmbios = NULL;
> +
> +/**
> +  Standard EFI driver point.  This driver parses the mSmbiosMiscDataTable
> +  structure and reports any generated data using SMBIOS protocol.
> +
> +  @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_STATUS
> +EFIAPI
> +SmbiosMiscEntryPoint(
> +  IN EFI_HANDLE         ImageHandle,
> +  IN EFI_SYSTEM_TABLE   *SystemTable
> +  )
> +{
> +  UINTN                Index;
> +  EFI_STATUS           EfiStatus;
> +  EFI_SMBIOS_PROTOCOL  *Smbios;
> +
> +  mImageHandle = ImageHandle;
> +
> +  EfiStatus = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID**)&Smbios);
> +  if (EFI_ERROR (EfiStatus)) {
> +    DEBUG ((DEBUG_ERROR, "Could not locate SMBIOS protocol.  %r\n", EfiStatus));
> +    return EfiStatus;
> +  }
> +
> +  mSmbios = Smbios;
> +
> +  mHiiHandle = HiiAddPackages (
> +                  &gEfiCallerIdGuid,
> +                  mImageHandle,
> +                  SmbiosMiscDxeStrings,
> +                  NULL
> +                  );
> +  if (mHiiHandle == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  for (Index = 0; Index < mSmbiosMiscDataTableEntries; ++Index) {
> +    //
> +    // If the entry have a function pointer, just log the data.
> +    //
> +    if (mSmbiosMiscDataTable[Index].Function != NULL) {
> +      EfiStatus = (*mSmbiosMiscDataTable[Index].Function)(
> +          mSmbiosMiscDataTable[Index].RecordData,
> +          Smbios
> +          );
> +
> +      if (EFI_ERROR(EfiStatus)) {
> +        DEBUG ((DEBUG_ERROR, "Misc smbios store error.  Index=%d, ReturnStatus=%r\n", Index, EfiStatus));
> +        return EfiStatus;
> +      }
> +    }
> +  }
> +
> +  return EfiStatus;
> +}
> +
> +
> +/**
> +  Logs SMBIOS record.
> +
> +  @param  Buffer                The data for the fixed portion of 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.
> +
> +  @retval EFI_SUCCESS           Record was added.
> +  @retval EFI_OUT_OF_RESOURCES  Record was not added due to lack of system resources.
> +
> +**/
> +EFI_STATUS
> +LogSmbiosData (
> +  IN       UINT8                      *Buffer,
> +  IN  OUT  EFI_SMBIOS_HANDLE          *SmbiosHandle
> +  )
> +{
> +  EFI_STATUS         Status;
> +
> +  *SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> +
> +  Status = mSmbios->Add (
> +                   mSmbios,
> +                   NULL,
> +                   SmbiosHandle,
> +                   (EFI_SMBIOS_TABLE_HEADER *)Buffer
> +                   );
> +
> +  return Status;
> +}
> +
> +
> +VOID
> +GetLinkTypeHandle(
> +  IN  UINT8                 SmbiosType,
> +  OUT UINT16                **HandleArray,
> +  OUT UINTN                 *HandleCount
> +  )
> +{
> +  EFI_STATUS                       Status;
> +  EFI_SMBIOS_HANDLE                SmbiosHandle;
> +  EFI_SMBIOS_TABLE_HEADER          *LinkTypeData = NULL;
> +
> +  if (mSmbios == NULL) {
> +    return;
> +  }
> +
> +  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> +
> +  *HandleArray = AllocateZeroPool (sizeof(UINT16) * MAX_HANDLE_COUNT);
> +  if (*HandleArray == NULL) {
> +    DEBUG ((DEBUG_ERROR, "HandleArray allocate memory resource failed.\n"));
> +    return;
> +  }
> +
> +  *HandleCount = 0;
> +
> +  while(1) {
> +    Status = mSmbios->GetNext (
> +                        mSmbios,
> +                        &SmbiosHandle,
> +                        &SmbiosType,
> +                        &LinkTypeData,
> +                        NULL
> +                        );
> +
> +    if (!EFI_ERROR (Status)) {
> +      (*HandleArray)[*HandleCount] = LinkTypeData->Handle;
> +      (*HandleCount)++;
> +    } else {
> +      break;
> +    }
> +  }
> +}
> +
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type00/MiscBiosVendorData.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type00/MiscBiosVendorData.c
> new file mode 100644
> index 000000000000..d9a1ed418428
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type00/MiscBiosVendorData.c
> @@ -0,0 +1,99 @@
> +/*++
> +
> +Copyright (c) 2006 - 2009, 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
> +
> +Module Name:
> +
> +  MiscBiosVendorData.c
> +
> +Abstract:
> +
> +  This file provides Smbios Type0 Data
> +
> +Based on the files under Nt32Pkg/MiscSubClassPlatformDxe/
> +
> +**/
> +
> +
> +#include "SmbiosMisc.h"
> +
> +
> +//
> +// Static (possibly build generated) Bios Vendor data.
> +//
> +MISC_SMBIOS_TABLE_DATA(SMBIOS_TABLE_TYPE0, MiscBiosVendor) = {
> +  {                                          //Hdr
> +    EFI_SMBIOS_TYPE_BIOS_INFORMATION,          // Type,
> +    0,                                         // Length,
> +    0                                          // Handle
> +  },
> +  1,                                         //Vendor
> +  2,                                         //BiosVersion
> +  0xE000,                                    //BiosSegment
> +  3,                                         //BiosReleaseDate
> +  0,                                         //BiosSize
> +  {                                          //BiosCharacteristics
> +    0,                                         // Reserved                          :2
> +    0,                                         // Unknown                           :1
> +    0,                                         // BiosCharacteristicsNotSupported   :1
> +    0,                                         // IsaIsSupported                    :1
> +    0,                                         // McaIsSupported                    :1
> +    0,                                         // EisaIsSupported                   :1
> +    1,                                         // PciIsSupported                    :1
> +    0,                                         // PcmciaIsSupported                 :1
> +    1,                                         // PlugAndPlayIsSupported            :1
> +    0,                                         // ApmIsSupported                    :1
> +    1,                                         // BiosIsUpgradable                  :1
> +    1,                                         // BiosShadowingAllowed              :1
> +    0,                                         // VlVesaIsSupported                 :1
> +    0,                                         // EscdSupportIsAvailable            :1
> +    1,                                         // BootFromCdIsSupported             :1
> +    1,                                         // SelectableBootIsSupported         :1
> +    0,                                         // RomBiosIsSocketed                 :1
> +    0,                                         // BootFromPcmciaIsSupported         :1
> +    1,                                         // EDDSpecificationIsSupported       :1
> +    0,                                         // JapaneseNecFloppyIsSupported      :1
> +    0,                                         // JapaneseToshibaFloppyIsSupported  :1
> +    0,                                         // Floppy525_360IsSupported          :1
> +    0,                                         // Floppy525_12IsSupported           :1
> +    0,                                         // Floppy35_720IsSupported           :1
> +    0,                                         // Floppy35_288IsSupported           :1
> +    0,                                         // PrintScreenIsSupported            :1
> +    0,                                         // Keyboard8042IsSupported           :1
> +    0,                                         // SerialIsSupported                 :1
> +    0,                                         // PrinterIsSupported                :1
> +    0,                                         // CgaMonoIsSupported                :1
> +    0,                                         // NecPc98                           :1
> +    0                                          // ReservedForVendor                 :32
> +  },
> +
> +  {
> +    0x03,                                        //BIOSCharacteristicsExtensionBytes[0]
> +    //  {                                          //BiosReserved
> +    //    1,                                         // AcpiIsSupported                   :1
> +    //    1,                                         // UsbLegacyIsSupported              :1
> +    //    0,                                         // AgpIsSupported                    :1
> +    //    0,                                         // I20BootIsSupported                :1
> +    //    0,                                         // Ls120BootIsSupported              :1
> +    //    0,                                         // AtapiZipDriveBootIsSupported      :1
> +    //    0,                                         // Boot1394IsSupported               :1
> +    //    0                                          // SmartBatteryIsSupported           :1
> +    //  },
> +    0x0D                                         //BIOSCharacteristicsExtensionBytes[1]
> +    //  {                                          //SystemReserved
> +    //    1,                                         //BiosBootSpecIsSupported            :1
> +    //    0,                                         //FunctionKeyNetworkBootIsSupported  :1
> +    //    1,                                         //TargetContentDistributionEnabled   :1
> +    //    1,                                         //UefiSpecificationSupported         :1
> +    //    0,                                         //VirtualMachineSupported            :1
> +    //    0                                          //ExtensionByte2Reserved             :3
> +    //  },
> +  },
> +  0xFF,                                        //SystemBiosMajorRelease;
> +  0xFF,                                        //SystemBiosMinorRelease;
> +  0xFF,                                     //EmbeddedControllerFirmwareMajorRelease;
> +  0xFF                                      //EmbeddedControllerFirmwareMinorRelease;
> +};
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type00/MiscBiosVendorFunction.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type00/MiscBiosVendorFunction.c
> new file mode 100644
> index 000000000000..2f6b35d80266
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type00/MiscBiosVendorFunction.c
> @@ -0,0 +1,232 @@
> +/** @file
> +
> +  Copyright (c) 2009, 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
> +
> +
> +Module Name:
> +
> +  MiscBiosVendorData.c
> +
> +Abstract:
> +
> +  This driver parses the mMiscSubclassDataTable structure and reports
> +  any generated data to the DataHub.
> +
> +Based on the files under Nt32Pkg/MiscSubClassPlatformDxe/
> +
> +--*/
> +
> +//
> +#include "SmbiosMisc.h"
> +#include <Library/HobLib.h>
> +#include <Guid/VersionInfoHobGuid.h>
> +
> +
> +/**
> +  Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a byte, with '64k'
> +  as the unit.
> +
> +  @param  Value              Pointer to Base2_Data
> +
> +  @retval
> +
> +**/
> +UINT8
> +Base2ToByteWith64KUnit (
> +  IN  UINTN  Value
> +  )
> +{
> +  UINT8 Size;
> +
> +  Size = Value / SIZE_64KB + (Value % SIZE_64KB + SIZE_64KB - 1) / SIZE_64KB;
> +
> +  return Size;
> +}
> +
> +
> +/**
> +
> +**/
> +VOID *
> +GetBiosReleaseDate (
> +  VOID
> +  )
> +{
> +  CHAR16                  *ReleaseDate = NULL;
> +  VERSION_INFO            *Version;
> +  VOID                    *Hob;
> +
> +  ReleaseDate = AllocateZeroPool ((sizeof (CHAR16)) * SMBIOS_STRING_MAX_LENGTH);
> +  if (ReleaseDate == NULL) {
> +      return NULL;
> +  }
> +
> +  Hob = GetFirstGuidHob (&gVersionInfoHobGuid);
> +  if (Hob == NULL) {
> +    DEBUG ((DEBUG_ERROR, "[%a:%d] Version info HOB not found!\n", __FUNCTION__, __LINE__));
> +    return NULL;
> +  }
> +
> +  Version = GET_GUID_HOB_DATA (Hob);
> +  (VOID)UnicodeSPrintAsciiFormat (ReleaseDate,
> +                        (sizeof (CHAR16)) * SMBIOS_STRING_MAX_LENGTH,
> +                        "%02d/%02d/%4d",
> +                        Version->BuildTime.Month,
> +                        Version->BuildTime.Day,
> +                        Version->BuildTime.Year
> +                        );
> +
> +  return ReleaseDate;
> +}
> +
> +VOID *
> +GetBiosVersion (
> +  VOID
> +  )
> +{
> +  VERSION_INFO            *Version;
> +  VOID                    *Hob;
> +
> +  Hob = GetFirstGuidHob (&gVersionInfoHobGuid);
> +  if (Hob == NULL) {
> +    DEBUG ((DEBUG_ERROR, "[%a:%d] Version info HOB not found!\n", __FUNCTION__, __LINE__));
> +    return NULL;
> +  }
> +
> +  Version = GET_GUID_HOB_DATA (Hob);
> +  return Version->String;
> +}
> +
> +
> +/**
> +  This function makes boot time changes to the contents of the
> +  MiscBiosVendor (Type 0).
> +
> +  @param  RecordData                 Pointer to copy of RecordData from the Data Table.
> +
> +  @retval EFI_SUCCESS                All parameters were valid.
> +  @retval EFI_UNSUPPORTED            Unexpected RecordType value.
> +  @retval EFI_INVALID_PARAMETER      Invalid parameter was found.
> +
> +**/
> +MISC_SMBIOS_TABLE_FUNCTION(MiscBiosVendor)
> +{
> +  CHAR8                 *OptionalStrStart;
> +  UINTN                 VendorStrLen;
> +  UINTN                 VerStrLen;
> +  UINTN                 DateStrLen;
> +  UINTN                 BiosPhysicalSizeHexValue;
> +  CHAR16                *Vendor;
> +  CHAR16                *Version;
> +  CHAR16                *ReleaseDate;
> +  CHAR16                *Char16String;
> +  EFI_STATUS            Status;
> +  EFI_STRING_ID         TokenToUpdate;
> +  EFI_STRING_ID         TokenToGet;
> +  SMBIOS_TABLE_TYPE0    *SmbiosRecord;
> +  EFI_SMBIOS_HANDLE     SmbiosHandle;
> +  SMBIOS_TABLE_TYPE0    *InputData;
> +
> +  //
> +  // First check for invalid parameters.
> +  //
> +  if (RecordData == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  InputData = (SMBIOS_TABLE_TYPE0 *)RecordData;
> +
> +  Vendor = (CHAR16 *) PcdGetPtr (PcdFirmwareVendor);
> +
> +  if (StrLen (Vendor) > 0) {
> +    TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_VENDOR);
> +    HiiSetString (mHiiHandle, TokenToUpdate, Vendor, NULL);
> +  }
> +
> +  Version = GetBiosVersion();
> +
> +  if (StrLen (Version) > 0) {
> +    TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_VERSION);
> +    HiiSetString (mHiiHandle, TokenToUpdate, Version, NULL);
> +  } else {
> +    Version = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString);
> +    if (StrLen (Version) > 0) {
> +      TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_VERSION);
> +      HiiSetString (mHiiHandle, TokenToUpdate, Version, NULL);
> +    }
> +  }
> +
> +  Char16String = GetBiosReleaseDate ();
> +  if (StrLen(Char16String) > 0) {
> +    TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_RELEASE_DATE);
> +    HiiSetString (mHiiHandle, TokenToUpdate, Char16String, NULL);
> +  }
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_BIOS_VENDOR);
> +  Vendor = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  VendorStrLen = StrLen (Vendor);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_BIOS_VERSION);
> +  Version = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  VerStrLen = StrLen (Version);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_BIOS_RELEASE_DATE);
> +  ReleaseDate = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  DateStrLen = StrLen (ReleaseDate);
> +
> +  //
> +  // Now update the BiosPhysicalSize
> +  //
> +  BiosPhysicalSizeHexValue = FixedPcdGet32 (PcdFdSize);
> +
> +  //
> +  // Two zeros following the last string.
> +  //
> +  SmbiosRecord = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE0) + VendorStrLen + 1 + VerStrLen + 1 + DateStrLen + 1 + 1);

Long line.

> +  if (SmbiosRecord == NULL) {
> +    Status = EFI_OUT_OF_RESOURCES;
> +    goto Exit;
> +  }
> +
> +  (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE0));
> +
> +  SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE0);
> +  SmbiosRecord->BiosSegment = (UINT16)(FixedPcdGet32 (PcdFdBaseAddress) / SIZE_64KB);
> +  SmbiosRecord->BiosSize = Base2ToByteWith64KUnit (BiosPhysicalSizeHexValue) - 1;
> +
> +  OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
> +  UnicodeStrToAsciiStrS (Vendor, OptionalStrStart, VendorStrLen + 1);
> +  UnicodeStrToAsciiStrS (Version, OptionalStrStart + VendorStrLen + 1, VerStrLen + 1);
> +  UnicodeStrToAsciiStrS (ReleaseDate, OptionalStrStart + VendorStrLen + 1 + VerStrLen + 1, DateStrLen + 1);

Long line. (Use temp var.)

> +  //
> +  // Now we have got the full smbios record, call smbios protocol to add this record.
> +  //
> +  Status = LogSmbiosData ((UINT8*)SmbiosRecord, &SmbiosHandle);
> +  if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Smbios Type00 Table Log Failed! %r \n", __FUNCTION__, __LINE__, Status));

Long line.

> +  }
> +
> +  FreePool (SmbiosRecord);
> +
> +Exit:
> +  if (Vendor != NULL) {
> +    FreePool (Vendor);
> +  }
> +
> +  if (Version != NULL) {
> +    FreePool (Version);
> +  }
> +
> +  if (ReleaseDate != NULL) {
> +    FreePool (ReleaseDate);
> +  }
> +
> +  if (Char16String != NULL) {
> +    FreePool (Char16String);
> +  }
> +
> +  return Status;
> +}
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type01/MiscSystemManufacturerData.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type01/MiscSystemManufacturerData.c
> new file mode 100644
> index 000000000000..8752dbd73132
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type01/MiscSystemManufacturerData.c
> @@ -0,0 +1,43 @@
> +/*++
> +
> +Copyright (c) 2006 - 2009, 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
> +
> +Module Name:
> +
> +  MiscSystemManufacturerData.c
> +
> +Abstract:
> +
> +  This file provides Smbios Type1 Data
> +
> +Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +
> +**/
> +
> +#include "SmbiosMisc.h"
> +
> +
> +//
> +// Static (possibly build generated) System Manufacturer data.
> +//
> +MISC_SMBIOS_TABLE_DATA(SMBIOS_TABLE_TYPE1, MiscSystemManufacturer) = {
> +  {                                               // Hdr
> +    EFI_SMBIOS_TYPE_SYSTEM_INFORMATION,             // Type,
> +    0,                                              // Length,
> +    0                                               // Handle
> +  },
> +  1,                                              // Manufacturer
> +  2,                                              // ProductName
> +  3,                                              // Version
> +  4,                                              // SerialNumber
> +  {                                               // Uuid
> +    0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
> +  },
> +  SystemWakeupTypePowerSwitch,                    // SystemWakeupType
> +  5,                                              // SKUNumber,
> +  6                                               // Family
> +};
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type01/MiscSystemManufacturerFunction.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type01/MiscSystemManufacturerFunction.c
> new file mode 100644
> index 000000000000..2f96ce90575e
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type01/MiscSystemManufacturerFunction.c
> @@ -0,0 +1,171 @@
> +/*++
> +
> +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
> +
> +Module Name:
> +
> +  MiscSystemManufacturerFunction.c
> +
> +Abstract:
> +
> +  This driver parses the mMiscSubclassDataTable structure and reports
> +  any generated data to smbios.
> +
> +Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +
> +**/
> +
> +#include "SmbiosMisc.h"
> +
> +/**
> +  This function makes boot time changes to the contents of the
> +  MiscSystemManufacturer (Type 1).
> +
> +  @param  RecordData                 Pointer to copy of RecordData from the Data Table.
> +
> +  @retval EFI_SUCCESS                All parameters were valid.
> +  @retval EFI_UNSUPPORTED            Unexpected RecordType value.
> +  @retval EFI_INVALID_PARAMETER      Invalid parameter was found.
> +
> +**/
> +MISC_SMBIOS_TABLE_FUNCTION(MiscSystemManufacturer)
> +{
> +  CHAR8                           *OptionalStrStart;
> +  UINTN                           ManuStrLen;
> +  UINTN                           VerStrLen;
> +  UINTN                           PdNameStrLen;
> +  UINTN                           SerialNumStrLen;
> +  UINTN                           SKUNumStrLen;
> +  UINTN                           FamilyStrLen;
> +  EFI_STRING                      Manufacturer;
> +  EFI_STRING                      ProductName;
> +  EFI_STRING                      Version;
> +  EFI_STRING                      SerialNumber;
> +  EFI_STRING                      SKUNumber;
> +  EFI_STRING                      Family;
> +  EFI_STRING_ID                   TokenToGet;
> +  EFI_SMBIOS_HANDLE               SmbiosHandle;
> +  SMBIOS_TABLE_TYPE1              *SmbiosRecord;
> +  SMBIOS_TABLE_TYPE1              *InputData;
> +  EFI_STATUS                      Status;
> +  EFI_STRING_ID                   TokenToUpdate;
> +  CHAR16                          *Product;
> +  CHAR16                          *pVersion;
> +
> +  //
> +  // First check for invalid parameters.
> +  //
> +  if (RecordData == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  InputData = (SMBIOS_TABLE_TYPE1 *)RecordData;
> +
> +  Product = (CHAR16 *) PcdGetPtr (PcdSystemProductName);
> +  if (StrLen (Product) > 0) {
> +    TokenToUpdate = STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME);
> +    HiiSetString (mHiiHandle, TokenToUpdate, Product, NULL);
> +  }
> +
> +  pVersion = (CHAR16 *) PcdGetPtr (PcdSystemVersion);
> +  if (StrLen (pVersion) > 0) {
> +    TokenToUpdate = STRING_TOKEN (STR_MISC_SYSTEM_VERSION);
> +    HiiSetString (mHiiHandle, TokenToUpdate, pVersion, NULL);
> +  }
> +  UpdateSmbiosInfo (mHiiHandle, STRING_TOKEN (STR_MISC_SYSTEM_SERIAL_NUMBER), SerialNumType01);
> +  UpdateSmbiosInfo (mHiiHandle, STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER), SystemManufacturerType01);
> +
> +  TokenToGet   = STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER);
> +  Manufacturer = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  ManuStrLen   = StrLen (Manufacturer);
> +
> +  TokenToGet   = STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME);
> +  ProductName  = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  PdNameStrLen = StrLen (ProductName);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_VERSION);
> +  Version    = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  VerStrLen  = StrLen (Version);
> +
> +  TokenToGet      = STRING_TOKEN (STR_MISC_SYSTEM_SERIAL_NUMBER);
> +  SerialNumber    = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  SerialNumStrLen = StrLen (SerialNumber);
> +
> +  TokenToGet   = STRING_TOKEN (STR_MISC_SYSTEM_SKU_NUMBER);
> +  SKUNumber    = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  SKUNumStrLen = StrLen (SKUNumber);
> +
> +  TokenToGet   = STRING_TOKEN (STR_MISC_SYSTEM_FAMILY);
> +  Family       = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  FamilyStrLen = StrLen (Family);
> +
> +  //
> +  // Two zeros following the last string.
> +  //
> +  SmbiosRecord = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE1) + ManuStrLen      + 1
> +                                                                + PdNameStrLen    + 1
> +                                                                + VerStrLen       + 1
> +                                                                + SerialNumStrLen + 1
> +                                                                + SKUNumStrLen    + 1
> +                                                                + FamilyStrLen    + 1 + 1);

Use temp variable instead.

> +
> +  if (SmbiosRecord == NULL) {
> +    Status = EFI_OUT_OF_RESOURCES;
> +    goto Exit;
> +  }
> +
> +  (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE1));
> +
> +  SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE1);
> +
> +  SmbiosRecord->Uuid = InputData->Uuid;
> +
> +  OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
> +  UnicodeStrToAsciiStrS (Manufacturer, OptionalStrStart, ManuStrLen + 1);
> +  UnicodeStrToAsciiStrS (ProductName,  OptionalStrStart + ManuStrLen + 1, PdNameStrLen + 1);
> +  UnicodeStrToAsciiStrS (Version,      OptionalStrStart + ManuStrLen + 1 + PdNameStrLen + 1, VerStrLen + 1);
> +  UnicodeStrToAsciiStrS (SerialNumber, OptionalStrStart + ManuStrLen + 1 + PdNameStrLen + 1 + VerStrLen + 1, SerialNumStrLen + 1);
> +  UnicodeStrToAsciiStrS (SKUNumber, OptionalStrStart + ManuStrLen + 1 + PdNameStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1, SKUNumStrLen + 1);
> +  UnicodeStrToAsciiStrS (Family, OptionalStrStart + ManuStrLen + 1 + PdNameStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + SKUNumStrLen + 1, FamilyStrLen + 1);

Temp var.

> +
> +  //
> +  // Now we have got the full smbios record, call smbios protocol to add this record.
> +  //
> +  Status = LogSmbiosData ((UINT8*)SmbiosRecord, &SmbiosHandle);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Smbios Type01 Table Log Failed! %r \n", __FUNCTION__, __LINE__, Status));
> +  }
> +
> +  FreePool (SmbiosRecord);
> +
> +Exit:
> +  if (Manufacturer != NULL) {
> +    FreePool (Manufacturer);
> +  }
> +
> +  if (ProductName != NULL) {
> +    FreePool (ProductName);
> +  }
> +
> +  if (Version != NULL) {
> +    FreePool (Version);
> +  }
> +
> +  if (SerialNumber != NULL) {
> +    FreePool (SerialNumber);
> +  }
> +
> +  if (SKUNumber != NULL) {
> +    FreePool (SKUNumber);
> +  }
> +
> +  if (Family != NULL) {
> +    FreePool (Family);
> +  }
> +
> +  return 0;
> +}
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturerData.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturerData.c
> new file mode 100644
> index 000000000000..ed55d87310e2
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturerData.c
> @@ -0,0 +1,51 @@
> +/*++
> +
> +Copyright (c) 2006 - 2009, 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
> +
> +Module Name:
> +
> +  MiscBaseBoardManufacturerData.c
> +
> +Abstract:
> +
> +  This file provide OEM to define Smbios Type2 Data
> +
> +Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +**/
> +
> +#include "SmbiosMisc.h"
> +
> +//
> +// Static (possibly build generated) Chassis Manufacturer data.
> +//
> +MISC_SMBIOS_TABLE_DATA(SMBIOS_TABLE_TYPE2, MiscBaseBoardManufacturer) = {
> +  {                                                       // Hdr
> +    EFI_SMBIOS_TYPE_BASEBOARD_INFORMATION,                // Type,
> +    0,                                                    // Length,
> +    0                                                     // Handle
> +  },
> +  1,                                                      // BaseBoardManufacturer
> +  2,                                                      // BaseBoardProductName
> +  3,                                                      // BaseBoardVersion
> +  4,                                                      // BaseBoardSerialNumber
> +  5,                                                      // BaseBoardAssetTag
> +  {                                                       // FeatureFlag
> +    1,                                                    // Motherboard           :1
> +    0,                                                    // RequiresDaughterCard  :1
> +    0,                                                    // Removable             :1
> +    1,                                                    // Replaceable           :1
> +    0,                                                    // HotSwappable          :1
> +    0                                                     // Reserved              :3
> +  },
> +  6,                                                      // BaseBoardChassisLocation
> +  0,                                                      // ChassisHandle;
> +  BaseBoardTypeMotherBoard,                               // BoardType;
> +  0,                                                      // NumberOfContainedObjectHandles;
> +  {
> +    0
> +  }                                                       // ContainedObjectHandles[1];
> +};
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturerFunction.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturerFunction.c
> new file mode 100644
> index 000000000000..0528651068c7
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturerFunction.c
> @@ -0,0 +1,184 @@
> +/** @file
> +
> +  Copyright (c) 2009 - 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
> +
> +Module Name:
> +
> +  MiscBaseBoardManufacturerFunction.c
> +
> +Abstract:
> +
> +  This driver parses the mSmbiosMiscDataTable structure and reports
> +  any generated data using SMBIOS protocol.
> +
> +Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +**/
> +
> +#include "SmbiosMisc.h"
> +
> +
> +/**
> +  This function makes basic board manufacturer to the contents of the
> +  Misc Base Board Manufacturer (Type 2).
> +
> +  @param  RecordData                 Pointer to copy of RecordData from the Data Table.
> +
> +  @retval EFI_SUCCESS                All parameters were valid.
> +  @retval EFI_UNSUPPORTED            Unexpected RecordType value.
> +  @retval EFI_INVALID_PARAMETER      Invalid parameter was found.
> +
> +**/
> +MISC_SMBIOS_TABLE_FUNCTION(MiscBaseBoardManufacturer)
> +{
> +  CHAR8                             *OptionalStrStart;
> +  UINTN                             ManuStrLen;
> +  UINTN                             ProductNameStrLen;
> +  UINTN                             VerStrLen;
> +  UINTN                             SerialNumStrLen;
> +  UINTN                             AssetTagStrLen;
> +  UINTN                             ChassisLocaStrLen;
> +  UINTN                             HandleCount = 0;
> +  UINT16                            *HandleArray = NULL;
> +  CHAR16                            *BaseBoardManufacturer;
> +  CHAR16                            *BaseBoardProductName;
> +  CHAR16                            *Version;
> +  EFI_STRING                        SerialNumber;
> +  EFI_STRING                        AssetTag;
> +  EFI_STRING                        ChassisLocation;
> +  EFI_STRING_ID                     TokenToGet;
> +  EFI_SMBIOS_HANDLE                 SmbiosHandle;
> +  SMBIOS_TABLE_TYPE2                *SmbiosRecord;
> +  SMBIOS_TABLE_TYPE2                *InputData = NULL;
> +  EFI_STATUS                        Status;
> +
> +  EFI_STRING_ID                     TokenToUpdate;
> +
> +  //
> +  // First check for invalid parameters.
> +  //
> +  if (RecordData == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  InputData = (SMBIOS_TABLE_TYPE2*)RecordData;
> +
> +  BaseBoardManufacturer = (CHAR16 *) PcdGetPtr (PcdBaseBoardManufacturer);
> +  if (StrLen (BaseBoardManufacturer) > 0) {
> +    TokenToUpdate = STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER);
> +    HiiSetString (mHiiHandle, TokenToUpdate, BaseBoardManufacturer, NULL);
> +  }
> +
> +  BaseBoardProductName = (CHAR16 *) PcdGetPtr (PcdBaseBoardProductName);
> +  if (StrLen (BaseBoardProductName) > 0) {
> +    TokenToUpdate = STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME);
> +    HiiSetString (mHiiHandle, TokenToUpdate, BaseBoardProductName, NULL);
> +  }
> +
> +  Version = (CHAR16 *) PcdGetPtr (PcdBaseBoardVersion);
> +  if (StrLen (Version) > 0) {
> +    TokenToUpdate = STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION);
> +    HiiSetString (mHiiHandle, TokenToUpdate, Version, NULL);
> +  }
> +
> +  UpdateSmbiosInfo (mHiiHandle, STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG), AssertTagType02);
> +  UpdateSmbiosInfo (mHiiHandle, STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER), SrNumType02);
> +  UpdateSmbiosInfo (mHiiHandle, STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER), BoardManufacturerType02);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER);
> +  BaseBoardManufacturer = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  ManuStrLen = StrLen (BaseBoardManufacturer);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME);
> +  BaseBoardProductName = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  ProductNameStrLen = StrLen (BaseBoardProductName);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION);
> +  Version = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  VerStrLen = StrLen (Version);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER);
> +  SerialNumber = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  SerialNumStrLen = StrLen (SerialNumber);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG);
> +  AssetTag = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  AssetTagStrLen = StrLen (AssetTag);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION);
> +  ChassisLocation = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  ChassisLocaStrLen = StrLen (ChassisLocation);
> +
> +  //
> +  // Two zeros following the last string.
> +  //
> +  SmbiosRecord = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE2) + ManuStrLen        + 1
> +                                                                + ProductNameStrLen + 1
> +                                                                + VerStrLen         + 1
> +                                                                + SerialNumStrLen   + 1
> +                                                                + AssetTagStrLen    + 1
> +                                                                + ChassisLocaStrLen + 1 + 1);

Use temp var instead.

> +  if (SmbiosRecord == NULL) {
> +    Status = EFI_OUT_OF_RESOURCES;
> +    goto Exit;
> +  }
> +
> +  (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE2));
> +  SmbiosRecord->Hdr.Length        = sizeof (SMBIOS_TABLE_TYPE2);
> +
> +  //
> +  //  Update Contained objects Handle
> +  //
> +  SmbiosRecord->NumberOfContainedObjectHandles = 0;
> +  GetLinkTypeHandle (EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE, &HandleArray, &HandleCount);
> +  if (HandleCount) {
> +    SmbiosRecord->ChassisHandle = HandleArray[0];
> +  }
> +
> +  FreePool(HandleArray);
> +
> +  OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
> +  UnicodeStrToAsciiStrS (BaseBoardManufacturer, OptionalStrStart, ManuStrLen + 1);
> +  UnicodeStrToAsciiStrS (BaseBoardProductName, OptionalStrStart + ManuStrLen + 1, ProductNameStrLen + 1);
> +  UnicodeStrToAsciiStrS (Version, OptionalStrStart + ManuStrLen + 1 + ProductNameStrLen + 1, VerStrLen + 1);
> +  UnicodeStrToAsciiStrS (SerialNumber, OptionalStrStart + ManuStrLen + 1 + ProductNameStrLen + 1 + VerStrLen + 1, SerialNumStrLen + 1);
> +  UnicodeStrToAsciiStrS (AssetTag, OptionalStrStart + ManuStrLen + 1 + ProductNameStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1, AssetTagStrLen + 1);
> +  UnicodeStrToAsciiStrS (ChassisLocation, OptionalStrStart + ManuStrLen + 1 + ProductNameStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssetTagStrLen + 1, ChassisLocaStrLen + 1);


Temp var.

> +
> +  Status = LogSmbiosData ((UINT8*)SmbiosRecord, &SmbiosHandle);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Smbios Type02 Table Log Failed! %r \n", __FUNCTION__, __LINE__, Status));

Wrap.

> +  }
> +
> +  FreePool (SmbiosRecord);
> +
> +Exit:
> +  if (BaseBoardManufacturer != NULL) {
> +    FreePool (BaseBoardManufacturer);
> +  }
> +
> +  if (BaseBoardProductName != NULL) {
> +    FreePool (BaseBoardProductName);
> +  }
> +
> +  if (Version != NULL) {
> +    FreePool (Version);
> +  }
> +
> +  if (SerialNumber != NULL) {
> +    FreePool (SerialNumber);
> +  }
> +
> +  if (AssetTag != NULL) {
> +    FreePool (AssetTag);
> +  }
> +
> +  if (ChassisLocation != NULL) {
> +    FreePool (ChassisLocation);
> +  }
> +
> +  return 0;
> +}
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerData.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerData.c
> new file mode 100644
> index 000000000000..25d1413ed873
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerData.c
> @@ -0,0 +1,58 @@
> +/*++
> +
> +Copyright (c) 2006 - 2009, 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
> +
> +Module Name:
> +
> +  MiscChassisManufacturerData.c
> +
> +Abstract:
> +
> +  This file provides Smbios Type3 Data
> +
> +Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +**/
> +
> +#include "SmbiosMisc.h"
> +
> +
> +//
> +// Static (possibly build generated) Chassis Manufacturer data.
> +//
> +MISC_SMBIOS_TABLE_DATA(SMBIOS_TABLE_TYPE3, MiscChassisManufacturer) = {
> +  {                                                       // Hdr
> +    EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE  ,                   // Type,
> +    0,                                                    // Length,
> +    0                                                     // Handle
> +  },
> +  1,                                                      // Manufactrurer
> +  MiscChassisTypeMainServerChassis,                       // Type
> +  2,                                                      // Version
> +  3,                                                      // SerialNumber
> +  4,                                                      // AssetTag
> +  ChassisStateSafe,                                       // BootupState
> +  ChassisStateSafe,                                       // PowerSupplyState
> +  ChassisStateSafe,                                       // ThermalState
> +  ChassisSecurityStatusNone,                              // SecurityState
> +  {
> +    0,                                                    // OemDefined[0]
> +    0,                                                    // OemDefined[1]
> +    0,                                                    // OemDefined[2]
> +    0                                                     // OemDefined[3]
> +  },
> +  2,                                                      // Height
> +  1,                                                      // NumberofPowerCords
> +  0,                                                      // ContainedElementCount
> +  0,                                                      // ContainedElementRecordLength
> +  {                                                       // ContainedElements[0]
> +    {
> +      0,                                                    // ContainedElementType
> +      0,                                                    // ContainedElementMinimum
> +      0                                                     // ContainedElementMaximum
> +    }
> +  }
> +};
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c
> new file mode 100644
> index 000000000000..84b4aaaeb89d
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c
> @@ -0,0 +1,182 @@
> +/** @file
> +
> +Copyright (c) 2009 - 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
> +
> +Module Name:
> +
> +  MiscChassisManufacturerFunction.c
> +
> +Abstract:
> +
> +  This driver parses the mMiscSubclassDataTable structure and reports
> +  any generated data to smbios.
> +
> +Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +**/
> +
> +#include "SmbiosMisc.h"
> +
> +UINT8
> +GetChassisType (
> +  VOID
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  UINT8                           ChassisType;
> +
> +  Status = OemGetChassisType (&ChassisType);
> +  if (EFI_ERROR (Status)) {
> +    return 0;
> +  }
> +
> +  return ChassisType;
> +}
> +
> +/**
> +  This function makes boot time changes to the contents of the
> +  MiscChassisManufacturer (Type 3).
> +
> +  @param  RecordData                 Pointer to copy of RecordData from the Data Table.
> +
> +  @retval EFI_SUCCESS                All parameters were valid.
> +  @retval EFI_UNSUPPORTED            Unexpected RecordType value.
> +  @retval EFI_INVALID_PARAMETER      Invalid parameter was found.
> +
> +**/
> +MISC_SMBIOS_TABLE_FUNCTION(MiscChassisManufacturer)
> +{
> +  CHAR8                           *OptionalStrStart;
> +  UINTN                           ManuStrLen;
> +  UINTN                           VerStrLen;
> +  UINTN                           AssertTagStrLen;
> +  UINTN                           SerialNumStrLen;
> +  UINTN                           ChaNumStrLen;
> +  EFI_STRING                      Manufacturer;
> +  EFI_STRING                      Version;
> +  EFI_STRING                      SerialNumber;
> +  EFI_STRING                      AssertTag;
> +  EFI_STRING                      ChassisSkuNumber;
> +  EFI_STRING_ID                   TokenToGet;
> +  EFI_SMBIOS_HANDLE               SmbiosHandle;
> +  SMBIOS_TABLE_TYPE3              *SmbiosRecord;
> +  SMBIOS_TABLE_TYPE3              *InputData;
> +  EFI_STATUS                      Status;
> +
> +  UINT8                           ContainedElementCount;
> +  CONTAINED_ELEMENT               ContainedElements = {0};
> +  UINT8                           ExtendLength = 0;
> +
> +  UINT8                           ChassisType;
> +
> +  //
> +  // First check for invalid parameters.
> +  //
> +  if (RecordData == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  InputData = (SMBIOS_TABLE_TYPE3 *)RecordData;
> +
> +  UpdateSmbiosInfo (mHiiHandle, STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG), AssetTagType03);
> +  UpdateSmbiosInfo (mHiiHandle, STRING_TOKEN (STR_MISC_CHASSIS_SERIAL_NUMBER), SrNumType03);
> +  UpdateSmbiosInfo (mHiiHandle, STRING_TOKEN (STR_MISC_CHASSIS_VERSION), VersionType03);
> +  UpdateSmbiosInfo (mHiiHandle, STRING_TOKEN (STR_MISC_CHASSIS_MANUFACTURER), ManufacturerType03);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_MANUFACTURER);
> +  Manufacturer = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  ManuStrLen = StrLen (Manufacturer);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_VERSION);
> +  Version = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  VerStrLen = StrLen (Version);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_SERIAL_NUMBER);
> +  SerialNumber = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  SerialNumStrLen = StrLen (SerialNumber);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG);
> +  AssertTag = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  AssertTagStrLen = StrLen (AssertTag);
> +
> +  TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_SKU_NUMBER);
> +  ChassisSkuNumber = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
> +  ChaNumStrLen = StrLen (ChassisSkuNumber);
> +
> +  ContainedElementCount = InputData->ContainedElementCount;
> +
> +  if (ContainedElementCount > 1) {
> +    ExtendLength = (ContainedElementCount - 1) * sizeof (CONTAINED_ELEMENT);
> +  }
> +
> +  //
> +  // Two zeros following the last string.
> +  //
> +  SmbiosRecord = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE3) + ExtendLength    + 1
> +                                                                + ManuStrLen      + 1
> +                                                                + VerStrLen       + 1
> +                                                                + SerialNumStrLen + 1
> +                                                                + AssertTagStrLen + 1
> +                                                                + ChaNumStrLen    + 1 + 1);

Use temp var.

> +  if (SmbiosRecord == NULL) {
> +    Status = EFI_OUT_OF_RESOURCES;
> +    goto Exit;
> +  }
> +
> +  (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE3));
> +
> +  SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE3) + ExtendLength + 1;
> +
> +  ChassisType = GetChassisType ();
> +  if (ChassisType != 0) {
> +    SmbiosRecord->Type  = ChassisType;
> +  }
> +
> +  //ContainedElements
> +  (VOID)CopyMem (SmbiosRecord + 1, &ContainedElements, ExtendLength);
> +
> +  //ChassisSkuNumber
> +  *((UINT8 *)SmbiosRecord + sizeof (SMBIOS_TABLE_TYPE3) + ExtendLength) = 5;
> +
> +  OptionalStrStart = (CHAR8 *)((UINT8 *)SmbiosRecord + sizeof (SMBIOS_TABLE_TYPE3) + ExtendLength + 1);
> +  UnicodeStrToAsciiStrS (Manufacturer,     OptionalStrStart, ManuStrLen + 1);
> +  UnicodeStrToAsciiStrS (Version, OptionalStrStart + ManuStrLen + 1, VerStrLen + 1);
> +  UnicodeStrToAsciiStrS (SerialNumber, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1, SerialNumStrLen + 1);
> +  UnicodeStrToAsciiStrS (AssertTag, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1, AssertTagStrLen + 1);
> +  UnicodeStrToAsciiStrS (ChassisSkuNumber, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen +1 + AssertTagStrLen + 1, ChaNumStrLen + 1);

Temp var.

> +  //
> +  // Now we have got the full smbios record, call smbios protocol to add this record.
> +  //
> +  Status = LogSmbiosData ((UINT8*)SmbiosRecord, &SmbiosHandle);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Smbios Type03 Table Log Failed! %r \n", __FUNCTION__, __LINE__, Status));

Wrap.

> +  }
> +
> +  FreePool (SmbiosRecord);
> +
> +Exit:
> +  if (Manufacturer != NULL) {
> +    FreePool (Manufacturer);
> +  }
> +
> +  if (Version != NULL) {
> +    FreePool (Version);
> +  }
> +
> +  if (SerialNumber != NULL) {
> +    FreePool (SerialNumber);
> +  }
> +
> +  if (AssertTag != NULL) {
> +    FreePool (AssertTag);
> +  }
> +
> +  if (ChassisSkuNumber != NULL) {
> +    FreePool (ChassisSkuNumber);
> +  }
> +
> +  return 0;
> +}
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguagesData.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguagesData.c
> new file mode 100644
> index 000000000000..fa4c574a82c5
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguagesData.c
> @@ -0,0 +1,39 @@
> +/**@file
> +
> +Copyright (c) 2006 - 2009, 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
> +
> +Module Name:
> +
> +  MiscNumberOfInstallableLanguagesData.c
> +
> +Abstract:
> +
> +  This file provides Smbios Type13 Data
> +
> +Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +**/
> +
> +#include "SmbiosMisc.h"
> +
> +//
> +// Static (possibly build generated) Bios Vendor data.
> +//
> +
> +MISC_SMBIOS_TABLE_DATA(SMBIOS_TABLE_TYPE13, MiscNumberOfInstallableLanguages) =
> +{
> +  {                                                     // Hdr
> +    EFI_SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION,            // Type,
> +    0,                                                    // Length,
> +    0                                                     // Handle
> +  },
> +  0,                                                    // InstallableLanguages
> +  0,                                                    // Flags
> +  {
> +    0                                                   // Reserved[15]
> +  },
> +  1                                                     // CurrentLanguage
> +};
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguagesFunction.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguagesFunction.c
> new file mode 100644
> index 000000000000..dc360aa74cea
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguagesFunction.c
> @@ -0,0 +1,154 @@
> +/** @file
> +
> +Copyright (c) 2009 - 2012, 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
> +
> +Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +**/
> +
> +#include "SmbiosMisc.h"
> +
> +/**
> +  Get next language from language code list (with separator ';').
> +
> +  @param  LangCode       Input: point to first language in the list. On
> +                         Otput: point to next language in the list, or
> +                                NULL if no more language in the list.
> +  @param  Lang           The first language in the list.
> +
> +**/
> +VOID
> +EFIAPI
> +GetNextLanguage (
> +  IN OUT CHAR8      **LangCode,
> +  OUT CHAR8         *Lang
> +  )
> +{
> +  UINTN  Index;
> +  CHAR8  *StringPtr;
> +
> +  if (LangCode == NULL || *LangCode == NULL || Lang == NULL) {
> +    return;
> +  }
> +
> +  Index     = 0;
> +  StringPtr = *LangCode;
> +  while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {
> +    Index++;
> +  }
> +
> +  (VOID)CopyMem (Lang, StringPtr, Index);
> +  Lang[Index] = 0;
> +
> +  if (StringPtr[Index] == ';') {
> +    Index++;
> +  }
> +  *LangCode = StringPtr + Index;
> +}
> +
> +/**
> +  This function returns the number of supported languages on HiiHandle.
> +
> +  @param   HiiHandle    The HII package list handle.
> +
> +  @retval  The number of supported languages.
> +
> +**/
> +UINT16
> +EFIAPI
> +GetSupportedLanguageNumber (
> +  IN EFI_HII_HANDLE    HiiHandle
> +  )
> +{
> +  CHAR8   *Lang;
> +  CHAR8   *Languages;
> +  CHAR8   *LanguageString;
> +  UINT16  LangNumber;
> +
> +  Languages = HiiGetSupportedLanguages (HiiHandle);
> +  if (Languages == NULL) {
> +    return 0;
> +  }
> +
> +  LangNumber = 0;
> +  Lang = AllocatePool (AsciiStrSize (Languages));
> +  if (Lang != NULL) {
> +    LanguageString = Languages;
> +    while (*LanguageString != 0) {
> +      GetNextLanguage (&LanguageString, Lang);
> +      LangNumber++;
> +    }
> +    FreePool (Lang);
> +  }
> +  FreePool (Languages);
> +  return LangNumber;
> +}
> +
> +
> +/**
> +  This function makes boot time changes to the contents of the
> +  MiscNumberOfInstallableLanguages (Type 13).
> +
> +  @param  RecordData                 Pointer to copy of RecordData from the Data Table.
> +
> +  @retval EFI_SUCCESS                All parameters were valid.
> +  @retval EFI_UNSUPPORTED            Unexpected RecordType value.
> +  @retval EFI_INVALID_PARAMETER      Invalid parameter was found.
> +
> +**/
> +MISC_SMBIOS_TABLE_FUNCTION(MiscNumberOfInstallableLanguages)
> +{
> +  UINTN                                     LangStrLen;
> +  CHAR8                                     CurrentLang[SMBIOS_STRING_MAX_LENGTH + 1];
> +  CHAR8                                     *OptionalStrStart;
> +  EFI_STATUS                                Status;
> +  EFI_SMBIOS_HANDLE                         SmbiosHandle;
> +  SMBIOS_TABLE_TYPE13                       *SmbiosRecord;
> +  SMBIOS_TABLE_TYPE13                       *InputData = NULL;;
> +
> +  //
> +  // First check for invalid parameters.
> +  //
> +  if (RecordData == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  InputData = (SMBIOS_TABLE_TYPE13 *)RecordData;
> +
> +  InputData->InstallableLanguages = GetSupportedLanguageNumber (mHiiHandle);
> +
> +  //
> +  // Try to check if current langcode matches with the langcodes in installed languages
> +  //
> +  ZeroMem (CurrentLang, SMBIOS_STRING_MAX_LENGTH - 1);
> +  (VOID)AsciiStrCpyS (CurrentLang, SMBIOS_STRING_MAX_LENGTH - 1, "en|US|iso8859-1");
> +  LangStrLen = AsciiStrLen (CurrentLang);
> +
> +  //
> +  // Two zeros following the last string.
> +  //
> +  SmbiosRecord = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE13) + LangStrLen + 1 + 1);
> +  if (SmbiosRecord == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE13));
> +
> +  SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE13);
> +
> +  OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
> +  (VOID)AsciiStrCpyS (OptionalStrStart, SMBIOS_STRING_MAX_LENGTH - 1, CurrentLang);
> +  //
> +  // Now we have got the full smbios record, call smbios protocol to add this record.
> +  //
> +  Status = LogSmbiosData ((UINT8*)SmbiosRecord, &SmbiosHandle);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Smbios Type13 Table Log Failed! %r \n", __FUNCTION__, __LINE__, Status));

Wrap.

> +  }
> +
> +  FreePool (SmbiosRecord);
> +  return Status;
> +}
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type32/MiscBootInformationData.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type32/MiscBootInformationData.c
> new file mode 100644
> index 000000000000..c00225a54005
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type32/MiscBootInformationData.c
> @@ -0,0 +1,41 @@
> +/**@file
> +
> +Copyright (c) 2006 - 2009, 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
> +
> +Module Name:
> +
> +  MiscBootInformationData.c
> +
> +Abstract:
> +
> +  This driver parses the mMiscSubclassDataTable structure and reports
> +  any generated data to the DataHub.
> +
> +Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +**/
> +
> +#include "SmbiosMisc.h"
> +
> +//
> +// Static (possibly build generated) Bios Vendor data.
> +//
> +MISC_SMBIOS_TABLE_DATA(SMBIOS_TABLE_TYPE32, MiscBootInformation) = {
> +  {                                                     // Hdr
> +    EFI_SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION,              // Type,
> +    0,                                                    // Length,
> +    0                                                     // Handle
> +  },
> +  {                                                     // Reserved[6]
> +    0,
> +    0,
> +    0,
> +    0,
> +    0,
> +    0
> +  },
> +  BootInformationStatusNoError                          // BootInformationStatus
> +};
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type32/MiscBootInformationFunction.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type32/MiscBootInformationFunction.c
> new file mode 100644
> index 000000000000..25da6de1bfa6
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type32/MiscBootInformationFunction.c
> @@ -0,0 +1,66 @@
> +/** @file
> +  boot information boot time changes.
> +  SMBIOS type 32.
> +
> +Copyright (c) 2009 - 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
> +
> +Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +**/
> +
> +#include "SmbiosMisc.h"
> +
> +/**
> +  This function makes boot time changes to the contents of the
> +  MiscBootInformation (Type 32).
> +
> +  @param  RecordData                 Pointer to copy of RecordData from the Data Table.
> +
> +  @retval EFI_SUCCESS                All parameters were valid.
> +  @retval EFI_UNSUPPORTED            Unexpected RecordType value.
> +  @retval EFI_INVALID_PARAMETER      Invalid parameter was found.
> +
> +**/
> +
> +MISC_SMBIOS_TABLE_FUNCTION(MiscBootInformation)
> +{
> +  EFI_STATUS                         Status;
> +  EFI_SMBIOS_HANDLE                  SmbiosHandle;
> +  SMBIOS_TABLE_TYPE32                *SmbiosRecord;
> +  SMBIOS_TABLE_TYPE32                *InputData;
> +
> +  //
> +  // First check for invalid parameters.
> +  //
> +  if (RecordData == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  InputData = (SMBIOS_TABLE_TYPE32 *)RecordData;
> +
> +  //
> +  // Two zeros following the last string.
> +  //
> +  SmbiosRecord = AllocateZeroPool (sizeof (SMBIOS_TABLE_TYPE32) + 1 + 1);
> +  if (SmbiosRecord == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE32));
> +
> +  SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE32);
> +
> +  //
> +  // Now we have got the full smbios record, call smbios protocol to add this record.
> +  //
> +  Status = LogSmbiosData ((UINT8*)SmbiosRecord, &SmbiosHandle);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Smbios Type32 Table Log Failed! %r \n", __FUNCTION__, __LINE__, Status));
> +  }
> +
> +  FreePool (SmbiosRecord);
> +  return Status;
> +}
> diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64Support.S b/ArmPkg/Library/ArmLib/AArch64/AArch64Support.S
> index 199374ff59e3..874bc2866ac3 100644
> --- a/ArmPkg/Library/ArmLib/AArch64/AArch64Support.S
> +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64Support.S
> @@ -424,6 +424,9 @@ ASM_FUNC(ArmCallWFI)
>    wfi
>    ret
>  
> +ASM_FUNC(ArmReadIdMmfr2)
> +  mrs   x0, ID_AA64MMFR2_EL1           // read EL1 MMFR2
> +  ret
>  

These mrs/mrc wrappers would make sense as a separate patch.

>  ASM_FUNC(ArmReadMpidr)
>    mrs   x0, mpidr_el1           // read EL1 MPIDR
> diff --git a/ArmPkg/Library/ArmLib/AArch64/ArmLibSupportV8.S b/ArmPkg/Library/ArmLib/AArch64/ArmLibSupportV8.S
> index 0e8d21e2264f..0ae75e4cb9f9 100644
> --- a/ArmPkg/Library/ArmLib/AArch64/ArmLibSupportV8.S
> +++ b/ArmPkg/Library/ArmLib/AArch64/ArmLibSupportV8.S
> @@ -84,7 +84,7 @@ ASM_FUNC(ArmDisableAllExceptions)
>    ret
>  
>  
> -// UINT32
> +// UINTN
>  // ReadCCSIDR (
>  //   IN UINT32 CSSELR
>  //   )
> diff --git a/ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.S b/ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.S
> index 01c91b10fcb7..39fdb0155065 100644
> --- a/ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.S
> +++ b/ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.S
> @@ -60,6 +60,10 @@ ASM_FUNC(ArmDisableInterrupts)
>    isb
>    bx      LR
>  
> +ASM_FUNC(ArmReadIdMmfr4):
> +  mrc    p15,0,r0,c0,c2,6     @ Read ID_MMFR4 Register
> +  bx     lr
> +
>  // UINT32
>  // ReadCCSIDR (
>  //   IN UINT32 CSSELR
> diff --git a/ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.asm b/ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.asm
> index 26ffa331b929..d1bbb0a0fc98 100644
> --- a/ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.asm
> +++ b/ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.asm
> @@ -64,7 +64,11 @@
>    isb
>    bx      LR
>  
> -// UINT32
> + RVCT_ASM_EXPORT ArmReadIdMmfr4
> +  mrc    p15,0,r0,c0,c2,6     ; Read ID_MMFR2 Register
> +  bx
> +
> +// UINTN
>  // ReadCCSIDR (
>  //   IN UINT32 CSSELR
>  //   )
> diff --git a/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassStrings.uni b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassStrings.uni
> new file mode 100644
> index 000000000000..0f55beb95276
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassStrings.uni
> @@ -0,0 +1,23 @@
> +???///// @file

No BOM needed in .uni files - use plain UTF-8. (throughout)

/
    Leif

> +//
> +//  Copyright (c) 2015, Hisilicon Limited. All rights reserved.
> +//  Copyright (c) 2015, Linaro Limited. All rights reserved.
> +//
> +//  SPDX-License-Identifier: BSD-2-Clause-Patent
> +//
> +/////
> +
> +/=#
> +
> +#langdef en-US "English"
> +
> +//
> +// Processor Information
> +//
> +#string STR_PROCESSOR_SOCKET_DESIGNATION    #language en-US  "Not Specified"
> +#string STR_PROCESSOR_MANUFACTURE           #language en-US  "Not Specified"
> +#string STR_PROCESSOR_VERSION               #language en-US  "Not Specified"
> +#string STR_PROCESSOR_SERIAL_NUMBER         #language en-US  "Not Specified"
> +#string STR_PROCESSOR_ASSET_TAG             #language en-US  "Not Specified"
> +#string STR_PROCESSOR_PART_NUMBER           #language en-US  "Not Specified"
> +#string STR_PROCESSOR_UNKNOWN               #language en-US  "Unknown"
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscLibString.uni b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscLibString.uni
> new file mode 100644
> index 000000000000..7a82e520904e
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/SmbiosMiscLibString.uni
> @@ -0,0 +1,21 @@
> +???// *++
> +//
> +// 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
> +//
> +// Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +// --*/
> +
> +
> +/=#
> +
> +#langdef en-US "English"
> +
> +#include "./Type00/MiscBiosVendor.uni"
> +#include "./Type01/MiscSystemManufacturer.uni"
> +#include "./Type02/MiscBaseBoardManufacturer.uni"
> +#include "./Type03/MiscChassisManufacturer.uni"
> +#include "./Type13/MiscNumberOfInstallableLanguages.uni"
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type00/MiscBiosVendor.uni b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type00/MiscBiosVendor.uni
> new file mode 100644
> index 000000000000..cf14e477d260
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type00/MiscBiosVendor.uni
> @@ -0,0 +1,18 @@
> +???// *++
> +//
> +// 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
> +//
> +// Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +// --*/
> +
> +/=#
> +
> +#string STR_MISC_BIOS_VENDOR           #language en-US  "Not Specified"
> +#string STR_MISC_BIOS_VERSION          #language en-US  "Not Specified"
> +#string STR_MISC_BIOS_RELEASE_DATE     #language en-US  "Not Specified"
> +#string STR_MISC_BIOS_VENDOR           #language en-US  "Not Specified"
> +#string STR_MISC_BIOS_RELEASE_DATE     #language en-US  "01/01/2020"
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type01/MiscSystemManufacturer.uni b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type01/MiscSystemManufacturer.uni
> new file mode 100644
> index 000000000000..417a5986c79e
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type01/MiscSystemManufacturer.uni
> @@ -0,0 +1,21 @@
> +???// *++
> +//
> +// 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
> +//
> +// Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +// --*/
> +
> +/=#
> +
> +#string STR_MISC_SYSTEM_MANUFACTURER   #language en-US  "Not Specified"
> +#string STR_MISC_SYSTEM_PRODUCT_NAME   #language en-US  "Not Specified"
> +#string STR_MISC_SYSTEM_PRODUCT_NAME   #language en-US  "Not Specified"
> +#string STR_MISC_SYSTEM_VERSION        #language en-US  "Not Specified"
> +#string STR_MISC_SYSTEM_VERSION        #language en-US  "Not Specified"
> +#string STR_MISC_SYSTEM_SERIAL_NUMBER  #language en-US  "Not Specified"
> +#string STR_MISC_SYSTEM_SKU_NUMBER     #language en-US  "Not Specified"
> +#string STR_MISC_SYSTEM_FAMILY         #language en-US  "Not Specified"
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturer.uni b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturer.uni
> new file mode 100644
> index 000000000000..96398d837752
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturer.uni
> @@ -0,0 +1,21 @@
> +???// *++
> +//
> +// 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
> +//
> +// Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +// --*/
> +
> +/=#
> +
> +#string STR_MISC_BASE_BOARD_MANUFACTURER     #language en-US  "Not Specified"
> +#string STR_MISC_BASE_BOARD_PRODUCT_NAME     #language en-US  "Not Specified"
> +#string STR_MISC_BASE_BOARD_PRODUCT_NAME     #language en-US  "Not Specified"
> +#string STR_MISC_BASE_BOARD_VERSION          #language en-US  "Not Specified"
> +#string STR_MISC_BASE_BOARD_VERSION          #language en-US  "Not Specified"
> +#string STR_MISC_BASE_BOARD_SERIAL_NUMBER    #language en-US  "Not Specified"
> +#string STR_MISC_BASE_BOARD_ASSET_TAG        #language en-US  "Not Specified"
> +#string STR_MISC_BASE_BOARD_CHASSIS_LOCATION #language en-US  "Not Specified"
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturer.uni b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturer.uni
> new file mode 100644
> index 000000000000..a2b9500f94c5
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturer.uni
> @@ -0,0 +1,18 @@
> +???// *++
> +//
> +// 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
> +//
> +// Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +// --*/
> +
> +/=#
> +
> +#string STR_MISC_CHASSIS_MANUFACTURER  #language en-US  "Not Specified"
> +#string STR_MISC_CHASSIS_VERSION       #language en-US  "Not Specified"
> +#string STR_MISC_CHASSIS_SERIAL_NUMBER #language en-US  "Not Specified"
> +#string STR_MISC_CHASSIS_ASSET_TAG     #language en-US  "Not Specified"
> +#string STR_MISC_CHASSIS_SKU_NUMBER    #language en-US  "Not Specified"
> diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguages.uni b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguages.uni
> new file mode 100644
> index 000000000000..559003369f21
> --- /dev/null
> +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type13/MiscNumberOfInstallableLanguages.uni
> @@ -0,0 +1,43 @@
> +???// *++
> +//
> +// 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
> +//
> +// Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
> +// --*/
> +
> +/=#
> +
> +/=#
> +//
> +// Language String (Long Format)
> +//
> +#string STR_MISC_BIOS_LANGUAGES_ENG_LONG        #language en-US  "en|US|iso8859-1"
> +#string STR_MISC_BIOS_LANGUAGES_FRA_LONG        #language en-US  "fr|CA|iso8859-1"
> +#string STR_MISC_BIOS_LANGUAGES_CHN_LONG        #language en-US  "zh|TW|unicode"
> +#string STR_MISC_BIOS_LANGUAGES_JPN_LONG        #language en-US  "ja|JP|unicode"
> +#string STR_MISC_BIOS_LANGUAGES_ITA_LONG        #language en-US  "it|IT|iso8859-1"
> +#string STR_MISC_BIOS_LANGUAGES_SPA_LONG        #language en-US  "es|ES|iso8859-1"
> +#string STR_MISC_BIOS_LANGUAGES_GER_LONG        #language en-US  "de|DE|iso8859-1"
> +#string STR_MISC_BIOS_LANGUAGES_POR_LONG        #language en-US  "pt|PT|iso8859-1"
> +
> +
> +//
> +// Language String (Abbreviated Format)
> +//
> +#string STR_MISC_BIOS_LANGUAGES_ENG_ABBREVIATE  #language en-US  "enUS"
> +#string STR_MISC_BIOS_LANGUAGES_FRA_ABBREVIATE  #language en-US  "frCA"
> +#string STR_MISC_BIOS_LANGUAGES_CHN_ABBREVIATE  #language en-US  "zhTW"
> +#string STR_MISC_BIOS_LANGUAGES_JPN_ABBREVIATE  #language en-US  "jaJP"
> +#string STR_MISC_BIOS_LANGUAGES_ITA_ABBREVIATE  #language en-US  "itIT"
> +#string STR_MISC_BIOS_LANGUAGES_SPA_ABBREVIATE  #language en-US  "esES"
> +#string STR_MISC_BIOS_LANGUAGES_GER_ABBREVIATE  #language en-US  "deDE"
> +#string STR_MISC_BIOS_LANGUAGES_POR_ABBREVIATE  #language en-US  "ptPT"
> +
> +#string STR_MISC_BIOS_LANGUAGES_SIMPLECH_ABBREVIATE  #language en-US  "zhCN"
> +#string STR_MISC_BIOS_LANGUAGES_SIMPLECH_LONG        #language en-US  "zh|CN|unicode"
> +
> +
> -- 
> 2.26.2
> 


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





More information about the edk2-devel-archive mailing list