+++ /dev/null
-/** @file\r
-\r
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
- LegacyTable.c\r
-\r
-Abstract:\r
-\r
-Revision History:\r
-\r
-**/\r
-\r
-#include "DxeIpl.h"\r
-#include "HobGeneration.h"\r
-#include "Debug.h"\r
-\r
-#define MPS_PTR SIGNATURE_32('_','M','P','_')\r
-#define SMBIOS_PTR SIGNATURE_32('_','S','M','_')\r
-\r
-#define EBDA_BASE_ADDRESS 0x40E\r
-\r
-VOID *\r
-FindAcpiRsdPtr (\r
- VOID\r
- )\r
-{\r
- UINTN Address;\r
- UINTN Index;\r
-\r
- //\r
- // First Seach 0x0e0000 - 0x0fffff for RSD Ptr\r
- //\r
- for (Address = 0xe0000; Address < 0xfffff; Address += 0x10) {\r
- if (*(UINT64 *)(Address) == EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE) {\r
- return (VOID *)Address;\r
- }\r
- }\r
-\r
- //\r
- // Search EBDA\r
- //\r
-\r
- Address = (*(UINT16 *)(UINTN)(EBDA_BASE_ADDRESS)) << 4;\r
- for (Index = 0; Index < 0x400 ; Index += 16) {\r
- if (*(UINT64 *)(Address + Index) == EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE) {\r
- return (VOID *)Address;\r
- }\r
- }\r
- return NULL;\r
-}\r
-\r
-VOID *\r
-FindSMBIOSPtr (\r
- VOID\r
- )\r
-{\r
- UINTN Address;\r
-\r
- //\r
- // First Seach 0x0f0000 - 0x0fffff for SMBIOS Ptr\r
- //\r
- for (Address = 0xf0000; Address < 0xfffff; Address += 0x10) {\r
- if (*(UINT32 *)(Address) == SMBIOS_PTR) {\r
- return (VOID *)Address;\r
- }\r
- }\r
- return NULL;\r
-}\r
-\r
-VOID *\r
-FindMPSPtr (\r
- VOID\r
- )\r
-{\r
- UINTN Address;\r
- UINTN Index;\r
-\r
- //\r
- // First Seach 0x0e0000 - 0x0fffff for MPS Ptr\r
- //\r
- for (Address = 0xe0000; Address < 0xfffff; Address += 0x10) {\r
- if (*(UINT32 *)(Address) == MPS_PTR) {\r
- return (VOID *)Address;\r
- }\r
- }\r
-\r
- //\r
- // Search EBDA\r
- //\r
-\r
- Address = (*(UINT16 *)(UINTN)(EBDA_BASE_ADDRESS)) << 4;\r
- for (Index = 0; Index < 0x400 ; Index += 16) {\r
- if (*(UINT32 *)(Address + Index) == MPS_PTR) {\r
- return (VOID *)Address;\r
- }\r
- }\r
- return NULL;\r
-}\r
-\r
-#pragma pack(1)\r
-\r
-typedef struct {\r
- EFI_ACPI_DESCRIPTION_HEADER Header;\r
- UINT32 Entry;\r
-} RSDT_TABLE;\r
-\r
-typedef struct {\r
- EFI_ACPI_DESCRIPTION_HEADER Header;\r
- UINT64 Entry;\r
-} XSDT_TABLE;\r
-\r
-#pragma pack()\r
-\r
-VOID\r
-ScanTableInRSDT (\r
- RSDT_TABLE *Rsdt,\r
- UINT32 Signature,\r
- EFI_ACPI_DESCRIPTION_HEADER **FoundTable\r
- )\r
-{\r
- UINTN Index;\r
- UINT32 EntryCount;\r
- UINT32 *EntryPtr;\r
- EFI_ACPI_DESCRIPTION_HEADER *Table;\r
- \r
- *FoundTable = NULL;\r
- \r
- EntryCount = (Rsdt->Header.Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT32);\r
- \r
- EntryPtr = &Rsdt->Entry;\r
- for (Index = 0; Index < EntryCount; Index ++, EntryPtr ++) {\r
- Table = (EFI_ACPI_DESCRIPTION_HEADER*)((UINTN)(*EntryPtr));\r
- if (Table->Signature == Signature) {\r
- *FoundTable = Table;\r
- break;\r
- }\r
- }\r
- \r
- return;\r
-}\r
-\r
-VOID\r
-ScanTableInXSDT (\r
- XSDT_TABLE *Xsdt,\r
- UINT32 Signature,\r
- EFI_ACPI_DESCRIPTION_HEADER **FoundTable\r
- )\r
-{\r
- UINTN Index;\r
- UINT32 EntryCount;\r
- UINT64 EntryPtr;\r
- UINTN BasePtr;\r
- EFI_ACPI_DESCRIPTION_HEADER *Table;\r
- \r
- *FoundTable = NULL;\r
- \r
- EntryCount = (Xsdt->Header.Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT64);\r
- \r
- BasePtr = (UINTN)(&(Xsdt->Entry));\r
- for (Index = 0; Index < EntryCount; Index ++) {\r
- CopyMem (&EntryPtr, (VOID *)(BasePtr + Index * sizeof(UINT64)), sizeof(UINT64));\r
- Table = (EFI_ACPI_DESCRIPTION_HEADER*)((UINTN)(EntryPtr));\r
- if (Table->Signature == Signature) {\r
- *FoundTable = Table;\r
- break;\r
- }\r
- }\r
- \r
- return;\r
-}\r
-\r
-VOID *\r
-FindAcpiPtr (\r
- IN HOB_TEMPLATE *Hob,\r
- UINT32 Signature\r
- )\r
-{\r
- EFI_ACPI_DESCRIPTION_HEADER *AcpiTable;\r
- EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;\r
- RSDT_TABLE *Rsdt;\r
- XSDT_TABLE *Xsdt;\r
- \r
- AcpiTable = NULL;\r
-\r
- //\r
- // Check ACPI2.0 table\r
- //\r
- if ((int)Hob->Acpi20.Table != -1) {\r
- Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)Hob->Acpi20.Table;\r
- Rsdt = (RSDT_TABLE *)(UINTN)Rsdp->RsdtAddress;\r
- Xsdt = NULL;\r
- if ((Rsdp->Revision >= 2) && (Rsdp->XsdtAddress < (UINT64)(UINTN)-1)) {\r
- Xsdt = (XSDT_TABLE *)(UINTN)Rsdp->XsdtAddress;\r
- }\r
- //\r
- // Check Xsdt\r
- //\r
- if (Xsdt != NULL) {\r
- ScanTableInXSDT (Xsdt, Signature, &AcpiTable);\r
- }\r
- //\r
- // Check Rsdt\r
- //\r
- if ((AcpiTable == NULL) && (Rsdt != NULL)) {\r
- ScanTableInRSDT (Rsdt, Signature, &AcpiTable);\r
- }\r
- }\r
- \r
- //\r
- // Check ACPI1.0 table\r
- //\r
- if ((AcpiTable == NULL) && ((int)Hob->Acpi.Table != -1)) {\r
- Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)Hob->Acpi.Table;\r
- Rsdt = (RSDT_TABLE *)(UINTN)Rsdp->RsdtAddress;\r
- //\r
- // Check Rsdt\r
- //\r
- if (Rsdt != NULL) {\r
- ScanTableInRSDT (Rsdt, Signature, &AcpiTable);\r
- }\r
- }\r
-\r
- return AcpiTable;\r
-}\r
-\r
-#pragma pack(1)\r
-typedef struct {\r
- UINT64 BaseAddress;\r
- UINT16 PciSegmentGroupNumber;\r
- UINT8 StartBusNumber;\r
- UINT8 EndBusNumber;\r
- UINT32 Reserved;\r
-} MCFG_STRUCTURE;\r
-#pragma pack()\r
-\r
-VOID\r
-PrepareMcfgTable (\r
- IN HOB_TEMPLATE *Hob\r
- )\r
-{\r
- EFI_ACPI_DESCRIPTION_HEADER *McfgTable;\r
- MCFG_STRUCTURE *Mcfg;\r
- UINTN McfgCount;\r
- UINTN Index;\r
-\r
- McfgTable = FindAcpiPtr (Hob, EFI_ACPI_3_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE);\r
- if (McfgTable == NULL) {\r
- return ;\r
- }\r
-\r
- Mcfg = (MCFG_STRUCTURE *)((UINTN)McfgTable + sizeof(EFI_ACPI_DESCRIPTION_HEADER) + sizeof(UINT64));\r
- McfgCount = (McfgTable->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER) - sizeof(UINT64)) / sizeof(MCFG_STRUCTURE);\r
-\r
- //\r
- // Fill PciExpress info on Hob\r
- // Note: Only for 1st segment\r
- //\r
- for (Index = 0; Index < McfgCount; Index++) {\r
- if (Mcfg[Index].PciSegmentGroupNumber == 0) {\r
- Hob->PciExpress.PciExpressBaseAddressInfo.PciExpressBaseAddress = Mcfg[Index].BaseAddress;\r
- break;\r
- }\r
- }\r
-\r
- return ;\r
-}\r
-\r
-VOID\r
-PrepareFadtTable (\r
- IN HOB_TEMPLATE *Hob\r
- )\r
-{\r
- EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt;\r
- EFI_ACPI_DESCRIPTION *AcpiDescription;\r
-\r
- Fadt = FindAcpiPtr (Hob, EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE);\r
- if (Fadt == NULL) {\r
- return ;\r
- }\r
-\r
- AcpiDescription = &Hob->AcpiInfo.AcpiDescription;\r
- //\r
- // Fill AcpiDescription according to FADT\r
- // Currently, only for PM_TMR\r
- //\r
- AcpiDescription->PM_TMR_LEN = Fadt->PmTmrLen;\r
- AcpiDescription->TMR_VAL_EXT = (UINT8)((Fadt->Flags & 0x100) != 0);\r
- \r
- //\r
- // For fields not included in ACPI 1.0 spec, we get the value based on table length\r
- //\r
- if (Fadt->Header.Length >= OFFSET_OF (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE, XPmTmrBlk) + sizeof (Fadt->XPmTmrBlk)) {\r
- CopyMem (\r
- &AcpiDescription->PM_TMR_BLK,\r
- &Fadt->XPmTmrBlk,\r
- sizeof(EFI_ACPI_3_0_GENERIC_ADDRESS_STRUCTURE)\r
- );\r
- }\r
- if (Fadt->Header.Length >= OFFSET_OF (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE, ResetValue) + sizeof (Fadt->ResetValue)) {\r
- CopyMem (\r
- &AcpiDescription->RESET_REG,\r
- &Fadt->ResetReg,\r
- sizeof(EFI_ACPI_3_0_GENERIC_ADDRESS_STRUCTURE)\r
- );\r
- AcpiDescription->RESET_VALUE = Fadt->ResetValue;\r
- }\r
-\r
- if (AcpiDescription->PM_TMR_BLK.Address == 0) {\r
- AcpiDescription->PM_TMR_BLK.Address = Fadt->PmTmrBlk;\r
- AcpiDescription->PM_TMR_BLK.AddressSpaceId = EFI_ACPI_3_0_SYSTEM_IO;\r
- }\r
-\r
- //\r
- // It's possible that the PM_TMR_BLK.RegisterBitWidth is always 32,\r
- // we need to set the correct RegisterBitWidth value according to the TMR_VAL_EXT\r
- // A zero indicates TMR_VAL is implemented as a 24-bit value. \r
- // A one indicates TMR_VAL is implemented as a 32-bit value\r
- //\r
- AcpiDescription->PM_TMR_BLK.RegisterBitWidth = (UINT8) ((AcpiDescription->TMR_VAL_EXT == 0) ? 24 : 32);\r
- \r
-\r
- return ;\r
-}\r
-\r
-VOID\r
-PrepareHobLegacyTable (\r
- IN HOB_TEMPLATE *Hob\r
- )\r
-{\r
- CHAR8 PrintBuffer[256];\r
-\r
- Hob->Acpi.Table = (EFI_PHYSICAL_ADDRESS)(UINTN)FindAcpiRsdPtr ();\r
- AsciiSPrint (PrintBuffer, 256, "\nAcpiTable=0x%x ", (UINT32)(UINTN)Hob->Acpi.Table);\r
- PrintString (PrintBuffer);\r
- Hob->Acpi20.Table = (EFI_PHYSICAL_ADDRESS)(UINTN)FindAcpiRsdPtr ();\r
- Hob->Smbios.Table = (EFI_PHYSICAL_ADDRESS)(UINTN)FindSMBIOSPtr ();\r
- AsciiSPrint (PrintBuffer, 256, "SMBIOS Table=0x%x ", (UINT32)(UINTN)Hob->Smbios.Table);\r
- PrintString (PrintBuffer);\r
- Hob->Mps.Table = (EFI_PHYSICAL_ADDRESS)(UINTN)FindMPSPtr ();\r
- AsciiSPrint (PrintBuffer, 256, "MPS Table=0x%x\n", (UINT32)(UINTN)Hob->Mps.Table);\r
- PrintString (PrintBuffer);\r
-\r
- PrepareMcfgTable (Hob);\r
-\r
- PrepareFadtTable (Hob);\r
-\r
- return ;\r
-}\r
-\r