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