/*++

Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved

  This program and the accompanying materials are licensed and made available under
  the terms and conditions of the BSD License that 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.



--*/

//
// Include files
//

#include <PiDxe.h>
#include <IndustryStandard/Acpi50.h>



//
// LPIT Definitions
//

#define EFI_ACPI_LOW_POWER_IDLE_TABLE_REVISION 0x1

//
// Ensure proper structure formats
//
#pragma pack(1)

typedef union _EFI_ACPI_LPI_STATE_FLAGS {
  struct {
    UINT32 Disabled           :1;
    UINT32 CounterUnavailable :1;
    UINT32 Reserved           :30;
  };
  UINT32 AsUlong;
} EFI_ACPI_LPI_STATE_FLAGS, *PEFI_ACPI_LPI_STATE_FLAGS;

// Only Mwait LPI here:

typedef struct _EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR {
  UINT32 Type;        // offset: 0
  UINT32 Length;      // offset: 4
  UINT16 UniqueId;    // offset: 8
  UINT8 Reserved[2];  // offset: 9
  EFI_ACPI_LPI_STATE_FLAGS Flags; // offset: 12
  EFI_ACPI_2_0_GENERIC_ADDRESS_STRUCTURE EntryTrigger; // offset: 16
  UINT32 Residency;   // offset: 28
  UINT32 Latency;     // offset: 32
  EFI_ACPI_2_0_GENERIC_ADDRESS_STRUCTURE ResidencyCounter; // offset: 36
  UINT64 ResidencyCounterFrequency; //offset: 48
} EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR;


//
// Defines for LPIT table, some are VLV specific
//


// signature "LPIT"
#define EFI_ACPI_LOW_POWER_IDLE_TABLE_SIGNATURE  0x5449504c

#define EFI_ACPI_OEM_LPIT_REVISION                      0x00000000

#define EFI_ACPI_LOW_POWER_IDLE_MWAIT_TYPE    0x0
#define EFI_ACPI_LOW_POWER_IDLE_DEFAULT_FLAG  0x0
#define EFI_ACPI_LOW_POWER_IDLE_RES_FREQ_8K   0x8000    // 32768

//
// LPI state count (4 on VLV: S0ir, S0i1, S0i2, S0i3)
//

#define EFI_ACPI_VLV_LPI_STATE_COUNT          0x4

//
// LPI TRIGGER (HW C7 on VLV),
// TOFIX!!!
//
#define EFI_ACPI_VLV_LPI_TRIGGER {0x7F,0x1,0x2,0x0,0x64}

//
// LPI residency counter (MMIO)
//
#define  EFI_ACPI_VLV_LPI_RES_COUNTER0   {0x0,32,0x0,0x03,0xFED03080}
#define  EFI_ACPI_VLV_LPI_RES_COUNTER1   {0x0,32,0x0,0x03,0xFED03084}
#define  EFI_ACPI_VLV_LPI_RES_COUNTER2   {0x0,32,0x0,0x03,0xFED03088}
#define  EFI_ACPI_VLV_LPI_RES_COUNTER3   {0x0,32,0x0,0x03,0xFED0308C}

//
// LPI break-even residency in us - all match S0i3 residency
// Residency estimate: Latency x 3
//
#define  EFI_ACPI_VLV_LPI_MIN_RES0   15000
#define  EFI_ACPI_VLV_LPI_MIN_RES1   15000
#define  EFI_ACPI_VLV_LPI_MIN_RES2   15000
#define  EFI_ACPI_VLV_LPI_MIN_RES3   15000

//
// LPI latency in us - all match S0i3 latency
//
#define  EFI_ACPI_VLV_LPI_LATENCY0   5000
#define  EFI_ACPI_VLV_LPI_LATENCY1   5000
#define  EFI_ACPI_VLV_LPI_LATENCY2   5000
#define  EFI_ACPI_VLV_LPI_LATENCY3   5000


//
// LPI ID
//
#define  EFI_ACPI_VLV_LPI_UNIQUE_ID0   0
#define  EFI_ACPI_VLV_LPI_UNIQUE_ID1   1
#define  EFI_ACPI_VLV_LPI_UNIQUE_ID2   2
#define  EFI_ACPI_VLV_LPI_UNIQUE_ID3   3

//
//  LPI ACPI table header
//


typedef struct _EFI_ACPI_LOW_POWER_IDLE_TABLE {
  EFI_ACPI_DESCRIPTION_HEADER             Header;
  EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR     LpiStates[EFI_ACPI_VLV_LPI_STATE_COUNT];
} EFI_ACPI_LOW_POWER_IDLE_TABLE;

#pragma pack()

EFI_ACPI_LOW_POWER_IDLE_TABLE Lpit = {

  //
  // Header
  //


  EFI_ACPI_LOW_POWER_IDLE_TABLE_SIGNATURE,
  sizeof (EFI_ACPI_LOW_POWER_IDLE_TABLE),
  EFI_ACPI_LOW_POWER_IDLE_TABLE_REVISION ,

  //
  // Checksum will be updated at runtime
  //
  0x00,

  //
  // It is expected that these values will be updated at runtime
  //
  ' ', ' ', ' ', ' ', ' ', ' ',

  0,
  EFI_ACPI_OEM_LPIT_REVISION,
  0,
  0,



  //
  // Descriptor
  //
  {
    {
      EFI_ACPI_LOW_POWER_IDLE_MWAIT_TYPE,
      sizeof(EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR),
      EFI_ACPI_VLV_LPI_UNIQUE_ID0,
      {0,0},
      {EFI_ACPI_LOW_POWER_IDLE_DEFAULT_FLAG},   // Flags
      EFI_ACPI_VLV_LPI_TRIGGER,  //EntryTrigger
      EFI_ACPI_VLV_LPI_MIN_RES0, //Residency
      EFI_ACPI_VLV_LPI_LATENCY0, //Latency
      EFI_ACPI_VLV_LPI_RES_COUNTER0, //ResidencyCounter
      EFI_ACPI_LOW_POWER_IDLE_RES_FREQ_8K //Residency counter frequency
    },
    {
      EFI_ACPI_LOW_POWER_IDLE_MWAIT_TYPE,
      sizeof(EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR),
      EFI_ACPI_VLV_LPI_UNIQUE_ID1,
      {0,0},
      {EFI_ACPI_LOW_POWER_IDLE_DEFAULT_FLAG},   // Flags
      EFI_ACPI_VLV_LPI_TRIGGER,  //EntryTrigger
      EFI_ACPI_VLV_LPI_MIN_RES1, //Residency
      EFI_ACPI_VLV_LPI_LATENCY1, //Latency
      EFI_ACPI_VLV_LPI_RES_COUNTER1, //ResidencyCounter
      EFI_ACPI_LOW_POWER_IDLE_RES_FREQ_8K //Residency counter frequency
    },
    {
      EFI_ACPI_LOW_POWER_IDLE_MWAIT_TYPE,
      sizeof(EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR),
      EFI_ACPI_VLV_LPI_UNIQUE_ID2,
      {0,0},
      {EFI_ACPI_LOW_POWER_IDLE_DEFAULT_FLAG},   // Flags
      EFI_ACPI_VLV_LPI_TRIGGER,  //EntryTrigger
      EFI_ACPI_VLV_LPI_MIN_RES2, //Residency
      EFI_ACPI_VLV_LPI_LATENCY2, //Latency
      EFI_ACPI_VLV_LPI_RES_COUNTER2, //ResidencyCounter
      EFI_ACPI_LOW_POWER_IDLE_RES_FREQ_8K //Residency counter frequency
    },
    {
      EFI_ACPI_LOW_POWER_IDLE_MWAIT_TYPE,
      sizeof(EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR),
      EFI_ACPI_VLV_LPI_UNIQUE_ID3,
      {0,0},
      {EFI_ACPI_LOW_POWER_IDLE_DEFAULT_FLAG},   // Flags
      EFI_ACPI_VLV_LPI_TRIGGER,  //EntryTrigger
      EFI_ACPI_VLV_LPI_MIN_RES3, //Residency
      EFI_ACPI_VLV_LPI_LATENCY3, //Latency
      EFI_ACPI_VLV_LPI_RES_COUNTER3, //ResidencyCounter
      EFI_ACPI_LOW_POWER_IDLE_RES_FREQ_8K //Residency counter frequency
    }
  }

};


VOID*
ReferenceAcpiTable (
  VOID
  )
{
  //
  // Reference the table being generated to prevent the optimizer from
  // removing the data structure from the executable
  //
  return (VOID*)&Lpit;
}
