##
# 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://github.com/tianocore/edk2/tree/master/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.
