1/*++
2
3Copyright (c)  1999  - 2014, Intel Corporation. All rights reserved
4
5  This program and the accompanying materials are licensed and made available under
6  the terms and conditions of the BSD License that accompanies this distribution.
7  The full text of the license may be found at
8  http://opensource.org/licenses/bsd-license.php.
9
10  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13
14
15--*/
16
17//
18// Include files
19//
20
21#include <PiDxe.h>
22#include <IndustryStandard/Acpi50.h>
23
24
25
26//
27// LPIT Definitions
28//
29
30#define EFI_ACPI_LOW_POWER_IDLE_TABLE_REVISION 0x1
31
32//
33// Ensure proper structure formats
34//
35#pragma pack(1)
36
37typedef union _EFI_ACPI_LPI_STATE_FLAGS {
38  struct {
39    UINT32 Disabled           :1;
40    UINT32 CounterUnavailable :1;
41    UINT32 Reserved           :30;
42  };
43  UINT32 AsUlong;
44} EFI_ACPI_LPI_STATE_FLAGS, *PEFI_ACPI_LPI_STATE_FLAGS;
45
46// Only Mwait LPI here:
47
48typedef struct _EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR {
49  UINT32 Type;        // offset: 0
50  UINT32 Length;      // offset: 4
51  UINT16 UniqueId;    // offset: 8
52  UINT8 Reserved[2];  // offset: 9
53  EFI_ACPI_LPI_STATE_FLAGS Flags; // offset: 12
54  EFI_ACPI_2_0_GENERIC_ADDRESS_STRUCTURE EntryTrigger; // offset: 16
55  UINT32 Residency;   // offset: 28
56  UINT32 Latency;     // offset: 32
57  EFI_ACPI_2_0_GENERIC_ADDRESS_STRUCTURE ResidencyCounter; // offset: 36
58  UINT64 ResidencyCounterFrequency; //offset: 48
59} EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR;
60
61
62//
63// Defines for LPIT table, some are VLV specific
64//
65
66
67// signature "LPIT"
68#define EFI_ACPI_LOW_POWER_IDLE_TABLE_SIGNATURE  0x5449504c
69
70#define EFI_ACPI_OEM_LPIT_REVISION                      0x00000000
71
72#define EFI_ACPI_LOW_POWER_IDLE_MWAIT_TYPE    0x0
73#define EFI_ACPI_LOW_POWER_IDLE_DEFAULT_FLAG  0x0
74#define EFI_ACPI_LOW_POWER_IDLE_RES_FREQ_8K   0x8000    // 32768
75
76//
77// LPI state count (4 on VLV: S0ir, S0i1, S0i2, S0i3)
78//
79
80#define EFI_ACPI_VLV_LPI_STATE_COUNT          0x4
81
82//
83// LPI TRIGGER (HW C7 on VLV),
84// TOFIX!!!
85//
86#define EFI_ACPI_VLV_LPI_TRIGGER {0x7F,0x1,0x2,0x0,0x64}
87
88//
89// LPI residency counter (MMIO)
90//
91#define  EFI_ACPI_VLV_LPI_RES_COUNTER0   {0x0,32,0x0,0x03,0xFED03080}
92#define  EFI_ACPI_VLV_LPI_RES_COUNTER1   {0x0,32,0x0,0x03,0xFED03084}
93#define  EFI_ACPI_VLV_LPI_RES_COUNTER2   {0x0,32,0x0,0x03,0xFED03088}
94#define  EFI_ACPI_VLV_LPI_RES_COUNTER3   {0x0,32,0x0,0x03,0xFED0308C}
95
96//
97// LPI break-even residency in us - all match S0i3 residency
98// Residency estimate: Latency x 3
99//
100#define  EFI_ACPI_VLV_LPI_MIN_RES0   15000
101#define  EFI_ACPI_VLV_LPI_MIN_RES1   15000
102#define  EFI_ACPI_VLV_LPI_MIN_RES2   15000
103#define  EFI_ACPI_VLV_LPI_MIN_RES3   15000
104
105//
106// LPI latency in us - all match S0i3 latency
107//
108#define  EFI_ACPI_VLV_LPI_LATENCY0   5000
109#define  EFI_ACPI_VLV_LPI_LATENCY1   5000
110#define  EFI_ACPI_VLV_LPI_LATENCY2   5000
111#define  EFI_ACPI_VLV_LPI_LATENCY3   5000
112
113
114//
115// LPI ID
116//
117#define  EFI_ACPI_VLV_LPI_UNIQUE_ID0   0
118#define  EFI_ACPI_VLV_LPI_UNIQUE_ID1   1
119#define  EFI_ACPI_VLV_LPI_UNIQUE_ID2   2
120#define  EFI_ACPI_VLV_LPI_UNIQUE_ID3   3
121
122//
123//  LPI ACPI table header
124//
125
126
127typedef struct _EFI_ACPI_LOW_POWER_IDLE_TABLE {
128  EFI_ACPI_DESCRIPTION_HEADER             Header;
129  EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR     LpiStates[EFI_ACPI_VLV_LPI_STATE_COUNT];
130} EFI_ACPI_LOW_POWER_IDLE_TABLE;
131
132#pragma pack()
133
134EFI_ACPI_LOW_POWER_IDLE_TABLE Lpit = {
135
136  //
137  // Header
138  //
139
140
141  EFI_ACPI_LOW_POWER_IDLE_TABLE_SIGNATURE,
142  sizeof (EFI_ACPI_LOW_POWER_IDLE_TABLE),
143  EFI_ACPI_LOW_POWER_IDLE_TABLE_REVISION ,
144
145  //
146  // Checksum will be updated at runtime
147  //
148  0x00,
149
150  //
151  // It is expected that these values will be updated at runtime
152  //
153  ' ', ' ', ' ', ' ', ' ', ' ',
154
155  0,
156  EFI_ACPI_OEM_LPIT_REVISION,
157  0,
158  0,
159
160
161
162  //
163  // Descriptor
164  //
165  {
166    {
167      EFI_ACPI_LOW_POWER_IDLE_MWAIT_TYPE,
168      sizeof(EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR),
169      EFI_ACPI_VLV_LPI_UNIQUE_ID0,
170      {0,0},
171      {EFI_ACPI_LOW_POWER_IDLE_DEFAULT_FLAG},   // Flags
172      EFI_ACPI_VLV_LPI_TRIGGER,  //EntryTrigger
173      EFI_ACPI_VLV_LPI_MIN_RES0, //Residency
174      EFI_ACPI_VLV_LPI_LATENCY0, //Latency
175      EFI_ACPI_VLV_LPI_RES_COUNTER0, //ResidencyCounter
176      EFI_ACPI_LOW_POWER_IDLE_RES_FREQ_8K //Residency counter frequency
177    },
178    {
179      EFI_ACPI_LOW_POWER_IDLE_MWAIT_TYPE,
180      sizeof(EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR),
181      EFI_ACPI_VLV_LPI_UNIQUE_ID1,
182      {0,0},
183      {EFI_ACPI_LOW_POWER_IDLE_DEFAULT_FLAG},   // Flags
184      EFI_ACPI_VLV_LPI_TRIGGER,  //EntryTrigger
185      EFI_ACPI_VLV_LPI_MIN_RES1, //Residency
186      EFI_ACPI_VLV_LPI_LATENCY1, //Latency
187      EFI_ACPI_VLV_LPI_RES_COUNTER1, //ResidencyCounter
188      EFI_ACPI_LOW_POWER_IDLE_RES_FREQ_8K //Residency counter frequency
189    },
190    {
191      EFI_ACPI_LOW_POWER_IDLE_MWAIT_TYPE,
192      sizeof(EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR),
193      EFI_ACPI_VLV_LPI_UNIQUE_ID2,
194      {0,0},
195      {EFI_ACPI_LOW_POWER_IDLE_DEFAULT_FLAG},   // Flags
196      EFI_ACPI_VLV_LPI_TRIGGER,  //EntryTrigger
197      EFI_ACPI_VLV_LPI_MIN_RES2, //Residency
198      EFI_ACPI_VLV_LPI_LATENCY2, //Latency
199      EFI_ACPI_VLV_LPI_RES_COUNTER2, //ResidencyCounter
200      EFI_ACPI_LOW_POWER_IDLE_RES_FREQ_8K //Residency counter frequency
201    },
202    {
203      EFI_ACPI_LOW_POWER_IDLE_MWAIT_TYPE,
204      sizeof(EFI_ACPI_MWAIT_LPI_STATE_DESCRIPTOR),
205      EFI_ACPI_VLV_LPI_UNIQUE_ID3,
206      {0,0},
207      {EFI_ACPI_LOW_POWER_IDLE_DEFAULT_FLAG},   // Flags
208      EFI_ACPI_VLV_LPI_TRIGGER,  //EntryTrigger
209      EFI_ACPI_VLV_LPI_MIN_RES3, //Residency
210      EFI_ACPI_VLV_LPI_LATENCY3, //Latency
211      EFI_ACPI_VLV_LPI_RES_COUNTER3, //ResidencyCounter
212      EFI_ACPI_LOW_POWER_IDLE_RES_FREQ_8K //Residency counter frequency
213    }
214  }
215
216};
217
218
219VOID*
220ReferenceAcpiTable (
221  VOID
222  )
223{
224  //
225  // Reference the table being generated to prevent the optimizer from
226  // removing the data structure from the executable
227  //
228  return (VOID*)&Lpit;
229}
230