]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/DxeIpl/LegacyTable.c
sync comments, fix function header, rename variable name to follow coding style.
[mirror_edk2.git] / DuetPkg / DxeIpl / LegacyTable.c
CommitLineData
18b84857 1/** @file\r
ca162103 2\r
3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13 LegacyTable.c\r
14\r
15Abstract:\r
16\r
17Revision History:\r
18\r
18b84857 19**/\r
ca162103 20\r
21#include "DxeIpl.h"\r
22#include "HobGeneration.h"\r
df166ce5 23#include "Debug.h"\r
ca162103 24\r
f40bbc08 25#define ACPI_RSD_PTR 0x2052545020445352LL\r
ca162103 26#define MPS_PTR EFI_SIGNATURE_32('_','M','P','_')\r
27#define SMBIOS_PTR EFI_SIGNATURE_32('_','S','M','_')\r
28\r
29#define EBDA_BASE_ADDRESS 0x40E\r
30\r
31VOID *\r
32FindAcpiRsdPtr (\r
33 VOID\r
34 )\r
35{\r
36 UINTN Address;\r
37 UINTN Index;\r
38\r
39 //\r
40 // First Seach 0x0e0000 - 0x0fffff for RSD Ptr\r
41 //\r
42 for (Address = 0xe0000; Address < 0xfffff; Address += 0x10) {\r
43 if (*(UINT64 *)(Address) == ACPI_RSD_PTR) {\r
44 return (VOID *)Address;\r
45 }\r
46 }\r
47\r
48 //\r
49 // Search EBDA\r
50 //\r
51\r
52 Address = (*(UINT16 *)(UINTN)(EBDA_BASE_ADDRESS)) << 4;\r
53 for (Index = 0; Index < 0x400 ; Index += 16) {\r
54 if (*(UINT64 *)(Address + Index) == ACPI_RSD_PTR) {\r
55 return (VOID *)Address;\r
56 }\r
57 }\r
58 return NULL;\r
59}\r
60\r
61VOID *\r
62FindSMBIOSPtr (\r
63 VOID\r
64 )\r
65{\r
66 UINTN Address;\r
67\r
68 //\r
69 // First Seach 0x0f0000 - 0x0fffff for SMBIOS Ptr\r
70 //\r
71 for (Address = 0xf0000; Address < 0xfffff; Address += 0x10) {\r
72 if (*(UINT32 *)(Address) == SMBIOS_PTR) {\r
73 return (VOID *)Address;\r
74 }\r
75 }\r
76 return NULL;\r
77}\r
78\r
79VOID *\r
80FindMPSPtr (\r
81 VOID\r
82 )\r
83{\r
84 UINTN Address;\r
85 UINTN Index;\r
86\r
87 //\r
88 // First Seach 0x0e0000 - 0x0fffff for MPS Ptr\r
89 //\r
90 for (Address = 0xe0000; Address < 0xfffff; Address += 0x10) {\r
91 if (*(UINT32 *)(Address) == MPS_PTR) {\r
92 return (VOID *)Address;\r
93 }\r
94 }\r
95\r
96 //\r
97 // Search EBDA\r
98 //\r
99\r
100 Address = (*(UINT16 *)(UINTN)(EBDA_BASE_ADDRESS)) << 4;\r
101 for (Index = 0; Index < 0x400 ; Index += 16) {\r
102 if (*(UINT32 *)(Address + Index) == MPS_PTR) {\r
103 return (VOID *)Address;\r
104 }\r
105 }\r
106 return NULL;\r
107}\r
108\r
109#pragma pack(1)\r
110typedef struct {\r
111 UINT8 Signature[8];\r
112 UINT8 Checksum;\r
113 UINT8 OemId[6];\r
114 UINT8 Revision;\r
115 UINT32 RsdtAddress;\r
116 UINT32 Length;\r
117 UINT64 XsdtAddress;\r
118 UINT8 ExtendedChecksum;\r
119 UINT8 Reserved[3];\r
120} RSDP_TABLE;\r
121\r
122typedef struct {\r
123 UINT32 Signature;\r
124 UINT32 Length;\r
125 UINT8 Revision;\r
126 UINT8 Checksum;\r
127 UINT8 OemId[6];\r
128 UINT8 OemTableId[8];\r
129 UINT32 OemRevision;\r
130 UINT8 CreatorId[4];\r
131 UINT32 CreatorRevision;\r
132} DESCRIPTION_HEADER;\r
133\r
134typedef struct {\r
135 DESCRIPTION_HEADER Header;\r
136 UINT32 Entry;\r
137} RSDT_TABLE;\r
138\r
139typedef struct {\r
140 DESCRIPTION_HEADER Header;\r
141 UINT64 Entry;\r
142} XSDT_TABLE;\r
143\r
144typedef struct {\r
145 UINT8 Address_Space_ID;\r
146 UINT8 Register_Bit_Width;\r
147 UINT8 Register_Bit_Offset;\r
148 UINT8 Access_Size;\r
149 UINT64 Address;\r
150} GADDRESS_STRUCTURE;\r
151\r
152#pragma pack()\r
153\r
154VOID\r
155ScanTableInRSDT (\r
156 RSDT_TABLE *Rsdt,\r
157 UINT32 Signature,\r
158 DESCRIPTION_HEADER **FoundTable\r
159 )\r
160{\r
161 UINTN Index;\r
162 UINT32 EntryCount;\r
163 UINT32 *EntryPtr;\r
164 DESCRIPTION_HEADER *Table;\r
165 \r
166 *FoundTable = NULL;\r
167 \r
168 EntryCount = (Rsdt->Header.Length - sizeof (DESCRIPTION_HEADER)) / sizeof(UINT32);\r
169 \r
170 EntryPtr = &Rsdt->Entry;\r
171 for (Index = 0; Index < EntryCount; Index ++, EntryPtr ++) {\r
172 Table = (DESCRIPTION_HEADER*)((UINTN)(*EntryPtr));\r
173 if (Table->Signature == Signature) {\r
174 *FoundTable = Table;\r
175 break;\r
176 }\r
177 }\r
178 \r
179 return;\r
180}\r
181\r
182VOID\r
183ScanTableInXSDT (\r
184 XSDT_TABLE *Xsdt,\r
185 UINT32 Signature,\r
186 DESCRIPTION_HEADER **FoundTable\r
187 )\r
188{\r
189 UINTN Index;\r
190 UINT32 EntryCount;\r
191 UINT64 EntryPtr;\r
192 UINTN BasePtr;\r
193 \r
194 DESCRIPTION_HEADER *Table;\r
195 \r
196 *FoundTable = NULL;\r
197 \r
198 EntryCount = (Xsdt->Header.Length - sizeof (DESCRIPTION_HEADER)) / sizeof(UINT64);\r
199 \r
200 BasePtr = (UINTN)(&(Xsdt->Entry));\r
201 for (Index = 0; Index < EntryCount; Index ++) {\r
202 CopyMem (&EntryPtr, (VOID *)(BasePtr + Index * sizeof(UINT64)), sizeof(UINT64));\r
203 Table = (DESCRIPTION_HEADER*)((UINTN)(EntryPtr));\r
204 if (Table->Signature == Signature) {\r
205 *FoundTable = Table;\r
206 break;\r
207 }\r
208 }\r
209 \r
210 return;\r
211}\r
212\r
213VOID *\r
214FindAcpiPtr (\r
215 IN HOB_TEMPLATE *Hob,\r
216 UINT32 Signature\r
217 )\r
218{\r
219 DESCRIPTION_HEADER *AcpiTable;\r
220 RSDP_TABLE *Rsdp;\r
221 RSDT_TABLE *Rsdt;\r
222 XSDT_TABLE *Xsdt;\r
223 \r
224 AcpiTable = NULL;\r
225\r
226 //\r
227 // Check ACPI2.0 table\r
228 //\r
df166ce5 229 if ((int)Hob->Acpi20.Table != -1) {\r
ca162103 230 Rsdp = (RSDP_TABLE *)(UINTN)Hob->Acpi20.Table;\r
231 Rsdt = (RSDT_TABLE *)(UINTN)Rsdp->RsdtAddress;\r
232 Xsdt = NULL;\r
233 if ((Rsdp->Revision >= 2) && (Rsdp->XsdtAddress < (UINT64)(UINTN)-1)) {\r
234 Xsdt = (XSDT_TABLE *)(UINTN)Rsdp->XsdtAddress;\r
235 }\r
236 //\r
237 // Check Xsdt\r
238 //\r
239 if (Xsdt != NULL) {\r
240 ScanTableInXSDT (Xsdt, Signature, &AcpiTable);\r
241 }\r
242 //\r
243 // Check Rsdt\r
244 //\r
245 if ((AcpiTable == NULL) && (Rsdt != NULL)) {\r
246 ScanTableInRSDT (Rsdt, Signature, &AcpiTable);\r
247 }\r
248 }\r
249 \r
250 //\r
251 // Check ACPI1.0 table\r
252 //\r
df166ce5 253 if ((AcpiTable == NULL) && ((int)Hob->Acpi.Table != -1)) {\r
ca162103 254 Rsdp = (RSDP_TABLE *)(UINTN)Hob->Acpi.Table;\r
255 Rsdt = (RSDT_TABLE *)(UINTN)Rsdp->RsdtAddress;\r
256 //\r
257 // Check Rsdt\r
258 //\r
259 if (Rsdt != NULL) {\r
260 ScanTableInRSDT (Rsdt, Signature, &AcpiTable);\r
261 }\r
262 }\r
263\r
264 return AcpiTable;\r
265}\r
266\r
267#pragma pack(1)\r
268//#define MCFG_SIGNATURE 0x4746434D\r
269#define MCFG_SIGNATURE EFI_SIGNATURE_32 ('M', 'C', 'F', 'G')\r
270typedef struct {\r
271 UINT64 BaseAddress;\r
272 UINT16 PciSegmentGroupNumber;\r
273 UINT8 StartBusNumber;\r
274 UINT8 EndBusNumber;\r
275 UINT32 Reserved;\r
276} MCFG_STRUCTURE;\r
277\r
278#define FADT_SIGNATURE EFI_SIGNATURE_32 ('F', 'A', 'C', 'P')\r
279typedef struct {\r
280 DESCRIPTION_HEADER Header;\r
281 UINT32 FIRMWARE_CTRL;\r
282 UINT32 DSDT;\r
283 UINT8 INT_MODEL;\r
284 UINT8 Preferred_PM_Profile;\r
285 UINT16 SCI_INIT;\r
286 UINT32 SMI_CMD;\r
287 UINT8 ACPI_ENABLE;\r
288 UINT8 ACPI_DISABLE;\r
289 UINT8 S4BIOS_REQ;\r
290 UINT8 PSTATE_CNT;\r
291 UINT32 PM1a_EVT_BLK;\r
292 UINT32 PM1b_EVT_BLK;\r
293 UINT32 PM1a_CNT_BLK;\r
294 UINT32 PM1b_CNT_BLK;\r
295 UINT32 PM2_CNT_BLK;\r
296 UINT32 PM_TMR_BLK;\r
297 UINT32 GPE0_BLK;\r
298 UINT32 GPE1_BLK;\r
299 UINT8 PM1_EVT_LEN;\r
300 UINT8 PM1_CNT_LEN;\r
301 UINT8 PM2_CNT_LEN;\r
302 UINT8 PM_TMR_LEN;\r
303 UINT8 GPE0_BLK_LEN;\r
304 UINT8 GPE1_BLK_LEN;\r
305 UINT8 GPE1_BASE;\r
306 UINT8 CST_CNT;\r
307 UINT16 P_LVL2_LAT;\r
308 UINT16 P_LVL3_LAT;\r
309 UINT16 FLUSH_SIZE;\r
310 UINT16 FLUSH_STRIDE;\r
311 UINT8 DUTY_OFFSET;\r
312 UINT8 DUTY_WIDTH;\r
313 UINT8 DAY_ALARM;\r
314 UINT8 MON_ALARM;\r
315 UINT8 CENTRY;\r
316 UINT16 IAPC_BOOT_ARCH;\r
317 UINT8 Reserved_111;\r
318 UINT32 Flags;\r
319 GADDRESS_STRUCTURE RESET_REG;\r
320 UINT8 RESET_VALUE;\r
321 UINT8 Reserved_129[3];\r
322 UINT64 X_FIRMWARE_CTRL;\r
323 UINT64 X_DSDT;\r
324 GADDRESS_STRUCTURE X_PM1a_EVT_BLK;\r
325 GADDRESS_STRUCTURE X_PM1b_EVT_BLK;\r
326 GADDRESS_STRUCTURE X_PM1a_CNT_BLK;\r
327 GADDRESS_STRUCTURE X_PM1b_CNT_BLK;\r
328 GADDRESS_STRUCTURE X_PM2_CNT_BLK;\r
329 GADDRESS_STRUCTURE X_PM_TMR_BLK;\r
330 GADDRESS_STRUCTURE X_GPE0_BLK;\r
331 GADDRESS_STRUCTURE X_GPE1_BLK;\r
332} FADT_TABLE;\r
333\r
334#pragma pack()\r
335\r
336VOID\r
337PrepareMcfgTable (\r
338 IN HOB_TEMPLATE *Hob\r
339 )\r
340{\r
341 DESCRIPTION_HEADER *McfgTable;\r
342 MCFG_STRUCTURE *Mcfg;\r
343 UINTN McfgCount;\r
344 UINTN Index;\r
345\r
346 McfgTable = FindAcpiPtr (Hob, MCFG_SIGNATURE);\r
347 if (McfgTable == NULL) {\r
348 return ;\r
349 }\r
350\r
351 Mcfg = (MCFG_STRUCTURE *)((UINTN)McfgTable + sizeof(DESCRIPTION_HEADER) + sizeof(UINT64));\r
352 McfgCount = (McfgTable->Length - sizeof(DESCRIPTION_HEADER) - sizeof(UINT64)) / sizeof(MCFG_STRUCTURE);\r
353\r
354 //\r
355 // Fill PciExpress info on Hob\r
356 // Note: Only for 1st segment\r
357 //\r
358 for (Index = 0; Index < McfgCount; Index++) {\r
359 if (Mcfg[Index].PciSegmentGroupNumber == 0) {\r
360 Hob->PciExpress.PciExpressBaseAddressInfo.PciExpressBaseAddress = Mcfg[Index].BaseAddress;\r
361 break;\r
362 }\r
363 }\r
364\r
365 return ;\r
366}\r
367\r
368VOID\r
369PrepareFadtTable (\r
370 IN HOB_TEMPLATE *Hob\r
371 )\r
372{\r
373 FADT_TABLE *Fadt;\r
374 EFI_ACPI_DESCRIPTION *AcpiDescription;\r
375\r
376 Fadt = FindAcpiPtr (Hob, FADT_SIGNATURE);\r
377 if (Fadt == NULL) {\r
378 return ;\r
379 }\r
380\r
381 AcpiDescription = &Hob->AcpiInfo.AcpiDescription;\r
382 //\r
383 // Fill AcpiDescription according to FADT\r
384 // Currently, only for PM_TMR\r
385 //\r
386 AcpiDescription->PM_TMR_LEN = Fadt->PM_TMR_LEN;\r
387 AcpiDescription->TMR_VAL_EXT = (UINT8)((Fadt->Flags & 0x100) != 0);\r
388 if ((Fadt->Header.Revision >= 3) && (Fadt->Header.Length >= sizeof(FADT_TABLE))) {\r
389 CopyMem (\r
390 &AcpiDescription->PM_TMR_BLK,\r
391 &Fadt->X_PM_TMR_BLK,\r
392 sizeof(GADDRESS_STRUCTURE)\r
393 );\r
394 CopyMem (\r
395 &AcpiDescription->RESET_REG,\r
396 &Fadt->RESET_REG,\r
397 sizeof(GADDRESS_STRUCTURE)\r
398 );\r
399 AcpiDescription->RESET_VALUE = Fadt->RESET_VALUE;\r
400 }\r
401 if (AcpiDescription->PM_TMR_BLK.Address == 0) {\r
402 AcpiDescription->PM_TMR_BLK.Address = Fadt->PM_TMR_BLK;\r
403 AcpiDescription->PM_TMR_BLK.AddressSpaceId = ACPI_ADDRESS_ID_IO;\r
404 AcpiDescription->PM_TMR_BLK.RegisterBitWidth = (AcpiDescription->TMR_VAL_EXT == 0) ? 24 : 32;\r
405 }\r
406\r
407 return ;\r
408}\r
409\r
410VOID\r
411PrepareHobLegacyTable (\r
412 IN HOB_TEMPLATE *Hob\r
413 )\r
414{\r
df166ce5 415 CHAR8 PrintBuffer[256];\r
416\r
ca162103 417 Hob->Acpi.Table = (EFI_PHYSICAL_ADDRESS)(UINTN)FindAcpiRsdPtr ();\r
df166ce5 418 AsciiSPrint (PrintBuffer, 256, "\nAcpiTable=0x%x ", (UINT32)(UINTN)Hob->Acpi.Table);\r
419 PrintString (PrintBuffer);\r
ca162103 420 Hob->Acpi20.Table = (EFI_PHYSICAL_ADDRESS)(UINTN)FindAcpiRsdPtr ();\r
421 Hob->Smbios.Table = (EFI_PHYSICAL_ADDRESS)(UINTN)FindSMBIOSPtr ();\r
df166ce5 422 AsciiSPrint (PrintBuffer, 256, "SMBIOS Table=0x%x ", (UINT32)(UINTN)Hob->Smbios.Table);\r
423 PrintString (PrintBuffer);\r
ca162103 424 Hob->Mps.Table = (EFI_PHYSICAL_ADDRESS)(UINTN)FindMPSPtr ();\r
df166ce5 425 AsciiSPrint (PrintBuffer, 256, "MPS Table=0x%x\n", (UINT32)(UINTN)Hob->Mps.Table);\r
426 PrintString (PrintBuffer);\r
ca162103 427\r
428 PrepareMcfgTable (Hob);\r
429\r
430 PrepareFadtTable (Hob);\r
431\r
432 return ;\r
433}\r
434\r