aetables.c revision 1.1.1.20 1 1.1 jruoho /******************************************************************************
2 1.1 jruoho *
3 1.1.1.2 jruoho * Module Name: aetables - ACPI table setup/install for acpiexec utility
4 1.1 jruoho *
5 1.1 jruoho *****************************************************************************/
6 1.1 jruoho
7 1.1.1.19 christos /******************************************************************************
8 1.1.1.19 christos *
9 1.1.1.19 christos * 1. Copyright Notice
10 1.1.1.19 christos *
11 1.1.1.20 christos * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
12 1.1 jruoho * All rights reserved.
13 1.1 jruoho *
14 1.1.1.19 christos * 2. License
15 1.1.1.19 christos *
16 1.1.1.19 christos * 2.1. This is your license from Intel Corp. under its intellectual property
17 1.1.1.19 christos * rights. You may have additional license terms from the party that provided
18 1.1.1.19 christos * you this software, covering your right to use that party's intellectual
19 1.1.1.19 christos * property rights.
20 1.1.1.19 christos *
21 1.1.1.19 christos * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22 1.1.1.19 christos * copy of the source code appearing in this file ("Covered Code") an
23 1.1.1.19 christos * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24 1.1.1.19 christos * base code distributed originally by Intel ("Original Intel Code") to copy,
25 1.1.1.19 christos * make derivatives, distribute, use and display any portion of the Covered
26 1.1.1.19 christos * Code in any form, with the right to sublicense such rights; and
27 1.1.1.19 christos *
28 1.1.1.19 christos * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29 1.1.1.19 christos * license (with the right to sublicense), under only those claims of Intel
30 1.1.1.19 christos * patents that are infringed by the Original Intel Code, to make, use, sell,
31 1.1.1.19 christos * offer to sell, and import the Covered Code and derivative works thereof
32 1.1.1.19 christos * solely to the minimum extent necessary to exercise the above copyright
33 1.1.1.19 christos * license, and in no event shall the patent license extend to any additions
34 1.1.1.19 christos * to or modifications of the Original Intel Code. No other license or right
35 1.1.1.19 christos * is granted directly or by implication, estoppel or otherwise;
36 1.1.1.19 christos *
37 1.1.1.19 christos * The above copyright and patent license is granted only if the following
38 1.1.1.19 christos * conditions are met:
39 1.1.1.19 christos *
40 1.1.1.19 christos * 3. Conditions
41 1.1.1.19 christos *
42 1.1.1.19 christos * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43 1.1.1.19 christos * Redistribution of source code of any substantial portion of the Covered
44 1.1.1.19 christos * Code or modification with rights to further distribute source must include
45 1.1.1.19 christos * the above Copyright Notice, the above License, this list of Conditions,
46 1.1.1.19 christos * and the following Disclaimer and Export Compliance provision. In addition,
47 1.1.1.19 christos * Licensee must cause all Covered Code to which Licensee contributes to
48 1.1.1.19 christos * contain a file documenting the changes Licensee made to create that Covered
49 1.1.1.19 christos * Code and the date of any change. Licensee must include in that file the
50 1.1.1.19 christos * documentation of any changes made by any predecessor Licensee. Licensee
51 1.1.1.19 christos * must include a prominent statement that the modification is derived,
52 1.1.1.19 christos * directly or indirectly, from Original Intel Code.
53 1.1.1.19 christos *
54 1.1.1.19 christos * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55 1.1.1.19 christos * Redistribution of source code of any substantial portion of the Covered
56 1.1.1.19 christos * Code or modification without rights to further distribute source must
57 1.1.1.19 christos * include the following Disclaimer and Export Compliance provision in the
58 1.1.1.19 christos * documentation and/or other materials provided with distribution. In
59 1.1.1.19 christos * addition, Licensee may not authorize further sublicense of source of any
60 1.1.1.19 christos * portion of the Covered Code, and must include terms to the effect that the
61 1.1.1.19 christos * license from Licensee to its licensee is limited to the intellectual
62 1.1.1.19 christos * property embodied in the software Licensee provides to its licensee, and
63 1.1.1.19 christos * not to intellectual property embodied in modifications its licensee may
64 1.1.1.19 christos * make.
65 1.1.1.19 christos *
66 1.1.1.19 christos * 3.3. Redistribution of Executable. Redistribution in executable form of any
67 1.1.1.19 christos * substantial portion of the Covered Code or modification must reproduce the
68 1.1.1.19 christos * above Copyright Notice, and the following Disclaimer and Export Compliance
69 1.1.1.19 christos * provision in the documentation and/or other materials provided with the
70 1.1.1.19 christos * distribution.
71 1.1.1.19 christos *
72 1.1.1.19 christos * 3.4. Intel retains all right, title, and interest in and to the Original
73 1.1.1.19 christos * Intel Code.
74 1.1.1.19 christos *
75 1.1.1.19 christos * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76 1.1.1.19 christos * Intel shall be used in advertising or otherwise to promote the sale, use or
77 1.1.1.19 christos * other dealings in products derived from or relating to the Covered Code
78 1.1.1.19 christos * without prior written authorization from Intel.
79 1.1.1.19 christos *
80 1.1.1.19 christos * 4. Disclaimer and Export Compliance
81 1.1.1.19 christos *
82 1.1.1.19 christos * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83 1.1.1.19 christos * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84 1.1.1.19 christos * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85 1.1.1.19 christos * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86 1.1.1.19 christos * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87 1.1.1.19 christos * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88 1.1.1.19 christos * PARTICULAR PURPOSE.
89 1.1.1.19 christos *
90 1.1.1.19 christos * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91 1.1.1.19 christos * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92 1.1.1.19 christos * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93 1.1.1.19 christos * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94 1.1.1.19 christos * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95 1.1.1.19 christos * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96 1.1.1.19 christos * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97 1.1.1.19 christos * LIMITED REMEDY.
98 1.1.1.19 christos *
99 1.1.1.19 christos * 4.3. Licensee shall not export, either directly or indirectly, any of this
100 1.1.1.19 christos * software or system incorporating such software without first obtaining any
101 1.1.1.19 christos * required license or other approval from the U. S. Department of Commerce or
102 1.1.1.19 christos * any other agency or department of the United States Government. In the
103 1.1.1.19 christos * event Licensee exports any such software from the United States or
104 1.1.1.19 christos * re-exports any such software from a foreign destination, Licensee shall
105 1.1.1.19 christos * ensure that the distribution and export/re-export of the software is in
106 1.1.1.19 christos * compliance with all laws, regulations, orders, or other restrictions of the
107 1.1.1.19 christos * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108 1.1.1.19 christos * any of its subsidiaries will export/re-export any technical data, process,
109 1.1.1.19 christos * software, or service, directly or indirectly, to any country for which the
110 1.1.1.19 christos * United States government or any agency thereof requires an export license,
111 1.1.1.19 christos * other governmental approval, or letter of assurance, without first obtaining
112 1.1.1.19 christos * such license, approval or letter.
113 1.1.1.19 christos *
114 1.1.1.19 christos *****************************************************************************
115 1.1.1.19 christos *
116 1.1.1.19 christos * Alternatively, you may choose to be licensed under the terms of the
117 1.1.1.19 christos * following license:
118 1.1.1.19 christos *
119 1.1.1.2 jruoho * Redistribution and use in source and binary forms, with or without
120 1.1.1.2 jruoho * modification, are permitted provided that the following conditions
121 1.1.1.2 jruoho * are met:
122 1.1.1.2 jruoho * 1. Redistributions of source code must retain the above copyright
123 1.1.1.2 jruoho * notice, this list of conditions, and the following disclaimer,
124 1.1.1.2 jruoho * without modification.
125 1.1.1.2 jruoho * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126 1.1.1.2 jruoho * substantially similar to the "NO WARRANTY" disclaimer below
127 1.1.1.2 jruoho * ("Disclaimer") and any redistribution must be conditioned upon
128 1.1.1.2 jruoho * including a substantially similar Disclaimer requirement for further
129 1.1.1.2 jruoho * binary redistribution.
130 1.1.1.2 jruoho * 3. Neither the names of the above-listed copyright holders nor the names
131 1.1.1.2 jruoho * of any contributors may be used to endorse or promote products derived
132 1.1.1.2 jruoho * from this software without specific prior written permission.
133 1.1.1.2 jruoho *
134 1.1.1.2 jruoho * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135 1.1.1.2 jruoho * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136 1.1.1.15 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137 1.1.1.2 jruoho * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138 1.1.1.19 christos * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139 1.1.1.19 christos * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140 1.1.1.19 christos * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141 1.1.1.19 christos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142 1.1.1.19 christos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143 1.1.1.19 christos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144 1.1.1.19 christos * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145 1.1.1.19 christos *
146 1.1.1.19 christos * Alternatively, you may choose to be licensed under the terms of the
147 1.1.1.19 christos * GNU General Public License ("GPL") version 2 as published by the Free
148 1.1.1.19 christos * Software Foundation.
149 1.1.1.19 christos *
150 1.1.1.19 christos *****************************************************************************/
151 1.1 jruoho
152 1.1 jruoho #include "aecommon.h"
153 1.1.1.2 jruoho #include "aetables.h"
154 1.1 jruoho
155 1.1 jruoho #define _COMPONENT ACPI_TOOLS
156 1.1 jruoho ACPI_MODULE_NAME ("aetables")
157 1.1 jruoho
158 1.1 jruoho /* Local prototypes */
159 1.1 jruoho
160 1.1.1.5 christos static void
161 1.1.1.5 christos AeInitializeTableHeader (
162 1.1.1.5 christos ACPI_TABLE_HEADER *Header,
163 1.1.1.5 christos char *Signature,
164 1.1.1.5 christos UINT32 Length);
165 1.1.1.5 christos
166 1.1 jruoho void
167 1.1 jruoho AeTableOverride (
168 1.1 jruoho ACPI_TABLE_HEADER *ExistingTable,
169 1.1 jruoho ACPI_TABLE_HEADER **NewTable);
170 1.1 jruoho
171 1.1.1.2 jruoho /* User table (DSDT) */
172 1.1 jruoho
173 1.1.1.2 jruoho static ACPI_TABLE_HEADER *DsdtToInstallOverride;
174 1.1 jruoho
175 1.1.1.2 jruoho /* Non-AML tables that are constructed locally and installed */
176 1.1 jruoho
177 1.1.1.2 jruoho static ACPI_TABLE_RSDP LocalRSDP;
178 1.1.1.2 jruoho static ACPI_TABLE_FACS LocalFACS;
179 1.1.1.2 jruoho static ACPI_TABLE_HEADER LocalTEST;
180 1.1.1.2 jruoho static ACPI_TABLE_HEADER LocalBADTABLE;
181 1.1 jruoho
182 1.1 jruoho /*
183 1.1.1.2 jruoho * We need a local FADT so that the hardware subcomponent will function,
184 1.1.1.2 jruoho * even though the underlying OSD HW access functions don't do anything.
185 1.1 jruoho */
186 1.1.1.2 jruoho static ACPI_TABLE_FADT LocalFADT;
187 1.1 jruoho
188 1.1 jruoho /*
189 1.1.1.2 jruoho * Use XSDT so that both 32- and 64-bit versions of this utility will
190 1.1.1.2 jruoho * function automatically.
191 1.1 jruoho */
192 1.1.1.2 jruoho static ACPI_TABLE_XSDT *LocalXSDT;
193 1.1 jruoho
194 1.1.1.5 christos #define BASE_XSDT_TABLES 9
195 1.1.1.5 christos #define BASE_XSDT_SIZE ((BASE_XSDT_TABLES) * sizeof (UINT64))
196 1.1 jruoho
197 1.1.1.2 jruoho #define ACPI_MAX_INIT_TABLES (32)
198 1.1 jruoho
199 1.1 jruoho
200 1.1 jruoho /******************************************************************************
201 1.1 jruoho *
202 1.1 jruoho * FUNCTION: AeTableOverride
203 1.1 jruoho *
204 1.1 jruoho * DESCRIPTION: Local implementation of AcpiOsTableOverride.
205 1.1 jruoho * Exercise the override mechanism
206 1.1 jruoho *
207 1.1 jruoho *****************************************************************************/
208 1.1 jruoho
209 1.1 jruoho void
210 1.1 jruoho AeTableOverride (
211 1.1 jruoho ACPI_TABLE_HEADER *ExistingTable,
212 1.1 jruoho ACPI_TABLE_HEADER **NewTable)
213 1.1 jruoho {
214 1.1 jruoho
215 1.1.1.5 christos if (!AcpiGbl_LoadTestTables)
216 1.1.1.5 christos {
217 1.1.1.5 christos *NewTable = NULL;
218 1.1.1.5 christos return;
219 1.1.1.5 christos }
220 1.1.1.5 christos
221 1.1 jruoho /* This code exercises the table override mechanism in the core */
222 1.1 jruoho
223 1.1.1.13 christos if (ACPI_COMPARE_NAMESEG (ExistingTable->Signature, ACPI_SIG_DSDT))
224 1.1 jruoho {
225 1.1 jruoho *NewTable = DsdtToInstallOverride;
226 1.1 jruoho }
227 1.1 jruoho
228 1.1 jruoho /* This code tests override of dynamically loaded tables */
229 1.1 jruoho
230 1.1.1.13 christos else if (ACPI_COMPARE_NAMESEG (ExistingTable->Signature, "OEM9"))
231 1.1 jruoho {
232 1.1 jruoho *NewTable = ACPI_CAST_PTR (ACPI_TABLE_HEADER, Ssdt3Code);
233 1.1 jruoho }
234 1.1 jruoho }
235 1.1 jruoho
236 1.1 jruoho
237 1.1 jruoho /******************************************************************************
238 1.1 jruoho *
239 1.1.1.5 christos * FUNCTION: AeInitializeTableHeader
240 1.1.1.5 christos *
241 1.1.1.5 christos * PARAMETERS: Header - A valid standard ACPI table header
242 1.1.1.5 christos * Signature - Signature to insert
243 1.1.1.5 christos * Length - Length of the table
244 1.1.1.5 christos *
245 1.1.1.5 christos * RETURN: None. Header is modified.
246 1.1.1.5 christos *
247 1.1.1.5 christos * DESCRIPTION: Initialize the table header for a local ACPI table.
248 1.1.1.5 christos *
249 1.1.1.5 christos *****************************************************************************/
250 1.1.1.5 christos
251 1.1.1.5 christos static void
252 1.1.1.5 christos AeInitializeTableHeader (
253 1.1.1.5 christos ACPI_TABLE_HEADER *Header,
254 1.1.1.5 christos char *Signature,
255 1.1.1.5 christos UINT32 Length)
256 1.1.1.5 christos {
257 1.1.1.5 christos
258 1.1.1.13 christos ACPI_COPY_NAMESEG (Header->Signature, Signature);
259 1.1.1.5 christos Header->Length = Length;
260 1.1.1.5 christos
261 1.1.1.5 christos Header->OemRevision = 0x1001;
262 1.1.1.11 christos memcpy (Header->OemId, "Intel ", ACPI_OEM_ID_SIZE);
263 1.1.1.11 christos memcpy (Header->OemTableId, "AcpiExec", ACPI_OEM_TABLE_ID_SIZE);
264 1.1.1.13 christos ACPI_COPY_NAMESEG (Header->AslCompilerId, "INTL");
265 1.1.1.8 christos Header->AslCompilerRevision = ACPI_CA_VERSION;
266 1.1.1.8 christos
267 1.1.1.8 christos /* Set the checksum, must set to zero first */
268 1.1.1.8 christos
269 1.1.1.8 christos Header->Checksum = 0;
270 1.1.1.17 christos Header->Checksum = (UINT8) -AcpiUtChecksum (
271 1.1.1.8 christos (void *) Header, Header->Length);
272 1.1.1.5 christos }
273 1.1.1.5 christos
274 1.1.1.5 christos
275 1.1.1.5 christos /******************************************************************************
276 1.1.1.5 christos *
277 1.1 jruoho * FUNCTION: AeBuildLocalTables
278 1.1 jruoho *
279 1.1 jruoho * PARAMETERS: TableCount - Number of tables on the command line
280 1.1.1.8 christos * ListHead - List of actual tables from files
281 1.1 jruoho *
282 1.1 jruoho * RETURN: Status
283 1.1 jruoho *
284 1.1.1.2 jruoho * DESCRIPTION: Build a complete ACPI table chain, with a local RSDP, XSDT,
285 1.1 jruoho * FADT, and several other test tables.
286 1.1 jruoho *
287 1.1 jruoho *****************************************************************************/
288 1.1 jruoho
289 1.1 jruoho ACPI_STATUS
290 1.1 jruoho AeBuildLocalTables (
291 1.1.1.8 christos ACPI_NEW_TABLE_DESC *ListHead)
292 1.1 jruoho {
293 1.1.1.8 christos UINT32 TableCount = 1;
294 1.1 jruoho ACPI_PHYSICAL_ADDRESS DsdtAddress = 0;
295 1.1.1.2 jruoho UINT32 XsdtSize;
296 1.1.1.8 christos ACPI_NEW_TABLE_DESC *NextTable;
297 1.1 jruoho UINT32 NextIndex;
298 1.1 jruoho ACPI_TABLE_FADT *ExternalFadt = NULL;
299 1.1 jruoho
300 1.1 jruoho
301 1.1 jruoho /*
302 1.1.1.5 christos * Update the table count. For the DSDT, it is not put into the XSDT.
303 1.1.1.5 christos * For the FADT, this table is already accounted for since we usually
304 1.1.1.5 christos * install a local FADT.
305 1.1 jruoho */
306 1.1.1.8 christos NextTable = ListHead;
307 1.1 jruoho while (NextTable)
308 1.1 jruoho {
309 1.1.1.13 christos if (!ACPI_COMPARE_NAMESEG (NextTable->Table->Signature, ACPI_SIG_DSDT) &&
310 1.1.1.13 christos !ACPI_COMPARE_NAMESEG (NextTable->Table->Signature, ACPI_SIG_FADT))
311 1.1 jruoho {
312 1.1.1.8 christos TableCount++;
313 1.1 jruoho }
314 1.1.1.8 christos
315 1.1 jruoho NextTable = NextTable->Next;
316 1.1 jruoho }
317 1.1 jruoho
318 1.1.1.8 christos XsdtSize = (((TableCount + 1) * sizeof (UINT64)) +
319 1.1.1.8 christos sizeof (ACPI_TABLE_HEADER));
320 1.1.1.5 christos if (AcpiGbl_LoadTestTables)
321 1.1.1.5 christos {
322 1.1.1.5 christos XsdtSize += BASE_XSDT_SIZE;
323 1.1.1.5 christos }
324 1.1 jruoho
325 1.1.1.2 jruoho /* Build an XSDT */
326 1.1 jruoho
327 1.1.1.2 jruoho LocalXSDT = AcpiOsAllocate (XsdtSize);
328 1.1.1.2 jruoho if (!LocalXSDT)
329 1.1 jruoho {
330 1.1.1.2 jruoho return (AE_NO_MEMORY);
331 1.1 jruoho }
332 1.1 jruoho
333 1.1.1.7 christos memset (LocalXSDT, 0, XsdtSize);
334 1.1.1.5 christos LocalXSDT->TableOffsetEntry[0] = ACPI_PTR_TO_PHYSADDR (&LocalFADT);
335 1.1.1.5 christos NextIndex = 1;
336 1.1.1.4 christos
337 1.1.1.4 christos /*
338 1.1 jruoho * Install the user tables. The DSDT must be installed in the FADT.
339 1.1.1.2 jruoho * All other tables are installed directly into the XSDT.
340 1.1 jruoho */
341 1.1.1.8 christos NextTable = ListHead;
342 1.1 jruoho while (NextTable)
343 1.1 jruoho {
344 1.1 jruoho /*
345 1.1 jruoho * Incoming DSDT or FADT are special cases. All other tables are
346 1.1.1.2 jruoho * just immediately installed into the XSDT.
347 1.1 jruoho */
348 1.1.1.13 christos if (ACPI_COMPARE_NAMESEG (NextTable->Table->Signature, ACPI_SIG_DSDT))
349 1.1 jruoho {
350 1.1 jruoho if (DsdtAddress)
351 1.1 jruoho {
352 1.1 jruoho printf ("Already found a DSDT, only one allowed\n");
353 1.1.1.2 jruoho return (AE_ALREADY_EXISTS);
354 1.1 jruoho }
355 1.1 jruoho
356 1.1 jruoho /* The incoming user table is a DSDT */
357 1.1 jruoho
358 1.1.1.5 christos DsdtAddress = ACPI_PTR_TO_PHYSADDR (NextTable->Table);
359 1.1 jruoho DsdtToInstallOverride = NextTable->Table;
360 1.1 jruoho }
361 1.1.1.13 christos else if (ACPI_COMPARE_NAMESEG (NextTable->Table->Signature, ACPI_SIG_FADT))
362 1.1 jruoho {
363 1.1 jruoho ExternalFadt = ACPI_CAST_PTR (ACPI_TABLE_FADT, NextTable->Table);
364 1.1.1.5 christos LocalXSDT->TableOffsetEntry[0] = ACPI_PTR_TO_PHYSADDR (NextTable->Table);
365 1.1 jruoho }
366 1.1 jruoho else
367 1.1 jruoho {
368 1.1.1.2 jruoho /* Install the table in the XSDT */
369 1.1 jruoho
370 1.1.1.8 christos LocalXSDT->TableOffsetEntry[NextIndex] =
371 1.1.1.5 christos ACPI_PTR_TO_PHYSADDR (NextTable->Table);
372 1.1 jruoho NextIndex++;
373 1.1 jruoho }
374 1.1 jruoho
375 1.1 jruoho NextTable = NextTable->Next;
376 1.1 jruoho }
377 1.1 jruoho
378 1.1.1.5 christos /* Install the optional extra local tables */
379 1.1.1.5 christos
380 1.1.1.5 christos if (AcpiGbl_LoadTestTables)
381 1.1.1.5 christos {
382 1.1.1.5 christos LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&LocalTEST);
383 1.1.1.5 christos LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&LocalBADTABLE);
384 1.1.1.5 christos
385 1.1.1.5 christos /* Install two SSDTs to test multiple table support */
386 1.1.1.5 christos
387 1.1.1.5 christos LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&Ssdt1Code);
388 1.1.1.5 christos LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&Ssdt2Code);
389 1.1.1.5 christos
390 1.1.1.5 christos /* Install the OEM1 table to test LoadTable */
391 1.1.1.5 christos
392 1.1.1.5 christos LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&Oem1Code);
393 1.1.1.5 christos
394 1.1.1.5 christos /* Install the OEMx table to test LoadTable */
395 1.1.1.5 christos
396 1.1.1.5 christos LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&OemxCode);
397 1.1.1.5 christos
398 1.1.1.5 christos /* Install the ECDT table to test _REG */
399 1.1.1.5 christos
400 1.1.1.5 christos LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&EcdtCode);
401 1.1.1.5 christos
402 1.1.1.5 christos /* Install two UEFIs to test multiple table support */
403 1.1.1.5 christos
404 1.1.1.5 christos LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&Uefi1Code);
405 1.1.1.5 christos LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&Uefi2Code);
406 1.1.1.5 christos }
407 1.1.1.5 christos
408 1.1.1.5 christos /* Build an RSDP. Contains a valid XSDT only, no RSDT */
409 1.1 jruoho
410 1.1.1.7 christos memset (&LocalRSDP, 0, sizeof (ACPI_TABLE_RSDP));
411 1.1.1.4 christos ACPI_MAKE_RSDP_SIG (LocalRSDP.Signature);
412 1.1.1.7 christos memcpy (LocalRSDP.OemId, "Intel", 6);
413 1.1.1.5 christos
414 1.1.1.2 jruoho LocalRSDP.Revision = 2;
415 1.1.1.2 jruoho LocalRSDP.XsdtPhysicalAddress = ACPI_PTR_TO_PHYSADDR (LocalXSDT);
416 1.1.1.5 christos LocalRSDP.Length = sizeof (ACPI_TABLE_RSDP);
417 1.1 jruoho
418 1.1.1.2 jruoho /* Set checksums for both XSDT and RSDP */
419 1.1 jruoho
420 1.1.1.8 christos AeInitializeTableHeader ((void *) LocalXSDT, ACPI_SIG_XSDT, XsdtSize);
421 1.1.1.5 christos
422 1.1.1.5 christos LocalRSDP.Checksum = 0;
423 1.1.1.17 christos LocalRSDP.Checksum = (UINT8) -AcpiUtChecksum (
424 1.1 jruoho (void *) &LocalRSDP, ACPI_RSDP_CHECKSUM_LENGTH);
425 1.1 jruoho
426 1.1 jruoho if (!DsdtAddress)
427 1.1 jruoho {
428 1.1 jruoho /* Use the local DSDT because incoming table(s) are all SSDT(s) */
429 1.1 jruoho
430 1.1 jruoho DsdtAddress = ACPI_PTR_TO_PHYSADDR (LocalDsdtCode);
431 1.1 jruoho DsdtToInstallOverride = ACPI_CAST_PTR (ACPI_TABLE_HEADER, LocalDsdtCode);
432 1.1 jruoho }
433 1.1 jruoho
434 1.1.1.5 christos /*
435 1.1.1.5 christos * Build an FADT. There are three options for the FADT:
436 1.1.1.5 christos * 1) Incoming external FADT specified on the command line
437 1.1.1.5 christos * 2) A "hardware reduced" local FADT
438 1.1.1.5 christos * 3) A fully featured local FADT
439 1.1.1.5 christos */
440 1.1.1.7 christos memset (&LocalFADT, 0, sizeof (ACPI_TABLE_FADT));
441 1.1.1.7 christos
442 1.1 jruoho if (ExternalFadt)
443 1.1 jruoho {
444 1.1 jruoho /*
445 1.1.1.8 christos * Use the external FADT, but we must update the DSDT/FACS
446 1.1.1.8 christos * addresses as well as the checksum
447 1.1 jruoho */
448 1.1.1.6 christos ExternalFadt->Dsdt = (UINT32) DsdtAddress;
449 1.1.1.4 christos if (!AcpiGbl_ReducedHardware)
450 1.1.1.4 christos {
451 1.1.1.4 christos ExternalFadt->Facs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
452 1.1.1.4 christos }
453 1.1 jruoho
454 1.1.1.8 christos /*
455 1.1.1.8 christos * If there room in the FADT for the XDsdt and XFacs 64-bit
456 1.1.1.8 christos * pointers, use them.
457 1.1.1.8 christos */
458 1.1.1.8 christos if (ExternalFadt->Header.Length > ACPI_PTR_DIFF (
459 1.1.1.8 christos &ExternalFadt->XDsdt, ExternalFadt))
460 1.1 jruoho {
461 1.1.1.8 christos ExternalFadt->Dsdt = 0;
462 1.1.1.8 christos ExternalFadt->Facs = 0;
463 1.1.1.4 christos
464 1.1.1.8 christos ExternalFadt->XDsdt = DsdtAddress;
465 1.1.1.4 christos if (!AcpiGbl_ReducedHardware)
466 1.1.1.4 christos {
467 1.1.1.4 christos ExternalFadt->XFacs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
468 1.1.1.4 christos }
469 1.1 jruoho }
470 1.1.1.4 christos
471 1.1.1.8 christos /* Complete the external FADT with the checksum */
472 1.1 jruoho
473 1.1 jruoho ExternalFadt->Header.Checksum = 0;
474 1.1.1.17 christos ExternalFadt->Header.Checksum = (UINT8) -AcpiUtChecksum (
475 1.1 jruoho (void *) ExternalFadt, ExternalFadt->Header.Length);
476 1.1 jruoho }
477 1.1.1.4 christos else if (AcpiGbl_UseHwReducedFadt)
478 1.1.1.4 christos {
479 1.1.1.7 christos memcpy (&LocalFADT, HwReducedFadtCode, ACPI_FADT_V5_SIZE);
480 1.1.1.8 christos LocalFADT.Dsdt = 0;
481 1.1.1.4 christos LocalFADT.XDsdt = DsdtAddress;
482 1.1.1.4 christos }
483 1.1 jruoho else
484 1.1 jruoho {
485 1.1 jruoho /*
486 1.1 jruoho * Build a local FADT so we can test the hardware/event init
487 1.1 jruoho */
488 1.1.1.5 christos LocalFADT.Header.Revision = 5;
489 1.1 jruoho
490 1.1 jruoho /* Setup FADT header and DSDT/FACS addresses */
491 1.1 jruoho
492 1.1.1.2 jruoho LocalFADT.Dsdt = 0;
493 1.1.1.2 jruoho LocalFADT.Facs = 0;
494 1.1 jruoho
495 1.1 jruoho LocalFADT.XDsdt = DsdtAddress;
496 1.1 jruoho LocalFADT.XFacs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
497 1.1 jruoho
498 1.1 jruoho /* Miscellaneous FADT fields */
499 1.1 jruoho
500 1.1.1.11 christos LocalFADT.Gpe0BlockLength = 0x20;
501 1.1.1.11 christos LocalFADT.Gpe0Block = 0x00003210;
502 1.1.1.2 jruoho
503 1.1.1.11 christos LocalFADT.Gpe1BlockLength = 0x20;
504 1.1.1.11 christos LocalFADT.Gpe1Block = 0x0000BA98;
505 1.1.1.11 christos LocalFADT.Gpe1Base = 0x80;
506 1.1 jruoho
507 1.1 jruoho LocalFADT.Pm1EventLength = 4;
508 1.1 jruoho LocalFADT.Pm1aEventBlock = 0x00001aaa;
509 1.1 jruoho LocalFADT.Pm1bEventBlock = 0x00001bbb;
510 1.1.1.2 jruoho
511 1.1.1.2 jruoho LocalFADT.Pm1ControlLength = 2;
512 1.1 jruoho LocalFADT.Pm1aControlBlock = 0xB0;
513 1.1 jruoho
514 1.1.1.2 jruoho LocalFADT.PmTimerLength = 4;
515 1.1.1.2 jruoho LocalFADT.PmTimerBlock = 0xA0;
516 1.1.1.2 jruoho
517 1.1.1.2 jruoho LocalFADT.Pm2ControlBlock = 0xC0;
518 1.1.1.2 jruoho LocalFADT.Pm2ControlLength = 1;
519 1.1.1.2 jruoho
520 1.1.1.5 christos /* Setup one example X-64 GAS field */
521 1.1 jruoho
522 1.1 jruoho LocalFADT.XPm1bEventBlock.SpaceId = ACPI_ADR_SPACE_SYSTEM_IO;
523 1.1 jruoho LocalFADT.XPm1bEventBlock.Address = LocalFADT.Pm1bEventBlock;
524 1.1.1.8 christos LocalFADT.XPm1bEventBlock.BitWidth = (UINT8)
525 1.1.1.8 christos ACPI_MUL_8 (LocalFADT.Pm1EventLength);
526 1.1 jruoho }
527 1.1 jruoho
528 1.1.1.8 christos AeInitializeTableHeader ((void *) &LocalFADT,
529 1.1.1.8 christos ACPI_SIG_FADT, sizeof (ACPI_TABLE_FADT));
530 1.1.1.8 christos
531 1.1 jruoho /* Build a FACS */
532 1.1 jruoho
533 1.1.1.7 christos memset (&LocalFACS, 0, sizeof (ACPI_TABLE_FACS));
534 1.1.1.13 christos ACPI_COPY_NAMESEG (LocalFACS.Signature, ACPI_SIG_FACS);
535 1.1 jruoho
536 1.1 jruoho LocalFACS.Length = sizeof (ACPI_TABLE_FACS);
537 1.1 jruoho LocalFACS.GlobalLock = 0x11AA0011;
538 1.1 jruoho
539 1.1.1.5 christos /* Build the optional local tables */
540 1.1.1.5 christos
541 1.1.1.5 christos if (AcpiGbl_LoadTestTables)
542 1.1.1.5 christos {
543 1.1.1.5 christos /*
544 1.1.1.5 christos * Build a fake table [TEST] so that we make sure that the
545 1.1.1.5 christos * ACPICA core ignores it
546 1.1.1.5 christos */
547 1.1.1.7 christos memset (&LocalTEST, 0, sizeof (ACPI_TABLE_HEADER));
548 1.1.1.13 christos ACPI_COPY_NAMESEG (LocalTEST.Signature, "TEST");
549 1.1 jruoho
550 1.1.1.5 christos LocalTEST.Revision = 1;
551 1.1.1.5 christos LocalTEST.Length = sizeof (ACPI_TABLE_HEADER);
552 1.1.1.8 christos
553 1.1.1.8 christos LocalTEST.Checksum = 0;
554 1.1.1.17 christos LocalTEST.Checksum = (UINT8) -AcpiUtChecksum (
555 1.1.1.5 christos (void *) &LocalTEST, LocalTEST.Length);
556 1.1 jruoho
557 1.1.1.5 christos /*
558 1.1.1.5 christos * Build a fake table with a bad signature [BAD!] so that we make
559 1.1.1.5 christos * sure that the ACPICA core ignores it
560 1.1.1.5 christos */
561 1.1.1.7 christos memset (&LocalBADTABLE, 0, sizeof (ACPI_TABLE_HEADER));
562 1.1.1.13 christos ACPI_COPY_NAMESEG (LocalBADTABLE.Signature, "BAD!");
563 1.1 jruoho
564 1.1.1.5 christos LocalBADTABLE.Revision = 1;
565 1.1.1.5 christos LocalBADTABLE.Length = sizeof (ACPI_TABLE_HEADER);
566 1.1.1.8 christos
567 1.1.1.8 christos LocalBADTABLE.Checksum = 0;
568 1.1.1.17 christos LocalBADTABLE.Checksum = (UINT8) -AcpiUtChecksum (
569 1.1.1.5 christos (void *) &LocalBADTABLE, LocalBADTABLE.Length);
570 1.1.1.5 christos }
571 1.1 jruoho
572 1.1 jruoho return (AE_OK);
573 1.1 jruoho }
574 1.1 jruoho
575 1.1 jruoho
576 1.1 jruoho /******************************************************************************
577 1.1 jruoho *
578 1.1 jruoho * FUNCTION: AeInstallTables
579 1.1 jruoho *
580 1.1 jruoho * PARAMETERS: None
581 1.1 jruoho *
582 1.1 jruoho * RETURN: Status
583 1.1 jruoho *
584 1.1 jruoho * DESCRIPTION: Install the various ACPI tables
585 1.1 jruoho *
586 1.1 jruoho *****************************************************************************/
587 1.1 jruoho
588 1.1 jruoho ACPI_STATUS
589 1.1 jruoho AeInstallTables (
590 1.1 jruoho void)
591 1.1 jruoho {
592 1.1 jruoho ACPI_STATUS Status;
593 1.1.1.4 christos ACPI_TABLE_HEADER Header;
594 1.1.1.4 christos ACPI_TABLE_HEADER *Table;
595 1.1.1.8 christos UINT32 i;
596 1.1.1.8 christos
597 1.1.1.8 christos
598 1.1.1.8 christos Status = AcpiInitializeTables (NULL, ACPI_MAX_INIT_TABLES, TRUE);
599 1.1.1.8 christos ACPI_CHECK_OK (AcpiInitializeTables, Status);
600 1.1.1.8 christos
601 1.1.1.10 christos /*
602 1.1.1.10 christos * The following code is prepared to test the deferred table
603 1.1.1.10 christos * verification mechanism. When AcpiGbl_EnableTableValidation is set
604 1.1.1.10 christos * to FALSE by default, AcpiReallocateRootTable() sets it back to TRUE
605 1.1.1.10 christos * and triggers the deferred table verification mechanism accordingly.
606 1.1.1.10 christos */
607 1.1.1.10 christos (void) AcpiReallocateRootTable ();
608 1.1.1.10 christos
609 1.1.1.8 christos if (AcpiGbl_LoadTestTables)
610 1.1.1.8 christos {
611 1.1.1.8 christos /* Test multiple table/UEFI support. First, get the headers */
612 1.1.1.8 christos
613 1.1.1.8 christos Status = AcpiGetTableHeader (ACPI_SIG_UEFI, 1, &Header);
614 1.1.1.8 christos ACPI_CHECK_OK (AcpiGetTableHeader, Status);
615 1.1.1.8 christos
616 1.1.1.8 christos Status = AcpiGetTableHeader (ACPI_SIG_UEFI, 2, &Header);
617 1.1.1.8 christos ACPI_CHECK_OK (AcpiGetTableHeader, Status);
618 1.1.1.8 christos
619 1.1.1.8 christos Status = AcpiGetTableHeader (ACPI_SIG_UEFI, 3, &Header);
620 1.1.1.8 christos ACPI_CHECK_STATUS (AcpiGetTableHeader, Status, AE_NOT_FOUND);
621 1.1.1.8 christos
622 1.1.1.8 christos /* Now get the actual tables */
623 1.1.1.8 christos
624 1.1.1.8 christos Status = AcpiGetTable (ACPI_SIG_UEFI, 1, &Table);
625 1.1.1.8 christos ACPI_CHECK_OK (AcpiGetTable, Status);
626 1.1.1.8 christos
627 1.1.1.8 christos Status = AcpiGetTable (ACPI_SIG_UEFI, 2, &Table);
628 1.1.1.8 christos ACPI_CHECK_OK (AcpiGetTable, Status);
629 1.1.1.8 christos
630 1.1.1.8 christos Status = AcpiGetTable (ACPI_SIG_UEFI, 3, &Table);
631 1.1.1.8 christos ACPI_CHECK_STATUS (AcpiGetTable, Status, AE_NOT_FOUND);
632 1.1.1.8 christos }
633 1.1.1.8 christos
634 1.1.1.8 christos /* Check that we can get all of the ACPI tables */
635 1.1.1.8 christos
636 1.1.1.8 christos for (i = 0; ; i++)
637 1.1.1.8 christos {
638 1.1.1.8 christos Status = AcpiGetTableByIndex (i, &Table);
639 1.1.1.8 christos if ((Status == AE_BAD_PARAMETER) || !Table)
640 1.1.1.8 christos {
641 1.1.1.8 christos break;
642 1.1.1.8 christos }
643 1.1 jruoho
644 1.1.1.8 christos ACPI_CHECK_OK (AcpiGetTableByIndex, Status);
645 1.1.1.8 christos }
646 1.1.1.2 jruoho
647 1.1.1.8 christos return (AE_OK);
648 1.1.1.8 christos }
649 1.1.1.8 christos
650 1.1.1.8 christos
651 1.1.1.8 christos /******************************************************************************
652 1.1.1.8 christos *
653 1.1.1.8 christos * FUNCTION: AeLoadTables
654 1.1.1.8 christos *
655 1.1.1.8 christos * PARAMETERS: None
656 1.1.1.8 christos *
657 1.1.1.8 christos * RETURN: Status
658 1.1.1.8 christos *
659 1.1.1.8 christos * DESCRIPTION: Load the definition block ACPI tables
660 1.1.1.8 christos *
661 1.1.1.8 christos *****************************************************************************/
662 1.1.1.8 christos
663 1.1.1.8 christos ACPI_STATUS
664 1.1.1.8 christos AeLoadTables (
665 1.1.1.8 christos void)
666 1.1.1.8 christos {
667 1.1.1.8 christos ACPI_STATUS Status;
668 1.1.1.2 jruoho
669 1.1.1.2 jruoho
670 1.1 jruoho Status = AcpiLoadTables ();
671 1.1.1.8 christos ACPI_CHECK_OK (AcpiLoadTables, Status);
672 1.1 jruoho
673 1.1 jruoho /*
674 1.1 jruoho * Test run-time control method installation. Do it twice to test code
675 1.1 jruoho * for an existing name.
676 1.1 jruoho */
677 1.1 jruoho Status = AcpiInstallMethod (MethodCode);
678 1.1.1.12 christos ACPI_CHECK_OK (AcpiInstallMethod, Status);
679 1.1 jruoho
680 1.1 jruoho Status = AcpiInstallMethod (MethodCode);
681 1.1.1.12 christos ACPI_CHECK_OK (AcpiInstallMethod, Status);
682 1.1 jruoho
683 1.1 jruoho return (AE_OK);
684 1.1 jruoho }
685 1.1 jruoho
686 1.1 jruoho
687 1.1 jruoho /******************************************************************************
688 1.1 jruoho *
689 1.1.1.5 christos * FUNCTION: AcpiOsGetRootPointer
690 1.1 jruoho *
691 1.1 jruoho * PARAMETERS: Flags - not used
692 1.1 jruoho * Address - Where the root pointer is returned
693 1.1 jruoho *
694 1.1 jruoho * RETURN: Status
695 1.1 jruoho *
696 1.1 jruoho * DESCRIPTION: Return a local RSDP, used to dynamically load tables via the
697 1.1 jruoho * standard ACPI mechanism.
698 1.1 jruoho *
699 1.1 jruoho *****************************************************************************/
700 1.1 jruoho
701 1.1 jruoho ACPI_PHYSICAL_ADDRESS
702 1.1.1.5 christos AcpiOsGetRootPointer (
703 1.1 jruoho void)
704 1.1 jruoho {
705 1.1 jruoho
706 1.1.1.6 christos return (ACPI_PTR_TO_PHYSADDR (&LocalRSDP));
707 1.1 jruoho }
708