1 /** @file
2   Industry Standard Definitions of SMBIOS Table Specification v3.0.0.
3 
4 Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
5 (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
6 This program and the accompanying materials are licensed and made available under
7 the terms and conditions of the BSD License that accompanies this distribution.
8 The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php.
10 
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #ifndef __SMBIOS_STANDARD_H__
17 #define __SMBIOS_STANDARD_H__
18 
19 ///
20 /// Reference SMBIOS 2.6, chapter 3.1.2.
21 /// For v2.1 and later, handle values in the range 0FF00h to 0FFFFh are reserved for
22 /// use by this specification.
23 ///
24 #define SMBIOS_HANDLE_RESERVED_BEGIN 0xFF00
25 
26 ///
27 /// Reference SMBIOS 2.7, chapter 6.1.2.
28 /// The UEFI Platform Initialization Specification reserves handle number FFFEh for its
29 /// EFI_SMBIOS_PROTOCOL.Add() function to mean "assign an unused handle number automatically."
30 /// This number is not used for any other purpose by the SMBIOS specification.
31 ///
32 #define SMBIOS_HANDLE_PI_RESERVED 0xFFFE
33 
34 ///
35 /// Reference SMBIOS 2.6, chapter 3.1.3.
36 /// Each text string is limited to 64 significant characters due to system MIF limitations.
37 /// Reference SMBIOS 2.7, chapter 6.1.3.
38 /// It will have no limit on the length of each individual text string.
39 ///
40 #define SMBIOS_STRING_MAX_LENGTH     64
41 
42 //
43 // The length of the entire structure table (including all strings) must be reported
44 // in the Structure Table Length field of the SMBIOS Structure Table Entry Point,
45 // which is a WORD field limited to 65,535 bytes.
46 //
47 #define SMBIOS_TABLE_MAX_LENGTH 0xFFFF
48 
49 //
50 // For SMBIOS 3.0, Structure table maximum size in Entry Point structure is DWORD field limited to 0xFFFFFFFF bytes.
51 //
52 #define SMBIOS_3_0_TABLE_MAX_LENGTH 0xFFFFFFFF
53 
54 ///
55 /// Inactive type is added from SMBIOS 2.2. Reference SMBIOS 2.6, chapter 3.3.43.
56 /// Upper-level software that interprets the SMBIOS structure-table should bypass an
57 /// Inactive structure just like a structure type that the software does not recognize.
58 ///
59 #define SMBIOS_TYPE_INACTIVE         0x007E
60 
61 ///
62 /// End-of-table type is added from SMBIOS 2.2. Reference SMBIOS 2.6, chapter 3.3.44.
63 /// The end-of-table indicator is used in the last physical structure in a table
64 ///
65 #define SMBIOS_TYPE_END_OF_TABLE     0x007F
66 
67 ///
68 /// Smbios Table Entry Point Structure.
69 ///
70 #pragma pack(1)
71 typedef struct {
72   UINT8   AnchorString[4];
73   UINT8   EntryPointStructureChecksum;
74   UINT8   EntryPointLength;
75   UINT8   MajorVersion;
76   UINT8   MinorVersion;
77   UINT16  MaxStructureSize;
78   UINT8   EntryPointRevision;
79   UINT8   FormattedArea[5];
80   UINT8   IntermediateAnchorString[5];
81   UINT8   IntermediateChecksum;
82   UINT16  TableLength;
83   UINT32  TableAddress;
84   UINT16  NumberOfSmbiosStructures;
85   UINT8   SmbiosBcdRevision;
86 } SMBIOS_TABLE_ENTRY_POINT;
87 
88 typedef struct {
89   UINT8   AnchorString[5];
90   UINT8   EntryPointStructureChecksum;
91   UINT8   EntryPointLength;
92   UINT8   MajorVersion;
93   UINT8   MinorVersion;
94   UINT8   DocRev;
95   UINT8   EntryPointRevision;
96   UINT8   Reserved;
97   UINT32  TableMaximumSize;
98   UINT64  TableAddress;
99 } SMBIOS_TABLE_3_0_ENTRY_POINT;
100 
101 ///
102 /// The Smbios structure header.
103 ///
104 typedef struct {
105   UINT8   Type;
106   UINT8   Length;
107   UINT16  Handle;
108 } SMBIOS_STRUCTURE;
109 
110 ///
111 /// String Number for a Null terminated string, 00h stands for no string available.
112 ///
113 typedef UINT8 SMBIOS_TABLE_STRING;
114 
115 ///
116 /// BIOS Characteristics
117 /// Defines which functions the BIOS supports. PCI, PCMCIA, Flash, etc.
118 ///
119 typedef struct {
120   UINT32  Reserved                          :2;  ///< Bits 0-1.
121   UINT32  Unknown                           :1;
122   UINT32  BiosCharacteristicsNotSupported   :1;
123   UINT32  IsaIsSupported                    :1;
124   UINT32  McaIsSupported                    :1;
125   UINT32  EisaIsSupported                   :1;
126   UINT32  PciIsSupported                    :1;
127   UINT32  PcmciaIsSupported                 :1;
128   UINT32  PlugAndPlayIsSupported            :1;
129   UINT32  ApmIsSupported                    :1;
130   UINT32  BiosIsUpgradable                  :1;
131   UINT32  BiosShadowingAllowed              :1;
132   UINT32  VlVesaIsSupported                 :1;
133   UINT32  EscdSupportIsAvailable            :1;
134   UINT32  BootFromCdIsSupported             :1;
135   UINT32  SelectableBootIsSupported         :1;
136   UINT32  RomBiosIsSocketed                 :1;
137   UINT32  BootFromPcmciaIsSupported         :1;
138   UINT32  EDDSpecificationIsSupported       :1;
139   UINT32  JapaneseNecFloppyIsSupported      :1;
140   UINT32  JapaneseToshibaFloppyIsSupported  :1;
141   UINT32  Floppy525_360IsSupported          :1;
142   UINT32  Floppy525_12IsSupported           :1;
143   UINT32  Floppy35_720IsSupported           :1;
144   UINT32  Floppy35_288IsSupported           :1;
145   UINT32  PrintScreenIsSupported            :1;
146   UINT32  Keyboard8042IsSupported           :1;
147   UINT32  SerialIsSupported                 :1;
148   UINT32  PrinterIsSupported                :1;
149   UINT32  CgaMonoIsSupported                :1;
150   UINT32  NecPc98                           :1;
151   UINT32  ReservedForVendor                 :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor
152                                                  ///< and bits 48-63 reserved for System Vendor.
153 } MISC_BIOS_CHARACTERISTICS;
154 
155 ///
156 /// BIOS Characteristics Extension Byte 1.
157 /// This information, available for SMBIOS version 2.1 and later, appears at offset 12h
158 /// within the BIOS Information structure.
159 ///
160 typedef struct {
161   UINT8  AcpiIsSupported                   :1;
162   UINT8  UsbLegacyIsSupported              :1;
163   UINT8  AgpIsSupported                    :1;
164   UINT8  I2OBootIsSupported                :1;
165   UINT8  Ls120BootIsSupported              :1;
166   UINT8  AtapiZipDriveBootIsSupported      :1;
167   UINT8  Boot1394IsSupported               :1;
168   UINT8  SmartBatteryIsSupported           :1;
169 } MBCE_BIOS_RESERVED;
170 
171 ///
172 /// BIOS Characteristics Extension Byte 2.
173 /// This information, available for SMBIOS version 2.3 and later, appears at offset 13h
174 /// within the BIOS Information structure.
175 ///
176 typedef struct {
177   UINT8  BiosBootSpecIsSupported              :1;
178   UINT8  FunctionKeyNetworkBootIsSupported    :1;
179   UINT8  TargetContentDistributionEnabled     :1;
180   UINT8  UefiSpecificationSupported           :1;
181   UINT8  VirtualMachineSupported              :1;
182   UINT8  ExtensionByte2Reserved               :3;
183 } MBCE_SYSTEM_RESERVED;
184 
185 ///
186 /// BIOS Characteristics Extension Bytes.
187 ///
188 typedef struct {
189   MBCE_BIOS_RESERVED    BiosReserved;
190   MBCE_SYSTEM_RESERVED  SystemReserved;
191 } MISC_BIOS_CHARACTERISTICS_EXTENSION;
192 
193 ///
194 /// BIOS Information (Type 0).
195 ///
196 typedef struct {
197   SMBIOS_STRUCTURE          Hdr;
198   SMBIOS_TABLE_STRING       Vendor;
199   SMBIOS_TABLE_STRING       BiosVersion;
200   UINT16                    BiosSegment;
201   SMBIOS_TABLE_STRING       BiosReleaseDate;
202   UINT8                     BiosSize;
203   MISC_BIOS_CHARACTERISTICS BiosCharacteristics;
204   UINT8                     BIOSCharacteristicsExtensionBytes[2];
205   UINT8                     SystemBiosMajorRelease;
206   UINT8                     SystemBiosMinorRelease;
207   UINT8                     EmbeddedControllerFirmwareMajorRelease;
208   UINT8                     EmbeddedControllerFirmwareMinorRelease;
209 } SMBIOS_TABLE_TYPE0;
210 
211 ///
212 ///  System Wake-up Type.
213 ///
214 typedef enum {
215   SystemWakeupTypeReserved         = 0x00,
216   SystemWakeupTypeOther            = 0x01,
217   SystemWakeupTypeUnknown          = 0x02,
218   SystemWakeupTypeApmTimer         = 0x03,
219   SystemWakeupTypeModemRing        = 0x04,
220   SystemWakeupTypeLanRemote        = 0x05,
221   SystemWakeupTypePowerSwitch      = 0x06,
222   SystemWakeupTypePciPme           = 0x07,
223   SystemWakeupTypeAcPowerRestored  = 0x08
224 } MISC_SYSTEM_WAKEUP_TYPE;
225 
226 ///
227 /// System Information (Type 1).
228 ///
229 /// The information in this structure defines attributes of the overall system and is
230 /// intended to be associated with the Component ID group of the system's MIF.
231 /// An SMBIOS implementation is associated with a single system instance and contains
232 /// one and only one System Information (Type 1) structure.
233 ///
234 typedef struct {
235   SMBIOS_STRUCTURE        Hdr;
236   SMBIOS_TABLE_STRING     Manufacturer;
237   SMBIOS_TABLE_STRING     ProductName;
238   SMBIOS_TABLE_STRING     Version;
239   SMBIOS_TABLE_STRING     SerialNumber;
240   GUID                    Uuid;
241   UINT8                   WakeUpType;           ///< The enumeration value from MISC_SYSTEM_WAKEUP_TYPE.
242   SMBIOS_TABLE_STRING     SKUNumber;
243   SMBIOS_TABLE_STRING     Family;
244 } SMBIOS_TABLE_TYPE1;
245 
246 ///
247 ///  Base Board - Feature Flags.
248 ///
249 typedef struct {
250   UINT8  Motherboard           :1;
251   UINT8  RequiresDaughterCard  :1;
252   UINT8  Removable             :1;
253   UINT8  Replaceable           :1;
254   UINT8  HotSwappable          :1;
255   UINT8  Reserved              :3;
256 } BASE_BOARD_FEATURE_FLAGS;
257 
258 ///
259 ///  Base Board - Board Type.
260 ///
261 typedef enum {
262   BaseBoardTypeUnknown                  = 0x1,
263   BaseBoardTypeOther                    = 0x2,
264   BaseBoardTypeServerBlade              = 0x3,
265   BaseBoardTypeConnectivitySwitch       = 0x4,
266   BaseBoardTypeSystemManagementModule   = 0x5,
267   BaseBoardTypeProcessorModule          = 0x6,
268   BaseBoardTypeIOModule                 = 0x7,
269   BaseBoardTypeMemoryModule             = 0x8,
270   BaseBoardTypeDaughterBoard            = 0x9,
271   BaseBoardTypeMotherBoard              = 0xA,
272   BaseBoardTypeProcessorMemoryModule    = 0xB,
273   BaseBoardTypeProcessorIOModule        = 0xC,
274   BaseBoardTypeInterconnectBoard        = 0xD
275 } BASE_BOARD_TYPE;
276 
277 ///
278 /// Base Board (or Module) Information (Type 2).
279 ///
280 /// The information in this structure defines attributes of a system baseboard -
281 /// for example a motherboard, planar, or server blade or other standard system module.
282 ///
283 typedef struct {
284   SMBIOS_STRUCTURE          Hdr;
285   SMBIOS_TABLE_STRING       Manufacturer;
286   SMBIOS_TABLE_STRING       ProductName;
287   SMBIOS_TABLE_STRING       Version;
288   SMBIOS_TABLE_STRING       SerialNumber;
289   SMBIOS_TABLE_STRING       AssetTag;
290   BASE_BOARD_FEATURE_FLAGS  FeatureFlag;
291   SMBIOS_TABLE_STRING       LocationInChassis;
292   UINT16                    ChassisHandle;
293   UINT8                     BoardType;              ///< The enumeration value from BASE_BOARD_TYPE.
294   UINT8                     NumberOfContainedObjectHandles;
295   UINT16                    ContainedObjectHandles[1];
296 } SMBIOS_TABLE_TYPE2;
297 
298 ///
299 /// System Enclosure or Chassis Types
300 ///
301 typedef enum {
302   MiscChassisTypeOther                = 0x01,
303   MiscChassisTypeUnknown              = 0x02,
304   MiscChassisTypeDeskTop              = 0x03,
305   MiscChassisTypeLowProfileDesktop    = 0x04,
306   MiscChassisTypePizzaBox             = 0x05,
307   MiscChassisTypeMiniTower            = 0x06,
308   MiscChassisTypeTower                = 0x07,
309   MiscChassisTypePortable             = 0x08,
310   MiscChassisTypeLapTop               = 0x09,
311   MiscChassisTypeNotebook             = 0x0A,
312   MiscChassisTypeHandHeld             = 0x0B,
313   MiscChassisTypeDockingStation       = 0x0C,
314   MiscChassisTypeAllInOne             = 0x0D,
315   MiscChassisTypeSubNotebook          = 0x0E,
316   MiscChassisTypeSpaceSaving          = 0x0F,
317   MiscChassisTypeLunchBox             = 0x10,
318   MiscChassisTypeMainServerChassis    = 0x11,
319   MiscChassisTypeExpansionChassis     = 0x12,
320   MiscChassisTypeSubChassis           = 0x13,
321   MiscChassisTypeBusExpansionChassis  = 0x14,
322   MiscChassisTypePeripheralChassis    = 0x15,
323   MiscChassisTypeRaidChassis          = 0x16,
324   MiscChassisTypeRackMountChassis     = 0x17,
325   MiscChassisTypeSealedCasePc         = 0x18,
326   MiscChassisMultiSystemChassis       = 0x19,
327   MiscChassisCompactPCI               = 0x1A,
328   MiscChassisAdvancedTCA              = 0x1B,
329   MiscChassisBlade                    = 0x1C,
330   MiscChassisBladeEnclosure           = 0x1D,
331   MiscChassisTablet                   = 0x1E,
332   MiscChassisConvertible              = 0x1F,
333   MiscChassisDetachable               = 0x20
334 } MISC_CHASSIS_TYPE;
335 
336 ///
337 /// System Enclosure or Chassis States .
338 ///
339 typedef enum {
340   ChassisStateOther           = 0x01,
341   ChassisStateUnknown         = 0x02,
342   ChassisStateSafe            = 0x03,
343   ChassisStateWarning         = 0x04,
344   ChassisStateCritical        = 0x05,
345   ChassisStateNonRecoverable  = 0x06
346 } MISC_CHASSIS_STATE;
347 
348 ///
349 /// System Enclosure or Chassis Security Status.
350 ///
351 typedef enum {
352   ChassisSecurityStatusOther                          = 0x01,
353   ChassisSecurityStatusUnknown                        = 0x02,
354   ChassisSecurityStatusNone                           = 0x03,
355   ChassisSecurityStatusExternalInterfaceLockedOut     = 0x04,
356   ChassisSecurityStatusExternalInterfaceLockedEnabled = 0x05
357 } MISC_CHASSIS_SECURITY_STATE;
358 
359 ///
360 /// Contained Element record
361 ///
362 typedef struct {
363   UINT8                 ContainedElementType;
364   UINT8                 ContainedElementMinimum;
365   UINT8                 ContainedElementMaximum;
366 } CONTAINED_ELEMENT;
367 
368 
369 ///
370 /// System Enclosure or Chassis (Type 3).
371 ///
372 /// The information in this structure defines attributes of the system's mechanical enclosure(s).
373 /// For example, if a system included a separate enclosure for its peripheral devices,
374 /// two structures would be returned: one for the main, system enclosure and the second for
375 /// the peripheral device enclosure.  The additions to this structure in v2.1 of this specification
376 /// support the population of the CIM_Chassis class.
377 ///
378 typedef struct {
379   SMBIOS_STRUCTURE            Hdr;
380   SMBIOS_TABLE_STRING         Manufacturer;
381   UINT8                       Type;
382   SMBIOS_TABLE_STRING         Version;
383   SMBIOS_TABLE_STRING         SerialNumber;
384   SMBIOS_TABLE_STRING         AssetTag;
385   UINT8                       BootupState;            ///< The enumeration value from MISC_CHASSIS_STATE.
386   UINT8                       PowerSupplyState;       ///< The enumeration value from MISC_CHASSIS_STATE.
387   UINT8                       ThermalState;           ///< The enumeration value from MISC_CHASSIS_STATE.
388   UINT8                       SecurityStatus;         ///< The enumeration value from MISC_CHASSIS_SECURITY_STATE.
389   UINT8                       OemDefined[4];
390   UINT8                       Height;
391   UINT8                       NumberofPowerCords;
392   UINT8                       ContainedElementCount;
393   UINT8                       ContainedElementRecordLength;
394   CONTAINED_ELEMENT           ContainedElements[1];
395 } SMBIOS_TABLE_TYPE3;
396 
397 ///
398 /// Processor Information - Processor Type.
399 ///
400 typedef enum {
401   ProcessorOther   = 0x01,
402   ProcessorUnknown = 0x02,
403   CentralProcessor = 0x03,
404   MathProcessor    = 0x04,
405   DspProcessor     = 0x05,
406   VideoProcessor   = 0x06
407 } PROCESSOR_TYPE_DATA;
408 
409 ///
410 /// Processor Information - Processor Family.
411 ///
412 typedef enum {
413   ProcessorFamilyOther                  = 0x01,
414   ProcessorFamilyUnknown                = 0x02,
415   ProcessorFamily8086                   = 0x03,
416   ProcessorFamily80286                  = 0x04,
417   ProcessorFamilyIntel386               = 0x05,
418   ProcessorFamilyIntel486               = 0x06,
419   ProcessorFamily8087                   = 0x07,
420   ProcessorFamily80287                  = 0x08,
421   ProcessorFamily80387                  = 0x09,
422   ProcessorFamily80487                  = 0x0A,
423   ProcessorFamilyPentium                = 0x0B,
424   ProcessorFamilyPentiumPro             = 0x0C,
425   ProcessorFamilyPentiumII              = 0x0D,
426   ProcessorFamilyPentiumMMX             = 0x0E,
427   ProcessorFamilyCeleron                = 0x0F,
428   ProcessorFamilyPentiumIIXeon          = 0x10,
429   ProcessorFamilyPentiumIII             = 0x11,
430   ProcessorFamilyM1                     = 0x12,
431   ProcessorFamilyM2                     = 0x13,
432   ProcessorFamilyIntelCeleronM          = 0x14,
433   ProcessorFamilyIntelPentium4Ht        = 0x15,
434   ProcessorFamilyAmdDuron               = 0x18,
435   ProcessorFamilyK5                     = 0x19,
436   ProcessorFamilyK6                     = 0x1A,
437   ProcessorFamilyK6_2                   = 0x1B,
438   ProcessorFamilyK6_3                   = 0x1C,
439   ProcessorFamilyAmdAthlon              = 0x1D,
440   ProcessorFamilyAmd29000               = 0x1E,
441   ProcessorFamilyK6_2Plus               = 0x1F,
442   ProcessorFamilyPowerPC                = 0x20,
443   ProcessorFamilyPowerPC601             = 0x21,
444   ProcessorFamilyPowerPC603             = 0x22,
445   ProcessorFamilyPowerPC603Plus         = 0x23,
446   ProcessorFamilyPowerPC604             = 0x24,
447   ProcessorFamilyPowerPC620             = 0x25,
448   ProcessorFamilyPowerPCx704            = 0x26,
449   ProcessorFamilyPowerPC750             = 0x27,
450   ProcessorFamilyIntelCoreDuo           = 0x28,
451   ProcessorFamilyIntelCoreDuoMobile     = 0x29,
452   ProcessorFamilyIntelCoreSoloMobile    = 0x2A,
453   ProcessorFamilyIntelAtom              = 0x2B,
454   ProcessorFamilyIntelCoreM             = 0x2C,
455   ProcessorFamilyAlpha                  = 0x30,
456   ProcessorFamilyAlpha21064             = 0x31,
457   ProcessorFamilyAlpha21066             = 0x32,
458   ProcessorFamilyAlpha21164             = 0x33,
459   ProcessorFamilyAlpha21164PC           = 0x34,
460   ProcessorFamilyAlpha21164a            = 0x35,
461   ProcessorFamilyAlpha21264             = 0x36,
462   ProcessorFamilyAlpha21364             = 0x37,
463   ProcessorFamilyAmdTurionIIUltraDualCoreMobileM    = 0x38,
464   ProcessorFamilyAmdTurionIIDualCoreMobileM         = 0x39,
465   ProcessorFamilyAmdAthlonIIDualCoreM   = 0x3A,
466   ProcessorFamilyAmdOpteron6100Series   = 0x3B,
467   ProcessorFamilyAmdOpteron4100Series   = 0x3C,
468   ProcessorFamilyAmdOpteron6200Series   = 0x3D,
469   ProcessorFamilyAmdOpteron4200Series   = 0x3E,
470   ProcessorFamilyAmdFxSeries            = 0x3F,
471   ProcessorFamilyMips                   = 0x40,
472   ProcessorFamilyMIPSR4000              = 0x41,
473   ProcessorFamilyMIPSR4200              = 0x42,
474   ProcessorFamilyMIPSR4400              = 0x43,
475   ProcessorFamilyMIPSR4600              = 0x44,
476   ProcessorFamilyMIPSR10000             = 0x45,
477   ProcessorFamilyAmdCSeries             = 0x46,
478   ProcessorFamilyAmdESeries             = 0x47,
479   ProcessorFamilyAmdASeries             = 0x48,    ///< SMBIOS spec 2.8.0 updated the name
480   ProcessorFamilyAmdGSeries             = 0x49,
481   ProcessorFamilyAmdZSeries             = 0x4A,
482   ProcessorFamilyAmdRSeries             = 0x4B,
483   ProcessorFamilyAmdOpteron4300         = 0x4C,
484   ProcessorFamilyAmdOpteron6300         = 0x4D,
485   ProcessorFamilyAmdOpteron3300         = 0x4E,
486   ProcessorFamilyAmdFireProSeries       = 0x4F,
487   ProcessorFamilySparc                  = 0x50,
488   ProcessorFamilySuperSparc             = 0x51,
489   ProcessorFamilymicroSparcII           = 0x52,
490   ProcessorFamilymicroSparcIIep         = 0x53,
491   ProcessorFamilyUltraSparc             = 0x54,
492   ProcessorFamilyUltraSparcII           = 0x55,
493   ProcessorFamilyUltraSparcIii          = 0x56,
494   ProcessorFamilyUltraSparcIII          = 0x57,
495   ProcessorFamilyUltraSparcIIIi         = 0x58,
496   ProcessorFamily68040                  = 0x60,
497   ProcessorFamily68xxx                  = 0x61,
498   ProcessorFamily68000                  = 0x62,
499   ProcessorFamily68010                  = 0x63,
500   ProcessorFamily68020                  = 0x64,
501   ProcessorFamily68030                  = 0x65,
502   ProcessorFamilyAmdAthlonX4QuadCore    = 0x66,
503   ProcessorFamilyAmdOpteronX1000Series  = 0x67,
504   ProcessorFamilyAmdOpteronX2000Series  = 0x68,
505   ProcessorFamilyHobbit                 = 0x70,
506   ProcessorFamilyCrusoeTM5000           = 0x78,
507   ProcessorFamilyCrusoeTM3000           = 0x79,
508   ProcessorFamilyEfficeonTM8000         = 0x7A,
509   ProcessorFamilyWeitek                 = 0x80,
510   ProcessorFamilyItanium                = 0x82,
511   ProcessorFamilyAmdAthlon64            = 0x83,
512   ProcessorFamilyAmdOpteron             = 0x84,
513   ProcessorFamilyAmdSempron             = 0x85,
514   ProcessorFamilyAmdTurion64Mobile      = 0x86,
515   ProcessorFamilyDualCoreAmdOpteron     = 0x87,
516   ProcessorFamilyAmdAthlon64X2DualCore  = 0x88,
517   ProcessorFamilyAmdTurion64X2Mobile    = 0x89,
518   ProcessorFamilyQuadCoreAmdOpteron     = 0x8A,
519   ProcessorFamilyThirdGenerationAmdOpteron = 0x8B,
520   ProcessorFamilyAmdPhenomFxQuadCore    = 0x8C,
521   ProcessorFamilyAmdPhenomX4QuadCore    = 0x8D,
522   ProcessorFamilyAmdPhenomX2DualCore    = 0x8E,
523   ProcessorFamilyAmdAthlonX2DualCore    = 0x8F,
524   ProcessorFamilyPARISC                 = 0x90,
525   ProcessorFamilyPaRisc8500             = 0x91,
526   ProcessorFamilyPaRisc8000             = 0x92,
527   ProcessorFamilyPaRisc7300LC           = 0x93,
528   ProcessorFamilyPaRisc7200             = 0x94,
529   ProcessorFamilyPaRisc7100LC           = 0x95,
530   ProcessorFamilyPaRisc7100             = 0x96,
531   ProcessorFamilyV30                    = 0xA0,
532   ProcessorFamilyQuadCoreIntelXeon3200Series  = 0xA1,
533   ProcessorFamilyDualCoreIntelXeon3000Series  = 0xA2,
534   ProcessorFamilyQuadCoreIntelXeon5300Series  = 0xA3,
535   ProcessorFamilyDualCoreIntelXeon5100Series  = 0xA4,
536   ProcessorFamilyDualCoreIntelXeon5000Series  = 0xA5,
537   ProcessorFamilyDualCoreIntelXeonLV          = 0xA6,
538   ProcessorFamilyDualCoreIntelXeonULV         = 0xA7,
539   ProcessorFamilyDualCoreIntelXeon7100Series  = 0xA8,
540   ProcessorFamilyQuadCoreIntelXeon5400Series  = 0xA9,
541   ProcessorFamilyQuadCoreIntelXeon            = 0xAA,
542   ProcessorFamilyDualCoreIntelXeon5200Series  = 0xAB,
543   ProcessorFamilyDualCoreIntelXeon7200Series  = 0xAC,
544   ProcessorFamilyQuadCoreIntelXeon7300Series  = 0xAD,
545   ProcessorFamilyQuadCoreIntelXeon7400Series  = 0xAE,
546   ProcessorFamilyMultiCoreIntelXeon7400Series = 0xAF,
547   ProcessorFamilyPentiumIIIXeon         = 0xB0,
548   ProcessorFamilyPentiumIIISpeedStep    = 0xB1,
549   ProcessorFamilyPentium4               = 0xB2,
550   ProcessorFamilyIntelXeon              = 0xB3,
551   ProcessorFamilyAS400                  = 0xB4,
552   ProcessorFamilyIntelXeonMP            = 0xB5,
553   ProcessorFamilyAMDAthlonXP            = 0xB6,
554   ProcessorFamilyAMDAthlonMP            = 0xB7,
555   ProcessorFamilyIntelItanium2          = 0xB8,
556   ProcessorFamilyIntelPentiumM          = 0xB9,
557   ProcessorFamilyIntelCeleronD          = 0xBA,
558   ProcessorFamilyIntelPentiumD          = 0xBB,
559   ProcessorFamilyIntelPentiumEx         = 0xBC,
560   ProcessorFamilyIntelCoreSolo          = 0xBD,  ///< SMBIOS spec 2.6 updated this value
561   ProcessorFamilyReserved               = 0xBE,
562   ProcessorFamilyIntelCore2             = 0xBF,
563   ProcessorFamilyIntelCore2Solo         = 0xC0,
564   ProcessorFamilyIntelCore2Extreme      = 0xC1,
565   ProcessorFamilyIntelCore2Quad         = 0xC2,
566   ProcessorFamilyIntelCore2ExtremeMobile = 0xC3,
567   ProcessorFamilyIntelCore2DuoMobile    = 0xC4,
568   ProcessorFamilyIntelCore2SoloMobile   = 0xC5,
569   ProcessorFamilyIntelCoreI7            = 0xC6,
570   ProcessorFamilyDualCoreIntelCeleron   = 0xC7,
571   ProcessorFamilyIBM390                 = 0xC8,
572   ProcessorFamilyG4                     = 0xC9,
573   ProcessorFamilyG5                     = 0xCA,
574   ProcessorFamilyG6                     = 0xCB,
575   ProcessorFamilyzArchitecture          = 0xCC,
576   ProcessorFamilyIntelCoreI5            = 0xCD,
577   ProcessorFamilyIntelCoreI3            = 0xCE,
578   ProcessorFamilyViaC7M                 = 0xD2,
579   ProcessorFamilyViaC7D                 = 0xD3,
580   ProcessorFamilyViaC7                  = 0xD4,
581   ProcessorFamilyViaEden                = 0xD5,
582   ProcessorFamilyMultiCoreIntelXeon           = 0xD6,
583   ProcessorFamilyDualCoreIntelXeon3Series     = 0xD7,
584   ProcessorFamilyQuadCoreIntelXeon3Series     = 0xD8,
585   ProcessorFamilyViaNano                      = 0xD9,
586   ProcessorFamilyDualCoreIntelXeon5Series     = 0xDA,
587   ProcessorFamilyQuadCoreIntelXeon5Series     = 0xDB,
588   ProcessorFamilyDualCoreIntelXeon7Series     = 0xDD,
589   ProcessorFamilyQuadCoreIntelXeon7Series     = 0xDE,
590   ProcessorFamilyMultiCoreIntelXeon7Series    = 0xDF,
591   ProcessorFamilyMultiCoreIntelXeon3400Series = 0xE0,
592   ProcessorFamilyAmdOpteron3000Series         = 0xE4,
593   ProcessorFamilyAmdSempronII                 = 0xE5,
594   ProcessorFamilyEmbeddedAmdOpteronQuadCore   = 0xE6,
595   ProcessorFamilyAmdPhenomTripleCore          = 0xE7,
596   ProcessorFamilyAmdTurionUltraDualCoreMobile = 0xE8,
597   ProcessorFamilyAmdTurionDualCoreMobile      = 0xE9,
598   ProcessorFamilyAmdAthlonDualCore            = 0xEA,
599   ProcessorFamilyAmdSempronSI                 = 0xEB,
600   ProcessorFamilyAmdPhenomII                  = 0xEC,
601   ProcessorFamilyAmdAthlonII                  = 0xED,
602   ProcessorFamilySixCoreAmdOpteron            = 0xEE,
603   ProcessorFamilyAmdSempronM                  = 0xEF,
604   ProcessorFamilyi860                   = 0xFA,
605   ProcessorFamilyi960                   = 0xFB,
606   ProcessorFamilyIndicatorFamily2       = 0xFE,
607   ProcessorFamilyReserved1              = 0xFF
608 } PROCESSOR_FAMILY_DATA;
609 
610 ///
611 /// Processor Information2 - Processor Family2.
612 ///
613 typedef enum {
614   ProcessorFamilySH3                   = 0x0104,
615   ProcessorFamilySH4                   = 0x0105,
616   ProcessorFamilyARM                   = 0x0118,
617   ProcessorFamilyStrongARM             = 0x0119,
618   ProcessorFamily6x86                  = 0x012C,
619   ProcessorFamilyMediaGX               = 0x012D,
620   ProcessorFamilyMII                   = 0x012E,
621   ProcessorFamilyWinChip               = 0x0140,
622   ProcessorFamilyDSP                   = 0x015E,
623   ProcessorFamilyVideoProcessor        = 0x01F4
624 } PROCESSOR_FAMILY2_DATA;
625 
626 ///
627 /// Processor Information - Voltage.
628 ///
629 typedef struct {
630   UINT8  ProcessorVoltageCapability5V        :1;
631   UINT8  ProcessorVoltageCapability3_3V      :1;
632   UINT8  ProcessorVoltageCapability2_9V      :1;
633   UINT8  ProcessorVoltageCapabilityReserved  :1; ///< Bit 3, must be zero.
634   UINT8  ProcessorVoltageReserved            :3; ///< Bits 4-6, must be zero.
635   UINT8  ProcessorVoltageIndicateLegacy      :1;
636 } PROCESSOR_VOLTAGE;
637 
638 ///
639 /// Processor Information - Processor Upgrade.
640 ///
641 typedef enum {
642   ProcessorUpgradeOther         = 0x01,
643   ProcessorUpgradeUnknown       = 0x02,
644   ProcessorUpgradeDaughterBoard = 0x03,
645   ProcessorUpgradeZIFSocket     = 0x04,
646   ProcessorUpgradePiggyBack     = 0x05, ///< Replaceable.
647   ProcessorUpgradeNone          = 0x06,
648   ProcessorUpgradeLIFSocket     = 0x07,
649   ProcessorUpgradeSlot1         = 0x08,
650   ProcessorUpgradeSlot2         = 0x09,
651   ProcessorUpgrade370PinSocket  = 0x0A,
652   ProcessorUpgradeSlotA         = 0x0B,
653   ProcessorUpgradeSlotM         = 0x0C,
654   ProcessorUpgradeSocket423     = 0x0D,
655   ProcessorUpgradeSocketA       = 0x0E, ///< Socket 462.
656   ProcessorUpgradeSocket478     = 0x0F,
657   ProcessorUpgradeSocket754     = 0x10,
658   ProcessorUpgradeSocket940     = 0x11,
659   ProcessorUpgradeSocket939     = 0x12,
660   ProcessorUpgradeSocketmPGA604 = 0x13,
661   ProcessorUpgradeSocketLGA771  = 0x14,
662   ProcessorUpgradeSocketLGA775  = 0x15,
663   ProcessorUpgradeSocketS1      = 0x16,
664   ProcessorUpgradeAM2           = 0x17,
665   ProcessorUpgradeF1207         = 0x18,
666   ProcessorSocketLGA1366        = 0x19,
667   ProcessorUpgradeSocketG34     = 0x1A,
668   ProcessorUpgradeSocketAM3     = 0x1B,
669   ProcessorUpgradeSocketC32     = 0x1C,
670   ProcessorUpgradeSocketLGA1156 = 0x1D,
671   ProcessorUpgradeSocketLGA1567 = 0x1E,
672   ProcessorUpgradeSocketPGA988A = 0x1F,
673   ProcessorUpgradeSocketBGA1288 = 0x20,
674   ProcessorUpgradeSocketrPGA988B = 0x21,
675   ProcessorUpgradeSocketBGA1023 = 0x22,
676   ProcessorUpgradeSocketBGA1224 = 0x23,
677   ProcessorUpgradeSocketLGA1155 = 0x24,  ///< SMBIOS spec 2.8.0 updated the name
678   ProcessorUpgradeSocketLGA1356 = 0x25,
679   ProcessorUpgradeSocketLGA2011 = 0x26,
680   ProcessorUpgradeSocketFS1     = 0x27,
681   ProcessorUpgradeSocketFS2     = 0x28,
682   ProcessorUpgradeSocketFM1     = 0x29,
683   ProcessorUpgradeSocketFM2     = 0x2A,
684   ProcessorUpgradeSocketLGA2011_3 = 0x2B,
685   ProcessorUpgradeSocketLGA1356_3 = 0x2C,
686   ProcessorUpgradeSocketLGA1150   = 0x2D,
687   ProcessorUpgradeSocketBGA1168   = 0x2E,
688   ProcessorUpgradeSocketBGA1234   = 0x2F,
689   ProcessorUpgradeSocketBGA1364   = 0x30
690 } PROCESSOR_UPGRADE;
691 
692 ///
693 /// Processor ID Field Description
694 ///
695 typedef struct {
696   UINT32  ProcessorSteppingId:4;
697   UINT32  ProcessorModel:     4;
698   UINT32  ProcessorFamily:    4;
699   UINT32  ProcessorType:      2;
700   UINT32  ProcessorReserved1: 2;
701   UINT32  ProcessorXModel:    4;
702   UINT32  ProcessorXFamily:   8;
703   UINT32  ProcessorReserved2: 4;
704 } PROCESSOR_SIGNATURE;
705 
706 typedef struct {
707   UINT32  ProcessorFpu       :1;
708   UINT32  ProcessorVme       :1;
709   UINT32  ProcessorDe        :1;
710   UINT32  ProcessorPse       :1;
711   UINT32  ProcessorTsc       :1;
712   UINT32  ProcessorMsr       :1;
713   UINT32  ProcessorPae       :1;
714   UINT32  ProcessorMce       :1;
715   UINT32  ProcessorCx8       :1;
716   UINT32  ProcessorApic      :1;
717   UINT32  ProcessorReserved1 :1;
718   UINT32  ProcessorSep       :1;
719   UINT32  ProcessorMtrr      :1;
720   UINT32  ProcessorPge       :1;
721   UINT32  ProcessorMca       :1;
722   UINT32  ProcessorCmov      :1;
723   UINT32  ProcessorPat       :1;
724   UINT32  ProcessorPse36     :1;
725   UINT32  ProcessorPsn       :1;
726   UINT32  ProcessorClfsh     :1;
727   UINT32  ProcessorReserved2 :1;
728   UINT32  ProcessorDs        :1;
729   UINT32  ProcessorAcpi      :1;
730   UINT32  ProcessorMmx       :1;
731   UINT32  ProcessorFxsr      :1;
732   UINT32  ProcessorSse       :1;
733   UINT32  ProcessorSse2      :1;
734   UINT32  ProcessorSs        :1;
735   UINT32  ProcessorReserved3 :1;
736   UINT32  ProcessorTm        :1;
737   UINT32  ProcessorReserved4 :2;
738 } PROCESSOR_FEATURE_FLAGS;
739 
740 typedef struct {
741   PROCESSOR_SIGNATURE     Signature;
742   PROCESSOR_FEATURE_FLAGS FeatureFlags;
743 } PROCESSOR_ID_DATA;
744 
745 ///
746 /// Processor Information (Type 4).
747 ///
748 /// The information in this structure defines the attributes of a single processor;
749 /// a separate structure instance is provided for each system processor socket/slot.
750 /// For example, a system with an IntelDX2 processor would have a single
751 /// structure instance, while a system with an IntelSX2 processor would have a structure
752 /// to describe the main CPU, and a second structure to describe the 80487 co-processor.
753 ///
754 typedef struct {
755   SMBIOS_STRUCTURE      Hdr;
756   SMBIOS_TABLE_STRING   Socket;
757   UINT8                 ProcessorType;          ///< The enumeration value from PROCESSOR_TYPE_DATA.
758   UINT8                 ProcessorFamily;        ///< The enumeration value from PROCESSOR_FAMILY_DATA.
759   SMBIOS_TABLE_STRING   ProcessorManufacture;
760   PROCESSOR_ID_DATA     ProcessorId;
761   SMBIOS_TABLE_STRING   ProcessorVersion;
762   PROCESSOR_VOLTAGE     Voltage;
763   UINT16                ExternalClock;
764   UINT16                MaxSpeed;
765   UINT16                CurrentSpeed;
766   UINT8                 Status;
767   UINT8                 ProcessorUpgrade;      ///< The enumeration value from PROCESSOR_UPGRADE.
768   UINT16                L1CacheHandle;
769   UINT16                L2CacheHandle;
770   UINT16                L3CacheHandle;
771   SMBIOS_TABLE_STRING   SerialNumber;
772   SMBIOS_TABLE_STRING   AssetTag;
773   SMBIOS_TABLE_STRING   PartNumber;
774   //
775   // Add for smbios 2.5
776   //
777   UINT8                 CoreCount;
778   UINT8                 EnabledCoreCount;
779   UINT8                 ThreadCount;
780   UINT16                ProcessorCharacteristics;
781   //
782   // Add for smbios 2.6
783   //
784   UINT16                ProcessorFamily2;
785   //
786   // Add for smbios 3.0
787   //
788   UINT16                CoreCount2;
789   UINT16                EnabledCoreCount2;
790   UINT16                ThreadCount2;
791 } SMBIOS_TABLE_TYPE4;
792 
793 ///
794 /// Memory Controller Error Detecting Method.
795 ///
796 typedef enum {
797   ErrorDetectingMethodOther   = 0x01,
798   ErrorDetectingMethodUnknown = 0x02,
799   ErrorDetectingMethodNone    = 0x03,
800   ErrorDetectingMethodParity  = 0x04,
801   ErrorDetectingMethod32Ecc   = 0x05,
802   ErrorDetectingMethod64Ecc   = 0x06,
803   ErrorDetectingMethod128Ecc  = 0x07,
804   ErrorDetectingMethodCrc     = 0x08
805 } MEMORY_ERROR_DETECT_METHOD;
806 
807 ///
808 /// Memory Controller Error Correcting Capability.
809 ///
810 typedef struct {
811   UINT8  Other                 :1;
812   UINT8  Unknown               :1;
813   UINT8  None                  :1;
814   UINT8  SingleBitErrorCorrect :1;
815   UINT8  DoubleBitErrorCorrect :1;
816   UINT8  ErrorScrubbing        :1;
817   UINT8  Reserved              :2;
818 } MEMORY_ERROR_CORRECT_CAPABILITY;
819 
820 ///
821 /// Memory Controller Information - Interleave Support.
822 ///
823 typedef enum {
824   MemoryInterleaveOther      = 0x01,
825   MemoryInterleaveUnknown    = 0x02,
826   MemoryInterleaveOneWay     = 0x03,
827   MemoryInterleaveTwoWay     = 0x04,
828   MemoryInterleaveFourWay    = 0x05,
829   MemoryInterleaveEightWay   = 0x06,
830   MemoryInterleaveSixteenWay = 0x07
831 } MEMORY_SUPPORT_INTERLEAVE_TYPE;
832 
833 ///
834 /// Memory Controller Information - Memory Speeds.
835 ///
836 typedef struct {
837   UINT16     Other    :1;
838   UINT16     Unknown  :1;
839   UINT16     SeventyNs:1;
840   UINT16     SixtyNs  :1;
841   UINT16     FiftyNs  :1;
842   UINT16     Reserved :11;
843 } MEMORY_SPEED_TYPE;
844 
845 ///
846 /// Memory Controller Information (Type 5, Obsolete).
847 ///
848 /// The information in this structure defines the attributes of the system's memory controller(s)
849 /// and the supported attributes of any memory-modules present in the sockets controlled by
850 /// this controller.
851 /// Note: This structure, and its companion Memory Module Information (Type 6, Obsolete),
852 /// are obsolete starting with version 2.1 of this specification. The Physical Memory Array (Type 16)
853 /// and Memory Device (Type 17) structures should be used instead.  BIOS providers might
854 /// choose to implement both memory description types to allow existing DMI browsers
855 /// to properly display the system's memory attributes.
856 ///
857 typedef struct {
858   SMBIOS_STRUCTURE                Hdr;
859   UINT8                           ErrDetectMethod;            ///< The enumeration value from MEMORY_ERROR_DETECT_METHOD.
860   MEMORY_ERROR_CORRECT_CAPABILITY ErrCorrectCapability;
861   UINT8                           SupportInterleave;          ///< The enumeration value from MEMORY_SUPPORT_INTERLEAVE_TYPE.
862   UINT8                           CurrentInterleave;          ///< The enumeration value from MEMORY_SUPPORT_INTERLEAVE_TYPE .
863   UINT8                           MaxMemoryModuleSize;
864   MEMORY_SPEED_TYPE               SupportSpeed;
865   UINT16                          SupportMemoryType;
866   UINT8                           MemoryModuleVoltage;
867   UINT8                           AssociatedMemorySlotNum;
868   UINT16                          MemoryModuleConfigHandles[1];
869 } SMBIOS_TABLE_TYPE5;
870 
871 ///
872 /// Memory Module Information - Memory Types
873 ///
874 typedef struct {
875   UINT16  Other       :1;
876   UINT16  Unknown     :1;
877   UINT16  Standard    :1;
878   UINT16  FastPageMode:1;
879   UINT16  Edo         :1;
880   UINT16  Parity      :1;
881   UINT16  Ecc         :1;
882   UINT16  Simm        :1;
883   UINT16  Dimm        :1;
884   UINT16  BurstEdo    :1;
885   UINT16  Sdram       :1;
886   UINT16  Reserved    :5;
887 } MEMORY_CURRENT_TYPE;
888 
889 ///
890 /// Memory Module Information - Memory Size.
891 ///
892 typedef struct {
893   UINT8   InstalledOrEnabledSize  :7; ///< Size (n), where 2**n is the size in MB.
894   UINT8   SingleOrDoubleBank      :1;
895 } MEMORY_INSTALLED_ENABLED_SIZE;
896 
897 ///
898 /// Memory Module Information (Type 6, Obsolete)
899 ///
900 /// One Memory Module Information structure is included for each memory-module socket
901 /// in the system.  The structure describes the speed, type, size, and error status
902 /// of each system memory module.  The supported attributes of each module are described
903 /// by the "owning" Memory Controller Information structure.
904 /// Note:  This structure, and its companion Memory Controller Information (Type 5, Obsolete),
905 /// are obsolete starting with version 2.1 of this specification. The Physical Memory Array (Type 16)
906 /// and Memory Device (Type 17) structures should be used instead.
907 ///
908 typedef struct {
909   SMBIOS_STRUCTURE              Hdr;
910   SMBIOS_TABLE_STRING           SocketDesignation;
911   UINT8                         BankConnections;
912   UINT8                         CurrentSpeed;
913   MEMORY_CURRENT_TYPE           CurrentMemoryType;
914   MEMORY_INSTALLED_ENABLED_SIZE InstalledSize;
915   MEMORY_INSTALLED_ENABLED_SIZE EnabledSize;
916   UINT8                         ErrorStatus;
917 } SMBIOS_TABLE_TYPE6;
918 
919 ///
920 /// Cache Information - SRAM Type.
921 ///
922 typedef struct {
923   UINT16  Other         :1;
924   UINT16  Unknown       :1;
925   UINT16  NonBurst      :1;
926   UINT16  Burst         :1;
927   UINT16  PipelineBurst :1;
928   UINT16  Synchronous   :1;
929   UINT16  Asynchronous  :1;
930   UINT16  Reserved      :9;
931 } CACHE_SRAM_TYPE_DATA;
932 
933 ///
934 /// Cache Information - Error Correction Type.
935 ///
936 typedef enum {
937   CacheErrorOther     = 0x01,
938   CacheErrorUnknown   = 0x02,
939   CacheErrorNone      = 0x03,
940   CacheErrorParity    = 0x04,
941   CacheErrorSingleBit = 0x05, ///< ECC
942   CacheErrorMultiBit  = 0x06  ///< ECC
943 } CACHE_ERROR_TYPE_DATA;
944 
945 ///
946 /// Cache Information - System Cache Type.
947 ///
948 typedef enum {
949   CacheTypeOther       = 0x01,
950   CacheTypeUnknown     = 0x02,
951   CacheTypeInstruction = 0x03,
952   CacheTypeData        = 0x04,
953   CacheTypeUnified     = 0x05
954 } CACHE_TYPE_DATA;
955 
956 ///
957 /// Cache Information - Associativity.
958 ///
959 typedef enum {
960   CacheAssociativityOther        = 0x01,
961   CacheAssociativityUnknown      = 0x02,
962   CacheAssociativityDirectMapped = 0x03,
963   CacheAssociativity2Way         = 0x04,
964   CacheAssociativity4Way         = 0x05,
965   CacheAssociativityFully        = 0x06,
966   CacheAssociativity8Way         = 0x07,
967   CacheAssociativity16Way        = 0x08,
968   CacheAssociativity12Way        = 0x09,
969   CacheAssociativity24Way        = 0x0A,
970   CacheAssociativity32Way        = 0x0B,
971   CacheAssociativity48Way        = 0x0C,
972   CacheAssociativity64Way        = 0x0D,
973   CacheAssociativity20Way        = 0x0E
974 } CACHE_ASSOCIATIVITY_DATA;
975 
976 ///
977 /// Cache Information (Type 7).
978 ///
979 /// The information in this structure defines the attributes of CPU cache device in the system.
980 /// One structure is specified for each such device, whether the device is internal to
981 /// or external to the CPU module.  Cache modules can be associated with a processor structure
982 /// in one or two ways, depending on the SMBIOS version.
983 ///
984 typedef struct {
985   SMBIOS_STRUCTURE          Hdr;
986   SMBIOS_TABLE_STRING       SocketDesignation;
987   UINT16                    CacheConfiguration;
988   UINT16                    MaximumCacheSize;
989   UINT16                    InstalledSize;
990   CACHE_SRAM_TYPE_DATA      SupportedSRAMType;
991   CACHE_SRAM_TYPE_DATA      CurrentSRAMType;
992   UINT8                     CacheSpeed;
993   UINT8                     ErrorCorrectionType;            ///< The enumeration value from CACHE_ERROR_TYPE_DATA.
994   UINT8                     SystemCacheType;                ///< The enumeration value from CACHE_TYPE_DATA.
995   UINT8                     Associativity;                  ///< The enumeration value from CACHE_ASSOCIATIVITY_DATA.
996 } SMBIOS_TABLE_TYPE7;
997 
998 ///
999 /// Port Connector Information - Connector Types.
1000 ///
1001 typedef enum {
1002   PortConnectorTypeNone                   = 0x00,
1003   PortConnectorTypeCentronics             = 0x01,
1004   PortConnectorTypeMiniCentronics         = 0x02,
1005   PortConnectorTypeProprietary            = 0x03,
1006   PortConnectorTypeDB25Male               = 0x04,
1007   PortConnectorTypeDB25Female             = 0x05,
1008   PortConnectorTypeDB15Male               = 0x06,
1009   PortConnectorTypeDB15Female             = 0x07,
1010   PortConnectorTypeDB9Male                = 0x08,
1011   PortConnectorTypeDB9Female              = 0x09,
1012   PortConnectorTypeRJ11                   = 0x0A,
1013   PortConnectorTypeRJ45                   = 0x0B,
1014   PortConnectorType50PinMiniScsi          = 0x0C,
1015   PortConnectorTypeMiniDin                = 0x0D,
1016   PortConnectorTypeMicroDin               = 0x0E,
1017   PortConnectorTypePS2                    = 0x0F,
1018   PortConnectorTypeInfrared               = 0x10,
1019   PortConnectorTypeHpHil                  = 0x11,
1020   PortConnectorTypeUsb                    = 0x12,
1021   PortConnectorTypeSsaScsi                = 0x13,
1022   PortConnectorTypeCircularDin8Male       = 0x14,
1023   PortConnectorTypeCircularDin8Female     = 0x15,
1024   PortConnectorTypeOnboardIde             = 0x16,
1025   PortConnectorTypeOnboardFloppy          = 0x17,
1026   PortConnectorType9PinDualInline         = 0x18,
1027   PortConnectorType25PinDualInline        = 0x19,
1028   PortConnectorType50PinDualInline        = 0x1A,
1029   PortConnectorType68PinDualInline        = 0x1B,
1030   PortConnectorTypeOnboardSoundInput      = 0x1C,
1031   PortConnectorTypeMiniCentronicsType14   = 0x1D,
1032   PortConnectorTypeMiniCentronicsType26   = 0x1E,
1033   PortConnectorTypeHeadPhoneMiniJack      = 0x1F,
1034   PortConnectorTypeBNC                    = 0x20,
1035   PortConnectorType1394                   = 0x21,
1036   PortConnectorTypeSasSata                = 0x22,
1037   PortConnectorTypePC98                   = 0xA0,
1038   PortConnectorTypePC98Hireso             = 0xA1,
1039   PortConnectorTypePCH98                  = 0xA2,
1040   PortConnectorTypePC98Note               = 0xA3,
1041   PortConnectorTypePC98Full               = 0xA4,
1042   PortConnectorTypeOther                  = 0xFF
1043 } MISC_PORT_CONNECTOR_TYPE;
1044 
1045 ///
1046 /// Port Connector Information - Port Types
1047 ///
1048 typedef enum {
1049   PortTypeNone                      = 0x00,
1050   PortTypeParallelXtAtCompatible    = 0x01,
1051   PortTypeParallelPortPs2           = 0x02,
1052   PortTypeParallelPortEcp           = 0x03,
1053   PortTypeParallelPortEpp           = 0x04,
1054   PortTypeParallelPortEcpEpp        = 0x05,
1055   PortTypeSerialXtAtCompatible      = 0x06,
1056   PortTypeSerial16450Compatible     = 0x07,
1057   PortTypeSerial16550Compatible     = 0x08,
1058   PortTypeSerial16550ACompatible    = 0x09,
1059   PortTypeScsi                      = 0x0A,
1060   PortTypeMidi                      = 0x0B,
1061   PortTypeJoyStick                  = 0x0C,
1062   PortTypeKeyboard                  = 0x0D,
1063   PortTypeMouse                     = 0x0E,
1064   PortTypeSsaScsi                   = 0x0F,
1065   PortTypeUsb                       = 0x10,
1066   PortTypeFireWire                  = 0x11,
1067   PortTypePcmciaTypeI               = 0x12,
1068   PortTypePcmciaTypeII              = 0x13,
1069   PortTypePcmciaTypeIII             = 0x14,
1070   PortTypeCardBus                   = 0x15,
1071   PortTypeAccessBusPort             = 0x16,
1072   PortTypeScsiII                    = 0x17,
1073   PortTypeScsiWide                  = 0x18,
1074   PortTypePC98                      = 0x19,
1075   PortTypePC98Hireso                = 0x1A,
1076   PortTypePCH98                     = 0x1B,
1077   PortTypeVideoPort                 = 0x1C,
1078   PortTypeAudioPort                 = 0x1D,
1079   PortTypeModemPort                 = 0x1E,
1080   PortTypeNetworkPort               = 0x1F,
1081   PortTypeSata                      = 0x20,
1082   PortTypeSas                       = 0x21,
1083   PortType8251Compatible            = 0xA0,
1084   PortType8251FifoCompatible        = 0xA1,
1085   PortTypeOther                     = 0xFF
1086 } MISC_PORT_TYPE;
1087 
1088 ///
1089 /// Port Connector Information (Type 8).
1090 ///
1091 /// The information in this structure defines the attributes of a system port connector,
1092 /// e.g. parallel, serial, keyboard, or mouse ports.  The port's type and connector information
1093 /// are provided. One structure is present for each port provided by the system.
1094 ///
1095 typedef struct {
1096   SMBIOS_STRUCTURE          Hdr;
1097   SMBIOS_TABLE_STRING       InternalReferenceDesignator;
1098   UINT8                     InternalConnectorType;          ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
1099   SMBIOS_TABLE_STRING       ExternalReferenceDesignator;
1100   UINT8                     ExternalConnectorType;          ///< The enumeration value from MISC_PORT_CONNECTOR_TYPE.
1101   UINT8                     PortType;                       ///< The enumeration value from MISC_PORT_TYPE.
1102 } SMBIOS_TABLE_TYPE8;
1103 
1104 ///
1105 /// System Slots - Slot Type
1106 ///
1107 typedef enum {
1108   SlotTypeOther                        = 0x01,
1109   SlotTypeUnknown                      = 0x02,
1110   SlotTypeIsa                          = 0x03,
1111   SlotTypeMca                          = 0x04,
1112   SlotTypeEisa                         = 0x05,
1113   SlotTypePci                          = 0x06,
1114   SlotTypePcmcia                       = 0x07,
1115   SlotTypeVlVesa                       = 0x08,
1116   SlotTypeProprietary                  = 0x09,
1117   SlotTypeProcessorCardSlot            = 0x0A,
1118   SlotTypeProprietaryMemoryCardSlot    = 0x0B,
1119   SlotTypeIORiserCardSlot              = 0x0C,
1120   SlotTypeNuBus                        = 0x0D,
1121   SlotTypePci66MhzCapable              = 0x0E,
1122   SlotTypeAgp                          = 0x0F,
1123   SlotTypeApg2X                        = 0x10,
1124   SlotTypeAgp4X                        = 0x11,
1125   SlotTypePciX                         = 0x12,
1126   SlotTypeAgp8X                        = 0x13,
1127   SlotTypeM2Socket1_DP                 = 0x14,
1128   SlotTypeM2Socket1_SD                 = 0x15,
1129   SlotTypeM2Socket2                    = 0x16,
1130   SlotTypeM2Socket3                    = 0x17,
1131   SlotTypeMxmTypeI                     = 0x18,
1132   SlotTypeMxmTypeII                    = 0x19,
1133   SlotTypeMxmTypeIIIStandard           = 0x1A,
1134   SlotTypeMxmTypeIIIHe                 = 0x1B,
1135   SlotTypeMxmTypeIV                    = 0x1C,
1136   SlotTypeMxm30TypeA                   = 0x1D,
1137   SlotTypeMxm30TypeB                   = 0x1E,
1138   SlotTypePciExpressGen2Sff_8639       = 0x1F,
1139   SlotTypePciExpressGen3Sff_8639       = 0x20,
1140   SlotTypePC98C20                      = 0xA0,
1141   SlotTypePC98C24                      = 0xA1,
1142   SlotTypePC98E                        = 0xA2,
1143   SlotTypePC98LocalBus                 = 0xA3,
1144   SlotTypePC98Card                     = 0xA4,
1145   SlotTypePciExpress                   = 0xA5,
1146   SlotTypePciExpressX1                 = 0xA6,
1147   SlotTypePciExpressX2                 = 0xA7,
1148   SlotTypePciExpressX4                 = 0xA8,
1149   SlotTypePciExpressX8                 = 0xA9,
1150   SlotTypePciExpressX16                = 0xAA,
1151   SlotTypePciExpressGen2               = 0xAB,
1152   SlotTypePciExpressGen2X1             = 0xAC,
1153   SlotTypePciExpressGen2X2             = 0xAD,
1154   SlotTypePciExpressGen2X4             = 0xAE,
1155   SlotTypePciExpressGen2X8             = 0xAF,
1156   SlotTypePciExpressGen2X16            = 0xB0,
1157   SlotTypePciExpressGen3               = 0xB1,
1158   SlotTypePciExpressGen3X1             = 0xB2,
1159   SlotTypePciExpressGen3X2             = 0xB3,
1160   SlotTypePciExpressGen3X4             = 0xB4,
1161   SlotTypePciExpressGen3X8             = 0xB5,
1162   SlotTypePciExpressGen3X16            = 0xB6
1163 } MISC_SLOT_TYPE;
1164 
1165 ///
1166 /// System Slots - Slot Data Bus Width.
1167 ///
1168 typedef enum {
1169   SlotDataBusWidthOther      = 0x01,
1170   SlotDataBusWidthUnknown    = 0x02,
1171   SlotDataBusWidth8Bit       = 0x03,
1172   SlotDataBusWidth16Bit      = 0x04,
1173   SlotDataBusWidth32Bit      = 0x05,
1174   SlotDataBusWidth64Bit      = 0x06,
1175   SlotDataBusWidth128Bit     = 0x07,
1176   SlotDataBusWidth1X         = 0x08, ///< Or X1
1177   SlotDataBusWidth2X         = 0x09, ///< Or X2
1178   SlotDataBusWidth4X         = 0x0A, ///< Or X4
1179   SlotDataBusWidth8X         = 0x0B, ///< Or X8
1180   SlotDataBusWidth12X        = 0x0C, ///< Or X12
1181   SlotDataBusWidth16X        = 0x0D, ///< Or X16
1182   SlotDataBusWidth32X        = 0x0E  ///< Or X32
1183 } MISC_SLOT_DATA_BUS_WIDTH;
1184 
1185 ///
1186 /// System Slots - Current Usage.
1187 ///
1188 typedef enum {
1189   SlotUsageOther     = 0x01,
1190   SlotUsageUnknown   = 0x02,
1191   SlotUsageAvailable = 0x03,
1192   SlotUsageInUse     = 0x04
1193 } MISC_SLOT_USAGE;
1194 
1195 ///
1196 /// System Slots - Slot Length.
1197 ///
1198 typedef enum {
1199   SlotLengthOther   = 0x01,
1200   SlotLengthUnknown = 0x02,
1201   SlotLengthShort   = 0x03,
1202   SlotLengthLong    = 0x04
1203 } MISC_SLOT_LENGTH;
1204 
1205 ///
1206 /// System Slots - Slot Characteristics 1.
1207 ///
1208 typedef struct {
1209   UINT8  CharacteristicsUnknown  :1;
1210   UINT8  Provides50Volts         :1;
1211   UINT8  Provides33Volts         :1;
1212   UINT8  SharedSlot              :1;
1213   UINT8  PcCard16Supported       :1;
1214   UINT8  CardBusSupported        :1;
1215   UINT8  ZoomVideoSupported      :1;
1216   UINT8  ModemRingResumeSupported:1;
1217 } MISC_SLOT_CHARACTERISTICS1;
1218 ///
1219 /// System Slots - Slot Characteristics 2.
1220 ///
1221 typedef struct {
1222   UINT8  PmeSignalSupported      :1;
1223   UINT8  HotPlugDevicesSupported :1;
1224   UINT8  SmbusSignalSupported    :1;
1225   UINT8  Reserved                :5;  ///< Set to 0.
1226 } MISC_SLOT_CHARACTERISTICS2;
1227 
1228 ///
1229 /// System Slots (Type 9)
1230 ///
1231 /// The information in this structure defines the attributes of a system slot.
1232 /// One structure is provided for each slot in the system.
1233 ///
1234 ///
1235 typedef struct {
1236   SMBIOS_STRUCTURE            Hdr;
1237   SMBIOS_TABLE_STRING         SlotDesignation;
1238   UINT8                       SlotType;                 ///< The enumeration value from MISC_SLOT_TYPE.
1239   UINT8                       SlotDataBusWidth;         ///< The enumeration value from MISC_SLOT_DATA_BUS_WIDTH.
1240   UINT8                       CurrentUsage;             ///< The enumeration value from MISC_SLOT_USAGE.
1241   UINT8                       SlotLength;               ///< The enumeration value from MISC_SLOT_LENGTH.
1242   UINT16                      SlotID;
1243   MISC_SLOT_CHARACTERISTICS1  SlotCharacteristics1;
1244   MISC_SLOT_CHARACTERISTICS2  SlotCharacteristics2;
1245   //
1246   // Add for smbios 2.6
1247   //
1248   UINT16                      SegmentGroupNum;
1249   UINT8                       BusNum;
1250   UINT8                       DevFuncNum;
1251 } SMBIOS_TABLE_TYPE9;
1252 
1253 ///
1254 /// On Board Devices Information - Device Types.
1255 ///
1256 typedef enum {
1257   OnBoardDeviceTypeOther          = 0x01,
1258   OnBoardDeviceTypeUnknown        = 0x02,
1259   OnBoardDeviceTypeVideo          = 0x03,
1260   OnBoardDeviceTypeScsiController = 0x04,
1261   OnBoardDeviceTypeEthernet       = 0x05,
1262   OnBoardDeviceTypeTokenRing      = 0x06,
1263   OnBoardDeviceTypeSound          = 0x07,
1264   OnBoardDeviceTypePATAController = 0x08,
1265   OnBoardDeviceTypeSATAController = 0x09,
1266   OnBoardDeviceTypeSASController  = 0x0A
1267 } MISC_ONBOARD_DEVICE_TYPE;
1268 
1269 ///
1270 /// Device Item Entry
1271 ///
1272 typedef struct {
1273   UINT8                     DeviceType;             ///< Bit [6:0] - enumeration type of device from MISC_ONBOARD_DEVICE_TYPE.
1274                                                     ///< Bit 7     - 1 : device enabled, 0 : device disabled.
1275   SMBIOS_TABLE_STRING       DescriptionString;
1276 } DEVICE_STRUCT;
1277 
1278 ///
1279 /// On Board Devices Information (Type 10, obsolete).
1280 ///
1281 /// Note: This structure is obsolete starting with version 2.6 specification; the Onboard Devices Extended
1282 /// Information (Type 41) structure should be used instead . BIOS providers can choose to implement both
1283 /// types to allow existing SMBIOS browsers to properly display the system's onboard devices information.
1284 /// The information in this structure defines the attributes of devices that are onboard (soldered onto)
1285 /// a system element, usually the baseboard.  In general, an entry in this table implies that the BIOS
1286 /// has some level of control over the enabling of the associated device for use by the system.
1287 ///
1288 typedef struct {
1289   SMBIOS_STRUCTURE      Hdr;
1290   DEVICE_STRUCT         Device[1];
1291 } SMBIOS_TABLE_TYPE10;
1292 
1293 ///
1294 /// OEM Strings (Type 11).
1295 /// This structure contains free form strings defined by the OEM. Examples of this are:
1296 /// Part Numbers for Reference Documents for the system, contact information for the manufacturer, etc.
1297 ///
1298 typedef struct {
1299   SMBIOS_STRUCTURE      Hdr;
1300   UINT8                 StringCount;
1301 } SMBIOS_TABLE_TYPE11;
1302 
1303 ///
1304 /// System Configuration Options (Type 12).
1305 ///
1306 /// This structure contains information required to configure the base board's Jumpers and Switches.
1307 ///
1308 typedef struct {
1309   SMBIOS_STRUCTURE      Hdr;
1310   UINT8                 StringCount;
1311 } SMBIOS_TABLE_TYPE12;
1312 
1313 
1314 ///
1315 /// BIOS Language Information (Type 13).
1316 ///
1317 /// The information in this structure defines the installable language attributes of the BIOS.
1318 ///
1319 typedef struct {
1320   SMBIOS_STRUCTURE      Hdr;
1321   UINT8                 InstallableLanguages;
1322   UINT8                 Flags;
1323   UINT8                 Reserved[15];
1324   SMBIOS_TABLE_STRING   CurrentLanguages;
1325 } SMBIOS_TABLE_TYPE13;
1326 
1327 ///
1328 /// Group Item Entry
1329 ///
1330 typedef struct {
1331   UINT8                 ItemType;
1332   UINT16                ItemHandle;
1333 } GROUP_STRUCT;
1334 
1335 ///
1336 /// Group Associations (Type 14).
1337 ///
1338 /// The Group Associations structure is provided for OEMs who want to specify
1339 /// the arrangement or hierarchy of certain components (including other Group Associations)
1340 /// within the system.
1341 ///
1342 typedef struct {
1343   SMBIOS_STRUCTURE      Hdr;
1344   SMBIOS_TABLE_STRING   GroupName;
1345   GROUP_STRUCT          Group[1];
1346 } SMBIOS_TABLE_TYPE14;
1347 
1348 ///
1349 /// System Event Log - Event Log Types.
1350 ///
1351 typedef enum {
1352   EventLogTypeReserved         = 0x00,
1353   EventLogTypeSingleBitECC     = 0x01,
1354   EventLogTypeMultiBitECC      = 0x02,
1355   EventLogTypeParityMemErr     = 0x03,
1356   EventLogTypeBusTimeOut       = 0x04,
1357   EventLogTypeIOChannelCheck   = 0x05,
1358   EventLogTypeSoftwareNMI      = 0x06,
1359   EventLogTypePOSTMemResize    = 0x07,
1360   EventLogTypePOSTErr          = 0x08,
1361   EventLogTypePCIParityErr     = 0x09,
1362   EventLogTypePCISystemErr     = 0x0A,
1363   EventLogTypeCPUFailure       = 0x0B,
1364   EventLogTypeEISATimeOut      = 0x0C,
1365   EventLogTypeMemLogDisabled   = 0x0D,
1366   EventLogTypeLoggingDisabled  = 0x0E,
1367   EventLogTypeSysLimitExce     = 0x10,
1368   EventLogTypeAsyncHWTimer     = 0x11,
1369   EventLogTypeSysConfigInfo    = 0x12,
1370   EventLogTypeHDInfo           = 0x13,
1371   EventLogTypeSysReconfig      = 0x14,
1372   EventLogTypeUncorrectCPUErr  = 0x15,
1373   EventLogTypeAreaResetAndClr  = 0x16,
1374   EventLogTypeSystemBoot       = 0x17,
1375   EventLogTypeUnused           = 0x18, ///< 0x18 - 0x7F
1376   EventLogTypeAvailForSys      = 0x80, ///< 0x80 - 0xFE
1377   EventLogTypeEndOfLog         = 0xFF
1378 } EVENT_LOG_TYPE_DATA;
1379 
1380 ///
1381 /// System Event Log - Variable Data Format Types.
1382 ///
1383 typedef enum {
1384   EventLogVariableNone                        = 0x00,
1385   EventLogVariableHandle                      = 0x01,
1386   EventLogVariableMutilEvent                  = 0x02,
1387   EventLogVariableMutilEventHandle            = 0x03,
1388   EventLogVariablePOSTResultBitmap            = 0x04,
1389   EventLogVariableSysManagementType           = 0x05,
1390   EventLogVariableMutliEventSysManagmentType  = 0x06,
1391   EventLogVariableUnused                      = 0x07,
1392   EventLogVariableOEMAssigned                 = 0x80
1393 } EVENT_LOG_VARIABLE_DATA;
1394 
1395 ///
1396 /// Event Log Type Descriptors
1397 ///
1398 typedef struct {
1399   UINT8                 LogType;                    ///< The enumeration value from EVENT_LOG_TYPE_DATA.
1400   UINT8                 DataFormatType;
1401 } EVENT_LOG_TYPE;
1402 
1403 ///
1404 /// System Event Log (Type 15).
1405 ///
1406 /// The presence of this structure within the SMBIOS data returned for a system indicates
1407 /// that the system supports an event log.  An event log is a fixed-length area within a
1408 /// non-volatile storage element, starting with a fixed-length (and vendor-specific) header
1409 /// record, followed by one or more variable-length log records.
1410 ///
1411 typedef struct {
1412   SMBIOS_STRUCTURE      Hdr;
1413   UINT16                LogAreaLength;
1414   UINT16                LogHeaderStartOffset;
1415   UINT16                LogDataStartOffset;
1416   UINT8                 AccessMethod;
1417   UINT8                 LogStatus;
1418   UINT32                LogChangeToken;
1419   UINT32                AccessMethodAddress;
1420   UINT8                 LogHeaderFormat;
1421   UINT8                 NumberOfSupportedLogTypeDescriptors;
1422   UINT8                 LengthOfLogTypeDescriptor;
1423   EVENT_LOG_TYPE        EventLogTypeDescriptors[1];
1424 } SMBIOS_TABLE_TYPE15;
1425 
1426 ///
1427 /// Physical Memory Array - Location.
1428 ///
1429 typedef enum {
1430   MemoryArrayLocationOther                 = 0x01,
1431   MemoryArrayLocationUnknown               = 0x02,
1432   MemoryArrayLocationSystemBoard           = 0x03,
1433   MemoryArrayLocationIsaAddonCard          = 0x04,
1434   MemoryArrayLocationEisaAddonCard         = 0x05,
1435   MemoryArrayLocationPciAddonCard          = 0x06,
1436   MemoryArrayLocationMcaAddonCard          = 0x07,
1437   MemoryArrayLocationPcmciaAddonCard       = 0x08,
1438   MemoryArrayLocationProprietaryAddonCard  = 0x09,
1439   MemoryArrayLocationNuBus                 = 0x0A,
1440   MemoryArrayLocationPc98C20AddonCard      = 0xA0,
1441   MemoryArrayLocationPc98C24AddonCard      = 0xA1,
1442   MemoryArrayLocationPc98EAddonCard        = 0xA2,
1443   MemoryArrayLocationPc98LocalBusAddonCard = 0xA3
1444 } MEMORY_ARRAY_LOCATION;
1445 
1446 ///
1447 /// Physical Memory Array - Use.
1448 ///
1449 typedef enum {
1450   MemoryArrayUseOther                      = 0x01,
1451   MemoryArrayUseUnknown                    = 0x02,
1452   MemoryArrayUseSystemMemory               = 0x03,
1453   MemoryArrayUseVideoMemory                = 0x04,
1454   MemoryArrayUseFlashMemory                = 0x05,
1455   MemoryArrayUseNonVolatileRam             = 0x06,
1456   MemoryArrayUseCacheMemory                = 0x07
1457 } MEMORY_ARRAY_USE;
1458 
1459 ///
1460 /// Physical Memory Array - Error Correction Types.
1461 ///
1462 typedef enum {
1463   MemoryErrorCorrectionOther               = 0x01,
1464   MemoryErrorCorrectionUnknown             = 0x02,
1465   MemoryErrorCorrectionNone                = 0x03,
1466   MemoryErrorCorrectionParity              = 0x04,
1467   MemoryErrorCorrectionSingleBitEcc        = 0x05,
1468   MemoryErrorCorrectionMultiBitEcc         = 0x06,
1469   MemoryErrorCorrectionCrc                 = 0x07
1470 } MEMORY_ERROR_CORRECTION;
1471 
1472 ///
1473 /// Physical Memory Array (Type 16).
1474 ///
1475 /// This structure describes a collection of memory devices that operate
1476 /// together to form a memory address space.
1477 ///
1478 typedef struct {
1479   SMBIOS_STRUCTURE          Hdr;
1480   UINT8                     Location;                       ///< The enumeration value from MEMORY_ARRAY_LOCATION.
1481   UINT8                     Use;                            ///< The enumeration value from MEMORY_ARRAY_USE.
1482   UINT8                     MemoryErrorCorrection;          ///< The enumeration value from MEMORY_ERROR_CORRECTION.
1483   UINT32                    MaximumCapacity;
1484   UINT16                    MemoryErrorInformationHandle;
1485   UINT16                    NumberOfMemoryDevices;
1486   //
1487   // Add for smbios 2.7
1488   //
1489   UINT64                    ExtendedMaximumCapacity;
1490 } SMBIOS_TABLE_TYPE16;
1491 
1492 ///
1493 /// Memory Device - Form Factor.
1494 ///
1495 typedef enum {
1496   MemoryFormFactorOther                    = 0x01,
1497   MemoryFormFactorUnknown                  = 0x02,
1498   MemoryFormFactorSimm                     = 0x03,
1499   MemoryFormFactorSip                      = 0x04,
1500   MemoryFormFactorChip                     = 0x05,
1501   MemoryFormFactorDip                      = 0x06,
1502   MemoryFormFactorZip                      = 0x07,
1503   MemoryFormFactorProprietaryCard          = 0x08,
1504   MemoryFormFactorDimm                     = 0x09,
1505   MemoryFormFactorTsop                     = 0x0A,
1506   MemoryFormFactorRowOfChips               = 0x0B,
1507   MemoryFormFactorRimm                     = 0x0C,
1508   MemoryFormFactorSodimm                   = 0x0D,
1509   MemoryFormFactorSrimm                    = 0x0E,
1510   MemoryFormFactorFbDimm                   = 0x0F
1511 } MEMORY_FORM_FACTOR;
1512 
1513 ///
1514 /// Memory Device - Type
1515 ///
1516 typedef enum {
1517   MemoryTypeOther                          = 0x01,
1518   MemoryTypeUnknown                        = 0x02,
1519   MemoryTypeDram                           = 0x03,
1520   MemoryTypeEdram                          = 0x04,
1521   MemoryTypeVram                           = 0x05,
1522   MemoryTypeSram                           = 0x06,
1523   MemoryTypeRam                            = 0x07,
1524   MemoryTypeRom                            = 0x08,
1525   MemoryTypeFlash                          = 0x09,
1526   MemoryTypeEeprom                         = 0x0A,
1527   MemoryTypeFeprom                         = 0x0B,
1528   MemoryTypeEprom                          = 0x0C,
1529   MemoryTypeCdram                          = 0x0D,
1530   MemoryType3Dram                          = 0x0E,
1531   MemoryTypeSdram                          = 0x0F,
1532   MemoryTypeSgram                          = 0x10,
1533   MemoryTypeRdram                          = 0x11,
1534   MemoryTypeDdr                            = 0x12,
1535   MemoryTypeDdr2                           = 0x13,
1536   MemoryTypeDdr2FbDimm                     = 0x14,
1537   MemoryTypeDdr3                           = 0x18,
1538   MemoryTypeFbd2                           = 0x19,
1539   MemoryTypeDdr4                           = 0x1A,
1540   MemoryTypeLpddr                          = 0x1B,
1541   MemoryTypeLpddr2                         = 0x1C,
1542   MemoryTypeLpddr3                         = 0x1D,
1543   MemoryTypeLpddr4                         = 0x1E
1544 } MEMORY_DEVICE_TYPE;
1545 
1546 typedef struct {
1547   UINT16    Reserved        :1;
1548   UINT16    Other           :1;
1549   UINT16    Unknown         :1;
1550   UINT16    FastPaged       :1;
1551   UINT16    StaticColumn    :1;
1552   UINT16    PseudoStatic    :1;
1553   UINT16    Rambus          :1;
1554   UINT16    Synchronous     :1;
1555   UINT16    Cmos            :1;
1556   UINT16    Edo             :1;
1557   UINT16    WindowDram      :1;
1558   UINT16    CacheDram       :1;
1559   UINT16    Nonvolatile     :1;
1560   UINT16    Registered      :1;
1561   UINT16    Unbuffered      :1;
1562   UINT16    LrDimm          :1;
1563 } MEMORY_DEVICE_TYPE_DETAIL;
1564 
1565 ///
1566 /// Memory Device (Type 17).
1567 ///
1568 /// This structure describes a single memory device that is part of
1569 /// a larger Physical Memory Array (Type 16).
1570 /// Note:  If a system includes memory-device sockets, the SMBIOS implementation
1571 /// includes a Memory Device structure instance for each slot, whether or not the
1572 /// socket is currently populated.
1573 ///
1574 typedef struct {
1575   SMBIOS_STRUCTURE          Hdr;
1576   UINT16                    MemoryArrayHandle;
1577   UINT16                    MemoryErrorInformationHandle;
1578   UINT16                    TotalWidth;
1579   UINT16                    DataWidth;
1580   UINT16                    Size;
1581   UINT8                     FormFactor;                     ///< The enumeration value from MEMORY_FORM_FACTOR.
1582   UINT8                     DeviceSet;
1583   SMBIOS_TABLE_STRING       DeviceLocator;
1584   SMBIOS_TABLE_STRING       BankLocator;
1585   UINT8                     MemoryType;                     ///< The enumeration value from MEMORY_DEVICE_TYPE.
1586   MEMORY_DEVICE_TYPE_DETAIL TypeDetail;
1587   UINT16                    Speed;
1588   SMBIOS_TABLE_STRING       Manufacturer;
1589   SMBIOS_TABLE_STRING       SerialNumber;
1590   SMBIOS_TABLE_STRING       AssetTag;
1591   SMBIOS_TABLE_STRING       PartNumber;
1592   //
1593   // Add for smbios 2.6
1594   //
1595   UINT8                     Attributes;
1596   //
1597   // Add for smbios 2.7
1598   //
1599   UINT32                    ExtendedSize;
1600   UINT16                    ConfiguredMemoryClockSpeed;
1601   //
1602   // Add for smbios 2.8.0
1603   //
1604   UINT16                    MinimumVoltage;
1605   UINT16                    MaximumVoltage;
1606   UINT16                    ConfiguredVoltage;
1607 } SMBIOS_TABLE_TYPE17;
1608 
1609 ///
1610 /// 32-bit Memory Error Information - Error Type.
1611 ///
1612 typedef enum {
1613   MemoryErrorOther             = 0x01,
1614   MemoryErrorUnknown           = 0x02,
1615   MemoryErrorOk                = 0x03,
1616   MemoryErrorBadRead           = 0x04,
1617   MemoryErrorParity            = 0x05,
1618   MemoryErrorSigleBit          = 0x06,
1619   MemoryErrorDoubleBit         = 0x07,
1620   MemoryErrorMultiBit          = 0x08,
1621   MemoryErrorNibble            = 0x09,
1622   MemoryErrorChecksum          = 0x0A,
1623   MemoryErrorCrc               = 0x0B,
1624   MemoryErrorCorrectSingleBit  = 0x0C,
1625   MemoryErrorCorrected         = 0x0D,
1626   MemoryErrorUnCorrectable     = 0x0E
1627 } MEMORY_ERROR_TYPE;
1628 
1629 ///
1630 /// 32-bit Memory Error Information - Error Granularity.
1631 ///
1632 typedef enum {
1633   MemoryGranularityOther               = 0x01,
1634   MemoryGranularityOtherUnknown        = 0x02,
1635   MemoryGranularityDeviceLevel         = 0x03,
1636   MemoryGranularityMemPartitionLevel   = 0x04
1637 } MEMORY_ERROR_GRANULARITY;
1638 
1639 ///
1640 /// 32-bit Memory Error Information - Error Operation.
1641 ///
1642 typedef enum {
1643   MemoryErrorOperationOther            = 0x01,
1644   MemoryErrorOperationUnknown          = 0x02,
1645   MemoryErrorOperationRead             = 0x03,
1646   MemoryErrorOperationWrite            = 0x04,
1647   MemoryErrorOperationPartialWrite     = 0x05
1648 } MEMORY_ERROR_OPERATION;
1649 
1650 ///
1651 /// 32-bit Memory Error Information (Type 18).
1652 ///
1653 /// This structure identifies the specifics of an error that might be detected
1654 /// within a Physical Memory Array.
1655 ///
1656 typedef struct {
1657   SMBIOS_STRUCTURE          Hdr;
1658   UINT8                     ErrorType;                  ///< The enumeration value from MEMORY_ERROR_TYPE.
1659   UINT8                     ErrorGranularity;           ///< The enumeration value from MEMORY_ERROR_GRANULARITY.
1660   UINT8                     ErrorOperation;             ///< The enumeration value from MEMORY_ERROR_OPERATION.
1661   UINT32                    VendorSyndrome;
1662   UINT32                    MemoryArrayErrorAddress;
1663   UINT32                    DeviceErrorAddress;
1664   UINT32                    ErrorResolution;
1665 } SMBIOS_TABLE_TYPE18;
1666 
1667 ///
1668 /// Memory Array Mapped Address (Type 19).
1669 ///
1670 /// This structure provides the address mapping for a Physical Memory Array.
1671 /// One structure is present for each contiguous address range described.
1672 ///
1673 typedef struct {
1674   SMBIOS_STRUCTURE      Hdr;
1675   UINT32                StartingAddress;
1676   UINT32                EndingAddress;
1677   UINT16                MemoryArrayHandle;
1678   UINT8                 PartitionWidth;
1679   //
1680   // Add for smbios 2.7
1681   //
1682   UINT64                ExtendedStartingAddress;
1683   UINT64                ExtendedEndingAddress;
1684 } SMBIOS_TABLE_TYPE19;
1685 
1686 ///
1687 /// Memory Device Mapped Address (Type 20).
1688 ///
1689 /// This structure maps memory address space usually to a device-level granularity.
1690 /// One structure is present for each contiguous address range described.
1691 ///
1692 typedef struct {
1693   SMBIOS_STRUCTURE      Hdr;
1694   UINT32                StartingAddress;
1695   UINT32                EndingAddress;
1696   UINT16                MemoryDeviceHandle;
1697   UINT16                MemoryArrayMappedAddressHandle;
1698   UINT8                 PartitionRowPosition;
1699   UINT8                 InterleavePosition;
1700   UINT8                 InterleavedDataDepth;
1701   //
1702   // Add for smbios 2.7
1703   //
1704   UINT64                ExtendedStartingAddress;
1705   UINT64                ExtendedEndingAddress;
1706 } SMBIOS_TABLE_TYPE20;
1707 
1708 ///
1709 /// Built-in Pointing Device - Type
1710 ///
1711 typedef enum {
1712   PointingDeviceTypeOther         = 0x01,
1713   PointingDeviceTypeUnknown       = 0x02,
1714   PointingDeviceTypeMouse         = 0x03,
1715   PointingDeviceTypeTrackBall     = 0x04,
1716   PointingDeviceTypeTrackPoint    = 0x05,
1717   PointingDeviceTypeGlidePoint    = 0x06,
1718   PointingDeviceTouchPad          = 0x07,
1719   PointingDeviceTouchScreen       = 0x08,
1720   PointingDeviceOpticalSensor     = 0x09
1721 } BUILTIN_POINTING_DEVICE_TYPE;
1722 
1723 ///
1724 /// Built-in Pointing Device - Interface.
1725 ///
1726 typedef enum {
1727   PointingDeviceInterfaceOther              = 0x01,
1728   PointingDeviceInterfaceUnknown            = 0x02,
1729   PointingDeviceInterfaceSerial             = 0x03,
1730   PointingDeviceInterfacePs2                = 0x04,
1731   PointingDeviceInterfaceInfrared           = 0x05,
1732   PointingDeviceInterfaceHpHil              = 0x06,
1733   PointingDeviceInterfaceBusMouse           = 0x07,
1734   PointingDeviceInterfaceADB                = 0x08,
1735   PointingDeviceInterfaceBusMouseDB9        = 0xA0,
1736   PointingDeviceInterfaceBusMouseMicroDin   = 0xA1,
1737   PointingDeviceInterfaceUsb                = 0xA2
1738 } BUILTIN_POINTING_DEVICE_INTERFACE;
1739 
1740 ///
1741 /// Built-in Pointing Device (Type 21).
1742 ///
1743 /// This structure describes the attributes of the built-in pointing device for the
1744 /// system. The presence of this structure does not imply that the built-in
1745 /// pointing device is active for the system's use!
1746 ///
1747 typedef struct {
1748   SMBIOS_STRUCTURE                  Hdr;
1749   UINT8                             Type;                   ///< The enumeration value from BUILTIN_POINTING_DEVICE_TYPE.
1750   UINT8                             Interface;              ///< The enumeration value from BUILTIN_POINTING_DEVICE_INTERFACE.
1751   UINT8                             NumberOfButtons;
1752 } SMBIOS_TABLE_TYPE21;
1753 
1754 ///
1755 /// Portable Battery - Device Chemistry
1756 ///
1757 typedef enum {
1758   PortableBatteryDeviceChemistryOther               = 0x01,
1759   PortableBatteryDeviceChemistryUnknown             = 0x02,
1760   PortableBatteryDeviceChemistryLeadAcid            = 0x03,
1761   PortableBatteryDeviceChemistryNickelCadmium       = 0x04,
1762   PortableBatteryDeviceChemistryNickelMetalHydride  = 0x05,
1763   PortableBatteryDeviceChemistryLithiumIon          = 0x06,
1764   PortableBatteryDeviceChemistryZincAir             = 0x07,
1765   PortableBatteryDeviceChemistryLithiumPolymer      = 0x08
1766 } PORTABLE_BATTERY_DEVICE_CHEMISTRY;
1767 
1768 ///
1769 /// Portable Battery (Type 22).
1770 ///
1771 /// This structure describes the attributes of the portable battery(s) for the system.
1772 /// The structure contains the static attributes for the group.  Each structure describes
1773 /// a single battery pack's attributes.
1774 ///
1775 typedef struct {
1776   SMBIOS_STRUCTURE                  Hdr;
1777   SMBIOS_TABLE_STRING               Location;
1778   SMBIOS_TABLE_STRING               Manufacturer;
1779   SMBIOS_TABLE_STRING               ManufactureDate;
1780   SMBIOS_TABLE_STRING               SerialNumber;
1781   SMBIOS_TABLE_STRING               DeviceName;
1782   UINT8                             DeviceChemistry;              ///< The enumeration value from PORTABLE_BATTERY_DEVICE_CHEMISTRY.
1783   UINT16                            DeviceCapacity;
1784   UINT16                            DesignVoltage;
1785   SMBIOS_TABLE_STRING               SBDSVersionNumber;
1786   UINT8                             MaximumErrorInBatteryData;
1787   UINT16                            SBDSSerialNumber;
1788   UINT16                            SBDSManufactureDate;
1789   SMBIOS_TABLE_STRING               SBDSDeviceChemistry;
1790   UINT8                             DesignCapacityMultiplier;
1791   UINT32                            OEMSpecific;
1792 } SMBIOS_TABLE_TYPE22;
1793 
1794 ///
1795 /// System Reset (Type 23)
1796 ///
1797 /// This structure describes whether Automatic System Reset functions enabled (Status).
1798 /// If the system has a watchdog Timer and the timer is not reset (Timer Reset)
1799 /// before the Interval elapses, an automatic system reset will occur. The system will re-boot
1800 /// according to the Boot Option. This function may repeat until the Limit is reached, at which time
1801 /// the system will re-boot according to the Boot Option at Limit.
1802 ///
1803 typedef struct {
1804   SMBIOS_STRUCTURE      Hdr;
1805   UINT8                 Capabilities;
1806   UINT16                ResetCount;
1807   UINT16                ResetLimit;
1808   UINT16                TimerInterval;
1809   UINT16                Timeout;
1810 } SMBIOS_TABLE_TYPE23;
1811 
1812 ///
1813 /// Hardware Security (Type 24).
1814 ///
1815 /// This structure describes the system-wide hardware security settings.
1816 ///
1817 typedef struct {
1818   SMBIOS_STRUCTURE      Hdr;
1819   UINT8                 HardwareSecuritySettings;
1820 } SMBIOS_TABLE_TYPE24;
1821 
1822 ///
1823 /// System Power Controls (Type 25).
1824 ///
1825 /// This structure describes the attributes for controlling the main power supply to the system.
1826 /// Software that interprets this structure uses the month, day, hour, minute, and second values
1827 /// to determine the number of seconds until the next power-on of the system.  The presence of
1828 /// this structure implies that a timed power-on facility is available for the system.
1829 ///
1830 typedef struct {
1831   SMBIOS_STRUCTURE      Hdr;
1832   UINT8                 NextScheduledPowerOnMonth;
1833   UINT8                 NextScheduledPowerOnDayOfMonth;
1834   UINT8                 NextScheduledPowerOnHour;
1835   UINT8                 NextScheduledPowerOnMinute;
1836   UINT8                 NextScheduledPowerOnSecond;
1837 } SMBIOS_TABLE_TYPE25;
1838 
1839 ///
1840 /// Voltage Probe - Location and Status.
1841 ///
1842 typedef struct {
1843   UINT8 VoltageProbeSite      :5;
1844   UINT8  VoltageProbeStatus   :3;
1845 } MISC_VOLTAGE_PROBE_LOCATION;
1846 
1847 ///
1848 /// Voltage Probe (Type 26)
1849 ///
1850 /// This describes the attributes for a voltage probe in the system.
1851 /// Each structure describes a single voltage probe.
1852 ///
1853 typedef struct {
1854   SMBIOS_STRUCTURE              Hdr;
1855   SMBIOS_TABLE_STRING           Description;
1856   MISC_VOLTAGE_PROBE_LOCATION   LocationAndStatus;
1857   UINT16                        MaximumValue;
1858   UINT16                        MinimumValue;
1859   UINT16                        Resolution;
1860   UINT16                        Tolerance;
1861   UINT16                        Accuracy;
1862   UINT32                        OEMDefined;
1863   UINT16                        NominalValue;
1864 } SMBIOS_TABLE_TYPE26;
1865 
1866 ///
1867 /// Cooling Device - Device Type and Status.
1868 ///
1869 typedef struct {
1870   UINT8 CoolingDevice       :5;
1871   UINT8 CoolingDeviceStatus :3;
1872 } MISC_COOLING_DEVICE_TYPE;
1873 
1874 ///
1875 /// Cooling Device (Type 27)
1876 ///
1877 /// This structure describes the attributes for a cooling device in the system.
1878 /// Each structure describes a single cooling device.
1879 ///
1880 typedef struct {
1881   SMBIOS_STRUCTURE                  Hdr;
1882   UINT16                            TemperatureProbeHandle;
1883   MISC_COOLING_DEVICE_TYPE          DeviceTypeAndStatus;
1884   UINT8                             CoolingUnitGroup;
1885   UINT32                            OEMDefined;
1886   UINT16                            NominalSpeed;
1887   //
1888   // Add for smbios 2.7
1889   //
1890   SMBIOS_TABLE_STRING               Description;
1891 } SMBIOS_TABLE_TYPE27;
1892 
1893 ///
1894 /// Temperature Probe - Location and Status.
1895 ///
1896 typedef struct {
1897   UINT8 TemperatureProbeSite   :5;
1898   UINT8 TemperatureProbeStatus :3;
1899 } MISC_TEMPERATURE_PROBE_LOCATION;
1900 
1901 ///
1902 /// Temperature Probe (Type 28).
1903 ///
1904 /// This structure describes the attributes for a temperature probe in the system.
1905 /// Each structure describes a single temperature probe.
1906 ///
1907 typedef struct {
1908   SMBIOS_STRUCTURE                  Hdr;
1909   SMBIOS_TABLE_STRING               Description;
1910   MISC_TEMPERATURE_PROBE_LOCATION   LocationAndStatus;
1911   UINT16                            MaximumValue;
1912   UINT16                            MinimumValue;
1913   UINT16                            Resolution;
1914   UINT16                            Tolerance;
1915   UINT16                            Accuracy;
1916   UINT32                            OEMDefined;
1917   UINT16                            NominalValue;
1918 } SMBIOS_TABLE_TYPE28;
1919 
1920 ///
1921 /// Electrical Current Probe - Location and Status.
1922 ///
1923 typedef struct {
1924   UINT8 ElectricalCurrentProbeSite   :5;
1925   UINT8 ElectricalCurrentProbeStatus :3;
1926 } MISC_ELECTRICAL_CURRENT_PROBE_LOCATION;
1927 
1928 ///
1929 /// Electrical Current Probe (Type 29).
1930 ///
1931 /// This structure describes the attributes for an electrical current probe in the system.
1932 /// Each structure describes a single electrical current probe.
1933 ///
1934 typedef struct {
1935   SMBIOS_STRUCTURE                        Hdr;
1936   SMBIOS_TABLE_STRING                     Description;
1937   MISC_ELECTRICAL_CURRENT_PROBE_LOCATION  LocationAndStatus;
1938   UINT16                                  MaximumValue;
1939   UINT16                                  MinimumValue;
1940   UINT16                                  Resolution;
1941   UINT16                                  Tolerance;
1942   UINT16                                  Accuracy;
1943   UINT32                                  OEMDefined;
1944   UINT16                                  NominalValue;
1945 } SMBIOS_TABLE_TYPE29;
1946 
1947 ///
1948 /// Out-of-Band Remote Access (Type 30).
1949 ///
1950 /// This structure describes the attributes and policy settings of a hardware facility
1951 /// that may be used to gain remote access to a hardware system when the operating system
1952 /// is not available due to power-down status, hardware failures, or boot failures.
1953 ///
1954 typedef struct {
1955   SMBIOS_STRUCTURE      Hdr;
1956   SMBIOS_TABLE_STRING   ManufacturerName;
1957   UINT8                 Connections;
1958 } SMBIOS_TABLE_TYPE30;
1959 
1960 ///
1961 /// Boot Integrity Services (BIS) Entry Point (Type 31).
1962 ///
1963 /// Structure type 31 (decimal) is reserved for use by the Boot Integrity Services (BIS).
1964 ///
1965 typedef struct {
1966   SMBIOS_STRUCTURE      Hdr;
1967   UINT8                 Checksum;
1968   UINT8                 Reserved1;
1969   UINT16                Reserved2;
1970   UINT32                BisEntry16;
1971   UINT32                BisEntry32;
1972   UINT64                Reserved3;
1973   UINT32                Reserved4;
1974 } SMBIOS_TABLE_TYPE31;
1975 
1976 ///
1977 /// System Boot Information - System Boot Status.
1978 ///
1979 typedef enum {
1980   BootInformationStatusNoError                  = 0x00,
1981   BootInformationStatusNoBootableMedia          = 0x01,
1982   BootInformationStatusNormalOSFailedLoading    = 0x02,
1983   BootInformationStatusFirmwareDetectedFailure  = 0x03,
1984   BootInformationStatusOSDetectedFailure        = 0x04,
1985   BootInformationStatusUserRequestedBoot        = 0x05,
1986   BootInformationStatusSystemSecurityViolation  = 0x06,
1987   BootInformationStatusPreviousRequestedImage   = 0x07,
1988   BootInformationStatusWatchdogTimerExpired     = 0x08,
1989   BootInformationStatusStartReserved            = 0x09,
1990   BootInformationStatusStartOemSpecific         = 0x80,
1991   BootInformationStatusStartProductSpecific     = 0xC0
1992 } MISC_BOOT_INFORMATION_STATUS_DATA_TYPE;
1993 
1994 ///
1995 /// System Boot Information (Type 32).
1996 ///
1997 /// The client system firmware, e.g. BIOS, communicates the System Boot Status to the
1998 /// client's Pre-boot Execution Environment (PXE) boot image or OS-present management
1999 /// application via this structure. When used in the PXE environment, for example,
2000 /// this code identifies the reason the PXE was initiated and can be used by boot-image
2001 /// software to further automate an enterprise's PXE sessions.  For example, an enterprise
2002 /// could choose to automatically download a hardware-diagnostic image to a client whose
2003 /// reason code indicated either a firmware- or operating system-detected hardware failure.
2004 ///
2005 typedef struct {
2006   SMBIOS_STRUCTURE                        Hdr;
2007   UINT8                                   Reserved[6];
2008   UINT8                                   BootStatus;     ///< The enumeration value from MISC_BOOT_INFORMATION_STATUS_DATA_TYPE.
2009 } SMBIOS_TABLE_TYPE32;
2010 
2011 ///
2012 /// 64-bit Memory Error Information (Type 33).
2013 ///
2014 /// This structure describes an error within a Physical Memory Array,
2015 /// when the error address is above 4G (0xFFFFFFFF).
2016 ///
2017 typedef struct {
2018   SMBIOS_STRUCTURE          Hdr;
2019   UINT8                     ErrorType;                    ///< The enumeration value from MEMORY_ERROR_TYPE.
2020   UINT8                     ErrorGranularity;             ///< The enumeration value from MEMORY_ERROR_GRANULARITY.
2021   UINT8                     ErrorOperation;               ///< The enumeration value from MEMORY_ERROR_OPERATION.
2022   UINT32                    VendorSyndrome;
2023   UINT64                    MemoryArrayErrorAddress;
2024   UINT64                    DeviceErrorAddress;
2025   UINT32                    ErrorResolution;
2026 } SMBIOS_TABLE_TYPE33;
2027 
2028 ///
2029 /// Management Device -  Type.
2030 ///
2031 typedef enum {
2032   ManagementDeviceTypeOther      = 0x01,
2033   ManagementDeviceTypeUnknown    = 0x02,
2034   ManagementDeviceTypeLm75       = 0x03,
2035   ManagementDeviceTypeLm78       = 0x04,
2036   ManagementDeviceTypeLm79       = 0x05,
2037   ManagementDeviceTypeLm80       = 0x06,
2038   ManagementDeviceTypeLm81       = 0x07,
2039   ManagementDeviceTypeAdm9240    = 0x08,
2040   ManagementDeviceTypeDs1780     = 0x09,
2041   ManagementDeviceTypeMaxim1617  = 0x0A,
2042   ManagementDeviceTypeGl518Sm    = 0x0B,
2043   ManagementDeviceTypeW83781D    = 0x0C,
2044   ManagementDeviceTypeHt82H791   = 0x0D
2045 } MISC_MANAGEMENT_DEVICE_TYPE;
2046 
2047 ///
2048 /// Management Device -  Address Type.
2049 ///
2050 typedef enum {
2051   ManagementDeviceAddressTypeOther   = 0x01,
2052   ManagementDeviceAddressTypeUnknown = 0x02,
2053   ManagementDeviceAddressTypeIOPort  = 0x03,
2054   ManagementDeviceAddressTypeMemory  = 0x04,
2055   ManagementDeviceAddressTypeSmbus   = 0x05
2056 } MISC_MANAGEMENT_DEVICE_ADDRESS_TYPE;
2057 
2058 ///
2059 /// Management Device (Type 34).
2060 ///
2061 /// The information in this structure defines the attributes of a Management Device.
2062 /// A Management Device might control one or more fans or voltage, current, or temperature
2063 /// probes as defined by one or more Management Device Component structures.
2064 ///
2065 typedef struct {
2066   SMBIOS_STRUCTURE                      Hdr;
2067   SMBIOS_TABLE_STRING                   Description;
2068   UINT8                                 Type;                     ///< The enumeration value from MISC_MANAGEMENT_DEVICE_TYPE.
2069   UINT32                                Address;
2070   UINT8                                 AddressType;              ///< The enumeration value from MISC_MANAGEMENT_DEVICE_ADDRESS_TYPE.
2071 } SMBIOS_TABLE_TYPE34;
2072 
2073 ///
2074 /// Management Device Component (Type 35)
2075 ///
2076 /// This structure associates a cooling device or environmental probe with structures
2077 /// that define the controlling hardware device and (optionally) the component's thresholds.
2078 ///
2079 typedef struct {
2080   SMBIOS_STRUCTURE      Hdr;
2081   SMBIOS_TABLE_STRING   Description;
2082   UINT16                ManagementDeviceHandle;
2083   UINT16                ComponentHandle;
2084   UINT16                ThresholdHandle;
2085 } SMBIOS_TABLE_TYPE35;
2086 
2087 ///
2088 /// Management Device Threshold Data (Type 36).
2089 ///
2090 /// The information in this structure defines threshold information for
2091 /// a component (probe or cooling-unit) contained within a Management Device.
2092 ///
2093 typedef struct {
2094   SMBIOS_STRUCTURE      Hdr;
2095   UINT16                LowerThresholdNonCritical;
2096   UINT16                UpperThresholdNonCritical;
2097   UINT16                LowerThresholdCritical;
2098   UINT16                UpperThresholdCritical;
2099   UINT16                LowerThresholdNonRecoverable;
2100   UINT16                UpperThresholdNonRecoverable;
2101 } SMBIOS_TABLE_TYPE36;
2102 
2103 ///
2104 /// Memory Channel Entry.
2105 ///
2106 typedef struct {
2107   UINT8                 DeviceLoad;
2108   UINT16                DeviceHandle;
2109 } MEMORY_DEVICE;
2110 
2111 ///
2112 /// Memory Channel - Channel Type.
2113 ///
2114 typedef enum {
2115   MemoryChannelTypeOther       = 0x01,
2116   MemoryChannelTypeUnknown     = 0x02,
2117   MemoryChannelTypeRambus      = 0x03,
2118   MemoryChannelTypeSyncLink    = 0x04
2119 } MEMORY_CHANNEL_TYPE;
2120 
2121 ///
2122 /// Memory Channel (Type 37)
2123 ///
2124 /// The information in this structure provides the correlation between a Memory Channel
2125 /// and its associated Memory Devices.  Each device presents one or more loads to the channel.
2126 /// The sum of all device loads cannot exceed the channel's defined maximum.
2127 ///
2128 typedef struct {
2129   SMBIOS_STRUCTURE      Hdr;
2130   UINT8                 ChannelType;
2131   UINT8                 MaximumChannelLoad;
2132   UINT8                 MemoryDeviceCount;
2133   MEMORY_DEVICE         MemoryDevice[1];
2134 } SMBIOS_TABLE_TYPE37;
2135 
2136 ///
2137 /// IPMI Device Information - BMC Interface Type
2138 ///
2139 typedef enum {
2140   IPMIDeviceInfoInterfaceTypeUnknown       = 0x00,
2141   IPMIDeviceInfoInterfaceTypeKCS           = 0x01, ///< The Keyboard Controller Style.
2142   IPMIDeviceInfoInterfaceTypeSMIC          = 0x02, ///< The Server Management Interface Chip.
2143   IPMIDeviceInfoInterfaceTypeBT            = 0x03, ///< The Block Transfer
2144   IPMIDeviceInfoInterfaceTypeReserved      = 0x04
2145 } BMC_INTERFACE_TYPE;
2146 
2147 ///
2148 /// IPMI Device Information (Type 38).
2149 ///
2150 /// The information in this structure defines the attributes of an
2151 /// Intelligent Platform Management Interface (IPMI) Baseboard Management Controller (BMC).
2152 ///
2153 /// The Type 42 structure can also be used to describe a physical management controller
2154 /// host interface and one or more protocols that share that interface. If IPMI is not
2155 /// shared with other protocols, either the Type 38 or Type 42 structures can be used.
2156 /// Providing Type 38 is recommended for backward compatibility.
2157 ///
2158 typedef struct {
2159   SMBIOS_STRUCTURE      Hdr;
2160   UINT8                 InterfaceType;              ///< The enumeration value from BMC_INTERFACE_TYPE.
2161   UINT8                 IPMISpecificationRevision;
2162   UINT8                 I2CSlaveAddress;
2163   UINT8                 NVStorageDeviceAddress;
2164   UINT64                BaseAddress;
2165   UINT8                 BaseAddressModifier_InterruptInfo;
2166   UINT8                 InterruptNumber;
2167 } SMBIOS_TABLE_TYPE38;
2168 
2169 ///
2170 /// System Power Supply - Power Supply Characteristics.
2171 ///
2172 typedef struct {
2173   UINT16                        PowerSupplyHotReplaceable:1;
2174   UINT16                        PowerSupplyPresent       :1;
2175   UINT16                        PowerSupplyUnplugged     :1;
2176   UINT16                        InputVoltageRangeSwitch  :4;
2177   UINT16                        PowerSupplyStatus        :3;
2178   UINT16                        PowerSupplyType          :4;
2179   UINT16                        Reserved                 :2;
2180 } SYS_POWER_SUPPLY_CHARACTERISTICS;
2181 
2182 ///
2183 /// System Power Supply (Type 39).
2184 ///
2185 /// This structure identifies attributes of a system power supply. One instance
2186 /// of this record is present for each possible power supply in a system.
2187 ///
2188 typedef struct {
2189   SMBIOS_STRUCTURE                  Hdr;
2190   UINT8                             PowerUnitGroup;
2191   SMBIOS_TABLE_STRING               Location;
2192   SMBIOS_TABLE_STRING               DeviceName;
2193   SMBIOS_TABLE_STRING               Manufacturer;
2194   SMBIOS_TABLE_STRING               SerialNumber;
2195   SMBIOS_TABLE_STRING               AssetTagNumber;
2196   SMBIOS_TABLE_STRING               ModelPartNumber;
2197   SMBIOS_TABLE_STRING               RevisionLevel;
2198   UINT16                            MaxPowerCapacity;
2199   SYS_POWER_SUPPLY_CHARACTERISTICS  PowerSupplyCharacteristics;
2200   UINT16                            InputVoltageProbeHandle;
2201   UINT16                            CoolingDeviceHandle;
2202   UINT16                            InputCurrentProbeHandle;
2203 } SMBIOS_TABLE_TYPE39;
2204 
2205 ///
2206 /// Additional Information Entry Format.
2207 ///
2208 typedef struct {
2209   UINT8                   EntryLength;
2210   UINT16                  ReferencedHandle;
2211   UINT8                   ReferencedOffset;
2212   SMBIOS_TABLE_STRING     EntryString;
2213   UINT8                   Value[1];
2214 }ADDITIONAL_INFORMATION_ENTRY;
2215 
2216 ///
2217 /// Additional Information (Type 40).
2218 ///
2219 /// This structure is intended to provide additional information for handling unspecified
2220 /// enumerated values and interim field updates in another structure.
2221 ///
2222 typedef struct {
2223   SMBIOS_STRUCTURE                      Hdr;
2224   UINT8                                 NumberOfAdditionalInformationEntries;
2225   ADDITIONAL_INFORMATION_ENTRY          AdditionalInfoEntries[1];
2226 } SMBIOS_TABLE_TYPE40;
2227 
2228 ///
2229 /// Onboard Devices Extended Information - Onboard Device Types.
2230 ///
2231 typedef enum{
2232   OnBoardDeviceExtendedTypeOther          = 0x01,
2233   OnBoardDeviceExtendedTypeUnknown        = 0x02,
2234   OnBoardDeviceExtendedTypeVideo          = 0x03,
2235   OnBoardDeviceExtendedTypeScsiController = 0x04,
2236   OnBoardDeviceExtendedTypeEthernet       = 0x05,
2237   OnBoardDeviceExtendedTypeTokenRing      = 0x06,
2238   OnBoardDeviceExtendedTypeSound          = 0x07,
2239   OnBoardDeviceExtendedTypePATAController = 0x08,
2240   OnBoardDeviceExtendedTypeSATAController = 0x09,
2241   OnBoardDeviceExtendedTypeSASController  = 0x0A
2242 } ONBOARD_DEVICE_EXTENDED_INFO_TYPE;
2243 
2244 ///
2245 /// Onboard Devices Extended Information (Type 41).
2246 ///
2247 /// The information in this structure defines the attributes of devices that
2248 /// are onboard (soldered onto) a system element, usually the baseboard.
2249 /// In general, an entry in this table implies that the BIOS has some level of
2250 /// control over the enabling of the associated device for use by the system.
2251 ///
2252 typedef struct {
2253   SMBIOS_STRUCTURE                  Hdr;
2254   SMBIOS_TABLE_STRING               ReferenceDesignation;
2255   UINT8                             DeviceType;             ///< The enumeration value from ONBOARD_DEVICE_EXTENDED_INFO_TYPE
2256   UINT8                             DeviceTypeInstance;
2257   UINT16                            SegmentGroupNum;
2258   UINT8                             BusNum;
2259   UINT8                             DevFuncNum;
2260 } SMBIOS_TABLE_TYPE41;
2261 
2262 ///
2263 /// Management Controller Host Interface (Type 42).
2264 ///
2265 /// The information in this structure defines the attributes of a Management
2266 /// Controller Host Interface that is not discoverable by "Plug and Play" mechanisms.
2267 ///
2268 /// Type 42 should be used for management controller host interfaces that use protocols
2269 /// other than IPMI or that use multiple protocols on a single host interface type.
2270 ///
2271 /// This structure should also be provided if IPMI is shared with other protocols
2272 /// over the same interface hardware. If IPMI is not shared with other protocols,
2273 /// either the Type 38 or Type 42 structures can be used. Providing Type 38 is
2274 /// recommended for backward compatibility. The structures are not required to
2275 /// be mutually exclusive. Type 38 and Type 42 structures may be implemented
2276 /// simultaneously to provide backward compatibility with IPMI applications or drivers
2277 /// that do not yet recognize the Type 42 structure.
2278 ///
2279 typedef struct {
2280   SMBIOS_STRUCTURE                  Hdr;
2281   UINT8                             InterfaceType;
2282   UINT8                             MCHostInterfaceData[1]; ///< This field has a minimum of four bytes
2283 } SMBIOS_TABLE_TYPE42;
2284 
2285 ///
2286 /// Inactive (Type 126)
2287 ///
2288 typedef struct {
2289   SMBIOS_STRUCTURE   Hdr;
2290 } SMBIOS_TABLE_TYPE126;
2291 
2292 ///
2293 /// End-of-Table (Type 127)
2294 ///
2295 typedef struct {
2296   SMBIOS_STRUCTURE   Hdr;
2297 } SMBIOS_TABLE_TYPE127;
2298 
2299 ///
2300 /// Union of all the possible SMBIOS record types.
2301 ///
2302 typedef union {
2303   SMBIOS_STRUCTURE      *Hdr;
2304   SMBIOS_TABLE_TYPE0    *Type0;
2305   SMBIOS_TABLE_TYPE1    *Type1;
2306   SMBIOS_TABLE_TYPE2    *Type2;
2307   SMBIOS_TABLE_TYPE3    *Type3;
2308   SMBIOS_TABLE_TYPE4    *Type4;
2309   SMBIOS_TABLE_TYPE5    *Type5;
2310   SMBIOS_TABLE_TYPE6    *Type6;
2311   SMBIOS_TABLE_TYPE7    *Type7;
2312   SMBIOS_TABLE_TYPE8    *Type8;
2313   SMBIOS_TABLE_TYPE9    *Type9;
2314   SMBIOS_TABLE_TYPE10   *Type10;
2315   SMBIOS_TABLE_TYPE11   *Type11;
2316   SMBIOS_TABLE_TYPE12   *Type12;
2317   SMBIOS_TABLE_TYPE13   *Type13;
2318   SMBIOS_TABLE_TYPE14   *Type14;
2319   SMBIOS_TABLE_TYPE15   *Type15;
2320   SMBIOS_TABLE_TYPE16   *Type16;
2321   SMBIOS_TABLE_TYPE17   *Type17;
2322   SMBIOS_TABLE_TYPE18   *Type18;
2323   SMBIOS_TABLE_TYPE19   *Type19;
2324   SMBIOS_TABLE_TYPE20   *Type20;
2325   SMBIOS_TABLE_TYPE21   *Type21;
2326   SMBIOS_TABLE_TYPE22   *Type22;
2327   SMBIOS_TABLE_TYPE23   *Type23;
2328   SMBIOS_TABLE_TYPE24   *Type24;
2329   SMBIOS_TABLE_TYPE25   *Type25;
2330   SMBIOS_TABLE_TYPE26   *Type26;
2331   SMBIOS_TABLE_TYPE27   *Type27;
2332   SMBIOS_TABLE_TYPE28   *Type28;
2333   SMBIOS_TABLE_TYPE29   *Type29;
2334   SMBIOS_TABLE_TYPE30   *Type30;
2335   SMBIOS_TABLE_TYPE31   *Type31;
2336   SMBIOS_TABLE_TYPE32   *Type32;
2337   SMBIOS_TABLE_TYPE33   *Type33;
2338   SMBIOS_TABLE_TYPE34   *Type34;
2339   SMBIOS_TABLE_TYPE35   *Type35;
2340   SMBIOS_TABLE_TYPE36   *Type36;
2341   SMBIOS_TABLE_TYPE37   *Type37;
2342   SMBIOS_TABLE_TYPE38   *Type38;
2343   SMBIOS_TABLE_TYPE39   *Type39;
2344   SMBIOS_TABLE_TYPE40   *Type40;
2345   SMBIOS_TABLE_TYPE41   *Type41;
2346   SMBIOS_TABLE_TYPE42   *Type42;
2347   SMBIOS_TABLE_TYPE126  *Type126;
2348   SMBIOS_TABLE_TYPE127  *Type127;
2349   UINT8                 *Raw;
2350 } SMBIOS_STRUCTURE_POINTER;
2351 
2352 #pragma pack()
2353 
2354 #endif
2355