1 /******************************************************************************
3 * Module Name: aetables - ACPI table setup/install for acpiexec utility
5 *****************************************************************************/
7 /******************************************************************************
11 * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
12 * All rights reserved.
16 * 2.1. This is your license from Intel Corp. under its intellectual property
17 * rights. You may have additional license terms from the party that provided
18 * you this software, covering your right to use that party's intellectual
21 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22 * copy of the source code appearing in this file ("Covered Code") an
23 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24 * base code distributed originally by Intel ("Original Intel Code") to copy,
25 * make derivatives, distribute, use and display any portion of the Covered
26 * Code in any form, with the right to sublicense such rights; and
28 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29 * license (with the right to sublicense), under only those claims of Intel
30 * patents that are infringed by the Original Intel Code, to make, use, sell,
31 * offer to sell, and import the Covered Code and derivative works thereof
32 * solely to the minimum extent necessary to exercise the above copyright
33 * license, and in no event shall the patent license extend to any additions
34 * to or modifications of the Original Intel Code. No other license or right
35 * is granted directly or by implication, estoppel or otherwise;
37 * The above copyright and patent license is granted only if the following
42 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43 * Redistribution of source code of any substantial portion of the Covered
44 * Code or modification with rights to further distribute source must include
45 * the above Copyright Notice, the above License, this list of Conditions,
46 * and the following Disclaimer and Export Compliance provision. In addition,
47 * Licensee must cause all Covered Code to which Licensee contributes to
48 * contain a file documenting the changes Licensee made to create that Covered
49 * Code and the date of any change. Licensee must include in that file the
50 * documentation of any changes made by any predecessor Licensee. Licensee
51 * must include a prominent statement that the modification is derived,
52 * directly or indirectly, from Original Intel Code.
54 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55 * Redistribution of source code of any substantial portion of the Covered
56 * Code or modification without rights to further distribute source must
57 * include the following Disclaimer and Export Compliance provision in the
58 * documentation and/or other materials provided with distribution. In
59 * addition, Licensee may not authorize further sublicense of source of any
60 * portion of the Covered Code, and must include terms to the effect that the
61 * license from Licensee to its licensee is limited to the intellectual
62 * property embodied in the software Licensee provides to its licensee, and
63 * not to intellectual property embodied in modifications its licensee may
66 * 3.3. Redistribution of Executable. Redistribution in executable form of any
67 * substantial portion of the Covered Code or modification must reproduce the
68 * above Copyright Notice, and the following Disclaimer and Export Compliance
69 * provision in the documentation and/or other materials provided with the
72 * 3.4. Intel retains all right, title, and interest in and to the Original
75 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76 * Intel shall be used in advertising or otherwise to promote the sale, use or
77 * other dealings in products derived from or relating to the Covered Code
78 * without prior written authorization from Intel.
80 * 4. Disclaimer and Export Compliance
82 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
90 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
99 * 4.3. Licensee shall not export, either directly or indirectly, any of this
100 * software or system incorporating such software without first obtaining any
101 * required license or other approval from the U. S. Department of Commerce or
102 * any other agency or department of the United States Government. In the
103 * event Licensee exports any such software from the United States or
104 * re-exports any such software from a foreign destination, Licensee shall
105 * ensure that the distribution and export/re-export of the software is in
106 * compliance with all laws, regulations, orders, or other restrictions of the
107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108 * any of its subsidiaries will export/re-export any technical data, process,
109 * software, or service, directly or indirectly, to any country for which the
110 * United States government or any agency thereof requires an export license,
111 * other governmental approval, or letter of assurance, without first obtaining
112 * such license, approval or letter.
114 *****************************************************************************/
116 #include "aecommon.h"
117 #include "aetables.h"
119 #define _COMPONENT ACPI_TOOLS
120 ACPI_MODULE_NAME ("aetables")
122 /* Local prototypes */
126 ACPI_TABLE_HEADER *ExistingTable,
127 ACPI_TABLE_HEADER **NewTable);
129 ACPI_PHYSICAL_ADDRESS
130 AeLocalGetRootPointer (
133 /* User table (DSDT) */
135 static ACPI_TABLE_HEADER *DsdtToInstallOverride;
137 /* Non-AML tables that are constructed locally and installed */
139 static ACPI_TABLE_RSDP LocalRSDP;
140 static ACPI_TABLE_FACS LocalFACS;
141 static ACPI_TABLE_HEADER LocalTEST;
142 static ACPI_TABLE_HEADER LocalBADTABLE;
145 * We need a local FADT so that the hardware subcomponent will function,
146 * even though the underlying OSD HW access functions don't do anything.
148 static ACPI_TABLE_FADT LocalFADT;
151 * Use XSDT so that both 32- and 64-bit versions of this utility will
152 * function automatically.
154 static ACPI_TABLE_XSDT *LocalXSDT;
156 #define BASE_XSDT_TABLES 8
157 #define BASE_XSDT_SIZE (sizeof (ACPI_TABLE_XSDT) + \
158 ((BASE_XSDT_TABLES -1) * sizeof (UINT64)))
160 #define ACPI_MAX_INIT_TABLES (32)
161 static ACPI_TABLE_DESC Tables[ACPI_MAX_INIT_TABLES];
164 /******************************************************************************
166 * FUNCTION: AeTableOverride
168 * DESCRIPTION: Local implementation of AcpiOsTableOverride.
169 * Exercise the override mechanism
171 *****************************************************************************/
175 ACPI_TABLE_HEADER *ExistingTable,
176 ACPI_TABLE_HEADER **NewTable)
179 /* This code exercises the table override mechanism in the core */
181 if (ACPI_COMPARE_NAME (ExistingTable->Signature, ACPI_SIG_DSDT))
183 *NewTable = DsdtToInstallOverride;
186 /* This code tests override of dynamically loaded tables */
188 else if (ACPI_COMPARE_NAME (ExistingTable->Signature, "OEM9"))
190 *NewTable = ACPI_CAST_PTR (ACPI_TABLE_HEADER, Ssdt3Code);
195 /******************************************************************************
197 * FUNCTION: AeBuildLocalTables
199 * PARAMETERS: TableCount - Number of tables on the command line
200 * TableList - List of actual tables from files
204 * DESCRIPTION: Build a complete ACPI table chain, with a local RSDP, XSDT,
205 * FADT, and several other test tables.
207 *****************************************************************************/
212 AE_TABLE_DESC *TableList)
214 ACPI_PHYSICAL_ADDRESS DsdtAddress = 0;
216 AE_TABLE_DESC *NextTable;
218 ACPI_TABLE_FADT *ExternalFadt = NULL;
222 * Update the table count. For DSDT, it is not put into the XSDT. For
223 * FADT, this is already accounted for since we usually install a
226 NextTable = TableList;
229 if (ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_DSDT) ||
230 ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_FADT))
234 NextTable = NextTable->Next;
237 XsdtSize = BASE_XSDT_SIZE + (TableCount * sizeof (UINT64));
241 LocalXSDT = AcpiOsAllocate (XsdtSize);
244 return (AE_NO_MEMORY);
247 ACPI_MEMSET (LocalXSDT, 0, XsdtSize);
248 ACPI_MOVE_NAME (LocalXSDT->Header.Signature, ACPI_SIG_XSDT);
249 LocalXSDT->Header.Length = XsdtSize;
250 LocalXSDT->Header.Revision = 1;
252 LocalXSDT->TableOffsetEntry[0] = ACPI_PTR_TO_PHYSADDR (&LocalTEST);
253 LocalXSDT->TableOffsetEntry[1] = ACPI_PTR_TO_PHYSADDR (&LocalBADTABLE);
254 LocalXSDT->TableOffsetEntry[2] = ACPI_PTR_TO_PHYSADDR (&LocalFADT);
256 /* Install two SSDTs to test multiple table support */
258 LocalXSDT->TableOffsetEntry[3] = ACPI_PTR_TO_PHYSADDR (&Ssdt1Code);
259 LocalXSDT->TableOffsetEntry[4] = ACPI_PTR_TO_PHYSADDR (&Ssdt2Code);
261 /* Install the OEM1 table to test LoadTable */
263 LocalXSDT->TableOffsetEntry[5] = ACPI_PTR_TO_PHYSADDR (&Oem1Code);
265 /* Install the OEMx table to test LoadTable */
267 LocalXSDT->TableOffsetEntry[6] = ACPI_PTR_TO_PHYSADDR (&OemxCode);
269 /* Install the ECDT table to test _REG */
271 LocalXSDT->TableOffsetEntry[7] = ACPI_PTR_TO_PHYSADDR (&EcdtCode);
274 * Install the user tables. The DSDT must be installed in the FADT.
275 * All other tables are installed directly into the XSDT.
277 NextIndex = BASE_XSDT_TABLES;
278 NextTable = TableList;
282 * Incoming DSDT or FADT are special cases. All other tables are
283 * just immediately installed into the XSDT.
285 if (ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_DSDT))
289 printf ("Already found a DSDT, only one allowed\n");
290 return (AE_ALREADY_EXISTS);
293 /* The incoming user table is a DSDT */
295 DsdtAddress = ACPI_PTR_TO_PHYSADDR (&DsdtCode);
296 DsdtToInstallOverride = NextTable->Table;
298 else if (ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_FADT))
300 ExternalFadt = ACPI_CAST_PTR (ACPI_TABLE_FADT, NextTable->Table);
301 LocalXSDT->TableOffsetEntry[2] = ACPI_PTR_TO_PHYSADDR (NextTable->Table);
305 /* Install the table in the XSDT */
307 LocalXSDT->TableOffsetEntry[NextIndex] = ACPI_PTR_TO_PHYSADDR (NextTable->Table);
311 NextTable = NextTable->Next;
316 ACPI_MEMSET (&LocalRSDP, 0, sizeof (ACPI_TABLE_RSDP));
317 ACPI_MEMCPY (LocalRSDP.Signature, ACPI_SIG_RSDP, 8);
318 ACPI_MEMCPY (LocalRSDP.OemId, "I_TEST", 6);
319 LocalRSDP.Revision = 2;
320 LocalRSDP.XsdtPhysicalAddress = ACPI_PTR_TO_PHYSADDR (LocalXSDT);
321 LocalRSDP.Length = sizeof (ACPI_TABLE_XSDT);
323 /* Set checksums for both XSDT and RSDP */
325 LocalXSDT->Header.Checksum = (UINT8) -AcpiTbChecksum (
326 (void *) LocalXSDT, LocalXSDT->Header.Length);
327 LocalRSDP.Checksum = (UINT8) -AcpiTbChecksum (
328 (void *) &LocalRSDP, ACPI_RSDP_CHECKSUM_LENGTH);
332 /* Use the local DSDT because incoming table(s) are all SSDT(s) */
334 DsdtAddress = ACPI_PTR_TO_PHYSADDR (LocalDsdtCode);
335 DsdtToInstallOverride = ACPI_CAST_PTR (ACPI_TABLE_HEADER, LocalDsdtCode);
341 * Use the external FADT, but we must update the DSDT/FACS addresses
342 * as well as the checksum
344 ExternalFadt->Dsdt = DsdtAddress;
345 if (!AcpiGbl_ReducedHardware)
347 ExternalFadt->Facs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
350 if (ExternalFadt->Header.Length > ACPI_PTR_DIFF (&ExternalFadt->XDsdt, ExternalFadt))
352 ExternalFadt->XDsdt = DsdtAddress;
354 if (!AcpiGbl_ReducedHardware)
356 ExternalFadt->XFacs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
360 /* Complete the FADT with the checksum */
362 ExternalFadt->Header.Checksum = 0;
363 ExternalFadt->Header.Checksum = (UINT8) -AcpiTbChecksum (
364 (void *) ExternalFadt, ExternalFadt->Header.Length);
366 else if (AcpiGbl_UseHwReducedFadt)
368 ACPI_MEMCPY (&LocalFADT, HwReducedFadtCode, sizeof (ACPI_TABLE_FADT));
369 LocalFADT.Dsdt = DsdtAddress;
370 LocalFADT.XDsdt = DsdtAddress;
372 LocalFADT.Header.Checksum = 0;
373 LocalFADT.Header.Checksum = (UINT8) -AcpiTbChecksum (
374 (void *) &LocalFADT, LocalFADT.Header.Length);
379 * Build a local FADT so we can test the hardware/event init
381 ACPI_MEMSET (&LocalFADT, 0, sizeof (ACPI_TABLE_FADT));
382 ACPI_MOVE_NAME (LocalFADT.Header.Signature, ACPI_SIG_FADT);
384 /* Setup FADT header and DSDT/FACS addresses */
389 LocalFADT.XDsdt = DsdtAddress;
390 LocalFADT.XFacs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
392 LocalFADT.Header.Revision = 3;
393 LocalFADT.Header.Length = sizeof (ACPI_TABLE_FADT);
395 /* Miscellaneous FADT fields */
397 LocalFADT.Gpe0BlockLength = 16;
398 LocalFADT.Gpe0Block = 0x00001234;
400 LocalFADT.Gpe1BlockLength = 6;
401 LocalFADT.Gpe1Block = 0x00005678;
402 LocalFADT.Gpe1Base = 96;
404 LocalFADT.Pm1EventLength = 4;
405 LocalFADT.Pm1aEventBlock = 0x00001aaa;
406 LocalFADT.Pm1bEventBlock = 0x00001bbb;
408 LocalFADT.Pm1ControlLength = 2;
409 LocalFADT.Pm1aControlBlock = 0xB0;
411 LocalFADT.PmTimerLength = 4;
412 LocalFADT.PmTimerBlock = 0xA0;
414 LocalFADT.Pm2ControlBlock = 0xC0;
415 LocalFADT.Pm2ControlLength = 1;
417 /* Setup one example X-64 field */
419 LocalFADT.XPm1bEventBlock.SpaceId = ACPI_ADR_SPACE_SYSTEM_IO;
420 LocalFADT.XPm1bEventBlock.Address = LocalFADT.Pm1bEventBlock;
421 LocalFADT.XPm1bEventBlock.BitWidth = (UINT8) ACPI_MUL_8 (LocalFADT.Pm1EventLength);
423 /* Complete the FADT with the checksum */
425 LocalFADT.Header.Checksum = 0;
426 LocalFADT.Header.Checksum = (UINT8) -AcpiTbChecksum (
427 (void *) &LocalFADT, LocalFADT.Header.Length);
432 ACPI_MEMSET (&LocalFACS, 0, sizeof (ACPI_TABLE_FACS));
433 ACPI_MOVE_NAME (LocalFACS.Signature, ACPI_SIG_FACS);
435 LocalFACS.Length = sizeof (ACPI_TABLE_FACS);
436 LocalFACS.GlobalLock = 0x11AA0011;
439 * Build a fake table [TEST] so that we make sure that the
440 * ACPICA core ignores it
442 ACPI_MEMSET (&LocalTEST, 0, sizeof (ACPI_TABLE_HEADER));
443 ACPI_MOVE_NAME (LocalTEST.Signature, "TEST");
445 LocalTEST.Revision = 1;
446 LocalTEST.Length = sizeof (ACPI_TABLE_HEADER);
447 LocalTEST.Checksum = (UINT8) -AcpiTbChecksum (
448 (void *) &LocalTEST, LocalTEST.Length);
451 * Build a fake table with a bad signature [BAD!] so that we make
452 * sure that the ACPICA core ignores it
454 ACPI_MEMSET (&LocalBADTABLE, 0, sizeof (ACPI_TABLE_HEADER));
455 ACPI_MOVE_NAME (LocalBADTABLE.Signature, "BAD!");
457 LocalBADTABLE.Revision = 1;
458 LocalBADTABLE.Length = sizeof (ACPI_TABLE_HEADER);
459 LocalBADTABLE.Checksum = (UINT8) -AcpiTbChecksum (
460 (void *) &LocalBADTABLE, LocalBADTABLE.Length);
466 /******************************************************************************
468 * FUNCTION: AeInstallTables
474 * DESCRIPTION: Install the various ACPI tables
476 *****************************************************************************/
485 Status = AcpiInitializeTables (Tables, ACPI_MAX_INIT_TABLES, TRUE);
486 AE_CHECK_OK (AcpiInitializeTables, Status);
488 Status = AcpiReallocateRootTable ();
489 AE_CHECK_OK (AcpiReallocateRootTable, Status);
491 Status = AcpiLoadTables ();
492 AE_CHECK_OK (AcpiLoadTables, Status);
495 * Test run-time control method installation. Do it twice to test code
496 * for an existing name.
498 Status = AcpiInstallMethod (MethodCode);
499 if (ACPI_FAILURE (Status))
501 AcpiOsPrintf ("%s, Could not install method\n",
502 AcpiFormatException (Status));
505 Status = AcpiInstallMethod (MethodCode);
506 if (ACPI_FAILURE (Status))
508 AcpiOsPrintf ("%s, Could not install method\n",
509 AcpiFormatException (Status));
516 /******************************************************************************
518 * FUNCTION: AeLocalGetRootPointer
520 * PARAMETERS: Flags - not used
521 * Address - Where the root pointer is returned
525 * DESCRIPTION: Return a local RSDP, used to dynamically load tables via the
526 * standard ACPI mechanism.
528 *****************************************************************************/
530 ACPI_PHYSICAL_ADDRESS
531 AeLocalGetRootPointer (
535 return ((ACPI_PHYSICAL_ADDRESS) &LocalRSDP);