1 /** @file
2   Industry Standard Definitions of SMBIOS Table Specification v3.6.0.
3 
4 Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>
5 (C) Copyright 2015-2017 Hewlett Packard Enterprise Development LP<BR>
6 (C) Copyright 2015 - 2019 Hewlett Packard Enterprise Development LP<BR>
7 Copyright (c) 2022, AMD Incorporated. All rights reserved.<BR>
8 Copyright (c) 1985 - 2022, American Megatrends International LLC.<BR>
9 SPDX-License-Identifier: BSD-2-Clause-Patent
10 
11 **/
12 
13 #ifndef __SMBIOS_STANDARD_H__
14 #define __SMBIOS_STANDARD_H__
15 
16 ///
17 /// Reference SMBIOS 2.6, chapter 3.1.2.
18 /// For v2.1 and later, handle values in the range 0FF00h to 0FFFFh are reserved for
19 /// use by this specification.
20 ///
21 #define SMBIOS_HANDLE_RESERVED_BEGIN  0xFF00
22 
23 ///
24 /// Reference SMBIOS 2.7, chapter 6.1.2.
25 /// The UEFI Platform Initialization Specification reserves handle number FFFEh for its
26 /// EFI_SMBIOS_PROTOCOL.Add() function to mean "assign an unused handle number automatically."
27 /// This number is not used for any other purpose by the SMBIOS specification.
28 ///
29 #define SMBIOS_HANDLE_PI_RESERVED  0xFFFE
30 
31 ///
32 /// Reference SMBIOS 2.6, chapter 3.1.3.
33 /// Each text string is limited to 64 significant characters due to system MIF limitations.
34 /// Reference SMBIOS 2.7, chapter 6.1.3.
35 /// It will have no limit on the length of each individual text string.
36 ///
37 #define SMBIOS_STRING_MAX_LENGTH  64
38 
39 //
40 // The length of the entire structure table (including all strings) must be reported
41 // in the Structure Table Length field of the SMBIOS Structure Table Entry Point,
42 // which is a WORD field limited to 65,535 bytes.
43 //
44 #define SMBIOS_TABLE_MAX_LENGTH  0xFFFF
45 
46 //
47 // For SMBIOS 3.0, Structure table maximum size in Entry Point structure is DWORD field limited to 0xFFFFFFFF bytes.
48 //
49 #define SMBIOS_3_0_TABLE_MAX_LENGTH  0xFFFFFFFF
50 
51 //
52 // SMBIOS type macros which is according to SMBIOS 3.3.0 specification.
53 //
54 #define SMBIOS_TYPE_BIOS_INFORMATION                      0
55 #define SMBIOS_TYPE_SYSTEM_INFORMATION                    1
56 #define SMBIOS_TYPE_BASEBOARD_INFORMATION                 2
57 #define SMBIOS_TYPE_SYSTEM_ENCLOSURE                      3
58 #define SMBIOS_TYPE_PROCESSOR_INFORMATION                 4
59 #define SMBIOS_TYPE_MEMORY_CONTROLLER_INFORMATION         5
60 #define SMBIOS_TYPE_MEMORY_MODULE_INFORMATON              6
61 #define SMBIOS_TYPE_CACHE_INFORMATION                     7
62 #define SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION            8
63 #define SMBIOS_TYPE_SYSTEM_SLOTS                          9
64 #define SMBIOS_TYPE_ONBOARD_DEVICE_INFORMATION            10
65 #define SMBIOS_TYPE_OEM_STRINGS                           11
66 #define SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS          12
67 #define SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION             13
68 #define SMBIOS_TYPE_GROUP_ASSOCIATIONS                    14
69 #define SMBIOS_TYPE_SYSTEM_EVENT_LOG                      15
70 #define SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY                 16
71 #define SMBIOS_TYPE_MEMORY_DEVICE                         17
72 #define SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION        18
73 #define SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS           19
74 #define SMBIOS_TYPE_MEMORY_DEVICE_MAPPED_ADDRESS          20
75 #define SMBIOS_TYPE_BUILT_IN_POINTING_DEVICE              21
76 #define SMBIOS_TYPE_PORTABLE_BATTERY                      22
77 #define SMBIOS_TYPE_SYSTEM_RESET                          23
78 #define SMBIOS_TYPE_HARDWARE_SECURITY                     24
79 #define SMBIOS_TYPE_SYSTEM_POWER_CONTROLS                 25
80 #define SMBIOS_TYPE_VOLTAGE_PROBE                         26
81 #define SMBIOS_TYPE_COOLING_DEVICE                        27
82 #define SMBIOS_TYPE_TEMPERATURE_PROBE                     28
83 #define SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE              29
84 #define SMBIOS_TYPE_OUT_OF_BAND_REMOTE_ACCESS             30
85 #define SMBIOS_TYPE_BOOT_INTEGRITY_SERVICE                31
86 #define SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION               32
87 #define SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION        33
88 #define SMBIOS_TYPE_MANAGEMENT_DEVICE                     34
89 #define SMBIOS_TYPE_MANAGEMENT_DEVICE_COMPONENT           35
90 #define SMBIOS_TYPE_MANAGEMENT_DEVICE_THRESHOLD_DATA      36
91 #define SMBIOS_TYPE_MEMORY_CHANNEL                        37
92 #define SMBIOS_TYPE_IPMI_DEVICE_INFORMATION               38
93 #define SMBIOS_TYPE_SYSTEM_POWER_SUPPLY                   39
94 #define SMBIOS_TYPE_ADDITIONAL_INFORMATION                40
95 #define SMBIOS_TYPE_ONBOARD_DEVICES_EXTENDED_INFORMATION  41
96 #define SMBIOS_TYPE_MANAGEMENT_CONTROLLER_HOST_INTERFACE  42
97 #define SMBIOS_TYPE_TPM_DEVICE                            43
98 #define SMBIOS_TYPE_PROCESSOR_ADDITIONAL_INFORMATION      44
99 #define SMBIOS_TYPE_FIRMWARE_INVENTORY_INFORMATION        45
100 #define SMBIOS_TYPE_STRING_PROPERTY_INFORMATION           46
101 
102 ///
103 /// Inactive type is added from SMBIOS 2.2. Reference SMBIOS 2.6, chapter 3.3.43.
104 /// Upper-level software that interprets the SMBIOS structure-table should bypass an
105 /// Inactive structure just like a structure type that the software does not recognize.
106 ///
107 #define SMBIOS_TYPE_INACTIVE  0x007E
108 
109 ///
110 /// End-of-table type is added from SMBIOS 2.2. Reference SMBIOS 2.6, chapter 3.3.44.
111 /// The end-of-table indicator is used in the last physical structure in a table
112 ///
113 #define SMBIOS_TYPE_END_OF_TABLE  0x007F
114 
115 #define SMBIOS_OEM_BEGIN  128
116 #define SMBIOS_OEM_END    255
117 
118 ///
119 /// Types 0 through 127 (7Fh) are reserved for and defined by this
120 /// specification. Types 128 through 256 (80h to FFh) are available for system- and OEM-specific information.
121 ///
122 typedef UINT8 SMBIOS_TYPE;
123 
124 ///
125 /// Specifies the structure's handle, a unique 16-bit number in the range 0 to 0FFFEh (for version
126 /// 2.0) or 0 to 0FEFFh (for version 2.1 and later). The handle can be used with the Get SMBIOS
127 /// Structure function to retrieve a specific structure; the handle numbers are not required to be
128 /// contiguous. For v2.1 and later, handle values in the range 0FF00h to 0FFFFh are reserved for
129 /// use by this specification.
130 /// If the system configuration changes, a previously assigned handle might no longer exist.
131 /// However once a handle has been assigned by the BIOS, the BIOS cannot re-assign that handle
132 /// number to another structure.
133 ///
134 typedef UINT16 SMBIOS_HANDLE;
135 
136 ///
137 /// Smbios Table Entry Point Structure.
138 ///
139 #pragma pack(1)
140 typedef struct {
141   UINT8     AnchorString[4];
142   UINT8     EntryPointStructureChecksum;
143   UINT8     EntryPointLength;
144   UINT8     MajorVersion;
145   UINT8     MinorVersion;
146   UINT16    MaxStructureSize;
147   UINT8     EntryPointRevision;
148   UINT8     FormattedArea[5];
149   UINT8     IntermediateAnchorString[5];
150   UINT8     IntermediateChecksum;
151   UINT16    TableLength;
152   UINT32    TableAddress;
153   UINT16    NumberOfSmbiosStructures;
154   UINT8     SmbiosBcdRevision;
155 } SMBIOS_TABLE_ENTRY_POINT;
156 
157 typedef struct {
158   UINT8     AnchorString[5];
159   UINT8     EntryPointStructureChecksum;
160   UINT8     EntryPointLength;
161   UINT8     MajorVersion;
162   UINT8     MinorVersion;
163   UINT8     DocRev;
164   UINT8     EntryPointRevision;
165   UINT8     Reserved;
166   UINT32    TableMaximumSize;
167   UINT64    TableAddress;
168 } SMBIOS_TABLE_3_0_ENTRY_POINT;
169 
170 ///
171 /// The Smbios structure header.
172 ///
173 typedef struct {
174   SMBIOS_TYPE      Type;
175   UINT8            Length;
176   SMBIOS_HANDLE    Handle;
177 } SMBIOS_STRUCTURE;
178 
179 ///
180 /// Text strings associated with a given SMBIOS structure are returned in the dmiStrucBuffer, appended directly after
181 /// the formatted portion of the structure. This method of returning string information eliminates the need for
182 /// application software to deal with pointers embedded in the SMBIOS structure. Each string is terminated with a null
183 /// (00h) BYTE and the set of strings is terminated with an additional null (00h) BYTE. When the formatted portion of
184 /// a SMBIOS structure references a string, it does so by specifying a non-zero string number within the structure's
185 /// string-set. For example, if a string field contains 02h, it references the second string following the formatted portion
186 /// of the SMBIOS structure. If a string field references no string, a null (0) is placed in that string field. If the
187 /// formatted portion of the structure contains string-reference fields and all the string fields are set to 0 (no string
188 /// references), the formatted section of the structure is followed by two null (00h) BYTES.
189 ///
190 typedef UINT8 SMBIOS_TABLE_STRING;
191 
192 ///
193 /// BIOS Characteristics
194 /// Defines which functions the BIOS supports. PCI, PCMCIA, Flash, etc.
195 ///
196 typedef struct {
197   UINT32    Reserved                         : 2; ///< Bits 0-1.
198   UINT32    Unknown                          : 1;
199   UINT32    BiosCharacteristicsNotSupported  : 1;
200   UINT32    IsaIsSupported                   : 1;
201   UINT32    McaIsSupported                   : 1;
202   UINT32    EisaIsSupported                  : 1;
203   UINT32    PciIsSupported                   : 1;
204   UINT32    PcmciaIsSupported                : 1;
205   UINT32    PlugAndPlayIsSupported           : 1;
206   UINT32    ApmIsSupported                   : 1;
207   UINT32    BiosIsUpgradable                 : 1;
208   UINT32    BiosShadowingAllowed             : 1;
209   UINT32    VlVesaIsSupported                : 1;
210   UINT32    EscdSupportIsAvailable           : 1;
211   UINT32    BootFromCdIsSupported            : 1;
212   UINT32    SelectableBootIsSupported        : 1;
213   UINT32    RomBiosIsSocketed                : 1;
214   UINT32    BootFromPcmciaIsSupported        : 1;
215   UINT32    EDDSpecificationIsSupported      : 1;
216   UINT32    JapaneseNecFloppyIsSupported     : 1;
217   UINT32    JapaneseToshibaFloppyIsSupported : 1;
218   UINT32    Floppy525_360IsSupported         : 1;
219   UINT32    Floppy525_12IsSupported          : 1;
220   UINT32    Floppy35_720IsSupported          : 1;
221   UINT32    Floppy35_288IsSupported          : 1;
222   UINT32    PrintScreenIsSupported           : 1;
223   UINT32    Keyboard8042IsSupported          : 1;
224   UINT32    SerialIsSupported                : 1;
225   UINT32    PrinterIsSupported               : 1;
226   UINT32    CgaMonoIsSupported               : 1;
227   UINT32    NecPc98                          : 1;
228   UINT32    ReservedForVendor                : 32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor
229                                                    ///< and bits 48-63 reserved for System Vendor.
230 } MISC_BIOS_CHARACTERISTICS;
231 
232 ///
233 /// BIOS Characteristics Extension Byte 1.
234 /// This information, available for SMBIOS version 2.1 and later, appears at offset 12h
235 /// within the BIOS Information structure.
236 ///
237 typedef struct {
238   UINT8    AcpiIsSupported              : 1;
239   UINT8    UsbLegacyIsSupported         : 1;
240   UINT8    AgpIsSupported               : 1;
241   UINT8    I2OBootIsSupported           : 1;
242   UINT8    Ls120BootIsSupported         : 1;
243   UINT8    AtapiZipDriveBootIsSupported : 1;
244   UINT8    Boot1394IsSupported          : 1;
245   UINT8    SmartBatteryIsSupported      : 1;
246 } MBCE_BIOS_RESERVED;
247 
248 ///
249 /// BIOS Characteristics Extension Byte 2.
250 /// This information, available for SMBIOS version 2.3 and later, appears at offset 13h
251 /// within the BIOS Information structure.
252 ///
253 typedef struct {
254   UINT8    BiosBootSpecIsSupported           : 1;
255   UINT8    FunctionKeyNetworkBootIsSupported : 1;
256   UINT8    TargetContentDistributionEnabled  : 1;
257   UINT8    UefiSpecificationSupported        : 1;
258   UINT8    VirtualMachineSupported           : 1;
259   UINT8    ManufacturingModeSupported        : 1;
260   UINT8    ManufacturingModeEnabled          : 1;
261   UINT8    ExtensionByte2Reserved            : 1;
262 } MBCE_SYSTEM_RESERVED;
263 
264 ///
265 /// BIOS Characteristics Extension Bytes.
266 ///
267 typedef struct {
268   MBCE_BIOS_RESERVED      BiosReserved;
269   MBCE_SYSTEM_RESERVED    SystemReserved;
270 } MISC_BIOS_CHARACTERISTICS_EXTENSION;
271 
272 ///
273 /// Extended BIOS ROM size.
274 ///
275 typedef struct {
276   UINT16    Size : 14;
277   UINT16    Unit : 2;
278 } EXTENDED_BIOS_ROM_SIZE;
279 
280 ///
281 /// BIOS Information (Type 0).
282 ///
283 typedef struct {
284   SMBIOS_STRUCTURE             Hdr;
285   SMBIOS_TABLE_STRING          Vendor;
286   SMBIOS_TABLE_STRING          BiosVersion;
287   UINT16                       BiosSegment;
288   SMBIOS_TABLE_STRING          BiosReleaseDate;
289   UINT8                        BiosSize;
290   MISC_BIOS_CHARACTERISTICS    BiosCharacteristics;
291   UINT8                        BIOSCharacteristicsExtensionBytes[2];
292   UINT8                        SystemBiosMajorRelease;
293   UINT8                        SystemBiosMinorRelease;
294   UINT8                        EmbeddedControllerFirmwareMajorRelease;
295   UINT8                        EmbeddedControllerFirmwareMinorRelease;
296   //
297   // Add for smbios 3.1.0
298   //
299   EXTENDED_BIOS_ROM_SIZE       ExtendedBiosSize;
300 } SMBIOS_TABLE_TYPE0;
301 
302 ///
303 ///  System Wake-up Type.
304 ///
305 typedef enum {
306   SystemWakeupTypeReserved        = 0x00,
307   SystemWakeupTypeOther           = 0x01,
308   SystemWakeupTypeUnknown         = 0x02,
309   SystemWakeupTypeApmTimer        = 0x03,
310   SystemWakeupTypeModemRing       = 0x04,
311   SystemWakeupTypeLanRemote       = 0x05,
312   SystemWakeupTypePowerSwitch     = 0x06,
313   SystemWakeupTypePciPme          = 0x07,
314   SystemWakeupTypeAcPowerRestored = 0x08
315 } MISC_SYSTEM_WAKEUP_TYPE;
316 
317 ///
318 /// System Information (Type 1).
319 ///
320 /// The information in this structure defines attributes of the overall system and is
321 /// intended to be associated with the Component ID group of the system's MIF.
322 /// An SMBIOS implementation is associated with a single system instance and contains
323 /// one and only one System Information (Type 1) structure.
324 ///
325 typedef struct {
326   SMBIOS_STRUCTURE       Hdr;
327   SMBIOS_TABLE_STRING    Manufacturer;
328   SMBIOS_TABLE_STRING    ProductName;
329   SMBIOS_TABLE_STRING    Version;
330   SMBIOS_TABLE_STRING    SerialNumber;
331   GUID                   Uuid;
332   UINT8                  WakeUpType;            ///< The enumeration value from MISC_SYSTEM_WAKEUP_TYPE.
333   SMBIOS_TABLE_STRING    SKUNumber;
334   SMBIOS_TABLE_STRING    Family;
335 } SMBIOS_TABLE_TYPE1;
336 
337 ///
338 ///  Base Board - Feature Flags.
339 ///
340 typedef struct {
341   UINT8    Motherboard          : 1;
342   UINT8    RequiresDaughterCard : 1;
343   UINT8    Removable            : 1;
344   UINT8    Replaceable          : 1;
345   UINT8    HotSwappable         : 1;
346   UINT8    Reserved             : 3;
347 } BASE_BOARD_FEATURE_FLAGS;
348 
349 ///
350 ///  Base Board - Board Type.
351 ///
352 typedef enum {
353   BaseBoardTypeUnknown                = 0x1,
354   BaseBoardTypeOther                  = 0x2,
355   BaseBoardTypeServerBlade            = 0x3,
356   BaseBoardTypeConnectivitySwitch     = 0x4,
357   BaseBoardTypeSystemManagementModule = 0x5,
358   BaseBoardTypeProcessorModule        = 0x6,
359   BaseBoardTypeIOModule               = 0x7,
360   BaseBoardTypeMemoryModule           = 0x8,
361   BaseBoardTypeDaughterBoard          = 0x9,
362   BaseBoardTypeMotherBoard            = 0xA,
363   BaseBoardTypeProcessorMemoryModule  = 0xB,
364   BaseBoardTypeProcessorIOModule      = 0xC,
365   BaseBoardTypeInterconnectBoard      = 0xD
366 } BASE_BOARD_TYPE;
367 
368 ///
369 /// Base Board (or Module) Information (Type 2).
370 ///
371 /// The information in this structure defines attributes of a system baseboard -
372 /// for example a motherboard, planar, or server blade or other standard system module.
373 ///
374 typedef struct {
375   SMBIOS_STRUCTURE            Hdr;
376   SMBIOS_TABLE_STRING         Manufacturer;
377   SMBIOS_TABLE_STRING         ProductName;
378   SMBIOS_TABLE_STRING         Version;
379   SMBIOS_TABLE_STRING         SerialNumber;
380   SMBIOS_TABLE_STRING         AssetTag;
381   BASE_BOARD_FEATURE_FLAGS    FeatureFlag;
382   SMBIOS_TABLE_STRING         LocationInChassis;
383   UINT16                      ChassisHandle;
384   UINT8                       BoardType;            ///< The enumeration value from BASE_BOARD_TYPE.
385   UINT8                       NumberOfContainedObjectHandles;
386   UINT16                      ContainedObjectHandles[1];
387 } SMBIOS_TABLE_TYPE2;
388 
389 ///
390 /// System Enclosure or Chassis Types
391 ///
392 typedef enum {
393   MiscChassisTypeOther               = 0x01,
394   MiscChassisTypeUnknown             = 0x02,
395   MiscChassisTypeDeskTop             = 0x03,
396   MiscChassisTypeLowProfileDesktop   = 0x04,
397   MiscChassisTypePizzaBox            = 0x05,
398   MiscChassisTypeMiniTower           = 0x06,
399   MiscChassisTypeTower               = 0x07,
400   MiscChassisTypePortable            = 0x08,
401   MiscChassisTypeLapTop              = 0x09,
402   MiscChassisTypeNotebook            = 0x0A,
403   MiscChassisTypeHandHeld            = 0x0B,
404   MiscChassisTypeDockingStation      = 0x0C,
405   MiscChassisTypeAllInOne            = 0x0D,
406   MiscChassisTypeSubNotebook         = 0x0E,
407   MiscChassisTypeSpaceSaving         = 0x0F,
408   MiscChassisTypeLunchBox            = 0x10,
409   MiscChassisTypeMainServerChassis   = 0x11,
410   MiscChassisTypeExpansionChassis    = 0x12,
411   MiscChassisTypeSubChassis          = 0x13,
412   MiscChassisTypeBusExpansionChassis = 0x14,
413   MiscChassisTypePeripheralChassis   = 0x15,
414   MiscChassisTypeRaidChassis         = 0x16,
415   MiscChassisTypeRackMountChassis    = 0x17,
416   MiscChassisTypeSealedCasePc        = 0x18,
417   MiscChassisMultiSystemChassis      = 0x19,
418   MiscChassisCompactPCI              = 0x1A,
419   MiscChassisAdvancedTCA             = 0x1B,
420   MiscChassisBlade                   = 0x1C,
421   MiscChassisBladeEnclosure          = 0x1D,
422   MiscChassisTablet                  = 0x1E,
423   MiscChassisConvertible             = 0x1F,
424   MiscChassisDetachable              = 0x20,
425   MiscChassisIoTGateway              = 0x21,
426   MiscChassisEmbeddedPc              = 0x22,
427   MiscChassisMiniPc                  = 0x23,
428   MiscChassisStickPc                 = 0x24
429 } MISC_CHASSIS_TYPE;
430 
431 ///
432 /// System Enclosure or Chassis States .
433 ///
434 typedef enum {
435   ChassisStateOther          = 0x01,
436   ChassisStateUnknown        = 0x02,
437   ChassisStateSafe           = 0x03,
438   ChassisStateWarning        = 0x04,
439   ChassisStateCritical       = 0x05,
440   ChassisStateNonRecoverable = 0x06
441 } MISC_CHASSIS_STATE;
442 
443 ///
444 /// System Enclosure or Chassis Security Status.
445 ///
446 typedef enum {
447   ChassisSecurityStatusOther                          = 0x01,
448   ChassisSecurityStatusUnknown                        = 0x02,
449   ChassisSecurityStatusNone                           = 0x03,
450   ChassisSecurityStatusExternalInterfaceLockedOut     = 0x04,
451   ChassisSecurityStatusExternalInterfaceLockedEnabled = 0x05
452 } MISC_CHASSIS_SECURITY_STATE;
453 
454 ///
455 /// Contained Element record
456 ///
457 typedef struct {
458   UINT8    ContainedElementType;
459   UINT8    ContainedElementMinimum;
460   UINT8    ContainedElementMaximum;
461 } CONTAINED_ELEMENT;
462 
463 ///
464 /// System Enclosure or Chassis (Type 3).
465 ///
466 /// The information in this structure defines attributes of the system's mechanical enclosure(s).
467 /// For example, if a system included a separate enclosure for its peripheral devices,
468 /// two structures would be returned: one for the main, system enclosure and the second for
469 /// the peripheral device enclosure.  The additions to this structure in v2.1 of this specification
470 /// support the population of the CIM_Chassis class.
471 ///
472 typedef struct {
473   SMBIOS_STRUCTURE       Hdr;
474   SMBIOS_TABLE_STRING    Manufacturer;
475   UINT8                  Type;
476   SMBIOS_TABLE_STRING    Version;
477   SMBIOS_TABLE_STRING    SerialNumber;
478   SMBIOS_TABLE_STRING    AssetTag;
479   UINT8                  BootupState;                 ///< The enumeration value from MISC_CHASSIS_STATE.
480   UINT8                  PowerSupplyState;            ///< The enumeration value from MISC_CHASSIS_STATE.
481   UINT8                  ThermalState;                ///< The enumeration value from MISC_CHASSIS_STATE.
482   UINT8                  SecurityStatus;              ///< The enumeration value from MISC_CHASSIS_SECURITY_STATE.
483   UINT8                  OemDefined[4];
484   UINT8                  Height;
485   UINT8                  NumberofPowerCords;
486   UINT8                  ContainedElementCount;
487   UINT8                  ContainedElementRecordLength;
488   //
489   // Can have 0 to (ContainedElementCount * ContainedElementRecordLength) contained elements
490   //
491   CONTAINED_ELEMENT      ContainedElements[1];
492   //
493   // Add for smbios 2.7
494   //
495   // Since ContainedElements has a variable number of entries, must not define SKUNumber in
496   // the structure.  Need to reference it by starting at offset 0x15 and adding
497   // (ContainedElementCount * ContainedElementRecordLength) bytes.
498   //
499   // SMBIOS_TABLE_STRING         SKUNumber;
500 } SMBIOS_TABLE_TYPE3;
501 
502 ///
503 /// Processor Information - Processor Type.
504 ///
505 typedef enum {
506   ProcessorOther   = 0x01,
507   ProcessorUnknown = 0x02,
508   CentralProcessor = 0x03,
509   MathProcessor    = 0x04,
510   DspProcessor     = 0x05,
511   VideoProcessor   = 0x06
512 } PROCESSOR_TYPE_DATA;
513 
514 ///
515 /// Processor Information - Processor Family.
516 ///
517 typedef enum {
518   ProcessorFamilyOther                           = 0x01,
519   ProcessorFamilyUnknown                         = 0x02,
520   ProcessorFamily8086                            = 0x03,
521   ProcessorFamily80286                           = 0x04,
522   ProcessorFamilyIntel386                        = 0x05,
523   ProcessorFamilyIntel486                        = 0x06,
524   ProcessorFamily8087                            = 0x07,
525   ProcessorFamily80287                           = 0x08,
526   ProcessorFamily80387                           = 0x09,
527   ProcessorFamily80487                           = 0x0A,
528   ProcessorFamilyPentium                         = 0x0B,
529   ProcessorFamilyPentiumPro                      = 0x0C,
530   ProcessorFamilyPentiumII                       = 0x0D,
531   ProcessorFamilyPentiumMMX                      = 0x0E,
532   ProcessorFamilyCeleron                         = 0x0F,
533   ProcessorFamilyPentiumIIXeon                   = 0x10,
534   ProcessorFamilyPentiumIII                      = 0x11,
535   ProcessorFamilyM1                              = 0x12,
536   ProcessorFamilyM2                              = 0x13,
537   ProcessorFamilyIntelCeleronM                   = 0x14,
538   ProcessorFamilyIntelPentium4Ht                 = 0x15,
539   ProcessorFamilyAmdDuron                        = 0x18,
540   ProcessorFamilyK5                              = 0x19,
541   ProcessorFamilyK6                              = 0x1A,
542   ProcessorFamilyK6_2                            = 0x1B,
543   ProcessorFamilyK6_3                            = 0x1C,
544   ProcessorFamilyAmdAthlon                       = 0x1D,
545   ProcessorFamilyAmd29000                        = 0x1E,
546   ProcessorFamilyK6_2Plus                        = 0x1F,
547   ProcessorFamilyPowerPC                         = 0x20,
548   ProcessorFamilyPowerPC601                      = 0x21,
549   ProcessorFamilyPowerPC603                      = 0x22,
550   ProcessorFamilyPowerPC603Plus                  = 0x23,
551   ProcessorFamilyPowerPC604                      = 0x24,
552   ProcessorFamilyPowerPC620                      = 0x25,
553   ProcessorFamilyPowerPCx704                     = 0x26,
554   ProcessorFamilyPowerPC750                      = 0x27,
555   ProcessorFamilyIntelCoreDuo                    = 0x28,
556   ProcessorFamilyIntelCoreDuoMobile              = 0x29,
557   ProcessorFamilyIntelCoreSoloMobile             = 0x2A,
558   ProcessorFamilyIntelAtom                       = 0x2B,
559   ProcessorFamilyIntelCoreM                      = 0x2C,
560   ProcessorFamilyIntelCorem3                     = 0x2D,
561   ProcessorFamilyIntelCorem5                     = 0x2E,
562   ProcessorFamilyIntelCorem7                     = 0x2F,
563   ProcessorFamilyAlpha                           = 0x30,
564   ProcessorFamilyAlpha21064                      = 0x31,
565   ProcessorFamilyAlpha21066                      = 0x32,
566   ProcessorFamilyAlpha21164                      = 0x33,
567   ProcessorFamilyAlpha21164PC                    = 0x34,
568   ProcessorFamilyAlpha21164a                     = 0x35,
569   ProcessorFamilyAlpha21264                      = 0x36,
570   ProcessorFamilyAlpha21364                      = 0x37,
571   ProcessorFamilyAmdTurionIIUltraDualCoreMobileM = 0x38,
572   ProcessorFamilyAmdTurionIIDualCoreMobileM      = 0x39,
573   ProcessorFamilyAmdAthlonIIDualCoreM            = 0x3A,
574   ProcessorFamilyAmdOpteron6100Series            = 0x3B,
575   ProcessorFamilyAmdOpteron4100Series            = 0x3C,
576   ProcessorFamilyAmdOpteron6200Series            = 0x3D,
577   ProcessorFamilyAmdOpteron4200Series            = 0x3E,
578   ProcessorFamilyAmdFxSeries                     = 0x3F,
579   ProcessorFamilyMips                            = 0x40,
580   ProcessorFamilyMIPSR4000                       = 0x41,
581   ProcessorFamilyMIPSR4200                       = 0x42,
582   ProcessorFamilyMIPSR4400                       = 0x43,
583   ProcessorFamilyMIPSR4600                       = 0x44,
584   ProcessorFamilyMIPSR10000                      = 0x45,
585   ProcessorFamilyAmdCSeries                      = 0x46,
586   ProcessorFamilyAmdESeries                      = 0x47,
587   ProcessorFamilyAmdASeries                      = 0x48, ///< SMBIOS spec 2.8.0 updated the name
588   ProcessorFamilyAmdGSeries                      = 0x49,
589   ProcessorFamilyAmdZSeries                      = 0x4A,
590   ProcessorFamilyAmdRSeries                      = 0x4B,
591   ProcessorFamilyAmdOpteron4300                  = 0x4C,
592   ProcessorFamilyAmdOpteron6300                  = 0x4D,
593   ProcessorFamilyAmdOpteron3300                  = 0x4E,
594   ProcessorFamilyAmdFireProSeries                = 0x4F,
595   ProcessorFamilySparc                           = 0x50,
596   ProcessorFamilySuperSparc                      = 0x51,
597   ProcessorFamilymicroSparcII                    = 0x52,
598   ProcessorFamilymicroSparcIIep                  = 0x53,
599   ProcessorFamilyUltraSparc                      = 0x54,
600   ProcessorFamilyUltraSparcII                    = 0x55,
601   ProcessorFamilyUltraSparcIii                   = 0x56,
602   ProcessorFamilyUltraSparcIII                   = 0x57,
603   ProcessorFamilyUltraSparcIIIi                  = 0x58,
604   ProcessorFamily68040                           = 0x60,
605   ProcessorFamily68xxx                           = 0x61,
606   ProcessorFamily68000                           = 0x62,
607   ProcessorFamily68010                           = 0x63,
608   ProcessorFamily68020                           = 0x64,
609   ProcessorFamily68030                           = 0x65,
610   ProcessorFamilyAmdAthlonX4QuadCore             = 0x66,
611   ProcessorFamilyAmdOpteronX1000Series           = 0x67,
612   ProcessorFamilyAmdOpteronX2000Series           = 0x68,
613   ProcessorFamilyAmdOpteronASeries               = 0x69,
614   ProcessorFamilyAmdOpteronX3000Series           = 0x6A,
615   ProcessorFamilyAmdZen                          = 0x6B,
616   ProcessorFamilyHobbit                          = 0x70,
617   ProcessorFamilyCrusoeTM5000                    = 0x78,
618   ProcessorFamilyCrusoeTM3000                    = 0x79,
619   ProcessorFamilyEfficeonTM8000                  = 0x7A,
620   ProcessorFamilyWeitek                          = 0x80,
621   ProcessorFamilyItanium                         = 0x82,
622   ProcessorFamilyAmdAthlon64                     = 0x83,
623   ProcessorFamilyAmdOpteron                      = 0x84,
624   ProcessorFamilyAmdSempron                      = 0x85,
625   ProcessorFamilyAmdTurion64Mobile               = 0x86,
626   ProcessorFamilyDualCoreAmdOpteron              = 0x87,
627   ProcessorFamilyAmdAthlon64X2DualCore           = 0x88,
628   ProcessorFamilyAmdTurion64X2Mobile             = 0x89,
629   ProcessorFamilyQuadCoreAmdOpteron              = 0x8A,
630   ProcessorFamilyThirdGenerationAmdOpteron       = 0x8B,
631   ProcessorFamilyAmdPhenomFxQuadCore             = 0x8C,
632   ProcessorFamilyAmdPhenomX4QuadCore             = 0x8D,
633   ProcessorFamilyAmdPhenomX2DualCore             = 0x8E,
634   ProcessorFamilyAmdAthlonX2DualCore             = 0x8F,
635   ProcessorFamilyPARISC                          = 0x90,
636   ProcessorFamilyPaRisc8500                      = 0x91,
637   ProcessorFamilyPaRisc8000                      = 0x92,
638   ProcessorFamilyPaRisc7300LC                    = 0x93,
639   ProcessorFamilyPaRisc7200                      = 0x94,
640   ProcessorFamilyPaRisc7100LC                    = 0x95,
641   ProcessorFamilyPaRisc7100                      = 0x96,
642   ProcessorFamilyV30                             = 0xA0,
643   ProcessorFamilyQuadCoreIntelXeon3200Series     = 0xA1,
644   ProcessorFamilyDualCoreIntelXeon3000Series     = 0xA2,
645   ProcessorFamilyQuadCoreIntelXeon5300Series     = 0xA3,
646   ProcessorFamilyDualCoreIntelXeon5100Series     = 0xA4,
647   ProcessorFamilyDualCoreIntelXeon5000Series     = 0xA5,
648   ProcessorFamilyDualCoreIntelXeonLV             = 0xA6,
649   ProcessorFamilyDualCoreIntelXeonULV            = 0xA7,
650   ProcessorFamilyDualCoreIntelXeon7100Series     = 0xA8,
651   ProcessorFamilyQuadCoreIntelXeon5400Series     = 0xA9,
652   ProcessorFamilyQuadCoreIntelXeon               = 0xAA,
653   ProcessorFamilyDualCoreIntelXeon5200Series     = 0xAB,
654   ProcessorFamilyDualCoreIntelXeon7200Series     = 0xAC,
655   ProcessorFamilyQuadCoreIntelXeon7300Series     = 0xAD,
656   ProcessorFamilyQuadCoreIntelXeon7400Series     = 0xAE,
657   ProcessorFamilyMultiCoreIntelXeon7400Series    = 0xAF,
658   ProcessorFamilyPentiumIIIXeon                  = 0xB0,
659   ProcessorFamilyPentiumIIISpeedStep             = 0xB1,
660   ProcessorFamilyPentium4                        = 0xB2,
661   ProcessorFamilyIntelXeon                       = 0xB3,
662   ProcessorFamilyAS400                           = 0xB4,
663   ProcessorFamilyIntelXeonMP                     = 0xB5,
664   ProcessorFamilyAMDAthlonXP                     = 0xB6,
665   ProcessorFamilyAMDAthlonMP                     = 0xB7,
666   ProcessorFamilyIntelItanium2                   = 0xB8,
667   ProcessorFamilyIntelPentiumM                   = 0xB9,
668   ProcessorFamilyIntelCeleronD                   = 0xBA,
669   ProcessorFamilyIntelPentiumD                   = 0xBB,
670   ProcessorFamilyIntelPentiumEx                  = 0xBC,
671   ProcessorFamilyIntelCoreSolo                   = 0xBD, ///< SMBIOS spec 2.6 updated this value
672   ProcessorFamilyReserved                        = 0xBE,
673   ProcessorFamilyIntelCore2                      = 0xBF,
674   ProcessorFamilyIntelCore2Solo                  = 0xC0,
675   ProcessorFamilyIntelCore2Extreme               = 0xC1,
676   ProcessorFamilyIntelCore2Quad                  = 0xC2,
677   ProcessorFamilyIntelCore2ExtremeMobile         = 0xC3,
678   ProcessorFamilyIntelCore2DuoMobile             = 0xC4,
679   ProcessorFamilyIntelCore2SoloMobile            = 0xC5,
680   ProcessorFamilyIntelCoreI7                     = 0xC6,
681   ProcessorFamilyDualCoreIntelCeleron            = 0xC7,
682   ProcessorFamilyIBM390                          = 0xC8,
683   ProcessorFamilyG4                              = 0xC9,
684   ProcessorFamilyG5                              = 0xCA,
685   ProcessorFamilyG6                              = 0xCB,
686   ProcessorFamilyzArchitecture                   = 0xCC,
687   ProcessorFamilyIntelCoreI5                     = 0xCD,
688   ProcessorFamilyIntelCoreI3                     = 0xCE,
689   ProcessorFamilyIntelCoreI9                     = 0xCF,
690   ProcessorFamilyViaC7M                          = 0xD2,
691   ProcessorFamilyViaC7D                          = 0xD3,
692   ProcessorFamilyViaC7                           = 0xD4,
693   ProcessorFamilyViaEden                         = 0xD5,
694   ProcessorFamilyMultiCoreIntelXeon              = 0xD6,
695   ProcessorFamilyDualCoreIntelXeon3Series        = 0xD7,
696   ProcessorFamilyQuadCoreIntelXeon3Series        = 0xD8,
697   ProcessorFamilyViaNano                         = 0xD9,
698   ProcessorFamilyDualCoreIntelXeon5Series        = 0xDA,
699   ProcessorFamilyQuadCoreIntelXeon5Series        = 0xDB,
700   ProcessorFamilyDualCoreIntelXeon7Series        = 0xDD,
701   ProcessorFamilyQuadCoreIntelXeon7Series        = 0xDE,
702   ProcessorFamilyMultiCoreIntelXeon7Series       = 0xDF,
703   ProcessorFamilyMultiCoreIntelXeon3400Series    = 0xE0,
704   ProcessorFamilyAmdOpteron3000Series            = 0xE4,
705   ProcessorFamilyAmdSempronII                    = 0xE5,
706   ProcessorFamilyEmbeddedAmdOpteronQuadCore      = 0xE6,
707   ProcessorFamilyAmdPhenomTripleCore             = 0xE7,
708   ProcessorFamilyAmdTurionUltraDualCoreMobile    = 0xE8,
709   ProcessorFamilyAmdTurionDualCoreMobile         = 0xE9,
710   ProcessorFamilyAmdAthlonDualCore               = 0xEA,
711   ProcessorFamilyAmdSempronSI                    = 0xEB,
712   ProcessorFamilyAmdPhenomII                     = 0xEC,
713   ProcessorFamilyAmdAthlonII                     = 0xED,
714   ProcessorFamilySixCoreAmdOpteron               = 0xEE,
715   ProcessorFamilyAmdSempronM                     = 0xEF,
716   ProcessorFamilyi860                            = 0xFA,
717   ProcessorFamilyi960                            = 0xFB,
718   ProcessorFamilyIndicatorFamily2                = 0xFE,
719   ProcessorFamilyReserved1                       = 0xFF
720 } PROCESSOR_FAMILY_DATA;
721 
722 ///
723 /// Processor Information2 - Processor Family2.
724 ///
725 typedef enum {
726   ProcessorFamilyARMv7               = 0x0100,
727   ProcessorFamilyARMv8               = 0x0101,
728   ProcessorFamilyARMv9               = 0x0102,
729   ProcessorFamilySH3                 = 0x0104,
730   ProcessorFamilySH4                 = 0x0105,
731   ProcessorFamilyARM                 = 0x0118,
732   ProcessorFamilyStrongARM           = 0x0119,
733   ProcessorFamily6x86                = 0x012C,
734   ProcessorFamilyMediaGX             = 0x012D,
735   ProcessorFamilyMII                 = 0x012E,
736   ProcessorFamilyWinChip             = 0x0140,
737   ProcessorFamilyDSP                 = 0x015E,
738   ProcessorFamilyVideoProcessor      = 0x01F4,
739   ProcessorFamilyRiscvRV32           = 0x0200,
740   ProcessorFamilyRiscVRV64           = 0x0201,
741   ProcessorFamilyRiscVRV128          = 0x0202,
742   ProcessorFamilyLoongArch           = 0x0258,
743   ProcessorFamilyLoongson1           = 0x0259,
744   ProcessorFamilyLoongson2           = 0x025A,
745   ProcessorFamilyLoongson3           = 0x025B,
746   ProcessorFamilyLoongson2K          = 0x025C,
747   ProcessorFamilyLoongson3A          = 0x025D,
748   ProcessorFamilyLoongson3B          = 0x025E,
749   ProcessorFamilyLoongson3C          = 0x025F,
750   ProcessorFamilyLoongson3D          = 0x0260,
751   ProcessorFamilyLoongson3E          = 0x0261,
752   ProcessorFamilyDualCoreLoongson2K  = 0x0262,
753   ProcessorFamilyQuadCoreLoongson3A  = 0x026C,
754   ProcessorFamilyMultiCoreLoongson3A = 0x026D,
755   ProcessorFamilyQuadCoreLoongson3B  = 0x026E,
756   ProcessorFamilyMultiCoreLoongson3B = 0x026F,
757   ProcessorFamilyMultiCoreLoongson3C = 0x0270,
758   ProcessorFamilyMultiCoreLoongson3D = 0x0271
759 } PROCESSOR_FAMILY2_DATA;
760 
761 ///
762 /// Processor Information - Voltage.
763 ///
764 typedef struct {
765   UINT8    ProcessorVoltageCapability5V       : 1;
766   UINT8    ProcessorVoltageCapability3_3V     : 1;
767   UINT8    ProcessorVoltageCapability2_9V     : 1;
768   UINT8    ProcessorVoltageCapabilityReserved : 1; ///< Bit 3, must be zero.
769   UINT8    ProcessorVoltageReserved           : 3; ///< Bits 4-6, must be zero.
770   UINT8    ProcessorVoltageIndicateLegacy     : 1;
771 } PROCESSOR_VOLTAGE;
772 
773 ///
774 /// Processor Information - Processor Upgrade.
775 ///
776 typedef enum {
777   ProcessorUpgradeOther           = 0x01,
778   ProcessorUpgradeUnknown         = 0x02,
779   ProcessorUpgradeDaughterBoard   = 0x03,
780   ProcessorUpgradeZIFSocket       = 0x04,
781   ProcessorUpgradePiggyBack       = 0x05, ///< Replaceable.
782   ProcessorUpgradeNone            = 0x06,
783   ProcessorUpgradeLIFSocket       = 0x07,
784   ProcessorUpgradeSlot1           = 0x08,
785   ProcessorUpgradeSlot2           = 0x09,
786   ProcessorUpgrade370PinSocket    = 0x0A,
787   ProcessorUpgradeSlotA           = 0x0B,
788   ProcessorUpgradeSlotM           = 0x0C,
789   ProcessorUpgradeSocket423       = 0x0D,
790   ProcessorUpgradeSocketA         = 0x0E, ///< Socket 462.
791   ProcessorUpgradeSocket478       = 0x0F,
792   ProcessorUpgradeSocket754       = 0x10,
793   ProcessorUpgradeSocket940       = 0x11,
794   ProcessorUpgradeSocket939       = 0x12,
795   ProcessorUpgradeSocketmPGA604   = 0x13,
796   ProcessorUpgradeSocketLGA771    = 0x14,
797   ProcessorUpgradeSocketLGA775    = 0x15,
798   ProcessorUpgradeSocketS1        = 0x16,
799   ProcessorUpgradeAM2             = 0x17,
800   ProcessorUpgradeF1207           = 0x18,
801   ProcessorSocketLGA1366          = 0x19,
802   ProcessorUpgradeSocketG34       = 0x1A,
803   ProcessorUpgradeSocketAM3       = 0x1B,
804   ProcessorUpgradeSocketC32       = 0x1C,
805   ProcessorUpgradeSocketLGA1156   = 0x1D,
806   ProcessorUpgradeSocketLGA1567   = 0x1E,
807   ProcessorUpgradeSocketPGA988A   = 0x1F,
808   ProcessorUpgradeSocketBGA1288   = 0x20,
809   ProcessorUpgradeSocketrPGA988B  = 0x21,
810   ProcessorUpgradeSocketBGA1023   = 0x22,
811   ProcessorUpgradeSocketBGA1224   = 0x23,
812   ProcessorUpgradeSocketLGA1155   = 0x24, ///< SMBIOS spec 2.8.0 updated the name
813   ProcessorUpgradeSocketLGA1356   = 0x25,
814   ProcessorUpgradeSocketLGA2011   = 0x26,
815   ProcessorUpgradeSocketFS1       = 0x27,
816   ProcessorUpgradeSocketFS2       = 0x28,
817   ProcessorUpgradeSocketFM1       = 0x29,
818   ProcessorUpgradeSocketFM2       = 0x2A,
819   ProcessorUpgradeSocketLGA2011_3 = 0x2B,
820   ProcessorUpgradeSocketLGA1356_3 = 0x2C,
821   ProcessorUpgradeSocketLGA1150   = 0x2D,
822   ProcessorUpgradeSocketBGA1168   = 0x2E,
823   ProcessorUpgradeSocketBGA1234   = 0x2F,
824   ProcessorUpgradeSocketBGA1364   = 0x30,
825   ProcessorUpgradeSocketAM4       = 0x31,
826   ProcessorUpgradeSocketLGA1151   = 0x32,
827   ProcessorUpgradeSocketBGA1356   = 0x33,
828   ProcessorUpgradeSocketBGA1440   = 0x34,
829   ProcessorUpgradeSocketBGA1515   = 0x35,
830   ProcessorUpgradeSocketLGA3647_1 = 0x36,
831   ProcessorUpgradeSocketSP3       = 0x37,
832   ProcessorUpgradeSocketSP3r2     = 0x38,
833   ProcessorUpgradeSocketLGA2066   = 0x39,
834   ProcessorUpgradeSocketBGA1392   = 0x3A,
835   ProcessorUpgradeSocketBGA1510   = 0x3B,
836   ProcessorUpgradeSocketBGA1528   = 0x3C,
837   ProcessorUpgradeSocketLGA4189   = 0x3D,
838   ProcessorUpgradeSocketLGA1200   = 0x3E,
839   ProcessorUpgradeSocketLGA4677   = 0x3F,
840   ProcessorUpgradeSocketLGA1700   = 0x40,
841   ProcessorUpgradeSocketBGA1744   = 0x41,
842   ProcessorUpgradeSocketBGA1781   = 0x42,
843   ProcessorUpgradeSocketBGA1211   = 0x43,
844   ProcessorUpgradeSocketBGA2422   = 0x44,
845   ProcessorUpgradeSocketLGA1211   = 0x45,
846   ProcessorUpgradeSocketLGA2422   = 0x46,
847   ProcessorUpgradeSocketLGA5773   = 0x47,
848   ProcessorUpgradeSocketBGA5773   = 0x48
849 } PROCESSOR_UPGRADE;
850 
851 ///
852 /// Processor ID Field Description
853 ///
854 typedef struct {
855   UINT32    ProcessorSteppingId : 4;
856   UINT32    ProcessorModel      : 4;
857   UINT32    ProcessorFamily     : 4;
858   UINT32    ProcessorType       : 2;
859   UINT32    ProcessorReserved1  : 2;
860   UINT32    ProcessorXModel     : 4;
861   UINT32    ProcessorXFamily    : 8;
862   UINT32    ProcessorReserved2  : 4;
863 } PROCESSOR_SIGNATURE;
864 
865 typedef struct {
866   UINT32    ProcessorFpu       : 1;
867   UINT32    ProcessorVme       : 1;
868   UINT32    ProcessorDe        : 1;
869   UINT32    ProcessorPse       : 1;
870   UINT32    ProcessorTsc       : 1;
871   UINT32    ProcessorMsr       : 1;
872   UINT32    ProcessorPae       : 1;
873   UINT32    ProcessorMce       : 1;
874   UINT32    ProcessorCx8       : 1;
875   UINT32    ProcessorApic      : 1;
876   UINT32    ProcessorReserved1 : 1;
877   UINT32    ProcessorSep       : 1;
878   UINT32    ProcessorMtrr      : 1;
879   UINT32    ProcessorPge       : 1;
880   UINT32    ProcessorMca       : 1;
881   UINT32    ProcessorCmov      : 1;
882   UINT32    ProcessorPat       : 1;
883   UINT32    ProcessorPse36     : 1;
884   UINT32    ProcessorPsn       : 1;
885   UINT32    ProcessorClfsh     : 1;
886   UINT32    ProcessorReserved2 : 1;
887   UINT32    ProcessorDs        : 1;
888   UINT32    ProcessorAcpi      : 1;
889   UINT32    ProcessorMmx       : 1;
890   UINT32    ProcessorFxsr      : 1;
891   UINT32    ProcessorSse       : 1;
892   UINT32    ProcessorSse2      : 1;
893   UINT32    ProcessorSs        : 1;
894   UINT32    ProcessorReserved3 : 1;
895   UINT32    ProcessorTm        : 1;
896   UINT32    ProcessorReserved4 : 2;
897 } PROCESSOR_FEATURE_FLAGS;
898 
899 typedef struct {
900   UINT16    ProcessorReserved1              : 1;
901   UINT16    ProcessorUnknown                : 1;
902   UINT16    Processor64BitCapable           : 1;
903   UINT16    ProcessorMultiCore              : 1;
904   UINT16    ProcessorHardwareThread         : 1;
905   UINT16    ProcessorExecuteProtection      : 1;
906   UINT16    ProcessorEnhancedVirtualization : 1;
907   UINT16    ProcessorPowerPerformanceCtrl   : 1;
908   UINT16    Processor128BitCapable          : 1;
909   UINT16    ProcessorArm64SocId             : 1;
910   UINT16    ProcessorReserved2              : 6;
911 } PROCESSOR_CHARACTERISTIC_FLAGS;
912 
913 ///
914 /// Processor Information - Status
915 ///
916 typedef union {
917   struct {
918     UINT8    CpuStatus       : 3; ///< Indicates the status of the processor.
919     UINT8    Reserved1       : 3; ///< Reserved for future use. Must be set to zero.
920     UINT8    SocketPopulated : 1; ///< Indicates if the processor socket is populated or not.
921     UINT8    Reserved2       : 1; ///< Reserved for future use. Must be set to zero.
922   } Bits;
923   UINT8    Data;
924 } PROCESSOR_STATUS_DATA;
925 
926 typedef struct {
927   PROCESSOR_SIGNATURE        Signature;
928   PROCESSOR_FEATURE_FLAGS    FeatureFlags;
929 } PROCESSOR_ID_DATA;
930 
931 ///
932 /// Processor Information (Type 4).
933 ///
934 /// The information in this structure defines the attributes of a single processor;
935 /// a separate structure instance is provided for each system processor socket/slot.
936 /// For example, a system with an IntelDX2 processor would have a single
937 /// structure instance, while a system with an IntelSX2 processor would have a structure
938 /// to describe the main CPU, and a second structure to describe the 80487 co-processor.
939 ///
940 typedef struct {
941   SMBIOS_STRUCTURE       Hdr;
942   SMBIOS_TABLE_STRING    Socket;
943   UINT8                  ProcessorType;         ///< The enumeration value from PROCESSOR_TYPE_DATA.
944   UINT8                  ProcessorFamily;       ///< The enumeration value from PROCESSOR_FAMILY_DATA.
945   SMBIOS_TABLE_STRING    ProcessorManufacturer;
946   PROCESSOR_ID_DATA      ProcessorId;
947   SMBIOS_TABLE_STRING    ProcessorVersion;
948   PROCESSOR_VOLTAGE      Voltage;
949   UINT16                 ExternalClock;
950   UINT16                 MaxSpeed;
951   UINT16                 CurrentSpeed;
952   UINT8                  Status;
953   UINT8                  ProcessorUpgrade;     ///< The enumeration value from PROCESSOR_UPGRADE.
954   UINT16                 L1CacheHandle;
955   UINT16                 L2CacheHandle;
956   UINT16                 L3CacheHandle;
957   SMBIOS_TABLE_STRING    SerialNumber;
958   SMBIOS_TABLE_STRING    AssetTag;
959   SMBIOS_TABLE_STRING    PartNumber;
960   //
961   // Add for smbios 2.5
962   //
963   UINT8                  CoreCount;
964   UINT8                  EnabledCoreCount;
965   UINT8                  ThreadCount;
966   UINT16                 ProcessorCharacteristics;
967   //
968   // Add for smbios 2.6
969   //
970   UINT16                 ProcessorFamily2;
971   //
972   // Add for smbios 3.0
973   //
974   UINT16                 CoreCount2;
975   UINT16                 EnabledCoreCount2;
976   UINT16                 ThreadCount2;
977   //
978   // Add for smbios 3.6
979   //
980   UINT16                 ThreadEnabled;
981 } SMBIOS_TABLE_TYPE4;
982 
983 ///
984 /// Memory Controller Error Detecting Method.
985 ///
986 typedef enum {
987   ErrorDetectingMethodOther   = 0x01,
988   ErrorDetectingMethodUnknown = 0x02,
989   ErrorDetectingMethodNone    = 0x03,
990   ErrorDetectingMethodParity  = 0x04,
991   ErrorDetectingMethod32Ecc   = 0x05,
992   ErrorDetectingMethod64Ecc   = 0x06,
993   ErrorDetectingMethod128Ecc  = 0x07,
994   ErrorDetectingMethodCrc     = 0x08
995 } MEMORY_ERROR_DETECT_METHOD;
996 
997 ///
998 /// Memory Controller Error Correcting Capability.
999 ///
1000 typedef struct {
1001   UINT8    Other                 : 1;
1002   UINT8    Unknown               : 1;
1003   UINT8    None                  : 1;
1004   UINT8    SingleBitErrorCorrect : 1;
1005   UINT8    DoubleBitErrorCorrect : 1;
1006   UINT8    ErrorScrubbing        : 1;
1007   UINT8    Reserved              : 2;
1008 } MEMORY_ERROR_CORRECT_CAPABILITY;
1009 
1010 ///
1011 /// Memory Controller Information - Interleave Support.
1012 ///
1013 typedef enum {
1014   MemoryInterleaveOther      = 0x01,
1015   MemoryInterleaveUnknown    = 0x02,
1016   MemoryInterleaveOneWay     = 0x03,
1017   MemoryInterleaveTwoWay     = 0x04,
1018   MemoryInterleaveFourWay    = 0x05,
1019   MemoryInterleaveEightWay   = 0x06,
1020   MemoryInterleaveSixteenWay = 0x07
1021 } MEMORY_SUPPORT_INTERLEAVE_TYPE;
1022 
1023 ///
1024 /// Memory Controller Information - Memory Speeds.
1025 ///
1026 typedef struct {
1027   UINT16    Other     : 1;
1028   UINT16    Unknown   : 1;
1029   UINT16    SeventyNs : 1;
1030   UINT16    SixtyNs   : 1;
1031   UINT16    FiftyNs   : 1;
1032   UINT16    Reserved  : 11;
1033 } MEMORY_SPEED_TYPE;
1034 
1035 ///
1036 /// Memory Controller Information (Type 5, Obsolete).
1037 ///
1038 /// The information in this structure defines the attributes of the system's memory controller(s)
1039 /// and the supported attributes of any memory-modules present in the sockets controlled by
1040 /// this controller.
1041 /// Note: This structure, and its companion Memory Module Information (Type 6, Obsolete),
1042 /// are obsolete starting with version 2.1 of this specification. The Physical Memory Array (Type 16)
1043 /// and Memory Device (Type 17) structures should be used instead.  BIOS providers might
1044 /// choose to implement both memory description types to allow existing DMI browsers
1045 /// to properly display the system's memory attributes.
1046 ///
1047 typedef struct {
1048   SMBIOS_STRUCTURE                   Hdr;
1049   UINT8                              ErrDetectMethod;         ///< The enumeration value from MEMORY_ERROR_DETECT_METHOD.
1050   MEMORY_ERROR_CORRECT_CAPABILITY    ErrCorrectCapability;
1051   UINT8                              SupportInterleave;       ///< The enumeration value from MEMORY_SUPPORT_INTERLEAVE_TYPE.
1052   UINT8                              CurrentInterleave;       ///< The enumeration value from MEMORY_SUPPORT_INTERLEAVE_TYPE .
1053   UINT8                              MaxMemoryModuleSize;
1054   MEMORY_SPEED_TYPE                  SupportSpeed;
1055   UINT16                             SupportMemoryType;
1056   UINT8                              MemoryModuleVoltage;
1057   UINT8                              AssociatedMemorySlotNum;
1058   UINT16                             MemoryModuleConfigHandles[1];
1059 } SMBIOS_TABLE_TYPE5;
1060 
1061 ///
1062 /// Memory Module Information - Memory Types
1063 ///
1064 typedef struct {
1065   UINT16    Other        : 1;
1066   UINT16    Unknown      : 1;
1067   UINT16    Standard     : 1;
1068   UINT16    FastPageMode : 1;
1069   UINT16    Edo          : 1;
1070   UINT16    Parity       : 1;
1071   UINT16    Ecc          : 1;
1072   UINT16    Simm         : 1;
1073   UINT16    Dimm         : 1;
1074   UINT16    BurstEdo     : 1;
1075   UINT16    Sdram        : 1;
1076   UINT16    Reserved     : 5;
1077 } MEMORY_CURRENT_TYPE;
1078 
1079 ///
1080 /// Memory Module Information - Memory Size.
1081 ///
1082 typedef struct {
1083   UINT8    InstalledOrEnabledSize : 7; ///< Size (n), where 2**n is the size in MB.
1084   UINT8    SingleOrDoubleBank     : 1;
1085 } MEMORY_INSTALLED_ENABLED_SIZE;
1086 
1087 ///
1088 /// Memory Module Information (Type 6, Obsolete)
1089 ///
1090 /// One Memory Module Information structure is included for each memory-module socket
1091 /// in the system.  The structure describes the speed, type, size, and error status
1092 /// of each system memory module.  The supported attributes of each module are described
1093 /// by the "owning" Memory Controller Information structure.
1094 /// Note:  This structure, and its companion Memory Controller Information (Type 5, Obsolete),
1095 /// are obsolete starting with version 2.1 of this specification. The Physical Memory Array (Type 16)
1096 /// and Memory Device (Type 17) structures should be used instead.
1097 ///
1098 typedef struct {
1099   SMBIOS_STRUCTURE                 Hdr;
1100   SMBIOS_TABLE_STRING              SocketDesignation;
1101   UINT8                            BankConnections;
1102   UINT8                            CurrentSpeed;
1103   MEMORY_CURRENT_TYPE              CurrentMemoryType;
1104   MEMORY_INSTALLED_ENABLED_SIZE    InstalledSize;
1105   MEMORY_INSTALLED_ENABLED_SIZE    EnabledSize;
1106   UINT8                            ErrorStatus;
1107 } SMBIOS_TABLE_TYPE6;
1108 
1109 ///
1110 /// Cache Information - SRAM Type.
1111 ///
1112 typedef struct {
1113   UINT16    Other         : 1;
1114   UINT16    Unknown       : 1;
1115   UINT16    NonBurst      : 1;
1116   UINT16    Burst         : 1;
1117   UINT16    PipelineBurst : 1;
1118   UINT16    Synchronous   : 1;
1119   UINT16    Asynchronous  : 1;
1120   UINT16    Reserved      : 9;
1121 } CACHE_SRAM_TYPE_DATA;
1122 
1123 ///
1124 /// Cache Information - Error Correction Type.
1125 ///
1126 typedef enum {
1127   CacheErrorOther     = 0x01,
1128   CacheErrorUnknown   = 0x02,
1129   CacheErrorNone      = 0x03,
1130   CacheErrorParity    = 0x04,
1131   CacheErrorSingleBit = 0x05, ///< ECC
1132   CacheErrorMultiBit  = 0x06  ///< ECC
1133 } CACHE_ERROR_TYPE_DATA;
1134 
1135 ///
1136 /// Cache Information - System Cache Type.
1137 ///
1138 typedef enum {
1139   CacheTypeOther       = 0x01,
1140   CacheTypeUnknown     = 0x02,
1141   CacheTypeInstruction = 0x03,
1142   CacheTypeData        = 0x04,
1143   CacheTypeUnified     = 0x05
1144 } CACHE_TYPE_DATA;
1145 
1146 ///
1147 /// Cache Information - Associativity.
1148 ///
1149 typedef enum {
1150   CacheAssociativityOther        = 0x01,
1151   CacheAssociativityUnknown      = 0x02,
1152   CacheAssociativityDirectMapped = 0x03,
1153   CacheAssociativity2Way         = 0x04,
1154   CacheAssociativity4Way         = 0x05,
1155   CacheAssociativityFully        = 0x06,
1156   CacheAssociativity8Way         = 0x07,
1157   CacheAssociativity16Way        = 0x08,
1158   CacheAssociativity12Way        = 0x09,
1159   CacheAssociativity24Way        = 0x0A,
1160   CacheAssociativity32Way        = 0x0B,
1161   CacheAssociativity48Way        = 0x0C,
1162   CacheAssociativity64Way        = 0x0D,
1163   CacheAssociativity20Way        = 0x0E
1164 } CACHE_ASSOCIATIVITY_DATA;
1165 
1166 ///
1167 /// Cache Information (Type 7).
1168 ///
1169 /// The information in this structure defines the attributes of CPU cache device in the system.
1170 /// One structure is specified for each such device, whether the device is internal to
1171 /// or external to the CPU module.  Cache modules can be associated with a processor structure
1172 /// in one or two ways, depending on the SMBIOS version.
1173 ///
1174 typedef struct {
1175   SMBIOS_STRUCTURE        Hdr;
1176   SMBIOS_TABLE_STRING     SocketDesignation;
1177   UINT16                  CacheConfiguration;
1178   UINT16                  MaximumCacheSize;
1179   UINT16                  InstalledSize;
1180   CACHE_SRAM_TYPE_DATA    SupportedSRAMType;
1181   CACHE_SRAM_TYPE_DATA    CurrentSRAMType;
1182   UINT8                   CacheSpeed;
1183   UINT8                   ErrorCorrectionType;              ///< The enumeration value from CACHE_ERROR_TYPE_DATA.
1184   UINT8                   SystemCacheType;                  ///< The enumeration value from CACHE_TYPE_DATA.
1185   UINT8                   Associativity;                    ///< The enumeration value from CACHE_ASSOCIATIVITY_DATA.
1186   //
1187   // Add for smbios 3.1.0
1188   //
1189   UINT32                  MaximumCacheSize2;
1190   UINT32                  InstalledSize2;
1191 } SMBIOS_TABLE_TYPE7;
1192 
1193 ///
1194 /// Port Connector Information - Connector Types.
1195 ///
1196 typedef enum {
1197   PortConnectorTypeNone                 = 0x00,
1198   PortConnectorTypeCentronics           = 0x01,
1199   PortConnectorTypeMiniCentronics       = 0x02,
1200   PortConnectorTypeProprietary          = 0x03,
1201   PortConnectorTypeDB25Male             = 0x04,
1202   PortConnectorTypeDB25Female           = 0x05,
1203   PortConnectorTypeDB15Male             = 0x06,
1204   PortConnectorTypeDB15Female           = 0x07,
1205   PortConnectorTypeDB9Male              = 0x08,
1206   PortConnectorTypeDB9Female            = 0x09,
1207   PortConnectorTypeRJ11                 = 0x0A,
1208   PortConnectorTypeRJ45                 = 0x0B,
1209   PortConnectorType50PinMiniScsi        = 0x0C,
1210   PortConnectorTypeMiniDin              = 0x0D,
1211   PortConnectorTypeMicroDin             = 0x0E,
1212   PortConnectorTypePS2                  = 0x0F,
1213   PortConnectorTypeInfrared             = 0x10,
1214   PortConnectorTypeHpHil                = 0x11,
1215   PortConnectorTypeUsb                  = 0x12,
1216   PortConnectorTypeSsaScsi              = 0x13,
1217   PortConnectorTypeCircularDin8Male     = 0x14,
1218   PortConnectorTypeCircularDin8Female   = 0x15,
1219   PortConnectorTypeOnboardIde           = 0x16,
1220   PortConnectorTypeOnboardFloppy        = 0x17,
1221   PortConnectorType9PinDualInline       = 0x18,
1222   PortConnectorType25PinDualInline      = 0x19,
1223   PortConnectorType50PinDualInline      = 0x1A,
1224   PortConnectorType68PinDualInline      = 0x1B,
1225   PortConnectorTypeOnboardSoundInput    = 0x1C,
1226   PortConnectorTypeMiniCentronicsType14 = 0x1D,
1227   PortConnectorTypeMiniCentronicsType26 = 0x1E,
1228   PortConnectorTypeHeadPhoneMiniJack    = 0x1F,
1229   PortConnectorTypeBNC                  = 0x20,
1230   PortConnectorType1394                 = 0x21,
1231   PortConnectorTypeSasSata              = 0x22,
1232   PortConnectorTypeUsbTypeC             = 0x23,
1233   PortConnectorTypePC98                 = 0xA0,
1234   PortConnectorTypePC98Hireso           = 0xA1,
1235   PortConnectorTypePCH98                = 0xA2,
1236   PortConnectorTypePC98Note             = 0xA3,
1237   PortConnectorTypePC98Full             = 0xA4,
1238   PortConnectorTypeOther                = 0xFF
1239 } MISC_PORT_CONNECTOR_TYPE;
1240 
1241 ///
1242 /// Port Connector Information - Port Types
1243 ///
1244 typedef enum {
1245   PortTypeNone                   = 0x00,
1246   PortTypeParallelXtAtCompatible = 0x01,
1247   PortTypeParallelPortPs2        = 0x02,
1248   PortTypeParallelPortEcp        = 0x03,
1249   PortTypeParallelPortEpp        = 0x04,
1250   PortTypeParallelPortEcpEpp     = 0x05,
1251   PortTypeSerialXtAtCompatible   = 0x06,
1252   PortTypeSerial16450Compatible  = 0x07,
1253   PortTypeSerial16550Compatible  = 0x08,
1254   PortTypeSerial16550ACompatible = 0x09,
1255   PortTypeScsi                   = 0x0A,
1256   PortTypeMidi                   = 0x0B,
1257   PortTypeJoyStick               = 0x0C,
1258   PortTypeKeyboard               = 0x0D,
1259   PortTypeMouse                  = 0x0E,
1260   PortTypeSsaScsi                = 0x0F,
1261   PortTypeUsb                    = 0x10,
1262   PortTypeFireWire               = 0x11,
1263   PortTypePcmciaTypeI            = 0x12,
1264   PortTypePcmciaTypeII           = 0x13,
1265   PortTypePcmciaTypeIII          = 0x14,
1266   PortTypeCardBus                = 0x15,
1267   PortTypeAccessBusPort          = 0x16,
1268   PortTypeScsiII                 = 0x17,
1269   PortTypeScsiWide               = 0x18,
1270   PortTypePC98                   = 0x19,
1271   PortTypePC98Hireso             = 0x1A,
1272   PortTypePCH98                  = 0x1B,
1273   PortTypeVideoPort              = 0x1C,
1274   PortTypeAudioPort              = 0x1D,
1275   PortTypeModemPort              = 0x1E,
1276   PortTypeNetworkPort            = 0x1F,
1277   PortTypeSata                   = 0x20,
1278   PortTypeSas                    = 0x21,
1279   PortTypeMfdp                   = 0x22,    ///< Multi-Function Display Port
1280   PortTypeThunderbolt            = 0x23,
1281   PortType8251Compatible         = 0xA0,
1282   PortType8251FifoCompatible     = 0xA1,
1283   PortTypeOther                  = 0xFF
1284 } MISC_PORT_TYPE;
1285 
1286 ///
1287 /// Port Connector Information (Type 8).
1288 ///
1289 /// The information in this structure defines the attributes of a system port connector,
1290 /// e.g. parallel, serial, keyboard, or mouse ports.  The port's type and connector information
1291 /// are provided. One structure is present for each port provided by the system.
1292 ///
1293 typedef struct {
1294   SMBIOS_STRUCTURE       Hdr;
1295   SMBIOS_TABLE_STRING    InternalReferenceDesignator;
1296   UINT8                  InternalConnectorType;             ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
1297   SMBIOS_TABLE_STRING    ExternalReferenceDesignator;
1298   UINT8                  ExternalConnectorType;             ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
1299   UINT8                  PortType;                          ///< The enumeration value from MISC_PORT_TYPE.
1300 } SMBIOS_TABLE_TYPE8;
1301 
1302 #if !CONFIG(DISPLAY_FSP_VERSION_INFO_2)
1303 
1304 ///
1305 /// System Slots - Slot Type
1306 ///
1307 typedef enum {
1308   SlotTypeOther                                     = 0x01,
1309   SlotTypeUnknown                                   = 0x02,
1310   SlotTypeIsa                                       = 0x03,
1311   SlotTypeMca                                       = 0x04,
1312   SlotTypeEisa                                      = 0x05,
1313   SlotTypePci                                       = 0x06,
1314   SlotTypePcmcia                                    = 0x07,
1315   SlotTypeVlVesa                                    = 0x08,
1316   SlotTypeProprietary                               = 0x09,
1317   SlotTypeProcessorCardSlot                         = 0x0A,
1318   SlotTypeProprietaryMemoryCardSlot                 = 0x0B,
1319   SlotTypeIORiserCardSlot                           = 0x0C,
1320   SlotTypeNuBus                                     = 0x0D,
1321   SlotTypePci66MhzCapable                           = 0x0E,
1322   SlotTypeAgp                                       = 0x0F,
1323   SlotTypeApg2X                                     = 0x10,
1324   SlotTypeAgp4X                                     = 0x11,
1325   SlotTypePciX                                      = 0x12,
1326   SlotTypeAgp8X                                     = 0x13,
1327   SlotTypeM2Socket1_DP                              = 0x14,
1328   SlotTypeM2Socket1_SD                              = 0x15,
1329   SlotTypeM2Socket2                                 = 0x16,
1330   SlotTypeM2Socket3                                 = 0x17,
1331   SlotTypeMxmTypeI                                  = 0x18,
1332   SlotTypeMxmTypeII                                 = 0x19,
1333   SlotTypeMxmTypeIIIStandard                        = 0x1A,
1334   SlotTypeMxmTypeIIIHe                              = 0x1B,
1335   SlotTypeMxmTypeIV                                 = 0x1C,
1336   SlotTypeMxm30TypeA                                = 0x1D,
1337   SlotTypeMxm30TypeB                                = 0x1E,
1338   SlotTypePciExpressGen2Sff_8639                    = 0x1F,
1339   SlotTypePciExpressGen3Sff_8639                    = 0x20,
1340   SlotTypePciExpressMini52pinWithBSKO               = 0x21,    ///< PCI Express Mini 52-pin (CEM spec. 2.0) with bottom-side keep-outs.
1341   SlotTypePciExpressMini52pinWithoutBSKO            = 0x22,    ///< PCI Express Mini 52-pin (CEM spec. 2.0) without bottom-side keep-outs.
1342   SlotTypePciExpressMini76pin                       = 0x23,    ///< PCI Express Mini 76-pin (CEM spec. 2.0) Corresponds to Display-Mini card.
1343   SlotTypePCIExpressGen4SFF_8639                    = 0x24,    ///< U.2
1344   SlotTypePCIExpressGen5SFF_8639                    = 0x25,    ///< U.2
1345   SlotTypeOCPNIC30SmallFormFactor                   = 0x26,    ///< SFF
1346   SlotTypeOCPNIC30LargeFormFactor                   = 0x27,    ///< LFF
1347   SlotTypeOCPNICPriorto30                           = 0x28,
1348   SlotTypeCXLFlexbus10                              = 0x30,
1349   SlotTypePC98C20                                   = 0xA0,
1350   SlotTypePC98C24                                   = 0xA1,
1351   SlotTypePC98E                                     = 0xA2,
1352   SlotTypePC98LocalBus                              = 0xA3,
1353   SlotTypePC98Card                                  = 0xA4,
1354   SlotTypePciExpress                                = 0xA5,
1355   SlotTypePciExpressX1                              = 0xA6,
1356   SlotTypePciExpressX2                              = 0xA7,
1357   SlotTypePciExpressX4                              = 0xA8,
1358   SlotTypePciExpressX8                              = 0xA9,
1359   SlotTypePciExpressX16                             = 0xAA,
1360   SlotTypePciExpressGen2                            = 0xAB,
1361   SlotTypePciExpressGen2X1                          = 0xAC,
1362   SlotTypePciExpressGen2X2                          = 0xAD,
1363   SlotTypePciExpressGen2X4                          = 0xAE,
1364   SlotTypePciExpressGen2X8                          = 0xAF,
1365   SlotTypePciExpressGen2X16                         = 0xB0,
1366   SlotTypePciExpressGen3                            = 0xB1,
1367   SlotTypePciExpressGen3X1                          = 0xB2,
1368   SlotTypePciExpressGen3X2                          = 0xB3,
1369   SlotTypePciExpressGen3X4                          = 0xB4,
1370   SlotTypePciExpressGen3X8                          = 0xB5,
1371   SlotTypePciExpressGen3X16                         = 0xB6,
1372   SlotTypePciExpressGen4                            = 0xB8,
1373   SlotTypePciExpressGen4X1                          = 0xB9,
1374   SlotTypePciExpressGen4X2                          = 0xBA,
1375   SlotTypePciExpressGen4X4                          = 0xBB,
1376   SlotTypePciExpressGen4X8                          = 0xBC,
1377   SlotTypePciExpressGen4X16                         = 0xBD,
1378   SlotTypePCIExpressGen5                            = 0xBE,
1379   SlotTypePCIExpressGen5X1                          = 0xBF,
1380   SlotTypePCIExpressGen5X2                          = 0xC0,
1381   SlotTypePCIExpressGen5X4                          = 0xC1,
1382   SlotTypePCIExpressGen5X8                          = 0xC2,
1383   SlotTypePCIExpressGen5X16                         = 0xC3,
1384   SlotTypePCIExpressGen6andBeyond                   = 0xC4,
1385   SlotTypeEnterpriseandDatacenter1UE1FormFactorSlot = 0xC5,
1386   SlotTypeEnterpriseandDatacenter3E3FormFactorSlot  = 0xC6
1387 } MISC_SLOT_TYPE;
1388 
1389 ///
1390 /// System Slots - Slot Data Bus Width.
1391 ///
1392 typedef enum {
1393   SlotDataBusWidthOther   = 0x01,
1394   SlotDataBusWidthUnknown = 0x02,
1395   SlotDataBusWidth8Bit    = 0x03,
1396   SlotDataBusWidth16Bit   = 0x04,
1397   SlotDataBusWidth32Bit   = 0x05,
1398   SlotDataBusWidth64Bit   = 0x06,
1399   SlotDataBusWidth128Bit  = 0x07,
1400   SlotDataBusWidth1X      = 0x08,    ///< Or X1
1401   SlotDataBusWidth2X      = 0x09,    ///< Or X2
1402   SlotDataBusWidth4X      = 0x0A,    ///< Or X4
1403   SlotDataBusWidth8X      = 0x0B,    ///< Or X8
1404   SlotDataBusWidth12X     = 0x0C,    ///< Or X12
1405   SlotDataBusWidth16X     = 0x0D,    ///< Or X16
1406   SlotDataBusWidth32X     = 0x0E     ///< Or X32
1407 } MISC_SLOT_DATA_BUS_WIDTH;
1408 
1409 ///
1410 /// System Slots - Slot Physical Width.
1411 ///
1412 typedef enum {
1413   SlotPhysicalWidthOther   = 0x01,
1414   SlotPhysicalWidthUnknown = 0x02,
1415   SlotPhysicalWidth8Bit    = 0x03,
1416   SlotPhysicalWidth16Bit   = 0x04,
1417   SlotPhysicalWidth32Bit   = 0x05,
1418   SlotPhysicalWidth64Bit   = 0x06,
1419   SlotPhysicalWidth128Bit  = 0x07,
1420   SlotPhysicalWidth1X      = 0x08,    ///< Or X1
1421   SlotPhysicalWidth2X      = 0x09,    ///< Or X2
1422   SlotPhysicalWidth4X      = 0x0A,    ///< Or X4
1423   SlotPhysicalWidth8X      = 0x0B,    ///< Or X8
1424   SlotPhysicalWidth12X     = 0x0C,    ///< Or X12
1425   SlotPhysicalWidth16X     = 0x0D,    ///< Or X16
1426   SlotPhysicalWidth32X     = 0x0E     ///< Or X32
1427 } MISC_SLOT_PHYSICAL_WIDTH;
1428 
1429 ///
1430 /// System Slots - Slot Information.
1431 ///
1432 typedef enum {
1433   Others = 0x00,
1434   Gen1   = 0x01,
1435   Gen2   = 0x01,
1436   Gen3   = 0x03,
1437   Gen4   = 0x04,
1438   Gen5   = 0x05,
1439   Gen6   = 0x06
1440 } MISC_SLOT_INFORMATION;
1441 
1442 ///
1443 /// System Slots - Current Usage.
1444 ///
1445 typedef enum {
1446   SlotUsageOther       = 0x01,
1447   SlotUsageUnknown     = 0x02,
1448   SlotUsageAvailable   = 0x03,
1449   SlotUsageInUse       = 0x04,
1450   SlotUsageUnavailable = 0x05
1451 } MISC_SLOT_USAGE;
1452 
1453 ///
1454 /// System Slots - Slot Length.
1455 ///
1456 typedef enum {
1457   SlotLengthOther   = 0x01,
1458   SlotLengthUnknown = 0x02,
1459   SlotLengthShort   = 0x03,
1460   SlotLengthLong    = 0x04
1461 } MISC_SLOT_LENGTH;
1462 
1463 #endif
1464 ///
1465 /// System Slots - Slot Characteristics 1.
1466 ///
1467 typedef struct {
1468   UINT8    CharacteristicsUnknown   : 1;
1469   UINT8    Provides50Volts          : 1;
1470   UINT8    Provides33Volts          : 1;
1471   UINT8    SharedSlot               : 1;
1472   UINT8    PcCard16Supported        : 1;
1473   UINT8    CardBusSupported         : 1;
1474   UINT8    ZoomVideoSupported       : 1;
1475   UINT8    ModemRingResumeSupported : 1;
1476 } MISC_SLOT_CHARACTERISTICS1;
1477 ///
1478 /// System Slots - Slot Characteristics 2.
1479 ///
1480 typedef struct {
1481   UINT8    PmeSignalSupported      : 1;
1482   UINT8    HotPlugDevicesSupported : 1;
1483   UINT8    SmbusSignalSupported    : 1;
1484   UINT8    BifurcationSupported    : 1;
1485   UINT8    AsyncSurpriseRemoval    : 1;
1486   UINT8    FlexbusSlotCxl10Capable : 1;
1487   UINT8    FlexbusSlotCxl20Capable : 1;
1488   UINT8    Reserved                : 1; ///< Set to 0.
1489 } MISC_SLOT_CHARACTERISTICS2;
1490 
1491 ///
1492 /// System Slots - Slot Height
1493 ///
1494 typedef enum {
1495   SlotHeightNone       = 0x00,
1496   SlotHeightOther      = 0x01,
1497   SlotHeightUnknown    = 0x02,
1498   SlotHeightFullHeight = 0x03,
1499   SlotHeightLowProfile = 0x04
1500 } MISC_SLOT_HEIGHT;
1501 
1502 ///
1503 /// System Slots - Peer Segment/Bus/Device/Function/Width Groups
1504 ///
1505 typedef struct {
1506   UINT16    SegmentGroupNum;
1507   UINT8     BusNum;
1508   UINT8     DevFuncNum;
1509   UINT8     DataBusWidth;
1510 } MISC_SLOT_PEER_GROUP;
1511 
1512 ///
1513 /// System Slots (Type 9)
1514 ///
1515 /// The information in this structure defines the attributes of a system slot.
1516 /// One structure is provided for each slot in the system.
1517 ///
1518 ///
1519 typedef struct {
1520   SMBIOS_STRUCTURE              Hdr;
1521   SMBIOS_TABLE_STRING           SlotDesignation;
1522   UINT8                         SlotType;               ///< The enumeration value from MISC_SLOT_TYPE.
1523   UINT8                         SlotDataBusWidth;       ///< The enumeration value from MISC_SLOT_DATA_BUS_WIDTH.
1524   UINT8                         CurrentUsage;           ///< The enumeration value from MISC_SLOT_USAGE.
1525   UINT8                         SlotLength;             ///< The enumeration value from MISC_SLOT_LENGTH.
1526   UINT16                        SlotID;
1527   MISC_SLOT_CHARACTERISTICS1    SlotCharacteristics1;
1528   MISC_SLOT_CHARACTERISTICS2    SlotCharacteristics2;
1529   //
1530   // Add for smbios 2.6
1531   //
1532   UINT16                        SegmentGroupNum;
1533   UINT8                         BusNum;
1534   UINT8                         DevFuncNum;
1535   //
1536   // Add for smbios 3.2
1537   //
1538   UINT8                         DataBusWidth;
1539   UINT8                         PeerGroupingCount;
1540   MISC_SLOT_PEER_GROUP          PeerGroups[1];
1541   //
1542   // Since PeerGroups has a variable number of entries, must not define new
1543   // fields in the structure. Remaining fields can be referenced using
1544   // SMBIOS_TABLE_TYPE9_EXTENDED structure
1545   //
1546 } SMBIOS_TABLE_TYPE9;
1547 
1548 ///
1549 /// Extended structure for System Slots (Type 9)
1550 ///
1551 typedef struct {
1552   //
1553   // Add for smbios 3.4
1554   //
1555   UINT8     SlotInformation;
1556   UINT8     SlotPhysicalWidth;
1557   UINT16    SlotPitch;
1558   //
1559   // Add for smbios 3.5
1560   //
1561   UINT8     SlotHeight;             ///< The enumeration value from MISC_SLOT_HEIGHT.
1562 } SMBIOS_TABLE_TYPE9_EXTENDED;
1563 
1564 ///
1565 /// On Board Devices Information - Device Types.
1566 ///
1567 typedef enum {
1568   OnBoardDeviceTypeOther          = 0x01,
1569   OnBoardDeviceTypeUnknown        = 0x02,
1570   OnBoardDeviceTypeVideo          = 0x03,
1571   OnBoardDeviceTypeScsiController = 0x04,
1572   OnBoardDeviceTypeEthernet       = 0x05,
1573   OnBoardDeviceTypeTokenRing      = 0x06,
1574   OnBoardDeviceTypeSound          = 0x07,
1575   OnBoardDeviceTypePATAController = 0x08,
1576   OnBoardDeviceTypeSATAController = 0x09,
1577   OnBoardDeviceTypeSASController  = 0x0A
1578 } MISC_ONBOARD_DEVICE_TYPE;
1579 
1580 ///
1581 /// Device Item Entry
1582 ///
1583 typedef struct {
1584   UINT8                  DeviceType;                ///< Bit [6:0] - enumeration type of device from MISC_ONBOARD_DEVICE_TYPE.
1585                                                     ///< Bit 7     - 1 : device enabled, 0 : device disabled.
1586   SMBIOS_TABLE_STRING    DescriptionString;
1587 } DEVICE_STRUCT;
1588 
1589 ///
1590 /// On Board Devices Information (Type 10, obsolete).
1591 ///
1592 /// Note: This structure is obsolete starting with version 2.6 specification; the Onboard Devices Extended
1593 /// Information (Type 41) structure should be used instead . BIOS providers can choose to implement both
1594 /// types to allow existing SMBIOS browsers to properly display the system's onboard devices information.
1595 /// The information in this structure defines the attributes of devices that are onboard (soldered onto)
1596 /// a system element, usually the baseboard.  In general, an entry in this table implies that the BIOS
1597 /// has some level of control over the enabling of the associated device for use by the system.
1598 ///
1599 typedef struct {
1600   SMBIOS_STRUCTURE    Hdr;
1601   DEVICE_STRUCT       Device[1];
1602 } SMBIOS_TABLE_TYPE10;
1603 
1604 ///
1605 /// OEM Strings (Type 11).
1606 /// This structure contains free form strings defined by the OEM. Examples of this are:
1607 /// Part Numbers for Reference Documents for the system, contact information for the manufacturer, etc.
1608 ///
1609 typedef struct {
1610   SMBIOS_STRUCTURE    Hdr;
1611   UINT8               StringCount;
1612 } SMBIOS_TABLE_TYPE11;
1613 
1614 ///
1615 /// System Configuration Options (Type 12).
1616 ///
1617 /// This structure contains information required to configure the base board's Jumpers and Switches.
1618 ///
1619 typedef struct {
1620   SMBIOS_STRUCTURE    Hdr;
1621   UINT8               StringCount;
1622 } SMBIOS_TABLE_TYPE12;
1623 
1624 ///
1625 /// BIOS Language Information (Type 13).
1626 ///
1627 /// The information in this structure defines the installable language attributes of the BIOS.
1628 ///
1629 typedef struct {
1630   SMBIOS_STRUCTURE       Hdr;
1631   UINT8                  InstallableLanguages;
1632   UINT8                  Flags;
1633   UINT8                  Reserved[15];
1634   SMBIOS_TABLE_STRING    CurrentLanguages;
1635 } SMBIOS_TABLE_TYPE13;
1636 
1637 ///
1638 /// Group Item Entry
1639 ///
1640 typedef struct {
1641   UINT8     ItemType;
1642   UINT16    ItemHandle;
1643 } GROUP_STRUCT;
1644 
1645 ///
1646 /// Group Associations (Type 14).
1647 ///
1648 /// The Group Associations structure is provided for OEMs who want to specify
1649 /// the arrangement or hierarchy of certain components (including other Group Associations)
1650 /// within the system.
1651 ///
1652 typedef struct {
1653   SMBIOS_STRUCTURE       Hdr;
1654   SMBIOS_TABLE_STRING    GroupName;
1655   GROUP_STRUCT           Group[1];
1656 } SMBIOS_TABLE_TYPE14;
1657 
1658 ///
1659 /// System Event Log - Event Log Types.
1660 ///
1661 typedef enum {
1662   EventLogTypeReserved        = 0x00,
1663   EventLogTypeSingleBitECC    = 0x01,
1664   EventLogTypeMultiBitECC     = 0x02,
1665   EventLogTypeParityMemErr    = 0x03,
1666   EventLogTypeBusTimeOut      = 0x04,
1667   EventLogTypeIOChannelCheck  = 0x05,
1668   EventLogTypeSoftwareNMI     = 0x06,
1669   EventLogTypePOSTMemResize   = 0x07,
1670   EventLogTypePOSTErr         = 0x08,
1671   EventLogTypePCIParityErr    = 0x09,
1672   EventLogTypePCISystemErr    = 0x0A,
1673   EventLogTypeCPUFailure      = 0x0B,
1674   EventLogTypeEISATimeOut     = 0x0C,
1675   EventLogTypeMemLogDisabled  = 0x0D,
1676   EventLogTypeLoggingDisabled = 0x0E,
1677   EventLogTypeSysLimitExce    = 0x10,
1678   EventLogTypeAsyncHWTimer    = 0x11,
1679   EventLogTypeSysConfigInfo   = 0x12,
1680   EventLogTypeHDInfo          = 0x13,
1681   EventLogTypeSysReconfig     = 0x14,
1682   EventLogTypeUncorrectCPUErr = 0x15,
1683   EventLogTypeAreaResetAndClr = 0x16,
1684   EventLogTypeSystemBoot      = 0x17,
1685   EventLogTypeUnused          = 0x18,  ///< 0x18 - 0x7F
1686   EventLogTypeAvailForSys     = 0x80,  ///< 0x80 - 0xFE
1687   EventLogTypeEndOfLog        = 0xFF
1688 } EVENT_LOG_TYPE_DATA;
1689 
1690 ///
1691 /// System Event Log - Variable Data Format Types.
1692 ///
1693 typedef enum {
1694   EventLogVariableNone                       = 0x00,
1695   EventLogVariableHandle                     = 0x01,
1696   EventLogVariableMutilEvent                 = 0x02,
1697   EventLogVariableMutilEventHandle           = 0x03,
1698   EventLogVariablePOSTResultBitmap           = 0x04,
1699   EventLogVariableSysManagementType          = 0x05,
1700   EventLogVariableMutliEventSysManagmentType = 0x06,
1701   EventLogVariableUnused                     = 0x07,
1702   EventLogVariableOEMAssigned                = 0x80
1703 } EVENT_LOG_VARIABLE_DATA;
1704 
1705 ///
1706 /// Event Log Type Descriptors
1707 ///
1708 typedef struct {
1709   UINT8    LogType;                                 ///< The enumeration value from EVENT_LOG_TYPE_DATA.
1710   UINT8    DataFormatType;
1711 } EVENT_LOG_TYPE;
1712 
1713 ///
1714 /// System Event Log (Type 15).
1715 ///
1716 /// The presence of this structure within the SMBIOS data returned for a system indicates
1717 /// that the system supports an event log.  An event log is a fixed-length area within a
1718 /// non-volatile storage element, starting with a fixed-length (and vendor-specific) header
1719 /// record, followed by one or more variable-length log records.
1720 ///
1721 typedef struct {
1722   SMBIOS_STRUCTURE    Hdr;
1723   UINT16              LogAreaLength;
1724   UINT16              LogHeaderStartOffset;
1725   UINT16              LogDataStartOffset;
1726   UINT8               AccessMethod;
1727   UINT8               LogStatus;
1728   UINT32              LogChangeToken;
1729   UINT32              AccessMethodAddress;
1730   UINT8               LogHeaderFormat;
1731   UINT8               NumberOfSupportedLogTypeDescriptors;
1732   UINT8               LengthOfLogTypeDescriptor;
1733   EVENT_LOG_TYPE      EventLogTypeDescriptors[1];
1734 } SMBIOS_TABLE_TYPE15;
1735 
1736 ///
1737 /// Physical Memory Array - Location.
1738 ///
1739 typedef enum {
1740   MemoryArrayLocationOther                 = 0x01,
1741   MemoryArrayLocationUnknown               = 0x02,
1742   MemoryArrayLocationSystemBoard           = 0x03,
1743   MemoryArrayLocationIsaAddonCard          = 0x04,
1744   MemoryArrayLocationEisaAddonCard         = 0x05,
1745   MemoryArrayLocationPciAddonCard          = 0x06,
1746   MemoryArrayLocationMcaAddonCard          = 0x07,
1747   MemoryArrayLocationPcmciaAddonCard       = 0x08,
1748   MemoryArrayLocationProprietaryAddonCard  = 0x09,
1749   MemoryArrayLocationNuBus                 = 0x0A,
1750   MemoryArrayLocationPc98C20AddonCard      = 0xA0,
1751   MemoryArrayLocationPc98C24AddonCard      = 0xA1,
1752   MemoryArrayLocationPc98EAddonCard        = 0xA2,
1753   MemoryArrayLocationPc98LocalBusAddonCard = 0xA3,
1754   MemoryArrayLocationCXLAddonCard          = 0xA4
1755 } MEMORY_ARRAY_LOCATION;
1756 
1757 ///
1758 /// Physical Memory Array - Use.
1759 ///
1760 typedef enum {
1761   MemoryArrayUseOther          = 0x01,
1762   MemoryArrayUseUnknown        = 0x02,
1763   MemoryArrayUseSystemMemory   = 0x03,
1764   MemoryArrayUseVideoMemory    = 0x04,
1765   MemoryArrayUseFlashMemory    = 0x05,
1766   MemoryArrayUseNonVolatileRam = 0x06,
1767   MemoryArrayUseCacheMemory    = 0x07
1768 } MEMORY_ARRAY_USE;
1769 
1770 ///
1771 /// Physical Memory Array - Error Correction Types.
1772 ///
1773 typedef enum {
1774   MemoryErrorCorrectionOther        = 0x01,
1775   MemoryErrorCorrectionUnknown      = 0x02,
1776   MemoryErrorCorrectionNone         = 0x03,
1777   MemoryErrorCorrectionParity       = 0x04,
1778   MemoryErrorCorrectionSingleBitEcc = 0x05,
1779   MemoryErrorCorrectionMultiBitEcc  = 0x06,
1780   MemoryErrorCorrectionCrc          = 0x07
1781 } MEMORY_ERROR_CORRECTION;
1782 
1783 ///
1784 /// Physical Memory Array (Type 16).
1785 ///
1786 /// This structure describes a collection of memory devices that operate
1787 /// together to form a memory address space.
1788 ///
1789 typedef struct {
1790   SMBIOS_STRUCTURE    Hdr;
1791   UINT8               Location;                             ///< The enumeration value from MEMORY_ARRAY_LOCATION.
1792   UINT8               Use;                                  ///< The enumeration value from MEMORY_ARRAY_USE.
1793   UINT8               MemoryErrorCorrection;                ///< The enumeration value from MEMORY_ERROR_CORRECTION.
1794   UINT32              MaximumCapacity;
1795   UINT16              MemoryErrorInformationHandle;
1796   UINT16              NumberOfMemoryDevices;
1797   //
1798   // Add for smbios 2.7
1799   //
1800   UINT64              ExtendedMaximumCapacity;
1801 } SMBIOS_TABLE_TYPE16;
1802 
1803 ///
1804 /// Memory Device - Form Factor.
1805 ///
1806 typedef enum {
1807   MemoryFormFactorOther           = 0x01,
1808   MemoryFormFactorUnknown         = 0x02,
1809   MemoryFormFactorSimm            = 0x03,
1810   MemoryFormFactorSip             = 0x04,
1811   MemoryFormFactorChip            = 0x05,
1812   MemoryFormFactorDip             = 0x06,
1813   MemoryFormFactorZip             = 0x07,
1814   MemoryFormFactorProprietaryCard = 0x08,
1815   MemoryFormFactorDimm            = 0x09,
1816   MemoryFormFactorTsop            = 0x0A,
1817   MemoryFormFactorRowOfChips      = 0x0B,
1818   MemoryFormFactorRimm            = 0x0C,
1819   MemoryFormFactorSodimm          = 0x0D,
1820   MemoryFormFactorSrimm           = 0x0E,
1821   MemoryFormFactorFbDimm          = 0x0F,
1822   MemoryFormFactorDie             = 0x10
1823 } MEMORY_FORM_FACTOR;
1824 
1825 ///
1826 /// Memory Device - Type
1827 ///
1828 typedef enum {
1829   MemoryTypeOther                    = 0x01,
1830   MemoryTypeUnknown                  = 0x02,
1831   MemoryTypeDram                     = 0x03,
1832   MemoryTypeEdram                    = 0x04,
1833   MemoryTypeVram                     = 0x05,
1834   MemoryTypeSram                     = 0x06,
1835   MemoryTypeRam                      = 0x07,
1836   MemoryTypeRom                      = 0x08,
1837   MemoryTypeFlash                    = 0x09,
1838   MemoryTypeEeprom                   = 0x0A,
1839   MemoryTypeFeprom                   = 0x0B,
1840   MemoryTypeEprom                    = 0x0C,
1841   MemoryTypeCdram                    = 0x0D,
1842   MemoryType3Dram                    = 0x0E,
1843   MemoryTypeSdram                    = 0x0F,
1844   MemoryTypeSgram                    = 0x10,
1845   MemoryTypeRdram                    = 0x11,
1846   MemoryTypeDdr                      = 0x12,
1847   MemoryTypeDdr2                     = 0x13,
1848   MemoryTypeDdr2FbDimm               = 0x14,
1849   MemoryTypeDdr3                     = 0x18,
1850   MemoryTypeFbd2                     = 0x19,
1851   MemoryTypeDdr4                     = 0x1A,
1852   MemoryTypeLpddr                    = 0x1B,
1853   MemoryTypeLpddr2                   = 0x1C,
1854   MemoryTypeLpddr3                   = 0x1D,
1855   MemoryTypeLpddr4                   = 0x1E,
1856   MemoryTypeLogicalNonVolatileDevice = 0x1F,
1857   MemoryTypeHBM                      = 0x20,
1858   MemoryTypeHBM2                     = 0x21,
1859   MemoryTypeDdr5                     = 0x22,
1860   MemoryTypeLpddr5                   = 0x23,
1861   MemoryTypeHBM3                     = 0x24
1862 } MEMORY_DEVICE_TYPE;
1863 
1864 ///
1865 /// Memory Device - Type Detail
1866 ///
1867 typedef struct {
1868   UINT16    Reserved     : 1;
1869   UINT16    Other        : 1;
1870   UINT16    Unknown      : 1;
1871   UINT16    FastPaged    : 1;
1872   UINT16    StaticColumn : 1;
1873   UINT16    PseudoStatic : 1;
1874   UINT16    Rambus       : 1;
1875   UINT16    Synchronous  : 1;
1876   UINT16    Cmos         : 1;
1877   UINT16    Edo          : 1;
1878   UINT16    WindowDram   : 1;
1879   UINT16    CacheDram    : 1;
1880   UINT16    Nonvolatile  : 1;
1881   UINT16    Registered   : 1;
1882   UINT16    Unbuffered   : 1;
1883   UINT16    LrDimm       : 1;
1884 } MEMORY_DEVICE_TYPE_DETAIL;
1885 
1886 ///
1887 /// Memory Device - Memory Technology
1888 ///
1889 typedef enum {
1890   MemoryTechnologyOther   = 0x01,
1891   MemoryTechnologyUnknown = 0x02,
1892   MemoryTechnologyDram    = 0x03,
1893   MemoryTechnologyNvdimmN = 0x04,
1894   MemoryTechnologyNvdimmF = 0x05,
1895   MemoryTechnologyNvdimmP = 0x06,
1896   //
1897   // This definition is updated to represent Intel
1898   // Optane DC Persistent Memory in SMBIOS spec 3.4.0
1899   //
1900   MemoryTechnologyIntelOptanePersistentMemory = 0x07
1901 } MEMORY_DEVICE_TECHNOLOGY;
1902 
1903 ///
1904 /// Memory Device - Memory Operating Mode Capability
1905 ///
1906 typedef union {
1907   ///
1908   /// Individual bit fields
1909   ///
1910   struct {
1911     UINT16    Reserved                        : 1; ///< Set to 0.
1912     UINT16    Other                           : 1;
1913     UINT16    Unknown                         : 1;
1914     UINT16    VolatileMemory                  : 1;
1915     UINT16    ByteAccessiblePersistentMemory  : 1;
1916     UINT16    BlockAccessiblePersistentMemory : 1;
1917     UINT16    Reserved2                       : 10; ///< Set to 0.
1918   } Bits;
1919   ///
1920   /// All bit fields as a 16-bit value
1921   ///
1922   UINT16    Uint16;
1923 } MEMORY_DEVICE_OPERATING_MODE_CAPABILITY;
1924 
1925 ///
1926 /// Memory Device (Type 17).
1927 ///
1928 /// This structure describes a single memory device that is part of
1929 /// a larger Physical Memory Array (Type 16).
1930 /// Note:  If a system includes memory-device sockets, the SMBIOS implementation
1931 /// includes a Memory Device structure instance for each slot, whether or not the
1932 /// socket is currently populated.
1933 ///
1934 typedef struct {
1935   SMBIOS_STRUCTURE                           Hdr;
1936   UINT16                                     MemoryArrayHandle;
1937   UINT16                                     MemoryErrorInformationHandle;
1938   UINT16                                     TotalWidth;
1939   UINT16                                     DataWidth;
1940   UINT16                                     Size;
1941   UINT8                                      FormFactor;        ///< The enumeration value from MEMORY_FORM_FACTOR.
1942   UINT8                                      DeviceSet;
1943   SMBIOS_TABLE_STRING                        DeviceLocator;
1944   SMBIOS_TABLE_STRING                        BankLocator;
1945   UINT8                                      MemoryType;        ///< The enumeration value from MEMORY_DEVICE_TYPE.
1946   MEMORY_DEVICE_TYPE_DETAIL                  TypeDetail;
1947   UINT16                                     Speed;
1948   SMBIOS_TABLE_STRING                        Manufacturer;
1949   SMBIOS_TABLE_STRING                        SerialNumber;
1950   SMBIOS_TABLE_STRING                        AssetTag;
1951   SMBIOS_TABLE_STRING                        PartNumber;
1952   //
1953   // Add for smbios 2.6
1954   //
1955   UINT8                                      Attributes;
1956   //
1957   // Add for smbios 2.7
1958   //
1959   UINT32                                     ExtendedSize;
1960   //
1961   // Keep using name "ConfiguredMemoryClockSpeed" for compatibility
1962   // although this field is renamed from "Configured Memory Clock Speed"
1963   // to "Configured Memory Speed" in smbios 3.2.0.
1964   //
1965   UINT16                                     ConfiguredMemoryClockSpeed;
1966   //
1967   // Add for smbios 2.8.0
1968   //
1969   UINT16                                     MinimumVoltage;
1970   UINT16                                     MaximumVoltage;
1971   UINT16                                     ConfiguredVoltage;
1972   //
1973   // Add for smbios 3.2.0
1974   //
1975   UINT8                                      MemoryTechnology;  ///< The enumeration value from MEMORY_DEVICE_TECHNOLOGY
1976   MEMORY_DEVICE_OPERATING_MODE_CAPABILITY    MemoryOperatingModeCapability;
1977   SMBIOS_TABLE_STRING                        FirmwareVersion;
1978   UINT16                                     ModuleManufacturerID;
1979   UINT16                                     ModuleProductID;
1980   UINT16                                     MemorySubsystemControllerManufacturerID;
1981   UINT16                                     MemorySubsystemControllerProductID;
1982   UINT64                                     NonVolatileSize;
1983   UINT64                                     VolatileSize;
1984   UINT64                                     CacheSize;
1985   UINT64                                     LogicalSize;
1986   //
1987   // Add for smbios 3.3.0
1988   //
1989   UINT32                                     ExtendedSpeed;
1990   UINT32                                     ExtendedConfiguredMemorySpeed;
1991 } SMBIOS_TABLE_TYPE17;
1992 
1993 ///
1994 /// 32-bit Memory Error Information - Error Type.
1995 ///
1996 typedef enum {
1997   MemoryErrorOther            = 0x01,
1998   MemoryErrorUnknown          = 0x02,
1999   MemoryErrorOk               = 0x03,
2000   MemoryErrorBadRead          = 0x04,
2001   MemoryErrorParity           = 0x05,
2002   MemoryErrorSigleBit         = 0x06,
2003   MemoryErrorDoubleBit        = 0x07,
2004   MemoryErrorMultiBit         = 0x08,
2005   MemoryErrorNibble           = 0x09,
2006   MemoryErrorChecksum         = 0x0A,
2007   MemoryErrorCrc              = 0x0B,
2008   MemoryErrorCorrectSingleBit = 0x0C,
2009   MemoryErrorCorrected        = 0x0D,
2010   MemoryErrorUnCorrectable    = 0x0E
2011 } MEMORY_ERROR_TYPE;
2012 
2013 ///
2014 /// 32-bit Memory Error Information - Error Granularity.
2015 ///
2016 typedef enum {
2017   MemoryGranularityOther             = 0x01,
2018   MemoryGranularityOtherUnknown      = 0x02,
2019   MemoryGranularityDeviceLevel       = 0x03,
2020   MemoryGranularityMemPartitionLevel = 0x04
2021 } MEMORY_ERROR_GRANULARITY;
2022 
2023 ///
2024 /// 32-bit Memory Error Information - Error Operation.
2025 ///
2026 typedef enum {
2027   MemoryErrorOperationOther        = 0x01,
2028   MemoryErrorOperationUnknown      = 0x02,
2029   MemoryErrorOperationRead         = 0x03,
2030   MemoryErrorOperationWrite        = 0x04,
2031   MemoryErrorOperationPartialWrite = 0x05
2032 } MEMORY_ERROR_OPERATION;
2033 
2034 ///
2035 /// 32-bit Memory Error Information (Type 18).
2036 ///
2037 /// This structure identifies the specifics of an error that might be detected
2038 /// within a Physical Memory Array.
2039 ///
2040 typedef struct {
2041   SMBIOS_STRUCTURE    Hdr;
2042   UINT8               ErrorType;                        ///< The enumeration value from MEMORY_ERROR_TYPE.
2043   UINT8               ErrorGranularity;                 ///< The enumeration value from MEMORY_ERROR_GRANULARITY.
2044   UINT8               ErrorOperation;                   ///< The enumeration value from MEMORY_ERROR_OPERATION.
2045   UINT32              VendorSyndrome;
2046   UINT32              MemoryArrayErrorAddress;
2047   UINT32              DeviceErrorAddress;
2048   UINT32              ErrorResolution;
2049 } SMBIOS_TABLE_TYPE18;
2050 
2051 ///
2052 /// Memory Array Mapped Address (Type 19).
2053 ///
2054 /// This structure provides the address mapping for a Physical Memory Array.
2055 /// One structure is present for each contiguous address range described.
2056 ///
2057 typedef struct {
2058   SMBIOS_STRUCTURE    Hdr;
2059   UINT32              StartingAddress;
2060   UINT32              EndingAddress;
2061   UINT16              MemoryArrayHandle;
2062   UINT8               PartitionWidth;
2063   //
2064   // Add for smbios 2.7
2065   //
2066   UINT64              ExtendedStartingAddress;
2067   UINT64              ExtendedEndingAddress;
2068 } SMBIOS_TABLE_TYPE19;
2069 
2070 ///
2071 /// Memory Device Mapped Address (Type 20).
2072 ///
2073 /// This structure maps memory address space usually to a device-level granularity.
2074 /// One structure is present for each contiguous address range described.
2075 ///
2076 typedef struct {
2077   SMBIOS_STRUCTURE    Hdr;
2078   UINT32              StartingAddress;
2079   UINT32              EndingAddress;
2080   UINT16              MemoryDeviceHandle;
2081   UINT16              MemoryArrayMappedAddressHandle;
2082   UINT8               PartitionRowPosition;
2083   UINT8               InterleavePosition;
2084   UINT8               InterleavedDataDepth;
2085   //
2086   // Add for smbios 2.7
2087   //
2088   UINT64              ExtendedStartingAddress;
2089   UINT64              ExtendedEndingAddress;
2090 } SMBIOS_TABLE_TYPE20;
2091 
2092 ///
2093 /// Built-in Pointing Device - Type
2094 ///
2095 typedef enum {
2096   PointingDeviceTypeOther      = 0x01,
2097   PointingDeviceTypeUnknown    = 0x02,
2098   PointingDeviceTypeMouse      = 0x03,
2099   PointingDeviceTypeTrackBall  = 0x04,
2100   PointingDeviceTypeTrackPoint = 0x05,
2101   PointingDeviceTypeGlidePoint = 0x06,
2102   PointingDeviceTouchPad       = 0x07,
2103   PointingDeviceTouchScreen    = 0x08,
2104   PointingDeviceOpticalSensor  = 0x09
2105 } BUILTIN_POINTING_DEVICE_TYPE;
2106 
2107 ///
2108 /// Built-in Pointing Device - Interface.
2109 ///
2110 typedef enum {
2111   PointingDeviceInterfaceOther            = 0x01,
2112   PointingDeviceInterfaceUnknown          = 0x02,
2113   PointingDeviceInterfaceSerial           = 0x03,
2114   PointingDeviceInterfacePs2              = 0x04,
2115   PointingDeviceInterfaceInfrared         = 0x05,
2116   PointingDeviceInterfaceHpHil            = 0x06,
2117   PointingDeviceInterfaceBusMouse         = 0x07,
2118   PointingDeviceInterfaceADB              = 0x08,
2119   PointingDeviceInterfaceBusMouseDB9      = 0xA0,
2120   PointingDeviceInterfaceBusMouseMicroDin = 0xA1,
2121   PointingDeviceInterfaceUsb              = 0xA2,
2122   PointingDeviceInterfaceI2c              = 0xA3,
2123   PointingDeviceInterfaceSpi              = 0xA4
2124 } BUILTIN_POINTING_DEVICE_INTERFACE;
2125 
2126 ///
2127 /// Built-in Pointing Device (Type 21).
2128 ///
2129 /// This structure describes the attributes of the built-in pointing device for the
2130 /// system. The presence of this structure does not imply that the built-in
2131 /// pointing device is active for the system's use!
2132 ///
2133 typedef struct {
2134   SMBIOS_STRUCTURE    Hdr;
2135   UINT8               Type;                                 ///< The enumeration value from BUILTIN_POINTING_DEVICE_TYPE.
2136   UINT8               Interface;                            ///< The enumeration value from BUILTIN_POINTING_DEVICE_INTERFACE.
2137   UINT8               NumberOfButtons;
2138 } SMBIOS_TABLE_TYPE21;
2139 
2140 ///
2141 /// Portable Battery - Device Chemistry
2142 ///
2143 typedef enum {
2144   PortableBatteryDeviceChemistryOther              = 0x01,
2145   PortableBatteryDeviceChemistryUnknown            = 0x02,
2146   PortableBatteryDeviceChemistryLeadAcid           = 0x03,
2147   PortableBatteryDeviceChemistryNickelCadmium      = 0x04,
2148   PortableBatteryDeviceChemistryNickelMetalHydride = 0x05,
2149   PortableBatteryDeviceChemistryLithiumIon         = 0x06,
2150   PortableBatteryDeviceChemistryZincAir            = 0x07,
2151   PortableBatteryDeviceChemistryLithiumPolymer     = 0x08
2152 } PORTABLE_BATTERY_DEVICE_CHEMISTRY;
2153 
2154 ///
2155 /// Portable Battery (Type 22).
2156 ///
2157 /// This structure describes the attributes of the portable battery(s) for the system.
2158 /// The structure contains the static attributes for the group.  Each structure describes
2159 /// a single battery pack's attributes.
2160 ///
2161 typedef struct {
2162   SMBIOS_STRUCTURE       Hdr;
2163   SMBIOS_TABLE_STRING    Location;
2164   SMBIOS_TABLE_STRING    Manufacturer;
2165   SMBIOS_TABLE_STRING    ManufactureDate;
2166   SMBIOS_TABLE_STRING    SerialNumber;
2167   SMBIOS_TABLE_STRING    DeviceName;
2168   UINT8                  DeviceChemistry;                         ///< The enumeration value from PORTABLE_BATTERY_DEVICE_CHEMISTRY.
2169   UINT16                 DeviceCapacity;
2170   UINT16                 DesignVoltage;
2171   SMBIOS_TABLE_STRING    SBDSVersionNumber;
2172   UINT8                  MaximumErrorInBatteryData;
2173   UINT16                 SBDSSerialNumber;
2174   UINT16                 SBDSManufactureDate;
2175   SMBIOS_TABLE_STRING    SBDSDeviceChemistry;
2176   UINT8                  DesignCapacityMultiplier;
2177   UINT32                 OEMSpecific;
2178 } SMBIOS_TABLE_TYPE22;
2179 
2180 ///
2181 /// System Reset (Type 23)
2182 ///
2183 /// This structure describes whether Automatic System Reset functions enabled (Status).
2184 /// If the system has a watchdog Timer and the timer is not reset (Timer Reset)
2185 /// before the Interval elapses, an automatic system reset will occur. The system will re-boot
2186 /// according to the Boot Option. This function may repeat until the Limit is reached, at which time
2187 /// the system will re-boot according to the Boot Option at Limit.
2188 ///
2189 typedef struct {
2190   SMBIOS_STRUCTURE    Hdr;
2191   UINT8               Capabilities;
2192   UINT16              ResetCount;
2193   UINT16              ResetLimit;
2194   UINT16              TimerInterval;
2195   UINT16              Timeout;
2196 } SMBIOS_TABLE_TYPE23;
2197 
2198 ///
2199 /// Hardware Security (Type 24).
2200 ///
2201 /// This structure describes the system-wide hardware security settings.
2202 ///
2203 typedef struct {
2204   SMBIOS_STRUCTURE    Hdr;
2205   UINT8               HardwareSecuritySettings;
2206 } SMBIOS_TABLE_TYPE24;
2207 
2208 ///
2209 /// System Power Controls (Type 25).
2210 ///
2211 /// This structure describes the attributes for controlling the main power supply to the system.
2212 /// Software that interprets this structure uses the month, day, hour, minute, and second values
2213 /// to determine the number of seconds until the next power-on of the system.  The presence of
2214 /// this structure implies that a timed power-on facility is available for the system.
2215 ///
2216 typedef struct {
2217   SMBIOS_STRUCTURE    Hdr;
2218   UINT8               NextScheduledPowerOnMonth;
2219   UINT8               NextScheduledPowerOnDayOfMonth;
2220   UINT8               NextScheduledPowerOnHour;
2221   UINT8               NextScheduledPowerOnMinute;
2222   UINT8               NextScheduledPowerOnSecond;
2223 } SMBIOS_TABLE_TYPE25;
2224 
2225 ///
2226 /// Voltage Probe - Location and Status.
2227 ///
2228 typedef struct {
2229   UINT8    VoltageProbeSite   : 5;
2230   UINT8    VoltageProbeStatus : 3;
2231 } MISC_VOLTAGE_PROBE_LOCATION;
2232 
2233 ///
2234 /// Voltage Probe (Type 26)
2235 ///
2236 /// This describes the attributes for a voltage probe in the system.
2237 /// Each structure describes a single voltage probe.
2238 ///
2239 typedef struct {
2240   SMBIOS_STRUCTURE               Hdr;
2241   SMBIOS_TABLE_STRING            Description;
2242   MISC_VOLTAGE_PROBE_LOCATION    LocationAndStatus;
2243   UINT16                         MaximumValue;
2244   UINT16                         MinimumValue;
2245   UINT16                         Resolution;
2246   UINT16                         Tolerance;
2247   UINT16                         Accuracy;
2248   UINT32                         OEMDefined;
2249   UINT16                         NominalValue;
2250 } SMBIOS_TABLE_TYPE26;
2251 
2252 ///
2253 /// Cooling Device - Device Type and Status.
2254 ///
2255 typedef struct {
2256   UINT8    CoolingDevice       : 5;
2257   UINT8    CoolingDeviceStatus : 3;
2258 } MISC_COOLING_DEVICE_TYPE;
2259 
2260 ///
2261 /// Cooling Device (Type 27)
2262 ///
2263 /// This structure describes the attributes for a cooling device in the system.
2264 /// Each structure describes a single cooling device.
2265 ///
2266 typedef struct {
2267   SMBIOS_STRUCTURE            Hdr;
2268   UINT16                      TemperatureProbeHandle;
2269   MISC_COOLING_DEVICE_TYPE    DeviceTypeAndStatus;
2270   UINT8                       CoolingUnitGroup;
2271   UINT32                      OEMDefined;
2272   UINT16                      NominalSpeed;
2273   //
2274   // Add for smbios 2.7
2275   //
2276   SMBIOS_TABLE_STRING         Description;
2277 } SMBIOS_TABLE_TYPE27;
2278 
2279 ///
2280 /// Temperature Probe - Location and Status.
2281 ///
2282 typedef struct {
2283   UINT8    TemperatureProbeSite   : 5;
2284   UINT8    TemperatureProbeStatus : 3;
2285 } MISC_TEMPERATURE_PROBE_LOCATION;
2286 
2287 ///
2288 /// Temperature Probe (Type 28).
2289 ///
2290 /// This structure describes the attributes for a temperature probe in the system.
2291 /// Each structure describes a single temperature probe.
2292 ///
2293 typedef struct {
2294   SMBIOS_STRUCTURE                   Hdr;
2295   SMBIOS_TABLE_STRING                Description;
2296   MISC_TEMPERATURE_PROBE_LOCATION    LocationAndStatus;
2297   UINT16                             MaximumValue;
2298   UINT16                             MinimumValue;
2299   UINT16                             Resolution;
2300   UINT16                             Tolerance;
2301   UINT16                             Accuracy;
2302   UINT32                             OEMDefined;
2303   UINT16                             NominalValue;
2304 } SMBIOS_TABLE_TYPE28;
2305 
2306 ///
2307 /// Electrical Current Probe - Location and Status.
2308 ///
2309 typedef struct {
2310   UINT8    ElectricalCurrentProbeSite   : 5;
2311   UINT8    ElectricalCurrentProbeStatus : 3;
2312 } MISC_ELECTRICAL_CURRENT_PROBE_LOCATION;
2313 
2314 ///
2315 /// Electrical Current Probe (Type 29).
2316 ///
2317 /// This structure describes the attributes for an electrical current probe in the system.
2318 /// Each structure describes a single electrical current probe.
2319 ///
2320 typedef struct {
2321   SMBIOS_STRUCTURE                          Hdr;
2322   SMBIOS_TABLE_STRING                       Description;
2323   MISC_ELECTRICAL_CURRENT_PROBE_LOCATION    LocationAndStatus;
2324   UINT16                                    MaximumValue;
2325   UINT16                                    MinimumValue;
2326   UINT16                                    Resolution;
2327   UINT16                                    Tolerance;
2328   UINT16                                    Accuracy;
2329   UINT32                                    OEMDefined;
2330   UINT16                                    NominalValue;
2331 } SMBIOS_TABLE_TYPE29;
2332 
2333 ///
2334 /// Out-of-Band Remote Access (Type 30).
2335 ///
2336 /// This structure describes the attributes and policy settings of a hardware facility
2337 /// that may be used to gain remote access to a hardware system when the operating system
2338 /// is not available due to power-down status, hardware failures, or boot failures.
2339 ///
2340 typedef struct {
2341   SMBIOS_STRUCTURE       Hdr;
2342   SMBIOS_TABLE_STRING    ManufacturerName;
2343   UINT8                  Connections;
2344 } SMBIOS_TABLE_TYPE30;
2345 
2346 ///
2347 /// Boot Integrity Services (BIS) Entry Point (Type 31).
2348 ///
2349 /// Structure type 31 (decimal) is reserved for use by the Boot Integrity Services (BIS).
2350 ///
2351 typedef struct {
2352   SMBIOS_STRUCTURE    Hdr;
2353   UINT8               Checksum;
2354   UINT8               Reserved1;
2355   UINT16              Reserved2;
2356   UINT32              BisEntry16;
2357   UINT32              BisEntry32;
2358   UINT64              Reserved3;
2359   UINT32              Reserved4;
2360 } SMBIOS_TABLE_TYPE31;
2361 
2362 ///
2363 /// System Boot Information - System Boot Status.
2364 ///
2365 typedef enum {
2366   BootInformationStatusNoError                 = 0x00,
2367   BootInformationStatusNoBootableMedia         = 0x01,
2368   BootInformationStatusNormalOSFailedLoading   = 0x02,
2369   BootInformationStatusFirmwareDetectedFailure = 0x03,
2370   BootInformationStatusOSDetectedFailure       = 0x04,
2371   BootInformationStatusUserRequestedBoot       = 0x05,
2372   BootInformationStatusSystemSecurityViolation = 0x06,
2373   BootInformationStatusPreviousRequestedImage  = 0x07,
2374   BootInformationStatusWatchdogTimerExpired    = 0x08,
2375   BootInformationStatusStartReserved           = 0x09,
2376   BootInformationStatusStartOemSpecific        = 0x80,
2377   BootInformationStatusStartProductSpecific    = 0xC0
2378 } MISC_BOOT_INFORMATION_STATUS_DATA_TYPE;
2379 
2380 ///
2381 /// System Boot Information (Type 32).
2382 ///
2383 /// The client system firmware, e.g. BIOS, communicates the System Boot Status to the
2384 /// client's Pre-boot Execution Environment (PXE) boot image or OS-present management
2385 /// application via this structure. When used in the PXE environment, for example,
2386 /// this code identifies the reason the PXE was initiated and can be used by boot-image
2387 /// software to further automate an enterprise's PXE sessions.  For example, an enterprise
2388 /// could choose to automatically download a hardware-diagnostic image to a client whose
2389 /// reason code indicated either a firmware- or operating system-detected hardware failure.
2390 ///
2391 typedef struct {
2392   SMBIOS_STRUCTURE    Hdr;
2393   UINT8               Reserved[6];
2394   UINT8               BootStatus;                         ///< The enumeration value from MISC_BOOT_INFORMATION_STATUS_DATA_TYPE.
2395 } SMBIOS_TABLE_TYPE32;
2396 
2397 ///
2398 /// 64-bit Memory Error Information (Type 33).
2399 ///
2400 /// This structure describes an error within a Physical Memory Array,
2401 /// when the error address is above 4G (0xFFFFFFFF).
2402 ///
2403 typedef struct {
2404   SMBIOS_STRUCTURE    Hdr;
2405   UINT8               ErrorType;                          ///< The enumeration value from MEMORY_ERROR_TYPE.
2406   UINT8               ErrorGranularity;                   ///< The enumeration value from MEMORY_ERROR_GRANULARITY.
2407   UINT8               ErrorOperation;                     ///< The enumeration value from MEMORY_ERROR_OPERATION.
2408   UINT32              VendorSyndrome;
2409   UINT64              MemoryArrayErrorAddress;
2410   UINT64              DeviceErrorAddress;
2411   UINT32              ErrorResolution;
2412 } SMBIOS_TABLE_TYPE33;
2413 
2414 ///
2415 /// Management Device -  Type.
2416 ///
2417 typedef enum {
2418   ManagementDeviceTypeOther     = 0x01,
2419   ManagementDeviceTypeUnknown   = 0x02,
2420   ManagementDeviceTypeLm75      = 0x03,
2421   ManagementDeviceTypeLm78      = 0x04,
2422   ManagementDeviceTypeLm79      = 0x05,
2423   ManagementDeviceTypeLm80      = 0x06,
2424   ManagementDeviceTypeLm81      = 0x07,
2425   ManagementDeviceTypeAdm9240   = 0x08,
2426   ManagementDeviceTypeDs1780    = 0x09,
2427   ManagementDeviceTypeMaxim1617 = 0x0A,
2428   ManagementDeviceTypeGl518Sm   = 0x0B,
2429   ManagementDeviceTypeW83781D   = 0x0C,
2430   ManagementDeviceTypeHt82H791  = 0x0D
2431 } MISC_MANAGEMENT_DEVICE_TYPE;
2432 
2433 ///
2434 /// Management Device -  Address Type.
2435 ///
2436 typedef enum {
2437   ManagementDeviceAddressTypeOther   = 0x01,
2438   ManagementDeviceAddressTypeUnknown = 0x02,
2439   ManagementDeviceAddressTypeIOPort  = 0x03,
2440   ManagementDeviceAddressTypeMemory  = 0x04,
2441   ManagementDeviceAddressTypeSmbus   = 0x05
2442 } MISC_MANAGEMENT_DEVICE_ADDRESS_TYPE;
2443 
2444 ///
2445 /// Management Device (Type 34).
2446 ///
2447 /// The information in this structure defines the attributes of a Management Device.
2448 /// A Management Device might control one or more fans or voltage, current, or temperature
2449 /// probes as defined by one or more Management Device Component structures.
2450 ///
2451 typedef struct {
2452   SMBIOS_STRUCTURE       Hdr;
2453   SMBIOS_TABLE_STRING    Description;
2454   UINT8                  Type;                                    ///< The enumeration value from MISC_MANAGEMENT_DEVICE_TYPE.
2455   UINT32                 Address;
2456   UINT8                  AddressType;                             ///< The enumeration value from MISC_MANAGEMENT_DEVICE_ADDRESS_TYPE.
2457 } SMBIOS_TABLE_TYPE34;
2458 
2459 ///
2460 /// Management Device Component (Type 35)
2461 ///
2462 /// This structure associates a cooling device or environmental probe with structures
2463 /// that define the controlling hardware device and (optionally) the component's thresholds.
2464 ///
2465 typedef struct {
2466   SMBIOS_STRUCTURE       Hdr;
2467   SMBIOS_TABLE_STRING    Description;
2468   UINT16                 ManagementDeviceHandle;
2469   UINT16                 ComponentHandle;
2470   UINT16                 ThresholdHandle;
2471 } SMBIOS_TABLE_TYPE35;
2472 
2473 ///
2474 /// Management Device Threshold Data (Type 36).
2475 ///
2476 /// The information in this structure defines threshold information for
2477 /// a component (probe or cooling-unit) contained within a Management Device.
2478 ///
2479 typedef struct {
2480   SMBIOS_STRUCTURE    Hdr;
2481   UINT16              LowerThresholdNonCritical;
2482   UINT16              UpperThresholdNonCritical;
2483   UINT16              LowerThresholdCritical;
2484   UINT16              UpperThresholdCritical;
2485   UINT16              LowerThresholdNonRecoverable;
2486   UINT16              UpperThresholdNonRecoverable;
2487 } SMBIOS_TABLE_TYPE36;
2488 
2489 ///
2490 /// Memory Channel Entry.
2491 ///
2492 typedef struct {
2493   UINT8     DeviceLoad;
2494   UINT16    DeviceHandle;
2495 } MEMORY_DEVICE;
2496 
2497 ///
2498 /// Memory Channel - Channel Type.
2499 ///
2500 typedef enum {
2501   MemoryChannelTypeOther    = 0x01,
2502   MemoryChannelTypeUnknown  = 0x02,
2503   MemoryChannelTypeRambus   = 0x03,
2504   MemoryChannelTypeSyncLink = 0x04
2505 } MEMORY_CHANNEL_TYPE;
2506 
2507 ///
2508 /// Memory Channel (Type 37)
2509 ///
2510 /// The information in this structure provides the correlation between a Memory Channel
2511 /// and its associated Memory Devices.  Each device presents one or more loads to the channel.
2512 /// The sum of all device loads cannot exceed the channel's defined maximum.
2513 ///
2514 typedef struct {
2515   SMBIOS_STRUCTURE    Hdr;
2516   UINT8               ChannelType;
2517   UINT8               MaximumChannelLoad;
2518   UINT8               MemoryDeviceCount;
2519   MEMORY_DEVICE       MemoryDevice[1];
2520 } SMBIOS_TABLE_TYPE37;
2521 
2522 ///
2523 /// IPMI Device Information - BMC Interface Type
2524 ///
2525 typedef enum {
2526   IPMIDeviceInfoInterfaceTypeUnknown = 0x00,
2527   IPMIDeviceInfoInterfaceTypeKCS     = 0x01,       ///< The Keyboard Controller Style.
2528   IPMIDeviceInfoInterfaceTypeSMIC    = 0x02,       ///< The Server Management Interface Chip.
2529   IPMIDeviceInfoInterfaceTypeBT      = 0x03,       ///< The Block Transfer
2530   IPMIDeviceInfoInterfaceTypeSSIF    = 0x04        ///< SMBus System Interface
2531 } BMC_INTERFACE_TYPE;
2532 
2533 ///
2534 /// IPMI Device Information (Type 38).
2535 ///
2536 /// The information in this structure defines the attributes of an
2537 /// Intelligent Platform Management Interface (IPMI) Baseboard Management Controller (BMC).
2538 ///
2539 /// The Type 42 structure can also be used to describe a physical management controller
2540 /// host interface and one or more protocols that share that interface. If IPMI is not
2541 /// shared with other protocols, either the Type 38 or Type 42 structures can be used.
2542 /// Providing Type 38 is recommended for backward compatibility.
2543 ///
2544 typedef struct {
2545   SMBIOS_STRUCTURE    Hdr;
2546   UINT8               InterfaceType;                ///< The enumeration value from BMC_INTERFACE_TYPE.
2547   UINT8               IPMISpecificationRevision;
2548   UINT8               I2CSlaveAddress;
2549   UINT8               NVStorageDeviceAddress;
2550   UINT64              BaseAddress;
2551   UINT8               BaseAddressModifier_InterruptInfo;
2552   UINT8               InterruptNumber;
2553 } SMBIOS_TABLE_TYPE38;
2554 
2555 ///
2556 /// System Power Supply - Power Supply Characteristics.
2557 ///
2558 typedef struct {
2559   UINT16    PowerSupplyHotReplaceable : 1;
2560   UINT16    PowerSupplyPresent        : 1;
2561   UINT16    PowerSupplyUnplugged      : 1;
2562   UINT16    InputVoltageRangeSwitch   : 4;
2563   UINT16    PowerSupplyStatus         : 3;
2564   UINT16    PowerSupplyType           : 4;
2565   UINT16    Reserved                  : 2;
2566 } SYS_POWER_SUPPLY_CHARACTERISTICS;
2567 
2568 ///
2569 /// System Power Supply (Type 39).
2570 ///
2571 /// This structure identifies attributes of a system power supply. One instance
2572 /// of this record is present for each possible power supply in a system.
2573 ///
2574 typedef struct {
2575   SMBIOS_STRUCTURE                    Hdr;
2576   UINT8                               PowerUnitGroup;
2577   SMBIOS_TABLE_STRING                 Location;
2578   SMBIOS_TABLE_STRING                 DeviceName;
2579   SMBIOS_TABLE_STRING                 Manufacturer;
2580   SMBIOS_TABLE_STRING                 SerialNumber;
2581   SMBIOS_TABLE_STRING                 AssetTagNumber;
2582   SMBIOS_TABLE_STRING                 ModelPartNumber;
2583   SMBIOS_TABLE_STRING                 RevisionLevel;
2584   UINT16                              MaxPowerCapacity;
2585   SYS_POWER_SUPPLY_CHARACTERISTICS    PowerSupplyCharacteristics;
2586   UINT16                              InputVoltageProbeHandle;
2587   UINT16                              CoolingDeviceHandle;
2588   UINT16                              InputCurrentProbeHandle;
2589 } SMBIOS_TABLE_TYPE39;
2590 
2591 ///
2592 /// Additional Information Entry Format.
2593 ///
2594 typedef struct {
2595   UINT8                  EntryLength;
2596   UINT16                 ReferencedHandle;
2597   UINT8                  ReferencedOffset;
2598   SMBIOS_TABLE_STRING    EntryString;
2599   UINT8                  Value[1];
2600 } ADDITIONAL_INFORMATION_ENTRY;
2601 
2602 ///
2603 /// Additional Information (Type 40).
2604 ///
2605 /// This structure is intended to provide additional information for handling unspecified
2606 /// enumerated values and interim field updates in another structure.
2607 ///
2608 typedef struct {
2609   SMBIOS_STRUCTURE                Hdr;
2610   UINT8                           NumberOfAdditionalInformationEntries;
2611   ADDITIONAL_INFORMATION_ENTRY    AdditionalInfoEntries[1];
2612 } SMBIOS_TABLE_TYPE40;
2613 
2614 ///
2615 /// Onboard Devices Extended Information - Onboard Device Types.
2616 ///
2617 typedef enum {
2618   OnBoardDeviceExtendedTypeOther          = 0x01,
2619   OnBoardDeviceExtendedTypeUnknown        = 0x02,
2620   OnBoardDeviceExtendedTypeVideo          = 0x03,
2621   OnBoardDeviceExtendedTypeScsiController = 0x04,
2622   OnBoardDeviceExtendedTypeEthernet       = 0x05,
2623   OnBoardDeviceExtendedTypeTokenRing      = 0x06,
2624   OnBoardDeviceExtendedTypeSound          = 0x07,
2625   OnBoardDeviceExtendedTypePATAController = 0x08,
2626   OnBoardDeviceExtendedTypeSATAController = 0x09,
2627   OnBoardDeviceExtendedTypeSASController  = 0x0A,
2628   OnBoardDeviceExtendedTypeWirelessLAN    = 0x0B,
2629   OnBoardDeviceExtendedTypeBluetooth      = 0x0C,
2630   OnBoardDeviceExtendedTypeWWAN           = 0x0D,
2631   OnBoardDeviceExtendedTypeeMMC           = 0x0E,
2632   OnBoardDeviceExtendedTypeNvme           = 0x0F,
2633   OnBoardDeviceExtendedTypeUfc            = 0x10
2634 } ONBOARD_DEVICE_EXTENDED_INFO_TYPE;
2635 
2636 ///
2637 /// Onboard Devices Extended Information (Type 41).
2638 ///
2639 /// The information in this structure defines the attributes of devices that
2640 /// are onboard (soldered onto) a system element, usually the baseboard.
2641 /// In general, an entry in this table implies that the BIOS has some level of
2642 /// control over the enabling of the associated device for use by the system.
2643 ///
2644 typedef struct {
2645   SMBIOS_STRUCTURE       Hdr;
2646   SMBIOS_TABLE_STRING    ReferenceDesignation;
2647   UINT8                  DeviceType;                        ///< The enumeration value from ONBOARD_DEVICE_EXTENDED_INFO_TYPE
2648   UINT8                  DeviceTypeInstance;
2649   UINT16                 SegmentGroupNum;
2650   UINT8                  BusNum;
2651   UINT8                  DevFuncNum;
2652 } SMBIOS_TABLE_TYPE41;
2653 
2654 ///
2655 ///  Management Controller Host Interface - Protocol Record Data Format.
2656 ///
2657 typedef struct {
2658   UINT8    ProtocolType;
2659   UINT8    ProtocolTypeDataLen;
2660   UINT8    ProtocolTypeData[1];
2661 } MC_HOST_INTERFACE_PROTOCOL_RECORD;
2662 
2663 ///
2664 /// Management Controller Host Interface - Interface Types.
2665 /// 00h - 3Fh: MCTP Host Interfaces
2666 ///
2667 typedef enum {
2668   MCHostInterfaceTypeNetworkHostInterface = 0x40,
2669   MCHostInterfaceTypeOemDefined           = 0xF0
2670 } MC_HOST_INTERFACE_TYPE;
2671 
2672 ///
2673 /// Management Controller Host Interface - Protocol Types.
2674 ///
2675 typedef enum {
2676   MCHostInterfaceProtocolTypeIPMI          = 0x02,
2677   MCHostInterfaceProtocolTypeMCTP          = 0x03,
2678   MCHostInterfaceProtocolTypeRedfishOverIP = 0x04,
2679   MCHostInterfaceProtocolTypeOemDefined    = 0xF0
2680 } MC_HOST_INTERFACE_PROTOCOL_TYPE;
2681 
2682 ///
2683 /// Management Controller Host Interface (Type 42).
2684 ///
2685 /// The information in this structure defines the attributes of a Management
2686 /// Controller Host Interface that is not discoverable by "Plug and Play" mechanisms.
2687 ///
2688 /// Type 42 should be used for management controller host interfaces that use protocols
2689 /// other than IPMI or that use multiple protocols on a single host interface type.
2690 ///
2691 /// This structure should also be provided if IPMI is shared with other protocols
2692 /// over the same interface hardware. If IPMI is not shared with other protocols,
2693 /// either the Type 38 or Type 42 structures can be used. Providing Type 38 is
2694 /// recommended for backward compatibility. The structures are not required to
2695 /// be mutually exclusive. Type 38 and Type 42 structures may be implemented
2696 /// simultaneously to provide backward compatibility with IPMI applications or drivers
2697 /// that do not yet recognize the Type 42 structure.
2698 ///
2699 typedef struct {
2700   SMBIOS_STRUCTURE    Hdr;
2701   UINT8               InterfaceType;                                ///< The enumeration value from MC_HOST_INTERFACE_TYPE
2702   UINT8               InterfaceTypeSpecificDataLength;
2703   UINT8               InterfaceTypeSpecificData[4];                 ///< This field has a minimum of four bytes
2704 } SMBIOS_TABLE_TYPE42;
2705 
2706 ///
2707 /// Processor Specific Block - Processor Architecture Type
2708 ///
2709 typedef enum {
2710   ProcessorSpecificBlockArchTypeReserved    = 0x00,
2711   ProcessorSpecificBlockArchTypeIa32        = 0x01,
2712   ProcessorSpecificBlockArchTypeX64         = 0x02,
2713   ProcessorSpecificBlockArchTypeItanium     = 0x03,
2714   ProcessorSpecificBlockArchTypeAarch32     = 0x04,
2715   ProcessorSpecificBlockArchTypeAarch64     = 0x05,
2716   ProcessorSpecificBlockArchTypeRiscVRV32   = 0x06,
2717   ProcessorSpecificBlockArchTypeRiscVRV64   = 0x07,
2718   ProcessorSpecificBlockArchTypeRiscVRV128  = 0x08,
2719   ProcessorSpecificBlockArchTypeLoongArch32 = 0x09,
2720   ProcessorSpecificBlockArchTypeLoongArch64 = 0x0A
2721 } PROCESSOR_SPECIFIC_BLOCK_ARCH_TYPE;
2722 
2723 ///
2724 /// Processor Specific Block is the standard container of processor-specific data.
2725 ///
2726 typedef struct {
2727   UINT8    Length;
2728   UINT8    ProcessorArchType;
2729   ///
2730   /// Below followed by Processor-specific data
2731   ///
2732   ///
2733 } PROCESSOR_SPECIFIC_BLOCK;
2734 
2735 ///
2736 /// Processor Additional Information(Type 44).
2737 ///
2738 /// The information in this structure defines the processor additional information in case
2739 /// SMBIOS type 4 is not sufficient to describe processor characteristics.
2740 /// The SMBIOS type 44 structure has a reference handle field to link back to the related
2741 /// SMBIOS type 4 structure. There may be multiple SMBIOS type 44 structures linked to the
2742 /// same SMBIOS type 4 structure. For example, when cores are not identical in a processor,
2743 /// SMBIOS type 44 structures describe different core-specific information.
2744 ///
2745 /// SMBIOS type 44 defines the standard header for the processor-specific block, while the
2746 /// contents of processor-specific data are maintained by processor
2747 /// architecture workgroups or vendors in separate documents.
2748 ///
2749 typedef struct {
2750   SMBIOS_STRUCTURE            Hdr;
2751   SMBIOS_HANDLE               RefHandle;                       ///< This field refer to associated SMBIOS type 4
2752   ///
2753   /// Below followed by Processor-specific block
2754   ///
2755   PROCESSOR_SPECIFIC_BLOCK    ProcessorSpecificBlock;
2756 } SMBIOS_TABLE_TYPE44;
2757 
2758 ///
2759 /// TPM Device (Type 43).
2760 ///
2761 typedef struct {
2762   SMBIOS_STRUCTURE       Hdr;
2763   UINT8                  VendorID[4];
2764   UINT8                  MajorSpecVersion;
2765   UINT8                  MinorSpecVersion;
2766   UINT32                 FirmwareVersion1;
2767   UINT32                 FirmwareVersion2;
2768   SMBIOS_TABLE_STRING    Description;
2769   UINT64                 Characteristics;
2770   UINT32                 OemDefined;
2771 } SMBIOS_TABLE_TYPE43;
2772 
2773 ///
2774 /// Firmware Inventory Version Format Type (Type 45).
2775 ///
2776 typedef enum {
2777   VersionFormatTypeFreeForm   = 0x00,
2778   VersionFormatTypeMajorMinor = 0x01,
2779   VersionFormatType32BitHex   = 0x02,
2780   VersionFormatType64BitHex   = 0x03,
2781   VersionFormatTypeReserved   = 0x04,  /// 0x04 - 0x7F are reserved
2782   VersionFormatTypeOem        = 0x80   /// 0x80 - 0xFF are BIOS Vendor/OEM-specific
2783 } FIRMWARE_INVENTORY_VERSION_FORMAT_TYPE;
2784 
2785 ///
2786 /// Firmware Inventory Firmware Id Format Type (Type 45).
2787 ///
2788 typedef enum {
2789   FirmwareIdFormatTypeFreeForm     = 0x00,
2790   FirmwareIdFormatTypeUuid         = 0x01,
2791   FirmwareIdFormatTypeReserved     = 0x04,  /// 0x04 - 0x7F are reserved
2792   InventoryFirmwareIdFormatTypeOem = 0x80   /// 0x80 - 0xFF are BIOS Vendor/OEM-specific
2793 } FIRMWARE_INVENTORY_FIRMWARE_ID_FORMAT_TYPE;
2794 
2795 ///
2796 /// Firmware Inventory Firmware Characteristics (Type 45).
2797 ///
2798 typedef struct {
2799   UINT16    Updatable      : 1;
2800   UINT16    WriteProtected : 1;
2801   UINT16    Reserved       : 14;
2802 } FIRMWARE_CHARACTERISTICS;
2803 
2804 ///
2805 /// Firmware Inventory State Information (Type 45).
2806 ///
2807 typedef enum {
2808   FirmwareInventoryStateOther              = 0x01,
2809   FirmwareInventoryStateUnknown            = 0x02,
2810   FirmwareInventoryStateDisabled           = 0x03,
2811   FirmwareInventoryStateEnabled            = 0x04,
2812   FirmwareInventoryStateAbsent             = 0x05,
2813   FirmwareInventoryStateStandbyOffline     = 0x06,
2814   FirmwareInventoryStateStandbySpare       = 0x07,
2815   FirmwareInventoryStateUnavailableOffline = 0x08
2816 } FIRMWARE_INVENTORY_STATE;
2817 
2818 ///
2819 /// Firmware Inventory Information (Type 45)
2820 ///
2821 /// The information in this structure defines an inventory of firmware
2822 /// components in the system. This can include firmware components such as
2823 /// BIOS, BMC, as well as firmware for other devices in the system.
2824 /// The information can be used by software to display the firmware inventory
2825 /// in a uniform manner. It can also be used by a management controller,
2826 /// such as a BMC, for remote system management.
2827 /// This structure is not intended to replace other standard programmatic
2828 /// interfaces for firmware updates.
2829 /// One Type 45 structure is provided for each firmware component.
2830 ///
2831 typedef struct {
2832   SMBIOS_STRUCTURE            Hdr;
2833   SMBIOS_TABLE_STRING         FirmwareComponentName;
2834   SMBIOS_TABLE_STRING         FirmwareVersion;
2835   UINT8                       FirmwareVersionFormat;    ///< The enumeration value from FIRMWARE_INVENTORY_VERSION_FORMAT_TYPE
2836   SMBIOS_TABLE_STRING         FirmwareId;
2837   UINT8                       FirmwareIdFormat;         ///< The enumeration value from FIRMWARE_INVENTORY_FIRMWARE_ID_FORMAT_TYPE.
2838   SMBIOS_TABLE_STRING         ReleaseDate;
2839   SMBIOS_TABLE_STRING         Manufacturer;
2840   SMBIOS_TABLE_STRING         LowestSupportedVersion;
2841   UINT64                      ImageSize;
2842   FIRMWARE_CHARACTERISTICS    Characteristics;
2843   UINT8                       State;                    ///< The enumeration value from FIRMWARE_INVENTORY_STATE.
2844   UINT8                       AssociatedComponentCount;
2845   ///
2846   /// zero or n-number of handles depends on AssociatedComponentCount
2847   /// handles are of type SMBIOS_HANDLE
2848   ///
2849 } SMBIOS_TABLE_TYPE45;
2850 
2851 ///
2852 /// String Property IDs (Type 46).
2853 ///
2854 typedef enum {
2855   StringPropertyIdNone       = 0x0000,
2856   StringPropertyIdDevicePath = 0x0001,
2857   StringPropertyIdReserved   = 0x0002,  /// Reserved    0x0002 - 0x7FFF
2858   StringPropertyIdBiosVendor = 0x8000,  /// BIOS vendor 0x8000 - 0xBFFF
2859   StringPropertyIdOem        = 0xC000   /// OEM range   0xC000 - 0xFFFF
2860 } STRING_PROPERTY_ID;
2861 
2862 ///
2863 /// This structure defines a string property for another structure.
2864 /// This allows adding string properties that are common to several structures
2865 /// without having to modify the definitions of these structures.
2866 /// Multiple type 46 structures can add string properties to the same
2867 /// parent structure.
2868 ///
2869 typedef struct {
2870   SMBIOS_STRUCTURE       Hdr;
2871   UINT16                 StringPropertyId;          ///< The enumeration value from STRING_PROPERTY_ID.
2872   SMBIOS_TABLE_STRING    StringPropertyValue;
2873   SMBIOS_HANDLE          ParentHandle;
2874 } SMBIOS_TABLE_TYPE46;
2875 
2876 ///
2877 /// Inactive (Type 126)
2878 ///
2879 typedef struct {
2880   SMBIOS_STRUCTURE    Hdr;
2881 } SMBIOS_TABLE_TYPE126;
2882 
2883 ///
2884 /// End-of-Table (Type 127)
2885 ///
2886 typedef struct {
2887   SMBIOS_STRUCTURE    Hdr;
2888 } SMBIOS_TABLE_TYPE127;
2889 
2890 ///
2891 /// Union of all the possible SMBIOS record types.
2892 ///
2893 typedef union {
2894   SMBIOS_STRUCTURE        *Hdr;
2895   SMBIOS_TABLE_TYPE0      *Type0;
2896   SMBIOS_TABLE_TYPE1      *Type1;
2897   SMBIOS_TABLE_TYPE2      *Type2;
2898   SMBIOS_TABLE_TYPE3      *Type3;
2899   SMBIOS_TABLE_TYPE4      *Type4;
2900   SMBIOS_TABLE_TYPE5      *Type5;
2901   SMBIOS_TABLE_TYPE6      *Type6;
2902   SMBIOS_TABLE_TYPE7      *Type7;
2903   SMBIOS_TABLE_TYPE8      *Type8;
2904   SMBIOS_TABLE_TYPE9      *Type9;
2905   SMBIOS_TABLE_TYPE10     *Type10;
2906   SMBIOS_TABLE_TYPE11     *Type11;
2907   SMBIOS_TABLE_TYPE12     *Type12;
2908   SMBIOS_TABLE_TYPE13     *Type13;
2909   SMBIOS_TABLE_TYPE14     *Type14;
2910   SMBIOS_TABLE_TYPE15     *Type15;
2911   SMBIOS_TABLE_TYPE16     *Type16;
2912   SMBIOS_TABLE_TYPE17     *Type17;
2913   SMBIOS_TABLE_TYPE18     *Type18;
2914   SMBIOS_TABLE_TYPE19     *Type19;
2915   SMBIOS_TABLE_TYPE20     *Type20;
2916   SMBIOS_TABLE_TYPE21     *Type21;
2917   SMBIOS_TABLE_TYPE22     *Type22;
2918   SMBIOS_TABLE_TYPE23     *Type23;
2919   SMBIOS_TABLE_TYPE24     *Type24;
2920   SMBIOS_TABLE_TYPE25     *Type25;
2921   SMBIOS_TABLE_TYPE26     *Type26;
2922   SMBIOS_TABLE_TYPE27     *Type27;
2923   SMBIOS_TABLE_TYPE28     *Type28;
2924   SMBIOS_TABLE_TYPE29     *Type29;
2925   SMBIOS_TABLE_TYPE30     *Type30;
2926   SMBIOS_TABLE_TYPE31     *Type31;
2927   SMBIOS_TABLE_TYPE32     *Type32;
2928   SMBIOS_TABLE_TYPE33     *Type33;
2929   SMBIOS_TABLE_TYPE34     *Type34;
2930   SMBIOS_TABLE_TYPE35     *Type35;
2931   SMBIOS_TABLE_TYPE36     *Type36;
2932   SMBIOS_TABLE_TYPE37     *Type37;
2933   SMBIOS_TABLE_TYPE38     *Type38;
2934   SMBIOS_TABLE_TYPE39     *Type39;
2935   SMBIOS_TABLE_TYPE40     *Type40;
2936   SMBIOS_TABLE_TYPE41     *Type41;
2937   SMBIOS_TABLE_TYPE42     *Type42;
2938   SMBIOS_TABLE_TYPE43     *Type43;
2939   SMBIOS_TABLE_TYPE44     *Type44;
2940   SMBIOS_TABLE_TYPE45     *Type45;
2941   SMBIOS_TABLE_TYPE46     *Type46;
2942   SMBIOS_TABLE_TYPE126    *Type126;
2943   SMBIOS_TABLE_TYPE127    *Type127;
2944   UINT8                   *Raw;
2945 } SMBIOS_STRUCTURE_POINTER;
2946 
2947 #pragma pack()
2948 
2949 #endif
2950