/** @file

  Defines the X64 Namespace Object.

  Copyright (C) 2024 - 2025 Advanced Micro Devices, Inc. All rights reserved.

  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Glossary:
    - Cm or CM   - Configuration Manager
    - Obj or OBJ - Object
    - X64 or x64 - X64 Architecture
**/

#pragma once

#include <AcpiObjects.h>
#include <StandardNameSpaceObjects.h>
#include <ArchCommonNameSpaceObjects.h>

#pragma pack(1)

/** The LOCAL_APIC_MODE enum describes the Local APIC
    mode in the X64 Namespace
*/
typedef enum {
  LocalApicModeInvalid = 0,
  LocalApicModeXApic,
  LocalApicModeX2Apic
} LOCAL_APIC_MODE;

/** The EX64_OBJECT_ID enum describes the Object IDs
    in the X64 Namespace
*/
typedef enum X64ObjectID {
  EX64ObjReserved,                    ///<  0 - Reserved
  EX64ObjFadtSciInterrupt,            ///<  1 - FADT SCI Interrupt information
  EX64ObjFadtSciCmdInfo,              ///<  2 - FADT SCI CMD information
  EX64ObjFadtPmBlockInfo,             ///<  3 - FADT Power management block info
  EX64ObjFadtGpeBlockInfo,            ///<  4 - FADT GPE block info
  EX64ObjFadtXpmBlockInfo,            ///<  5 - FADT 64-bit Power Management block info
  EX64ObjFadtXgpeBlockInfo,           ///<  6 - FADT 64-bit GPE block info
  EX64ObjFadtSleepBlockInfo,          ///<  7 - FADT Sleep block info
  EX64ObjFadtResetBlockInfo,          ///<  8 - FADT Reset block info
  EX64ObjFadtMiscInfo,                ///<  9 - FADT Legacy fields info
  EX64ObjWsmtFlagsInfo,               ///< 10 - WSMT protection flags info
  EX64ObjHpetInfo,                    ///< 11 - HPET device info
  EX64ObjMadtInfo,                    ///< 12 - MADT info
  EX64ObjLocalApicX2ApicInfo,         ///< 13 - Local APIC and X2APIC info
  EX64ObjIoApicInfo,                  ///< 14 - IO APIC info
  EX64ObjIntrSourceOverrideInfo,      ///< 15 - Interrupt Source Override info
  EX64ObjLocalApicX2ApicNmiInfo,      ///< 16 - Local APIC and X2APIC NMI info
  EX64ObjFacsInfo,                    ///< 17 - FACS info
  EX64ObjLocalApicX2ApicAffinityInfo, ///< 18 - Local APIC and X2APIC Affinity info
  EX64ObjMax                          ///< 19 - Maximum Object ID
} EX64_OBJECT_ID;

/** A structure that describes the
    SCI interrupt Information for the Platform.

    ID: EX64ObjFadtSciInterrupt
*/
typedef struct CmX64FadtSciInterrupt {
  /** This is the SCI interrupt field of the FADT Table
      described in the ACPI Specification
  */
  UINT16    SciInterrupt;
} CM_X64_FADT_SCI_INTERRUPT;

/** A structure that describes the
    SCI CMD Information for the Platform.

    ID: EX64ObjFadtSciCmdInfo
*/
typedef struct CmX64FadtSciCmdInfo {
  /** This is the System control interrupt command information of the FADT Table
      described in the ACPI Specification
  */
  UINT32    SciCmd;
  UINT8     AcpiEnable;
  UINT8     AcpiDisable;
  UINT8     S4BiosReq;
  UINT8     PstateCnt;
  UINT8     CstCnt;
} CM_X64_FADT_SCI_CMD_INFO;

/** A structure that describes the
    power management block information.

    ID: EX64ObjFadtPmBlockInfo
*/
typedef struct CmX64FadtPmBlockInfo {
  /** This is the PM event block information of the FADT Table
      described in the ACPI Specification
  */
  UINT32    Pm1aEvtBlk;
  UINT32    Pm1bEvtBlk;
  UINT32    Pm1aCntBlk;
  UINT32    Pm1bCntBlk;
  UINT32    Pm2CntBlk;
  UINT32    PmTmrBlk;
  UINT8     Pm1EvtLen;
  UINT8     Pm1CntLen;
  UINT8     Pm2CntLen;
  UINT8     PmTmrLen;
} CM_X64_FADT_PM_BLOCK_INFO;

/** A structure that describes the
    GPE block information.

    ID: EX64ObjFadtGpeBlockInfo
*/
typedef struct CmX64FadtGpeBlockInfo {
  /** This is the GPE Block information of the FADT Table
      described in the ACPI Specification
  */
  UINT32    Gpe0Blk;
  UINT32    Gpe1Blk;
  UINT8     Gpe0BlkLen;
  UINT8     Gpe1BlkLen;
  UINT8     Gpe1Base;
} CM_X64_FADT_GPE_BLOCK_INFO;

/** A structure that describes the
    64bit power management block information.

    ID: EX64ObjFadtXpmBlockInfo
*/
typedef struct CmX64FadtXpmBlockInfo {
  /** This is the System control interrupt command information of the FADT Table
      described in the ACPI Specification
  */
  EFI_ACPI_6_5_GENERIC_ADDRESS_STRUCTURE    XPm1aEvtBlk;
  EFI_ACPI_6_5_GENERIC_ADDRESS_STRUCTURE    XPm1bEvtBlk;
  EFI_ACPI_6_5_GENERIC_ADDRESS_STRUCTURE    XPm1aCntBlk;
  EFI_ACPI_6_5_GENERIC_ADDRESS_STRUCTURE    XPm1bCntBlk;
  EFI_ACPI_6_5_GENERIC_ADDRESS_STRUCTURE    XPm2CntBlk;
  EFI_ACPI_6_5_GENERIC_ADDRESS_STRUCTURE    XPmTmrBlk;
} CM_X64_FADT_X_PM_BLOCK_INFO;

/** A structure that describes the
    64-bit GPE block information.

    ID: EX64ObjFadtXgpeBlockInfo
*/
typedef struct CmX64FadtXgpeBlockInfo {
  /** This is the GPE Block information of the FADT Table
      described in the ACPI Specification
  */
  EFI_ACPI_6_5_GENERIC_ADDRESS_STRUCTURE    XGpe0Blk;
  EFI_ACPI_6_5_GENERIC_ADDRESS_STRUCTURE    XGpe1Blk;
} CM_X64_FADT_X_GPE_BLOCK_INFO;

/** A structure that describes the
    sleep control block information.

    ID: EX64ObjFadtSleepBlockInfo
*/
typedef struct CmX64FadtSleepBlockInfo {
  EFI_ACPI_6_5_GENERIC_ADDRESS_STRUCTURE    SleepControlReg;
  EFI_ACPI_6_5_GENERIC_ADDRESS_STRUCTURE    SleepStatusReg;
} CM_X64_FADT_SLEEP_BLOCK_INFO;

/** A structure that describes the
    Reset control block information.

    ID: EX64ObjFadtResetBlockInfo
*/
typedef struct CmX64FadtResetBlockInfo {
  EFI_ACPI_6_5_GENERIC_ADDRESS_STRUCTURE    ResetReg;
  UINT8                                     ResetValue;
} CM_X64_FADT_RESET_BLOCK_INFO;

/** A structure that describes the
    miscellaneous FADT fields information.

    ID: EX64ObjFadtMiscInfo
*/
typedef struct CmX64FadtFadtMiscInfo {
  UINT16    PLvl2Lat;
  UINT16    PLvl3Lat;
  UINT16    FlushSize;
  UINT16    FlushStride;
  UINT8     DutyOffset;
  UINT8     DutyWidth;
  UINT8     DayAlrm;
  UINT8     MonAlrm;
  UINT8     Century;
} CM_X64_FADT_MISC_INFO;

/**
  A structure that describes the WSMT protection flags information.

  ID: EX64ObjWsmtFlagsInfo
*/
typedef struct CmX64WsmtFlagsInfo {
  UINT32    ProtectionFlags;
} CM_X64_WSMT_FLAGS_INFO;

/**
  A structure that describes the HPET device information.

  ID: EX64ObjHpetInfo
*/
typedef struct CmX64HpetInfo {
  UINT32    BaseAddressLower32Bit;
  UINT16    MainCounterMinimumClockTickInPeriodicMode;
  UINT8     PageProtectionAndOemAttribute;
} CM_X64_HPET_INFO;

/**
  A structure that describes the MADT information.

  ID: EX64ObjMadtInfo
*/
typedef struct CmX64MadtInfo {
  UINT32             LocalApicAddress;
  UINT32             Flags;
  LOCAL_APIC_MODE    ApicMode;
} CM_X64_MADT_INFO;

/**
  A structure that describes the Local APIC and X2APIC information.
  This structure includes fields from the ACPI_6_5_LOCAL_APIC_STRUCTURE
  and ACPI_6_5_LOCAL_X2APIC_STRUCTURE from the ACPI specifications.
  Additional fields are included to support CPU SSDT topology generation.

  ID: EX64ObjLocalApicX2ApicInfo
*/
typedef struct CmX64LocalApicX2ApicInfo {
  UINT32             ApicId;
  UINT32             Flags;
  UINT32             AcpiProcessorUid;

  /** Optional field: Reference Token for the Cst info of this processor.
      i.e. a token referencing a CM_ARCH_COMMON_OBJ_REF,
      which in turn refers to an array of CM_ARCH_COMMON_OBJ_REF objects,
      each pointing to individual CM_ARCH_COMMON_CST_INFO objects.
  */
  CM_OBJECT_TOKEN    CstToken;

  /** Optional field: Reference Token for the Csd info of this processor.
      i.e. a token referencing a CM_ARCH_COMMON_CSD_INFO object.
  */
  CM_OBJECT_TOKEN    CsdToken;

  /** Optional field: Reference Token for the Pct info of this processor.
      i.e. a token referencing a CM_ARCH_COMMON_Pct_INFO object.
  */
  CM_OBJECT_TOKEN    PctToken;

  /** Optional field: Reference Token for the Pss info of this processor.
      i.e. a token referencing a CM_ARCH_COMMON_PSS_INFO object.
  */
  CM_OBJECT_TOKEN    PssToken;

  /** Optional field: Reference Token for the Ppc info of this processor.
      i.e. a token referencing a CM_ARCH_COMMON_PPC_INFO object.
  */
  CM_OBJECT_TOKEN    PpcToken;

  /** Optional field: Reference Token for the Psd info of this processor.
      i.e. a token referencing a CM_ARCH_COMMON_PSD_INFO object.
  */
  CM_OBJECT_TOKEN    PsdToken;

  /** Optional field: Reference Token for the Cpc info of this processor.
      i.e. a token referencing a CM_ARCH_COMMON_CPC_INFO object.
  */
  CM_OBJECT_TOKEN    CpcToken;

  /** Optional field: Reference Token for _STA info of this processor.
      i.e. a token referencing a CM_ARCH_COMMON_STA_INFO object.
   */
  CM_OBJECT_TOKEN    StaToken;
} CM_X64_LOCAL_APIC_X2APIC_INFO;

/**
  A structure that describes the IO APIC information.

  ID: EX64ObjIoApicInfo
*/
typedef struct CmX64IoApicInfo {
  UINT8     IoApicId;
  UINT32    IoApicAddress;
  UINT32    GlobalSystemInterruptBase;
} CM_X64_IO_APIC_INFO;

/**
  A structure that describes the Interrupt Source Override information.

  ID: EX64ObjIntrSourceOverrideInfo
*/
typedef struct CmX64IntrSourceOverrideInfo {
  UINT8     Bus;
  UINT8     Source;
  UINT32    GlobalSystemInterrupt;
  UINT16    Flags;
} CM_X64_INTR_SOURCE_OVERRIDE_INFO;

/**
  A structure that describes the Local APIC NMI information.

  ID: EX64ObjLocalApicX2ApicNmiInfo
*/
typedef struct CmX64LocalApicX2ApicNmiInfo {
  UINT16    Flags;
  UINT32    AcpiProcessorUid;
  UINT8     LocalApicLint;
} CM_X64_LOCAL_APIC_X2APIC_NMI_INFO;

/**
  A structure that describes the FACS information.

  ID: EX64ObjFacsInfo
*/
typedef struct CmX64FacsInfo {
  UINT32    FirmwareWakingVector;
  UINT32    Flags;
  UINT64    XFirmwareWakingVector;
  UINT32    OspmFlags;
} CM_X64_FACS_INFO;

/**
  A structure that describes the Local APIC and X2APIC Affinity information.

  ID: EX64ObjLocalApicX2ApicAffinityInfo
 */
typedef struct CmX64LocalApicX2ApicAffinityInfo {
  LOCAL_APIC_MODE    ApicMode;
  UINT32             ApicId;
  UINT32             ProximityDomain;
  UINT32             Flags;
  UINT32             ClockDomain;

  /** Optional field: Reference Token to the ProximityDomain this object
      belongs to. If set to CM_NULL_TOKEN, the following field is used:
        CM_X64_LOCAL_APIC_X2APIC_AFFINITY_INFO.ProximityDomain
  */
  CM_OBJECT_TOKEN    ProximityDomainToken;

  /** Optional field: Reference Token to the ProximityDomain this object
      belongs to. If set to CM_NULL_TOKEN, the following field is used:
        CM_X64_LOCAL_APIC_X2APIC_AFFINITY_INFO.ClockDomain
  */
  CM_OBJECT_TOKEN    ClockDomainToken;
} CM_X64_LOCAL_APIC_X2APIC_AFFINITY_INFO;

#pragma pack()
