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