diff mbox

ARMVE:SMBIOS: Enable smbios support on all ARMVE platform

Message ID 1378998573-9186-2-git-send-email-yi.li@linaro.org
State New
Headers show

Commit Message

Yi Li Sept. 12, 2013, 3:09 p.m. UTC
From: liyi <yi.li@linaro.org>

  Enable the smbios support for all ARMVE platforms.

  SMBIOS driver will fill real h/w informations into UEFI image,and
report them to OS,like x86 system.

Signed-off-by: liyi <yi.li@linaro.org>
---
 ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.c         |  841 ++++++++++++++++++++
 ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.h         |   53 ++
 ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf       |   64 ++
 .../ArmVExpressPkg/ArmVExpress-CTA15-A7.dsc        |    6 +
 .../ArmVExpressPkg/ArmVExpress-CTA15-A7.fdf        |    6 +
 .../ArmVExpressPkg/ArmVExpress-CTA15x2.dsc         |    6 +
 .../ArmVExpressPkg/ArmVExpress-CTA15x2.fdf         |    6 +
 .../ArmVExpressPkg/ArmVExpress-CTA5s.dsc           |    6 +
 .../ArmVExpressPkg/ArmVExpress-CTA5s.fdf           |    6 +
 .../ArmVExpressPkg/ArmVExpress-CTA9x4.dsc          |    6 +
 .../ArmVExpressPkg/ArmVExpress-CTA9x4.fdf          |    6 +
 .../ArmVExpressPkg/ArmVExpress-RTSM-A15.dsc        |    6 +
 .../ArmVExpressPkg/ArmVExpress-RTSM-A15.fdf        |    6 +
 .../ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.dsc |    8 +-
 .../ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.fdf |    6 +
 .../ArmVExpressPkg/ArmVExpress-RTSM-A9x4.dsc       |    6 +
 .../ArmVExpressPkg/ArmVExpress-RTSM-A9x4.fdf       |    6 +
 17 files changed, 1043 insertions(+), 1 deletion(-)
 create mode 100644 ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.c
 create mode 100644 ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.h
 create mode 100644 ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf

Comments

Steven Kinney Sept. 25, 2013, 12:52 p.m. UTC | #1
Hi Yi,

               One comment regarding the patch and non-existing files
(*dsc) and the like, targeted by this patch, relative to the current
tianocore-edk2 and resulting uefi-next codebase.  I don't think patches
targeting future file(s) benefit us prior to their inclusion within either
tianocore-edk2 or direct addition into uefi-next via topic branch patch.
 There are a number of ways this could create undue stress, in the future,
when the patch has a sane codebase.  IMHO, we should only create patches
for current source in either existing uefi-next or tianocore-edk2 source
code, not future source code that may change significantly between patch
generation and its eventual application.  I am using you previous patch,
which does not include the future source code, not present in the current
tianocore-edk2.  I see no value in creating patches based on a possible
source code revision; to many permutations possible prior to the patches
application.

Thanks,

Steve


On 12 September 2013 10:09, Yi Li <yi.li@linaro.org> wrote:

> From: liyi <yi.li@linaro.org>
>
>   Enable the smbios support for all ARMVE platforms.
>
>   SMBIOS driver will fill real h/w informations into UEFI image,and
> report them to OS,like x86 system.
>
> Signed-off-by: liyi <yi.li@linaro.org>
> ---
>  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.c         |  841
> ++++++++++++++++++++
>  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.h         |   53 ++
>  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf       |   64 ++
>  .../ArmVExpressPkg/ArmVExpress-CTA15-A7.dsc        |    6 +
>  .../ArmVExpressPkg/ArmVExpress-CTA15-A7.fdf        |    6 +
>  .../ArmVExpressPkg/ArmVExpress-CTA15x2.dsc         |    6 +
>  .../ArmVExpressPkg/ArmVExpress-CTA15x2.fdf         |    6 +
>  .../ArmVExpressPkg/ArmVExpress-CTA5s.dsc           |    6 +
>  .../ArmVExpressPkg/ArmVExpress-CTA5s.fdf           |    6 +
>  .../ArmVExpressPkg/ArmVExpress-CTA9x4.dsc          |    6 +
>  .../ArmVExpressPkg/ArmVExpress-CTA9x4.fdf          |    6 +
>  .../ArmVExpressPkg/ArmVExpress-RTSM-A15.dsc        |    6 +
>  .../ArmVExpressPkg/ArmVExpress-RTSM-A15.fdf        |    6 +
>  .../ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.dsc |    8 +-
>  .../ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.fdf |    6 +
>  .../ArmVExpressPkg/ArmVExpress-RTSM-A9x4.dsc       |    6 +
>  .../ArmVExpressPkg/ArmVExpress-RTSM-A9x4.fdf       |    6 +
>  17 files changed, 1043 insertions(+), 1 deletion(-)
>  create mode 100644 ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.c
>  create mode 100644 ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.h
>  create mode 100644 ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
>
> diff --git a/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.c
> b/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.c
> new file mode 100644
> index 0000000..84a8acd
> --- /dev/null
> +++ b/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.c
> @@ -0,0 +1,841 @@
> +/** @file
> +  This code responsible for constructing and updating SMBIOS table into
> system table.
> +Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution.  The full text of the license may be
> found at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
> IMPLIED.
> +
> +SMBIOS Driver.
> +
> +yi.li@linaro.org
> +Copyright (c) 2013 Linaro.org
> +
> +  This program and the accompanying materials are licensed and
> +made available under the terms and conditions of the BSD License
> +which accompanies this distribution.  The full text of the license
> +may be found at: http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
> IMPLIED.
> +**/
> +
> +#include "UpdateSmbios.h"
> +
> +
> +/***********************************************************************
> +       SMBIOS data definition  TYPE0  BIOS Information
> +************************************************************************/
> +
> +SMBIOS_TABLE_TYPE0 mBIOSInfoType0 = {
> +  { EFI_SMBIOS_TYPE_BIOS_INFORMATION, sizeof (SMBIOS_TABLE_TYPE0), 0 },
> +  1,                    // Vendor String
> +  2,                    // BiosVersion String
> +  0xE000,               // BiosSegment
> +  3,                    // BiosReleaseDate String
> +  0x7F,                 // BiosSize
> +  {                     // BiosCharacteristics
> +    0,    //  Reserved                          :2;  ///< Bits 0-1.
> +    0,    //  Unknown                           :1;
> +    0,    //  BiosCharacteristicsNotSupported   :1;
> +    0,    //  IsaIsSupported                    :1;
> +    0,    //  McaIsSupported                    :1;
> +    0,    //  EisaIsSupported                   :1;
> +    1,    //  PciIsSupported                    :1;
> +    0,    //  PcmciaIsSupported                 :1;
> +    0,    //  PlugAndPlayIsSupported            :1;
> +    0,    //  ApmIsSupported                    :1;
> +    1,    //  BiosIsUpgradable                  :1;
> +    1,    //  BiosShadowingAllowed              :1;
> +    0,    //  VlVesaIsSupported                 :1;
> +    0,    //  EscdSupportIsAvailable            :1;
> +    0,    //  BootFromCdIsSupported             :1;
> +    1,    //  SelectableBootIsSupported         :1;
> +    0,    //  RomBiosIsSocketed                 :1;
> +    0,    //  BootFromPcmciaIsSupported         :1;
> +    0,    //  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; ///< Bits 32-63.
> Bits 32-47 reserved for BIOS vendor
> +                                                 ///< and bits 48-63
> reserved for System Vendor.
> +  },
> +  {       // BIOSCharacteristicsExtensionBytes[]
> +    0x81, //  AcpiIsSupported                   :1;
> +          //  UsbLegacyIsSupported              :1;
> +          //  AgpIsSupported                    :1;
> +          //  I2OBootIsSupported                :1;
> +          //  Ls120BootIsSupported              :1;
> +          //  AtapiZipDriveBootIsSupported      :1;
> +          //  Boot1394IsSupported               :1;
> +          //  SmartBatteryIsSupported           :1;
> +                  //  BIOSCharacteristicsExtensionBytes[1]
> +    0x0a, //  BiosBootSpecIsSupported              :1;
> +          //  FunctionKeyNetworkBootIsSupported    :1;
> +          //  TargetContentDistributionEnabled     :1;
> +          //  UefiSpecificationSupported           :1;
> +          //  VirtualMachineSupported              :1;
> +          //  ExtensionByte2Reserved               :3;
> +  },
> +  0x00,                    // SystemBiosMajorRelease
> +  0x01,                    // SystemBiosMinorRelease
> +  0xFF,                    // EmbeddedControllerFirmwareMajorRelease
> +  0xFF,                    // EmbeddedControllerFirmwareMinorRelease
> +};
> +
> +
> +CHAR8 *mBIOSInfoType0Strings[] = {
> +  "edk2.sourceforge.net",     // Vendor String
> +  __TIME__,                   // BiosVersion String
> +  __DATE__,                   // BiosReleaseDate String
> +  NULL
> +};
> +
> +
> +/***********************************************************************
> +       SMBIOS data definition  TYPE1  System Information
> +************************************************************************/
> +SMBIOS_TABLE_TYPE1 mSysInfoType1 = {
> +  { EFI_SMBIOS_TYPE_SYSTEM_INFORMATION, sizeof (SMBIOS_TABLE_TYPE1), 0 },
> +  1,    // Manufacturer String
> +  2,    // ProductName String
> +  3,    // Version String
> +  4,    // SerialNumber String
> +  { 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6,
> 0x7C, 0x02 } },
> +  SystemWakeupTypePowerSwitch,
> +  5,    // SKUNumber String
> +  6,    // Family String
> +};
> +CHAR8  *mSysInfoType1Strings[] = {
> +  "edk2.sourceforge.net",
> +  "EmulatorPkg",
> +  "1.0",
> +  "System Serial#",
> +  "System SKU#",
> +  "edk2",
> +  NULL
> +};
> +
> +/***********************************************************************
> +       SMBIOS data definition  TYPE2  Board Information
> +************************************************************************/
> +
> +SMBIOS_TABLE_TYPE2  mBoardInfoType2 = {
> +  { EFI_SMBIOS_TYPE_BASEBOARD_INFORMATION, sizeof (SMBIOS_TABLE_TYPE2), 0
> },
> +  1,    // Manufacturer String
> +  2,    // ProductName String
> +  3,    // Version String
> +  4,    // SerialNumber String
> +  5,    // AssetTag String
> +  {     // FeatureFlag
> +    1,    //  Motherboard           :1;
> +    0,    //  RequiresDaughterCard  :1;
> +    0,    //  Removable             :1;
> +    0,    //  Replaceable           :1;
> +    0,    //  HotSwappable          :1;
> +    0,    //  Reserved              :3;
> +  },
> +  6,    // LocationInChassis String
> +  0,                        // ChassisHandle;
> +  BaseBoardTypeMotherBoard, // BoardType;
> +  0,                        // NumberOfContainedObjectHandles;
> +  { 0 }                     // ContainedObjectHandles[1];
> +};
> +CHAR8  *mBoardInfoType2Strings[] = {
> +  "edk2.sourceforge.net",
> +  "EmulatorPkg",
> +  "1.0",
> +  "Base Board Serial#",
> +  "Base Board Asset Tag#",
> +  "Part Component",
> +  NULL
> +};
> +
> +
> +/***********************************************************************
> +       SMBIOS data definition  TYPE3  Enclosure Information
> +************************************************************************/
> +
> +SMBIOS_TABLE_TYPE3  mEnclosureInfoType3 = {
> +  { EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE, sizeof (SMBIOS_TABLE_TYPE3), 0 },
> +  1,                        // Manufacturer String
> +  MiscChassisTypeLapTop,    // Type;
> +  2,                        // Version String
> +  3,                        // SerialNumber String
> +  4,                        // AssetTag String
> +  ChassisStateSafe,         // BootupState;
> +  ChassisStateSafe,         // PowerSupplyState;
> +  ChassisStateSafe,         // ThermalState;
> +  ChassisSecurityStatusNone,// SecurityStatus;
> +  { 0, 0, 0, 0 },           // OemDefined[4];
> +  0,    // Height;
> +  0,    // NumberofPowerCords;
> +  0,    // ContainedElementCount;
> +  0,    // ContainedElementRecordLength;
> +  { 0 },    // ContainedElements[1];
> +};
> +CHAR8  *mEnclosureInfoType3Strings[] = {
> +  "edk2.sourceforge.net",
> +  "EmulatorPkg",
> +  "Chassis Board Serial#",
> +  "Chassis Board Asset Tag#",
> +  NULL
> +};
> +
> +
> +
> +/***********************************************************************
> +       SMBIOS data definition  TYPE4  Processor Information
> +************************************************************************/
> +
> +SMBIOS_TABLE_TYPE4 mProcessorInfoType4 = {
> +
> +  { EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION, sizeof (SMBIOS_TABLE_TYPE4),
> 0},
> +
> +  1,                    // Socket String
> +  ProcessorOther,       // ProcessorType;          ///< The enumeration
> value from PROCESSOR_TYPE_DATA.
> +  ProcessorFamilyOther, // ProcessorFamily;        ///< The enumeration
> value from PROCESSOR_FAMILY_DATA.
> +  2,                    // ProcessorManufacture String;
> +  {                     // ProcessorId;
> +    {  // PROCESSOR_SIGNATURE
> +      0, //  ProcessorSteppingId:4;
> +      0, //  ProcessorModel:     4;
> +      0, //  ProcessorFamily:    4;
> +      0, //  ProcessorType:      2;
> +      0, //  ProcessorReserved1: 2;
> +      0, //  ProcessorXModel:    4;
> +      0, //  ProcessorXFamily:   8;
> +      0, //  ProcessorReserved2: 4;
> +    },
> +
> +    {  // PROCESSOR_FEATURE_FLAGS
> +      0, //  ProcessorFpu       :1;
> +      0, //  ProcessorVme       :1;
> +      0, //  ProcessorDe        :1;
> +      0, //  ProcessorPse       :1;
> +      0, //  ProcessorTsc       :1;
> +      0, //  ProcessorMsr       :1;
> +      0, //  ProcessorPae       :1;
> +      0, //  ProcessorMce       :1;
> +      0, //  ProcessorCx8       :1;
> +      0, //  ProcessorApic      :1;
> +      0, //  ProcessorReserved1 :1;
> +      0, //  ProcessorSep       :1;
> +      0, //  ProcessorMtrr      :1;
> +      0, //  ProcessorPge       :1;
> +      0, //  ProcessorMca       :1;
> +      0, //  ProcessorCmov      :1;
> +      0, //  ProcessorPat       :1;
> +      0, //  ProcessorPse36     :1;
> +      0, //  ProcessorPsn       :1;
> +      0, //  ProcessorClfsh     :1;
> +      0, //  ProcessorReserved2 :1;
> +      0, //  ProcessorDs        :1;
> +      0, //  ProcessorAcpi      :1;
> +      0, //  ProcessorMmx       :1;
> +      0, //  ProcessorFxsr      :1;
> +      0, //  ProcessorSse       :1;
> +      0, //  ProcessorSse2      :1;
> +      0, //  ProcessorSs        :1;
> +      0, //  ProcessorReserved3 :1;
> +      0, //  ProcessorTm        :1;
> +      0, //  ProcessorReserved4 :2;
> +    }
> +  },
> +  3,                    // ProcessorVersion String;
> +  {                     // Voltage;
> +    1,  // ProcessorVoltageCapability5V        :1;
> +    1,  // ProcessorVoltageCapability3_3V      :1;
> +    1,  // ProcessorVoltageCapability2_9V      :1;
> +    0,  // ProcessorVoltageCapabilityReserved  :1; ///< Bit 3, must be
> zero.
> +    0,  // ProcessorVoltageReserved            :3; ///< Bits 4-6, must be
> zero.
> +    0   // ProcessorVoltageIndicateLegacy      :1;
> +  },
> +  0,                      // ExternalClock;
> +  0,                      // MaxSpeed;
> +  0,                      // CurrentSpeed;
> +  0x41,                   // Status;
> +  ProcessorUpgradeOther,  // ProcessorUpgrade;      ///< The enumeration
> value from PROCESSOR_UPGRADE.
> +  0,                      // L1CacheHandle;
> +  0,                      // L2CacheHandle;
> +  0,                      // L3CacheHandle;
> +  4,                      // SerialNumber;
> +  5,                      // AssetTag;
> +  6,                      // PartNumber;
> +  0,                      // CoreCount;
> +  0,                      // EnabledCoreCount;
> +  0,                      // ThreadCount;
> +  0,                      // ProcessorCharacteristics;
> +  0,                      // ProcessorFamily2;
> +};
> +
> +
> +CHAR8 *mProcessorInfoType4Strings[] = {
> +  "Socket",
> +  "edk2.svn.sourceforge.net",
> +  "Emulated Processor",
> +  "1.0",
> +  "1.0",
> +  "1.0",
> +  NULL
> +};
> +
> +
> +/***********************************************************************
> +       SMBIOS data definition  TYPE7  Cache Information
> +************************************************************************/
> +
> +SMBIOS_TABLE_TYPE7  mCacheInfoType7 = {
> +  { EFI_SMBIOS_TYPE_CACHE_INFORMATION, sizeof (SMBIOS_TABLE_TYPE7), 0 },
> +  1,                        // SocketDesignation String
> +  0x018A,                                      // Cache Configuration
> +  0x00FF,                                      // Maximum Size 256k
> +  0x00FF,                                      // Install Size 256k
> +  {                         // Supported SRAM Type
> +       0,  //Other             :1
> +       0,  //Unknown           :1
> +       0,  //NonBurst          :1
> +       1,  //Burst             :1
> +       0,  //PiplelineBurst    :1
> +       1,  //Synchronous       :1
> +       0,  //Asynchronous      :1
> +       0       //Reserved          :9
> +  },
> +  {                         // Current SRAM Type
> +       0,  //Other             :1
> +       0,  //Unknown           :1
> +       0,  //NonBurst          :1
> +       1,  //Burst             :1
> +       0,  //PiplelineBurst    :1
> +       1,  //Synchronous       :1
> +       0,  //Asynchronous      :1
> +       0       //Reserved          :9
> +  },
> +  0,                                           // Cache Speed unknown
> +  CacheErrorMultiBit,          // Error Correction Multi
> +  CacheTypeUnknown,                    // System Cache Type
> +  CacheAssociativity2Way       // Associativity
> +};
> +CHAR8  *mCacheInfoType7Strings[] = {
> +  "Cache1",
> +  NULL
> +};
> +
> +
> +/***********************************************************************
> +       SMBIOS data definition  TYPE9  System Slot Information
> +************************************************************************/
> +
> +SMBIOS_TABLE_TYPE9  mSysSlotInfoType9 = {
> +  { EFI_SMBIOS_TYPE_SYSTEM_SLOTS, sizeof (SMBIOS_TABLE_TYPE9), 0 },
> +  1,    // SlotDesignation String
> +  SlotTypeOther,          // SlotType;                 ///< The
> enumeration value from MISC_SLOT_TYPE.
> +  SlotDataBusWidthOther,  // SlotDataBusWidth;         ///< The
> enumeration value from MISC_SLOT_DATA_BUS_WIDTH.
> +  SlotUsageAvailable,    // CurrentUsage;             ///< The
> enumeration value from MISC_SLOT_USAGE.
> +  SlotLengthOther,    // SlotLength;               ///< The enumeration
> value from MISC_SLOT_LENGTH.
> +  0,    // SlotID;
> +  {    // SlotCharacteristics1;
> +    1,  // CharacteristicsUnknown  :1;
> +    0,  // Provides50Volts         :1;
> +    0,  // Provides33Volts         :1;
> +    0,  // SharedSlot              :1;
> +    0,  // PcCard16Supported       :1;
> +    0,  // CardBusSupported        :1;
> +    0,  // ZoomVideoSupported      :1;
> +    0,  // ModemRingResumeSupported:1;
> +  },
> +  {     // SlotCharacteristics2;
> +    0,  // PmeSignalSupported      :1;
> +    0,  // HotPlugDevicesSupported :1;
> +    0,  // SmbusSignalSupported    :1;
> +    0,  // Reserved                :5;  ///< Set to 0.
> +  },
> +  0,    // SegmentGroupNum;
> +  0,    // BusNum;
> +  0,    // DevFuncNum;
> +};
> +CHAR8  *mSysSlotInfoType9Strings[] = {
> +  "SD Card",
> +  NULL
> +};
> +
> +/***********************************************************************
> +       SMBIOS data definition  TYPE16  Physical Memory ArrayInformation
> +************************************************************************/
> +
> +SMBIOS_TABLE_TYPE16 mPhyMemArrayInfoType16 = {
> +  { EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, sizeof (SMBIOS_TABLE_TYPE16),
> 0 },
> +  MemoryArrayLocationSystemBoard, // Location;                       ///<
> The enumeration value from MEMORY_ARRAY_LOCATION.
> +  MemoryArrayUseSystemMemory,     // Use;                            ///<
> The enumeration value from MEMORY_ARRAY_USE.
> +  MemoryErrorCorrectionUnknown,   // MemoryErrorCorrection;          ///<
> The enumeration value from MEMORY_ERROR_CORRECTION.
> +  0x80000000,                     // MaximumCapacity;
> +  0xFFFE,                         // MemoryErrorInformationHandle;
> +  1,                              // NumberOfMemoryDevices;
> +  0x3fffffffffffffffULL,          // ExtendedMaximumCapacity;
> +};
> +CHAR8 *mPhyMemArrayInfoType16Strings[] = {
> +  NULL
> +};
> +
> +/***********************************************************************
> +       SMBIOS data definition  TYPE17  Memory Device Information
> +************************************************************************/
> +
> +SMBIOS_TABLE_TYPE17 mMemDevInfoType17 = {
> +  { EFI_SMBIOS_TYPE_MEMORY_DEVICE, sizeof (SMBIOS_TABLE_TYPE17), 0 },
> +  0,          // MemoryArrayHandle;
> +  0xFFFE,     // MemoryErrorInformationHandle;
> +  0xFFFF,     // TotalWidth;
> +  0xFFFF,     // DataWidth;
> +  0xFFFF,     // Size;
> +  MemoryFormFactorUnknown, // FormFactor;                     ///< The
> enumeration value from MEMORY_FORM_FACTOR.
> +  0xff,       // DeviceSet;
> +  1,          // DeviceLocator String
> +  2,          // BankLocator String
> +  MemoryTypeDram,         // MemoryType;                     ///< The
> enumeration value from MEMORY_DEVICE_TYPE.
> +  {           // TypeDetail;
> +    0,  // Reserved        :1;
> +    0,  // Other           :1;
> +    1,  // Unknown         :1;
> +    0,  // FastPaged       :1;
> +    0,  // StaticColumn    :1;
> +    0,  // PseudoStatic    :1;
> +    0,  // Rambus          :1;
> +    0,  // Synchronous     :1;
> +    0,  // Cmos            :1;
> +    0,  // Edo             :1;
> +    0,  // WindowDram      :1;
> +    0,  // CacheDram       :1;
> +    0,  // Nonvolatile     :1;
> +    0,  // Registered      :1;
> +    0,  // Unbuffered      :1;
> +    0,  // Reserved1       :1;
> +  },
> +  0,          // Speed;
> +  3,          // Manufacturer String
> +  0,          // SerialNumber String
> +  0,          // AssetTag String
> +  0,          // PartNumber String
> +  0,          // Attributes;
> +  0,          // ExtendedSize;
> +  0,          // ConfiguredMemoryClockSpeed;
> +};
> +CHAR8 *mMemDevInfoType17Strings[] = {
> +  "OS Virtual Memory",
> +  "malloc",
> +  "OSV",
> +  NULL
> +};
> +
> +/***********************************************************************
> +       SMBIOS data definition  TYPE19  Memory Array Mapped Address
> Information
> +************************************************************************/
> +
> +SMBIOS_TABLE_TYPE19 mMemArrMapInfoType19 = {
> +  { EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, sizeof
> (SMBIOS_TABLE_TYPE19), 0 },
> +  0x80000000, // StartingAddress;
> +  0xbfffffff, // EndingAddress;
> +  0,          // MemoryArrayHandle;
> +  1,          // PartitionWidth;
> +  0,          // ExtendedStartingAddress;
> +  0,          // ExtendedEndingAddress;
> +};
> +CHAR8 *mMemArrMapInfoType19Strings[] = {
> +  NULL
> +};
> +
> +
> +
> +
> +/***********************************************************************
> +       SMBIOS data definition  TYPE32  Boot Information
> +************************************************************************/
> +
> +SMBIOS_TABLE_TYPE32 mBootInfoType32 = {
> +  { EFI_SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, sizeof
> (SMBIOS_TABLE_TYPE32), 0 },
> +  { 0, 0, 0, 0, 0, 0 },         // Reserved[6];
> +  BootInformationStatusNoError  // BootStatus
> +};
> +
> +CHAR8 *mBootInfoType32Strings[] = {
> +  NULL
> +};
> +
> +
> +/**
> +
> +  Create SMBIOS record.
> +
> +  Converts a fixed SMBIOS structure and an array of pointers to strings
> into
> +  an SMBIOS record where the strings are cat'ed on the end of the fixed
> record
> +  and terminated via a double NULL and add to SMBIOS table.
> +
> +  SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
> +    { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof
> (SMBIOS_TABLE_TYPE12), 0 },
> +    1 // StringCount
> +  };
> +
> +  CHAR8 *gSmbiosType12Strings[] = {
> +    "Not Found",
> +    NULL
> +  };
> +
> +  ...
> +
> +  LogSmbiosData (
> +    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> +    gSmbiosType12Strings
> +    );
> +
> +  @param  Template    Fixed SMBIOS structure, required.
> +  @param  StringArray Array of strings to convert to an SMBIOS string
> pack.
> +                      NULL is OK.
> +**/
> +
> +
> +EFI_STATUS
> +EFIAPI
> +LogSmbiosData (
> +  IN  EFI_SMBIOS_TABLE_HEADER *Template,
> +  IN  CHAR8                   **StringPack
> +  )
> +{
> +
> +  EFI_STATUS                Status;
> +  EFI_SMBIOS_PROTOCOL       *Smbios;
> +  EFI_SMBIOS_HANDLE         SmbiosHandle;
> +  EFI_SMBIOS_TABLE_HEADER   *Record;
> +  UINTN                     Index;
> +  UINTN                     StringSize;
> +  UINTN                     Size;
> +  CHAR8                     *Str;
> +
> +  //
> +  // Locate Smbios protocol.
> +  //
> +
> +  Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID
> **)&Smbios);
> +
> +  if (EFI_ERROR (Status)) {
> +
> +    return Status;
> +
> +  }
> +
> +
> +  // Calculate the size of the fixed record and optional string pack
> +
> +  Size = Template->Length;
> +
> +  if (StringPack == NULL) {
> +
> +    // At least a double null is required
> +
> +    Size += 2;
> +
> +  } else {
> +
> +    for (Index = 0; StringPack[Index] != NULL; Index++) {
> +
> +      StringSize = AsciiStrSize (StringPack[Index]);
> +
> +      Size += StringSize;
> +
> +    }
> +
> +    if (StringPack[0] == NULL) {
> +
> +      // At least a double null is required
> +
> +      Size += 1;
> +
> +    }
> +
> +    // Don't forget the terminating double null
> +
> +    Size += 1;
> +
> +  }
> +
> +
> +
> +  // Copy over Template
> +  Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
> +
> +  if (Record == NULL) {
> +
> +    return EFI_OUT_OF_RESOURCES;
> +
> +  }
> +
> +  CopyMem (Record, Template, Template->Length);
> +
> +
> +
> +  // Append string pack
> +
> +  Str = ((CHAR8 *)Record) + Record->Length;
> +
> +
> +
> +  for (Index = 0; StringPack[Index] != NULL; Index++) {
> +
> +    StringSize = AsciiStrSize (StringPack[Index]);
> +
> +    CopyMem (Str, StringPack[Index], StringSize);
> +
> +    Str += StringSize;
> +
> +  }
> +
> +  *Str = 0;
> +
> +  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> +
> +  Status = Smbios->Add (
> +                     Smbios,
> +                     gImageHandle,
> +                     &SmbiosHandle,
> +                     Record
> +                     );
> +
> +  ASSERT_EFI_ERROR (Status);
> +
> +  FreePool (Record);
> +
> +  return Status;
> +
> +}
> +
> +
> +
> +/***********************************************************************
> +       SMBIOS data update  TYPE0  BIOS Information
> +************************************************************************/
> +
> +
> +VOID
> +BIOSInfoUpdateSmbiosType0 (
> +  VOID
> +  )
> +
> +{
> +
> +  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mBIOSInfoType0,
> mBIOSInfoType0Strings);
> +
> +}
> +
> +
> +
> +/***********************************************************************
> +       SMBIOS data update  TYPE1  System Information
> +************************************************************************/
> +VOID
> +SysInfoUpdateSmbiosType1 (
> +  VOID
> +  )
> +
> +{
> +
> +  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mSysInfoType1,
> mSysInfoType1Strings);
> +
> +}
> +
> +/***********************************************************************
> +       SMBIOS data update  TYPE2  Board Information
> +************************************************************************/
> +VOID
> +BoardInfoUpdateSmbiosType2 (
> +  VOID
> +  )
> +
> +{
> +
> +  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mBoardInfoType2,
> mBoardInfoType2Strings);
> +
> +}
> +
> +/***********************************************************************
> +       SMBIOS data update  TYPE3  Enclosure Information
> +************************************************************************/
> +VOID
> +EnclosureInfoUpdateSmbiosType3 (
> +  VOID
> +  )
> +
> +{
> +
> +  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mEnclosureInfoType3,
> mEnclosureInfoType3Strings);
> +
> +}
> +
> +
> +/***********************************************************************
> +       SMBIOS data update  TYPE4  Processor Information
> +************************************************************************/
> +
> +
> +VOID
> +
> +ProcessorInfoUpdateSmbiosType4 (
> +
> +  IN UINTN MaxCpus
> +
> +  )
> +
> +{
> +
> +  mProcessorInfoType4.CoreCount        = (UINT8) MaxCpus;
> +
> +  mProcessorInfoType4.EnabledCoreCount = (UINT8) MaxCpus;
> +
> +  mProcessorInfoType4.ThreadCount      = (UINT8) MaxCpus;
> +
> +
> +
> +  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mProcessorInfoType4,
> mProcessorInfoType4Strings);
> +
> +}
> +
> +
> +/***********************************************************************
> +       SMBIOS data update  TYPE7  Cache Information
> +************************************************************************/
> +VOID
> +CacheInfoUpdateSmbiosType7 (
> +  VOID
> +  )
> +
> +{
> +
> +  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mCacheInfoType7,
> mCacheInfoType7Strings);
> +
> +}
> +
> +/***********************************************************************
> +       SMBIOS data update  TYPE9  System Slot Information
> +************************************************************************/
> +VOID
> +SysSlotInfoUpdateSmbiosType9 (
> +  VOID
> +  )
> +
> +{
> +
> +  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mSysSlotInfoType9,
> mSysSlotInfoType9Strings);
> +
> +}
> +
> +/***********************************************************************
> +       SMBIOS data update  TYPE16  Physical Memory Array Information
> +************************************************************************/
> +VOID
> +PhyMemArrayInfoUpdateSmbiosType16 (
> +  VOID
> +  )
> +
> +{
> +
> +  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mPhyMemArrayInfoType16,
> mPhyMemArrayInfoType16Strings);
> +
> +}
> +
> +/***********************************************************************
> +       SMBIOS data update  TYPE17  Memory Device Information
> +************************************************************************/
> +VOID
> +MemDevInfoUpdateSmbiosType17 (
> +  VOID
> +  )
> +
> +{
> +
> +  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mMemDevInfoType17,
> mMemDevInfoType17Strings);
> +
> +}
> +
> +/***********************************************************************
> +       SMBIOS data update  TYPE19  Memory Array Map Information
> +************************************************************************/
> +VOID
> +MemArrMapInfoUpdateSmbiosType19 (
> +  VOID
> +  )
> +
> +{
> +
> +  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mMemArrMapInfoType19,
> mMemArrMapInfoType19Strings);
> +
> +}
> +
> +
> +/***********************************************************************
> +       SMBIOS data update  TYPE32  Boot Information
> +************************************************************************/
> +VOID
> +BootInfoUpdateSmbiosType32 (
> +  VOID
> +  )
> +
> +{
> +
> +  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mBootInfoType32,
> mBootInfoType32Strings);
> +
> +}
> +
> +
> +/***********************************************************************
> +       Driver Entry
> +************************************************************************/
> +
> +EFI_STATUS
> +
> +EFIAPI
> +
> +UpdateSmbios (
> +
> +  IN EFI_HANDLE        ImageHandle,
> +
> +  IN EFI_SYSTEM_TABLE  *SystemTable
> +
> +  )
> +
> +{
> +
> +  BIOSInfoUpdateSmbiosType0();
> +
> +  SysInfoUpdateSmbiosType1();
> +
> +  BoardInfoUpdateSmbiosType2();
> +
> +  EnclosureInfoUpdateSmbiosType3();
> +
> +  ProcessorInfoUpdateSmbiosType4 (2);
> +
> +  CacheInfoUpdateSmbiosType7();
> +
> +  SysSlotInfoUpdateSmbiosType9();
> +
> +  PhyMemArrayInfoUpdateSmbiosType16();
> +
> +  MemDevInfoUpdateSmbiosType17();
> +
> +  MemArrMapInfoUpdateSmbiosType19();
> +
> +  BootInfoUpdateSmbiosType32();
> +
> +  return EFI_SUCCESS;
> +
> +}
> diff --git a/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.h
> b/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.h
> new file mode 100644
> index 0000000..5757dc7
> --- /dev/null
> +++ b/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.h
> @@ -0,0 +1,53 @@
> +/** @file
> +Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution.  The full text of the license may be
> found at
> +http://opensource.org/licenses/bsd-license.php
> +
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
> IMPLIED.
> +
> +SMBIOS Driver.
> +
> +yi.li@linaro.org
> +Copyright (c) 2013 Linaro.org
> +
> +  This program and the accompanying materials are licensed and
> +made available under the terms and conditions of the BSD License
> +which accompanies this distribution.  The full text of the license
> +may be found at: http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
> IMPLIED.
> +**/
> +
> +
> +
> +#ifndef _UPDATE_SMBIOS_DRIVER_H_
> +#define _UPDATE_SMBIOS_DRIVER_H_
> +
> +
> +#include <PiDxe.h>
> +#include <Protocol/Smbios.h>
> +#include <IndustryStandard/SmBios.h>
> +#include <Guid/SmBios.h>
> +#include <Library/DebugLib.h>
> +#include <Library/UefiDriverEntryPoint.h>
> +#include <Library/UefiLib.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/PcdLib.h>
> +
> +
> +EFI_STATUS
> +EFIAPI
> +UpdateSmbios (
> +  IN EFI_HANDLE        ImageHandle,
> +  IN EFI_SYSTEM_TABLE  *SystemTable
> +  );
> +#endif
> +
> diff --git a/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
> b/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
> new file mode 100644
> index 0000000..9f8b994
> --- /dev/null
> +++ b/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
> @@ -0,0 +1,64 @@
> +## @file
> +#
> +# Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
> +#
> +#  This program and the accompanying materials
> +#  are licensed and made available under the terms and conditions of the
> BSD License
> +#  which accompanies this distribution. The full text of the license may
> be found at
> +#  http://opensource.org/licenses/bsd-license.php
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
> IMPLIED.
> +#
> +##
> +
> +# SMBIOS Driver.
> +#
> +# yi.li@linaro.org
> +# Copyright (c) 2013 Linaro.org
> +#
> +#   This program and the accompanying materials are licensed and
> +# made available under the terms and conditions of the BSD License
> +# which accompanies this distribution.  The full text of the license
> +# may be found at: http://opensource.org/licenses/bsd-license.php
> +
> +#   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> +# BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> +# EXPRESS OR IMPLIED.
> +
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = UpdateSmbios
> +  FILE_GUID                      = 3847D23F-1D95-4772-B60C-4BBFBC4D532F
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  ENTRY_POINT                    = UpdateSmbios
> +
> +[Sources]
> +  UpdateSmbios.c
> +  UpdateSmbios.h
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  ArmPlatformPkg/ArmPlatformPkg.dec
> +
> +[LibraryClasses]
> +  UefiBootServicesTableLib
> +  MemoryAllocationLib
> +  BaseMemoryLib
> +  BaseLib
> +  UefiLib
> +  UefiDriverEntryPoint
> +  DebugLib
> +  PcdLib
> +
> +[Protocols]
> +  gEfiSmbiosProtocolGuid                        # PROTOCOL
> SOMETIMES_CONSUMED
> +
> +[Guids]
> +
> +[Depex]
> +  gEfiSmbiosProtocolGuid
> +
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.dsc
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.dsc
> index 6237e16..aa09ac7 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.dsc
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.dsc
> @@ -253,6 +253,12 @@
>    EmbeddedPkg/SerialDxe/SerialDxe.inf
>
>    MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
> +
> +  #
> +  # SMBIOS Support
> +  #
> +  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
>
>    ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
>    ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.fdf
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.fdf
> index a7cc384..a21afb4 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.fdf
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.fdf
> @@ -82,6 +82,12 @@ READ_LOCK_STATUS   = TRUE
>    INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
>
>    INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
> +
> +  #
> +  # SMBIOS Support
> +  #
> +  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
>
>    #
>    # Multiple Console IO support
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.dsc
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.dsc
> index 37765e9..382fdd6 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.dsc
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.dsc
> @@ -276,6 +276,12 @@
>
>    MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
>
> +  #
> +  # SMBIOS Support
> +  #
> +  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
> +
>    ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
>    ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
>    ArmPlatformPkg/Drivers/SP804TimerDxe/SP804TimerDxe.inf
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.fdf
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.fdf
> index c3e5a90..1fa1d67 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.fdf
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.fdf
> @@ -141,6 +141,12 @@ READ_LOCK_STATUS   = TRUE
>
>    INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
>
> +  #
> +  # SMBIOS Support
> +  #
> +  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
> +
>    INF ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
>    INF ArmPlatformPkg/Drivers/SP804TimerDxe/SP804TimerDxe.inf
>    INF ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.dsc
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.dsc
> index b4ce234..fd98a4a 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.dsc
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.dsc
> @@ -270,6 +270,12 @@
>
>    MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
>
> +  #
> +  # SMBIOS Support
> +  #
> +  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
> +
>    ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
>    ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
>    ArmPlatformPkg/Drivers/SP804TimerDxe/SP804TimerDxe.inf
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.fdf
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.fdf
> index c3e5a90..1fa1d67 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.fdf
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.fdf
> @@ -141,6 +141,12 @@ READ_LOCK_STATUS   = TRUE
>
>    INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
>
> +  #
> +  # SMBIOS Support
> +  #
> +  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
> +
>    INF ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
>    INF ArmPlatformPkg/Drivers/SP804TimerDxe/SP804TimerDxe.inf
>    INF ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.dsc
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.dsc
> index 10e58b7..d11f87e 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.dsc
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.dsc
> @@ -284,6 +284,12 @@
>    EmbeddedPkg/SerialDxe/SerialDxe.inf
>
>    MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
> +
> +  #
> +  # SMBIOS Support
> +  #
> +  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
>
>    ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
>    ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.fdf
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.fdf
> index d94a721..523c364 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.fdf
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.fdf
> @@ -186,6 +186,12 @@ READ_LOCK_STATUS   = TRUE
>    INF EmbeddedPkg/SerialDxe/SerialDxe.inf
>
>    INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
> +
> +  #
> +  # SMBIOS Support
> +  #
> +  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
>
>    INF ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
>    INF ArmPlatformPkg/Drivers/SP804TimerDxe/SP804TimerDxe.inf
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.dsc
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.dsc
> index 0920313..04aefb0 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.dsc
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.dsc
> @@ -245,6 +245,12 @@
>    EmbeddedPkg/SerialDxe/SerialDxe.inf
>
>    MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
> +
> +  #
> +  # SMBIOS Support
> +  #
> +  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
>
>    ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
>    ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.fdf
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.fdf
> index 71c66b8..8ec50f9 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.fdf
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.fdf
> @@ -128,6 +128,12 @@ READ_LOCK_STATUS   = TRUE
>    INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
>
>    INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
> +
> +  #
> +  # SMBIOS Support
> +  #
> +  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
>
>    #
>    # Networking stack
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.dsc
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.dsc
> index bb74bdc..751508e 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.dsc
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.dsc
> @@ -247,7 +247,13 @@
>    EmbeddedPkg/SerialDxe/SerialDxe.inf
>
>    MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
> -
> +
> +  #
> +  # SMBIOS Support
> +  #
> +  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
> +
>    ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
>    ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
>    ArmPkg/Drivers/TimerDxe/TimerDxe.inf
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.fdf
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.fdf
> index c1d8f31..91b2f8f 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.fdf
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.fdf
> @@ -146,6 +146,12 @@ READ_LOCK_STATUS   = TRUE
>    INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
>    INF ArmPlatformPkg/Drivers/LAN91xDxe/LAN91xDxe.inf
>
> +  #
> +  # SMBIOS Support
> +  #
> +  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
> +
>    #
>    # Multiple Console IO support
>    #
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.dsc
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.dsc
> index df17f64..6f2e5f2 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.dsc
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.dsc
> @@ -257,6 +257,12 @@
>
>    MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
>
> +  #
> +  # SMBIOS Support
> +  #
> +  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
> +
>    ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
>    ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
>    ArmPlatformPkg/Drivers/SP804TimerDxe/SP804TimerDxe.inf
> diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.fdf
> b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.fdf
> index a8e99fd..ba3bf8f 100644
> --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.fdf
> +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.fdf
> @@ -127,6 +127,12 @@ READ_LOCK_STATUS   = TRUE
>    INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
>
>    INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
> +
> +  #
> +  # SMBIOS Support
> +  #
> +  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
> +  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
>
>    #
>    # Networking stack
> --
> 1.7.9.5
>
>
diff mbox

Patch

diff --git a/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.c b/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.c
new file mode 100644
index 0000000..84a8acd
--- /dev/null
+++ b/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.c
@@ -0,0 +1,841 @@ 
+/** @file
+  This code responsible for constructing and updating SMBIOS table into system table.
+Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+SMBIOS Driver.
+
+yi.li@linaro.org
+Copyright (c) 2013 Linaro.org
+
+  This program and the accompanying materials are licensed and
+made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license
+may be found at: http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+**/
+
+#include "UpdateSmbios.h"
+
+
+/***********************************************************************
+	SMBIOS data definition  TYPE0  BIOS Information
+************************************************************************/
+
+SMBIOS_TABLE_TYPE0 mBIOSInfoType0 = {
+  { EFI_SMBIOS_TYPE_BIOS_INFORMATION, sizeof (SMBIOS_TABLE_TYPE0), 0 },
+  1,                    // Vendor String
+  2,                    // BiosVersion String
+  0xE000,               // BiosSegment
+  3,                    // BiosReleaseDate String
+  0x7F,                 // BiosSize
+  {                     // BiosCharacteristics
+    0,    //  Reserved                          :2;  ///< Bits 0-1.
+    0,    //  Unknown                           :1;
+    0,    //  BiosCharacteristicsNotSupported   :1;
+    0,    //  IsaIsSupported                    :1;
+    0,    //  McaIsSupported                    :1;
+    0,    //  EisaIsSupported                   :1;
+    1,    //  PciIsSupported                    :1;
+    0,    //  PcmciaIsSupported                 :1;
+    0,    //  PlugAndPlayIsSupported            :1;
+    0,    //  ApmIsSupported                    :1;
+    1,    //  BiosIsUpgradable                  :1;
+    1,    //  BiosShadowingAllowed              :1;
+    0,    //  VlVesaIsSupported                 :1;
+    0,    //  EscdSupportIsAvailable            :1;
+    0,    //  BootFromCdIsSupported             :1;
+    1,    //  SelectableBootIsSupported         :1;
+    0,    //  RomBiosIsSocketed                 :1;
+    0,    //  BootFromPcmciaIsSupported         :1;
+    0,    //  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; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor
+                                                 ///< and bits 48-63 reserved for System Vendor.
+  },
+  {       // BIOSCharacteristicsExtensionBytes[]
+    0x81, //  AcpiIsSupported                   :1;
+          //  UsbLegacyIsSupported              :1;
+          //  AgpIsSupported                    :1;
+          //  I2OBootIsSupported                :1;
+          //  Ls120BootIsSupported              :1;
+          //  AtapiZipDriveBootIsSupported      :1;
+          //  Boot1394IsSupported               :1;
+          //  SmartBatteryIsSupported           :1;
+                  //  BIOSCharacteristicsExtensionBytes[1]
+    0x0a, //  BiosBootSpecIsSupported              :1;
+          //  FunctionKeyNetworkBootIsSupported    :1;
+          //  TargetContentDistributionEnabled     :1;
+          //  UefiSpecificationSupported           :1;
+          //  VirtualMachineSupported              :1;
+          //  ExtensionByte2Reserved               :3;
+  },
+  0x00,                    // SystemBiosMajorRelease
+  0x01,                    // SystemBiosMinorRelease
+  0xFF,                    // EmbeddedControllerFirmwareMajorRelease
+  0xFF,                    // EmbeddedControllerFirmwareMinorRelease
+};
+
+
+CHAR8 *mBIOSInfoType0Strings[] = {
+  "edk2.sourceforge.net",     // Vendor String
+  __TIME__,                   // BiosVersion String
+  __DATE__,                   // BiosReleaseDate String
+  NULL
+};
+
+
+/***********************************************************************
+	SMBIOS data definition  TYPE1  System Information
+************************************************************************/
+SMBIOS_TABLE_TYPE1 mSysInfoType1 = {
+  { EFI_SMBIOS_TYPE_SYSTEM_INFORMATION, sizeof (SMBIOS_TABLE_TYPE1), 0 },
+  1,    // Manufacturer String
+  2,    // ProductName String
+  3,    // Version String
+  4,    // SerialNumber String
+  { 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6, 0x7C, 0x02 } },
+  SystemWakeupTypePowerSwitch,
+  5,    // SKUNumber String
+  6,    // Family String
+};
+CHAR8  *mSysInfoType1Strings[] = {
+  "edk2.sourceforge.net",
+  "EmulatorPkg",
+  "1.0",
+  "System Serial#",
+  "System SKU#",
+  "edk2",
+  NULL
+};
+
+/***********************************************************************
+	SMBIOS data definition  TYPE2  Board Information
+************************************************************************/
+
+SMBIOS_TABLE_TYPE2  mBoardInfoType2 = {
+  { EFI_SMBIOS_TYPE_BASEBOARD_INFORMATION, sizeof (SMBIOS_TABLE_TYPE2), 0 },
+  1,    // Manufacturer String
+  2,    // ProductName String
+  3,    // Version String
+  4,    // SerialNumber String
+  5,    // AssetTag String
+  {     // FeatureFlag
+    1,    //  Motherboard           :1;
+    0,    //  RequiresDaughterCard  :1;
+    0,    //  Removable             :1;
+    0,    //  Replaceable           :1;
+    0,    //  HotSwappable          :1;
+    0,    //  Reserved              :3;
+  },
+  6,    // LocationInChassis String
+  0,                        // ChassisHandle;
+  BaseBoardTypeMotherBoard, // BoardType;
+  0,                        // NumberOfContainedObjectHandles;
+  { 0 }                     // ContainedObjectHandles[1];
+};
+CHAR8  *mBoardInfoType2Strings[] = {
+  "edk2.sourceforge.net",
+  "EmulatorPkg",
+  "1.0",
+  "Base Board Serial#",
+  "Base Board Asset Tag#",
+  "Part Component",
+  NULL
+};
+
+
+/***********************************************************************
+	SMBIOS data definition  TYPE3  Enclosure Information
+************************************************************************/
+
+SMBIOS_TABLE_TYPE3  mEnclosureInfoType3 = {
+  { EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE, sizeof (SMBIOS_TABLE_TYPE3), 0 },
+  1,                        // Manufacturer String
+  MiscChassisTypeLapTop,    // Type;
+  2,                        // Version String
+  3,                        // SerialNumber String
+  4,                        // AssetTag String
+  ChassisStateSafe,         // BootupState;
+  ChassisStateSafe,         // PowerSupplyState;
+  ChassisStateSafe,         // ThermalState;
+  ChassisSecurityStatusNone,// SecurityStatus;
+  { 0, 0, 0, 0 },           // OemDefined[4];
+  0,    // Height;
+  0,    // NumberofPowerCords;
+  0,    // ContainedElementCount;
+  0,    // ContainedElementRecordLength;
+  { 0 },    // ContainedElements[1];
+};
+CHAR8  *mEnclosureInfoType3Strings[] = {
+  "edk2.sourceforge.net",
+  "EmulatorPkg",
+  "Chassis Board Serial#",
+  "Chassis Board Asset Tag#",
+  NULL
+};
+
+
+
+/***********************************************************************
+	SMBIOS data definition  TYPE4  Processor Information
+************************************************************************/
+
+SMBIOS_TABLE_TYPE4 mProcessorInfoType4 = {
+
+  { EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION, sizeof (SMBIOS_TABLE_TYPE4), 0},
+
+  1,                    // Socket String
+  ProcessorOther,       // ProcessorType;          ///< The enumeration value from PROCESSOR_TYPE_DATA.
+  ProcessorFamilyOther, // ProcessorFamily;        ///< The enumeration value from PROCESSOR_FAMILY_DATA.
+  2,                    // ProcessorManufacture String;
+  {                     // ProcessorId;
+    {  // PROCESSOR_SIGNATURE
+      0, //  ProcessorSteppingId:4;
+      0, //  ProcessorModel:     4;
+      0, //  ProcessorFamily:    4;
+      0, //  ProcessorType:      2;
+      0, //  ProcessorReserved1: 2;
+      0, //  ProcessorXModel:    4;
+      0, //  ProcessorXFamily:   8;
+      0, //  ProcessorReserved2: 4;
+    },
+
+    {  // PROCESSOR_FEATURE_FLAGS
+      0, //  ProcessorFpu       :1;
+      0, //  ProcessorVme       :1;
+      0, //  ProcessorDe        :1;
+      0, //  ProcessorPse       :1;
+      0, //  ProcessorTsc       :1;
+      0, //  ProcessorMsr       :1;
+      0, //  ProcessorPae       :1;
+      0, //  ProcessorMce       :1;
+      0, //  ProcessorCx8       :1;
+      0, //  ProcessorApic      :1;
+      0, //  ProcessorReserved1 :1;
+      0, //  ProcessorSep       :1;
+      0, //  ProcessorMtrr      :1;
+      0, //  ProcessorPge       :1;
+      0, //  ProcessorMca       :1;
+      0, //  ProcessorCmov      :1;
+      0, //  ProcessorPat       :1;
+      0, //  ProcessorPse36     :1;
+      0, //  ProcessorPsn       :1;
+      0, //  ProcessorClfsh     :1;
+      0, //  ProcessorReserved2 :1;
+      0, //  ProcessorDs        :1;
+      0, //  ProcessorAcpi      :1;
+      0, //  ProcessorMmx       :1;
+      0, //  ProcessorFxsr      :1;
+      0, //  ProcessorSse       :1;
+      0, //  ProcessorSse2      :1;
+      0, //  ProcessorSs        :1;
+      0, //  ProcessorReserved3 :1;
+      0, //  ProcessorTm        :1;
+      0, //  ProcessorReserved4 :2;
+    }
+  },
+  3,                    // ProcessorVersion String;
+  {                     // Voltage;
+    1,  // ProcessorVoltageCapability5V        :1;
+    1,  // ProcessorVoltageCapability3_3V      :1;
+    1,  // ProcessorVoltageCapability2_9V      :1;
+    0,  // ProcessorVoltageCapabilityReserved  :1; ///< Bit 3, must be zero.
+    0,  // ProcessorVoltageReserved            :3; ///< Bits 4-6, must be zero.
+    0   // ProcessorVoltageIndicateLegacy      :1;
+  },
+  0,                      // ExternalClock;
+  0,                      // MaxSpeed;
+  0,                      // CurrentSpeed;
+  0x41,                   // Status;
+  ProcessorUpgradeOther,  // ProcessorUpgrade;      ///< The enumeration value from PROCESSOR_UPGRADE.
+  0,                      // L1CacheHandle;
+  0,                      // L2CacheHandle;
+  0,                      // L3CacheHandle;
+  4,                      // SerialNumber;
+  5,                      // AssetTag;
+  6,                      // PartNumber;
+  0,                      // CoreCount;
+  0,                      // EnabledCoreCount;
+  0,                      // ThreadCount;
+  0,                      // ProcessorCharacteristics;
+  0,                      // ProcessorFamily2;
+};
+
+
+CHAR8 *mProcessorInfoType4Strings[] = {
+  "Socket",
+  "edk2.svn.sourceforge.net",
+  "Emulated Processor",
+  "1.0",
+  "1.0",
+  "1.0",
+  NULL
+};
+
+
+/***********************************************************************
+	SMBIOS data definition  TYPE7  Cache Information
+************************************************************************/
+
+SMBIOS_TABLE_TYPE7  mCacheInfoType7 = {
+  { EFI_SMBIOS_TYPE_CACHE_INFORMATION, sizeof (SMBIOS_TABLE_TYPE7), 0 },
+  1,                        // SocketDesignation String
+  0x018A,					// Cache Configuration
+  0x00FF,					// Maximum Size 256k
+  0x00FF,					// Install Size 256k
+  {                         // Supported SRAM Type
+	0,  //Other             :1
+	0,  //Unknown           :1
+	0,  //NonBurst          :1
+	1,  //Burst             :1
+	0,  //PiplelineBurst    :1
+	1,  //Synchronous       :1
+	0,  //Asynchronous      :1
+	0	//Reserved          :9
+  },
+  {                         // Current SRAM Type
+	0,  //Other             :1
+	0,  //Unknown           :1
+	0,  //NonBurst          :1
+	1,  //Burst             :1
+	0,  //PiplelineBurst    :1
+	1,  //Synchronous       :1
+	0,  //Asynchronous      :1
+	0	//Reserved          :9
+  },
+  0,						// Cache Speed unknown
+  CacheErrorMultiBit,		// Error Correction Multi
+  CacheTypeUnknown,			// System Cache Type
+  CacheAssociativity2Way	// Associativity
+};
+CHAR8  *mCacheInfoType7Strings[] = {
+  "Cache1",
+  NULL
+};
+
+
+/***********************************************************************
+	SMBIOS data definition  TYPE9  System Slot Information
+************************************************************************/
+
+SMBIOS_TABLE_TYPE9  mSysSlotInfoType9 = {
+  { EFI_SMBIOS_TYPE_SYSTEM_SLOTS, sizeof (SMBIOS_TABLE_TYPE9), 0 },
+  1,    // SlotDesignation String
+  SlotTypeOther,          // SlotType;                 ///< The enumeration value from MISC_SLOT_TYPE.
+  SlotDataBusWidthOther,  // SlotDataBusWidth;         ///< The enumeration value from MISC_SLOT_DATA_BUS_WIDTH.
+  SlotUsageAvailable,    // CurrentUsage;             ///< The enumeration value from MISC_SLOT_USAGE.
+  SlotLengthOther,    // SlotLength;               ///< The enumeration value from MISC_SLOT_LENGTH.
+  0,    // SlotID;
+  {    // SlotCharacteristics1;
+    1,  // CharacteristicsUnknown  :1;
+    0,  // Provides50Volts         :1;
+    0,  // Provides33Volts         :1;
+    0,  // SharedSlot              :1;
+    0,  // PcCard16Supported       :1;
+    0,  // CardBusSupported        :1;
+    0,  // ZoomVideoSupported      :1;
+    0,  // ModemRingResumeSupported:1;
+  },
+  {     // SlotCharacteristics2;
+    0,  // PmeSignalSupported      :1;
+    0,  // HotPlugDevicesSupported :1;
+    0,  // SmbusSignalSupported    :1;
+    0,  // Reserved                :5;  ///< Set to 0.
+  },
+  0,    // SegmentGroupNum;
+  0,    // BusNum;
+  0,    // DevFuncNum;
+};
+CHAR8  *mSysSlotInfoType9Strings[] = {
+  "SD Card",
+  NULL
+};
+
+/***********************************************************************
+	SMBIOS data definition  TYPE16  Physical Memory ArrayInformation
+************************************************************************/
+
+SMBIOS_TABLE_TYPE16 mPhyMemArrayInfoType16 = {
+  { EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, sizeof (SMBIOS_TABLE_TYPE16), 0 },
+  MemoryArrayLocationSystemBoard, // Location;                       ///< The enumeration value from MEMORY_ARRAY_LOCATION.
+  MemoryArrayUseSystemMemory,     // Use;                            ///< The enumeration value from MEMORY_ARRAY_USE.
+  MemoryErrorCorrectionUnknown,   // MemoryErrorCorrection;          ///< The enumeration value from MEMORY_ERROR_CORRECTION.
+  0x80000000,                     // MaximumCapacity;
+  0xFFFE,                         // MemoryErrorInformationHandle;
+  1,                              // NumberOfMemoryDevices;
+  0x3fffffffffffffffULL,          // ExtendedMaximumCapacity;
+};
+CHAR8 *mPhyMemArrayInfoType16Strings[] = {
+  NULL
+};
+
+/***********************************************************************
+	SMBIOS data definition  TYPE17  Memory Device Information
+************************************************************************/
+
+SMBIOS_TABLE_TYPE17 mMemDevInfoType17 = {
+  { EFI_SMBIOS_TYPE_MEMORY_DEVICE, sizeof (SMBIOS_TABLE_TYPE17), 0 },
+  0,          // MemoryArrayHandle;
+  0xFFFE,     // MemoryErrorInformationHandle;
+  0xFFFF,     // TotalWidth;
+  0xFFFF,     // DataWidth;
+  0xFFFF,     // Size;
+  MemoryFormFactorUnknown, // FormFactor;                     ///< The enumeration value from MEMORY_FORM_FACTOR.
+  0xff,       // DeviceSet;
+  1,          // DeviceLocator String
+  2,          // BankLocator String
+  MemoryTypeDram,         // MemoryType;                     ///< The enumeration value from MEMORY_DEVICE_TYPE.
+  {           // TypeDetail;
+    0,  // Reserved        :1;
+    0,  // Other           :1;
+    1,  // Unknown         :1;
+    0,  // FastPaged       :1;
+    0,  // StaticColumn    :1;
+    0,  // PseudoStatic    :1;
+    0,  // Rambus          :1;
+    0,  // Synchronous     :1;
+    0,  // Cmos            :1;
+    0,  // Edo             :1;
+    0,  // WindowDram      :1;
+    0,  // CacheDram       :1;
+    0,  // Nonvolatile     :1;
+    0,  // Registered      :1;
+    0,  // Unbuffered      :1;
+    0,  // Reserved1       :1;
+  },
+  0,          // Speed;
+  3,          // Manufacturer String
+  0,          // SerialNumber String
+  0,          // AssetTag String
+  0,          // PartNumber String
+  0,          // Attributes;
+  0,          // ExtendedSize;
+  0,          // ConfiguredMemoryClockSpeed;
+};
+CHAR8 *mMemDevInfoType17Strings[] = {
+  "OS Virtual Memory",
+  "malloc",
+  "OSV",
+  NULL
+};
+
+/***********************************************************************
+	SMBIOS data definition  TYPE19  Memory Array Mapped Address Information
+************************************************************************/
+
+SMBIOS_TABLE_TYPE19 mMemArrMapInfoType19 = {
+  { EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, sizeof (SMBIOS_TABLE_TYPE19), 0 },
+  0x80000000, // StartingAddress;
+  0xbfffffff, // EndingAddress;
+  0,          // MemoryArrayHandle;
+  1,          // PartitionWidth;
+  0,          // ExtendedStartingAddress;
+  0,          // ExtendedEndingAddress;
+};
+CHAR8 *mMemArrMapInfoType19Strings[] = {
+  NULL
+};
+
+
+
+
+/***********************************************************************
+	SMBIOS data definition  TYPE32  Boot Information
+************************************************************************/
+
+SMBIOS_TABLE_TYPE32 mBootInfoType32 = {
+  { EFI_SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, sizeof (SMBIOS_TABLE_TYPE32), 0 },
+  { 0, 0, 0, 0, 0, 0 },         // Reserved[6];
+  BootInformationStatusNoError  // BootStatus
+};
+
+CHAR8 *mBootInfoType32Strings[] = {
+  NULL
+};
+
+
+/**
+
+  Create SMBIOS record.
+
+  Converts a fixed SMBIOS structure and an array of pointers to strings into
+  an SMBIOS record where the strings are cat'ed on the end of the fixed record
+  and terminated via a double NULL and add to SMBIOS table.
+
+  SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
+    { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
+    1 // StringCount
+  };
+
+  CHAR8 *gSmbiosType12Strings[] = {
+    "Not Found",
+    NULL
+  };
+
+  ...
+
+  LogSmbiosData (
+    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
+    gSmbiosType12Strings
+    );
+
+  @param  Template    Fixed SMBIOS structure, required.
+  @param  StringArray Array of strings to convert to an SMBIOS string pack.
+                      NULL is OK.
+**/
+
+
+EFI_STATUS
+EFIAPI
+LogSmbiosData (
+  IN  EFI_SMBIOS_TABLE_HEADER *Template,
+  IN  CHAR8                   **StringPack
+  )
+{
+
+  EFI_STATUS                Status;
+  EFI_SMBIOS_PROTOCOL       *Smbios;
+  EFI_SMBIOS_HANDLE         SmbiosHandle;
+  EFI_SMBIOS_TABLE_HEADER   *Record;
+  UINTN                     Index;
+  UINTN                     StringSize;
+  UINTN                     Size;
+  CHAR8                     *Str;
+
+  //
+  // Locate Smbios protocol.
+  //
+
+  Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&Smbios);
+
+  if (EFI_ERROR (Status)) {
+
+    return Status;
+
+  }
+
+
+  // Calculate the size of the fixed record and optional string pack
+
+  Size = Template->Length;
+
+  if (StringPack == NULL) {
+
+    // At least a double null is required
+
+    Size += 2;
+
+  } else {
+
+    for (Index = 0; StringPack[Index] != NULL; Index++) {
+
+      StringSize = AsciiStrSize (StringPack[Index]);
+
+      Size += StringSize;
+
+    }
+
+    if (StringPack[0] == NULL) {
+
+      // At least a double null is required
+
+      Size += 1;
+
+    }
+
+    // Don't forget the terminating double null
+
+    Size += 1;
+
+  }
+
+
+
+  // Copy over Template
+  Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
+
+  if (Record == NULL) {
+
+    return EFI_OUT_OF_RESOURCES;
+
+  }
+
+  CopyMem (Record, Template, Template->Length);
+
+
+
+  // Append string pack
+
+  Str = ((CHAR8 *)Record) + Record->Length;
+
+
+
+  for (Index = 0; StringPack[Index] != NULL; Index++) {
+
+    StringSize = AsciiStrSize (StringPack[Index]);
+
+    CopyMem (Str, StringPack[Index], StringSize);
+
+    Str += StringSize;
+
+  }
+
+  *Str = 0;
+
+  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
+
+  Status = Smbios->Add (
+                     Smbios,
+                     gImageHandle,
+                     &SmbiosHandle,
+                     Record
+                     );
+
+  ASSERT_EFI_ERROR (Status);
+
+  FreePool (Record);
+
+  return Status;
+
+}
+
+
+
+/***********************************************************************
+	SMBIOS data update  TYPE0  BIOS Information
+************************************************************************/
+
+
+VOID
+BIOSInfoUpdateSmbiosType0 (
+  VOID
+  )
+
+{
+
+  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mBIOSInfoType0, mBIOSInfoType0Strings);
+
+}
+
+
+
+/***********************************************************************
+	SMBIOS data update  TYPE1  System Information
+************************************************************************/
+VOID
+SysInfoUpdateSmbiosType1 (
+  VOID
+  )
+
+{
+
+  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mSysInfoType1, mSysInfoType1Strings);
+
+}
+
+/***********************************************************************
+	SMBIOS data update  TYPE2  Board Information
+************************************************************************/
+VOID
+BoardInfoUpdateSmbiosType2 (
+  VOID
+  )
+
+{
+
+  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mBoardInfoType2, mBoardInfoType2Strings);
+
+}
+
+/***********************************************************************
+	SMBIOS data update  TYPE3  Enclosure Information
+************************************************************************/
+VOID
+EnclosureInfoUpdateSmbiosType3 (
+  VOID
+  )
+
+{
+
+  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mEnclosureInfoType3, mEnclosureInfoType3Strings);
+
+}
+
+
+/***********************************************************************
+	SMBIOS data update  TYPE4  Processor Information
+************************************************************************/
+
+
+VOID
+
+ProcessorInfoUpdateSmbiosType4 (
+
+  IN UINTN MaxCpus
+
+  )
+
+{
+
+  mProcessorInfoType4.CoreCount        = (UINT8) MaxCpus;
+
+  mProcessorInfoType4.EnabledCoreCount = (UINT8) MaxCpus;
+
+  mProcessorInfoType4.ThreadCount      = (UINT8) MaxCpus;
+
+
+
+  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mProcessorInfoType4, mProcessorInfoType4Strings);
+
+}
+
+
+/***********************************************************************
+	SMBIOS data update  TYPE7  Cache Information
+************************************************************************/
+VOID
+CacheInfoUpdateSmbiosType7 (
+  VOID
+  )
+
+{
+
+  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mCacheInfoType7, mCacheInfoType7Strings);
+
+}
+
+/***********************************************************************
+	SMBIOS data update  TYPE9  System Slot Information
+************************************************************************/
+VOID
+SysSlotInfoUpdateSmbiosType9 (
+  VOID
+  )
+
+{
+
+  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mSysSlotInfoType9, mSysSlotInfoType9Strings);
+
+}
+
+/***********************************************************************
+	SMBIOS data update  TYPE16  Physical Memory Array Information
+************************************************************************/
+VOID
+PhyMemArrayInfoUpdateSmbiosType16 (
+  VOID
+  )
+
+{
+
+  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mPhyMemArrayInfoType16, mPhyMemArrayInfoType16Strings);
+
+}
+
+/***********************************************************************
+	SMBIOS data update  TYPE17  Memory Device Information
+************************************************************************/
+VOID
+MemDevInfoUpdateSmbiosType17 (
+  VOID
+  )
+
+{
+
+  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mMemDevInfoType17, mMemDevInfoType17Strings);
+
+}
+
+/***********************************************************************
+	SMBIOS data update  TYPE19  Memory Array Map Information
+************************************************************************/
+VOID
+MemArrMapInfoUpdateSmbiosType19 (
+  VOID
+  )
+
+{
+
+  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mMemArrMapInfoType19, mMemArrMapInfoType19Strings);
+
+}
+
+
+/***********************************************************************
+	SMBIOS data update  TYPE32  Boot Information
+************************************************************************/
+VOID
+BootInfoUpdateSmbiosType32 (
+  VOID
+  )
+
+{
+
+  LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mBootInfoType32, mBootInfoType32Strings);
+
+}
+
+
+/***********************************************************************
+	Driver Entry
+************************************************************************/
+
+EFI_STATUS
+
+EFIAPI
+
+UpdateSmbios (
+
+  IN EFI_HANDLE        ImageHandle,
+
+  IN EFI_SYSTEM_TABLE  *SystemTable
+
+  )
+
+{
+
+  BIOSInfoUpdateSmbiosType0();
+
+  SysInfoUpdateSmbiosType1();
+
+  BoardInfoUpdateSmbiosType2();
+
+  EnclosureInfoUpdateSmbiosType3();
+
+  ProcessorInfoUpdateSmbiosType4 (2);
+
+  CacheInfoUpdateSmbiosType7();
+
+  SysSlotInfoUpdateSmbiosType9();
+
+  PhyMemArrayInfoUpdateSmbiosType16();
+
+  MemDevInfoUpdateSmbiosType17();
+
+  MemArrMapInfoUpdateSmbiosType19();
+
+  BootInfoUpdateSmbiosType32();
+
+  return EFI_SUCCESS;
+
+}
diff --git a/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.h b/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.h
new file mode 100644
index 0000000..5757dc7
--- /dev/null
+++ b/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.h
@@ -0,0 +1,53 @@ 
+/** @file
+Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+SMBIOS Driver.
+
+yi.li@linaro.org
+Copyright (c) 2013 Linaro.org
+
+  This program and the accompanying materials are licensed and
+made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license
+may be found at: http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+**/
+
+
+
+#ifndef _UPDATE_SMBIOS_DRIVER_H_
+#define _UPDATE_SMBIOS_DRIVER_H_
+
+
+#include <PiDxe.h>
+#include <Protocol/Smbios.h>
+#include <IndustryStandard/SmBios.h>
+#include <Guid/SmBios.h>
+#include <Library/DebugLib.h>
+#include <Library/UefiDriverEntryPoint.h>
+#include <Library/UefiLib.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/PcdLib.h>
+
+
+EFI_STATUS
+EFIAPI
+UpdateSmbios (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
+  );
+#endif
+
diff --git a/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf b/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
new file mode 100644
index 0000000..9f8b994
--- /dev/null
+++ b/ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
@@ -0,0 +1,64 @@ 
+## @file
+#
+# Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution. The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+
+# SMBIOS Driver.
+#
+# yi.li@linaro.org
+# Copyright (c) 2013 Linaro.org
+#
+#   This program and the accompanying materials are licensed and
+# made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license
+# may be found at: http://opensource.org/licenses/bsd-license.php
+
+#   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
+# BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
+# EXPRESS OR IMPLIED.
+
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = UpdateSmbios
+  FILE_GUID                      = 3847D23F-1D95-4772-B60C-4BBFBC4D532F
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = UpdateSmbios
+
+[Sources]
+  UpdateSmbios.c
+  UpdateSmbios.h
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  ArmPlatformPkg/ArmPlatformPkg.dec
+
+[LibraryClasses]
+  UefiBootServicesTableLib
+  MemoryAllocationLib
+  BaseMemoryLib
+  BaseLib
+  UefiLib
+  UefiDriverEntryPoint
+  DebugLib
+  PcdLib
+
+[Protocols]
+  gEfiSmbiosProtocolGuid                        # PROTOCOL SOMETIMES_CONSUMED
+
+[Guids]
+
+[Depex]
+  gEfiSmbiosProtocolGuid
+
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.dsc b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.dsc
index 6237e16..aa09ac7 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.dsc
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.dsc
@@ -253,6 +253,12 @@ 
   EmbeddedPkg/SerialDxe/SerialDxe.inf
 
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+
+  #
+  # SMBIOS Support
+  #
+  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
 
   ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
   ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.fdf b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.fdf
index a7cc384..a21afb4 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.fdf
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15-A7.fdf
@@ -82,6 +82,12 @@  READ_LOCK_STATUS   = TRUE
   INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
 
   INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+
+  #
+  # SMBIOS Support
+  #
+  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
   
   #
   # Multiple Console IO support
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.dsc b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.dsc
index 37765e9..382fdd6 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.dsc
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.dsc
@@ -276,6 +276,12 @@ 
   
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
 
+  #
+  # SMBIOS Support
+  #
+  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
+
   ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
   ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
   ArmPlatformPkg/Drivers/SP804TimerDxe/SP804TimerDxe.inf
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.fdf b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.fdf
index c3e5a90..1fa1d67 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.fdf
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA15x2.fdf
@@ -141,6 +141,12 @@  READ_LOCK_STATUS   = TRUE
 
   INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
 
+  #
+  # SMBIOS Support
+  #
+  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
+
   INF ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
   INF ArmPlatformPkg/Drivers/SP804TimerDxe/SP804TimerDxe.inf
   INF ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.dsc b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.dsc
index b4ce234..fd98a4a 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.dsc
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.dsc
@@ -270,6 +270,12 @@ 
   
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
 
+  #
+  # SMBIOS Support
+  #
+  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
+
   ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
   ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
   ArmPlatformPkg/Drivers/SP804TimerDxe/SP804TimerDxe.inf
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.fdf b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.fdf
index c3e5a90..1fa1d67 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.fdf
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA5s.fdf
@@ -141,6 +141,12 @@  READ_LOCK_STATUS   = TRUE
 
   INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
 
+  #
+  # SMBIOS Support
+  #
+  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
+
   INF ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
   INF ArmPlatformPkg/Drivers/SP804TimerDxe/SP804TimerDxe.inf
   INF ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.dsc b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.dsc
index 10e58b7..d11f87e 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.dsc
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.dsc
@@ -284,6 +284,12 @@ 
   EmbeddedPkg/SerialDxe/SerialDxe.inf
   
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+
+  #
+  # SMBIOS Support
+  #
+  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
 
   ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
   ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.fdf b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.fdf
index d94a721..523c364 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.fdf
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.fdf
@@ -186,6 +186,12 @@  READ_LOCK_STATUS   = TRUE
   INF EmbeddedPkg/SerialDxe/SerialDxe.inf
 
   INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+
+  #
+  # SMBIOS Support
+  #
+  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
 
   INF ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
   INF ArmPlatformPkg/Drivers/SP804TimerDxe/SP804TimerDxe.inf
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.dsc b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.dsc
index 0920313..04aefb0 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.dsc
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.dsc
@@ -245,6 +245,12 @@ 
   EmbeddedPkg/SerialDxe/SerialDxe.inf
 
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+
+  #
+  # SMBIOS Support
+  #
+  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
 
   ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
   ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.fdf b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.fdf
index 71c66b8..8ec50f9 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.fdf
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15.fdf
@@ -128,6 +128,12 @@  READ_LOCK_STATUS   = TRUE
   INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
 
   INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+
+  #
+  # SMBIOS Support
+  #
+  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
   
   #
   # Networking stack
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.dsc b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.dsc
index bb74bdc..751508e 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.dsc
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.dsc
@@ -247,7 +247,13 @@ 
   EmbeddedPkg/SerialDxe/SerialDxe.inf
 
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
-
+
+  #
+  # SMBIOS Support
+  #
+  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
+
   ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
   ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
   ArmPkg/Drivers/TimerDxe/TimerDxe.inf
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.fdf b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.fdf
index c1d8f31..91b2f8f 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.fdf
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A15_MPCore.fdf
@@ -146,6 +146,12 @@  READ_LOCK_STATUS   = TRUE
   INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
   INF ArmPlatformPkg/Drivers/LAN91xDxe/LAN91xDxe.inf
 
+  #
+  # SMBIOS Support
+  #
+  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
+
   #
   # Multiple Console IO support
   #
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.dsc b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.dsc
index df17f64..6f2e5f2 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.dsc
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.dsc
@@ -257,6 +257,12 @@ 
 
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
 
+  #
+  # SMBIOS Support
+  #
+  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
+
   ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
   ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
   ArmPlatformPkg/Drivers/SP804TimerDxe/SP804TimerDxe.inf
diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.fdf b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.fdf
index a8e99fd..ba3bf8f 100644
--- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.fdf
+++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.fdf
@@ -127,6 +127,12 @@  READ_LOCK_STATUS   = TRUE
   INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
 
   INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+
+  #
+  # SMBIOS Support
+  #
+  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  INF ArmPkg/Drivers/UpdateSmbios/UpdateSmbios.inf
   
   #
   # Networking stack