/** @file
  CPUID leaf definitions.

  Provides defines for CPUID leaf indexes.  Data structures are provided for
  registers returned by a CPUID leaf that contain one or more bit fields.
  If a register returned is a single 32-bit value, then a data structure is
  not provided for that register.

  Copyright (c) 2017, Advanced Micro Devices. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Specification Reference:
  AMD64 Architecture Programming Manual volume 2, March 2017, Sections 15.34

**/

#ifndef __AMD_CPUID_H__
#define __AMD_CPUID_H__

/**
CPUID Signature Information

@param   EAX  CPUID_SIGNATURE (0x00)

@retval  EAX  Returns the highest value the CPUID instruction recognizes for
              returning basic processor information. The value is returned is
              processor specific.
@retval  EBX  First 4 characters of a vendor identification string.
@retval  ECX  Last 4 characters of a vendor identification string.
@retval  EDX  Middle 4 characters of a vendor identification string.

**/

///
/// @{ CPUID signature values returned by AMD processors
///
#define CPUID_SIGNATURE_AUTHENTIC_AMD_EBX  SIGNATURE_32 ('A', 'u', 't', 'h')
#define CPUID_SIGNATURE_AUTHENTIC_AMD_EDX  SIGNATURE_32 ('e', 'n', 't', 'i')
#define CPUID_SIGNATURE_AUTHENTIC_AMD_ECX  SIGNATURE_32 ('c', 'A', 'M', 'D')
///
/// @}
///


/**
  CPUID Extended Processor Signature and Features

  @param   EAX  CPUID_EXTENDED_CPU_SIG (0x80000001)

  @retval  EAX  Extended Family, Model, Stepping Identifiers
                described by the type CPUID_AMD_EXTENDED_CPU_SIG_EAX.
  @retval  EBX  Brand Identifier
                described by the type CPUID_AMD_EXTENDED_CPU_SIG_EBX.
  @retval  ECX  Extended Feature Identifiers
                described by the type CPUID_AMD_EXTENDED_CPU_SIG_ECX.
  @retval  EDX  Extended Feature Identifiers
                described by the type CPUID_AMD_EXTENDED_CPU_SIG_EDX.
**/

/**
  CPUID Extended Processor Signature and Features EAX for CPUID leaf
  #CPUID_EXTENDED_CPU_SIG.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 3:0] Stepping.
    ///
    UINT32  Stepping:4;
    ///
    /// [Bits 7:4] Base Model.
    ///
    UINT32  BaseModel:4;
    ///
    /// [Bits 11:8] Base Family.
    ///
    UINT32  BaseFamily:4;
    ///
    /// [Bit 15:12] Reserved.
    ///
    UINT32  Reserved1:4;
    ///
    /// [Bits 19:16] Extended Model.
    ///
    UINT32  ExtModel:4;
    ///
    /// [Bits 27:20] Extended Family.
    ///
    UINT32  ExtFamily:8;
    ///
    /// [Bit 31:28] Reserved.
    ///
    UINT32  Reserved2:4;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_AMD_EXTENDED_CPU_SIG_EAX;

/**
  CPUID Extended Processor Signature and Features EBX for CPUID leaf
  #CPUID_EXTENDED_CPU_SIG.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 27:0] Reserved.
    ///
    UINT32  Reserved:28;
    ///
    /// [Bit 31:28] Package Type.
    ///
    UINT32  PkgType:4;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_AMD_EXTENDED_CPU_SIG_EBX;

/**
  CPUID Extended Processor Signature and Features ECX for CPUID leaf
  #CPUID_EXTENDED_CPU_SIG.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] LAHF/SAHF available in 64-bit mode.
    ///
    UINT32  LAHF_SAHF:1;
    ///
    /// [Bit 1] Core multi-processing legacy mode.
    ///
    UINT32  CmpLegacy:1;
    ///
    /// [Bit 2] Secure Virtual Mode feature.
    ///
    UINT32  SVM:1;
    ///
    /// [Bit 3] Extended APIC register space.
    ///
    UINT32  ExtApicSpace:1;
    ///
    /// [Bit 4] LOCK MOV CR0 means MOV CR8.
    ///
    UINT32  AltMovCr8:1;
    ///
    /// [Bit 5] LZCNT instruction support.
    ///
    UINT32  LZCNT:1;
    ///
    /// [Bit 6] SSE4A instruction support.
    ///
    UINT32  SSE4A:1;
    ///
    /// [Bit 7] Misaligned SSE Mode.
    ///
    UINT32  MisAlignSse:1;
    ///
    /// [Bit 8] ThreeDNow Prefetch instructions.
    ///
    UINT32  PREFETCHW:1;
    ///
    /// [Bit 9] OS Visible Work-around support.
    ///
    UINT32  OSVW:1;
    ///
    /// [Bit 10] Instruction Based Sampling.
    ///
    UINT32  IBS:1;
    ///
    /// [Bit 11] Extended Operation Support.
    ///
    UINT32  XOP:1;
    ///
    /// [Bit 12] SKINIT and STGI support.
    ///
    UINT32  SKINIT:1;
    ///
    /// [Bit 13] Watchdog Timer support.
    ///
    UINT32  WDT:1;
    ///
    /// [Bit 14] Reserved.
    ///
    UINT32  Reserved1:1;
    ///
    /// [Bit 15] Lightweight Profiling support.
    ///
    UINT32  LWP:1;
    ///
    /// [Bit 16] 4-Operand FMA instruction support.
    ///
    UINT32  FMA4:1;
    ///
    /// [Bit 17] Translation Cache Extension.
    ///
    UINT32  TCE:1;
    ///
    /// [Bit 21:18] Reserved.
    ///
    UINT32  Reserved2:4;
    ///
    /// [Bit 22] Topology Extensions support.
    ///
    UINT32  TopologyExtensions:1;
    ///
    /// [Bit 23] Core Performance Counter Extensions.
    ///
    UINT32  PerfCtrExtCore:1;
    ///
    /// [Bit 25:24] Reserved.
    ///
    UINT32  Reserved3:2;
    ///
    /// [Bit 26] Data Breakpoint Extension.
    ///
    UINT32  DataBreakpointExtension:1;
    ///
    /// [Bit 27] Performance Time-Stamp Counter.
    ///
    UINT32  PerfTsc:1;
    ///
    /// [Bit 28] L3 Performance Counter Extensions.
    ///
    UINT32  PerfCtrExtL3:1;
    ///
    /// [Bit 29] MWAITX and MONITORX capability.
    ///
    UINT32  MwaitExtended:1;
    ///
    /// [Bit 31:30] Reserved.
    ///
    UINT32  Reserved4:2;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_AMD_EXTENDED_CPU_SIG_ECX;

/**
  CPUID Extended Processor Signature and Features EDX for CPUID leaf
  #CPUID_EXTENDED_CPU_SIG.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] x87 floating point unit on-chip.
    ///
    UINT32  FPU:1;
    ///
    /// [Bit 1] Virtual-mode enhancements.
    ///
    UINT32  VME:1;
    ///
    /// [Bit 2] Debugging extensions, IO breakpoints, CR4.DE.
    ///
    UINT32  DE:1;
    ///
    /// [Bit 3] Page-size extensions (4 MB pages).
    ///
    UINT32  PSE:1;
    ///
    /// [Bit 4] Time stamp counter, RDTSC/RDTSCP instructions, CR4.TSD.
    ///
    UINT32  TSC:1;
    ///
    /// [Bit 5] MSRs, with RDMSR and WRMSR instructions.
    ///
    UINT32  MSR:1;
    ///
    /// [Bit 6] Physical-address extensions (PAE).
    ///
    UINT32  PAE:1;
    ///
    /// [Bit 7] Machine check exception, CR4.MCE.
    ///
    UINT32  MCE:1;
    ///
    /// [Bit 8] CMPXCHG8B instruction.
    ///
    UINT32  CMPXCHG8B:1;
    ///
    /// [Bit 9] APIC exists and is enabled.
    ///
    UINT32  APIC:1;
    ///
    /// [Bit 10] Reserved.
    ///
    UINT32  Reserved1:1;
    ///
    /// [Bit 11] SYSCALL and SYSRET instructions.
    ///
    UINT32  SYSCALL_SYSRET:1;
    ///
    /// [Bit 12] Memory-type range registers.
    ///
    UINT32  MTRR:1;
    ///
    /// [Bit 13] Page global extension, CR4.PGE.
    ///
    UINT32  PGE:1;
    ///
    /// [Bit 14] Machine check architecture, MCG_CAP.
    ///
    UINT32  MCA:1;
    ///
    /// [Bit 15] Conditional move instructions, CMOV, FCOMI, FCMOV.
    ///
    UINT32  CMOV:1;
    ///
    /// [Bit 16] Page attribute table.
    ///
    UINT32  PAT:1;
    ///
    /// [Bit 17] Page-size extensions.
    ///
    UINT32  PSE36 : 1;
    ///
    /// [Bit 19:18] Reserved.
    ///
    UINT32  Reserved2:2;
    ///
    /// [Bit 20] No-execute page protection.
    ///
    UINT32  NX:1;
    ///
    /// [Bit 21] Reserved.
    ///
    UINT32  Reserved3:1;
    ///
    /// [Bit 22] AMD Extensions to MMX instructions.
    ///
    UINT32  MmxExt:1;
    ///
    /// [Bit 23] MMX instructions.
    ///
    UINT32  MMX:1;
    ///
    /// [Bit 24] FXSAVE and FXRSTOR instructions.
    ///
    UINT32  FFSR:1;
    ///
    /// [Bit 25] FXSAVE and FXRSTOR instruction optimizations.
    ///
    UINT32  FFXSR:1;
    ///
    /// [Bit 26] 1-GByte large page support.
    ///
    UINT32  Page1GB:1;
    ///
    /// [Bit 27] RDTSCP instructions.
    ///
    UINT32  RDTSCP:1;
    ///
    /// [Bit 28] Reserved.
    ///
    UINT32  Reserved4:1;
    ///
    /// [Bit 29] Long Mode.
    ///
    UINT32  LM:1;
    ///
    /// [Bit 30] 3DNow! instructions.
    ///
    UINT32  ThreeDNow:1;
    ///
    /// [Bit 31] AMD Extensions to 3DNow! instructions.
    ///
    UINT32  ThreeDNowExt:1;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_AMD_EXTENDED_CPU_SIG_EDX;


/**
CPUID Linear Physical Address Size

@param   EAX  CPUID_VIR_PHY_ADDRESS_SIZE (0x80000008)

@retval  EAX  Linear/Physical Address Size described by the type
              CPUID_AMD_VIR_PHY_ADDRESS_SIZE_EAX.
@retval  EBX  Linear/Physical Address Size described by the type
              CPUID_AMD_VIR_PHY_ADDRESS_SIZE_EBX.
@retval  ECX  Linear/Physical Address Size described by the type
              CPUID_AMD_VIR_PHY_ADDRESS_SIZE_ECX.
@retval  EDX  Reserved.
**/

/**
  CPUID Linear Physical Address Size EAX for CPUID leaf
  #CPUID_VIR_PHY_ADDRESS_SIZE.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 7:0] Maximum physical byte address size in bits.
    ///
    UINT32  PhysicalAddressBits:8;
    ///
    /// [Bits 15:8] Maximum linear byte address size in bits.
    ///
    UINT32  LinearAddressBits:8;
    ///
    /// [Bits 23:16] Maximum guest physical byte address size in bits.
    ///
    UINT32  GuestPhysAddrSize:8;
    ///
    /// [Bit 31:24] Reserved.
    ///
    UINT32  Reserved:8;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_AMD_VIR_PHY_ADDRESS_SIZE_EAX;

/**
  CPUID Linear Physical Address Size EBX for CPUID leaf
  #CPUID_VIR_PHY_ADDRESS_SIZE.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 0] Clear Zero Instruction.
    ///
    UINT32  CLZERO:1;
    ///
    /// [Bits 1] Instructions retired count support.
    ///
    UINT32  IRPerf:1;
    ///
    /// [Bits 2] Restore error pointers for XSave instructions.
    ///
    UINT32  XSaveErPtr:1;
    ///
    /// [Bit 31:3] Reserved.
    ///
    UINT32  Reserved:29;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_AMD_VIR_PHY_ADDRESS_SIZE_EBX;

/**
  CPUID Linear Physical Address Size ECX for CPUID leaf
  #CPUID_VIR_PHY_ADDRESS_SIZE.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 7:0] Number of threads - 1.
    ///
    UINT32  NC:8;
    ///
    /// [Bit 11:8] Reserved.
    ///
    UINT32  Reserved1:4;
    ///
    /// [Bits 15:12] APIC ID size.
    ///
    UINT32  ApicIdCoreIdSize:4;
    ///
    /// [Bits 17:16] Performance time-stamp counter size.
    ///
    UINT32  PerfTscSize:2;
    ///
    /// [Bit 31:18] Reserved.
    ///
    UINT32  Reserved2:14;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_AMD_VIR_PHY_ADDRESS_SIZE_ECX;


/**
  CPUID AMD Processor Topology

  @param   EAX  CPUID_AMD_PROCESSOR_TOPOLOGY (0x8000001E)

  @retval  EAX  Extended APIC ID described by the type
                CPUID_AMD_PROCESSOR_TOPOLOGY_EAX.
  @retval  EBX  Core Identifiers described by the type
                CPUID_AMD_PROCESSOR_TOPOLOGY_EBX.
  @retval  ECX  Node Identifiers described by the type
                CPUID_AMD_PROCESSOR_TOPOLOGY_ECX.
  @retval  EDX  Reserved.
**/
#define CPUID_AMD_PROCESSOR_TOPOLOGY             0x8000001E

/**
  CPUID AMD Processor Topology EAX for CPUID leaf
  #CPUID_AMD_PROCESSOR_TOPOLOGY.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 31:0] Extended APIC Id.
    ///
    UINT32  ExtendedApicId;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_AMD_PROCESSOR_TOPOLOGY_EAX;

/**
  CPUID AMD Processor Topology EBX for CPUID leaf
  #CPUID_AMD_PROCESSOR_TOPOLOGY.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 7:0] Core Id.
    ///
    UINT32  CoreId:8;
    ///
    /// [Bits 15:8] Threads per core.
    ///
    UINT32  ThreadsPerCore:8;
    ///
    /// [Bit 31:16] Reserved.
    ///
    UINT32  Reserved:16;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_AMD_PROCESSOR_TOPOLOGY_EBX;

/**
  CPUID AMD Processor Topology ECX for CPUID leaf
  #CPUID_AMD_PROCESSOR_TOPOLOGY.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bits 7:0] Node Id.
    ///
    UINT32  NodeId:8;
    ///
    /// [Bits 10:8] Nodes per processor.
    ///
    UINT32  NodesPerProcessor:3;
    ///
    /// [Bit 31:11] Reserved.
    ///
    UINT32  Reserved:21;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_AMD_PROCESSOR_TOPOLOGY_ECX;


/**
  CPUID Memory Encryption Information

  @param   EAX  CPUID_MEMORY_ENCRYPTION_INFO (0x8000001F)

  @retval  EAX  Returns the memory encryption feature support status.
  @retval  EBX  If memory encryption feature is present then return
                the page table bit number used to enable memory encryption support
                and reducing of physical address space in bits.
  @retval  ECX  Returns number of encrypted guest supported simultaneously.
  @retval  EDX  Returns minimum SEV enabled and SEV disabled ASID.

  <b>Example usage</b>
  @code
  UINT32 Eax;
  UINT32 Ebx;
  UINT32 Ecx;
  UINT32 Edx;

  AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, &Eax, &Ebx, &Ecx, &Edx);
  @endcode
**/

#define CPUID_MEMORY_ENCRYPTION_INFO             0x8000001F

/**
  CPUID Memory Encryption support information EAX for CPUID leaf
  #CPUID_MEMORY_ENCRYPTION_INFO.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 0] Secure Memory Encryption (Sme) Support
    ///
    UINT32  SmeBit:1;

    ///
    /// [Bit 1] Secure Encrypted Virtualization (Sev) Support
    ///
    UINT32  SevBit:1;

    ///
    /// [Bit 2] Page flush MSR support
    ///
    UINT32  PageFlushMsrBit:1;

    ///
    /// [Bit 3] Encrypted state support
    ///
    UINT32  SevEsBit:1;

    ///
    /// [Bit 31:4] Reserved
    ///
    UINT32  ReservedBits:28;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_MEMORY_ENCRYPTION_INFO_EAX;

/**
  CPUID Memory Encryption support information EBX for CPUID leaf
  #CPUID_MEMORY_ENCRYPTION_INFO.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 5:0] Page table bit number used to enable memory encryption
    ///
    UINT32  PtePosBits:6;

    ///
    /// [Bit 11:6] Reduction of system physical address space bits when
    ///  memory encryption is enabled
    ///
    UINT32  ReducedPhysBits:5;

    ///
    /// [Bit 31:12] Reserved
    ///
    UINT32  ReservedBits:21;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_MEMORY_ENCRYPTION_INFO_EBX;

/**
  CPUID Memory Encryption support information ECX for CPUID leaf
  #CPUID_MEMORY_ENCRYPTION_INFO.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 31:0] Number of encrypted guest supported simultaneously
    ///
    UINT32  NumGuests;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_MEMORY_ENCRYPTION_INFO_ECX;

/**
  CPUID Memory Encryption support information EDX for CPUID leaf
  #CPUID_MEMORY_ENCRYPTION_INFO.
**/
typedef union {
  ///
  /// Individual bit fields
  ///
  struct {
    ///
    /// [Bit 31:0] Minimum SEV enabled, SEV-ES disabled ASID
    ///
    UINT32  MinAsid;
  } Bits;
  ///
  /// All bit fields as a 32-bit value
  ///
  UINT32  Uint32;
} CPUID_MEMORY_ENCRYPTION_INFO_EDX;

#endif
