/* $NoKeywords */
/**
 * @file
 *
 * MemIscp.h
 *
 * Contains common Memory Training ISCP-related structures and defines.
 *
 * @xrefitem bom "File Content Label" "Release Content"
 * @e project: FDK
 * @e sub-project: UEFI
 * @e version: $Revision: 317558 $ @e date: $Date: 2015-04-24 17:20:55 -0700 (Fri, 24 Apr 2015) $
 *
 */
/*****************************************************************************
*
*  Copyright 2013 - 2016 ADVANCED MICRO DEVICES, INC.  All Rights Reserved.
*
*  This program and the accompanying materials are licensed and made available
*  under the terms and conditions of the BSD License which accompanies this
*  distribution. The full text of the license may be found at
*  http://opensource.org/licenses/bsd-license.php
*
*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
*  IMPLIED.
*
***************************************************************************/

//#########################################################################
//#########################################################################
//#########################################################################
//        NOTE: This file shared between SCP and UEFI, make sure all     //
//              changes are reflected in both copies.                    //
//#########################################################################
//#########################################################################
//#########################################################################

#ifndef CPUISCP_H_
#define CPUISCP_H_

#ifdef __cplusplus
  extern "C" {
  #endif

/*----------------------------------------------------------------------------------------
 *                             M O D U L E S    U S E D
 *----------------------------------------------------------------------------------------
 */
  #include <ProcessorBind.h>  // Included just so this file can be built into both the RTOS
                              // and UEFI without needing separate copies for both build
                              // environments.


/*----------------------------------------------------------------------------------------
 *                  T Y P E D E F S     A N D     S T R U C T U R E S
 *----------------------------------------------------------------------------------------
 */

  /// Processor ID
  typedef struct {
    UINT32                   ProcIDMsd;            ///< Processor ID Msd
    UINT32                   ProcIDLsd;            ///< Processor ID Lsd
  } ISCP_PROC_ID;

  /// Processor Type
  typedef enum {
    ISCP_CPU_TYPE_OTHER = 1,                       ///< Other
    ISCP_CPU_TYPE_UNKNOWN,                         ///< Unknown
    ISCP_CPU_TYPE_CENTRAL_PROCESSOR,               ///< Central Processor
    ISCP_CPU_TYPE_MATH_COPROCESSOR,                ///< Math Coprocessor
    ISCP_CPU_TYPE_DSP_PROCESSOR,                   ///< DSP Processor
    ISCP_CPU_TYPE_VIDEO_PROCESSOR                  ///< Video Processor
  } ISCP_PROCESSOR_TYPE;

  /// Processor Information - Processor Family.
  typedef enum {
    ISCP_ProcessorFamilyOther                  = 0x01,  ///< Processor Family - Other
    ISCP_ProcessorFamilyUnknown                = 0x02,  ///< Processor Family - Unknown
    ISCP_ProcessorFamily8086                   = 0x03,  ///< Processor Family - 8086
    ISCP_ProcessorFamily80286                  = 0x04,  ///< Processor Family - 80286
    ISCP_ProcessorFamilyIntel386               = 0x05,  ///< Processor Family - Intel 386
    ISCP_ProcessorFamilyIntel486               = 0x06,  ///< Processor Family - Intel 486
    ISCP_ProcessorFamily8087                   = 0x07,  ///< Processor Family - 8087
    ISCP_ProcessorFamily80287                  = 0x08,  ///< Processor Family - 80287
    ISCP_ProcessorFamily80387                  = 0x09,  ///< Processor Family - 80387
    ISCP_ProcessorFamily80487                  = 0x0A,  ///< Processor Family - 80487
    ISCP_ProcessorFamilyPentium                = 0x0B,  ///< Processor Family - Pentium
    ISCP_ProcessorFamilyPentiumPro             = 0x0C,  ///< Processor Family - Pentium Pro
    ISCP_ProcessorFamilyPentiumII              = 0x0D,  ///< Processor Family - Pentium II
    ISCP_ProcessorFamilyPentiumMMX             = 0x0E,  ///< Processor Family - Pentium MMX
    ISCP_ProcessorFamilyCeleron                = 0x0F,  ///< Processor Family - Celeron
    ISCP_ProcessorFamilyPentiumIIXeon          = 0x10,  ///< Processor Family - Pentium II Xeon
    ISCP_ProcessorFamilyPentiumIII             = 0x11,  ///< Processor Family - Pentium III
    ISCP_ProcessorFamilyM1                     = 0x12,  ///< Processor Family - M1
    ISCP_ProcessorFamilyM2                     = 0x13,  ///< Processor Family - M2
    ISCP_ProcessorFamilyIntelCeleronM          = 0x14,  ///< Processor Family - Intel Celeron
    ISCP_ProcessorFamilyIntelPentium4Ht        = 0x15,  ///< Processor Family - Intel Pentium 4Ht
    ISCP_ProcessorFamilyAmdDuron               = 0x18,  ///< Processor Family - AMD Duron
    ISCP_ProcessorFamilyK5                     = 0x19,  ///< Processor Family - K5
    ISCP_ProcessorFamilyK6                     = 0x1A,  ///< Processor Family - K6
    ISCP_ProcessorFamilyK6_2                   = 0x1B,  ///< Processor Family - K6-2
    ISCP_ProcessorFamilyK6_3                   = 0x1C,  ///< Processor Family - K6-3
    ISCP_ProcessorFamilyAmdAthlon              = 0x1D,  ///< Processor Family - AMD Athlon
    ISCP_ProcessorFamilyAmd29000               = 0x1E,  ///< Processor Family - AMD 29000
    ISCP_ProcessorFamilyK6_2Plus               = 0x1F,  ///< Processor Family - K6-2 Plus
    ISCP_ProcessorFamilyPowerPC                = 0x20,  ///< Processor Family - Power PC
    ISCP_ProcessorFamilyPowerPC601             = 0x21,  ///< Processor Family - Power PC 601
    ISCP_ProcessorFamilyPowerPC603             = 0x22,  ///< Processor Family - Power PC 603
    ISCP_ProcessorFamilyPowerPC603Plus         = 0x23,  ///< Processor Family - Power PC 603 Plus
    ISCP_ProcessorFamilyPowerPC604             = 0x24,  ///< Processor Family - Power PC 604
    ISCP_ProcessorFamilyPowerPC620             = 0x25,  ///< Processor Family - Power PC 620
    ISCP_ProcessorFamilyPowerPCx704            = 0x26,  ///< Processor Family - Power PC x704
    ISCP_ProcessorFamilyPowerPC750             = 0x27,  ///< Processor Family - Power PC 750
    ISCP_ProcessorFamilyIntelCoreDuo           = 0x28,  ///< Processor Family - Intel Core Duo
    ISCP_ProcessorFamilyIntelCoreDuoMobile     = 0x29,  ///< Processor Family - Intel core Duo Mobile
    ISCP_ProcessorFamilyIntelCoreSoloMobile    = 0x2A,  ///< Processor Family - Intel Core Solo Mobile
    ISCP_ProcessorFamilyIntelAtom              = 0x2B,  ///< Processor Family - Intel Atom
    ISCP_ProcessorFamilyAlpha                  = 0x30,  ///< Processor Family - Alpha
    ISCP_ProcessorFamilyAlpha21064             = 0x31,  ///< Processor Family - Alpha 21064
    ISCP_ProcessorFamilyAlpha21066             = 0x32,  ///< Processor Family - Alpha 21166
    ISCP_ProcessorFamilyAlpha21164             = 0x33,  ///< Processor Family - Alpha 21164
    ISCP_ProcessorFamilyAlpha21164PC           = 0x34,  ///< Processor Family - Alpha 21164PC
    ISCP_ProcessorFamilyAlpha21164a            = 0x35,  ///< Processor Family - Alpha 21164a
    ISCP_ProcessorFamilyAlpha21264             = 0x36,  ///< Processor Family - Alpha 21264
    ISCP_ProcessorFamilyAlpha21364             = 0x37,  ///< Processor Family - Alpha 21364
    ISCP_ProcessorFamilyAmdTurionIIUltraDualCoreMobileM    = 0x38,  ///< Processor Family - AMD Turion II Ultra Dual Core Mobile M
    ISCP_ProcessorFamilyAmdTurionIIDualCoreMobileM         = 0x39,  ///< Processor Family - AMD Turion II Dual Core Mobile M
    ISCP_ProcessorFamilyAmdAthlonIIDualCoreM   = 0x3A,  ///< Processor Family - AMD Athlon II Dual Core M
    ISCP_ProcessorFamilyAmdOpteron6100Series   = 0x3B,  ///< Processor Family - AMD Opteron 6100 Series
    ISCP_ProcessorFamilyAmdOpteron4100Series   = 0x3C,  ///< Processor Family - AMD Opteron 4100 Series
    ISCP_ProcessorFamilyAmdOpteron6200Series   = 0x3D,  ///< Processor Family - AMD Opteron 6200 Series
    ISCP_ProcessorFamilyAmdOpteron4200Series   = 0x3E,  ///< Processor Family - AMD Opteron 4200 Series
    ISCP_ProcessorFamilyAmdFxSeries            = 0x3F,  ///< Processor Family - AMD FX Series
    ISCP_ProcessorFamilyMips                   = 0x40,  ///< Processor Family - MIPs
    ISCP_ProcessorFamilyMIPSR4000              = 0x41,  ///< Processor Family - MIPs R4000
    ISCP_ProcessorFamilyMIPSR4200              = 0x42,  ///< Processor Family - MIPs R4200
    ISCP_ProcessorFamilyMIPSR4400              = 0x43,  ///< Processor Family - MIPs R4400
    ISCP_ProcessorFamilyMIPSR4600              = 0x44,  ///< Processor Family - MIPs R4600
    ISCP_ProcessorFamilyMIPSR10000             = 0x45,  ///< Processor Family - MIPs R10000
    ISCP_ProcessorFamilyAmdCSeries             = 0x46,  ///< Processor Family - AMD C Series
    ISCP_ProcessorFamilyAmdESeries             = 0x47,  ///< Processor Family - AMD E Series
    ISCP_ProcessorFamilyAmdASeries             = 0x48,  ///< Processor Family - AMD A Series
    ISCP_ProcessorFamilyAmdGSeries             = 0x49,  ///< Processor Family - AMD G Series
    ISCP_ProcessorFamilyAmdZSeries             = 0x4A,  ///< Processor Family - AMD Z Series
    ISCP_ProcessorFamilyAmdRSeries             = 0x4B,  ///< Processor Family - AMD R Series
    ISCP_ProcessorFamilyAmdOpteron4300         = 0x4C,  ///< Processor Family - AMD Opteron 4300
    ISCP_ProcessorFamilyAmdOpteron6300         = 0x4D,  ///< Processor Family - AMD Opteron 6300
    ISCP_ProcessorFamilyAmdOpteron3300         = 0x4E,  ///< Processor Family - AMD Opteron 3300
    ISCP_ProcessorFamilyAmdFireProSeries       = 0x4F,  ///< Processor Family - AMD Fire Pro Series
    ISCP_ProcessorFamilySparc                  = 0x50,  ///< Processor Family - Sparc
    ISCP_ProcessorFamilySuperSparc             = 0x51,  ///< Processor Family - Super Sparc
    ISCP_ProcessorFamilymicroSparcII           = 0x52,  ///< Processor Family - Sparc II
    ISCP_ProcessorFamilymicroSparcIIep         = 0x53,  ///< Processor Family - Sparc IIep
    ISCP_ProcessorFamilyUltraSparc             = 0x54,  ///< Processor Family - Ultra Sparc
    ISCP_ProcessorFamilyUltraSparcII           = 0x55,  ///< Processor Family - Ultra Sparc II
    ISCP_ProcessorFamilyUltraSparcIii          = 0x56,  ///< Processor Family - Ultra Sparc Iii
    ISCP_ProcessorFamilyUltraSparcIII          = 0x57,  ///< Processor Family - Ultra Sparc III
    ISCP_ProcessorFamilyUltraSparcIIIi         = 0x58,  ///< Processor Family - Ultra Sparc IIIi
    ISCP_ProcessorFamily68040                  = 0x60,  ///< Processor Family - 68040
    ISCP_ProcessorFamily68xxx                  = 0x61,  ///< Processor Family - 68xxx
    ISCP_ProcessorFamily68000                  = 0x62,  ///< Processor Family - 68000
    ISCP_ProcessorFamily68010                  = 0x63,  ///< Processor Family - 68010
    ISCP_ProcessorFamily68020                  = 0x64,  ///< Processor Family - 68020
    ISCP_ProcessorFamily68030                  = 0x65,  ///< Processor Family - 68030
    ISCP_ProcessorFamilyAmdOpteronASeries      = 0x69,  ///< Processor Family - AMD Opteron A Series
    ISCP_ProcessorFamilyHobbit                 = 0x70,  ///< Processor Family - Hobbit
    ISCP_ProcessorFamilyCrusoeTM5000           = 0x78,  ///< Processor Family - Crusoe TM5000
    ISCP_ProcessorFamilyCrusoeTM3000           = 0x79,  ///< Processor Family - Crusoe TM3000
    ISCP_ProcessorFamilyEfficeonTM8000         = 0x7A,  ///< Processor Family - Efficeon TM8000
    ISCP_ProcessorFamilyWeitek                 = 0x80,  ///< Processor Family - Weitek
    ISCP_ProcessorFamilyItanium                = 0x82,  ///< Processor Family - Itanium
    ISCP_ProcessorFamilyAmdAthlon64            = 0x83,  ///< Processor Family - AMD Athlon64
    ISCP_ProcessorFamilyAmdOpteron             = 0x84,  ///< Processor Family - AMD Opeteron
    ISCP_ProcessorFamilyAmdSempron             = 0x85,  ///< Processor Family - AMD Sempron
    ISCP_ProcessorFamilyAmdTurion64Mobile      = 0x86,  ///< Processor Family - AMD Turion 64 Modbile
    ISCP_ProcessorFamilyDualCoreAmdOpteron     = 0x87,  ///< Processor Family - AMD Dual Core Opteron
    ISCP_ProcessorFamilyAmdAthlon64X2DualCore  = 0x88,  ///< Processor Family - AMD Athlon 64 X2 Dual Core
    ISCP_ProcessorFamilyAmdTurion64X2Mobile    = 0x89,  ///< Processor Family - AMD Turion 64 X2 Mobile
    ISCP_ProcessorFamilyQuadCoreAmdOpteron     = 0x8A,  ///< Processor Family - AMD Quad Core Opteron
    ISCP_ProcessorFamilyThirdGenerationAmdOpteron = 0x8B,  ///< Processor Family - AMD 3rd Generation Opteron
    ISCP_ProcessorFamilyAmdPhenomFxQuadCore    = 0x8C,  ///< Processor Family - AMD Phenom FX Quad Core
    ISCP_ProcessorFamilyAmdPhenomX4QuadCore    = 0x8D,  ///< Processor Family - AMD Phenom X4 Quad Core
    ISCP_ProcessorFamilyAmdPhenomX2DualCore    = 0x8E,  ///< Processor Family - AMD Phenom X2 Quad Core
    ISCP_ProcessorFamilyAmdAthlonX2DualCore    = 0x8F,  ///< Processor Family - AMD Athlon X2 Dual Core
    ISCP_ProcessorFamilyPARISC                 = 0x90,  ///< Processor Family - PARISC
    ISCP_ProcessorFamilyPaRisc8500             = 0x91,  ///< Processor Family - PARISC 8500
    ISCP_ProcessorFamilyPaRisc8000             = 0x92,  ///< Processor Family - PARISC 8000
    ISCP_ProcessorFamilyPaRisc7300LC           = 0x93,  ///< Processor Family - PARISC 7300LC
    ISCP_ProcessorFamilyPaRisc7200             = 0x94,  ///< Processor Family - PARISC 7200
    ISCP_ProcessorFamilyPaRisc7100LC           = 0x95,  ///< Processor Family - PARISC 7100LC
    ISCP_ProcessorFamilyPaRisc7100             = 0x96,  ///< Processor Family - PARISC 7100
    ISCP_ProcessorFamilyV30                    = 0xA0,  ///< Processor Family - V30
    ISCP_ProcessorFamilyQuadCoreIntelXeon3200Series  = 0xA1,  ///< Processor Family - Intel Quad Core Xeon 3200 Series
    ISCP_ProcessorFamilyDualCoreIntelXeon3000Series  = 0xA2,  ///< Processor Family - Intel Dual Core Xeon 3000 Series
    ISCP_ProcessorFamilyQuadCoreIntelXeon5300Series  = 0xA3,  ///< Processor Family - Intel Quad Core Xeon 5300 Series
    ISCP_ProcessorFamilyDualCoreIntelXeon5100Series  = 0xA4,  ///< Processor Family - Intel Dual Core Xeon 5100 Series
    ISCP_ProcessorFamilyDualCoreIntelXeon5000Series  = 0xA5,  ///< Processor Family - Intel Dual Core Xeon 5000 Series
    ISCP_ProcessorFamilyDualCoreIntelXeonLV          = 0xA6,  ///< Processor Family - Intel Dual Core Xeon LV
    ISCP_ProcessorFamilyDualCoreIntelXeonULV         = 0xA7,  ///< Processor Family - Intel Dual Core Xeon ULV
    ISCP_ProcessorFamilyDualCoreIntelXeon7100Series  = 0xA8,  ///< Processor Family - Intel Quad Core Xeon 7100 Series
    ISCP_ProcessorFamilyQuadCoreIntelXeon5400Series  = 0xA9,  ///< Processor Family - Intel Quad Core Xeon 5400 Series
    ISCP_ProcessorFamilyQuadCoreIntelXeon            = 0xAA,  ///< Processor Family - Intel Quad Core Xeon
    ISCP_ProcessorFamilyDualCoreIntelXeon5200Series  = 0xAB,  ///< Processor Family - Intel Dual Core Xeon 5200 Series
    ISCP_ProcessorFamilyDualCoreIntelXeon7200Series  = 0xAC,  ///< Processor Family - Intel Dual Core Xeon 7200 Series
    ISCP_ProcessorFamilyQuadCoreIntelXeon7300Series  = 0xAD,  ///< Processor Family - Intel Quad Core Xeon 7300 Series
    ISCP_ProcessorFamilyQuadCoreIntelXeon7400Series  = 0xAE,  ///< Processor Family - Intel Quad Core Xeon 7400 Series
    ISCP_ProcessorFamilyMultiCoreIntelXeon7400Series = 0xAF,  ///< Processor Family - Intel Multi-Core Xeon 7400 Series
    ISCP_ProcessorFamilyPentiumIIIXeon               = 0xB0,  ///< Processor Family - Intel Pentium III Xeon
    ISCP_ProcessorFamilyPentiumIIISpeedStep          = 0xB1,  ///< Processor Family - Intel Pentium III Speed Step
    ISCP_ProcessorFamilyPentium4                     = 0xB2,  ///< Processor Family - Pentium 4
    ISCP_ProcessorFamilyIntelXeon                    = 0xB3,  ///< Processor Family - Intel Xeon
    ISCP_ProcessorFamilyAS400                        = 0xB4,  ///< Processor Family - AS400
    ISCP_ProcessorFamilyIntelXeonMP                  = 0xB5,  ///< Processor Family - Intel Xeon MP
    ISCP_ProcessorFamilyAMDAthlonXP                  = 0xB6,  ///< Processor Family - AMD Athlon XP
    ISCP_ProcessorFamilyAMDAthlonMP                  = 0xB7,  ///< Processor Family - AMD Athlon MP
    ISCP_ProcessorFamilyIntelItanium2                = 0xB8,  ///< Processor Family - Intel Itanum2
    ISCP_ProcessorFamilyIntelPentiumM                = 0xB9,  ///< Processor Family - Intel Pentium M
    ISCP_ProcessorFamilyIntelCeleronD                = 0xBA,  ///< Processor Family - Intel Celeron D
    ISCP_ProcessorFamilyIntelPentiumD                = 0xBB,  ///< Processor Family - Intel Pentium D
    ISCP_ProcessorFamilyIntelPentiumEx               = 0xBC,  ///< Processor Family - Intel pentium Ex
    ISCP_ProcessorFamilyIntelCoreSolo                = 0xBD,  ///< Processor Family - Intel Core Solo
    ISCP_ProcessorFamilyReserved                     = 0xBE,  ///< Processor Family - Reserved
    ISCP_ProcessorFamilyIntelCore2                   = 0xBF,  ///< Processor Family - Intel Core 2
    ISCP_ProcessorFamilyIntelCore2Solo               = 0xC0,  ///< Processor Family - Intel Core 2 Solo
    ISCP_ProcessorFamilyIntelCore2Extreme            = 0xC1,  ///< Processor Family - Intel Core 2 Extreme
    ISCP_ProcessorFamilyIntelCore2Quad               = 0xC2,  ///< Processor Family - Intel Core 2 Quad
    ISCP_ProcessorFamilyIntelCore2ExtremeMobile      = 0xC3,  ///< Processor Family - Intel Core 2 Extremem Mobile
    ISCP_ProcessorFamilyIntelCore2DuoMobile          = 0xC4,  ///< Processor Family - Intel core 2 Duo Mobile
    ISCP_ProcessorFamilyIntelCore2SoloMobile         = 0xC5,  ///< Processor Family - Intel Core 2 Solo Mobile
    ISCP_ProcessorFamilyIntelCoreI7                  = 0xC6,  ///< Processor Family - Intel Core I7
    ISCP_ProcessorFamilyDualCoreIntelCeleron         = 0xC7,  ///< Processor Family - Intel Dual Core Celeron
    ISCP_ProcessorFamilyIBM390                       = 0xC8,  ///< Processor Family - IBM 390
    ISCP_ProcessorFamilyG4                           = 0xC9,  ///< Processor Family - G4
    ISCP_ProcessorFamilyG5                           = 0xCA,  ///< Processor Family - G5
    ISCP_ProcessorFamilyG6                           = 0xCB,  ///< Processor Family - G6
    ISCP_ProcessorFamilyzArchitecture                = 0xCC,  ///< Processor Family - zArchitecture
    ISCP_ProcessorFamilyIntelCoreI5                  = 0xCD,  ///< Processor Family - Intel Core I5
    ISCP_ProcessorFamilyIntelCoreI3                  = 0xCE,  ///< Processor Family - Intel Core I3
    ISCP_ProcessorFamilyViaC7M                       = 0xD2,  ///< Processor Family - Via C7M
    ISCP_ProcessorFamilyViaC7D                       = 0xD3,  ///< Processor Family - Via C7D
    ISCP_ProcessorFamilyViaC7                        = 0xD4,  ///< Processor Family - Via C7
    ISCP_ProcessorFamilyViaEden                      = 0xD5,  ///< Processor Family - Via Eden
    ISCP_ProcessorFamilyMultiCoreIntelXeon           = 0xD6,  ///< Processor Family - Intel Multi-core Xeon
    ISCP_ProcessorFamilyDualCoreIntelXeon3Series     = 0xD7,  ///< Processor Family - Intel Dual-core Xeon 3-Series
    ISCP_ProcessorFamilyQuadCoreIntelXeon3Series     = 0xD8,  ///< Processor Family - Intel Quad-core Xeon 3-Series
    ISCP_ProcessorFamilyViaNano                      = 0xD9,  ///< Processor Family - Via Nano
    ISCP_ProcessorFamilyDualCoreIntelXeon5Series     = 0xDA,  ///< Processor Family - Intel Dual-core Xeon 5-Series
    ISCP_ProcessorFamilyQuadCoreIntelXeon5Series     = 0xDB,  ///< Processor Family - Intel Quad-core Xeon 5-Series
    ISCP_ProcessorFamilyDualCoreIntelXeon7Series     = 0xDD,  ///< Processor Family - Intel Dual-core Xeon 7-Series
    ISCP_ProcessorFamilyQuadCoreIntelXeon7Series     = 0xDE,  ///< Processor Family - Intel Quad-core Xeon 7-Series
    ISCP_ProcessorFamilyMultiCoreIntelXeon7Series    = 0xDF,  ///< Processor Family - Intel Multi-core Xeon 7-Series
    ISCP_ProcessorFamilyMultiCoreIntelXeon3400Series = 0xE0,  ///< Processor Family - Intel Multi-core Xeon 3400-Series
    ISCP_ProcessorFamilyAmdOpteron3000Series         = 0xE4,  ///< Processor Family - AMD Opteron 3000 Series
    ISCP_ProcessorFamilyAmdSempronII                 = 0xE5,  ///< Processor Family - AMD Sempron II
    ISCP_ProcessorFamilyEmbeddedAmdOpteronQuadCore   = 0xE6,  ///< Processor Family - AMD Embedded Opteron Quad Core
    ISCP_ProcessorFamilyAmdPhenomTripleCore          = 0xE7,  ///< Processor Family - AMD Phonon Triple Core
    ISCP_ProcessorFamilyAmdTurionUltraDualCoreMobile = 0xE8,  ///< Processor Family - AMD Turion Ultra Dual Core Mobile
    ISCP_ProcessorFamilyAmdTurionDualCoreMobile      = 0xE9,  ///< Processor Family - AMD Turion Dual Core Mobile
    ISCP_ProcessorFamilyAmdAthlonDualCore            = 0xEA,  ///< Processor Family - AMD Turion Dual Core Mobile
    ISCP_ProcessorFamilyAmdSempronSI                 = 0xEB,  ///< Processor Family - AMD Sempron SI
    ISCP_ProcessorFamilyAmdPhenomII                  = 0xEC,  ///< Processor Family - AMD Phenon II
    ISCP_ProcessorFamilyAmdAthlonII                  = 0xED,  ///< Processor Family - AMD Athlon II
    ISCP_ProcessorFamilySixCoreAmdOpteron            = 0xEE,  ///< Processor Family - AMD 6-Core Opteron
    ISCP_ProcessorFamilyAmdSempronM                  = 0xEF,  ///< Processor Family - AMD Sempon M
    ISCP_ProcessorFamilyi860                         = 0xFA,  ///< Processor Family - i860
    ISCP_ProcessorFamilyi960                         = 0xFB,  ///< Processor Family - i960
    ISCP_ProcessorFamilyIndicatorFamily2             = 0xFE,  ///< Processor Family - Indicator Family 2
    ISCP_ProcessorFamilyReserved1                    = 0xFF   ///< Processor Family - Reserved
  } ISCP_PROCESSOR_FAMILY_DATA;

  /// Processor Information2 - Processor Family2.
  typedef enum {
    ISCP_ProcessorFamilySH3                   = 0x0104,  ///< ProcessorFamily - SH3
    ISCP_ProcessorFamilySH4                   = 0x0105,  ///< ProcessorFamily - SH4
    ISCP_ProcessorFamilyARM                   = 0x0118,  ///< ProcessorFamily - ARM
    ISCP_ProcessorFamilyStrongARM             = 0x0119,  ///< ProcessorFamily - Strong ARM
    ISCP_ProcessorFamily6x86                  = 0x012C,  ///< ProcessorFamily - x86
    ISCP_ProcessorFamilyMediaGX               = 0x012D,  ///< ProcessorFamily - Media GX
    ISCP_ProcessorFamilyMII                   = 0x012E,  ///< ProcessorFamily - MII
    ISCP_ProcessorFamilyWinChip               = 0x0140,  ///< ProcessorFamily - WinChip
    ISCP_ProcessorFamilyDSP                   = 0x015E,  ///< ProcessorFamily - DSP
    ISCP_ProcessorFamilyVideoProcessor        = 0x01F4   ///< ProcessorFamily - Video Processor
  } ISCP_PROCESSOR_FAMILY2_DATA;

  /// Processor Information - Processor Upgrade.
  typedef enum {
    ISCP_ProcessorUpgradeOther         = 0x01,          ///< Processor Upgrade - Other
    ISCP_ProcessorUpgradeUnknown       = 0x02,          ///< Processor Upgrade - Unknown
    ISCP_ProcessorUpgradeDaughterBoard = 0x03,          ///< Processor Upgrade - Daughter Board
    ISCP_ProcessorUpgradeZIFSocket     = 0x04,          ///< Processor Upgrade - ZIF Socket
    ISCP_ProcessorUpgradePiggyBack     = 0x05,          ///< Processor Upgrade - Piggyback
    ISCP_ProcessorUpgradeNone          = 0x06,          ///< Processor Upgrade - None
    ISCP_ProcessorUpgradeLIFSocket     = 0x07,          ///< Processor Upgrade - LIF Socket
    ISCP_ProcessorUpgradeSlot1         = 0x08,          ///< Processor Upgrade - Slot 1
    ISCP_ProcessorUpgradeSlot2         = 0x09,          ///< Processor Upgrade - Slot 2
    ISCP_ProcessorUpgrade370PinSocket  = 0x0A,          ///< Processor Upgrade - 370 Pin Socket
    ISCP_ProcessorUpgradeSlotA         = 0x0B,          ///< Processor Upgrade - Slot A
    ISCP_ProcessorUpgradeSlotM         = 0x0C,          ///< Processor Upgrade - Slot M
    ISCP_ProcessorUpgradeSocket423     = 0x0D,          ///< Processor Upgrade - Socket 423
    ISCP_ProcessorUpgradeSocketA       = 0x0E,          ///< Processor Upgrade - Socket A
    ISCP_ProcessorUpgradeSocket478     = 0x0F,          ///< Processor Upgrade - Socket 478
    ISCP_ProcessorUpgradeSocket754     = 0x10,          ///< Processor Upgrade - Socket 754
    ISCP_ProcessorUpgradeSocket940     = 0x11,          ///< Processor Upgrade - Socket 940
    ISCP_ProcessorUpgradeSocket939     = 0x12,          ///< Processor Upgrade - Socket 939
    ISCP_ProcessorUpgradeSocketmPGA604 = 0x13,          ///< Processor Upgrade - PGA 604
    ISCP_ProcessorUpgradeSocketLGA771  = 0x14,          ///< Processor Upgrade - LGA 771
    ISCP_ProcessorUpgradeSocketLGA775  = 0x15,          ///< Processor Upgrade - LGA 775
    ISCP_ProcessorUpgradeSocketS1      = 0x16,          ///< Processor Upgrade - S1
    ISCP_ProcessorUpgradeAM2           = 0x17,          ///< Processor Upgrade - AM2
    ISCP_ProcessorUpgradeF1207         = 0x18,          ///< Processor Upgrade - F1207
    ISCP_ProcessorSocketLGA1366        = 0x19,          ///< Processor Upgrade - LGA 1366
    ISCP_ProcessorUpgradeSocketG34     = 0x1A,          ///< Processor Upgrade - G34
    ISCP_ProcessorUpgradeSocketAM3     = 0x1B,          ///< Processor Upgrade - AM3
    ISCP_ProcessorUpgradeSocketC32     = 0x1C,          ///< Processor Upgrade - C32
    ISCP_ProcessorUpgradeSocketLGA1156 = 0x1D,          ///< Processor Upgrade - LGA 1156
    ISCP_ProcessorUpgradeSocketLGA1567 = 0x1E,          ///< Processor Upgrade - LGA 1567
    ISCP_ProcessorUpgradeSocketPGA988A = 0x1F,          ///< Processor Upgrade - PGA 988A
    ISCP_ProcessorUpgradeSocketBGA1288 = 0x20,          ///< Processor Upgrade - PGA 1288
    ISCP_ProcessorUpgradeSocketrPGA988B = 0x21,         ///< Processor Upgrade - PGA 988B
    ISCP_ProcessorUpgradeSocketBGA1023 = 0x22,          ///< Processor Upgrade - BGA 1023
    ISCP_ProcessorUpgradeSocketBGA1224 = 0x23,          ///< Processor Upgrade - BGA 1224
    ISCP_ProcessorUpgradeSocketLGA1155 = 0x24,          ///< Processor Upgrade - LGA 1155
    ISCP_ProcessorUpgradeSocketLGA1356 = 0x25,          ///< Processor Upgrade - LGA 1356
    ISCP_ProcessorUpgradeSocketLGA2011 = 0x26,          ///< Processor Upgrade - LGA 2011
    ISCP_ProcessorUpgradeSocketFS1     = 0x27,          ///< Processor Upgrade - FS1
    ISCP_ProcessorUpgradeSocketFS2     = 0x28,          ///< Processor Upgrade - FS2
    ISCP_ProcessorUpgradeSocketFM1     = 0x29,          ///< Processor Upgrade - FM1
    ISCP_ProcessorUpgradeSocketFM2     = 0x2A,          ///< Processor Upgrade - FM2
    ISCP_ProcessorUpgradeSocketLGA2011_3 = 0x2B,        ///< Processor Upgrade - LGA 2011-3
    ISCP_ProcessorUpgradeSocketLGA1356_3 = 0x2C         ///< Processor Upgrade - LGA 1356-3
  } ISCP_PROCESSOR_UPGRADE;

  /// CPU Information - Characteristics.
  typedef struct {
    UINT16  Reserved0                 :1;          ///< CPU Information - Reserved
    UINT16  Unknown                   :1;          ///< CPU Information - Unknown
    UINT16  Capable64Bit              :1;          ///< CPU Information - Capable 64-Bit
    UINT16  MultiCore                 :1;          ///< CPU Information - Multi-core
    UINT16  HardwareThread            :1;          ///< CPU Information - Hardware Thread
    UINT16  ExecuteProtection         :1;          ///< CPU Information - Execute Protection
    UINT16  EnhancedVirtualization    :1;          ///< CPU Information - Enhanced Virtualization
    UINT16  PowerPerformanceControl   :1;          ///< CPU Information - Power Performance Control
    UINT16  Reserved8_15              :8;          ///< CPU Information - Reserved
  } ISCP_PROCESSOR_CHARACTERISTICS;

  /// CPU Information - CPU Status.
  typedef enum {
    ISCP_CPU_STATUS_UNKNOWN = 0,                     ///< CPU Status - Unknown
    ISCP_CPU_STATUS_ENABLED,                         ///< CPU Status - Enabled
    ISCP_CPU_STATUS_DISABLED_BY_USER,                ///< CPU Status - Disabled by user
    ISCP_CPU_STATUS_DISABLED_BY_BIOS,                ///< CPU Status - Disabled by BIOS
    ISCP_CPU_STATUS_IDLE,                            ///< CPU Status - Idle
    ISCP_CPU_STATUS_RESERVED_5,                      ///< CPU Status - Reserved
    ISCP_CPU_STATUS_RESERVED_6,                      ///< CPU Status - Reserved
    ISCP_CPU_STATUS_OTHER                            ///< CPU Status - Other
  } ISCP_CPU_STATUS;


  /// CPU Information - Status.
  typedef struct {
    UINT16  CpuStatus                 :3;            ///< CPU Status
    UINT16  Reserved3_5               :3;            ///< Reserved Bits[5:3]
    UINT16  CpuSocketPopulated        :1;            ///< CPU Socket Populated
    UINT16  Reserved7_15              :9;            ///< Reserved Bits[15:9]
  } PROCESSOR_STATUS;

  /// Cache Information - Operation Mode.
  typedef enum {
    ISCP_CACHE_OPERATION_MODE_WRITE_THROUGH = 0,          ///< Cache Operation Mode Write Through
    ISCP_CACHE_OPERATION_MODE_WRITE_BACK,                 ///< Cache Operation Mode Write Back
    ISCP_CACHE_OPERATION_MODE_VARIES_WITH_MEMORY_ADDRESS, ///< Cache Operation Mode Varies with Memory Address
    ISCP_CACHE_OPERATION_MODE_UNKNOWN,                    ///< Cache Operation Mode Unknown
  } ISCP_CACHE_OPERATION_MODE;

  /// Cache Information - Location.
  typedef enum {
    ISCP_CACHE_LOCATION_INTERNAL = 0,               ///< Cache Location Internal
    ISCP_CACHE_LOCATION_EXTERNAL,                   ///< Cache Location External
    ISCP_CACHE_LOCATION_RESERVED,                   ///< Cache Location Reserved
    ISCP_CACHE_LOCATION_UNKNOWN,                    ///< Cache Location Unknown
  } ISCP_CACHE_LOCATION;

  /// Cache Information - Level.
  typedef enum {
    ISCP_CACHE_LEVEL_1 = 0,                         ///< Cache Level 1
    ISCP_CACHE_LEVEL_2,                             ///< Cache Level 2
    ISCP_CACHE_LEVEL_3,                             ///< Cache Level 3
    ISCP_CACHE_LEVEL_4,                             ///< Cache Level 4
  } ISCP_CACHE_LEVEL;

  /// Cache Information - Configuration.
  typedef struct {
    UINT16  CacheLevel                :3;            ///< Cache Level
    UINT16  CacheSocketd              :1;            ///< Cache Socket ID
    UINT16  Reserved_4                :1;            ///< Cache Reserved
    UINT16  Location                  :2;            ///< Cache Location
    UINT16  EnabledDisabled           :1;            ///< Cache Enabled / Disabled
    UINT16  OperationMode             :2;            ///< Operation Mode
    UINT16  Reserved10_15             :6;            ///< Cache Reserved
  } ISCP_CACHE_CONFIGURATION;

  /// Cache Information - SRAM Type.
  typedef struct {
    UINT16  Other                :1;                 ///< SRAM Type - Other
    UINT16  Unknown              :1;                 ///< SRAM Type - Unknown
    UINT16  NonBurst             :1;                 ///< SRAM Type - NonBurst
    UINT16  Burst                :1;                 ///< SRAM Type - Burst
    UINT16  PipelineBurst        :1;                 ///< SRAM Type - Pipeline Burst
    UINT16  Synchronous          :1;                 ///< SRAM Type - Synchronous
    UINT16  Asynchronous         :1;                 ///< SRAM Type - Asynchronous
    UINT16  Reserved7_15         :9;                 ///< SRAM Type - Reserved
  } ISCP_CACHE_SRAM_TYPE;

  /// Cache Information - Error Correction Type.
  typedef enum {
    ISCP_ECC_TYPE_OTHER = 1,                         ///< ECC Type - Other
    ISCP_ECC_TYPE_UNKNOWN,                           ///< ECC Type - Unknown
    ISCP_ECC_TYPE_NONE,                              ///< ECC Type - None
    ISCP_ECC_TYPE_PARITY,                            ///< ECC Type - Parity
    ISCP_ECC_TYPE_SINGLE_BIT,                        ///< ECC Type - Single-Bit
    ISCP_ECC_TYPE_MULTI_BIT                          ///< ECC Type - Multi-Bit
  } ISCP_CACHE_ECC_TYPE;

  /// Cache Information - System Cache Type.
  typedef enum {
    ISCP_SYSTEM_CACHE_TYPE_OTHER  = 1,               ///< System Cache Type - Other
    ISCP_SYSTEM_CACHE_TYPE_UNKNOWN,                  ///< System Cache Type - Unknown
    ISCP_SYSTEM_CACHE_TYPE_INSTRUCTION,              ///< System Cache Type - Instruction
    ISCP_SYSTEM_CACHE_TYPE_DATA,                     ///< System Cache Type - Data
    ISCP_SYSTEM_CACHE_TYPE_UNIFIED                   ///< System Cache Type - Unified
  } ISCP_SYSTEM_CACHE_TYPE;

  /// Cache Information - Associativity.
  typedef enum {
    ISCP_CACHE_ASSOCIATIVITY_OTHER = 1,                 ///< Cache Associativity - Other
    ISCP_CACHE_ASSOCIATIVITY_UNKNOWN,                   ///< Cache Associativity - Unknown
    ISCP_CACHE_ASSOCIATIVITY_DIRECT_MAPPED,             ///< Cache Associativity - Direct Mapped
    ISCP_CACHE_ASSOCIATIVITY_2_WAY_SET_ASSOCIATIVE,     ///< Cache Associativity - 2-way Set Assciative
    ISCP_CACHE_ASSOCIATIVITY_4_WAY_SET_ASSOCIATIVE,     ///< Cache Associativity - 4-way Set Assciative
    ISCP_CACHE_ASSOCIATIVITY_FULLY_ASSOCIATIVE,         ///< Cache Associativity - Fully Assciative
    ISCP_CACHE_ASSOCIATIVITY_8_WAY_SET_ASSOCIATIVE,     ///< Cache Associativity - 8-way Set Assciative
    ISCP_CACHE_ASSOCIATIVITY_16_WAY_SET_ASSOCIATIVE,    ///< Cache Associativity - 16-way Set Assciative
    ISCP_CACHE_ASSOCIATIVITY_12_WAY_SET_ASSOCIATIVE,    ///< Cache Associativity - 12-way Set Assciative
    ISCP_CACHE_ASSOCIATIVITY_24_WAY_SET_ASSOCIATIVE,    ///< Cache Associativity - 24-way Set Assciative
    ISCP_CACHE_ASSOCIATIVITY_32_WAY_SET_ASSOCIATIVE,    ///< Cache Associativity - 32-way Set Assciative
    ISCP_CACHE_ASSOCIATIVITY_48_WAY_SET_ASSOCIATIVE,    ///< Cache Associativity - 48-way Set Assciative
    ISCP_CACHE_ASSOCIATIVITY_64_WAY_SET_ASSOCIATIVE,    ///< Cache Associativity - 64-way Set Assciative
    ISCP_CACHE_ASSOCIATIVITY_20_WAY_SET_ASSOCIATIVE     ///< Cache Associativity - 20-way Set Assciative
  } ISCP_CACHE_ASSOCIATIVITY;

  /// DMI TYPE 4 - CPU Information
  typedef struct {
    UINT16                    T4ProcType;               ///< Processor Type
    UINT16                    T4ProcFamily;             ///< Processor Family
    ISCP_PROC_ID              T4ProcId;                 ///< Processor Id
    UINT16                    T4Voltage;                ///< Processor Voltage
    UINT16                    T4ExternalClock;          ///< Processor External Clock
    UINT16                    T4MaxSpeed;               ///< Processor Maximum Speed
    UINT16                    T4CurrentSpeed;           ///< Processor Current Speed
    UINT16                    T4Status;                 ///< Processor Status
    UINT16                    T4ProcUpgrade;            ///< Processor Upgrade
    UINT16                    T4CoreCount;              ///< Processor Core Count
    UINT16                    T4CoreEnabled;            ///< Processor Core Enabled
    UINT16                    T4ThreadCount;            ///< Processor Thread Count
    UINT16                    T4ProcCharacteristics;    ///< Processor Characteristics
    UINT16                    T4ProcFamily2;            ///< Processor Family 2
    UINT16                    T4CoreCount2;             ///< Processor Core Count 2
    UINT16                    T4CoreEnabled2;           ///< Processor Core Enabled 2
    UINT16                    T4ThreadCount2;           ///< Processor Thread Count 2
    UINT8                     T4SerialNumber[8];        ///< Processor Serial Number
  } ISCP_TYPE4_SMBIOS_INFO;

  /// DMI Type 7 - Cache Information
  typedef struct {
    UINT16                    T7CacheCfg;               ///< Cache Configuration
    UINT16                    T7MaxCacheSize;           ///< Maximum Cache Size
    UINT16                    T7InstallSize;            ///< Cache Install Size
    UINT16                    T7SupportedSramType;      ///< Supported SRAM Type
    UINT16                    T7CurrentSramType;        ///< Current SRAM Type
    UINT16                    T7CacheSpeed;             ///< Cache Speed in nanoseconds
    UINT16                    T7ErrorCorrectionType;    ///< Cache Error Correction Type
    UINT16                    T7SystemCacheType;        ///< System Cache Type
    UINT16                    T7Associativity;          ///< Cache Associativity
  } ISCP_TYPE7_SMBIOS_INFO;

  #ifdef __cplusplus
  }
#endif


#endif /* CPUISCP_H_ */
