/** @file
  ACPI Low Power Idle Table (LPIT) definitions

  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
  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.

  @par Revision Reference:
    - ACPI Low Power Idle Table (LPIT) Revision 001, dated July 2014
      http://www.uefi.org/sites/default/files/resources/ACPI_Low_Power_Idle_Table.pdf

  @par Glossary:
    - GAS - Generic Address Structure
    - LPI - Low Power Idle
**/
#ifndef _LOW_POWER_IDLE_TABLE_H_
#define _LOW_POWER_IDLE_TABLE_H_

#include <IndustryStandard/Acpi.h>

#pragma pack(1)

///
/// LPI Structure Types
///
#define ACPI_LPI_STRUCTURE_TYPE_NATIVE_CSTATE     0x00

///
/// Low Power Idle (LPI) State Flags
///
typedef union {
  struct {
    UINT32 Disabled           : 1;  ///< If set, LPI state is not used
    /**
      If set, Residency counter is not available for this LPI state and
      Residency Counter Frequency is invalid
    **/
    UINT32 CounterUnavailable : 1;
    UINT32 Reserved           : 30; ///< Reserved for future use. Must be zero
  } Bits;
  UINT32 Data32;
} ACPI_LPI_STATE_FLAGS;

///
/// Low Power Idle (LPI) structure with Native C-state instruction entry trigger descriptor
///
typedef struct {
  UINT32                                  Type;   ///< LPI State descriptor Type 0
  UINT32                                  Length; ///< Length of LPI state Descriptor Structure
  ///
  /// Unique LPI state identifier: zero based, monotonically increasing identifier
  ///
  UINT16                                  UniqueId;
  UINT8                                   Reserved[2];  ///< Must be Zero
  ACPI_LPI_STATE_FLAGS                    Flags;        ///< LPI state flags
  /**
    The LPI entry trigger, matching an existing _CST.Register object, represented as a
    Generic Address Structure. All processors must request this state or deeper to trigger.
  **/
  EFI_ACPI_6_1_GENERIC_ADDRESS_STRUCTURE  EntryTrigger;
  UINT32                                  Residency;  ///< Minimum residency or break-even in uSec
  UINT32                                  Latency;    ///< Worst case exit latency in uSec
  /**
    [optional] Residency counter, represented as a Generic Address Structure.
    If not present, Flags[1] bit should be set.
  **/
  EFI_ACPI_6_1_GENERIC_ADDRESS_STRUCTURE  ResidencyCounter;
  /**
    [optional] Residency counter frequency in cycles per second. Value 0 indicates that
    counter runs at TSC frequency. Valid only if Residency Counter is present.
  **/
  UINT64                                  ResidencyCounterFrequency;
} ACPI_LPI_NATIVE_CSTATE_DESCRIPTOR;

#pragma pack()

#endif
