/** @file
  Industry Standard Definitions of SMBIOS Table Specification v3.3.0.

Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>
(C) Copyright 2015-2017 Hewlett Packard Enterprise Development LP<BR>
(C) Copyright 2015 - 2019 Hewlett Packard Enterprise Development LP<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __SMBIOS_STANDARD_H__
#define __SMBIOS_STANDARD_H__

///
/// Reference SMBIOS 2.6, chapter 3.1.2.
/// For v2.1 and later, handle values in the range 0FF00h to 0FFFFh are reserved for
/// use by this specification.
///
#define SMBIOS_HANDLE_RESERVED_BEGIN 0xFF00

///
/// Reference SMBIOS 2.7, chapter 6.1.2.
/// The UEFI Platform Initialization Specification reserves handle number FFFEh for its
/// EFI_SMBIOS_PROTOCOL.Add() function to mean "assign an unused handle number automatically."
/// This number is not used for any other purpose by the SMBIOS specification.
///
#define SMBIOS_HANDLE_PI_RESERVED 0xFFFE

///
/// Reference SMBIOS 2.6, chapter 3.1.3.
/// Each text string is limited to 64 significant characters due to system MIF limitations.
/// Reference SMBIOS 2.7, chapter 6.1.3.
/// It will have no limit on the length of each individual text string.
///
#define SMBIOS_STRING_MAX_LENGTH     64

//
// The length of the entire structure table (including all strings) must be reported
// in the Structure Table Length field of the SMBIOS Structure Table Entry Point,
// which is a WORD field limited to 65,535 bytes.
//
#define SMBIOS_TABLE_MAX_LENGTH 0xFFFF

//
// For SMBIOS 3.0, Structure table maximum size in Entry Point structure is DWORD field limited to 0xFFFFFFFF bytes.
//
#define SMBIOS_3_0_TABLE_MAX_LENGTH 0xFFFFFFFF

//
// SMBIOS type macros which is according to SMBIOS 3.3.0 specification.
//
#define SMBIOS_TYPE_BIOS_INFORMATION                     0
#define SMBIOS_TYPE_SYSTEM_INFORMATION                   1
#define SMBIOS_TYPE_BASEBOARD_INFORMATION                2
#define SMBIOS_TYPE_SYSTEM_ENCLOSURE                     3
#define SMBIOS_TYPE_PROCESSOR_INFORMATION                4
#define SMBIOS_TYPE_MEMORY_CONTROLLER_INFORMATION        5
#define SMBIOS_TYPE_MEMORY_MODULE_INFORMATON             6
#define SMBIOS_TYPE_CACHE_INFORMATION                    7
#define SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION           8
#define SMBIOS_TYPE_SYSTEM_SLOTS                         9
#define SMBIOS_TYPE_ONBOARD_DEVICE_INFORMATION           10
#define SMBIOS_TYPE_OEM_STRINGS                          11
#define SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS         12
#define SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION            13
#define SMBIOS_TYPE_GROUP_ASSOCIATIONS                   14
#define SMBIOS_TYPE_SYSTEM_EVENT_LOG                     15
#define SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY                16
#define SMBIOS_TYPE_MEMORY_DEVICE                        17
#define SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION       18
#define SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS          19
#define SMBIOS_TYPE_MEMORY_DEVICE_MAPPED_ADDRESS         20
#define SMBIOS_TYPE_BUILT_IN_POINTING_DEVICE             21
#define SMBIOS_TYPE_PORTABLE_BATTERY                     22
#define SMBIOS_TYPE_SYSTEM_RESET                         23
#define SMBIOS_TYPE_HARDWARE_SECURITY                    24
#define SMBIOS_TYPE_SYSTEM_POWER_CONTROLS                25
#define SMBIOS_TYPE_VOLTAGE_PROBE                        26
#define SMBIOS_TYPE_COOLING_DEVICE                       27
#define SMBIOS_TYPE_TEMPERATURE_PROBE                    28
#define SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE             29
#define SMBIOS_TYPE_OUT_OF_BAND_REMOTE_ACCESS            30
#define SMBIOS_TYPE_BOOT_INTEGRITY_SERVICE               31
#define SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION              32
#define SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION       33
#define SMBIOS_TYPE_MANAGEMENT_DEVICE                    34
#define SMBIOS_TYPE_MANAGEMENT_DEVICE_COMPONENT          35
#define SMBIOS_TYPE_MANAGEMENT_DEVICE_THRESHOLD_DATA     36
#define SMBIOS_TYPE_MEMORY_CHANNEL                       37
#define SMBIOS_TYPE_IPMI_DEVICE_INFORMATION              38
#define SMBIOS_TYPE_SYSTEM_POWER_SUPPLY                  39
#define SMBIOS_TYPE_ADDITIONAL_INFORMATION               40
#define SMBIOS_TYPE_ONBOARD_DEVICES_EXTENDED_INFORMATION 41
#define SMBIOS_TYPE_MANAGEMENT_CONTROLLER_HOST_INTERFACE 42
#define SMBIOS_TYPE_TPM_DEVICE                           43
#define SMBIOS_TYPE_PROCESSOR_ADDITIONAL_INFORMATION     44

///
/// Inactive type is added from SMBIOS 2.2. Reference SMBIOS 2.6, chapter 3.3.43.
/// Upper-level software that interprets the SMBIOS structure-table should bypass an
/// Inactive structure just like a structure type that the software does not recognize.
///
#define SMBIOS_TYPE_INACTIVE         0x007E

///
/// End-of-table type is added from SMBIOS 2.2. Reference SMBIOS 2.6, chapter 3.3.44.
/// The end-of-table indicator is used in the last physical structure in a table
///
#define SMBIOS_TYPE_END_OF_TABLE     0x007F

#define SMBIOS_OEM_BEGIN             128
#define SMBIOS_OEM_END               255

///
/// Types 0 through 127 (7Fh) are reserved for and defined by this
/// specification. Types 128 through 256 (80h to FFh) are available for system- and OEM-specific information.
///
typedef UINT8  SMBIOS_TYPE;

///
/// Specifies the structure's handle, a unique 16-bit number in the range 0 to 0FFFEh (for version
/// 2.0) or 0 to 0FEFFh (for version 2.1 and later). The handle can be used with the Get SMBIOS
/// Structure function to retrieve a specific structure; the handle numbers are not required to be
/// contiguous. For v2.1 and later, handle values in the range 0FF00h to 0FFFFh are reserved for
/// use by this specification.
/// If the system configuration changes, a previously assigned handle might no longer exist.
/// However once a handle has been assigned by the BIOS, the BIOS cannot re-assign that handle
/// number to another structure.
///
typedef UINT16 SMBIOS_HANDLE;

///
/// Smbios Table Entry Point Structure.
///
#pragma pack(1)
typedef struct {
  UINT8   AnchorString[4];
  UINT8   EntryPointStructureChecksum;
  UINT8   EntryPointLength;
  UINT8   MajorVersion;
  UINT8   MinorVersion;
  UINT16  MaxStructureSize;
  UINT8   EntryPointRevision;
  UINT8   FormattedArea[5];
  UINT8   IntermediateAnchorString[5];
  UINT8   IntermediateChecksum;
  UINT16  TableLength;
  UINT32  TableAddress;
  UINT16  NumberOfSmbiosStructures;
  UINT8   SmbiosBcdRevision;
} SMBIOS_TABLE_ENTRY_POINT;

typedef struct {
  UINT8   AnchorString[5];
  UINT8   EntryPointStructureChecksum;
  UINT8   EntryPointLength;
  UINT8   MajorVersion;
  UINT8   MinorVersion;
  UINT8   DocRev;
  UINT8   EntryPointRevision;
  UINT8   Reserved;
  UINT32  TableMaximumSize;
  UINT64  TableAddress;
} SMBIOS_TABLE_3_0_ENTRY_POINT;

///
/// The Smbios structure header.
///
typedef struct {
  SMBIOS_TYPE    Type;
  UINT8          Length;
  SMBIOS_HANDLE  Handle;
} SMBIOS_STRUCTURE;

///
/// Text strings associated with a given SMBIOS structure are returned in the dmiStrucBuffer, appended directly after
/// the formatted portion of the structure. This method of returning string information eliminates the need for
/// application software to deal with pointers embedded in the SMBIOS structure. Each string is terminated with a null
/// (00h) BYTE and the set of strings is terminated with an additional null (00h) BYTE. When the formatted portion of
/// a SMBIOS structure references a string, it does so by specifying a non-zero string number within the structure's
/// string-set. For example, if a string field contains 02h, it references the second string following the formatted portion
/// of the SMBIOS structure. If a string field references no string, a null (0) is placed in that string field. If the
/// formatted portion of the structure contains string-reference fields and all the string fields are set to 0 (no string
/// references), the formatted section of the structure is followed by two null (00h) BYTES.
///
typedef UINT8 SMBIOS_TABLE_STRING;

///
/// BIOS Characteristics
/// Defines which functions the BIOS supports. PCI, PCMCIA, Flash, etc.
///
typedef struct {
  UINT32  Reserved                          :2;  ///< Bits 0-1.
  UINT32  Unknown                           :1;
  UINT32  BiosCharacteristicsNotSupported   :1;
  UINT32  IsaIsSupported                    :1;
  UINT32  McaIsSupported                    :1;
  UINT32  EisaIsSupported                   :1;
  UINT32  PciIsSupported                    :1;
  UINT32  PcmciaIsSupported                 :1;
  UINT32  PlugAndPlayIsSupported            :1;
  UINT32  ApmIsSupported                    :1;
  UINT32  BiosIsUpgradable                  :1;
  UINT32  BiosShadowingAllowed              :1;
  UINT32  VlVesaIsSupported                 :1;
  UINT32  EscdSupportIsAvailable            :1;
  UINT32  BootFromCdIsSupported             :1;
  UINT32  SelectableBootIsSupported         :1;
  UINT32  RomBiosIsSocketed                 :1;
  UINT32  BootFromPcmciaIsSupported         :1;
  UINT32  EDDSpecificationIsSupported       :1;
  UINT32  JapaneseNecFloppyIsSupported      :1;
  UINT32  JapaneseToshibaFloppyIsSupported  :1;
  UINT32  Floppy525_360IsSupported          :1;
  UINT32  Floppy525_12IsSupported           :1;
  UINT32  Floppy35_720IsSupported           :1;
  UINT32  Floppy35_288IsSupported           :1;
  UINT32  PrintScreenIsSupported            :1;
  UINT32  Keyboard8042IsSupported           :1;
  UINT32  SerialIsSupported                 :1;
  UINT32  PrinterIsSupported                :1;
  UINT32  CgaMonoIsSupported                :1;
  UINT32  NecPc98                           :1;
  UINT32  ReservedForVendor                 :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor
                                                 ///< and bits 48-63 reserved for System Vendor.
} MISC_BIOS_CHARACTERISTICS;

///
/// BIOS Characteristics Extension Byte 1.
/// This information, available for SMBIOS version 2.1 and later, appears at offset 12h
/// within the BIOS Information structure.
///
typedef struct {
  UINT8  AcpiIsSupported                   :1;
  UINT8  UsbLegacyIsSupported              :1;
  UINT8  AgpIsSupported                    :1;
  UINT8  I2OBootIsSupported                :1;
  UINT8  Ls120BootIsSupported              :1;
  UINT8  AtapiZipDriveBootIsSupported      :1;
  UINT8  Boot1394IsSupported               :1;
  UINT8  SmartBatteryIsSupported           :1;
} MBCE_BIOS_RESERVED;

///
/// BIOS Characteristics Extension Byte 2.
/// This information, available for SMBIOS version 2.3 and later, appears at offset 13h
/// within the BIOS Information structure.
///
typedef struct {
  UINT8  BiosBootSpecIsSupported              :1;
  UINT8  FunctionKeyNetworkBootIsSupported    :1;
  UINT8  TargetContentDistributionEnabled     :1;
  UINT8  UefiSpecificationSupported           :1;
  UINT8  VirtualMachineSupported              :1;
  UINT8  ExtensionByte2Reserved               :3;
} MBCE_SYSTEM_RESERVED;

///
/// BIOS Characteristics Extension Bytes.
///
typedef struct {
  MBCE_BIOS_RESERVED    BiosReserved;
  MBCE_SYSTEM_RESERVED  SystemReserved;
} MISC_BIOS_CHARACTERISTICS_EXTENSION;

///
/// Extended BIOS ROM size.
///
typedef struct {
  UINT16 Size           :14;
  UINT16 Unit           :2;
} EXTENDED_BIOS_ROM_SIZE;

///
/// BIOS Information (Type 0).
///
typedef struct {
  SMBIOS_STRUCTURE          Hdr;
  SMBIOS_TABLE_STRING       Vendor;
  SMBIOS_TABLE_STRING       BiosVersion;
  UINT16                    BiosSegment;
  SMBIOS_TABLE_STRING       BiosReleaseDate;
  UINT8                     BiosSize;
  MISC_BIOS_CHARACTERISTICS BiosCharacteristics;
  UINT8                     BIOSCharacteristicsExtensionBytes[2];
  UINT8                     SystemBiosMajorRelease;
  UINT8                     SystemBiosMinorRelease;
  UINT8                     EmbeddedControllerFirmwareMajorRelease;
  UINT8                     EmbeddedControllerFirmwareMinorRelease;
  //
  // Add for smbios 3.1.0
  //
  EXTENDED_BIOS_ROM_SIZE    ExtendedBiosSize;
} SMBIOS_TABLE_TYPE0;

///
///  System Wake-up Type.
///
typedef enum {
  SystemWakeupTypeReserved         = 0x00,
  SystemWakeupTypeOther            = 0x01,
  SystemWakeupTypeUnknown          = 0x02,
  SystemWakeupTypeApmTimer         = 0x03,
  SystemWakeupTypeModemRing        = 0x04,
  SystemWakeupTypeLanRemote        = 0x05,
  SystemWakeupTypePowerSwitch      = 0x06,
  SystemWakeupTypePciPme           = 0x07,
  SystemWakeupTypeAcPowerRestored  = 0x08
} MISC_SYSTEM_WAKEUP_TYPE;

///
/// System Information (Type 1).
///
/// The information in this structure defines attributes of the overall system and is
/// intended to be associated with the Component ID group of the system's MIF.
/// An SMBIOS implementation is associated with a single system instance and contains
/// one and only one System Information (Type 1) structure.
///
typedef struct {
  SMBIOS_STRUCTURE        Hdr;
  SMBIOS_TABLE_STRING     Manufacturer;
  SMBIOS_TABLE_STRING     ProductName;
  SMBIOS_TABLE_STRING     Version;
  SMBIOS_TABLE_STRING     SerialNumber;
  GUID                    Uuid;
  UINT8                   WakeUpType;           ///< The enumeration value from MISC_SYSTEM_WAKEUP_TYPE.
  SMBIOS_TABLE_STRING     SKUNumber;
  SMBIOS_TABLE_STRING     Family;
} SMBIOS_TABLE_TYPE1;

///
///  Base Board - Feature Flags.
///
typedef struct {
  UINT8  Motherboard           :1;
  UINT8  RequiresDaughterCard  :1;
  UINT8  Removable             :1;
  UINT8  Replaceable           :1;
  UINT8  HotSwappable          :1;
  UINT8  Reserved              :3;
} BASE_BOARD_FEATURE_FLAGS;

///
///  Base Board - Board Type.
///
typedef enum {
  BaseBoardTypeUnknown                  = 0x1,
  BaseBoardTypeOther                    = 0x2,
  BaseBoardTypeServerBlade              = 0x3,
  BaseBoardTypeConnectivitySwitch       = 0x4,
  BaseBoardTypeSystemManagementModule   = 0x5,
  BaseBoardTypeProcessorModule          = 0x6,
  BaseBoardTypeIOModule                 = 0x7,
  BaseBoardTypeMemoryModule             = 0x8,
  BaseBoardTypeDaughterBoard            = 0x9,
  BaseBoardTypeMotherBoard              = 0xA,
  BaseBoardTypeProcessorMemoryModule    = 0xB,
  BaseBoardTypeProcessorIOModule        = 0xC,
  BaseBoardTypeInterconnectBoard        = 0xD
} BASE_BOARD_TYPE;

///
/// Base Board (or Module) Information (Type 2).
///
/// The information in this structure defines attributes of a system baseboard -
/// for example a motherboard, planar, or server blade or other standard system module.
///
typedef struct {
  SMBIOS_STRUCTURE          Hdr;
  SMBIOS_TABLE_STRING       Manufacturer;
  SMBIOS_TABLE_STRING       ProductName;
  SMBIOS_TABLE_STRING       Version;
  SMBIOS_TABLE_STRING       SerialNumber;
  SMBIOS_TABLE_STRING       AssetTag;
  BASE_BOARD_FEATURE_FLAGS  FeatureFlag;
  SMBIOS_TABLE_STRING       LocationInChassis;
  UINT16                    ChassisHandle;
  UINT8                     BoardType;              ///< The enumeration value from BASE_BOARD_TYPE.
  UINT8                     NumberOfContainedObjectHandles;
  UINT16                    ContainedObjectHandles[1];
} SMBIOS_TABLE_TYPE2;

///
/// System Enclosure or Chassis Types
///
typedef enum {
  MiscChassisTypeOther                = 0x01,
  MiscChassisTypeUnknown              = 0x02,
  MiscChassisTypeDeskTop              = 0x03,
  MiscChassisTypeLowProfileDesktop    = 0x04,
  MiscChassisTypePizzaBox             = 0x05,
  MiscChassisTypeMiniTower            = 0x06,
  MiscChassisTypeTower                = 0x07,
  MiscChassisTypePortable             = 0x08,
  MiscChassisTypeLapTop               = 0x09,
  MiscChassisTypeNotebook             = 0x0A,
  MiscChassisTypeHandHeld             = 0x0B,
  MiscChassisTypeDockingStation       = 0x0C,
  MiscChassisTypeAllInOne             = 0x0D,
  MiscChassisTypeSubNotebook          = 0x0E,
  MiscChassisTypeSpaceSaving          = 0x0F,
  MiscChassisTypeLunchBox             = 0x10,
  MiscChassisTypeMainServerChassis    = 0x11,
  MiscChassisTypeExpansionChassis     = 0x12,
  MiscChassisTypeSubChassis           = 0x13,
  MiscChassisTypeBusExpansionChassis  = 0x14,
  MiscChassisTypePeripheralChassis    = 0x15,
  MiscChassisTypeRaidChassis          = 0x16,
  MiscChassisTypeRackMountChassis     = 0x17,
  MiscChassisTypeSealedCasePc         = 0x18,
  MiscChassisMultiSystemChassis       = 0x19,
  MiscChassisCompactPCI               = 0x1A,
  MiscChassisAdvancedTCA              = 0x1B,
  MiscChassisBlade                    = 0x1C,
  MiscChassisBladeEnclosure           = 0x1D,
  MiscChassisTablet                   = 0x1E,
  MiscChassisConvertible              = 0x1F,
  MiscChassisDetachable               = 0x20,
  MiscChassisIoTGateway               = 0x21,
  MiscChassisEmbeddedPc               = 0x22,
  MiscChassisMiniPc                   = 0x23,
  MiscChassisStickPc                  = 0x24
} MISC_CHASSIS_TYPE;

///
/// System Enclosure or Chassis States .
///
typedef enum {
  ChassisStateOther           = 0x01,
  ChassisStateUnknown         = 0x02,
  ChassisStateSafe            = 0x03,
  ChassisStateWarning         = 0x04,
  ChassisStateCritical        = 0x05,
  ChassisStateNonRecoverable  = 0x06
} MISC_CHASSIS_STATE;

///
/// System Enclosure or Chassis Security Status.
///
typedef enum {
  ChassisSecurityStatusOther                          = 0x01,
  ChassisSecurityStatusUnknown                        = 0x02,
  ChassisSecurityStatusNone                           = 0x03,
  ChassisSecurityStatusExternalInterfaceLockedOut     = 0x04,
  ChassisSecurityStatusExternalInterfaceLockedEnabled = 0x05
} MISC_CHASSIS_SECURITY_STATE;

///
/// Contained Element record
///
typedef struct {
  UINT8                 ContainedElementType;
  UINT8                 ContainedElementMinimum;
  UINT8                 ContainedElementMaximum;
} CONTAINED_ELEMENT;


///
/// System Enclosure or Chassis (Type 3).
///
/// The information in this structure defines attributes of the system's mechanical enclosure(s).
/// For example, if a system included a separate enclosure for its peripheral devices,
/// two structures would be returned: one for the main, system enclosure and the second for
/// the peripheral device enclosure.  The additions to this structure in v2.1 of this specification
/// support the population of the CIM_Chassis class.
///
typedef struct {
  SMBIOS_STRUCTURE            Hdr;
  SMBIOS_TABLE_STRING         Manufacturer;
  UINT8                       Type;
  SMBIOS_TABLE_STRING         Version;
  SMBIOS_TABLE_STRING         SerialNumber;
  SMBIOS_TABLE_STRING         AssetTag;
  UINT8                       BootupState;            ///< The enumeration value from MISC_CHASSIS_STATE.
  UINT8                       PowerSupplyState;       ///< The enumeration value from MISC_CHASSIS_STATE.
  UINT8                       ThermalState;           ///< The enumeration value from MISC_CHASSIS_STATE.
  UINT8                       SecurityStatus;         ///< The enumeration value from MISC_CHASSIS_SECURITY_STATE.
  UINT8                       OemDefined[4];
  UINT8                       Height;
  UINT8                       NumberofPowerCords;
  UINT8                       ContainedElementCount;
  UINT8                       ContainedElementRecordLength;
  //
  // Can have 0 to (ContainedElementCount * ContainedElementRecordLength) contained elements
  //
  CONTAINED_ELEMENT           ContainedElements[1];
  //
  // Add for smbios 2.7
  //
  // Since ContainedElements has a variable number of entries, must not define SKUNumber in
  // the structure.  Need to reference it by starting at offset 0x15 and adding
  // (ContainedElementCount * ContainedElementRecordLength) bytes.
  //
  // SMBIOS_TABLE_STRING         SKUNumber;
} SMBIOS_TABLE_TYPE3;

///
/// Processor Information - Processor Type.
///
typedef enum {
  ProcessorOther   = 0x01,
  ProcessorUnknown = 0x02,
  CentralProcessor = 0x03,
  MathProcessor    = 0x04,
  DspProcessor     = 0x05,
  VideoProcessor   = 0x06
} PROCESSOR_TYPE_DATA;

///
/// Processor Information - Processor Family.
///
typedef enum {
  ProcessorFamilyOther                  = 0x01,
  ProcessorFamilyUnknown                = 0x02,
  ProcessorFamily8086                   = 0x03,
  ProcessorFamily80286                  = 0x04,
  ProcessorFamilyIntel386               = 0x05,
  ProcessorFamilyIntel486               = 0x06,
  ProcessorFamily8087                   = 0x07,
  ProcessorFamily80287                  = 0x08,
  ProcessorFamily80387                  = 0x09,
  ProcessorFamily80487                  = 0x0A,
  ProcessorFamilyPentium                = 0x0B,
  ProcessorFamilyPentiumPro             = 0x0C,
  ProcessorFamilyPentiumII              = 0x0D,
  ProcessorFamilyPentiumMMX             = 0x0E,
  ProcessorFamilyCeleron                = 0x0F,
  ProcessorFamilyPentiumIIXeon          = 0x10,
  ProcessorFamilyPentiumIII             = 0x11,
  ProcessorFamilyM1                     = 0x12,
  ProcessorFamilyM2                     = 0x13,
  ProcessorFamilyIntelCeleronM          = 0x14,
  ProcessorFamilyIntelPentium4Ht        = 0x15,
  ProcessorFamilyAmdDuron               = 0x18,
  ProcessorFamilyK5                     = 0x19,
  ProcessorFamilyK6                     = 0x1A,
  ProcessorFamilyK6_2                   = 0x1B,
  ProcessorFamilyK6_3                   = 0x1C,
  ProcessorFamilyAmdAthlon              = 0x1D,
  ProcessorFamilyAmd29000               = 0x1E,
  ProcessorFamilyK6_2Plus               = 0x1F,
  ProcessorFamilyPowerPC                = 0x20,
  ProcessorFamilyPowerPC601             = 0x21,
  ProcessorFamilyPowerPC603             = 0x22,
  ProcessorFamilyPowerPC603Plus         = 0x23,
  ProcessorFamilyPowerPC604             = 0x24,
  ProcessorFamilyPowerPC620             = 0x25,
  ProcessorFamilyPowerPCx704            = 0x26,
  ProcessorFamilyPowerPC750             = 0x27,
  ProcessorFamilyIntelCoreDuo           = 0x28,
  ProcessorFamilyIntelCoreDuoMobile     = 0x29,
  ProcessorFamilyIntelCoreSoloMobile    = 0x2A,
  ProcessorFamilyIntelAtom              = 0x2B,
  ProcessorFamilyIntelCoreM             = 0x2C,
  ProcessorFamilyIntelCorem3            = 0x2D,
  ProcessorFamilyIntelCorem5            = 0x2E,
  ProcessorFamilyIntelCorem7            = 0x2F,
  ProcessorFamilyAlpha                  = 0x30,
  ProcessorFamilyAlpha21064             = 0x31,
  ProcessorFamilyAlpha21066             = 0x32,
  ProcessorFamilyAlpha21164             = 0x33,
  ProcessorFamilyAlpha21164PC           = 0x34,
  ProcessorFamilyAlpha21164a            = 0x35,
  ProcessorFamilyAlpha21264             = 0x36,
  ProcessorFamilyAlpha21364             = 0x37,
  ProcessorFamilyAmdTurionIIUltraDualCoreMobileM    = 0x38,
  ProcessorFamilyAmdTurionIIDualCoreMobileM         = 0x39,
  ProcessorFamilyAmdAthlonIIDualCoreM   = 0x3A,
  ProcessorFamilyAmdOpteron6100Series   = 0x3B,
  ProcessorFamilyAmdOpteron4100Series   = 0x3C,
  ProcessorFamilyAmdOpteron6200Series   = 0x3D,
  ProcessorFamilyAmdOpteron4200Series   = 0x3E,
  ProcessorFamilyAmdFxSeries            = 0x3F,
  ProcessorFamilyMips                   = 0x40,
  ProcessorFamilyMIPSR4000              = 0x41,
  ProcessorFamilyMIPSR4200              = 0x42,
  ProcessorFamilyMIPSR4400              = 0x43,
  ProcessorFamilyMIPSR4600              = 0x44,
  ProcessorFamilyMIPSR10000             = 0x45,
  ProcessorFamilyAmdCSeries             = 0x46,
  ProcessorFamilyAmdESeries             = 0x47,
  ProcessorFamilyAmdASeries             = 0x48,    ///< SMBIOS spec 2.8.0 updated the name
  ProcessorFamilyAmdGSeries             = 0x49,
  ProcessorFamilyAmdZSeries             = 0x4A,
  ProcessorFamilyAmdRSeries             = 0x4B,
  ProcessorFamilyAmdOpteron4300         = 0x4C,
  ProcessorFamilyAmdOpteron6300         = 0x4D,
  ProcessorFamilyAmdOpteron3300         = 0x4E,
  ProcessorFamilyAmdFireProSeries       = 0x4F,
  ProcessorFamilySparc                  = 0x50,
  ProcessorFamilySuperSparc             = 0x51,
  ProcessorFamilymicroSparcII           = 0x52,
  ProcessorFamilymicroSparcIIep         = 0x53,
  ProcessorFamilyUltraSparc             = 0x54,
  ProcessorFamilyUltraSparcII           = 0x55,
  ProcessorFamilyUltraSparcIii          = 0x56,
  ProcessorFamilyUltraSparcIII          = 0x57,
  ProcessorFamilyUltraSparcIIIi         = 0x58,
  ProcessorFamily68040                  = 0x60,
  ProcessorFamily68xxx                  = 0x61,
  ProcessorFamily68000                  = 0x62,
  ProcessorFamily68010                  = 0x63,
  ProcessorFamily68020                  = 0x64,
  ProcessorFamily68030                  = 0x65,
  ProcessorFamilyAmdAthlonX4QuadCore    = 0x66,
  ProcessorFamilyAmdOpteronX1000Series  = 0x67,
  ProcessorFamilyAmdOpteronX2000Series  = 0x68,
  ProcessorFamilyAmdOpteronASeries      = 0x69,
  ProcessorFamilyAmdOpteronX3000Series  = 0x6A,
  ProcessorFamilyAmdZen                 = 0x6B,
  ProcessorFamilyHobbit                 = 0x70,
  ProcessorFamilyCrusoeTM5000           = 0x78,
  ProcessorFamilyCrusoeTM3000           = 0x79,
  ProcessorFamilyEfficeonTM8000         = 0x7A,
  ProcessorFamilyWeitek                 = 0x80,
  ProcessorFamilyItanium                = 0x82,
  ProcessorFamilyAmdAthlon64            = 0x83,
  ProcessorFamilyAmdOpteron             = 0x84,
  ProcessorFamilyAmdSempron             = 0x85,
  ProcessorFamilyAmdTurion64Mobile      = 0x86,
  ProcessorFamilyDualCoreAmdOpteron     = 0x87,
  ProcessorFamilyAmdAthlon64X2DualCore  = 0x88,
  ProcessorFamilyAmdTurion64X2Mobile    = 0x89,
  ProcessorFamilyQuadCoreAmdOpteron     = 0x8A,
  ProcessorFamilyThirdGenerationAmdOpteron = 0x8B,
  ProcessorFamilyAmdPhenomFxQuadCore    = 0x8C,
  ProcessorFamilyAmdPhenomX4QuadCore    = 0x8D,
  ProcessorFamilyAmdPhenomX2DualCore    = 0x8E,
  ProcessorFamilyAmdAthlonX2DualCore    = 0x8F,
  ProcessorFamilyPARISC                 = 0x90,
  ProcessorFamilyPaRisc8500             = 0x91,
  ProcessorFamilyPaRisc8000             = 0x92,
  ProcessorFamilyPaRisc7300LC           = 0x93,
  ProcessorFamilyPaRisc7200             = 0x94,
  ProcessorFamilyPaRisc7100LC           = 0x95,
  ProcessorFamilyPaRisc7100             = 0x96,
  ProcessorFamilyV30                    = 0xA0,
  ProcessorFamilyQuadCoreIntelXeon3200Series  = 0xA1,
  ProcessorFamilyDualCoreIntelXeon3000Series  = 0xA2,
  ProcessorFamilyQuadCoreIntelXeon5300Series  = 0xA3,
  ProcessorFamilyDualCoreIntelXeon5100Series  = 0xA4,
  ProcessorFamilyDualCoreIntelXeon5000Series  = 0xA5,
  ProcessorFamilyDualCoreIntelXeonLV          = 0xA6,
  ProcessorFamilyDualCoreIntelXeonULV         = 0xA7,
  ProcessorFamilyDualCoreIntelXeon7100Series  = 0xA8,
  ProcessorFamilyQuadCoreIntelXeon5400Series  = 0xA9,
  ProcessorFamilyQuadCoreIntelXeon            = 0xAA,
  ProcessorFamilyDualCoreIntelXeon5200Series  = 0xAB,
  ProcessorFamilyDualCoreIntelXeon7200Series  = 0xAC,
  ProcessorFamilyQuadCoreIntelXeon7300Series  = 0xAD,
  ProcessorFamilyQuadCoreIntelXeon7400Series  = 0xAE,
  ProcessorFamilyMultiCoreIntelXeon7400Series = 0xAF,
  ProcessorFamilyPentiumIIIXeon         = 0xB0,
  ProcessorFamilyPentiumIIISpeedStep    = 0xB1,
  ProcessorFamilyPentium4               = 0xB2,
  ProcessorFamilyIntelXeon              = 0xB3,
  ProcessorFamilyAS400                  = 0xB4,
  ProcessorFamilyIntelXeonMP            = 0xB5,
  ProcessorFamilyAMDAthlonXP            = 0xB6,
  ProcessorFamilyAMDAthlonMP            = 0xB7,
  ProcessorFamilyIntelItanium2          = 0xB8,
  ProcessorFamilyIntelPentiumM          = 0xB9,
  ProcessorFamilyIntelCeleronD          = 0xBA,
  ProcessorFamilyIntelPentiumD          = 0xBB,
  ProcessorFamilyIntelPentiumEx         = 0xBC,
  ProcessorFamilyIntelCoreSolo          = 0xBD,  ///< SMBIOS spec 2.6 updated this value
  ProcessorFamilyReserved               = 0xBE,
  ProcessorFamilyIntelCore2             = 0xBF,
  ProcessorFamilyIntelCore2Solo         = 0xC0,
  ProcessorFamilyIntelCore2Extreme      = 0xC1,
  ProcessorFamilyIntelCore2Quad         = 0xC2,
  ProcessorFamilyIntelCore2ExtremeMobile = 0xC3,
  ProcessorFamilyIntelCore2DuoMobile    = 0xC4,
  ProcessorFamilyIntelCore2SoloMobile   = 0xC5,
  ProcessorFamilyIntelCoreI7            = 0xC6,
  ProcessorFamilyDualCoreIntelCeleron   = 0xC7,
  ProcessorFamilyIBM390                 = 0xC8,
  ProcessorFamilyG4                     = 0xC9,
  ProcessorFamilyG5                     = 0xCA,
  ProcessorFamilyG6                     = 0xCB,
  ProcessorFamilyzArchitecture          = 0xCC,
  ProcessorFamilyIntelCoreI5            = 0xCD,
  ProcessorFamilyIntelCoreI3            = 0xCE,
  ProcessorFamilyIntelCoreI9            = 0xCF,
  ProcessorFamilyViaC7M                 = 0xD2,
  ProcessorFamilyViaC7D                 = 0xD3,
  ProcessorFamilyViaC7                  = 0xD4,
  ProcessorFamilyViaEden                = 0xD5,
  ProcessorFamilyMultiCoreIntelXeon           = 0xD6,
  ProcessorFamilyDualCoreIntelXeon3Series     = 0xD7,
  ProcessorFamilyQuadCoreIntelXeon3Series     = 0xD8,
  ProcessorFamilyViaNano                      = 0xD9,
  ProcessorFamilyDualCoreIntelXeon5Series     = 0xDA,
  ProcessorFamilyQuadCoreIntelXeon5Series     = 0xDB,
  ProcessorFamilyDualCoreIntelXeon7Series     = 0xDD,
  ProcessorFamilyQuadCoreIntelXeon7Series     = 0xDE,
  ProcessorFamilyMultiCoreIntelXeon7Series    = 0xDF,
  ProcessorFamilyMultiCoreIntelXeon3400Series = 0xE0,
  ProcessorFamilyAmdOpteron3000Series         = 0xE4,
  ProcessorFamilyAmdSempronII                 = 0xE5,
  ProcessorFamilyEmbeddedAmdOpteronQuadCore   = 0xE6,
  ProcessorFamilyAmdPhenomTripleCore          = 0xE7,
  ProcessorFamilyAmdTurionUltraDualCoreMobile = 0xE8,
  ProcessorFamilyAmdTurionDualCoreMobile      = 0xE9,
  ProcessorFamilyAmdAthlonDualCore            = 0xEA,
  ProcessorFamilyAmdSempronSI                 = 0xEB,
  ProcessorFamilyAmdPhenomII                  = 0xEC,
  ProcessorFamilyAmdAthlonII                  = 0xED,
  ProcessorFamilySixCoreAmdOpteron            = 0xEE,
  ProcessorFamilyAmdSempronM                  = 0xEF,
  ProcessorFamilyi860                   = 0xFA,
  ProcessorFamilyi960                   = 0xFB,
  ProcessorFamilyIndicatorFamily2       = 0xFE,
  ProcessorFamilyReserved1              = 0xFF
} PROCESSOR_FAMILY_DATA;

///
/// Processor Information2 - Processor Family2.
///
typedef enum {
  ProcessorFamilyARMv7                 = 0x0100,
  ProcessorFamilyARMv8                 = 0x0101,
  ProcessorFamilySH3                   = 0x0104,
  ProcessorFamilySH4                   = 0x0105,
  ProcessorFamilyARM                   = 0x0118,
  ProcessorFamilyStrongARM             = 0x0119,
  ProcessorFamily6x86                  = 0x012C,
  ProcessorFamilyMediaGX               = 0x012D,
  ProcessorFamilyMII                   = 0x012E,
  ProcessorFamilyWinChip               = 0x0140,
  ProcessorFamilyDSP                   = 0x015E,
  ProcessorFamilyVideoProcessor        = 0x01F4,
  ProcessorFamilyRiscvRV32             = 0x0200,
  ProcessorFamilyRiscVRV64             = 0x0201,
  ProcessorFamilyRiscVRV128            = 0x0202
} PROCESSOR_FAMILY2_DATA;

///
/// Processor Information - Voltage.
///
typedef struct {
  UINT8  ProcessorVoltageCapability5V        :1;
  UINT8  ProcessorVoltageCapability3_3V      :1;
  UINT8  ProcessorVoltageCapability2_9V      :1;
  UINT8  ProcessorVoltageCapabilityReserved  :1; ///< Bit 3, must be zero.
  UINT8  ProcessorVoltageReserved            :3; ///< Bits 4-6, must be zero.
  UINT8  ProcessorVoltageIndicateLegacy      :1;
} PROCESSOR_VOLTAGE;

///
/// Processor Information - Processor Upgrade.
///
typedef enum {
  ProcessorUpgradeOther         = 0x01,
  ProcessorUpgradeUnknown       = 0x02,
  ProcessorUpgradeDaughterBoard = 0x03,
  ProcessorUpgradeZIFSocket     = 0x04,
  ProcessorUpgradePiggyBack     = 0x05, ///< Replaceable.
  ProcessorUpgradeNone          = 0x06,
  ProcessorUpgradeLIFSocket     = 0x07,
  ProcessorUpgradeSlot1         = 0x08,
  ProcessorUpgradeSlot2         = 0x09,
  ProcessorUpgrade370PinSocket  = 0x0A,
  ProcessorUpgradeSlotA         = 0x0B,
  ProcessorUpgradeSlotM         = 0x0C,
  ProcessorUpgradeSocket423     = 0x0D,
  ProcessorUpgradeSocketA       = 0x0E, ///< Socket 462.
  ProcessorUpgradeSocket478     = 0x0F,
  ProcessorUpgradeSocket754     = 0x10,
  ProcessorUpgradeSocket940     = 0x11,
  ProcessorUpgradeSocket939     = 0x12,
  ProcessorUpgradeSocketmPGA604 = 0x13,
  ProcessorUpgradeSocketLGA771  = 0x14,
  ProcessorUpgradeSocketLGA775  = 0x15,
  ProcessorUpgradeSocketS1      = 0x16,
  ProcessorUpgradeAM2           = 0x17,
  ProcessorUpgradeF1207         = 0x18,
  ProcessorSocketLGA1366        = 0x19,
  ProcessorUpgradeSocketG34     = 0x1A,
  ProcessorUpgradeSocketAM3     = 0x1B,
  ProcessorUpgradeSocketC32     = 0x1C,
  ProcessorUpgradeSocketLGA1156 = 0x1D,
  ProcessorUpgradeSocketLGA1567 = 0x1E,
  ProcessorUpgradeSocketPGA988A = 0x1F,
  ProcessorUpgradeSocketBGA1288 = 0x20,
  ProcessorUpgradeSocketrPGA988B = 0x21,
  ProcessorUpgradeSocketBGA1023 = 0x22,
  ProcessorUpgradeSocketBGA1224 = 0x23,
  ProcessorUpgradeSocketLGA1155 = 0x24,  ///< SMBIOS spec 2.8.0 updated the name
  ProcessorUpgradeSocketLGA1356 = 0x25,
  ProcessorUpgradeSocketLGA2011 = 0x26,
  ProcessorUpgradeSocketFS1     = 0x27,
  ProcessorUpgradeSocketFS2     = 0x28,
  ProcessorUpgradeSocketFM1     = 0x29,
  ProcessorUpgradeSocketFM2     = 0x2A,
  ProcessorUpgradeSocketLGA2011_3 = 0x2B,
  ProcessorUpgradeSocketLGA1356_3 = 0x2C,
  ProcessorUpgradeSocketLGA1150   = 0x2D,
  ProcessorUpgradeSocketBGA1168   = 0x2E,
  ProcessorUpgradeSocketBGA1234   = 0x2F,
  ProcessorUpgradeSocketBGA1364   = 0x30,
  ProcessorUpgradeSocketAM4       = 0x31,
  ProcessorUpgradeSocketLGA1151   = 0x32,
  ProcessorUpgradeSocketBGA1356   = 0x33,
  ProcessorUpgradeSocketBGA1440   = 0x34,
  ProcessorUpgradeSocketBGA1515   = 0x35,
  ProcessorUpgradeSocketLGA3647_1 = 0x36,
  ProcessorUpgradeSocketSP3       = 0x37,
  ProcessorUpgradeSocketSP3r2     = 0x38,
  ProcessorUpgradeSocketLGA2066   = 0x39,
  ProcessorUpgradeSocketBGA1392   = 0x3A,
  ProcessorUpgradeSocketBGA1510   = 0x3B,
  ProcessorUpgradeSocketBGA1528   = 0x3C,
  ProcessorUpgradeSocketLGA4189   = 0x3D,
  ProcessorUpgradeSocketLGA1200   = 0x3E,
  ProcessorUpgradeSocketLGA4677   = 0x3F
} PROCESSOR_UPGRADE;

///
/// Processor ID Field Description
///
typedef struct {
  UINT32  ProcessorSteppingId:4;
  UINT32  ProcessorModel:     4;
  UINT32  ProcessorFamily:    4;
  UINT32  ProcessorType:      2;
  UINT32  ProcessorReserved1: 2;
  UINT32  ProcessorXModel:    4;
  UINT32  ProcessorXFamily:   8;
  UINT32  ProcessorReserved2: 4;
} PROCESSOR_SIGNATURE;

typedef struct {
  UINT32  ProcessorFpu       :1;
  UINT32  ProcessorVme       :1;
  UINT32  ProcessorDe        :1;
  UINT32  ProcessorPse       :1;
  UINT32  ProcessorTsc       :1;
  UINT32  ProcessorMsr       :1;
  UINT32  ProcessorPae       :1;
  UINT32  ProcessorMce       :1;
  UINT32  ProcessorCx8       :1;
  UINT32  ProcessorApic      :1;
  UINT32  ProcessorReserved1 :1;
  UINT32  ProcessorSep       :1;
  UINT32  ProcessorMtrr      :1;
  UINT32  ProcessorPge       :1;
  UINT32  ProcessorMca       :1;
  UINT32  ProcessorCmov      :1;
  UINT32  ProcessorPat       :1;
  UINT32  ProcessorPse36     :1;
  UINT32  ProcessorPsn       :1;
  UINT32  ProcessorClfsh     :1;
  UINT32  ProcessorReserved2 :1;
  UINT32  ProcessorDs        :1;
  UINT32  ProcessorAcpi      :1;
  UINT32  ProcessorMmx       :1;
  UINT32  ProcessorFxsr      :1;
  UINT32  ProcessorSse       :1;
  UINT32  ProcessorSse2      :1;
  UINT32  ProcessorSs        :1;
  UINT32  ProcessorReserved3 :1;
  UINT32  ProcessorTm        :1;
  UINT32  ProcessorReserved4 :2;
} PROCESSOR_FEATURE_FLAGS;

typedef struct {
  UINT16  ProcessorReserved1              :1;
  UINT16  ProcessorUnknown                :1;
  UINT16  Processor64BitCapable           :1;
  UINT16  ProcessorMultiCore              :1;
  UINT16  ProcessorHardwareThread         :1;
  UINT16  ProcessorExecuteProtection      :1;
  UINT16  ProcessorEnhancedVirtualization :1;
  UINT16  ProcessorPowerPerformanceCtrl   :1;
  UINT16  Processor128BitCapable          :1;
  UINT16  ProcessorArm64SocId             :1;
  UINT16  ProcessorReserved2              :6;
} PROCESSOR_CHARACTERISTIC_FLAGS;

///
/// Processor Information - Status
///
typedef union {
  struct {
    UINT8 CpuStatus       :3; ///< Indicates the status of the processor.
    UINT8 Reserved1       :3; ///< Reserved for future use. Must be set to zero.
    UINT8 SocketPopulated :1; ///< Indicates if the processor socket is populated or not.
    UINT8 Reserved2       :1; ///< Reserved for future use. Must be set to zero.
  } Bits;
  UINT8 Data;
} PROCESSOR_STATUS_DATA;

typedef struct {
  PROCESSOR_SIGNATURE     Signature;
  PROCESSOR_FEATURE_FLAGS FeatureFlags;
} PROCESSOR_ID_DATA;

///
/// Processor Information (Type 4).
///
/// The information in this structure defines the attributes of a single processor;
/// a separate structure instance is provided for each system processor socket/slot.
/// For example, a system with an IntelDX2 processor would have a single
/// structure instance, while a system with an IntelSX2 processor would have a structure
/// to describe the main CPU, and a second structure to describe the 80487 co-processor.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   Socket;
  UINT8                 ProcessorType;          ///< The enumeration value from PROCESSOR_TYPE_DATA.
  UINT8                 ProcessorFamily;        ///< The enumeration value from PROCESSOR_FAMILY_DATA.
  SMBIOS_TABLE_STRING   ProcessorManufacturer;
  PROCESSOR_ID_DATA     ProcessorId;
  SMBIOS_TABLE_STRING   ProcessorVersion;
  PROCESSOR_VOLTAGE     Voltage;
  UINT16                ExternalClock;
  UINT16                MaxSpeed;
  UINT16                CurrentSpeed;
  UINT8                 Status;
  UINT8                 ProcessorUpgrade;      ///< The enumeration value from PROCESSOR_UPGRADE.
  UINT16                L1CacheHandle;
  UINT16                L2CacheHandle;
  UINT16                L3CacheHandle;
  SMBIOS_TABLE_STRING   SerialNumber;
  SMBIOS_TABLE_STRING   AssetTag;
  SMBIOS_TABLE_STRING   PartNumber;
  //
  // Add for smbios 2.5
  //
  UINT8                 CoreCount;
  UINT8                 EnabledCoreCount;
  UINT8                 ThreadCount;
  UINT16                ProcessorCharacteristics;
  //
  // Add for smbios 2.6
  //
  UINT16                ProcessorFamily2;
  //
  // Add for smbios 3.0
  //
  UINT16                CoreCount2;
  UINT16                EnabledCoreCount2;
  UINT16                ThreadCount2;
} SMBIOS_TABLE_TYPE4;

///
/// Memory Controller Error Detecting Method.
///
typedef enum {
  ErrorDetectingMethodOther   = 0x01,
  ErrorDetectingMethodUnknown = 0x02,
  ErrorDetectingMethodNone    = 0x03,
  ErrorDetectingMethodParity  = 0x04,
  ErrorDetectingMethod32Ecc   = 0x05,
  ErrorDetectingMethod64Ecc   = 0x06,
  ErrorDetectingMethod128Ecc  = 0x07,
  ErrorDetectingMethodCrc     = 0x08
} MEMORY_ERROR_DETECT_METHOD;

///
/// Memory Controller Error Correcting Capability.
///
typedef struct {
  UINT8  Other                 :1;
  UINT8  Unknown               :1;
  UINT8  None                  :1;
  UINT8  SingleBitErrorCorrect :1;
  UINT8  DoubleBitErrorCorrect :1;
  UINT8  ErrorScrubbing        :1;
  UINT8  Reserved              :2;
} MEMORY_ERROR_CORRECT_CAPABILITY;

///
/// Memory Controller Information - Interleave Support.
///
typedef enum {
  MemoryInterleaveOther      = 0x01,
  MemoryInterleaveUnknown    = 0x02,
  MemoryInterleaveOneWay     = 0x03,
  MemoryInterleaveTwoWay     = 0x04,
  MemoryInterleaveFourWay    = 0x05,
  MemoryInterleaveEightWay   = 0x06,
  MemoryInterleaveSixteenWay = 0x07
} MEMORY_SUPPORT_INTERLEAVE_TYPE;

///
/// Memory Controller Information - Memory Speeds.
///
typedef struct {
  UINT16     Other    :1;
  UINT16     Unknown  :1;
  UINT16     SeventyNs:1;
  UINT16     SixtyNs  :1;
  UINT16     FiftyNs  :1;
  UINT16     Reserved :11;
} MEMORY_SPEED_TYPE;

///
/// Memory Controller Information (Type 5, Obsolete).
///
/// The information in this structure defines the attributes of the system's memory controller(s)
/// and the supported attributes of any memory-modules present in the sockets controlled by
/// this controller.
/// Note: This structure, and its companion Memory Module Information (Type 6, Obsolete),
/// are obsolete starting with version 2.1 of this specification. The Physical Memory Array (Type 16)
/// and Memory Device (Type 17) structures should be used instead.  BIOS providers might
/// choose to implement both memory description types to allow existing DMI browsers
/// to properly display the system's memory attributes.
///
typedef struct {
  SMBIOS_STRUCTURE                Hdr;
  UINT8                           ErrDetectMethod;            ///< The enumeration value from MEMORY_ERROR_DETECT_METHOD.
  MEMORY_ERROR_CORRECT_CAPABILITY ErrCorrectCapability;
  UINT8                           SupportInterleave;          ///< The enumeration value from MEMORY_SUPPORT_INTERLEAVE_TYPE.
  UINT8                           CurrentInterleave;          ///< The enumeration value from MEMORY_SUPPORT_INTERLEAVE_TYPE .
  UINT8                           MaxMemoryModuleSize;
  MEMORY_SPEED_TYPE               SupportSpeed;
  UINT16                          SupportMemoryType;
  UINT8                           MemoryModuleVoltage;
  UINT8                           AssociatedMemorySlotNum;
  UINT16                          MemoryModuleConfigHandles[1];
} SMBIOS_TABLE_TYPE5;

///
/// Memory Module Information - Memory Types
///
typedef struct {
  UINT16  Other       :1;
  UINT16  Unknown     :1;
  UINT16  Standard    :1;
  UINT16  FastPageMode:1;
  UINT16  Edo         :1;
  UINT16  Parity      :1;
  UINT16  Ecc         :1;
  UINT16  Simm        :1;
  UINT16  Dimm        :1;
  UINT16  BurstEdo    :1;
  UINT16  Sdram       :1;
  UINT16  Reserved    :5;
} MEMORY_CURRENT_TYPE;

///
/// Memory Module Information - Memory Size.
///
typedef struct {
  UINT8   InstalledOrEnabledSize  :7; ///< Size (n), where 2**n is the size in MB.
  UINT8   SingleOrDoubleBank      :1;
} MEMORY_INSTALLED_ENABLED_SIZE;

///
/// Memory Module Information (Type 6, Obsolete)
///
/// One Memory Module Information structure is included for each memory-module socket
/// in the system.  The structure describes the speed, type, size, and error status
/// of each system memory module.  The supported attributes of each module are described
/// by the "owning" Memory Controller Information structure.
/// Note:  This structure, and its companion Memory Controller Information (Type 5, Obsolete),
/// are obsolete starting with version 2.1 of this specification. The Physical Memory Array (Type 16)
/// and Memory Device (Type 17) structures should be used instead.
///
typedef struct {
  SMBIOS_STRUCTURE              Hdr;
  SMBIOS_TABLE_STRING           SocketDesignation;
  UINT8                         BankConnections;
  UINT8                         CurrentSpeed;
  MEMORY_CURRENT_TYPE           CurrentMemoryType;
  MEMORY_INSTALLED_ENABLED_SIZE InstalledSize;
  MEMORY_INSTALLED_ENABLED_SIZE EnabledSize;
  UINT8                         ErrorStatus;
} SMBIOS_TABLE_TYPE6;

///
/// Cache Information - SRAM Type.
///
typedef struct {
  UINT16  Other         :1;
  UINT16  Unknown       :1;
  UINT16  NonBurst      :1;
  UINT16  Burst         :1;
  UINT16  PipelineBurst :1;
  UINT16  Synchronous   :1;
  UINT16  Asynchronous  :1;
  UINT16  Reserved      :9;
} CACHE_SRAM_TYPE_DATA;

///
/// Cache Information - Error Correction Type.
///
typedef enum {
  CacheErrorOther     = 0x01,
  CacheErrorUnknown   = 0x02,
  CacheErrorNone      = 0x03,
  CacheErrorParity    = 0x04,
  CacheErrorSingleBit = 0x05, ///< ECC
  CacheErrorMultiBit  = 0x06  ///< ECC
} CACHE_ERROR_TYPE_DATA;

///
/// Cache Information - System Cache Type.
///
typedef enum {
  CacheTypeOther       = 0x01,
  CacheTypeUnknown     = 0x02,
  CacheTypeInstruction = 0x03,
  CacheTypeData        = 0x04,
  CacheTypeUnified     = 0x05
} CACHE_TYPE_DATA;

///
/// Cache Information - Associativity.
///
typedef enum {
  CacheAssociativityOther        = 0x01,
  CacheAssociativityUnknown      = 0x02,
  CacheAssociativityDirectMapped = 0x03,
  CacheAssociativity2Way         = 0x04,
  CacheAssociativity4Way         = 0x05,
  CacheAssociativityFully        = 0x06,
  CacheAssociativity8Way         = 0x07,
  CacheAssociativity16Way        = 0x08,
  CacheAssociativity12Way        = 0x09,
  CacheAssociativity24Way        = 0x0A,
  CacheAssociativity32Way        = 0x0B,
  CacheAssociativity48Way        = 0x0C,
  CacheAssociativity64Way        = 0x0D,
  CacheAssociativity20Way        = 0x0E
} CACHE_ASSOCIATIVITY_DATA;

///
/// Cache Information (Type 7).
///
/// The information in this structure defines the attributes of CPU cache device in the system.
/// One structure is specified for each such device, whether the device is internal to
/// or external to the CPU module.  Cache modules can be associated with a processor structure
/// in one or two ways, depending on the SMBIOS version.
///
typedef struct {
  SMBIOS_STRUCTURE          Hdr;
  SMBIOS_TABLE_STRING       SocketDesignation;
  UINT16                    CacheConfiguration;
  UINT16                    MaximumCacheSize;
  UINT16                    InstalledSize;
  CACHE_SRAM_TYPE_DATA      SupportedSRAMType;
  CACHE_SRAM_TYPE_DATA      CurrentSRAMType;
  UINT8                     CacheSpeed;
  UINT8                     ErrorCorrectionType;            ///< The enumeration value from CACHE_ERROR_TYPE_DATA.
  UINT8                     SystemCacheType;                ///< The enumeration value from CACHE_TYPE_DATA.
  UINT8                     Associativity;                  ///< The enumeration value from CACHE_ASSOCIATIVITY_DATA.
  //
  // Add for smbios 3.1.0
  //
  UINT32                    MaximumCacheSize2;
  UINT32                    InstalledSize2;
} SMBIOS_TABLE_TYPE7;

///
/// Port Connector Information - Connector Types.
///
typedef enum {
  PortConnectorTypeNone                   = 0x00,
  PortConnectorTypeCentronics             = 0x01,
  PortConnectorTypeMiniCentronics         = 0x02,
  PortConnectorTypeProprietary            = 0x03,
  PortConnectorTypeDB25Male               = 0x04,
  PortConnectorTypeDB25Female             = 0x05,
  PortConnectorTypeDB15Male               = 0x06,
  PortConnectorTypeDB15Female             = 0x07,
  PortConnectorTypeDB9Male                = 0x08,
  PortConnectorTypeDB9Female              = 0x09,
  PortConnectorTypeRJ11                   = 0x0A,
  PortConnectorTypeRJ45                   = 0x0B,
  PortConnectorType50PinMiniScsi          = 0x0C,
  PortConnectorTypeMiniDin                = 0x0D,
  PortConnectorTypeMicroDin               = 0x0E,
  PortConnectorTypePS2                    = 0x0F,
  PortConnectorTypeInfrared               = 0x10,
  PortConnectorTypeHpHil                  = 0x11,
  PortConnectorTypeUsb                    = 0x12,
  PortConnectorTypeSsaScsi                = 0x13,
  PortConnectorTypeCircularDin8Male       = 0x14,
  PortConnectorTypeCircularDin8Female     = 0x15,
  PortConnectorTypeOnboardIde             = 0x16,
  PortConnectorTypeOnboardFloppy          = 0x17,
  PortConnectorType9PinDualInline         = 0x18,
  PortConnectorType25PinDualInline        = 0x19,
  PortConnectorType50PinDualInline        = 0x1A,
  PortConnectorType68PinDualInline        = 0x1B,
  PortConnectorTypeOnboardSoundInput      = 0x1C,
  PortConnectorTypeMiniCentronicsType14   = 0x1D,
  PortConnectorTypeMiniCentronicsType26   = 0x1E,
  PortConnectorTypeHeadPhoneMiniJack      = 0x1F,
  PortConnectorTypeBNC                    = 0x20,
  PortConnectorType1394                   = 0x21,
  PortConnectorTypeSasSata                = 0x22,
  PortConnectorTypeUsbTypeC               = 0x23,
  PortConnectorTypePC98                   = 0xA0,
  PortConnectorTypePC98Hireso             = 0xA1,
  PortConnectorTypePCH98                  = 0xA2,
  PortConnectorTypePC98Note               = 0xA3,
  PortConnectorTypePC98Full               = 0xA4,
  PortConnectorTypeOther                  = 0xFF
} MISC_PORT_CONNECTOR_TYPE;

///
/// Port Connector Information - Port Types
///
typedef enum {
  PortTypeNone                      = 0x00,
  PortTypeParallelXtAtCompatible    = 0x01,
  PortTypeParallelPortPs2           = 0x02,
  PortTypeParallelPortEcp           = 0x03,
  PortTypeParallelPortEpp           = 0x04,
  PortTypeParallelPortEcpEpp        = 0x05,
  PortTypeSerialXtAtCompatible      = 0x06,
  PortTypeSerial16450Compatible     = 0x07,
  PortTypeSerial16550Compatible     = 0x08,
  PortTypeSerial16550ACompatible    = 0x09,
  PortTypeScsi                      = 0x0A,
  PortTypeMidi                      = 0x0B,
  PortTypeJoyStick                  = 0x0C,
  PortTypeKeyboard                  = 0x0D,
  PortTypeMouse                     = 0x0E,
  PortTypeSsaScsi                   = 0x0F,
  PortTypeUsb                       = 0x10,
  PortTypeFireWire                  = 0x11,
  PortTypePcmciaTypeI               = 0x12,
  PortTypePcmciaTypeII              = 0x13,
  PortTypePcmciaTypeIII             = 0x14,
  PortTypeCardBus                   = 0x15,
  PortTypeAccessBusPort             = 0x16,
  PortTypeScsiII                    = 0x17,
  PortTypeScsiWide                  = 0x18,
  PortTypePC98                      = 0x19,
  PortTypePC98Hireso                = 0x1A,
  PortTypePCH98                     = 0x1B,
  PortTypeVideoPort                 = 0x1C,
  PortTypeAudioPort                 = 0x1D,
  PortTypeModemPort                 = 0x1E,
  PortTypeNetworkPort               = 0x1F,
  PortTypeSata                      = 0x20,
  PortTypeSas                       = 0x21,
  PortTypeMfdp                      = 0x22, ///< Multi-Function Display Port
  PortTypeThunderbolt               = 0x23,
  PortType8251Compatible            = 0xA0,
  PortType8251FifoCompatible        = 0xA1,
  PortTypeOther                     = 0xFF
} MISC_PORT_TYPE;

///
/// Port Connector Information (Type 8).
///
/// The information in this structure defines the attributes of a system port connector,
/// e.g. parallel, serial, keyboard, or mouse ports.  The port's type and connector information
/// are provided. One structure is present for each port provided by the system.
///
typedef struct {
  SMBIOS_STRUCTURE          Hdr;
  SMBIOS_TABLE_STRING       InternalReferenceDesignator;
  UINT8                     InternalConnectorType;          ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
  SMBIOS_TABLE_STRING       ExternalReferenceDesignator;
  UINT8                     ExternalConnectorType;          ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
  UINT8                     PortType;                       ///< The enumeration value from MISC_PORT_TYPE.
} SMBIOS_TABLE_TYPE8;

#if !CONFIG(DISPLAY_FSP_VERSION_INFO_2)
///
/// System Slots - Slot Type
///
typedef enum {
  SlotTypeOther                        = 0x01,
  SlotTypeUnknown                      = 0x02,
  SlotTypeIsa                          = 0x03,
  SlotTypeMca                          = 0x04,
  SlotTypeEisa                         = 0x05,
  SlotTypePci                          = 0x06,
  SlotTypePcmcia                       = 0x07,
  SlotTypeVlVesa                       = 0x08,
  SlotTypeProprietary                  = 0x09,
  SlotTypeProcessorCardSlot            = 0x0A,
  SlotTypeProprietaryMemoryCardSlot    = 0x0B,
  SlotTypeIORiserCardSlot              = 0x0C,
  SlotTypeNuBus                        = 0x0D,
  SlotTypePci66MhzCapable              = 0x0E,
  SlotTypeAgp                          = 0x0F,
  SlotTypeApg2X                        = 0x10,
  SlotTypeAgp4X                        = 0x11,
  SlotTypePciX                         = 0x12,
  SlotTypeAgp8X                        = 0x13,
  SlotTypeM2Socket1_DP                 = 0x14,
  SlotTypeM2Socket1_SD                 = 0x15,
  SlotTypeM2Socket2                    = 0x16,
  SlotTypeM2Socket3                    = 0x17,
  SlotTypeMxmTypeI                     = 0x18,
  SlotTypeMxmTypeII                    = 0x19,
  SlotTypeMxmTypeIIIStandard           = 0x1A,
  SlotTypeMxmTypeIIIHe                 = 0x1B,
  SlotTypeMxmTypeIV                    = 0x1C,
  SlotTypeMxm30TypeA                   = 0x1D,
  SlotTypeMxm30TypeB                   = 0x1E,
  SlotTypePciExpressGen2Sff_8639       = 0x1F,
  SlotTypePciExpressGen3Sff_8639       = 0x20,
  SlotTypePciExpressMini52pinWithBSKO  = 0x21,      ///< PCI Express Mini 52-pin (CEM spec. 2.0) with bottom-side keep-outs.
  SlotTypePciExpressMini52pinWithoutBSKO = 0x22,    ///< PCI Express Mini 52-pin (CEM spec. 2.0) without bottom-side keep-outs.
  SlotTypePciExpressMini76pin          = 0x23,      ///< PCI Express Mini 76-pin (CEM spec. 2.0) Corresponds to Display-Mini card.
  SlotTypeCXLFlexbus10                 = 0x30,
  SlotTypePC98C20                      = 0xA0,
  SlotTypePC98C24                      = 0xA1,
  SlotTypePC98E                        = 0xA2,
  SlotTypePC98LocalBus                 = 0xA3,
  SlotTypePC98Card                     = 0xA4,
  SlotTypePciExpress                   = 0xA5,
  SlotTypePciExpressX1                 = 0xA6,
  SlotTypePciExpressX2                 = 0xA7,
  SlotTypePciExpressX4                 = 0xA8,
  SlotTypePciExpressX8                 = 0xA9,
  SlotTypePciExpressX16                = 0xAA,
  SlotTypePciExpressGen2               = 0xAB,
  SlotTypePciExpressGen2X1             = 0xAC,
  SlotTypePciExpressGen2X2             = 0xAD,
  SlotTypePciExpressGen2X4             = 0xAE,
  SlotTypePciExpressGen2X8             = 0xAF,
  SlotTypePciExpressGen2X16            = 0xB0,
  SlotTypePciExpressGen3               = 0xB1,
  SlotTypePciExpressGen3X1             = 0xB2,
  SlotTypePciExpressGen3X2             = 0xB3,
  SlotTypePciExpressGen3X4             = 0xB4,
  SlotTypePciExpressGen3X8             = 0xB5,
  SlotTypePciExpressGen3X16            = 0xB6,
  SlotTypePciExpressGen4               = 0xB8,
  SlotTypePciExpressGen4X1             = 0xB9,
  SlotTypePciExpressGen4X2             = 0xBA,
  SlotTypePciExpressGen4X4             = 0xBB,
  SlotTypePciExpressGen4X8             = 0xBC,
  SlotTypePciExpressGen4X16            = 0xBD
} MISC_SLOT_TYPE;

///
/// System Slots - Slot Data Bus Width.
///
typedef enum {
  SlotDataBusWidthOther      = 0x01,
  SlotDataBusWidthUnknown    = 0x02,
  SlotDataBusWidth8Bit       = 0x03,
  SlotDataBusWidth16Bit      = 0x04,
  SlotDataBusWidth32Bit      = 0x05,
  SlotDataBusWidth64Bit      = 0x06,
  SlotDataBusWidth128Bit     = 0x07,
  SlotDataBusWidth1X         = 0x08, ///< Or X1
  SlotDataBusWidth2X         = 0x09, ///< Or X2
  SlotDataBusWidth4X         = 0x0A, ///< Or X4
  SlotDataBusWidth8X         = 0x0B, ///< Or X8
  SlotDataBusWidth12X        = 0x0C, ///< Or X12
  SlotDataBusWidth16X        = 0x0D, ///< Or X16
  SlotDataBusWidth32X        = 0x0E  ///< Or X32
} MISC_SLOT_DATA_BUS_WIDTH;

///
/// System Slots - Current Usage.
///
typedef enum {
  SlotUsageOther        = 0x01,
  SlotUsageUnknown      = 0x02,
  SlotUsageAvailable    = 0x03,
  SlotUsageInUse        = 0x04,
  SlotUsageUnavailable  = 0x05
} MISC_SLOT_USAGE;

///
/// System Slots - Slot Length.
///
typedef enum {
  SlotLengthOther   = 0x01,
  SlotLengthUnknown = 0x02,
  SlotLengthShort   = 0x03,
  SlotLengthLong    = 0x04
} MISC_SLOT_LENGTH;

#endif
///
/// System Slots - Slot Characteristics 1.
///
typedef struct {
  UINT8  CharacteristicsUnknown  :1;
  UINT8  Provides50Volts         :1;
  UINT8  Provides33Volts         :1;
  UINT8  SharedSlot              :1;
  UINT8  PcCard16Supported       :1;
  UINT8  CardBusSupported        :1;
  UINT8  ZoomVideoSupported      :1;
  UINT8  ModemRingResumeSupported:1;
} MISC_SLOT_CHARACTERISTICS1;
///
/// System Slots - Slot Characteristics 2.
///
typedef struct {
  UINT8  PmeSignalSupported      :1;
  UINT8  HotPlugDevicesSupported :1;
  UINT8  SmbusSignalSupported    :1;
  UINT8  BifurcationSupported    :1;
  UINT8  AsyncSurpriseRemoval    :1;
  UINT8  FlexbusSlotCxl10Capable :1;
  UINT8  FlexbusSlotCxl20Capable :1;
  UINT8  Reserved                :1;  ///< Set to 0.
} MISC_SLOT_CHARACTERISTICS2;

///
/// System Slots - Peer Segment/Bus/Device/Function/Width Groups
///
typedef struct {
  UINT16                      SegmentGroupNum;
  UINT8                       BusNum;
  UINT8                       DevFuncNum;
  UINT8                       DataBusWidth;
} MISC_SLOT_PEER_GROUP;

///
/// System Slots (Type 9)
///
/// The information in this structure defines the attributes of a system slot.
/// One structure is provided for each slot in the system.
///
///
typedef struct {
  SMBIOS_STRUCTURE            Hdr;
  SMBIOS_TABLE_STRING         SlotDesignation;
  UINT8                       SlotType;                 ///< The enumeration value from MISC_SLOT_TYPE.
  UINT8                       SlotDataBusWidth;         ///< The enumeration value from MISC_SLOT_DATA_BUS_WIDTH.
  UINT8                       CurrentUsage;             ///< The enumeration value from MISC_SLOT_USAGE.
  UINT8                       SlotLength;               ///< The enumeration value from MISC_SLOT_LENGTH.
  UINT16                      SlotID;
  MISC_SLOT_CHARACTERISTICS1  SlotCharacteristics1;
  MISC_SLOT_CHARACTERISTICS2  SlotCharacteristics2;
  //
  // Add for smbios 2.6
  //
  UINT16                      SegmentGroupNum;
  UINT8                       BusNum;
  UINT8                       DevFuncNum;
  //
  // Add for smbios 3.2
  //
  UINT8                       DataBusWidth;
  UINT8                       PeerGroupingCount;
  MISC_SLOT_PEER_GROUP        PeerGroups[1];
  //
  // Add for smbios 3.4
  //
  UINT8                       SlotInformation;
  UINT8                       SlotPhysicalWidth;
  UINT16                      SlotPitch;
} SMBIOS_TABLE_TYPE9;

///
/// On Board Devices Information - Device Types.
///
typedef enum {
  OnBoardDeviceTypeOther          = 0x01,
  OnBoardDeviceTypeUnknown        = 0x02,
  OnBoardDeviceTypeVideo          = 0x03,
  OnBoardDeviceTypeScsiController = 0x04,
  OnBoardDeviceTypeEthernet       = 0x05,
  OnBoardDeviceTypeTokenRing      = 0x06,
  OnBoardDeviceTypeSound          = 0x07,
  OnBoardDeviceTypePATAController = 0x08,
  OnBoardDeviceTypeSATAController = 0x09,
  OnBoardDeviceTypeSASController  = 0x0A
} MISC_ONBOARD_DEVICE_TYPE;

///
/// Device Item Entry
///
typedef struct {
  UINT8                     DeviceType;             ///< Bit [6:0] - enumeration type of device from MISC_ONBOARD_DEVICE_TYPE.
                                                    ///< Bit 7     - 1 : device enabled, 0 : device disabled.
  SMBIOS_TABLE_STRING       DescriptionString;
} DEVICE_STRUCT;

///
/// On Board Devices Information (Type 10, obsolete).
///
/// Note: This structure is obsolete starting with version 2.6 specification; the Onboard Devices Extended
/// Information (Type 41) structure should be used instead . BIOS providers can choose to implement both
/// types to allow existing SMBIOS browsers to properly display the system's onboard devices information.
/// The information in this structure defines the attributes of devices that are onboard (soldered onto)
/// a system element, usually the baseboard.  In general, an entry in this table implies that the BIOS
/// has some level of control over the enabling of the associated device for use by the system.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  DEVICE_STRUCT         Device[1];
} SMBIOS_TABLE_TYPE10;

///
/// OEM Strings (Type 11).
/// This structure contains free form strings defined by the OEM. Examples of this are:
/// Part Numbers for Reference Documents for the system, contact information for the manufacturer, etc.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 StringCount;
} SMBIOS_TABLE_TYPE11;

///
/// System Configuration Options (Type 12).
///
/// This structure contains information required to configure the base board's Jumpers and Switches.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 StringCount;
} SMBIOS_TABLE_TYPE12;


///
/// BIOS Language Information (Type 13).
///
/// The information in this structure defines the installable language attributes of the BIOS.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 InstallableLanguages;
  UINT8                 Flags;
  UINT8                 Reserved[15];
  SMBIOS_TABLE_STRING   CurrentLanguages;
} SMBIOS_TABLE_TYPE13;

///
/// Group Item Entry
///
typedef struct {
  UINT8                 ItemType;
  UINT16                ItemHandle;
} GROUP_STRUCT;

///
/// Group Associations (Type 14).
///
/// The Group Associations structure is provided for OEMs who want to specify
/// the arrangement or hierarchy of certain components (including other Group Associations)
/// within the system.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   GroupName;
  GROUP_STRUCT          Group[1];
} SMBIOS_TABLE_TYPE14;

///
/// System Event Log - Event Log Types.
///
typedef enum {
  EventLogTypeReserved         = 0x00,
  EventLogTypeSingleBitECC     = 0x01,
  EventLogTypeMultiBitECC      = 0x02,
  EventLogTypeParityMemErr     = 0x03,
  EventLogTypeBusTimeOut       = 0x04,
  EventLogTypeIOChannelCheck   = 0x05,
  EventLogTypeSoftwareNMI      = 0x06,
  EventLogTypePOSTMemResize    = 0x07,
  EventLogTypePOSTErr          = 0x08,
  EventLogTypePCIParityErr     = 0x09,
  EventLogTypePCISystemErr     = 0x0A,
  EventLogTypeCPUFailure       = 0x0B,
  EventLogTypeEISATimeOut      = 0x0C,
  EventLogTypeMemLogDisabled   = 0x0D,
  EventLogTypeLoggingDisabled  = 0x0E,
  EventLogTypeSysLimitExce     = 0x10,
  EventLogTypeAsyncHWTimer     = 0x11,
  EventLogTypeSysConfigInfo    = 0x12,
  EventLogTypeHDInfo           = 0x13,
  EventLogTypeSysReconfig      = 0x14,
  EventLogTypeUncorrectCPUErr  = 0x15,
  EventLogTypeAreaResetAndClr  = 0x16,
  EventLogTypeSystemBoot       = 0x17,
  EventLogTypeUnused           = 0x18, ///< 0x18 - 0x7F
  EventLogTypeAvailForSys      = 0x80, ///< 0x80 - 0xFE
  EventLogTypeEndOfLog         = 0xFF
} EVENT_LOG_TYPE_DATA;

///
/// System Event Log - Variable Data Format Types.
///
typedef enum {
  EventLogVariableNone                        = 0x00,
  EventLogVariableHandle                      = 0x01,
  EventLogVariableMutilEvent                  = 0x02,
  EventLogVariableMutilEventHandle            = 0x03,
  EventLogVariablePOSTResultBitmap            = 0x04,
  EventLogVariableSysManagementType           = 0x05,
  EventLogVariableMutliEventSysManagmentType  = 0x06,
  EventLogVariableUnused                      = 0x07,
  EventLogVariableOEMAssigned                 = 0x80
} EVENT_LOG_VARIABLE_DATA;

///
/// Event Log Type Descriptors
///
typedef struct {
  UINT8                 LogType;                    ///< The enumeration value from EVENT_LOG_TYPE_DATA.
  UINT8                 DataFormatType;
} EVENT_LOG_TYPE;

///
/// System Event Log (Type 15).
///
/// The presence of this structure within the SMBIOS data returned for a system indicates
/// that the system supports an event log.  An event log is a fixed-length area within a
/// non-volatile storage element, starting with a fixed-length (and vendor-specific) header
/// record, followed by one or more variable-length log records.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT16                LogAreaLength;
  UINT16                LogHeaderStartOffset;
  UINT16                LogDataStartOffset;
  UINT8                 AccessMethod;
  UINT8                 LogStatus;
  UINT32                LogChangeToken;
  UINT32                AccessMethodAddress;
  UINT8                 LogHeaderFormat;
  UINT8                 NumberOfSupportedLogTypeDescriptors;
  UINT8                 LengthOfLogTypeDescriptor;
  EVENT_LOG_TYPE        EventLogTypeDescriptors[1];
} SMBIOS_TABLE_TYPE15;

///
/// Physical Memory Array - Location.
///
typedef enum {
  MemoryArrayLocationOther                 = 0x01,
  MemoryArrayLocationUnknown               = 0x02,
  MemoryArrayLocationSystemBoard           = 0x03,
  MemoryArrayLocationIsaAddonCard          = 0x04,
  MemoryArrayLocationEisaAddonCard         = 0x05,
  MemoryArrayLocationPciAddonCard          = 0x06,
  MemoryArrayLocationMcaAddonCard          = 0x07,
  MemoryArrayLocationPcmciaAddonCard       = 0x08,
  MemoryArrayLocationProprietaryAddonCard  = 0x09,
  MemoryArrayLocationNuBus                 = 0x0A,
  MemoryArrayLocationPc98C20AddonCard      = 0xA0,
  MemoryArrayLocationPc98C24AddonCard      = 0xA1,
  MemoryArrayLocationPc98EAddonCard        = 0xA2,
  MemoryArrayLocationPc98LocalBusAddonCard = 0xA3,
  MemoryArrayLocationCXLAddonCard          = 0xA4
} MEMORY_ARRAY_LOCATION;

///
/// Physical Memory Array - Use.
///
typedef enum {
  MemoryArrayUseOther                      = 0x01,
  MemoryArrayUseUnknown                    = 0x02,
  MemoryArrayUseSystemMemory               = 0x03,
  MemoryArrayUseVideoMemory                = 0x04,
  MemoryArrayUseFlashMemory                = 0x05,
  MemoryArrayUseNonVolatileRam             = 0x06,
  MemoryArrayUseCacheMemory                = 0x07
} MEMORY_ARRAY_USE;

///
/// Physical Memory Array - Error Correction Types.
///
typedef enum {
  MemoryErrorCorrectionOther               = 0x01,
  MemoryErrorCorrectionUnknown             = 0x02,
  MemoryErrorCorrectionNone                = 0x03,
  MemoryErrorCorrectionParity              = 0x04,
  MemoryErrorCorrectionSingleBitEcc        = 0x05,
  MemoryErrorCorrectionMultiBitEcc         = 0x06,
  MemoryErrorCorrectionCrc                 = 0x07
} MEMORY_ERROR_CORRECTION;

///
/// Physical Memory Array (Type 16).
///
/// This structure describes a collection of memory devices that operate
/// together to form a memory address space.
///
typedef struct {
  SMBIOS_STRUCTURE          Hdr;
  UINT8                     Location;                       ///< The enumeration value from MEMORY_ARRAY_LOCATION.
  UINT8                     Use;                            ///< The enumeration value from MEMORY_ARRAY_USE.
  UINT8                     MemoryErrorCorrection;          ///< The enumeration value from MEMORY_ERROR_CORRECTION.
  UINT32                    MaximumCapacity;
  UINT16                    MemoryErrorInformationHandle;
  UINT16                    NumberOfMemoryDevices;
  //
  // Add for smbios 2.7
  //
  UINT64                    ExtendedMaximumCapacity;
} SMBIOS_TABLE_TYPE16;

///
/// Memory Device - Form Factor.
///
typedef enum {
  MemoryFormFactorOther                    = 0x01,
  MemoryFormFactorUnknown                  = 0x02,
  MemoryFormFactorSimm                     = 0x03,
  MemoryFormFactorSip                      = 0x04,
  MemoryFormFactorChip                     = 0x05,
  MemoryFormFactorDip                      = 0x06,
  MemoryFormFactorZip                      = 0x07,
  MemoryFormFactorProprietaryCard          = 0x08,
  MemoryFormFactorDimm                     = 0x09,
  MemoryFormFactorTsop                     = 0x0A,
  MemoryFormFactorRowOfChips               = 0x0B,
  MemoryFormFactorRimm                     = 0x0C,
  MemoryFormFactorSodimm                   = 0x0D,
  MemoryFormFactorSrimm                    = 0x0E,
  MemoryFormFactorFbDimm                   = 0x0F,
  MemoryFormFactorDie                      = 0x10
} MEMORY_FORM_FACTOR;

///
/// Memory Device - Type
///
typedef enum {
  MemoryTypeOther                          = 0x01,
  MemoryTypeUnknown                        = 0x02,
  MemoryTypeDram                           = 0x03,
  MemoryTypeEdram                          = 0x04,
  MemoryTypeVram                           = 0x05,
  MemoryTypeSram                           = 0x06,
  MemoryTypeRam                            = 0x07,
  MemoryTypeRom                            = 0x08,
  MemoryTypeFlash                          = 0x09,
  MemoryTypeEeprom                         = 0x0A,
  MemoryTypeFeprom                         = 0x0B,
  MemoryTypeEprom                          = 0x0C,
  MemoryTypeCdram                          = 0x0D,
  MemoryType3Dram                          = 0x0E,
  MemoryTypeSdram                          = 0x0F,
  MemoryTypeSgram                          = 0x10,
  MemoryTypeRdram                          = 0x11,
  MemoryTypeDdr                            = 0x12,
  MemoryTypeDdr2                           = 0x13,
  MemoryTypeDdr2FbDimm                     = 0x14,
  MemoryTypeDdr3                           = 0x18,
  MemoryTypeFbd2                           = 0x19,
  MemoryTypeDdr4                           = 0x1A,
  MemoryTypeLpddr                          = 0x1B,
  MemoryTypeLpddr2                         = 0x1C,
  MemoryTypeLpddr3                         = 0x1D,
  MemoryTypeLpddr4                         = 0x1E,
  MemoryTypeLogicalNonVolatileDevice       = 0x1F,
  MemoryTypeHBM                            = 0x20,
  MemoryTypeHBM2                           = 0x21,
  MemoryTypeDdr5                           = 0x22,
  MemoryTypeLpddr5                         = 0x23
} MEMORY_DEVICE_TYPE;

///
/// Memory Device - Type Detail
///
typedef struct {
  UINT16    Reserved        :1;
  UINT16    Other           :1;
  UINT16    Unknown         :1;
  UINT16    FastPaged       :1;
  UINT16    StaticColumn    :1;
  UINT16    PseudoStatic    :1;
  UINT16    Rambus          :1;
  UINT16    Synchronous     :1;
  UINT16    Cmos            :1;
  UINT16    Edo             :1;
  UINT16    WindowDram      :1;
  UINT16    CacheDram       :1;
  UINT16    Nonvolatile     :1;
  UINT16    Registered      :1;
  UINT16    Unbuffered      :1;
  UINT16    LrDimm          :1;
} MEMORY_DEVICE_TYPE_DETAIL;

///
/// Memory Device - Memory Technology
///
typedef enum {
  MemoryTechnologyOther                          = 0x01,
  MemoryTechnologyUnknown                        = 0x02,
  MemoryTechnologyDram                           = 0x03,
  MemoryTechnologyNvdimmN                        = 0x04,
  MemoryTechnologyNvdimmF                        = 0x05,
  MemoryTechnologyNvdimmP                        = 0x06,
  //
  // This definition is updated to represent Intel
  // Optane DC Persistent Memory in SMBIOS spec 3.4.0
  //
  MemoryTechnologyIntelOptanePersistentMemory    = 0x07

} MEMORY_DEVICE_TECHNOLOGY;

///
/// Memory Device - Memory Operating Mode Capability
///
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    UINT16 Reserved                         :1;   ///< Set to 0.
    UINT16 Other                            :1;
    UINT16 Unknown                          :1;
    UINT16 VolatileMemory                   :1;
    UINT16 ByteAccessiblePersistentMemory   :1;
    UINT16 BlockAccessiblePersistentMemory  :1;
    UINT16 Reserved2                        :10;  ///< Set to 0.
  } Bits;
  ///
  /// All bit fields as a 16-bit value
  ///
  UINT16 Uint16;
} MEMORY_DEVICE_OPERATING_MODE_CAPABILITY;

///
/// Memory Device (Type 17).
///
/// This structure describes a single memory device that is part of
/// a larger Physical Memory Array (Type 16).
/// Note:  If a system includes memory-device sockets, the SMBIOS implementation
/// includes a Memory Device structure instance for each slot, whether or not the
/// socket is currently populated.
///
typedef struct {
  SMBIOS_STRUCTURE                          Hdr;
  UINT16                                    MemoryArrayHandle;
  UINT16                                    MemoryErrorInformationHandle;
  UINT16                                    TotalWidth;
  UINT16                                    DataWidth;
  UINT16                                    Size;
  UINT8                                     FormFactor;         ///< The enumeration value from MEMORY_FORM_FACTOR.
  UINT8                                     DeviceSet;
  SMBIOS_TABLE_STRING                       DeviceLocator;
  SMBIOS_TABLE_STRING                       BankLocator;
  UINT8                                     MemoryType;         ///< The enumeration value from MEMORY_DEVICE_TYPE.
  MEMORY_DEVICE_TYPE_DETAIL                 TypeDetail;
  UINT16                                    Speed;
  SMBIOS_TABLE_STRING                       Manufacturer;
  SMBIOS_TABLE_STRING                       SerialNumber;
  SMBIOS_TABLE_STRING                       AssetTag;
  SMBIOS_TABLE_STRING                       PartNumber;
  //
  // Add for smbios 2.6
  //
  UINT8                                     Attributes;
  //
  // Add for smbios 2.7
  //
  UINT32                                    ExtendedSize;
  //
  // Keep using name "ConfiguredMemoryClockSpeed" for compatibility
  // although this field is renamed from "Configured Memory Clock Speed"
  // to "Configured Memory Speed" in smbios 3.2.0.
  //
  UINT16                                    ConfiguredMemoryClockSpeed;
  //
  // Add for smbios 2.8.0
  //
  UINT16                                    MinimumVoltage;
  UINT16                                    MaximumVoltage;
  UINT16                                    ConfiguredVoltage;
  //
  // Add for smbios 3.2.0
  //
  UINT8                                     MemoryTechnology;   ///< The enumeration value from MEMORY_DEVICE_TECHNOLOGY
  MEMORY_DEVICE_OPERATING_MODE_CAPABILITY   MemoryOperatingModeCapability;
  SMBIOS_TABLE_STRING                       FirmwareVersion;
  UINT16                                    ModuleManufacturerID;
  UINT16                                    ModuleProductID;
  UINT16                                    MemorySubsystemControllerManufacturerID;
  UINT16                                    MemorySubsystemControllerProductID;
  UINT64                                    NonVolatileSize;
  UINT64                                    VolatileSize;
  UINT64                                    CacheSize;
  UINT64                                    LogicalSize;
  //
  // Add for smbios 3.3.0
  //
  UINT32                                    ExtendedSpeed;
  UINT32                                    ExtendedConfiguredMemorySpeed;
} SMBIOS_TABLE_TYPE17;

///
/// 32-bit Memory Error Information - Error Type.
///
typedef enum {
  MemoryErrorOther             = 0x01,
  MemoryErrorUnknown           = 0x02,
  MemoryErrorOk                = 0x03,
  MemoryErrorBadRead           = 0x04,
  MemoryErrorParity            = 0x05,
  MemoryErrorSigleBit          = 0x06,
  MemoryErrorDoubleBit         = 0x07,
  MemoryErrorMultiBit          = 0x08,
  MemoryErrorNibble            = 0x09,
  MemoryErrorChecksum          = 0x0A,
  MemoryErrorCrc               = 0x0B,
  MemoryErrorCorrectSingleBit  = 0x0C,
  MemoryErrorCorrected         = 0x0D,
  MemoryErrorUnCorrectable     = 0x0E
} MEMORY_ERROR_TYPE;

///
/// 32-bit Memory Error Information - Error Granularity.
///
typedef enum {
  MemoryGranularityOther               = 0x01,
  MemoryGranularityOtherUnknown        = 0x02,
  MemoryGranularityDeviceLevel         = 0x03,
  MemoryGranularityMemPartitionLevel   = 0x04
} MEMORY_ERROR_GRANULARITY;

///
/// 32-bit Memory Error Information - Error Operation.
///
typedef enum {
  MemoryErrorOperationOther            = 0x01,
  MemoryErrorOperationUnknown          = 0x02,
  MemoryErrorOperationRead             = 0x03,
  MemoryErrorOperationWrite            = 0x04,
  MemoryErrorOperationPartialWrite     = 0x05
} MEMORY_ERROR_OPERATION;

///
/// 32-bit Memory Error Information (Type 18).
///
/// This structure identifies the specifics of an error that might be detected
/// within a Physical Memory Array.
///
typedef struct {
  SMBIOS_STRUCTURE          Hdr;
  UINT8                     ErrorType;                  ///< The enumeration value from MEMORY_ERROR_TYPE.
  UINT8                     ErrorGranularity;           ///< The enumeration value from MEMORY_ERROR_GRANULARITY.
  UINT8                     ErrorOperation;             ///< The enumeration value from MEMORY_ERROR_OPERATION.
  UINT32                    VendorSyndrome;
  UINT32                    MemoryArrayErrorAddress;
  UINT32                    DeviceErrorAddress;
  UINT32                    ErrorResolution;
} SMBIOS_TABLE_TYPE18;

///
/// Memory Array Mapped Address (Type 19).
///
/// This structure provides the address mapping for a Physical Memory Array.
/// One structure is present for each contiguous address range described.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT32                StartingAddress;
  UINT32                EndingAddress;
  UINT16                MemoryArrayHandle;
  UINT8                 PartitionWidth;
  //
  // Add for smbios 2.7
  //
  UINT64                ExtendedStartingAddress;
  UINT64                ExtendedEndingAddress;
} SMBIOS_TABLE_TYPE19;

///
/// Memory Device Mapped Address (Type 20).
///
/// This structure maps memory address space usually to a device-level granularity.
/// One structure is present for each contiguous address range described.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT32                StartingAddress;
  UINT32                EndingAddress;
  UINT16                MemoryDeviceHandle;
  UINT16                MemoryArrayMappedAddressHandle;
  UINT8                 PartitionRowPosition;
  UINT8                 InterleavePosition;
  UINT8                 InterleavedDataDepth;
  //
  // Add for smbios 2.7
  //
  UINT64                ExtendedStartingAddress;
  UINT64                ExtendedEndingAddress;
} SMBIOS_TABLE_TYPE20;

///
/// Built-in Pointing Device - Type
///
typedef enum {
  PointingDeviceTypeOther         = 0x01,
  PointingDeviceTypeUnknown       = 0x02,
  PointingDeviceTypeMouse         = 0x03,
  PointingDeviceTypeTrackBall     = 0x04,
  PointingDeviceTypeTrackPoint    = 0x05,
  PointingDeviceTypeGlidePoint    = 0x06,
  PointingDeviceTouchPad          = 0x07,
  PointingDeviceTouchScreen       = 0x08,
  PointingDeviceOpticalSensor     = 0x09
} BUILTIN_POINTING_DEVICE_TYPE;

///
/// Built-in Pointing Device - Interface.
///
typedef enum {
  PointingDeviceInterfaceOther              = 0x01,
  PointingDeviceInterfaceUnknown            = 0x02,
  PointingDeviceInterfaceSerial             = 0x03,
  PointingDeviceInterfacePs2                = 0x04,
  PointingDeviceInterfaceInfrared           = 0x05,
  PointingDeviceInterfaceHpHil              = 0x06,
  PointingDeviceInterfaceBusMouse           = 0x07,
  PointingDeviceInterfaceADB                = 0x08,
  PointingDeviceInterfaceBusMouseDB9        = 0xA0,
  PointingDeviceInterfaceBusMouseMicroDin   = 0xA1,
  PointingDeviceInterfaceUsb                = 0xA2
} BUILTIN_POINTING_DEVICE_INTERFACE;

///
/// Built-in Pointing Device (Type 21).
///
/// This structure describes the attributes of the built-in pointing device for the
/// system. The presence of this structure does not imply that the built-in
/// pointing device is active for the system's use!
///
typedef struct {
  SMBIOS_STRUCTURE                  Hdr;
  UINT8                             Type;                   ///< The enumeration value from BUILTIN_POINTING_DEVICE_TYPE.
  UINT8                             Interface;              ///< The enumeration value from BUILTIN_POINTING_DEVICE_INTERFACE.
  UINT8                             NumberOfButtons;
} SMBIOS_TABLE_TYPE21;

///
/// Portable Battery - Device Chemistry
///
typedef enum {
  PortableBatteryDeviceChemistryOther               = 0x01,
  PortableBatteryDeviceChemistryUnknown             = 0x02,
  PortableBatteryDeviceChemistryLeadAcid            = 0x03,
  PortableBatteryDeviceChemistryNickelCadmium       = 0x04,
  PortableBatteryDeviceChemistryNickelMetalHydride  = 0x05,
  PortableBatteryDeviceChemistryLithiumIon          = 0x06,
  PortableBatteryDeviceChemistryZincAir             = 0x07,
  PortableBatteryDeviceChemistryLithiumPolymer      = 0x08
} PORTABLE_BATTERY_DEVICE_CHEMISTRY;

///
/// Portable Battery (Type 22).
///
/// This structure describes the attributes of the portable battery(s) for the system.
/// The structure contains the static attributes for the group.  Each structure describes
/// a single battery pack's attributes.
///
typedef struct {
  SMBIOS_STRUCTURE                  Hdr;
  SMBIOS_TABLE_STRING               Location;
  SMBIOS_TABLE_STRING               Manufacturer;
  SMBIOS_TABLE_STRING               ManufactureDate;
  SMBIOS_TABLE_STRING               SerialNumber;
  SMBIOS_TABLE_STRING               DeviceName;
  UINT8                             DeviceChemistry;              ///< The enumeration value from PORTABLE_BATTERY_DEVICE_CHEMISTRY.
  UINT16                            DeviceCapacity;
  UINT16                            DesignVoltage;
  SMBIOS_TABLE_STRING               SBDSVersionNumber;
  UINT8                             MaximumErrorInBatteryData;
  UINT16                            SBDSSerialNumber;
  UINT16                            SBDSManufactureDate;
  SMBIOS_TABLE_STRING               SBDSDeviceChemistry;
  UINT8                             DesignCapacityMultiplier;
  UINT32                            OEMSpecific;
} SMBIOS_TABLE_TYPE22;

///
/// System Reset (Type 23)
///
/// This structure describes whether Automatic System Reset functions enabled (Status).
/// If the system has a watchdog Timer and the timer is not reset (Timer Reset)
/// before the Interval elapses, an automatic system reset will occur. The system will re-boot
/// according to the Boot Option. This function may repeat until the Limit is reached, at which time
/// the system will re-boot according to the Boot Option at Limit.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 Capabilities;
  UINT16                ResetCount;
  UINT16                ResetLimit;
  UINT16                TimerInterval;
  UINT16                Timeout;
} SMBIOS_TABLE_TYPE23;

///
/// Hardware Security (Type 24).
///
/// This structure describes the system-wide hardware security settings.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 HardwareSecuritySettings;
} SMBIOS_TABLE_TYPE24;

///
/// System Power Controls (Type 25).
///
/// This structure describes the attributes for controlling the main power supply to the system.
/// Software that interprets this structure uses the month, day, hour, minute, and second values
/// to determine the number of seconds until the next power-on of the system.  The presence of
/// this structure implies that a timed power-on facility is available for the system.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 NextScheduledPowerOnMonth;
  UINT8                 NextScheduledPowerOnDayOfMonth;
  UINT8                 NextScheduledPowerOnHour;
  UINT8                 NextScheduledPowerOnMinute;
  UINT8                 NextScheduledPowerOnSecond;
} SMBIOS_TABLE_TYPE25;

///
/// Voltage Probe - Location and Status.
///
typedef struct {
  UINT8 VoltageProbeSite      :5;
  UINT8  VoltageProbeStatus   :3;
} MISC_VOLTAGE_PROBE_LOCATION;

///
/// Voltage Probe (Type 26)
///
/// This describes the attributes for a voltage probe in the system.
/// Each structure describes a single voltage probe.
///
typedef struct {
  SMBIOS_STRUCTURE              Hdr;
  SMBIOS_TABLE_STRING           Description;
  MISC_VOLTAGE_PROBE_LOCATION   LocationAndStatus;
  UINT16                        MaximumValue;
  UINT16                        MinimumValue;
  UINT16                        Resolution;
  UINT16                        Tolerance;
  UINT16                        Accuracy;
  UINT32                        OEMDefined;
  UINT16                        NominalValue;
} SMBIOS_TABLE_TYPE26;

///
/// Cooling Device - Device Type and Status.
///
typedef struct {
  UINT8 CoolingDevice       :5;
  UINT8 CoolingDeviceStatus :3;
} MISC_COOLING_DEVICE_TYPE;

///
/// Cooling Device (Type 27)
///
/// This structure describes the attributes for a cooling device in the system.
/// Each structure describes a single cooling device.
///
typedef struct {
  SMBIOS_STRUCTURE                  Hdr;
  UINT16                            TemperatureProbeHandle;
  MISC_COOLING_DEVICE_TYPE          DeviceTypeAndStatus;
  UINT8                             CoolingUnitGroup;
  UINT32                            OEMDefined;
  UINT16                            NominalSpeed;
  //
  // Add for smbios 2.7
  //
  SMBIOS_TABLE_STRING               Description;
} SMBIOS_TABLE_TYPE27;

///
/// Temperature Probe - Location and Status.
///
typedef struct {
  UINT8 TemperatureProbeSite   :5;
  UINT8 TemperatureProbeStatus :3;
} MISC_TEMPERATURE_PROBE_LOCATION;

///
/// Temperature Probe (Type 28).
///
/// This structure describes the attributes for a temperature probe in the system.
/// Each structure describes a single temperature probe.
///
typedef struct {
  SMBIOS_STRUCTURE                  Hdr;
  SMBIOS_TABLE_STRING               Description;
  MISC_TEMPERATURE_PROBE_LOCATION   LocationAndStatus;
  UINT16                            MaximumValue;
  UINT16                            MinimumValue;
  UINT16                            Resolution;
  UINT16                            Tolerance;
  UINT16                            Accuracy;
  UINT32                            OEMDefined;
  UINT16                            NominalValue;
} SMBIOS_TABLE_TYPE28;

///
/// Electrical Current Probe - Location and Status.
///
typedef struct {
  UINT8 ElectricalCurrentProbeSite   :5;
  UINT8 ElectricalCurrentProbeStatus :3;
} MISC_ELECTRICAL_CURRENT_PROBE_LOCATION;

///
/// Electrical Current Probe (Type 29).
///
/// This structure describes the attributes for an electrical current probe in the system.
/// Each structure describes a single electrical current probe.
///
typedef struct {
  SMBIOS_STRUCTURE                        Hdr;
  SMBIOS_TABLE_STRING                     Description;
  MISC_ELECTRICAL_CURRENT_PROBE_LOCATION  LocationAndStatus;
  UINT16                                  MaximumValue;
  UINT16                                  MinimumValue;
  UINT16                                  Resolution;
  UINT16                                  Tolerance;
  UINT16                                  Accuracy;
  UINT32                                  OEMDefined;
  UINT16                                  NominalValue;
} SMBIOS_TABLE_TYPE29;

///
/// Out-of-Band Remote Access (Type 30).
///
/// This structure describes the attributes and policy settings of a hardware facility
/// that may be used to gain remote access to a hardware system when the operating system
/// is not available due to power-down status, hardware failures, or boot failures.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   ManufacturerName;
  UINT8                 Connections;
} SMBIOS_TABLE_TYPE30;

///
/// Boot Integrity Services (BIS) Entry Point (Type 31).
///
/// Structure type 31 (decimal) is reserved for use by the Boot Integrity Services (BIS).
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 Checksum;
  UINT8                 Reserved1;
  UINT16                Reserved2;
  UINT32                BisEntry16;
  UINT32                BisEntry32;
  UINT64                Reserved3;
  UINT32                Reserved4;
} SMBIOS_TABLE_TYPE31;

///
/// System Boot Information - System Boot Status.
///
typedef enum {
  BootInformationStatusNoError                  = 0x00,
  BootInformationStatusNoBootableMedia          = 0x01,
  BootInformationStatusNormalOSFailedLoading    = 0x02,
  BootInformationStatusFirmwareDetectedFailure  = 0x03,
  BootInformationStatusOSDetectedFailure        = 0x04,
  BootInformationStatusUserRequestedBoot        = 0x05,
  BootInformationStatusSystemSecurityViolation  = 0x06,
  BootInformationStatusPreviousRequestedImage   = 0x07,
  BootInformationStatusWatchdogTimerExpired     = 0x08,
  BootInformationStatusStartReserved            = 0x09,
  BootInformationStatusStartOemSpecific         = 0x80,
  BootInformationStatusStartProductSpecific     = 0xC0
} MISC_BOOT_INFORMATION_STATUS_DATA_TYPE;

///
/// System Boot Information (Type 32).
///
/// The client system firmware, e.g. BIOS, communicates the System Boot Status to the
/// client's Pre-boot Execution Environment (PXE) boot image or OS-present management
/// application via this structure. When used in the PXE environment, for example,
/// this code identifies the reason the PXE was initiated and can be used by boot-image
/// software to further automate an enterprise's PXE sessions.  For example, an enterprise
/// could choose to automatically download a hardware-diagnostic image to a client whose
/// reason code indicated either a firmware- or operating system-detected hardware failure.
///
typedef struct {
  SMBIOS_STRUCTURE                        Hdr;
  UINT8                                   Reserved[6];
  UINT8                                   BootStatus;     ///< The enumeration value from MISC_BOOT_INFORMATION_STATUS_DATA_TYPE.
} SMBIOS_TABLE_TYPE32;

///
/// 64-bit Memory Error Information (Type 33).
///
/// This structure describes an error within a Physical Memory Array,
/// when the error address is above 4G (0xFFFFFFFF).
///
typedef struct {
  SMBIOS_STRUCTURE          Hdr;
  UINT8                     ErrorType;                    ///< The enumeration value from MEMORY_ERROR_TYPE.
  UINT8                     ErrorGranularity;             ///< The enumeration value from MEMORY_ERROR_GRANULARITY.
  UINT8                     ErrorOperation;               ///< The enumeration value from MEMORY_ERROR_OPERATION.
  UINT32                    VendorSyndrome;
  UINT64                    MemoryArrayErrorAddress;
  UINT64                    DeviceErrorAddress;
  UINT32                    ErrorResolution;
} SMBIOS_TABLE_TYPE33;

///
/// Management Device -  Type.
///
typedef enum {
  ManagementDeviceTypeOther      = 0x01,
  ManagementDeviceTypeUnknown    = 0x02,
  ManagementDeviceTypeLm75       = 0x03,
  ManagementDeviceTypeLm78       = 0x04,
  ManagementDeviceTypeLm79       = 0x05,
  ManagementDeviceTypeLm80       = 0x06,
  ManagementDeviceTypeLm81       = 0x07,
  ManagementDeviceTypeAdm9240    = 0x08,
  ManagementDeviceTypeDs1780     = 0x09,
  ManagementDeviceTypeMaxim1617  = 0x0A,
  ManagementDeviceTypeGl518Sm    = 0x0B,
  ManagementDeviceTypeW83781D    = 0x0C,
  ManagementDeviceTypeHt82H791   = 0x0D
} MISC_MANAGEMENT_DEVICE_TYPE;

///
/// Management Device -  Address Type.
///
typedef enum {
  ManagementDeviceAddressTypeOther   = 0x01,
  ManagementDeviceAddressTypeUnknown = 0x02,
  ManagementDeviceAddressTypeIOPort  = 0x03,
  ManagementDeviceAddressTypeMemory  = 0x04,
  ManagementDeviceAddressTypeSmbus   = 0x05
} MISC_MANAGEMENT_DEVICE_ADDRESS_TYPE;

///
/// Management Device (Type 34).
///
/// The information in this structure defines the attributes of a Management Device.
/// A Management Device might control one or more fans or voltage, current, or temperature
/// probes as defined by one or more Management Device Component structures.
///
typedef struct {
  SMBIOS_STRUCTURE                      Hdr;
  SMBIOS_TABLE_STRING                   Description;
  UINT8                                 Type;                     ///< The enumeration value from MISC_MANAGEMENT_DEVICE_TYPE.
  UINT32                                Address;
  UINT8                                 AddressType;              ///< The enumeration value from MISC_MANAGEMENT_DEVICE_ADDRESS_TYPE.
} SMBIOS_TABLE_TYPE34;

///
/// Management Device Component (Type 35)
///
/// This structure associates a cooling device or environmental probe with structures
/// that define the controlling hardware device and (optionally) the component's thresholds.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   Description;
  UINT16                ManagementDeviceHandle;
  UINT16                ComponentHandle;
  UINT16                ThresholdHandle;
} SMBIOS_TABLE_TYPE35;

///
/// Management Device Threshold Data (Type 36).
///
/// The information in this structure defines threshold information for
/// a component (probe or cooling-unit) contained within a Management Device.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT16                LowerThresholdNonCritical;
  UINT16                UpperThresholdNonCritical;
  UINT16                LowerThresholdCritical;
  UINT16                UpperThresholdCritical;
  UINT16                LowerThresholdNonRecoverable;
  UINT16                UpperThresholdNonRecoverable;
} SMBIOS_TABLE_TYPE36;

///
/// Memory Channel Entry.
///
typedef struct {
  UINT8                 DeviceLoad;
  UINT16                DeviceHandle;
} MEMORY_DEVICE;

///
/// Memory Channel - Channel Type.
///
typedef enum {
  MemoryChannelTypeOther       = 0x01,
  MemoryChannelTypeUnknown     = 0x02,
  MemoryChannelTypeRambus      = 0x03,
  MemoryChannelTypeSyncLink    = 0x04
} MEMORY_CHANNEL_TYPE;

///
/// Memory Channel (Type 37)
///
/// The information in this structure provides the correlation between a Memory Channel
/// and its associated Memory Devices.  Each device presents one or more loads to the channel.
/// The sum of all device loads cannot exceed the channel's defined maximum.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 ChannelType;
  UINT8                 MaximumChannelLoad;
  UINT8                 MemoryDeviceCount;
  MEMORY_DEVICE         MemoryDevice[1];
} SMBIOS_TABLE_TYPE37;

///
/// IPMI Device Information - BMC Interface Type
///
typedef enum {
  IPMIDeviceInfoInterfaceTypeUnknown       = 0x00,
  IPMIDeviceInfoInterfaceTypeKCS           = 0x01, ///< The Keyboard Controller Style.
  IPMIDeviceInfoInterfaceTypeSMIC          = 0x02, ///< The Server Management Interface Chip.
  IPMIDeviceInfoInterfaceTypeBT            = 0x03, ///< The Block Transfer
  IPMIDeviceInfoInterfaceTypeSSIF          = 0x04  ///< SMBus System Interface
} BMC_INTERFACE_TYPE;

///
/// IPMI Device Information (Type 38).
///
/// The information in this structure defines the attributes of an
/// Intelligent Platform Management Interface (IPMI) Baseboard Management Controller (BMC).
///
/// The Type 42 structure can also be used to describe a physical management controller
/// host interface and one or more protocols that share that interface. If IPMI is not
/// shared with other protocols, either the Type 38 or Type 42 structures can be used.
/// Providing Type 38 is recommended for backward compatibility.
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 InterfaceType;              ///< The enumeration value from BMC_INTERFACE_TYPE.
  UINT8                 IPMISpecificationRevision;
  UINT8                 I2CSlaveAddress;
  UINT8                 NVStorageDeviceAddress;
  UINT64                BaseAddress;
  UINT8                 BaseAddressModifier_InterruptInfo;
  UINT8                 InterruptNumber;
} SMBIOS_TABLE_TYPE38;

///
/// System Power Supply - Power Supply Characteristics.
///
typedef struct {
  UINT16                        PowerSupplyHotReplaceable:1;
  UINT16                        PowerSupplyPresent       :1;
  UINT16                        PowerSupplyUnplugged     :1;
  UINT16                        InputVoltageRangeSwitch  :4;
  UINT16                        PowerSupplyStatus        :3;
  UINT16                        PowerSupplyType          :4;
  UINT16                        Reserved                 :2;
} SYS_POWER_SUPPLY_CHARACTERISTICS;

///
/// System Power Supply (Type 39).
///
/// This structure identifies attributes of a system power supply. One instance
/// of this record is present for each possible power supply in a system.
///
typedef struct {
  SMBIOS_STRUCTURE                  Hdr;
  UINT8                             PowerUnitGroup;
  SMBIOS_TABLE_STRING               Location;
  SMBIOS_TABLE_STRING               DeviceName;
  SMBIOS_TABLE_STRING               Manufacturer;
  SMBIOS_TABLE_STRING               SerialNumber;
  SMBIOS_TABLE_STRING               AssetTagNumber;
  SMBIOS_TABLE_STRING               ModelPartNumber;
  SMBIOS_TABLE_STRING               RevisionLevel;
  UINT16                            MaxPowerCapacity;
  SYS_POWER_SUPPLY_CHARACTERISTICS  PowerSupplyCharacteristics;
  UINT16                            InputVoltageProbeHandle;
  UINT16                            CoolingDeviceHandle;
  UINT16                            InputCurrentProbeHandle;
} SMBIOS_TABLE_TYPE39;

///
/// Additional Information Entry Format.
///
typedef struct {
  UINT8                   EntryLength;
  UINT16                  ReferencedHandle;
  UINT8                   ReferencedOffset;
  SMBIOS_TABLE_STRING     EntryString;
  UINT8                   Value[1];
} ADDITIONAL_INFORMATION_ENTRY;

///
/// Additional Information (Type 40).
///
/// This structure is intended to provide additional information for handling unspecified
/// enumerated values and interim field updates in another structure.
///
typedef struct {
  SMBIOS_STRUCTURE                      Hdr;
  UINT8                                 NumberOfAdditionalInformationEntries;
  ADDITIONAL_INFORMATION_ENTRY          AdditionalInfoEntries[1];
} SMBIOS_TABLE_TYPE40;

///
/// Onboard Devices Extended Information - Onboard Device Types.
///
typedef enum{
  OnBoardDeviceExtendedTypeOther          = 0x01,
  OnBoardDeviceExtendedTypeUnknown        = 0x02,
  OnBoardDeviceExtendedTypeVideo          = 0x03,
  OnBoardDeviceExtendedTypeScsiController = 0x04,
  OnBoardDeviceExtendedTypeEthernet       = 0x05,
  OnBoardDeviceExtendedTypeTokenRing      = 0x06,
  OnBoardDeviceExtendedTypeSound          = 0x07,
  OnBoardDeviceExtendedTypePATAController = 0x08,
  OnBoardDeviceExtendedTypeSATAController = 0x09,
  OnBoardDeviceExtendedTypeSASController  = 0x0A
} ONBOARD_DEVICE_EXTENDED_INFO_TYPE;

///
/// Onboard Devices Extended Information (Type 41).
///
/// The information in this structure defines the attributes of devices that
/// are onboard (soldered onto) a system element, usually the baseboard.
/// In general, an entry in this table implies that the BIOS has some level of
/// control over the enabling of the associated device for use by the system.
///
typedef struct {
  SMBIOS_STRUCTURE                  Hdr;
  SMBIOS_TABLE_STRING               ReferenceDesignation;
  UINT8                             DeviceType;             ///< The enumeration value from ONBOARD_DEVICE_EXTENDED_INFO_TYPE
  UINT8                             DeviceTypeInstance;
  UINT16                            SegmentGroupNum;
  UINT8                             BusNum;
  UINT8                             DevFuncNum;
} SMBIOS_TABLE_TYPE41;

///
///  Management Controller Host Interface - Protocol Record Data Format.
///
typedef struct {
  UINT8                        ProtocolType;
  UINT8                        ProtocolTypeDataLen;
  UINT8                        ProtocolTypeData[1];
} MC_HOST_INTERFACE_PROTOCOL_RECORD;

///
/// Management Controller Host Interface - Interface Types.
/// 00h - 3Fh: MCTP Host Interfaces
///
typedef enum{
  MCHostInterfaceTypeNetworkHostInterface       = 0x40,
  MCHostInterfaceTypeOemDefined                 = 0xF0
} MC_HOST_INTERFACE_TYPE;

///
/// Management Controller Host Interface - Protocol Types.
///
typedef enum{
  MCHostInterfaceProtocolTypeIPMI               = 0x02,
  MCHostInterfaceProtocolTypeMCTP               = 0x03,
  MCHostInterfaceProtocolTypeRedfishOverIP      = 0x04,
  MCHostInterfaceProtocolTypeOemDefined         = 0xF0
} MC_HOST_INTERFACE_PROTOCOL_TYPE;

///
/// Management Controller Host Interface (Type 42).
///
/// The information in this structure defines the attributes of a Management
/// Controller Host Interface that is not discoverable by "Plug and Play" mechanisms.
///
/// Type 42 should be used for management controller host interfaces that use protocols
/// other than IPMI or that use multiple protocols on a single host interface type.
///
/// This structure should also be provided if IPMI is shared with other protocols
/// over the same interface hardware. If IPMI is not shared with other protocols,
/// either the Type 38 or Type 42 structures can be used. Providing Type 38 is
/// recommended for backward compatibility. The structures are not required to
/// be mutually exclusive. Type 38 and Type 42 structures may be implemented
/// simultaneously to provide backward compatibility with IPMI applications or drivers
/// that do not yet recognize the Type 42 structure.
///
typedef struct {
  SMBIOS_STRUCTURE                  Hdr;
  UINT8                             InterfaceType;                  ///< The enumeration value from MC_HOST_INTERFACE_TYPE
  UINT8                             InterfaceTypeSpecificDataLength;
  UINT8                             InterfaceTypeSpecificData[4];   ///< This field has a minimum of four bytes
} SMBIOS_TABLE_TYPE42;


///
/// Processor Specific Block - Processor Architecture Type
///
typedef enum{
  ProcessorSpecificBlockArchTypeReserved   = 0x00,
  ProcessorSpecificBlockArchTypeIa32       = 0x01,
  ProcessorSpecificBlockArchTypeX64        = 0x02,
  ProcessorSpecificBlockArchTypeItanium    = 0x03,
  ProcessorSpecificBlockArchTypeAarch32    = 0x04,
  ProcessorSpecificBlockArchTypeAarch64    = 0x05,
  ProcessorSpecificBlockArchTypeRiscVRV32  = 0x06,
  ProcessorSpecificBlockArchTypeRiscVRV64  = 0x07,
  ProcessorSpecificBlockArchTypeRiscVRV128 = 0x08
} PROCESSOR_SPECIFIC_BLOCK_ARCH_TYPE;

///
/// Processor Specific Block is the standard container of processor-specific data.
///
typedef struct {
  UINT8                              Length;
  UINT8                              ProcessorArchType;
  ///
  /// Below followed by Processor-specific data
  ///
  ///
} PROCESSOR_SPECIFIC_BLOCK;

///
/// Processor Additional Information(Type 44).
///
/// The information in this structure defines the processor additional information in case
/// SMBIOS type 4 is not sufficient to describe processor characteristics.
/// The SMBIOS type 44 structure has a reference handle field to link back to the related
/// SMBIOS type 4 structure. There may be multiple SMBIOS type 44 structures linked to the
/// same SMBIOS type 4 structure. For example, when cores are not identical in a processor,
/// SMBIOS type 44 structures describe different core-specific information.
///
/// SMBIOS type 44 defines the standard header for the processor-specific block, while the
/// contents of processor-specific data are maintained by processor
/// architecture workgroups or vendors in separate documents.
///
typedef struct {
  SMBIOS_STRUCTURE                  Hdr;
  SMBIOS_HANDLE                     RefHandle;                 ///< This field refer to associated SMBIOS type 4
  ///
  /// Below followed by Processor-specific block
  ///
  PROCESSOR_SPECIFIC_BLOCK          ProcessorSpecificBlock;
} SMBIOS_TABLE_TYPE44;

///
/// TPM Device (Type 43).
///
typedef struct {
  SMBIOS_STRUCTURE                  Hdr;
  UINT8                             VendorID[4];
  UINT8                             MajorSpecVersion;
  UINT8                             MinorSpecVersion;
  UINT32                            FirmwareVersion1;
  UINT32                            FirmwareVersion2;
  SMBIOS_TABLE_STRING               Description;
  UINT64                            Characteristics;
  UINT32                            OemDefined;
} SMBIOS_TABLE_TYPE43;

///
/// Inactive (Type 126)
///
typedef struct {
  SMBIOS_STRUCTURE   Hdr;
} SMBIOS_TABLE_TYPE126;

///
/// End-of-Table (Type 127)
///
typedef struct {
  SMBIOS_STRUCTURE   Hdr;
} SMBIOS_TABLE_TYPE127;

///
/// Union of all the possible SMBIOS record types.
///
typedef union {
  SMBIOS_STRUCTURE      *Hdr;
  SMBIOS_TABLE_TYPE0    *Type0;
  SMBIOS_TABLE_TYPE1    *Type1;
  SMBIOS_TABLE_TYPE2    *Type2;
  SMBIOS_TABLE_TYPE3    *Type3;
  SMBIOS_TABLE_TYPE4    *Type4;
  SMBIOS_TABLE_TYPE5    *Type5;
  SMBIOS_TABLE_TYPE6    *Type6;
  SMBIOS_TABLE_TYPE7    *Type7;
  SMBIOS_TABLE_TYPE8    *Type8;
  SMBIOS_TABLE_TYPE9    *Type9;
  SMBIOS_TABLE_TYPE10   *Type10;
  SMBIOS_TABLE_TYPE11   *Type11;
  SMBIOS_TABLE_TYPE12   *Type12;
  SMBIOS_TABLE_TYPE13   *Type13;
  SMBIOS_TABLE_TYPE14   *Type14;
  SMBIOS_TABLE_TYPE15   *Type15;
  SMBIOS_TABLE_TYPE16   *Type16;
  SMBIOS_TABLE_TYPE17   *Type17;
  SMBIOS_TABLE_TYPE18   *Type18;
  SMBIOS_TABLE_TYPE19   *Type19;
  SMBIOS_TABLE_TYPE20   *Type20;
  SMBIOS_TABLE_TYPE21   *Type21;
  SMBIOS_TABLE_TYPE22   *Type22;
  SMBIOS_TABLE_TYPE23   *Type23;
  SMBIOS_TABLE_TYPE24   *Type24;
  SMBIOS_TABLE_TYPE25   *Type25;
  SMBIOS_TABLE_TYPE26   *Type26;
  SMBIOS_TABLE_TYPE27   *Type27;
  SMBIOS_TABLE_TYPE28   *Type28;
  SMBIOS_TABLE_TYPE29   *Type29;
  SMBIOS_TABLE_TYPE30   *Type30;
  SMBIOS_TABLE_TYPE31   *Type31;
  SMBIOS_TABLE_TYPE32   *Type32;
  SMBIOS_TABLE_TYPE33   *Type33;
  SMBIOS_TABLE_TYPE34   *Type34;
  SMBIOS_TABLE_TYPE35   *Type35;
  SMBIOS_TABLE_TYPE36   *Type36;
  SMBIOS_TABLE_TYPE37   *Type37;
  SMBIOS_TABLE_TYPE38   *Type38;
  SMBIOS_TABLE_TYPE39   *Type39;
  SMBIOS_TABLE_TYPE40   *Type40;
  SMBIOS_TABLE_TYPE41   *Type41;
  SMBIOS_TABLE_TYPE42   *Type42;
  SMBIOS_TABLE_TYPE43   *Type43;
  SMBIOS_TABLE_TYPE44   *Type44;
  SMBIOS_TABLE_TYPE126  *Type126;
  SMBIOS_TABLE_TYPE127  *Type127;
  UINT8                 *Raw;
} SMBIOS_STRUCTURE_POINTER;

#pragma pack()

#endif
