##
# This file is used to document mismatches between Intel Platform Innovation Framework specification
# (http://www.intel.com/technology/framework/spec.htm) and data structures defind at IntelFrameworkPkg
# package in EdkII Open Source Project (https://edk2.tianocore.org/source/browse/edk2/trunk/edk2/IntelFrameworkPkg)
##

##
# The general consideration about keeping the mismatches in EdkII:
# 1. Some definitions defined in Framework specification may bring a little complexity on implementation. EdkII
#    makes changes on them from the view of code development.
# 2. Some definitions are NOT defined in Framework specification, but introduced in Edk. EdkII chooses to keep
#    them for backward-compatibility.
# 3. The name of some definitions are NOT consistent with Framework specification. If the name doesn't bring
#    misunderstanding literally, EdkII chooses to keep them for backward-compatibility.
# 4. Some defintitions don't exactly match Framework specification, some new field members are introduced in EdkII
#    to reflect the latest industry standard.
#
# Note: 
#    The IntelFrameworkPkg contains Framework specification contents that were not adopted by UEFI/PI, and names may be
#    changed (such as adding "FRAMEWORK_") to avoid name collisions with approved UEFI/PI specifications.
##

##
# Mismatch with Intel Platform Innovation Framework for DataHubSubclass Specification (Version 0.90)
##
  1. Guid/DataHubRecords.h
    #define EFI_STRING_TOKEN          UINT16

    This macro named "EFI_STRING_TOKEN" is *NOT* defined in Framework specification. Keeping this inconsistency
    for backward compatibility.

  2. Guid/DataHubRecords.h
    #pragma pack(1)
    typedef struct {
      UINT8                             LastPciBus;
    } EFI_MISC_LAST_PCI_BUS_DATA;
    ...
    typedef struct {
      EFI_SUBCLASS_TYPE1_HEADER         Header;
      EFI_MISC_SUBCLASS_RECORDS         Record;
    } EFI_MISC_SUBCLASS_DRIVER_DATA;
    #pragma pack()

    Section "Alignment" in DataHubSubclass specification say "Fields in a data hub record should be aligned at their
    natural boundaries". But in EdkII, the data structures above are packed. 
    Keeping this inconsistency for backward compatibility.
    
  3. Guid/DataHubRecords.h
    #define EFI_SUBCLASS_INSTANCE_RESERVED       0
    #define EFI_SUBCLASS_INSTANCE_NON_APPLICABLE 0xFFFF

    The symbols above are *NOT* defined in DataHubSubclass specification. But the values are defined and are meaningful.
    According to DataHubSubclass spec, value 0 means Reserved and -1 means Not Applicable. EdkII introduces these macros
    to faciliate user development.

##
# Mismatch with Intel Platform Innovation Framework for CacheSubclass Specification (Version 0.90)
##
  1. Guid/DataHubRecords.h
    typedef EFI_EXP_BASE2_DATA       EFI_MAXIMUM_CACHE_SIZE_DATA;

    The definition named "EFI_MAXIMUM_CACHE_SIZE_DATA" is *NOT* consistent with CacheSubclass specification, in which
    the name should be EFI_CACHE_MAXIMUM_SIZE_DATA. Keeping this inconsistency for backward compatibility.

  2. Guid/DataHubRecords.h
    typedef struct {
      UINT32                          Level           :3;
      UINT32                          Socketed        :1;
      UINT32                          Reserved2       :1;
      UINT32                          Location        :2;
      UINT32                          Enable          :1;
      UINT32                          OperationalMode :2;
      UINT32                          Reserved1       :22;
    } EFI_CACHE_CONFIGURATION_DATA;

    The field type of the definition is *NOT* consistent with CacheSubclass specification. Specification defines
    them as UINT16, which is incorrect and should be UINT32 because the total width of bit-fields is 32bits width.
    
  3. Guid/DataHubRecords.h
    typedef enum {
      CacheSizeRecordType              = 1,
      MaximumSizeCacheRecordType       = 2,
      CacheSpeedRecordType             = 3,
      CacheSocketRecordType            = 4,
      CacheSramTypeRecordType          = 5,
      CacheInstalledSramTypeRecordType = 6,
      CacheErrorTypeRecordType         = 7,
      CacheTypeRecordType              = 8,
      CacheAssociativityRecordType     = 9,
      CacheConfigRecordType            = 10
    } EFI_CACHE_VARIABLE_RECORD_TYPE;

    The data structure and all enumeration fields are *NOT* defined in CacheSubclass specification, which only
    defines the following macros to specify the record number of the data record:
      #define EFI_CACHE_SIZE_RECORD_NUMBER                    0x00000001
      #define EFI_CACHE_MAXIMUM_SIZE_RECORD_NUMBER            0x00000002
      #define EFI_CACHE_SPEED_RECORD_NUMBER                   0x00000003
      #define EFI_CACHE_SOCKET_RECORD_NUMBER                  0x00000004
      #define EFI_CACHE_SRAM_SUPPORT_RECORD_NUMBER            0x00000005 
      #define EFI_CACHE_SRAM_INSTALL_RECORD_NUMBER            0x00000006 
      #define EFI_CACHE_ERROR_SUPPORT_RECORD_NUMBER           0x00000007
      #define EFI_CACHE_TYPE_RECORD_NUMBER                    0x00000008
      #define EFI_CACHE_ASSOCIATIVITY_RECORD_NUMBER           0x00000009
      #define EFI_CACHE_CONFIGURATION_RECORD_NUMBER           0x0000000A
    Keeping this inconsistency for backward compatibility.

  4. Guid/DataHubRecords.h
    typedef union {
      EFI_CACHE_SIZE_DATA               CacheSize;
      ...
      EFI_CACHE_ASSOCIATION_DATA        CacheAssociation;
    } EFI_CACHE_VARIABLE_RECORD;

    typedef struct {
       EFI_SUBCLASS_TYPE1_HEADER        DataRecordHeader;
       EFI_CACHE_VARIABLE_RECORD        VariableRecord;
    } EFI_CACHE_DATA_RECORD;

    The definitions above are *NOT* defined in CacheSubclass specification. EdkII introduces them to simplify the
    code logic. Therefore developer doesn't need to allocate memory dynamically to construct variable length data record.
    Keeping this inconsistency for backward compatibility.

##
# Mismatch with Intel Platform Innovation Framework for ProcSubclass Specification (Version 0.90)
##
  1. Guid/DataHubRecords.h
    #define EFI_PROCESSOR_SUBCLASS_VERSION    0x00010000

    The value of the definition is *NOT* consistent with ProcSubclass specification, in which the value is 0x0100.
    Keeping this inconsistency from the perspective of binary consistency.

  2. Guid/DataHubRecords.h
    typedef struct {
      UINT32                            ProcessorBrandIndex    :8;
      UINT32                            ProcessorClflush       :8;
      UINT32                            ProcessorReserved      :8;
      UINT32                            ProcessorDfltApicId    :8;
    } EFI_PROCESSOR_MISC_INFO;

    The definition is *NOT* consistent with ProcSubclass specification, in which the name of third field is defined
    as "LogicalProcessorCount" rather than "ProcessorReserved".
    Keeping this inconsistency for backward compatibility.

  3. Guid/DataHubRecords.h
    typedef enum {
      ...
      EfiProcessorFamilyUltraSparcIIIi         = 0x58,
      ...
      EfiProcessorFamilyIntelPentiumM          = 0xB9,
      EfiProcessorFamilyIntelCeleronD          = 0xBA,
      EfiProcessorFamilyIntelPentiumD          = 0xBB,
      EfiProcessorFamilyIntelPentiumEx         = 0xBC,
      EfiProcessorFamilyIntelCoreSolo          = 0xBD,  
      EfiProcessorFamilyReserved               = 0xBE,  
      EfiProcessorFamilyIntelCore2             = 0xBF,
      ...
      EfiProcessorFamilyG6                     = 0xCB,
      EfiProcessorFamilyzArchitectur           = 0xCC,
      EfiProcessorFamilyViaC7M                 = 0xD2,
      EfiProcessorFamilyViaC7D                 = 0xD3,
      EfiProcessorFamilyViaC7                  = 0xD4,
      EfiProcessorFamilyViaEden                = 0xD5,
      ...
      EfiProcessorFamilyIndicatorFamily2       = 0xFE,
      EfiProcessorFamilyReserved1              = 0xFF
    } EFI_PROCESSOR_FAMILY_DATA;

    a. In ProcSubclass specification 0.9, the field name whose value equals to 0x58 is "EfiProcessorFamilyUltraSparcIIi".
       Due to the name has been defined in previous field, changing it to "EfiProcessorFamilyUltraSparcIIIi" to avoid
       build break.
    b. The other fields listed here are *NOT* defined in ProcSubclass specification 0.9. They are introduced to
       support new processor family (type 4) defined in SmBios 2.6 specification.
       Keeping this inconsistency to reflect the latest industry standard.

  4. Guid/DataHubRecords.h
    typedef enum {
      ...
      EfiProcessorSocket939              = 0x12,
      EfiProcessorSocketmPGA604          = 0x13,
      EfiProcessorSocketLGA771           = 0x14,
      EfiProcessorSocketLGA775           = 0x15
    } EFI_PROCESSOR_SOCKET_TYPE_DATA;

    The fields listed here are *NOT* defined in ProcSubclass specification 0.9. They are introduced to support
    new processor upgrade (type 4 offset 19h) defined in SmBios 2.6 specification. 
    Keeping this inconsistency to reflect the latest industry standard.

  5. Guid/DataHubRecords.h
    typedef EFI_INTER_LINK_DATA         EFI_CACHE_ASSOCIATION_DATA;

    The definition name "EFI_CACHE_ASSOCIATION_DATA" is *NOT* consistent with ProcSubclass specification 0.9, in which
    the name should be "EFI_PROCESSOR_CACHE_ASSOCIATION_DATA". Keeping this inconsistency for backward compatibility.

  6. Guid/DataHubRecords.h
    typedef enum {
      EfiProcessorHealthy        = 1,
      EfiProcessorPerfRestricted = 2,
      EfiProcessorFuncRestricted = 3 
    } EFI_PROCESSOR_HEALTH_STATUS;

    The structure name "EFI_PROCESSOR_HEALTH_STATUS" is *NOT* consistent with ProcSubclass specification 0.9, in which
    the name should be "EFI_PROCESSOR_HEALTH_STATUS_DATA". Keeping this inconsistency for backward compatibility.

  7. Guid/DataHubRecords.h
    typedef enum {
      ProcessorCoreFrequencyRecordType     = 1,
      ProcessorFsbFrequencyRecordType      = 2,
      ProcessorVersionRecordType           = 3,
      ProcessorManufacturerRecordType      = 4,
      ProcessorSerialNumberRecordType      = 5,
      ProcessorIdRecordType                = 6,
      ProcessorTypeRecordType              = 7,
      ProcessorFamilyRecordType            = 8,
      ProcessorVoltageRecordType           = 9,
      ProcessorApicBaseAddressRecordType   = 10,
      ProcessorApicIdRecordType            = 11,
      ProcessorApicVersionNumberRecordType = 12,
      CpuUcodeRevisionDataRecordType       = 13,
      ProcessorStatusRecordType            = 14,
      ProcessorSocketTypeRecordType        = 15,
      ProcessorSocketNameRecordType        = 16,
      CacheAssociationRecordType           = 17,
      ProcessorMaxCoreFrequencyRecordType  = 18,
      ProcessorAssetTagRecordType          = 19,
      ProcessorMaxFsbFrequencyRecordType   = 20,
      ProcessorPackageNumberRecordType     = 21,
      ProcessorCoreFrequencyListRecordType = 22,
      ProcessorFsbFrequencyListRecordType  = 23,
      ProcessorHealthStatusRecordType      = 24,
      ProcessorCoreCountRecordType         = 25,
      ProcessorEnabledCoreCountRecordType  = 26,
      ProcessorThreadCountRecordType       = 27,
      ProcessorCharacteristicsRecordType   = 28,
      ProcessorFamily2RecordType           = 29,
      ProcessorPartNumberRecordType        = 30,
    } EFI_CPU_VARIABLE_RECORD_TYPE;

    The enumeration fields from ProcessorCoreFrequencyRecordType to ProcessorHealthStatusRecordType are *NOT* defined 
    in ProcSubclass specification 0.9, which only defines the following macros to specify the record number of the data record:
      #define EFI_PROCESSOR_FREQUENCY_RECORD_NUMBER           0x00000001
      #define EFI_PROCESSOR_BUS_FREQUENCY_RECORD_NUMBER       0x00000002
      #define EFI_PROCESSOR_VERSION_RECORD_NUMBER             0x00000003
      #define EFI_PROCESSOR_MANUFACTURER_RECORD_NUMBER        0x00000004
      #define EFI_PROCESSOR_SERIAL_NUMBER_RECORD_NUMBER       0x00000005
      #define EFI_PROCESSOR_ID_RECORD_NUMBER                  0x00000006
      #define EFI_PROCESSOR_TYPE_RECORD_NUMBER                0x00000007
      #define EFI_PROCESSOR_FAMILY_RECORD_NUMBER              0x00000008
      #define EFI_PROCESSOR_VOLTAGE_RECORD_NUMBER             0x00000009
      #define EFI_PROCESSOR_APIC_BASE_ADDRESS_RECORD_NUMBER   0x0000000A
      #define EFI_PROCESSOR_APIC_ID_RECORD_NUMBER             0x0000000B
      #define EFI_PROCESSOR_APIC_VER_NUMBER_RECORD_NUMBER     0x0000000C
      #define EFI_PROCESSOR_MICROCODE_REVISION_RECORD_NUMBER  0x0000000D
      #define EFI_PROCESSOR_STATUS_RECORD_NUMBER              0x0000000E
      #define EFI_PROCESSOR_SOCKET_TYPE_RECORD_NUMBER         0x0000000F
      #define EFI_PROCESSOR_SOCKET_NAME_RECORD_NUMBER         0x00000010
      #define EFI_PROCESSOR_CACHE_ASSOCIATION_RECORD_NUMBER   0x00000011
      #define EFI_PROCESSOR_MAX_FREQUENCY_RECORD_NUMBER       0x00000012
      #define EFI_PROCESSOR_ASSET_TAG_RECORD_NUMBER           0x00000013
      #define EFI_PROCESSOR_MAX_FSB_FREQUENCY_RECORD_NUMBER   0x00000014
      #define EFI_PROCESSOR_PACKAGE_NUMBER_RECORD_NUMBER      0x00000015
      #define EFI_PROCESSOR_FREQUENCY_LIST_RECORD_NUMBER      0x00000016
      #define EFI_PROCESSOR_FSB_FREQUENCY_LIST_RECORD_NUMBER  0x00000017
      #define EFI_PROCESSOR_HEALTH_STATUS_RECORD_NUMBER       0x00000018
    Keeping this inconsistency for backward compatibility.

    The enumeration fields from ProcessorCoreCountRecordType to ProcessorPartNumberRecordType are *NOT* defined 
    in ProcSubclass specification 0.9. 
    They are introduced to support new fields for type 4 defined in SmBios 2.6 specification.
    Keeping this inconsistency to reflect the latest industry standard.

  8. Guid/DataHubRecords.h
    typedef union {
      EFI_PROCESSOR_CORE_FREQUENCY_LIST_DATA  ProcessorCoreFrequencyList;
      ...
      EFI_PROCESSOR_FAMILY2_DATA              ProcessorFamily2;
    } EFI_CPU_VARIABLE_RECORD;
    
    typedef struct {
      EFI_SUBCLASS_TYPE1_HEADER         DataRecordHeader;
      EFI_CPU_VARIABLE_RECORD           VariableRecord;
    } EFI_CPU_DATA_RECORD;

    The definitions above are *NOT* defined in ProcSubclass specification 0.9. EdkII introduces them to simplify the
    code logic. Therefore developer doesn't need to allocate memory dynamically to construct variable length data record.
    Keeping this inconsistency for backward compatibility.

  9. Guid/DataHubRecords.h
    typedef STRING_REF                  EFI_PROCESSOR_PART_NUMBER_DATA;

    typedef enum {
      EfiProcessorFamilySh3           = 0x104,
      EfiProcessorFamilySh4           = 0x105,
      EfiProcessorFamilyArm           = 0x118,
      EfiProcessorFamilyStrongArm     = 0x119,
      EfiProcessorFamily6x86          = 0x12C,
      EfiProcessorFamilyMediaGx       = 0x12D,
      EfiProcessorFamilyMii           = 0x12E,
      EfiProcessorFamilyWinChip       = 0x140,
      EfiProcessorFamilyDsp           = 0x15E,
      EfiProcessorFamilyVideo         = 0x1F4
    } EFI_PROCESSOR_FAMILY2_DATA;

    typedef UINT8                       EFI_PROCESSOR_CORE_COUNT_DATA;

    typedef UINT8                       EFI_PROCESSOR_ENABLED_CORE_COUNT_DATA;

    typedef UINT8                       EFI_PROCESSOR_THREAD_COUNT_DATA;

    typedef struct {
      UINT16  Reserved              :1;
      UINT16  Unknown               :1;
      UINT16  Capable64Bit          :1;
      UINT16  Reserved2             :13;
    } EFI_PROCESSOR_CHARACTERISTICS_DATA;

    The fields listed here are *NOT* defined in ProcSubclass specification 0.9. They are introduced to support
    new fields for type 4 defined in SmBios 2.6 specification. 
    Keeping this inconsistency to reflect the latest industry standard.

##
# Mismatch with Intel Platform Innovation Framework for MemSubclass Specification (Version 0.90)
##
  1. Guid/DataHubRecords.h
    typedef enum _EFI_MEMORY_FORM_FACTOR {
      ...
      EfiMemoryFormFactorFbDimm                   = 0x0F
    } EFI_MEMORY_FORM_FACTOR;
    
    typedef enum _EFI_MEMORY_ARRAY_TYPE {
      ...
      EfiMemoryTypeDdr2                           = 0x13,
      EfiMemoryTypeDdr2FbDimm                     = 0x14
    } EFI_MEMORY_ARRAY_TYPE;
    
    typedef enum {
      ...
      EfiMemoryStatePartial      = 6
    } EFI_MEMORY_STATE;

    The fields listed above are *NOT* defined in MemSubclass specification 0.9. They are introduced to support
    new memory device (type 17) defined in SmBios 2.6 specification. 
    Keeping this inconsistency to reflect the latest industry standard.

  2. Guid/DataHubRecords.h
    typedef struct { 
      ...
      EFI_EXP_BASE10_DATA      MemorySpeed; 
      ...
    } EFI_MEMORY_ARRAY_LINK_DATA;

    The field name "MemorySpeed" in the definition above is *NOT* consistent with MemSubclass specification 0.9,
    in which it is defined as MemoryTypeSpeed. Keeping this inconsistency for backward compatibility.

  3. Guid/DataHubRecords.h
    #define EFI_MEMORY_CONTROLLER_INFORMATION_RECORD_NUMBER    0x00000008

    typedef enum {  
      EfiErrorDetectingMethodOther   = 1,
      EfiErrorDetectingMethodUnknown = 2,
      EfiErrorDetectingMethodNone    = 3,
      EfiErrorDetectingMethodParity  = 4,
      EfiErrorDetectingMethod32Ecc   = 5,
      EfiErrorDetectingMethod64Ecc   = 6,
      EfiErrorDetectingMethod128Ecc  = 7,
      EfiErrorDetectingMethodCrc     = 8
    } EFI_MEMORY_ERROR_DETECT_METHOD_TYPE;

    typedef struct {
      UINT8                             Other                 :1;
      UINT8                             Unknown               :1;
      UINT8                             None                  :1;
      UINT8                             SingleBitErrorCorrect :1;
      UINT8                             DoubleBitErrorCorrect :1;
      UINT8                             ErrorScrubbing        :1;
      UINT8                             Reserved              :2;
    } EFI_MEMORY_ERROR_CORRECT_CAPABILITY;

    typedef enum {  
      EfiMemoryInterleaveOther      = 1,
      EfiMemoryInterleaveUnknown    = 2,
      EfiMemoryInterleaveOneWay     = 3,
      EfiMemoryInterleaveTwoWay     = 4,
      EfiMemoryInterleaveFourWay    = 5,
      EfiMemoryInterleaveEightWay   = 6,
      EfiMemoryInterleaveSixteenWay = 7
    } EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE;

    typedef struct {
      UINT16                            Other    :1;
      UINT16                            Unknown  :1;
      UINT16                            SeventyNs:1;
      UINT16                            SixtyNs  :1;
      UINT16                            FiftyNs  :1;
      UINT16                            Reserved :11;
    } EFI_MEMORY_SPEED_TYPE;

    typedef struct {
      UINT16                            Other       :1;
      UINT16                            Unknown     :1;
      UINT16                            Standard    :1;
      UINT16                            FastPageMode:1;
      UINT16                            EDO         :1;
      UINT16                            Parity      :1;
      UINT16                            ECC         :1;
      UINT16                            SIMM        :1;
      UINT16                            DIMM        :1;
      UINT16                            BurstEdo    :1;
      UINT16                            SDRAM       :1;
      UINT16                            Reserved    :5;
    } EFI_MEMORY_SUPPORTED_TYPE;

    typedef struct {
      UINT8                             Five    :1;
      UINT8                             Three   :1;
      UINT8                             Two     :1;
      UINT8                             Reserved:5;
    } EFI_MEMORY_MODULE_VOLTAGE_TYPE;

    typedef struct {
      EFI_MEMORY_ERROR_DETECT_METHOD_TYPE ErrorDetectingMethod;
      EFI_MEMORY_ERROR_CORRECT_CAPABILITY ErrorCorrectingCapability;
      EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE  MemorySupportedInterleave;
      EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE  MemoryCurrentInterleave;
      UINT8                               MaxMemoryModuleSize;
      EFI_MEMORY_SPEED_TYPE               MemorySpeedType;
      EFI_MEMORY_SUPPORTED_TYPE           MemorySupportedType;
      EFI_MEMORY_MODULE_VOLTAGE_TYPE      MemoryModuleVoltage;
      UINT8                               NumberofMemorySlot;
      EFI_MEMORY_ERROR_CORRECT_CAPABILITY EnabledCorrectingCapability;
      UINT16                              *MemoryModuleConfigHandles;
    } EFI_MEMORY_CONTROLLER_INFORMATION;

    typedef struct {
      EFI_MEMORY_ERROR_DETECT_METHOD_TYPE   ErrorDetectingMethod;
      EFI_MEMORY_ERROR_CORRECT_CAPABILITY   ErrorCorrectingCapability;
      EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE    MemorySupportedInterleave;
      EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE    MemoryCurrentInterleave;
      UINT8                                 MaxMemoryModuleSize;
      EFI_MEMORY_SPEED_TYPE                 MemorySpeedType;
      EFI_MEMORY_SUPPORTED_TYPE             MemorySupportedType;
      EFI_MEMORY_MODULE_VOLTAGE_TYPE        MemoryModuleVoltage;
      UINT8                                 NumberofMemorySlot;
      EFI_MEMORY_ERROR_CORRECT_CAPABILITY   EnabledCorrectingCapability;
      EFI_INTER_LINK_DATA                   MemoryModuleConfig[1];
    } EFI_MEMORY_CONTROLLER_INFORMATION_DATA;

    The definitions above are *NOT* defined in MemSubclass specification 0.9. They are introduced to support
    new memory controller information (type 5) defined in SmBios 2.6 specification. 
    Keeping this inconsistency to reflect the latest industry standard.

  4. Guid/DataHubRecords.h
    #define EFI_MEMORY_32BIT_ERROR_INFORMATION_RECORD_NUMBER    0x00000009

    typedef enum {  
      EfiMemoryErrorOther             = 1,
      EfiMemoryErrorUnknown           = 2,
      EfiMemoryErrorOk                = 3,
      EfiMemoryErrorBadRead           = 4,
      EfiMemoryErrorParity            = 5,
      EfiMemoryErrorSigleBit          = 6,
      EfiMemoryErrorDoubleBit         = 7,
      EfiMemoryErrorMultiBit          = 8,
      EfiMemoryErrorNibble            = 9,
      EfiMemoryErrorChecksum          = 10,
      EfiMemoryErrorCrc               = 11,
      EfiMemoryErrorCorrectSingleBit  = 12,
      EfiMemoryErrorCorrected         = 13,
      EfiMemoryErrorUnCorrectable     = 14
    } EFI_MEMORY_ERROR_TYPE;

    typedef enum {  
      EfiMemoryGranularityOther               = 1,
      EfiMemoryGranularityOtherUnknown        = 2,
      EfiMemoryGranularityDeviceLevel         = 3,
      EfiMemoryGranularityMemPartitionLevel   = 4
    } EFI_MEMORY_ERROR_GRANULARITY_TYPE;

    typedef enum {  
      EfiMemoryErrorOperationOther            = 1,
      EfiMemoryErrorOperationUnknown          = 2,
      EfiMemoryErrorOperationRead             = 3,
      EfiMemoryErrorOperationWrite            = 4,
      EfiMemoryErrorOperationPartialWrite     = 5
    } EFI_MEMORY_ERROR_OPERATION_TYPE;

    typedef struct {
      EFI_MEMORY_ERROR_TYPE               MemoryErrorType;
      EFI_MEMORY_ERROR_GRANULARITY_TYPE   MemoryErrorGranularity;
      EFI_MEMORY_ERROR_OPERATION_TYPE     MemoryErrorOperation;
      UINT32                              VendorSyndrome;
      UINT32                              MemoryArrayErrorAddress;
      UINT32                              DeviceErrorAddress;
      UINT32                              DeviceErrorResolution;
    } EFI_MEMORY_32BIT_ERROR_INFORMATION;

    The definitions above are *NOT* defined in MemSubclass specification 0.9. They are introduced to support
    new 32-bit memory error information (type 18) defined in SmBios 2.6 specification. 
    Keeping this inconsistency to reflect the latest industry standard.

  5. Guid/DataHubRecords.h
    #define EFI_MEMORY_64BIT_ERROR_INFORMATION_RECORD_NUMBER    0x0000000A
    
    typedef struct {
      EFI_MEMORY_ERROR_TYPE             MemoryErrorType;
      EFI_MEMORY_ERROR_GRANULARITY_TYPE MemoryErrorGranularity;
      EFI_MEMORY_ERROR_OPERATION_TYPE   MemoryErrorOperation;
      UINT32                            VendorSyndrome;
      UINT64                            MemoryArrayErrorAddress;
      UINT64                            DeviceErrorAddress;
      UINT32                            DeviceErrorResolution;
    } EFI_MEMORY_64BIT_ERROR_INFORMATION;

    The definitions above are *NOT* defined in MemSubclass specification 0.9. They are introduced to support
    new 64-bit memory error information (type 33) defined in SmBios 2.6 specification. 
    Keeping this inconsistency to reflect the latest industry standard.

  6. Guid/DataHubRecords.h
    typedef union _EFI_MEMORY_SUBCLASS_RECORDS {
      EFI_MEMORY_SIZE_DATA                 SizeData;
      ...
      EFI_MEMORY_64BIT_ERROR_INFORMATION   Memory64bitErrorInfo;
    } EFI_MEMORY_SUBCLASS_RECORDS;

    typedef struct {
      EFI_SUBCLASS_TYPE1_HEADER         Header;
      EFI_MEMORY_SUBCLASS_RECORDS       Record;
    } EFI_MEMORY_SUBCLASS_DRIVER_DATA;

    The definitions above are *NOT* defined in MemSubclass specification 0.9. EdkII introduces them to simplify the
    code logic. Therefore developer doesn't need to allocate memory dynamically to construct variable length data record.
    Keeping this inconsistency for backward compatibility.

##
# Mismatch with Intel Platform Innovation Framework for MiscSubclass Specification (Version 0.90)
##
  1. Guid/DataHubRecords.h
    #pragma pack(1)
    typedef struct _USB_PORT_DEVICE_PATH {
      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
      PCI_DEVICE_PATH                   PciBusDevicePath;
      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
    } USB_PORT_DEVICE_PATH;
    
    typedef struct _IDE_DEVICE_PATH {
      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
      PCI_DEVICE_PATH                   PciBusDevicePath;
      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
    } IDE_DEVICE_PATH;
    
    typedef struct _RMC_CONN_DEVICE_PATH {
      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
      PCI_DEVICE_PATH                   PciBridgeDevicePath;
      PCI_DEVICE_PATH                   PciBusDevicePath;
      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
    } RMC_CONN_DEVICE_PATH;
    
    typedef struct _RIDE_DEVICE_PATH {
      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
      PCI_DEVICE_PATH                   PciBridgeDevicePath;
      PCI_DEVICE_PATH                   PciBusDevicePath;
      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
    } RIDE_DEVICE_PATH;
    
    typedef struct _GB_NIC_DEVICE_PATH {
      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
      PCI_DEVICE_PATH                   PciBridgeDevicePath;
      PCI_DEVICE_PATH                   PciXBridgeDevicePath;
      PCI_DEVICE_PATH                   PciXBusDevicePath;
      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
    } GB_NIC_DEVICE_PATH;
    
    typedef struct _PS2_CONN_DEVICE_PATH {
      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
      PCI_DEVICE_PATH                   LpcBridgeDevicePath;
      ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
    } PS2_CONN_DEVICE_PATH;
    
    typedef struct _SERIAL_CONN_DEVICE_PATH {
      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
      PCI_DEVICE_PATH                   LpcBridgeDevicePath;
      ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
    } SERIAL_CONN_DEVICE_PATH;
    
    typedef struct _PARALLEL_CONN_DEVICE_PATH {
      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
      PCI_DEVICE_PATH                   LpcBridgeDevicePath;
      ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
    } PARALLEL_CONN_DEVICE_PATH;
    
    typedef struct _FLOOPY_CONN_DEVICE_PATH {
      ACPI_HID_DEVICE_PATH              PciRootBridgeDevicePath;
      PCI_DEVICE_PATH                   LpcBridgeDevicePath;
      ACPI_HID_DEVICE_PATH              LpcBusDevicePath;
      EFI_DEVICE_PATH_PROTOCOL          EndDevicePath;
    } FLOOPY_CONN_DEVICE_PATH;
    
    typedef union _EFI_MISC_PORT_DEVICE_PATH {
      USB_PORT_DEVICE_PATH              UsbDevicePath;
      IDE_DEVICE_PATH                   IdeDevicePath;
      RMC_CONN_DEVICE_PATH              RmcConnDevicePath;
      RIDE_DEVICE_PATH                  RideDevicePath;
      GB_NIC_DEVICE_PATH                GbNicDevicePath;
      PS2_CONN_DEVICE_PATH              Ps2ConnDevicePath;
      SERIAL_CONN_DEVICE_PATH           SerialConnDevicePath;
      PARALLEL_CONN_DEVICE_PATH         ParallelConnDevicePath;
      FLOOPY_CONN_DEVICE_PATH           FloppyConnDevicePath;
    } EFI_MISC_PORT_DEVICE_PATH;
    #pragma pack()

    a. The definitions above are *NOT* defined in MiscSubclass specifications 0.9. EdkII introduces them to simplify the
       code logic. Therefore developer doesn't need to allocate memory dynamically to construct variable length device
       path for various device.
       Keeping this inconsistency for backward compatibility.

    b. The definitions above are packed. This way violates the rule of alignment defined in DataHubSubclass specification.
       Section "Alignment" in DataHubSubclass specification say "Fields in a data hub record should be aligned at their
       natural boundaries". Keeping this inconsistency for backward compatibility.

  2. Guid/DataHubRecords.h
    typedef struct {
      ...
      EFI_MISC_PORT_DEVICE_PATH         PortPath;
    } EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA;

    The definition is *NOT* consistent with MiscSubclass specification, in which the type of last field is defined as
    "EFI_DEVICE_PATH_PROTOCOL". The definition in Specification may bring a little complexity on implementation. User
    have to allocate variable length memory to contain device path info and free them finially.
    EdkII introduced an union type named EFI_MISC_PORT_DEVICE_PATH to avoid the logic above.

  3. Guid/DataHubRecords.h
    typedef struct {
      ...
      UINT8                                       BiosMajorRelease;
      UINT8                                       BiosMinorRelease;
      UINT8                                       BiosEmbeddedFirmwareMajorRelease;
      UINT8                                       BiosEmbeddedFirmwareMinorRelease;
    } EFI_MISC_BIOS_VENDOR_DATA;

    The fields listed above are *NOT* defined in MiscSubclass specification 0.9. They are introduced to support
    new bios information (type 0) defined in SmBios 2.6 specification. 
    Keeping this inconsistency to reflect the latest industry standard.

  4. Guid/DataHubRecords.h
    typedef struct {
      ...
      STRING_REF                        SystemSKUNumber;
      STRING_REF                        SystemFamily;
    } EFI_MISC_SYSTEM_MANUFACTURER_DATA;

    The fields listed above are *NOT* defined in MiscSubclass specification 0.9. They are introduced to support
    new system information (type 1) defined in SmBios 2.6 specification. 
    Keeping this inconsistency to reflect the latest industry standard.

  5. Guid/DataHubRecords.h
    typedef struct {
      ...
      EFI_INTER_LINK_DATA               ManagementDeviceThresholdLink;
      UINT8                             ComponentType;
    } EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_DATA;

    a. The field "ManagementDeviceThresholdLink" above is *NOT* defined in MiscSubclass specification 0.9. It is introduced to support
       new management device component (type 35) defined in SmBios 2.6 specification. 
       Keeping this inconsistency to reflect the latest industry standard.
    b. The field "ComponentType" above is *NOT* defined in MiscSubclass specifications 0.9. It's implementation-specific to simplify the code logic.
       Keeping this inconsistency for backward compatibility.

  6. Guid/DataHubRecords.h
    typedef struct {
      UINT32                            ChassisType       :16;
      UINT32                            ChassisLockPresent:1;
      UINT32                            Reserved          :15;
    } EFI_MISC_CHASSIS_STATUS;

    The definition is *NOT* consistent with MiscSubclass specification 0.9, in which the first field is assigned a wrong field
    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
    field name again. EdkII changes its name to "ChassisType" to pass build.

  7. Guid/DataHubRecords.h
    typedef enum {
      ...
      EfiSlotTypeAgp2X                  = 0x10,
      ...
      EfiSlotTypePciExpress             = 0xA5,
      EfiSlotTypePciExpressX1           = 0xA6,
      EfiSlotTypePciExpressX2           = 0xA7,
      EfiSlotTypePciExpressX4           = 0xA8,
      EfiSlotTypePciExpressX8           = 0xA9,
      EfiSlotTypePciExpressX16          = 0xAA
    } EFI_MISC_SLOT_TYPE;

    a. The field name "EfiSlotTypeAgp2X" is *NOT* consistent with MiscSubclass specification 0.9, in which it is named
       "EfiSlotTypeApg2X".
       From its literal sense, this field represents a AGP type display card, so it should be named as "EfiSlotTypeAgp2X".
    b. The enumeration fields from "EfiSlotTypePciExpress" to "EfiSlotTypePciExpressX16" are *NOT* defined in MiscSubclass specification 0.9.
       They are introduced to support new system slots (type 9) defined in SmBios 2.6 specification.
       Keeping this inconsistency to reflect the latest industry standard.

  8. Guid/DataHubRecords.h
    typedef struct {
      ...
      EFI_MISC_ONBOARD_DEVICE_STATUS    OnBoardDeviceStatus;
      ...
    } EFI_MISC_ONBOARD_DEVICE_DATA;

    The definition is *NOT* consistent with MiscSubclass specification 0.9, in which the field "OnBoardDeviceStatus" is 
    named as "OnBoardDeviceType". Keeping this inconsistency for backward compatibility.

  9. Guid/DataHubRecords.h
    #define EFI_MISC_PORTABLE_BATTERY_RECORD_NUMBER   0x00000010

    The name of the definition is *NOT* consistent with MiscSubclass specification 0.9, in which it is defined as
    "EFI_MISC_BATTERY_LOCATION_RECORD_NUMBER". Keeping this inconsistency for backward compatibility.

  10. Guid/DataHubRecords.h
    typedef enum {  
      EfiPortableBatteryDeviceChemistryOther = 1,
      EfiPortableBatteryDeviceChemistryUnknown = 2,
      EfiPortableBatteryDeviceChemistryLeadAcid = 3,
      EfiPortableBatteryDeviceChemistryNickelCadmium = 4,
      EfiPortableBatteryDeviceChemistryNickelMetalHydride = 5,
      EfiPortableBatteryDeviceChemistryLithiumIon = 6,
      EfiPortableBatteryDeviceChemistryZincAir = 7,
      EfiPortableBatteryDeviceChemistryLithiumPolymer = 8
    } EFI_MISC_PORTABLE_BATTERY_DEVICE_CHEMISTRY;

    The name of the definition is *NOT* consistent with MiscSubclass specification, in which it is defined as
    "EFI_MISC_BATTERY_DEVICE_CHEMISTRY". And all field names have a redundant "Portable" string compared with MisSubclass 
    specification 0.9.
    Keeping this inconsistency for backward compatibility.

  11. Guid/DataHubRecords.h
    typedef struct {
      STRING_REF                                 Location;
      STRING_REF                                 Manufacturer;
      STRING_REF                                 ManufactureDate;
      STRING_REF                                 SerialNumber;
      STRING_REF                                 DeviceName;
      EFI_MISC_PORTABLE_BATTERY_DEVICE_CHEMISTRY DeviceChemistry;
      UINT16                                     DesignCapacity;
      UINT16                                     DesignVoltage;
      STRING_REF                                 SBDSVersionNumber;
      UINT8                                      MaximumError;
      UINT16                                     SBDSSerialNumber;
      UINT16                                     SBDSManufactureDate;
      STRING_REF                                 SBDSDeviceChemistry;
      UINT8                                      DesignCapacityMultiplier;
      UINT32                                     OEMSpecific;
      UINT8                                      BatteryNumber;
      BOOLEAN                                    Valid;
    } EFI_MISC_PORTABLE_BATTERY;

    The definition is *NOT* consistent with MiscSubclass specification 0.9, in which the structure name is defined as
    "EFI_MISC_BATTERY_LOCATION_DATA". Moreover, the name and the order of all fields are also different with MiscSubclass 
    specification 0.9. Keeping this inconsistency for backward compatibility.

  12. Guid/DataHubRecords.h
    typedef enum {
      ...
    } EFI_MISC_BOOT_INFORMATION_STATUS_DATA_TYPE;

    The name of the definition is *NOT* consistent with MiscSubclass specification 0.9, in which it is defined as
    "EFI_MISC_BOOT_INFORMATION_STATUS_TYPE". Keeping this inconsistency for backward compatibility.

  13. Guid/DataHubRecords.h
    typedef struct {
      EFI_MISC_BOOT_INFORMATION_STATUS_DATA_TYPE BootInformationStatus;
      ...
    } EFI_MISC_BOOT_INFORMATION_STATUS_DATA;

    The definition is *NOT* consistent with MiscSubclass specification 0.9, in which the type of the first field is 
    "EFI_MISC_BOOT_INFORMATION_STATUS_TYPE". Keeping this inconsistency for backward compatibility.

  14. Guid/DataHubRecords.h
    typedef struct {
      ...
    } EFI_MISC_SYSTEM_POWER_SUPPLY_DATA;

    The name of the definition is *NOT* consistent with MiscSubclass specification 0.9, in which it is defined as
    "EFI_MISC_POWER_SUPPLY_UNIT_GROUP_DATA". Keeping this inconsistency for backward compatibility.

  15. Guid/DataHubRecords.h
    typedef struct {
      ...
    } SMBIOS_STRUCTURE_HDR;

    The name of the definition is *NOT* consistent with MiscSubclass specification 0.9, in which the structure name
    is defined as "EFI_SMBIOS_STRUCTURE_HDR". Due to this structure is commonly used by vendor to construct SmBios
    type 0x80~0xFF table, Keeping this inconsistency for backward compatibility.

  16. Guid/DataHubRecords.h
    typedef struct {
      SMBIOS_STRUCTURE_HDR              Header;
      ...
    } EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION_DATA;

    The definition is *NOT* consistent with MiscSubclass specification 0.9, in which the type of the first field is 
    "EFI_SMBIOS_STRUCTURE_HDR". Keeping this inconsistency for backward compatibility.

  17. Guid/DataHubRecords.h
    typedef struct {
      UINT16                            PowerSupplyHotReplaceable:1;
      UINT16                            PowerSupplyPresent       :1;
      UINT16                            PowerSupplyUnplugged     :1;
      UINT16                            InputVoltageRangeSwitch  :4;
      UINT16                            PowerSupplyStatus        :3;
      UINT16                            PowerSupplyType          :4;
      UINT16                            Reserved                 :2;
    } EFI_MISC_POWER_SUPPLY_CHARACTERISTICS;

    all field type in the definition are *NOT* consistent with MiscSubclass specification 0.9, in which it is defined as
    "UINT32" and the total width of bit-fields is 32bits width.
    Keeping this inconsistency for backward compatibility.

  18. Guid/DataHubRecords.h
    #define EFI_MISC_SYSTEM_EVENT_LOG_RECORD_NUMBER    0x00000020

    typedef struct {
      UINT16                            LogAreaLength;
      UINT16                            LogHeaderStartOffset;
      UINT16                            LogDataStartOffset;
      UINT8                             AccessMethod;
      UINT8                             LogStatus;
      UINT32                            LogChangeToken;
      UINT32                            AccessMethodAddress;
      UINT8                             LogHeaderFormat;
      UINT8                             NumberOfSupportedLogType;
      UINT8                             LengthOfLogDescriptor;
    } EFI_MISC_SYSTEM_EVENT_LOG_DATA;

    #define ACCESS_INDEXIO_1INDEX8BIT_DATA8BIT    0x00
    #define ACCESS_INDEXIO_2INDEX8BIT_DATA8BIT    0X01
    #define ACCESS_INDEXIO_1INDEX16BIT_DATA8BIT   0X02
    #define ACCESS_MEMORY_MAPPED                  0x03
    #define ACCESS_GPNV                           0x04

    The definitions listed above are *NOT* defined in MiscSubclass specification 0.9. It is introduced to support
    new system event log (type 15) defined in SmBios 2.6 specification. 
    Keeping this inconsistency to reflect the latest industry standard.

  19. Guid/DataHubRecords.h
    #define EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD_RECORD_NUMBER    0x00000021

    typedef struct {
      UINT16                            LowerThresNonCritical;
      UINT16                            UpperThresNonCritical;
      UINT16                            LowerThresCritical;
      UINT16                            UpperThresCritical;
      UINT16                            LowerThresNonRecover;
      UINT16                            UpperThresNonRecover;
    } EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD;

    The definitions listed above are *NOT* defined in MiscSubclass specification 0.9. It is introduced to support
    new management device threshold data (type 36) defined in SmBios 2.6 specification. 
    Keeping this inconsistency to reflect the latest industry standard.

  20. Guid/DataHubRecords.h
    typedef union {
      EFI_MISC_LAST_PCI_BUS_DATA                         LastPciBus;
      ...
      EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD               MiscManagementDeviceThreshold;
    } EFI_MISC_SUBCLASS_RECORDS;

    typedef struct {
      EFI_SUBCLASS_TYPE1_HEADER         Header;
      EFI_MISC_SUBCLASS_RECORDS         Record;
    } EFI_MISC_SUBCLASS_DRIVER_DATA;

    The definitions above are *NOT* defined in MemSubclass specification 0.9. EdkII introduces them to simplify the
    code logic. Therefore developer doesn't need to allocate memory dynamically to construct variable length data record.
    Keeping this inconsistency for backward compatibility.

  21. Guid/DataHubRecords.h
    typedef struct {
      EFI_MISC_COOLING_DEVICE_TYPE      CoolingDeviceType;
      EFI_INTER_LINK_DATA               CoolingDeviceTemperatureLink;
      UINT8                             CoolingDeviceUnitGroup;
      UINT16                            CoolingDeviceNominalSpeed;
      UINT32                            CoolingDeviceOemDefined;
    } EFI_MISC_COOLING_DEVICE_TEMP_LINK_DATA;

    The "CoolingDeviceUnitGroup" field and "CoolingDeviceNominalSpeed" field are *NOT* consistent with 
    MiscSubclass specification 0.9. These fields are aligned with SMBIOS 2.6 specification. And user can easily
    assign any value to CoolingDeviceNominalSpeed.

  22. Guid/DataHubRecords.h
    typedef enum {
      ...
      EfiSlotDataBusWidth1xOrx1         = 0x8,
      EfiSlotDataBusWidth2xOrx2         = 0x9,
      EfiSlotDataBusWidth4xOrx4         = 0xA,
      EfiSlotDataBusWidth8xOrx8         = 0xB,
      EfiSlotDataBusWidth12xOrx12       = 0xC,
      EfiSlotDataBusWidth16xOrx16       = 0xD,
      EfiSlotDataBusWidth32xOrx32       = 0xE
    } EFI_MISC_SLOT_DATA_BUS_WIDTH;

    The enumeration fields from "EfiSlotDataBusWidth1xOrx1" to "EfiSlotDataBusWidth32xOrx32" are *NOT* defined in MiscSubclass specification 0.9.
    They are introduced to support new system slots (type 9) defined in SmBios 2.6 specification.
    Keeping this inconsistency to reflect the latest industry standard.

  23. Guid/DataHubRecords.h
    typedef struct {
      ...
      UINT16                            TemperatureProbeMaximumValue;
      UINT16                            TemperatureProbeMinimumValue;
      UINT16                            TemperatureProbeResolution;
      UINT16                            TemperatureProbeTolerance;
      UINT16                            TemperatureProbeAccuracy;
      UINT16                            TemperatureProbeNominalValue;
      UINT16                            MDLowerNoncriticalThreshold;
      UINT16                            MDUpperNoncriticalThreshold;
      UINT16                            MDLowerCriticalThreshold;
      UINT16                            MDUpperCriticalThreshold;
      UINT16                            MDLowerNonrecoverableThreshold;
      UINT16                            MDUpperNonrecoverableThreshold;
      ...
    } EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_DATA;

    The structure fields from "TemperatureProbeMaximumValue" to "MDUpperNonrecoverableThreshold" are *NOT* consistent with MiscSubclass specification 0.9.
    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.
    Keeping this inconsistency for backward compatibility.

  24. Guid/DataHubRecords.h
    #define EFI_MISC_IPMI_INTERFACE_TYPE_DATA_RECORD_NUMBER EFI_MISC_IPMI_INTERFACE_TYPE_RECORD_NUMBER

    The definition above is *NOT* defined in MiscSubclass specifications 0.9. It's defined for backward compatibility.

##
# Mismatch with Intel Platform Innovation Framework for Status Codes Specification (Version 0.92)
##
  1. Include/Framework/StatusCode.h
    #define EFI_IOB_ATA_BUS_SMART_ENABLE               (EFI_SUBCLASS_SPECIFIC | 0x00000000)
    #define EFI_IOB_ATA_BUS_SMART_DISABLE              (EFI_SUBCLASS_SPECIFIC | 0x00000001)
    #define EFI_IOB_ATA_BUS_SMART_OVERTHRESHOLD        (EFI_SUBCLASS_SPECIFIC | 0x00000002)
    #define EFI_IOB_ATA_BUS_SMART_UNDERTHRESHOLD       (EFI_SUBCLASS_SPECIFIC | 0x00000003)

    #define EFI_IOB_ATA_BUS_SMART_NOTSUPPORTED         (EFI_SUBCLASS_SPECIFIC | 0x00000000)
    #define EFI_IOB_ATA_BUS_SMART_DISABLED             (EFI_SUBCLASS_SPECIFIC | 0x00000001)

    #define EFI_SW_DXE_BS_PC_BEGIN_CONNECTING_DRIVERS  (EFI_SUBCLASS_SPECIFIC | 0x00000005)
    #define EFI_SW_DXE_BS_PC_VERIFYING_PASSWORD        (EFI_SUBCLASS_SPECIFIC | 0x00000006)

    #define EFI_SW_DXE_RT_PC_S0                        (EFI_SUBCLASS_SPECIFIC | 0x00000000)
    #define EFI_SW_DXE_RT_PC_S1                        (EFI_SUBCLASS_SPECIFIC | 0x00000001)
    #define EFI_SW_DXE_RT_PC_S2                        (EFI_SUBCLASS_SPECIFIC | 0x00000002)
    #define EFI_SW_DXE_RT_PC_S3                        (EFI_SUBCLASS_SPECIFIC | 0x00000003)
    #define EFI_SW_DXE_RT_PC_S4                        (EFI_SUBCLASS_SPECIFIC | 0x00000004)
    #define EFI_SW_DXE_RT_PC_S5                        (EFI_SUBCLASS_SPECIFIC | 0x00000005)

    #define EFI_SW_CSM_LEGACY_ROM_INIT                 (EFI_SUBCLASS_SPECIFIC | 0x00000000)

    The definitions above are *NOT* defined in Framework StatusCodes specification 0.92. But these subclass-specific error code
    operations are needed for EdkII implementation.
    Keeping this inconsistency for backward compatibility.

  2. Include/Framework/StatusCode.h
    typedef union {
      CHAR8   *Ascii;
      CHAR16  *Unicode;
      ...
    } EFI_STATUS_CODE_STRING;

    The definition is *NOT* consistent with Framework SatausCodes specification 0.92, in which the first field is defined as "CHAR8 Ascii[]"
    and the second field is defined as "CHAR16 Unicode[]". Keeping this inconsistency for backward compatibility.

  3. Include/Framework/StatusCode.h
    #define EFI_SW_EC_X64_DIVIDE_ERROR      EXCEPT_X64_DIVIDE_ERROR
    #define EFI_SW_EC_X64_DEBUG             EXCEPT_X64_DEBUG
    #define EFI_SW_EC_X64_NMI               EXCEPT_X64_NMI
    #define EFI_SW_EC_X64_BREAKPOINT        EXCEPT_X64_BREAKPOINT
    #define EFI_SW_EC_X64_OVERFLOW          EXCEPT_X64_OVERFLOW
    #define EFI_SW_EC_X64_BOUND             EXCEPT_X64_BOUND
    #define EFI_SW_EC_X64_INVALID_OPCODE    EXCEPT_X64_INVALID_OPCODE
    #define EFI_SW_EC_X64_DOUBLE_FAULT      EXCEPT_X64_DOUBLE_FAULT
    #define EFI_SW_EC_X64_INVALID_TSS       EXCEPT_X64_INVALID_TSS
    #define EFI_SW_EC_X64_SEG_NOT_PRESENT   EXCEPT_X64_SEG_NOT_PRESENT
    #define EFI_SW_EC_X64_STACK_FAULT       EXCEPT_X64_STACK_FAULT
    #define EFI_SW_EC_X64_GP_FAULT          EXCEPT_X64_GP_FAULT
    #define EFI_SW_EC_X64_PAGE_FAULT        EXCEPT_X64_PAGE_FAULT
    #define EFI_SW_EC_X64_FP_ERROR          EXCEPT_X64_FP_ERROR
    #define EFI_SW_EC_X64_ALIGNMENT_CHECK   EXCEPT_X64_ALIGNMENT_CHECK
    #define EFI_SW_EC_X64_MACHINE_CHECK     EXCEPT_X64_MACHINE_CHECK
    #define EFI_SW_EC_X64_SIMD              EXCEPT_X64_SIMD

    The definitions are *NOT* defined in Framework StatusCodes specification 0.92, in which IA32 and IPF exception subclass error code definitions
    are defined but omit the corresponding definitions for X64. EdkII introduce these definitions for implementation. 

##
# Mismatch with Intel Platform Innovation Framework for EFI Boot Script Specification (Version 0.91)
##
  1. Include/Protocol/BootScriptSave.h
    #define EFI_BOOT_SCRIPT_SAVE_PROTOCOL_GUID \
    { \
      0x470e1529, 0xb79e, 0x4e32, {0xa0, 0xfe, 0x6a, 0x15, 0x6d, 0x29, 0xf9, 0xb2 } \
    }

    The macro name "EFI_BOOT_SCRIPT_SAVE_PROTOCOL_GUID" is *NOT* consistent with Framework BootScript specification 0.91,
    in which it's defined as "EFI_BOOT_SCRIPT_SAVE_GUID". Keeping this inconsistency for backward compatibility.

  2. Include/Protocol/BootScriptSave.h
    EFI_STATUS
    EFI_BOOTSERVICE
    (EFIAPI *EFI_BOOT_SCRIPT_WRITE) (
      IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL            *This,
      ...
    );

    The first parameter's type is *NOT* consistent with Framework BootScript specification 0.91, in which it's defined as
    "struct _EFI_BOOT_SCRIPT_SAVE_PROTOCOL". Keeping this inconsistency for backward compatibility.

  3. Include/Framework/BootScript.h
    #define EFI_BOOT_SCRIPT_MEM_POLL_OPCODE               0x09
    #define EFI_BOOT_SCRIPT_INFORMATION_OPCODE            0x0A
    #define EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE      0x0B
    #define EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE 0x0C
    #define EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE             0x0D

    The OPCODEs above are not defined in Framework BootScript Specification 0.91, but adopted by PI 1.0 Spec. And they
    are needed for EdkII implementation.

  4. Include/Framework/BootScript.h
    #define EFI_BOOT_SCRIPT_TABLE_OPCODE                  0xAA
    #define EFI_BOOT_SCRIPT_TERMINATE_OPCODE              0xFF

    The two OPCODEs are *NOT* defined in Framework BootScript specification 0.91. EdkII introduces them to indicate the start
    or end of the boot script table.
    Keeping this inconsistency for backward compatibility.

  5. Include/Protocol/BootScriptSave.h
    typedef  
    EFI_STATUS  
    (EFIAPI *EFI_BOOT_SCRIPT_CLOSE_TABLE) (
      IN  EFI_BOOT_SCRIPT_SAVE_PROTOCOL            *This,
      ...
      );

    The first parameter's type is *NOT* consistent with BootScript specification, in which it's defined as
    "struct _EFI_BOOT_SCRIPT_SAVE_PROTOCOL". Keeping this inconsistency for backward compatibility.

  6. Include/Include/BootScriptExecuter.h
    typedef
    EFI_STATUS
    (EFIAPI *EFI_PEI_BOOT_SCRIPT_EXECUTE)(
      IN     EFI_PEI_SERVICES                        **PeiServices,
      IN     EFI_PEI_BOOT_SCRIPT_EXECUTER_PPI        *This,
      ...
      );

    The second parameter's type is *NOT* consistent with BootScript specification, in which it's defined as
    "struct _EFI_PEI_BOOT_SCRIPT_EXECUTER_PPI". Keeping this inconsistency for backward compatibility.

##
# Mismatch with Intel Platform Innovation Framework for EFI DXE CIS (Version 0.91)
##
  1. Include/Framework/DxeCis.h
    EFI_STATUS_CODE_ARCH_PROTOCOL is removed.
    
    EdkII doesn't provide EFI_STATUS_CODE_ARCH_PROTOCOL definition due to ReportStatusCode() field has been
    removed from EFI Runtime Service Table of PI specification. EFI_STATUS_CODE_ARCH_PROTOCOL is *NOT* required,
    and is replaced with EFI_STATUS_CODE_RUNTIME_PROTOCOL.

##
# Mismatch with Intel Platform Innovation Framework for EFI Firmware Volume Specification (Version 0.9)
##
  1. Include/Framework/FirmwareVolumeImageFormat.h
    #define EFI_AGGREGATE_AUTH_STATUS_ALL               0x00000f
    #define EFI_LOCAL_AUTH_STATUS_ALL                   0x0f0000

    The two macros are *NOT* defined in Framework FV specification 0.9. EdkII introduces them as a mask to calculate the
    value of authentication status.

##
# Mismatch with Intel Platform Innovation Framework for EFI Human Interface Infrastructure Specification (Version 0.92)
##
  1. Include/Protocol/FrameworkHii.h
    #define EFI_HII_PROTOCOL_GUID \
      { \
        0xd7ad636e, 0xb997, 0x459b, {0xbf, 0x3f, 0x88, 0x46, 0x89, 0x79, 0x80, 0xe1} \
      }

    The Framework HII specification 0.92 changed part of HII interfaces but did not update the protocol GUID.
    This change should cause a change of GUID in both of code and HII spec. EdkII updates the GUID in code, 
    but the Framework HII specification 0.92 is not updated. This is a known issue.

  2. Include/Protocol/FrameworkHii.h
    typedef struct {
      ...
      EFI_HANDLE          COBExportHandle;
    } EFI_HII_HANDLE_PACK;

    The last field "COBExportHandle" of EFI_HII_HANDLE_PACK is *NOT* defined in the Framework HII specification
    0.92. Keeping this inconsistency for backward compatibility.

  3. Include/Protocol/FrameworkHii.h
    typedef struct {
      UINTN     NumberOfPackages;
      EFI_GUID  *GuidId;
    } EFI_HII_PACKAGES;

    The definition is *NOT* consistent with Framework HII specification 0.92, in which a field "HandlePack" is defined.
    EdkII changes the EFI_HII_PACKAGES to contain various number of packages of different types just after the structure
    as inline data, which will bring the flexibility on development.

  4. Include/Protocol/FrameworkHii.h
    struct _EFI_HII_PROTOCOL {
      ...
      EFI_HII_RESET_STRINGS                 ResetStrings;
      ...
    };

    The field listed above is *NOT* defined in Framework HII specification 0.92. EdkII adds this field to provide 
    an ability of removing any new strings that were added after the initial string export for this handle.  

  5. Include/Protocol/FrameworkHii.h
    typedef
    EFI_STATUS
    (EFIAPI *EFI_HII_GLYPH_TO_BLT)(
      ...
      IN     EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground,
      IN     EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background,
      ...
      IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer
      );

    The type of the parameters listed above are *NOT* consistent with Framework HII specification 0.92, in which
    the type of these parameters is EFI_UGA_PIXEL. Here the definition uses the EFI_GRAPHICS_OUTPUT_BLT_PIXEL which
    defined in UEFI2.1 spec. Keeping this inconsistency for backward compatibility.

  6. Include/Protocol/FrameworkHii.h
    typedef struct {
      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
      UINT8                             Flags;
    } EFI_IFR_SUPPRESS;
    
    typedef struct {
      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
      UINT8                             Flags;
    } EFI_IFR_GRAY_OUT;
    
    typedef struct {
      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
      STRING_REF                        Popup;
      UINT8                             Flags;
    } EFI_IFR_INCONSISTENT;
    
    typedef struct {
      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
      UINT16                            QuestionId;
      UINT8                             Width;
      UINT16                            Value;
    } FRAMEWORK_EFI_IFR_EQ_ID_VAL;
    
    typedef struct {
      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
      UINT16                            QuestionId;
      UINT8                             Width;
      UINT16                            ListLength;
      UINT16                            ValueList[1];
    } FRAMEWORK_EFI_IFR_EQ_ID_LIST;
    
    typedef struct {
      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
      UINT16                            QuestionId1;
      UINT8                             Width;
      UINT16                            QuestionId2;
    } FRAMEWORK_EFI_IFR_EQ_ID_ID;
    
    typedef struct {
      FRAMEWORK_EFI_IFR_OP_HEADER       Header;
      UINT16                            VariableId;
      UINT16                            Value;
    } EFI_IFR_EQ_VAR_VAL;

    The defintions are not complied with Framework HII spec 0.92. Keeping the inconsistent for implementation needed.

  7. Include/Protocol/FrameworkFormCallback.h
    #define RESET_REQUIRED  1 
    #define EXIT_REQUIRED   2
    #define SAVE_REQUIRED   4
    #define NV_CHANGED      8
    #define NV_NOT_CHANGED  16

    These macros are *NOT* defined in the Framework HII specification 0.92. These Flags are introduced to describe
    the standard behavior of the browser after the callback.
    Keeping this inconsistency for backward compatibility.

  8. Include/Protocol/FrameworkFormCallback.h
    typedef
    EFI_STATUS
    (EFIAPI *EFI_NV_WRITE)(
      ...
      IN     UINT32                        Attributes,
      ...
      );

    The definition is *NOT* consistent with Framework HII specification 0.92, in which the type of Attributes
    parameter is defined as "UINT32 *". EdkII changes the type of Attributes from UINT32 * to UINT32 because
    the input paramter is not necessary to use pointer date type.

##
# Mismatch with Intel Platform Innovation Framework for PEI CIS Specification (Version 0.91)
##
  1. Include/Ppi/ReadOnlyVariable.h
    #define EFI_VARIABLE_READ_ONLY          0x00000008

    In Framework PeiCis specification 0.91, neither the macro or its value is defined.
    Keeping this inconsistency for backward compatibility.

  2. Include/Ppi/FindFv.h
    typedef
    EFI_STATUS
    (EFIAPI *EFI_PEI_FIND_FV_FINDFV)(
      IN EFI_PEI_FIND_FV_PPI             *This,
      IN EFI_PEI_SERVICES                **PeiServices,
      IN UINT8                           *FvNumber,
      IN OUT EFI_FIRMWARE_VOLUME_HEADER  **FVAddress
      );

    The definition is *NOT* consistent with Framework PeiCis specification 0.91. Compared with spec, the order
    of the first and second parameters is reversed. Keeping this inconsistency for backward compatibility.

##
# Mismatch with Intel Platform Innovation Framework for EFI SMM CIS (Version 0.91)
##
  1. Include/Guid/SmramMemoryReserve.h
    typedef struct {
      UINT32                NumberOfSmmReservedRegions;
      ...
    } EFI_SMRAM_HOB_DESCRIPTOR_BLOCK;

    1) The name of the definition is *NOT* consistent with Framework SmmCis specification 0.91, in which it's 
    defined as "EFI_HOB_SMRAM_DESCRIPTOR_BLOCK" rather than "EFI_SMRAM_HOB_DESCRIPTOR_BLOCK". 
    Keeping this inconsistency for backward compatibility.

    2) The definition of NumberOfSmmReservedRegions is *NOT* consistent with Framework SmmCis specification 0.91,
    in which the type of this field is defined as UINTN. However, HOBs are supposed to be CPU neutral, so UINTN
    is incorrect and UINT32 should be used.

  2. Include/Guid/SmramMemoryReserve.h
    typedef enum {
      ...
      IchnIoTrap3,
      IchnIoTrap2,
      IchnIoTrap1,
      IchnIoTrap0,
      IchnPciExpress,
      IchnMonitor,
      IchnSpi,
      IchnQRT,
      IchnGpioUnlock,
      ...
    } EFI_SMM_ICHN_SMI_TYPE;

    The enumeration fields listed above are *NOT* defined in Framework SmmCis specification 0.91. EdkII introduces
    these fields to support new SMI types.

  3. Include/Framework/SmmCis.h
    typedef union {
      ///
      /// The processor save-state information for IA-32 processors. 
      ///
      EFI_SMI_CPU_SAVE_STATE     Ia32SaveState;
      ///
      /// Note: Inconsistency with the Framework SMM CIS spec - Itanium save state not included.
      ///
      /// The processor save-state information for Itanium processors.
      ///
      /// EFI_PMI_SYSTEM_CONTEXT ItaniumSaveState;
    } EFI_SMM_CPU_SAVE_STATE;

##
# Mismatch with Intel Platform Innovation Framework for EFI S3 Resume Boot Path Specification (Version 0.9)
##
  1. Include/Protocol/AcpiS3Save.h
    typedef
    EFI_STATUS
    EFI_BOOTSERVICE
    (EFIAPI *EFI_ACPI_GET_LEGACY_MEMORY_SIZE) (
      IN  EFI_ACPI_S3_SAVE_PROTOCOL *This,
      OUT UINTN *Size
      );

    The first parameter's type is *NOT* consistent with Framework S3Resume specification, in which it's defined as
    "struct _EFI_ACPI_S3_SAVE_PROTOCOL". Keeping this inconsistency for backward compatibility.

  2. Include/Protocol/AcpiS3Save.h
    typedef
    EFI_STATUS
    (EFIAPI *EFI_ACPI_S3_SAVE) (
      IN EFI_ACPI_S3_SAVE_PROTOCOL      *This,
      IN VOID                           *LegacyMemoryAddress 
      );

    The first parameter's type is *NOT* consistent with Framework S3Resume specification, in which it's defined as
    "struct _EFI_ACPI_S3_SAVE_PROTOCOL". Also the EFI_BOOTSERVICE modifier is removed from the function declaration.

  3. Include/Protocol/AcpiS3Save.h
    typedef
    EFI_STATUS
    (EFIAPI *EFI_ACPI_GET_LEGACY_MEMORY_SIZE)(
      IN  EFI_ACPI_S3_SAVE_PROTOCOL     *This,
      OUT UINTN                         *Size
    );

    The first parameter's type is *NOT* consistent with Framework S3Resume specification, in which it's defined as
    "struct _EFI_ACPI_S3_SAVE_PROTOCOL". Also the EFI_BOOTSERVICE modifier is removed from the function declaration.

##
# Mismatch with Intel Platform Innovation Framework for EFI ACPI Specification (Version 0.91)
##
  1. Include/Protocol/AcpiSupport.h
    typedef
    EFI_STATUS
    (EFIAPI *EFI_ACPI_GET_ACPI_TABLE)(
      ...
      );

    The function modifier is *NOT* consistent with Framework Acpi specification. The EFI_BOOTSERVICE modifier
    is removed from the function declaration.

  2. Include/Protocol/AcpiSupport.h
    typedef
    EFI_STATUS
    (EFIAPI *EFI_ACPI_SET_ACPI_TABLE)(
      ...
      );

    The function modifier is *NOT* consistent with Framework Acpi specification. The EFI_BOOTSERVICE modifier
    is removed from the function declaration.

  3. Include/Protocol/AcpiSupport.h
    typedef
    EFI_STATUS
    (EFIAPI *EFI_ACPI_PUBLISH_TABLES)(
      ...
      );

    The function modifier is *NOT* consistent with Framework Acpi specification. The EFI_BOOTSERVICE modifier
    is removed from the function declaration.
