1##
2# This file is used to document mismatches between Intel Platform Innovation Framework specification
3# (http://www.intel.com/technology/framework/spec.htm) and data structures defind at IntelFrameworkPkg
4# package in EdkII Open Source Project (https://edk2.tianocore.org/source/browse/edk2/trunk/edk2/IntelFrameworkPkg)
5##
6
7##
8# The general consideration about keeping the mismatches in EdkII:
9# 1. Some definitions defined in Framework specification may bring a little complexity on implementation. EdkII
10#    makes changes on them from the view of code development.
11# 2. Some definitions are NOT defined in Framework specification, but introduced in Edk. EdkII chooses to keep
12#    them for backward-compatibility.
13# 3. The name of some definitions are NOT consistent with Framework specification. If the name doesn't bring
14#    misunderstanding literally, EdkII chooses to keep them for backward-compatibility.
15# 4. Some defintitions don't exactly match Framework specification, some new field members are introduced in EdkII
16#    to reflect the latest industry standard.
17#
18# Note: 
19#    The IntelFrameworkPkg contains Framework specification contents that were not adopted by UEFI/PI, and names may be
20#    changed (such as adding "FRAMEWORK_") to avoid name collisions with approved UEFI/PI specifications.
21##
22
23##
24# Mismatch with Intel Platform Innovation Framework for DataHubSubclass Specification (Version 0.90)
25##
26  1. Guid/DataHubRecords.h
27    #define EFI_STRING_TOKEN          UINT16
28
29    This macro named "EFI_STRING_TOKEN" is *NOT* defined in Framework specification. Keeping this inconsistency
30    for backward compatibility.
31
32  2. Guid/DataHubRecords.h
33    #pragma pack(1)
34    typedef struct {
35      UINT8                             LastPciBus;
36    } EFI_MISC_LAST_PCI_BUS_DATA;
37    ...
38    typedef struct {
39      EFI_SUBCLASS_TYPE1_HEADER         Header;
40      EFI_MISC_SUBCLASS_RECORDS         Record;
41    } EFI_MISC_SUBCLASS_DRIVER_DATA;
42    #pragma pack()
43
44    Section "Alignment" in DataHubSubclass specification say "Fields in a data hub record should be aligned at their
45    natural boundaries". But in EdkII, the data structures above are packed. 
46    Keeping this inconsistency for backward compatibility.
47    
48  3. Guid/DataHubRecords.h
49    #define EFI_SUBCLASS_INSTANCE_RESERVED       0
50    #define EFI_SUBCLASS_INSTANCE_NON_APPLICABLE 0xFFFF
51
52    The symbols above are *NOT* defined in DataHubSubclass specification. But the values are defined and are meaningful.
53    According to DataHubSubclass spec, value 0 means Reserved and -1 means Not Applicable. EdkII introduces these macros
54    to faciliate user development.
55
56##
57# Mismatch with Intel Platform Innovation Framework for CacheSubclass Specification (Version 0.90)
58##
59  1. Guid/DataHubRecords.h
60    typedef EFI_EXP_BASE2_DATA       EFI_MAXIMUM_CACHE_SIZE_DATA;
61
62    The definition named "EFI_MAXIMUM_CACHE_SIZE_DATA" is *NOT* consistent with CacheSubclass specification, in which
63    the name should be EFI_CACHE_MAXIMUM_SIZE_DATA. Keeping this inconsistency for backward compatibility.
64
65  2. Guid/DataHubRecords.h
66    typedef struct {
67      UINT32                          Level           :3;
68      UINT32                          Socketed        :1;
69      UINT32                          Reserved2       :1;
70      UINT32                          Location        :2;
71      UINT32                          Enable          :1;
72      UINT32                          OperationalMode :2;
73      UINT32                          Reserved1       :22;
74    } EFI_CACHE_CONFIGURATION_DATA;
75
76    The field type of the definition is *NOT* consistent with CacheSubclass specification. Specification defines
77    them as UINT16, which is incorrect and should be UINT32 because the total width of bit-fields is 32bits width.
78    
79  3. Guid/DataHubRecords.h
80    typedef enum {
81      CacheSizeRecordType              = 1,
82      MaximumSizeCacheRecordType       = 2,
83      CacheSpeedRecordType             = 3,
84      CacheSocketRecordType            = 4,
85      CacheSramTypeRecordType          = 5,
86      CacheInstalledSramTypeRecordType = 6,
87      CacheErrorTypeRecordType         = 7,
88      CacheTypeRecordType              = 8,
89      CacheAssociativityRecordType     = 9,
90      CacheConfigRecordType            = 10
91    } EFI_CACHE_VARIABLE_RECORD_TYPE;
92
93    The data structure and all enumeration fields are *NOT* defined in CacheSubclass specification, which only
94    defines the following macros to specify the record number of the data record:
95      #define EFI_CACHE_SIZE_RECORD_NUMBER                    0x00000001
96      #define EFI_CACHE_MAXIMUM_SIZE_RECORD_NUMBER            0x00000002
97      #define EFI_CACHE_SPEED_RECORD_NUMBER                   0x00000003
98      #define EFI_CACHE_SOCKET_RECORD_NUMBER                  0x00000004
99      #define EFI_CACHE_SRAM_SUPPORT_RECORD_NUMBER            0x00000005 
100      #define EFI_CACHE_SRAM_INSTALL_RECORD_NUMBER            0x00000006 
101      #define EFI_CACHE_ERROR_SUPPORT_RECORD_NUMBER           0x00000007
102      #define EFI_CACHE_TYPE_RECORD_NUMBER                    0x00000008
103      #define EFI_CACHE_ASSOCIATIVITY_RECORD_NUMBER           0x00000009
104      #define EFI_CACHE_CONFIGURATION_RECORD_NUMBER           0x0000000A
105    Keeping this inconsistency for backward compatibility.
106
107  4. Guid/DataHubRecords.h
108    typedef union {
109      EFI_CACHE_SIZE_DATA               CacheSize;
110      ...
111      EFI_CACHE_ASSOCIATION_DATA        CacheAssociation;
112    } EFI_CACHE_VARIABLE_RECORD;
113
114    typedef struct {
115       EFI_SUBCLASS_TYPE1_HEADER        DataRecordHeader;
116       EFI_CACHE_VARIABLE_RECORD        VariableRecord;
117    } EFI_CACHE_DATA_RECORD;
118
119    The definitions above are *NOT* defined in CacheSubclass specification. EdkII introduces them to simplify the
120    code logic. Therefore developer doesn't need to allocate memory dynamically to construct variable length data record.
121    Keeping this inconsistency for backward compatibility.
122
123##
124# Mismatch with Intel Platform Innovation Framework for ProcSubclass Specification (Version 0.90)
125##
126  1. Guid/DataHubRecords.h
127    #define EFI_PROCESSOR_SUBCLASS_VERSION    0x00010000
128
129    The value of the definition is *NOT* consistent with ProcSubclass specification, in which the value is 0x0100.
130    Keeping this inconsistency from the perspective of binary consistency.
131
132  2. Guid/DataHubRecords.h
133    typedef struct {
134      UINT32                            ProcessorBrandIndex    :8;
135      UINT32                            ProcessorClflush       :8;
136      UINT32                            ProcessorReserved      :8;
137      UINT32                            ProcessorDfltApicId    :8;
138    } EFI_PROCESSOR_MISC_INFO;
139
140    The definition is *NOT* consistent with ProcSubclass specification, in which the name of third field is defined
141    as "LogicalProcessorCount" rather than "ProcessorReserved".
142    Keeping this inconsistency for backward compatibility.
143
144  3. Guid/DataHubRecords.h
145    typedef enum {
146      ...
147      EfiProcessorFamilyUltraSparcIIIi         = 0x58,
148      ...
149      EfiProcessorFamilyIntelPentiumM          = 0xB9,
150      EfiProcessorFamilyIntelCeleronD          = 0xBA,
151      EfiProcessorFamilyIntelPentiumD          = 0xBB,
152      EfiProcessorFamilyIntelPentiumEx         = 0xBC,
153      EfiProcessorFamilyIntelCoreSolo          = 0xBD,  
154      EfiProcessorFamilyReserved               = 0xBE,  
155      EfiProcessorFamilyIntelCore2             = 0xBF,
156      ...
157      EfiProcessorFamilyG6                     = 0xCB,
158      EfiProcessorFamilyzArchitectur           = 0xCC,
159      EfiProcessorFamilyViaC7M                 = 0xD2,
160      EfiProcessorFamilyViaC7D                 = 0xD3,
161      EfiProcessorFamilyViaC7                  = 0xD4,
162      EfiProcessorFamilyViaEden                = 0xD5,
163      ...
164      EfiProcessorFamilyIndicatorFamily2       = 0xFE,
165      EfiProcessorFamilyReserved1              = 0xFF
166    } EFI_PROCESSOR_FAMILY_DATA;
167
168    a. In ProcSubclass specification 0.9, the field name whose value equals to 0x58 is "EfiProcessorFamilyUltraSparcIIi".
169       Due to the name has been defined in previous field, changing it to "EfiProcessorFamilyUltraSparcIIIi" to avoid
170       build break.
171    b. The other fields listed here are *NOT* defined in ProcSubclass specification 0.9. They are introduced to
172       support new processor family (type 4) defined in SmBios 2.6 specification.
173       Keeping this inconsistency to reflect the latest industry standard.
174
175  4. Guid/DataHubRecords.h
176    typedef enum {
177      ...
178      EfiProcessorSocket939              = 0x12,
179      EfiProcessorSocketmPGA604          = 0x13,
180      EfiProcessorSocketLGA771           = 0x14,
181      EfiProcessorSocketLGA775           = 0x15
182    } EFI_PROCESSOR_SOCKET_TYPE_DATA;
183
184    The fields listed here are *NOT* defined in ProcSubclass specification 0.9. They are introduced to support
185    new processor upgrade (type 4 offset 19h) defined in SmBios 2.6 specification. 
186    Keeping this inconsistency to reflect the latest industry standard.
187
188  5. Guid/DataHubRecords.h
189    typedef EFI_INTER_LINK_DATA         EFI_CACHE_ASSOCIATION_DATA;
190
191    The definition name "EFI_CACHE_ASSOCIATION_DATA" is *NOT* consistent with ProcSubclass specification 0.9, in which
192    the name should be "EFI_PROCESSOR_CACHE_ASSOCIATION_DATA". Keeping this inconsistency for backward compatibility.
193
194  6. Guid/DataHubRecords.h
195    typedef enum {
196      EfiProcessorHealthy        = 1,
197      EfiProcessorPerfRestricted = 2,
198      EfiProcessorFuncRestricted = 3 
199    } EFI_PROCESSOR_HEALTH_STATUS;
200
201    The structure name "EFI_PROCESSOR_HEALTH_STATUS" is *NOT* consistent with ProcSubclass specification 0.9, in which
202    the name should be "EFI_PROCESSOR_HEALTH_STATUS_DATA". Keeping this inconsistency for backward compatibility.
203
204  7. Guid/DataHubRecords.h
205    typedef enum {
206      ProcessorCoreFrequencyRecordType     = 1,
207      ProcessorFsbFrequencyRecordType      = 2,
208      ProcessorVersionRecordType           = 3,
209      ProcessorManufacturerRecordType      = 4,
210      ProcessorSerialNumberRecordType      = 5,
211      ProcessorIdRecordType                = 6,
212      ProcessorTypeRecordType              = 7,
213      ProcessorFamilyRecordType            = 8,
214      ProcessorVoltageRecordType           = 9,
215      ProcessorApicBaseAddressRecordType   = 10,
216      ProcessorApicIdRecordType            = 11,
217      ProcessorApicVersionNumberRecordType = 12,
218      CpuUcodeRevisionDataRecordType       = 13,
219      ProcessorStatusRecordType            = 14,
220      ProcessorSocketTypeRecordType        = 15,
221      ProcessorSocketNameRecordType        = 16,
222      CacheAssociationRecordType           = 17,
223      ProcessorMaxCoreFrequencyRecordType  = 18,
224      ProcessorAssetTagRecordType          = 19,
225      ProcessorMaxFsbFrequencyRecordType   = 20,
226      ProcessorPackageNumberRecordType     = 21,
227      ProcessorCoreFrequencyListRecordType = 22,
228      ProcessorFsbFrequencyListRecordType  = 23,
229      ProcessorHealthStatusRecordType      = 24,
230      ProcessorCoreCountRecordType         = 25,
231      ProcessorEnabledCoreCountRecordType  = 26,
232      ProcessorThreadCountRecordType       = 27,
233      ProcessorCharacteristicsRecordType   = 28,
234      ProcessorFamily2RecordType           = 29,
235      ProcessorPartNumberRecordType        = 30,
236    } EFI_CPU_VARIABLE_RECORD_TYPE;
237
238    The enumeration fields from ProcessorCoreFrequencyRecordType to ProcessorHealthStatusRecordType are *NOT* defined 
239    in ProcSubclass specification 0.9, which only defines the following macros to specify the record number of the data record:
240      #define EFI_PROCESSOR_FREQUENCY_RECORD_NUMBER           0x00000001
241      #define EFI_PROCESSOR_BUS_FREQUENCY_RECORD_NUMBER       0x00000002
242      #define EFI_PROCESSOR_VERSION_RECORD_NUMBER             0x00000003
243      #define EFI_PROCESSOR_MANUFACTURER_RECORD_NUMBER        0x00000004
244      #define EFI_PROCESSOR_SERIAL_NUMBER_RECORD_NUMBER       0x00000005
245      #define EFI_PROCESSOR_ID_RECORD_NUMBER                  0x00000006
246      #define EFI_PROCESSOR_TYPE_RECORD_NUMBER                0x00000007
247      #define EFI_PROCESSOR_FAMILY_RECORD_NUMBER              0x00000008
248      #define EFI_PROCESSOR_VOLTAGE_RECORD_NUMBER             0x00000009
249      #define EFI_PROCESSOR_APIC_BASE_ADDRESS_RECORD_NUMBER   0x0000000A
250      #define EFI_PROCESSOR_APIC_ID_RECORD_NUMBER             0x0000000B
251      #define EFI_PROCESSOR_APIC_VER_NUMBER_RECORD_NUMBER     0x0000000C
252      #define EFI_PROCESSOR_MICROCODE_REVISION_RECORD_NUMBER  0x0000000D
253      #define EFI_PROCESSOR_STATUS_RECORD_NUMBER              0x0000000E
254      #define EFI_PROCESSOR_SOCKET_TYPE_RECORD_NUMBER         0x0000000F
255      #define EFI_PROCESSOR_SOCKET_NAME_RECORD_NUMBER         0x00000010
256      #define EFI_PROCESSOR_CACHE_ASSOCIATION_RECORD_NUMBER   0x00000011
257      #define EFI_PROCESSOR_MAX_FREQUENCY_RECORD_NUMBER       0x00000012
258      #define EFI_PROCESSOR_ASSET_TAG_RECORD_NUMBER           0x00000013
259      #define EFI_PROCESSOR_MAX_FSB_FREQUENCY_RECORD_NUMBER   0x00000014
260      #define EFI_PROCESSOR_PACKAGE_NUMBER_RECORD_NUMBER      0x00000015
261      #define EFI_PROCESSOR_FREQUENCY_LIST_RECORD_NUMBER      0x00000016
262      #define EFI_PROCESSOR_FSB_FREQUENCY_LIST_RECORD_NUMBER  0x00000017
263      #define EFI_PROCESSOR_HEALTH_STATUS_RECORD_NUMBER       0x00000018
264    Keeping this inconsistency for backward compatibility.
265
266    The enumeration fields from ProcessorCoreCountRecordType to ProcessorPartNumberRecordType are *NOT* defined 
267    in ProcSubclass specification 0.9. 
268    They are introduced to support new fields for type 4 defined in SmBios 2.6 specification.
269    Keeping this inconsistency to reflect the latest industry standard.
270
271  8. Guid/DataHubRecords.h
272    typedef union {
273      EFI_PROCESSOR_CORE_FREQUENCY_LIST_DATA  ProcessorCoreFrequencyList;
274      ...
275      EFI_PROCESSOR_FAMILY2_DATA              ProcessorFamily2;
276    } EFI_CPU_VARIABLE_RECORD;
277    
278    typedef struct {
279      EFI_SUBCLASS_TYPE1_HEADER         DataRecordHeader;
280      EFI_CPU_VARIABLE_RECORD           VariableRecord;
281    } EFI_CPU_DATA_RECORD;
282
283    The definitions above are *NOT* defined in ProcSubclass specification 0.9. EdkII introduces them to simplify the
284    code logic. Therefore developer doesn't need to allocate memory dynamically to construct variable length data record.
285    Keeping this inconsistency for backward compatibility.
286
287  9. Guid/DataHubRecords.h
288    typedef STRING_REF                  EFI_PROCESSOR_PART_NUMBER_DATA;
289
290    typedef enum {
291      EfiProcessorFamilySh3           = 0x104,
292      EfiProcessorFamilySh4           = 0x105,
293      EfiProcessorFamilyArm           = 0x118,
294      EfiProcessorFamilyStrongArm     = 0x119,
295      EfiProcessorFamily6x86          = 0x12C,
296      EfiProcessorFamilyMediaGx       = 0x12D,
297      EfiProcessorFamilyMii           = 0x12E,
298      EfiProcessorFamilyWinChip       = 0x140,
299      EfiProcessorFamilyDsp           = 0x15E,
300      EfiProcessorFamilyVideo         = 0x1F4
301    } EFI_PROCESSOR_FAMILY2_DATA;
302
303    typedef UINT8                       EFI_PROCESSOR_CORE_COUNT_DATA;
304
305    typedef UINT8                       EFI_PROCESSOR_ENABLED_CORE_COUNT_DATA;
306
307    typedef UINT8                       EFI_PROCESSOR_THREAD_COUNT_DATA;
308
309    typedef struct {
310      UINT16  Reserved              :1;
311      UINT16  Unknown               :1;
312      UINT16  Capable64Bit          :1;
313      UINT16  Reserved2             :13;
314    } EFI_PROCESSOR_CHARACTERISTICS_DATA;
315
316    The fields listed here are *NOT* defined in ProcSubclass specification 0.9. They are introduced to support
317    new fields for type 4 defined in SmBios 2.6 specification. 
318    Keeping this inconsistency to reflect the latest industry standard.
319
320##
321# Mismatch with Intel Platform Innovation Framework for MemSubclass Specification (Version 0.90)
322##
323  1. Guid/DataHubRecords.h
324    typedef enum _EFI_MEMORY_FORM_FACTOR {
325      ...
326      EfiMemoryFormFactorFbDimm                   = 0x0F
327    } EFI_MEMORY_FORM_FACTOR;
328    
329    typedef enum _EFI_MEMORY_ARRAY_TYPE {
330      ...
331      EfiMemoryTypeDdr2                           = 0x13,
332      EfiMemoryTypeDdr2FbDimm                     = 0x14
333    } EFI_MEMORY_ARRAY_TYPE;
334    
335    typedef enum {
336      ...
337      EfiMemoryStatePartial      = 6
338    } EFI_MEMORY_STATE;
339
340    The fields listed above are *NOT* defined in MemSubclass specification 0.9. They are introduced to support
341    new memory device (type 17) defined in SmBios 2.6 specification. 
342    Keeping this inconsistency to reflect the latest industry standard.
343
344  2. Guid/DataHubRecords.h
345    typedef struct { 
346      ...
347      EFI_EXP_BASE10_DATA      MemorySpeed; 
348      ...
349    } EFI_MEMORY_ARRAY_LINK_DATA;
350
351    The field name "MemorySpeed" in the definition above is *NOT* consistent with MemSubclass specification 0.9,
352    in which it is defined as MemoryTypeSpeed. Keeping this inconsistency for backward compatibility.
353
354  3. Guid/DataHubRecords.h
355    #define EFI_MEMORY_CONTROLLER_INFORMATION_RECORD_NUMBER    0x00000008
356
357    typedef enum {  
358      EfiErrorDetectingMethodOther   = 1,
359      EfiErrorDetectingMethodUnknown = 2,
360      EfiErrorDetectingMethodNone    = 3,
361      EfiErrorDetectingMethodParity  = 4,
362      EfiErrorDetectingMethod32Ecc   = 5,
363      EfiErrorDetectingMethod64Ecc   = 6,
364      EfiErrorDetectingMethod128Ecc  = 7,
365      EfiErrorDetectingMethodCrc     = 8
366    } EFI_MEMORY_ERROR_DETECT_METHOD_TYPE;
367
368    typedef struct {
369      UINT8                             Other                 :1;
370      UINT8                             Unknown               :1;
371      UINT8                             None                  :1;
372      UINT8                             SingleBitErrorCorrect :1;
373      UINT8                             DoubleBitErrorCorrect :1;
374      UINT8                             ErrorScrubbing        :1;
375      UINT8                             Reserved              :2;
376    } EFI_MEMORY_ERROR_CORRECT_CAPABILITY;
377
378    typedef enum {  
379      EfiMemoryInterleaveOther      = 1,
380      EfiMemoryInterleaveUnknown    = 2,
381      EfiMemoryInterleaveOneWay     = 3,
382      EfiMemoryInterleaveTwoWay     = 4,
383      EfiMemoryInterleaveFourWay    = 5,
384      EfiMemoryInterleaveEightWay   = 6,
385      EfiMemoryInterleaveSixteenWay = 7
386    } EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE;
387
388    typedef struct {
389      UINT16                            Other    :1;
390      UINT16                            Unknown  :1;
391      UINT16                            SeventyNs:1;
392      UINT16                            SixtyNs  :1;
393      UINT16                            FiftyNs  :1;
394      UINT16                            Reserved :11;
395    } EFI_MEMORY_SPEED_TYPE;
396
397    typedef struct {
398      UINT16                            Other       :1;
399      UINT16                            Unknown     :1;
400      UINT16                            Standard    :1;
401      UINT16                            FastPageMode:1;
402      UINT16                            EDO         :1;
403      UINT16                            Parity      :1;
404      UINT16                            ECC         :1;
405      UINT16                            SIMM        :1;
406      UINT16                            DIMM        :1;
407      UINT16                            BurstEdo    :1;
408      UINT16                            SDRAM       :1;
409      UINT16                            Reserved    :5;
410    } EFI_MEMORY_SUPPORTED_TYPE;
411
412    typedef struct {
413      UINT8                             Five    :1;
414      UINT8                             Three   :1;
415      UINT8                             Two     :1;
416      UINT8                             Reserved:5;
417    } EFI_MEMORY_MODULE_VOLTAGE_TYPE;
418
419    typedef struct {
420      EFI_MEMORY_ERROR_DETECT_METHOD_TYPE ErrorDetectingMethod;
421      EFI_MEMORY_ERROR_CORRECT_CAPABILITY ErrorCorrectingCapability;
422      EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE  MemorySupportedInterleave;
423      EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE  MemoryCurrentInterleave;
424      UINT8                               MaxMemoryModuleSize;
425      EFI_MEMORY_SPEED_TYPE               MemorySpeedType;
426      EFI_MEMORY_SUPPORTED_TYPE           MemorySupportedType;
427      EFI_MEMORY_MODULE_VOLTAGE_TYPE      MemoryModuleVoltage;
428      UINT8                               NumberofMemorySlot;
429      EFI_MEMORY_ERROR_CORRECT_CAPABILITY EnabledCorrectingCapability;
430      UINT16                              *MemoryModuleConfigHandles;
431    } EFI_MEMORY_CONTROLLER_INFORMATION;
432
433    typedef struct {
434      EFI_MEMORY_ERROR_DETECT_METHOD_TYPE   ErrorDetectingMethod;
435      EFI_MEMORY_ERROR_CORRECT_CAPABILITY   ErrorCorrectingCapability;
436      EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE    MemorySupportedInterleave;
437      EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE    MemoryCurrentInterleave;
438      UINT8                                 MaxMemoryModuleSize;
439      EFI_MEMORY_SPEED_TYPE                 MemorySpeedType;
440      EFI_MEMORY_SUPPORTED_TYPE             MemorySupportedType;
441      EFI_MEMORY_MODULE_VOLTAGE_TYPE        MemoryModuleVoltage;
442      UINT8                                 NumberofMemorySlot;
443      EFI_MEMORY_ERROR_CORRECT_CAPABILITY   EnabledCorrectingCapability;
444      EFI_INTER_LINK_DATA                   MemoryModuleConfig[1];
445    } EFI_MEMORY_CONTROLLER_INFORMATION_DATA;
446
447    The definitions above are *NOT* defined in MemSubclass specification 0.9. They are introduced to support
448    new memory controller information (type 5) defined in SmBios 2.6 specification. 
449    Keeping this inconsistency to reflect the latest industry standard.
450
451  4. Guid/DataHubRecords.h
452    #define EFI_MEMORY_32BIT_ERROR_INFORMATION_RECORD_NUMBER    0x00000009
453
454    typedef enum {  
455      EfiMemoryErrorOther             = 1,
456      EfiMemoryErrorUnknown           = 2,
457      EfiMemoryErrorOk                = 3,
458      EfiMemoryErrorBadRead           = 4,
459      EfiMemoryErrorParity            = 5,
460      EfiMemoryErrorSigleBit          = 6,
461      EfiMemoryErrorDoubleBit         = 7,
462      EfiMemoryErrorMultiBit          = 8,
463      EfiMemoryErrorNibble            = 9,
464      EfiMemoryErrorChecksum          = 10,
465      EfiMemoryErrorCrc               = 11,
466      EfiMemoryErrorCorrectSingleBit  = 12,
467      EfiMemoryErrorCorrected         = 13,
468      EfiMemoryErrorUnCorrectable     = 14
469    } EFI_MEMORY_ERROR_TYPE;
470
471    typedef enum {  
472      EfiMemoryGranularityOther               = 1,
473      EfiMemoryGranularityOtherUnknown        = 2,
474      EfiMemoryGranularityDeviceLevel         = 3,
475      EfiMemoryGranularityMemPartitionLevel   = 4
476    } EFI_MEMORY_ERROR_GRANULARITY_TYPE;
477
478    typedef enum {  
479      EfiMemoryErrorOperationOther            = 1,
480      EfiMemoryErrorOperationUnknown          = 2,
481      EfiMemoryErrorOperationRead             = 3,
482      EfiMemoryErrorOperationWrite            = 4,
483      EfiMemoryErrorOperationPartialWrite     = 5
484    } EFI_MEMORY_ERROR_OPERATION_TYPE;
485
486    typedef struct {
487      EFI_MEMORY_ERROR_TYPE               MemoryErrorType;
488      EFI_MEMORY_ERROR_GRANULARITY_TYPE   MemoryErrorGranularity;
489      EFI_MEMORY_ERROR_OPERATION_TYPE     MemoryErrorOperation;
490      UINT32                              VendorSyndrome;
491      UINT32                              MemoryArrayErrorAddress;
492      UINT32                              DeviceErrorAddress;
493      UINT32                              DeviceErrorResolution;
494    } EFI_MEMORY_32BIT_ERROR_INFORMATION;
495
496    The definitions above are *NOT* defined in MemSubclass specification 0.9. They are introduced to support
497    new 32-bit memory error information (type 18) defined in SmBios 2.6 specification. 
498    Keeping this inconsistency to reflect the latest industry standard.
499
500  5. Guid/DataHubRecords.h
501    #define EFI_MEMORY_64BIT_ERROR_INFORMATION_RECORD_NUMBER    0x0000000A
502    
503    typedef struct {
504      EFI_MEMORY_ERROR_TYPE             MemoryErrorType;
505      EFI_MEMORY_ERROR_GRANULARITY_TYPE MemoryErrorGranularity;
506      EFI_MEMORY_ERROR_OPERATION_TYPE   MemoryErrorOperation;
507      UINT32                            VendorSyndrome;
508      UINT64                            MemoryArrayErrorAddress;
509      UINT64                            DeviceErrorAddress;
510      UINT32                            DeviceErrorResolution;
511    } EFI_MEMORY_64BIT_ERROR_INFORMATION;
512
513    The definitions above are *NOT* defined in MemSubclass specification 0.9. They are introduced to support
514    new 64-bit memory error information (type 33) defined in SmBios 2.6 specification. 
515    Keeping this inconsistency to reflect the latest industry standard.
516
517  6. Guid/DataHubRecords.h
518    typedef union _EFI_MEMORY_SUBCLASS_RECORDS {
519      EFI_MEMORY_SIZE_DATA                 SizeData;
520      ...
521      EFI_MEMORY_64BIT_ERROR_INFORMATION   Memory64bitErrorInfo;
522    } EFI_MEMORY_SUBCLASS_RECORDS;
523
524    typedef struct {
525      EFI_SUBCLASS_TYPE1_HEADER         Header;
526      EFI_MEMORY_SUBCLASS_RECORDS       Record;
527    } EFI_MEMORY_SUBCLASS_DRIVER_DATA;
528
529    The definitions above are *NOT* defined in MemSubclass specification 0.9. EdkII introduces them to simplify the
530    code logic. Therefore developer doesn't need to allocate memory dynamically to construct variable length data record.
531    Keeping this inconsistency for backward compatibility.
532
533##
534# Mismatch with Intel Platform Innovation Framework for MiscSubclass Specification (Version 0.90)
535##
536  1. Guid/DataHubRecords.h
537    #pragma pack(1)
538    typedef struct _USB_PORT_DEVICE_PATH {
539      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
540      PCI_DEVICE_PATH                   PciBusDevicePath;
541      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
542    } USB_PORT_DEVICE_PATH;
543    
544    typedef struct _IDE_DEVICE_PATH {
545      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
546      PCI_DEVICE_PATH                   PciBusDevicePath;
547      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
548    } IDE_DEVICE_PATH;
549    
550    typedef struct _RMC_CONN_DEVICE_PATH {
551      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
552      PCI_DEVICE_PATH                   PciBridgeDevicePath;
553      PCI_DEVICE_PATH                   PciBusDevicePath;
554      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
555    } RMC_CONN_DEVICE_PATH;
556    
557    typedef struct _RIDE_DEVICE_PATH {
558      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
559      PCI_DEVICE_PATH                   PciBridgeDevicePath;
560      PCI_DEVICE_PATH                   PciBusDevicePath;
561      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
562    } RIDE_DEVICE_PATH;
563    
564    typedef struct _GB_NIC_DEVICE_PATH {
565      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
566      PCI_DEVICE_PATH                   PciBridgeDevicePath;
567      PCI_DEVICE_PATH                   PciXBridgeDevicePath;
568      PCI_DEVICE_PATH                   PciXBusDevicePath;
569      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
570    } GB_NIC_DEVICE_PATH;
571    
572    typedef struct _PS2_CONN_DEVICE_PATH {
573      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
574      PCI_DEVICE_PATH                   LpcBridgeDevicePath;
575      ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
576      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
577    } PS2_CONN_DEVICE_PATH;
578    
579    typedef struct _SERIAL_CONN_DEVICE_PATH {
580      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
581      PCI_DEVICE_PATH                   LpcBridgeDevicePath;
582      ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
583      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
584    } SERIAL_CONN_DEVICE_PATH;
585    
586    typedef struct _PARALLEL_CONN_DEVICE_PATH {
587      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
588      PCI_DEVICE_PATH                   LpcBridgeDevicePath;
589      ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
590      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
591    } PARALLEL_CONN_DEVICE_PATH;
592    
593    typedef struct _FLOOPY_CONN_DEVICE_PATH {
594      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
595      PCI_DEVICE_PATH                   LpcBridgeDevicePath;
596      ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
597      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
598    } FLOOPY_CONN_DEVICE_PATH;
599    
600    typedef union _EFI_MISC_PORT_DEVICE_PATH {
601      USB_PORT_DEVICE_PATH              UsbDevicePath;
602      IDE_DEVICE_PATH                   IdeDevicePath;
603      RMC_CONN_DEVICE_PATH              RmcConnDevicePath;
604      RIDE_DEVICE_PATH                  RideDevicePath;
605      GB_NIC_DEVICE_PATH                GbNicDevicePath;
606      PS2_CONN_DEVICE_PATH              Ps2ConnDevicePath;
607      SERIAL_CONN_DEVICE_PATH           SerialConnDevicePath;
608      PARALLEL_CONN_DEVICE_PATH         ParallelConnDevicePath;
609      FLOOPY_CONN_DEVICE_PATH           FloppyConnDevicePath;
610    } EFI_MISC_PORT_DEVICE_PATH;
611    #pragma pack()
612
613    a. The definitions above are *NOT* defined in MiscSubclass specifications 0.9. EdkII introduces them to simplify the
614       code logic. Therefore developer doesn't need to allocate memory dynamically to construct variable length device
615       path for various device.
616       Keeping this inconsistency for backward compatibility.
617
618    b. The definitions above are packed. This way violates the rule of alignment defined in DataHubSubclass specification.
619       Section "Alignment" in DataHubSubclass specification say "Fields in a data hub record should be aligned at their
620       natural boundaries". Keeping this inconsistency for backward compatibility.
621
622  2. Guid/DataHubRecords.h
623    typedef struct {
624      ...
625      EFI_MISC_PORT_DEVICE_PATH         PortPath;
626    } EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA;
627
628    The definition is *NOT* consistent with MiscSubclass specification, in which the type of last field is defined as
629    "EFI_DEVICE_PATH_PROTOCOL". The definition in Specification may bring a little complexity on implementation. User
630    have to allocate variable length memory to contain device path info and free them finially.
631    EdkII introduced an union type named EFI_MISC_PORT_DEVICE_PATH to avoid the logic above.
632
633  3. Guid/DataHubRecords.h
634    typedef struct {
635      ...
636      UINT8                                       BiosMajorRelease;
637      UINT8                                       BiosMinorRelease;
638      UINT8                                       BiosEmbeddedFirmwareMajorRelease;
639      UINT8                                       BiosEmbeddedFirmwareMinorRelease;
640    } EFI_MISC_BIOS_VENDOR_DATA;
641
642    The fields listed above are *NOT* defined in MiscSubclass specification 0.9. They are introduced to support
643    new bios information (type 0) defined in SmBios 2.6 specification. 
644    Keeping this inconsistency to reflect the latest industry standard.
645
646  4. Guid/DataHubRecords.h
647    typedef struct {
648      ...
649      STRING_REF                        SystemSKUNumber;
650      STRING_REF                        SystemFamily;
651    } EFI_MISC_SYSTEM_MANUFACTURER_DATA;
652
653    The fields listed above are *NOT* defined in MiscSubclass specification 0.9. They are introduced to support
654    new system information (type 1) defined in SmBios 2.6 specification. 
655    Keeping this inconsistency to reflect the latest industry standard.
656
657  5. Guid/DataHubRecords.h
658    typedef struct {
659      ...
660      EFI_INTER_LINK_DATA               ManagementDeviceThresholdLink;
661      UINT8                             ComponentType;
662    } EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_DATA;
663
664    a. The field "ManagementDeviceThresholdLink" above is *NOT* defined in MiscSubclass specification 0.9. It is introduced to support
665       new management device component (type 35) defined in SmBios 2.6 specification. 
666       Keeping this inconsistency to reflect the latest industry standard.
667    b. The field "ComponentType" above is *NOT* defined in MiscSubclass specifications 0.9. It's implementation-specific to simplify the code logic.
668       Keeping this inconsistency for backward compatibility.
669
670  6. Guid/DataHubRecords.h
671    typedef struct {
672      UINT32                            ChassisType       :16;
673      UINT32                            ChassisLockPresent:1;
674      UINT32                            Reserved          :15;
675    } EFI_MISC_CHASSIS_STATUS;
676
677    The definition is *NOT* consistent with MiscSubclass specification 0.9, in which the first field is assigned a wrong field
678    name "EFI_MISC_CHASSIS_TYPE". Due to EFI_MISC_CHASSIS_TYPE has been declared as a data type, it can not be used as a
679    field name again. EdkII changes its name to "ChassisType" to pass build.
680
681  7. Guid/DataHubRecords.h
682    typedef enum {
683      ...
684      EfiSlotTypeAgp2X                  = 0x10,
685      ...
686      EfiSlotTypePciExpress             = 0xA5,
687      EfiSlotTypePciExpressX1           = 0xA6,
688      EfiSlotTypePciExpressX2           = 0xA7,
689      EfiSlotTypePciExpressX4           = 0xA8,
690      EfiSlotTypePciExpressX8           = 0xA9,
691      EfiSlotTypePciExpressX16          = 0xAA
692    } EFI_MISC_SLOT_TYPE;
693
694    a. The field name "EfiSlotTypeAgp2X" is *NOT* consistent with MiscSubclass specification 0.9, in which it is named
695       "EfiSlotTypeApg2X".
696       From its literal sense, this field represents a AGP type display card, so it should be named as "EfiSlotTypeAgp2X".
697    b. The enumeration fields from "EfiSlotTypePciExpress" to "EfiSlotTypePciExpressX16" are *NOT* defined in MiscSubclass specification 0.9.
698       They are introduced to support new system slots (type 9) defined in SmBios 2.6 specification.
699       Keeping this inconsistency to reflect the latest industry standard.
700
701  8. Guid/DataHubRecords.h
702    typedef struct {
703      ...
704      EFI_MISC_ONBOARD_DEVICE_STATUS    OnBoardDeviceStatus;
705      ...
706    } EFI_MISC_ONBOARD_DEVICE_DATA;
707
708    The definition is *NOT* consistent with MiscSubclass specification 0.9, in which the field "OnBoardDeviceStatus" is 
709    named as "OnBoardDeviceType". Keeping this inconsistency for backward compatibility.
710
711  9. Guid/DataHubRecords.h
712    #define EFI_MISC_PORTABLE_BATTERY_RECORD_NUMBER   0x00000010
713
714    The name of the definition is *NOT* consistent with MiscSubclass specification 0.9, in which it is defined as
715    "EFI_MISC_BATTERY_LOCATION_RECORD_NUMBER". Keeping this inconsistency for backward compatibility.
716
717  10. Guid/DataHubRecords.h
718    typedef enum {  
719      EfiPortableBatteryDeviceChemistryOther = 1,
720      EfiPortableBatteryDeviceChemistryUnknown = 2,
721      EfiPortableBatteryDeviceChemistryLeadAcid = 3,
722      EfiPortableBatteryDeviceChemistryNickelCadmium = 4,
723      EfiPortableBatteryDeviceChemistryNickelMetalHydride = 5,
724      EfiPortableBatteryDeviceChemistryLithiumIon = 6,
725      EfiPortableBatteryDeviceChemistryZincAir = 7,
726      EfiPortableBatteryDeviceChemistryLithiumPolymer = 8
727    } EFI_MISC_PORTABLE_BATTERY_DEVICE_CHEMISTRY;
728
729    The name of the definition is *NOT* consistent with MiscSubclass specification, in which it is defined as
730    "EFI_MISC_BATTERY_DEVICE_CHEMISTRY". And all field names have a redundant "Portable" string compared with MisSubclass 
731    specification 0.9.
732    Keeping this inconsistency for backward compatibility.
733
734  11. Guid/DataHubRecords.h
735    typedef struct {
736      STRING_REF                                 Location;
737      STRING_REF                                 Manufacturer;
738      STRING_REF                                 ManufactureDate;
739      STRING_REF                                 SerialNumber;
740      STRING_REF                                 DeviceName;
741      EFI_MISC_PORTABLE_BATTERY_DEVICE_CHEMISTRY DeviceChemistry;
742      UINT16                                     DesignCapacity;
743      UINT16                                     DesignVoltage;
744      STRING_REF                                 SBDSVersionNumber;
745      UINT8                                      MaximumError;
746      UINT16                                     SBDSSerialNumber;
747      UINT16                                     SBDSManufactureDate;
748      STRING_REF                                 SBDSDeviceChemistry;
749      UINT8                                      DesignCapacityMultiplier;
750      UINT32                                     OEMSpecific;
751      UINT8                                      BatteryNumber;
752      BOOLEAN                                    Valid;
753    } EFI_MISC_PORTABLE_BATTERY;
754
755    The definition is *NOT* consistent with MiscSubclass specification 0.9, in which the structure name is defined as
756    "EFI_MISC_BATTERY_LOCATION_DATA". Moreover, the name and the order of all fields are also different with MiscSubclass 
757    specification 0.9. Keeping this inconsistency for backward compatibility.
758
759  12. Guid/DataHubRecords.h
760    typedef enum {
761      ...
762    } EFI_MISC_BOOT_INFORMATION_STATUS_DATA_TYPE;
763
764    The name of the definition is *NOT* consistent with MiscSubclass specification 0.9, in which it is defined as
765    "EFI_MISC_BOOT_INFORMATION_STATUS_TYPE". Keeping this inconsistency for backward compatibility.
766
767  13. Guid/DataHubRecords.h
768    typedef struct {
769      EFI_MISC_BOOT_INFORMATION_STATUS_DATA_TYPE BootInformationStatus;
770      ...
771    } EFI_MISC_BOOT_INFORMATION_STATUS_DATA;
772
773    The definition is *NOT* consistent with MiscSubclass specification 0.9, in which the type of the first field is 
774    "EFI_MISC_BOOT_INFORMATION_STATUS_TYPE". Keeping this inconsistency for backward compatibility.
775
776  14. Guid/DataHubRecords.h
777    typedef struct {
778      ...
779    } EFI_MISC_SYSTEM_POWER_SUPPLY_DATA;
780
781    The name of the definition is *NOT* consistent with MiscSubclass specification 0.9, in which it is defined as
782    "EFI_MISC_POWER_SUPPLY_UNIT_GROUP_DATA". Keeping this inconsistency for backward compatibility.
783
784  15. Guid/DataHubRecords.h
785    typedef struct {
786      ...
787    } SMBIOS_STRUCTURE_HDR;
788
789    The name of the definition is *NOT* consistent with MiscSubclass specification 0.9, in which the structure name
790    is defined as "EFI_SMBIOS_STRUCTURE_HDR". Due to this structure is commonly used by vendor to construct SmBios
791    type 0x80~0xFF table, Keeping this inconsistency for backward compatibility.
792
793  16. Guid/DataHubRecords.h
794    typedef struct {
795      SMBIOS_STRUCTURE_HDR              Header;
796      ...
797    } EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION_DATA;
798
799    The definition is *NOT* consistent with MiscSubclass specification 0.9, in which the type of the first field is 
800    "EFI_SMBIOS_STRUCTURE_HDR". Keeping this inconsistency for backward compatibility.
801
802  17. Guid/DataHubRecords.h
803    typedef struct {
804      UINT16                            PowerSupplyHotReplaceable:1;
805      UINT16                            PowerSupplyPresent       :1;
806      UINT16                            PowerSupplyUnplugged     :1;
807      UINT16                            InputVoltageRangeSwitch  :4;
808      UINT16                            PowerSupplyStatus        :3;
809      UINT16                            PowerSupplyType          :4;
810      UINT16                            Reserved                 :2;
811    } EFI_MISC_POWER_SUPPLY_CHARACTERISTICS;
812
813    all field type in the definition are *NOT* consistent with MiscSubclass specification 0.9, in which it is defined as
814    "UINT32" and the total width of bit-fields is 32bits width.
815    Keeping this inconsistency for backward compatibility.
816
817  18. Guid/DataHubRecords.h
818    #define EFI_MISC_SYSTEM_EVENT_LOG_RECORD_NUMBER    0x00000020
819
820    typedef struct {
821      UINT16                            LogAreaLength;
822      UINT16                            LogHeaderStartOffset;
823      UINT16                            LogDataStartOffset;
824      UINT8                             AccessMethod;
825      UINT8                             LogStatus;
826      UINT32                            LogChangeToken;
827      UINT32                            AccessMethodAddress;
828      UINT8                             LogHeaderFormat;
829      UINT8                             NumberOfSupportedLogType;
830      UINT8                             LengthOfLogDescriptor;
831    } EFI_MISC_SYSTEM_EVENT_LOG_DATA;
832
833    #define ACCESS_INDEXIO_1INDEX8BIT_DATA8BIT    0x00
834    #define ACCESS_INDEXIO_2INDEX8BIT_DATA8BIT    0X01
835    #define ACCESS_INDEXIO_1INDEX16BIT_DATA8BIT   0X02
836    #define ACCESS_MEMORY_MAPPED                  0x03
837    #define ACCESS_GPNV                           0x04
838
839    The definitions listed above are *NOT* defined in MiscSubclass specification 0.9. It is introduced to support
840    new system event log (type 15) defined in SmBios 2.6 specification. 
841    Keeping this inconsistency to reflect the latest industry standard.
842
843  19. Guid/DataHubRecords.h
844    #define EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD_RECORD_NUMBER    0x00000021
845
846    typedef struct {
847      UINT16                            LowerThresNonCritical;
848      UINT16                            UpperThresNonCritical;
849      UINT16                            LowerThresCritical;
850      UINT16                            UpperThresCritical;
851      UINT16                            LowerThresNonRecover;
852      UINT16                            UpperThresNonRecover;
853    } EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD;
854
855    The definitions listed above are *NOT* defined in MiscSubclass specification 0.9. It is introduced to support
856    new management device threshold data (type 36) defined in SmBios 2.6 specification. 
857    Keeping this inconsistency to reflect the latest industry standard.
858
859  20. Guid/DataHubRecords.h
860    typedef union {
861      EFI_MISC_LAST_PCI_BUS_DATA                         LastPciBus;
862      ...
863      EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD               MiscManagementDeviceThreshold;
864    } EFI_MISC_SUBCLASS_RECORDS;
865
866    typedef struct {
867      EFI_SUBCLASS_TYPE1_HEADER         Header;
868      EFI_MISC_SUBCLASS_RECORDS         Record;
869    } EFI_MISC_SUBCLASS_DRIVER_DATA;
870
871    The definitions above are *NOT* defined in MemSubclass specification 0.9. EdkII introduces them to simplify the
872    code logic. Therefore developer doesn't need to allocate memory dynamically to construct variable length data record.
873    Keeping this inconsistency for backward compatibility.
874
875  21. Guid/DataHubRecords.h
876    typedef struct {
877      EFI_MISC_COOLING_DEVICE_TYPE      CoolingDeviceType;
878      EFI_INTER_LINK_DATA               CoolingDeviceTemperatureLink;
879      UINT8                             CoolingDeviceUnitGroup;
880      UINT16                            CoolingDeviceNominalSpeed;
881      UINT32                            CoolingDeviceOemDefined;
882    } EFI_MISC_COOLING_DEVICE_TEMP_LINK_DATA;
883
884    The "CoolingDeviceUnitGroup" field and "CoolingDeviceNominalSpeed" field are *NOT* consistent with 
885    MiscSubclass specification 0.9. These fields are aligned with SMBIOS 2.6 specification. And user can easily
886    assign any value to CoolingDeviceNominalSpeed.
887
888  22. Guid/DataHubRecords.h
889    typedef enum {
890      ...
891      EfiSlotDataBusWidth1xOrx1         = 0x8,
892      EfiSlotDataBusWidth2xOrx2         = 0x9,
893      EfiSlotDataBusWidth4xOrx4         = 0xA,
894      EfiSlotDataBusWidth8xOrx8         = 0xB,
895      EfiSlotDataBusWidth12xOrx12       = 0xC,
896      EfiSlotDataBusWidth16xOrx16       = 0xD,
897      EfiSlotDataBusWidth32xOrx32       = 0xE
898    } EFI_MISC_SLOT_DATA_BUS_WIDTH;
899
900    The enumeration fields from "EfiSlotDataBusWidth1xOrx1" to "EfiSlotDataBusWidth32xOrx32" are *NOT* defined in MiscSubclass specification 0.9.
901    They are introduced to support new system slots (type 9) defined in SmBios 2.6 specification.
902    Keeping this inconsistency to reflect the latest industry standard.
903
904  23. Guid/DataHubRecords.h
905    typedef struct {
906      ...
907      UINT16                            TemperatureProbeMaximumValue;
908      UINT16                            TemperatureProbeMinimumValue;
909      UINT16                            TemperatureProbeResolution;
910      UINT16                            TemperatureProbeTolerance;
911      UINT16                            TemperatureProbeAccuracy;
912      UINT16                            TemperatureProbeNominalValue;
913      UINT16                            MDLowerNoncriticalThreshold;
914      UINT16                            MDUpperNoncriticalThreshold;
915      UINT16                            MDLowerCriticalThreshold;
916      UINT16                            MDUpperCriticalThreshold;
917      UINT16                            MDLowerNonrecoverableThreshold;
918      UINT16                            MDUpperNonrecoverableThreshold;
919      ...
920    } EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_DATA;
921
922    The structure fields from "TemperatureProbeMaximumValue" to "MDUpperNonrecoverableThreshold" are *NOT* consistent with MiscSubclass specification 0.9.
923    The specification defines the fields type as EFI_EXP_BASE10_DATA. In fact, they should be UINT16 type because they refer to 16bit width data.
924    Keeping this inconsistency for backward compatibility.
925
926  24. Guid/DataHubRecords.h
927    #define EFI_MISC_IPMI_INTERFACE_TYPE_DATA_RECORD_NUMBER EFI_MISC_IPMI_INTERFACE_TYPE_RECORD_NUMBER
928
929    The definition above is *NOT* defined in MiscSubclass specifications 0.9. It's defined for backward compatibility.
930
931##
932# Mismatch with Intel Platform Innovation Framework for Status Codes Specification (Version 0.92)
933##
934  1. Include/Framework/StatusCode.h
935    #define EFI_IOB_ATA_BUS_SMART_ENABLE               (EFI_SUBCLASS_SPECIFIC | 0x00000000)
936    #define EFI_IOB_ATA_BUS_SMART_DISABLE              (EFI_SUBCLASS_SPECIFIC | 0x00000001)
937    #define EFI_IOB_ATA_BUS_SMART_OVERTHRESHOLD        (EFI_SUBCLASS_SPECIFIC | 0x00000002)
938    #define EFI_IOB_ATA_BUS_SMART_UNDERTHRESHOLD       (EFI_SUBCLASS_SPECIFIC | 0x00000003)
939
940    #define EFI_IOB_ATA_BUS_SMART_NOTSUPPORTED         (EFI_SUBCLASS_SPECIFIC | 0x00000000)
941    #define EFI_IOB_ATA_BUS_SMART_DISABLED             (EFI_SUBCLASS_SPECIFIC | 0x00000001)
942
943    #define EFI_SW_DXE_BS_PC_BEGIN_CONNECTING_DRIVERS  (EFI_SUBCLASS_SPECIFIC | 0x00000005)
944    #define EFI_SW_DXE_BS_PC_VERIFYING_PASSWORD        (EFI_SUBCLASS_SPECIFIC | 0x00000006)
945
946    #define EFI_SW_DXE_RT_PC_S0                        (EFI_SUBCLASS_SPECIFIC | 0x00000000)
947    #define EFI_SW_DXE_RT_PC_S1                        (EFI_SUBCLASS_SPECIFIC | 0x00000001)
948    #define EFI_SW_DXE_RT_PC_S2                        (EFI_SUBCLASS_SPECIFIC | 0x00000002)
949    #define EFI_SW_DXE_RT_PC_S3                        (EFI_SUBCLASS_SPECIFIC | 0x00000003)
950    #define EFI_SW_DXE_RT_PC_S4                        (EFI_SUBCLASS_SPECIFIC | 0x00000004)
951    #define EFI_SW_DXE_RT_PC_S5                        (EFI_SUBCLASS_SPECIFIC | 0x00000005)
952
953    #define EFI_SW_CSM_LEGACY_ROM_INIT                 (EFI_SUBCLASS_SPECIFIC | 0x00000000)
954
955    The definitions above are *NOT* defined in Framework StatusCodes specification 0.92. But these subclass-specific error code
956    operations are needed for EdkII implementation.
957    Keeping this inconsistency for backward compatibility.
958
959  2. Include/Framework/StatusCode.h
960    typedef union {
961      CHAR8   *Ascii;
962      CHAR16  *Unicode;
963      ...
964    } EFI_STATUS_CODE_STRING;
965
966    The definition is *NOT* consistent with Framework SatausCodes specification 0.92, in which the first field is defined as "CHAR8 Ascii[]"
967    and the second field is defined as "CHAR16 Unicode[]". Keeping this inconsistency for backward compatibility.
968
969  3. Include/Framework/StatusCode.h
970    #define EFI_SW_EC_X64_DIVIDE_ERROR      EXCEPT_X64_DIVIDE_ERROR
971    #define EFI_SW_EC_X64_DEBUG             EXCEPT_X64_DEBUG
972    #define EFI_SW_EC_X64_NMI               EXCEPT_X64_NMI
973    #define EFI_SW_EC_X64_BREAKPOINT        EXCEPT_X64_BREAKPOINT
974    #define EFI_SW_EC_X64_OVERFLOW          EXCEPT_X64_OVERFLOW
975    #define EFI_SW_EC_X64_BOUND             EXCEPT_X64_BOUND
976    #define EFI_SW_EC_X64_INVALID_OPCODE    EXCEPT_X64_INVALID_OPCODE
977    #define EFI_SW_EC_X64_DOUBLE_FAULT      EXCEPT_X64_DOUBLE_FAULT
978    #define EFI_SW_EC_X64_INVALID_TSS       EXCEPT_X64_INVALID_TSS
979    #define EFI_SW_EC_X64_SEG_NOT_PRESENT   EXCEPT_X64_SEG_NOT_PRESENT
980    #define EFI_SW_EC_X64_STACK_FAULT       EXCEPT_X64_STACK_FAULT
981    #define EFI_SW_EC_X64_GP_FAULT          EXCEPT_X64_GP_FAULT
982    #define EFI_SW_EC_X64_PAGE_FAULT        EXCEPT_X64_PAGE_FAULT
983    #define EFI_SW_EC_X64_FP_ERROR          EXCEPT_X64_FP_ERROR
984    #define EFI_SW_EC_X64_ALIGNMENT_CHECK   EXCEPT_X64_ALIGNMENT_CHECK
985    #define EFI_SW_EC_X64_MACHINE_CHECK     EXCEPT_X64_MACHINE_CHECK
986    #define EFI_SW_EC_X64_SIMD              EXCEPT_X64_SIMD
987
988    The definitions are *NOT* defined in Framework StatusCodes specification 0.92, in which IA32 and IPF exception subclass error code definitions
989    are defined but omit the corresponding definitions for X64. EdkII introduce these definitions for implementation. 
990
991##
992# Mismatch with Intel Platform Innovation Framework for EFI Boot Script Specification (Version 0.91)
993##
994  1. Include/Protocol/BootScriptSave.h
995    #define EFI_BOOT_SCRIPT_SAVE_PROTOCOL_GUID \
996    { \
997      0x470e1529, 0xb79e, 0x4e32, {0xa0, 0xfe, 0x6a, 0x15, 0x6d, 0x29, 0xf9, 0xb2 } \
998    }
999
1000    The macro name "EFI_BOOT_SCRIPT_SAVE_PROTOCOL_GUID" is *NOT* consistent with Framework BootScript specification 0.91,
1001    in which it's defined as "EFI_BOOT_SCRIPT_SAVE_GUID". Keeping this inconsistency for backward compatibility.
1002
1003  2. Include/Protocol/BootScriptSave.h
1004    EFI_STATUS
1005    EFI_BOOTSERVICE
1006    (EFIAPI *EFI_BOOT_SCRIPT_WRITE) (
1007      IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL            *This,
1008      ...
1009    );
1010
1011    The first parameter's type is *NOT* consistent with Framework BootScript specification 0.91, in which it's defined as
1012    "struct _EFI_BOOT_SCRIPT_SAVE_PROTOCOL". Keeping this inconsistency for backward compatibility.
1013
1014  3. Include/Framework/BootScript.h
1015    #define EFI_BOOT_SCRIPT_MEM_POLL_OPCODE               0x09
1016    #define EFI_BOOT_SCRIPT_INFORMATION_OPCODE            0x0A
1017    #define EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE      0x0B
1018    #define EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE 0x0C
1019    #define EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE             0x0D
1020
1021    The OPCODEs above are not defined in Framework BootScript Specification 0.91, but adopted by PI 1.0 Spec. And they
1022    are needed for EdkII implementation.
1023
1024  4. Include/Framework/BootScript.h
1025    #define EFI_BOOT_SCRIPT_TABLE_OPCODE                  0xAA
1026    #define EFI_BOOT_SCRIPT_TERMINATE_OPCODE              0xFF
1027
1028    The two OPCODEs are *NOT* defined in Framework BootScript specification 0.91. EdkII introduces them to indicate the start
1029    or end of the boot script table.
1030    Keeping this inconsistency for backward compatibility.
1031
1032  5. Include/Protocol/BootScriptSave.h
1033    typedef  
1034    EFI_STATUS  
1035    (EFIAPI *EFI_BOOT_SCRIPT_CLOSE_TABLE) (
1036      IN  EFI_BOOT_SCRIPT_SAVE_PROTOCOL            *This,
1037      ...
1038      );
1039
1040    The first parameter's type is *NOT* consistent with BootScript specification, in which it's defined as
1041    "struct _EFI_BOOT_SCRIPT_SAVE_PROTOCOL". Keeping this inconsistency for backward compatibility.
1042
1043  6. Include/Include/BootScriptExecuter.h
1044    typedef
1045    EFI_STATUS
1046    (EFIAPI *EFI_PEI_BOOT_SCRIPT_EXECUTE)(
1047      IN     EFI_PEI_SERVICES                        **PeiServices,
1048      IN     EFI_PEI_BOOT_SCRIPT_EXECUTER_PPI        *This,
1049      ...
1050      );
1051
1052    The second parameter's type is *NOT* consistent with BootScript specification, in which it's defined as
1053    "struct _EFI_PEI_BOOT_SCRIPT_EXECUTER_PPI". Keeping this inconsistency for backward compatibility.
1054
1055##
1056# Mismatch with Intel Platform Innovation Framework for EFI DXE CIS (Version 0.91)
1057##
1058  1. Include/Framework/DxeCis.h
1059    EFI_STATUS_CODE_ARCH_PROTOCOL is removed.
1060    
1061    EdkII doesn't provide EFI_STATUS_CODE_ARCH_PROTOCOL definition due to ReportStatusCode() field has been
1062    removed from EFI Runtime Service Table of PI specification. EFI_STATUS_CODE_ARCH_PROTOCOL is *NOT* required,
1063    and is replaced with EFI_STATUS_CODE_RUNTIME_PROTOCOL.
1064
1065##
1066# Mismatch with Intel Platform Innovation Framework for EFI Firmware Volume Specification (Version 0.9)
1067##
1068  1. Include/Framework/FirmwareVolumeImageFormat.h
1069    #define EFI_AGGREGATE_AUTH_STATUS_ALL               0x00000f
1070    #define EFI_LOCAL_AUTH_STATUS_ALL                   0x0f0000
1071
1072    The two macros are *NOT* defined in Framework FV specification 0.9. EdkII introduces them as a mask to calculate the
1073    value of authentication status.
1074
1075##
1076# Mismatch with Intel Platform Innovation Framework for EFI Human Interface Infrastructure Specification (Version 0.92)
1077##
1078  1. Include/Protocol/FrameworkHii.h
1079    #define EFI_HII_PROTOCOL_GUID \
1080      { \
1081        0xd7ad636e, 0xb997, 0x459b, {0xbf, 0x3f, 0x88, 0x46, 0x89, 0x79, 0x80, 0xe1} \
1082      }
1083
1084    The Framework HII specification 0.92 changed part of HII interfaces but did not update the protocol GUID.
1085    This change should cause a change of GUID in both of code and HII spec. EdkII updates the GUID in code, 
1086    but the Framework HII specification 0.92 is not updated. This is a known issue.
1087
1088  2. Include/Protocol/FrameworkHii.h
1089    typedef struct {
1090      ...
1091      EFI_HANDLE          COBExportHandle;
1092    } EFI_HII_HANDLE_PACK;
1093
1094    The last field "COBExportHandle" of EFI_HII_HANDLE_PACK is *NOT* defined in the Framework HII specification
1095    0.92. Keeping this inconsistency for backward compatibility.
1096
1097  3. Include/Protocol/FrameworkHii.h
1098    typedef struct {
1099      UINTN     NumberOfPackages;
1100      EFI_GUID  *GuidId;
1101    } EFI_HII_PACKAGES;
1102
1103    The definition is *NOT* consistent with Framework HII specification 0.92, in which a field "HandlePack" is defined.
1104    EdkII changes the EFI_HII_PACKAGES to contain various number of packages of different types just after the structure
1105    as inline data, which will bring the flexibility on development.
1106
1107  4. Include/Protocol/FrameworkHii.h
1108    struct _EFI_HII_PROTOCOL {
1109      ...
1110      EFI_HII_RESET_STRINGS                 ResetStrings;
1111      ...
1112    };
1113
1114    The field listed above is *NOT* defined in Framework HII specification 0.92. EdkII adds this field to provide 
1115    an ability of removing any new strings that were added after the initial string export for this handle.  
1116
1117  5. Include/Protocol/FrameworkHii.h
1118    typedef
1119    EFI_STATUS
1120    (EFIAPI *EFI_HII_GLYPH_TO_BLT)(
1121      ...
1122      IN     EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground,
1123      IN     EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background,
1124      ...
1125      IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer
1126      );
1127
1128    The type of the parameters listed above are *NOT* consistent with Framework HII specification 0.92, in which
1129    the type of these parameters is EFI_UGA_PIXEL. Here the definition uses the EFI_GRAPHICS_OUTPUT_BLT_PIXEL which
1130    defined in UEFI2.1 spec. Keeping this inconsistency for backward compatibility.
1131
1132  6. Include/Protocol/FrameworkHii.h
1133    typedef struct {
1134      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
1135      UINT8                             Flags;
1136    } EFI_IFR_SUPPRESS;
1137    
1138    typedef struct {
1139      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
1140      UINT8                             Flags;
1141    } EFI_IFR_GRAY_OUT;
1142    
1143    typedef struct {
1144      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
1145      STRING_REF                        Popup;
1146      UINT8                             Flags;
1147    } EFI_IFR_INCONSISTENT;
1148    
1149    typedef struct {
1150      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
1151      UINT16                            QuestionId;
1152      UINT8                             Width;
1153      UINT16                            Value;
1154    } FRAMEWORK_EFI_IFR_EQ_ID_VAL;
1155    
1156    typedef struct {
1157      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
1158      UINT16                            QuestionId;
1159      UINT8                             Width;
1160      UINT16                            ListLength;
1161      UINT16                            ValueList[1];
1162    } FRAMEWORK_EFI_IFR_EQ_ID_LIST;
1163    
1164    typedef struct {
1165      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
1166      UINT16                            QuestionId1;
1167      UINT8                             Width;
1168      UINT16                            QuestionId2;
1169    } FRAMEWORK_EFI_IFR_EQ_ID_ID;
1170    
1171    typedef struct {
1172      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
1173      UINT16                            VariableId;
1174      UINT16                            Value;
1175    } EFI_IFR_EQ_VAR_VAL;
1176
1177    The defintions are not complied with Framework HII spec 0.92. Keeping the inconsistent for implementation needed.
1178
1179  7. Include/Protocol/FrameworkFormCallback.h
1180    #define RESET_REQUIRED  1 
1181    #define EXIT_REQUIRED   2
1182    #define SAVE_REQUIRED   4
1183    #define NV_CHANGED      8
1184    #define NV_NOT_CHANGED  16
1185
1186    These macros are *NOT* defined in the Framework HII specification 0.92. These Flags are introduced to describe
1187    the standard behavior of the browser after the callback.
1188    Keeping this inconsistency for backward compatibility.
1189
1190  8. Include/Protocol/FrameworkFormCallback.h
1191    typedef
1192    EFI_STATUS
1193    (EFIAPI *EFI_NV_WRITE)(
1194      ...
1195      IN     UINT32                        Attributes,
1196      ...
1197      );
1198
1199    The definition is *NOT* consistent with Framework HII specification 0.92, in which the type of Attributes
1200    parameter is defined as "UINT32 *". EdkII changes the type of Attributes from UINT32 * to UINT32 because
1201    the input paramter is not necessary to use pointer date type.
1202
1203##
1204# Mismatch with Intel Platform Innovation Framework for PEI CIS Specification (Version 0.91)
1205##
1206  1. Include/Ppi/ReadOnlyVariable.h
1207    #define EFI_VARIABLE_READ_ONLY          0x00000008
1208
1209    In Framework PeiCis specification 0.91, neither the macro or its value is defined.
1210    Keeping this inconsistency for backward compatibility.
1211
1212  2. Include/Ppi/FindFv.h
1213    typedef
1214    EFI_STATUS
1215    (EFIAPI *EFI_PEI_FIND_FV_FINDFV)(
1216      IN EFI_PEI_FIND_FV_PPI             *This,
1217      IN EFI_PEI_SERVICES                **PeiServices,
1218      IN UINT8                           *FvNumber,
1219      IN OUT EFI_FIRMWARE_VOLUME_HEADER  **FVAddress
1220      );
1221
1222    The definition is *NOT* consistent with Framework PeiCis specification 0.91. Compared with spec, the order
1223    of the first and second parameters is reversed. Keeping this inconsistency for backward compatibility.
1224
1225##
1226# Mismatch with Intel Platform Innovation Framework for EFI SMM CIS (Version 0.91)
1227##
1228  1. Include/Guid/SmramMemoryReserve.h
1229    typedef struct {
1230      UINT32                NumberOfSmmReservedRegions;
1231      ...
1232    } EFI_SMRAM_HOB_DESCRIPTOR_BLOCK;
1233
1234    1) The name of the definition is *NOT* consistent with Framework SmmCis specification 0.91, in which it's 
1235    defined as "EFI_HOB_SMRAM_DESCRIPTOR_BLOCK" rather than "EFI_SMRAM_HOB_DESCRIPTOR_BLOCK". 
1236    Keeping this inconsistency for backward compatibility.
1237
1238    2) The definition of NumberOfSmmReservedRegions is *NOT* consistent with Framework SmmCis specification 0.91,
1239    in which the type of this field is defined as UINTN. However, HOBs are supposed to be CPU neutral, so UINTN
1240    is incorrect and UINT32 should be used.
1241
1242  2. Include/Guid/SmramMemoryReserve.h
1243    typedef enum {
1244      ...
1245      IchnIoTrap3,
1246      IchnIoTrap2,
1247      IchnIoTrap1,
1248      IchnIoTrap0,
1249      IchnPciExpress,
1250      IchnMonitor,
1251      IchnSpi,
1252      IchnQRT,
1253      IchnGpioUnlock,
1254      ...
1255    } EFI_SMM_ICHN_SMI_TYPE;
1256
1257    The enumeration fields listed above are *NOT* defined in Framework SmmCis specification 0.91. EdkII introduces
1258    these fields to support new SMI types.
1259
1260  3. Include/Framework/SmmCis.h
1261    typedef union {
1262      ///
1263      /// The processor save-state information for IA-32 processors. 
1264      ///
1265      EFI_SMI_CPU_SAVE_STATE     Ia32SaveState;
1266      ///
1267      /// Note: Inconsistency with the Framework SMM CIS spec - Itanium save state not included.
1268      ///
1269      /// The processor save-state information for Itanium processors.
1270      ///
1271      /// EFI_PMI_SYSTEM_CONTEXT ItaniumSaveState;
1272    } EFI_SMM_CPU_SAVE_STATE;
1273
1274##
1275# Mismatch with Intel Platform Innovation Framework for EFI S3 Resume Boot Path Specification (Version 0.9)
1276##
1277  1. Include/Protocol/AcpiS3Save.h
1278    typedef
1279    EFI_STATUS
1280    EFI_BOOTSERVICE
1281    (EFIAPI *EFI_ACPI_GET_LEGACY_MEMORY_SIZE) (
1282      IN  EFI_ACPI_S3_SAVE_PROTOCOL *This,
1283      OUT UINTN *Size
1284      );
1285
1286    The first parameter's type is *NOT* consistent with Framework S3Resume specification, in which it's defined as
1287    "struct _EFI_ACPI_S3_SAVE_PROTOCOL". Keeping this inconsistency for backward compatibility.
1288
1289  2. Include/Protocol/AcpiS3Save.h
1290    typedef
1291    EFI_STATUS
1292    (EFIAPI *EFI_ACPI_S3_SAVE) (
1293      IN EFI_ACPI_S3_SAVE_PROTOCOL      *This,
1294      IN VOID                           *LegacyMemoryAddress 
1295      );
1296
1297    The first parameter's type is *NOT* consistent with Framework S3Resume specification, in which it's defined as
1298    "struct _EFI_ACPI_S3_SAVE_PROTOCOL". Also the EFI_BOOTSERVICE modifier is removed from the function declaration.
1299
1300  3. Include/Protocol/AcpiS3Save.h
1301    typedef
1302    EFI_STATUS
1303    (EFIAPI *EFI_ACPI_GET_LEGACY_MEMORY_SIZE)(
1304      IN  EFI_ACPI_S3_SAVE_PROTOCOL     *This,
1305      OUT UINTN                         *Size
1306    );
1307
1308    The first parameter's type is *NOT* consistent with Framework S3Resume specification, in which it's defined as
1309    "struct _EFI_ACPI_S3_SAVE_PROTOCOL". Also the EFI_BOOTSERVICE modifier is removed from the function declaration.
1310
1311##
1312# Mismatch with Intel Platform Innovation Framework for EFI ACPI Specification (Version 0.91)
1313##
1314  1. Include/Protocol/AcpiSupport.h
1315    typedef
1316    EFI_STATUS
1317    (EFIAPI *EFI_ACPI_GET_ACPI_TABLE)(
1318      ...
1319      );
1320
1321    The function modifier is *NOT* consistent with Framework Acpi specification. The EFI_BOOTSERVICE modifier
1322    is removed from the function declaration.
1323
1324  2. Include/Protocol/AcpiSupport.h
1325    typedef
1326    EFI_STATUS
1327    (EFIAPI *EFI_ACPI_SET_ACPI_TABLE)(
1328      ...
1329      );
1330
1331    The function modifier is *NOT* consistent with Framework Acpi specification. The EFI_BOOTSERVICE modifier
1332    is removed from the function declaration.
1333
1334  3. Include/Protocol/AcpiSupport.h
1335    typedef
1336    EFI_STATUS
1337    (EFIAPI *EFI_ACPI_PUBLISH_TABLES)(
1338      ...
1339      );
1340
1341    The function modifier is *NOT* consistent with Framework Acpi specification. The EFI_BOOTSERVICE modifier
1342    is removed from the function declaration.
1343