| /*++ | |
| 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; | |
| } |