3 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
22 #include "HobGeneration.h"
25 #define MPS_PTR SIGNATURE_32('_','M','P','_')
26 #define SMBIOS_PTR SIGNATURE_32('_','S','M','_')
28 #define EBDA_BASE_ADDRESS 0x40E
39 // First Seach 0x0e0000 - 0x0fffff for RSD Ptr
41 for (Address
= 0xe0000; Address
< 0xfffff; Address
+= 0x10) {
42 if (*(UINT64
*)(Address
) == EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE
) {
43 return (VOID
*)Address
;
51 Address
= (*(UINT16
*)(UINTN
)(EBDA_BASE_ADDRESS
)) << 4;
52 for (Index
= 0; Index
< 0x400 ; Index
+= 16) {
53 if (*(UINT64
*)(Address
+ Index
) == EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE
) {
54 return (VOID
*)Address
;
68 // First Seach 0x0f0000 - 0x0fffff for SMBIOS Ptr
70 for (Address
= 0xf0000; Address
< 0xfffff; Address
+= 0x10) {
71 if (*(UINT32
*)(Address
) == SMBIOS_PTR
) {
72 return (VOID
*)Address
;
87 // First Seach 0x0e0000 - 0x0fffff for MPS Ptr
89 for (Address
= 0xe0000; Address
< 0xfffff; Address
+= 0x10) {
90 if (*(UINT32
*)(Address
) == MPS_PTR
) {
91 return (VOID
*)Address
;
99 Address
= (*(UINT16
*)(UINTN
)(EBDA_BASE_ADDRESS
)) << 4;
100 for (Index
= 0; Index
< 0x400 ; Index
+= 16) {
101 if (*(UINT32
*)(Address
+ Index
) == MPS_PTR
) {
102 return (VOID
*)Address
;
111 EFI_ACPI_DESCRIPTION_HEADER Header
;
116 EFI_ACPI_DESCRIPTION_HEADER Header
;
126 EFI_ACPI_DESCRIPTION_HEADER
**FoundTable
132 EFI_ACPI_DESCRIPTION_HEADER
*Table
;
136 EntryCount
= (Rsdt
->Header
.Length
- sizeof (EFI_ACPI_DESCRIPTION_HEADER
)) / sizeof(UINT32
);
138 EntryPtr
= &Rsdt
->Entry
;
139 for (Index
= 0; Index
< EntryCount
; Index
++, EntryPtr
++) {
140 Table
= (EFI_ACPI_DESCRIPTION_HEADER
*)((UINTN
)(*EntryPtr
));
141 if (Table
->Signature
== Signature
) {
154 EFI_ACPI_DESCRIPTION_HEADER
**FoundTable
161 EFI_ACPI_DESCRIPTION_HEADER
*Table
;
165 EntryCount
= (Xsdt
->Header
.Length
- sizeof (EFI_ACPI_DESCRIPTION_HEADER
)) / sizeof(UINT64
);
167 BasePtr
= (UINTN
)(&(Xsdt
->Entry
));
168 for (Index
= 0; Index
< EntryCount
; Index
++) {
169 CopyMem (&EntryPtr
, (VOID
*)(BasePtr
+ Index
* sizeof(UINT64
)), sizeof(UINT64
));
170 Table
= (EFI_ACPI_DESCRIPTION_HEADER
*)((UINTN
)(EntryPtr
));
171 if (Table
->Signature
== Signature
) {
182 IN HOB_TEMPLATE
*Hob
,
186 EFI_ACPI_DESCRIPTION_HEADER
*AcpiTable
;
187 EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER
*Rsdp
;
194 // Check ACPI2.0 table
196 if ((int)Hob
->Acpi20
.Table
!= -1) {
197 Rsdp
= (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER
*)(UINTN
)Hob
->Acpi20
.Table
;
198 Rsdt
= (RSDT_TABLE
*)(UINTN
)Rsdp
->RsdtAddress
;
200 if ((Rsdp
->Revision
>= 2) && (Rsdp
->XsdtAddress
< (UINT64
)(UINTN
)-1)) {
201 Xsdt
= (XSDT_TABLE
*)(UINTN
)Rsdp
->XsdtAddress
;
207 ScanTableInXSDT (Xsdt
, Signature
, &AcpiTable
);
212 if ((AcpiTable
== NULL
) && (Rsdt
!= NULL
)) {
213 ScanTableInRSDT (Rsdt
, Signature
, &AcpiTable
);
218 // Check ACPI1.0 table
220 if ((AcpiTable
== NULL
) && ((int)Hob
->Acpi
.Table
!= -1)) {
221 Rsdp
= (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER
*)(UINTN
)Hob
->Acpi
.Table
;
222 Rsdt
= (RSDT_TABLE
*)(UINTN
)Rsdp
->RsdtAddress
;
227 ScanTableInRSDT (Rsdt
, Signature
, &AcpiTable
);
237 UINT16 PciSegmentGroupNumber
;
238 UINT8 StartBusNumber
;
249 EFI_ACPI_DESCRIPTION_HEADER
*McfgTable
;
250 MCFG_STRUCTURE
*Mcfg
;
254 McfgTable
= FindAcpiPtr (Hob
, EFI_ACPI_3_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE
);
255 if (McfgTable
== NULL
) {
259 Mcfg
= (MCFG_STRUCTURE
*)((UINTN
)McfgTable
+ sizeof(EFI_ACPI_DESCRIPTION_HEADER
) + sizeof(UINT64
));
260 McfgCount
= (McfgTable
->Length
- sizeof(EFI_ACPI_DESCRIPTION_HEADER
) - sizeof(UINT64
)) / sizeof(MCFG_STRUCTURE
);
263 // Fill PciExpress info on Hob
264 // Note: Only for 1st segment
266 for (Index
= 0; Index
< McfgCount
; Index
++) {
267 if (Mcfg
[Index
].PciSegmentGroupNumber
== 0) {
268 Hob
->PciExpress
.PciExpressBaseAddressInfo
.PciExpressBaseAddress
= Mcfg
[Index
].BaseAddress
;
281 EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE
*Fadt
;
282 EFI_ACPI_DESCRIPTION
*AcpiDescription
;
284 Fadt
= FindAcpiPtr (Hob
, EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE
);
289 AcpiDescription
= &Hob
->AcpiInfo
.AcpiDescription
;
291 // Fill AcpiDescription according to FADT
292 // Currently, only for PM_TMR
294 AcpiDescription
->PM_TMR_LEN
= Fadt
->PmTmrLen
;
295 AcpiDescription
->TMR_VAL_EXT
= (UINT8
)((Fadt
->Flags
& 0x100) != 0);
298 // For fields not included in ACPI 1.0 spec, we get the value based on table length
300 if (Fadt
->Header
.Length
>= OFFSET_OF (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE
, XPmTmrBlk
) + sizeof (Fadt
->XPmTmrBlk
)) {
302 &AcpiDescription
->PM_TMR_BLK
,
304 sizeof(EFI_ACPI_3_0_GENERIC_ADDRESS_STRUCTURE
)
307 if (Fadt
->Header
.Length
>= OFFSET_OF (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE
, ResetValue
) + sizeof (Fadt
->ResetValue
)) {
309 &AcpiDescription
->RESET_REG
,
311 sizeof(EFI_ACPI_3_0_GENERIC_ADDRESS_STRUCTURE
)
313 AcpiDescription
->RESET_VALUE
= Fadt
->ResetValue
;
316 if (AcpiDescription
->PM_TMR_BLK
.Address
== 0) {
317 AcpiDescription
->PM_TMR_BLK
.Address
= Fadt
->PmTmrBlk
;
318 AcpiDescription
->PM_TMR_BLK
.AddressSpaceId
= EFI_ACPI_3_0_SYSTEM_IO
;
322 // It's possible that the PM_TMR_BLK.RegisterBitWidth is always 32,
323 // we need to set the correct RegisterBitWidth value according to the TMR_VAL_EXT
324 // A zero indicates TMR_VAL is implemented as a 24-bit value.
325 // A one indicates TMR_VAL is implemented as a 32-bit value
327 AcpiDescription
->PM_TMR_BLK
.RegisterBitWidth
= (UINT8
) ((AcpiDescription
->TMR_VAL_EXT
== 0) ? 24 : 32);
334 PrepareHobLegacyTable (
338 CHAR8 PrintBuffer
[256];
340 Hob
->Acpi
.Table
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)FindAcpiRsdPtr ();
341 AsciiSPrint (PrintBuffer
, 256, "\nAcpiTable=0x%x ", (UINT32
)(UINTN
)Hob
->Acpi
.Table
);
342 PrintString (PrintBuffer
);
343 Hob
->Acpi20
.Table
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)FindAcpiRsdPtr ();
344 Hob
->Smbios
.Table
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)FindSMBIOSPtr ();
345 AsciiSPrint (PrintBuffer
, 256, "SMBIOS Table=0x%x ", (UINT32
)(UINTN
)Hob
->Smbios
.Table
);
346 PrintString (PrintBuffer
);
347 Hob
->Mps
.Table
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)FindMPSPtr ();
348 AsciiSPrint (PrintBuffer
, 256, "MPS Table=0x%x\n", (UINT32
)(UINTN
)Hob
->Mps
.Table
);
349 PrintString (PrintBuffer
);
351 PrepareMcfgTable (Hob
);
353 PrepareFadtTable (Hob
);