]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/acpica/lib-acpi/src/acpica/tools/acpiexec/aetables.c
Some minor fixes.
[l4.git] / l4 / pkg / acpica / lib-acpi / src / acpica / tools / acpiexec / aetables.c
1 /******************************************************************************
2  *
3  * Module Name: aetables - ACPI table setup/install for acpiexec utility
4  *
5  *****************************************************************************/
6
7 /******************************************************************************
8  *
9  * 1. Copyright Notice
10  *
11  * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
12  * All rights reserved.
13  *
14  * 2. License
15  *
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
19  * property rights.
20  *
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
27  *
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;
36  *
37  * The above copyright and patent license is granted only if the following
38  * conditions are met:
39  *
40  * 3. Conditions
41  *
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.
53  *
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
64  * make.
65  *
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
70  * distribution.
71  *
72  * 3.4. Intel retains all right, title, and interest in and to the Original
73  * Intel Code.
74  *
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.
79  *
80  * 4. Disclaimer and Export Compliance
81  *
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
88  * PARTICULAR PURPOSE.
89  *
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
97  * LIMITED REMEDY.
98  *
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.
113  *
114  *****************************************************************************/
115
116 #include "aecommon.h"
117 #include "aetables.h"
118
119 #define _COMPONENT          ACPI_TOOLS
120         ACPI_MODULE_NAME    ("aetables")
121
122 /* Local prototypes */
123
124 void
125 AeTableOverride (
126     ACPI_TABLE_HEADER       *ExistingTable,
127     ACPI_TABLE_HEADER       **NewTable);
128
129 ACPI_PHYSICAL_ADDRESS
130 AeLocalGetRootPointer (
131     void);
132
133 /* User table (DSDT) */
134
135 static ACPI_TABLE_HEADER        *DsdtToInstallOverride;
136
137 /* Non-AML tables that are constructed locally and installed */
138
139 static ACPI_TABLE_RSDP          LocalRSDP;
140 static ACPI_TABLE_FACS          LocalFACS;
141 static ACPI_TABLE_HEADER        LocalTEST;
142 static ACPI_TABLE_HEADER        LocalBADTABLE;
143
144 /*
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.
147  */
148 static ACPI_TABLE_FADT          LocalFADT;
149
150 /*
151  * Use XSDT so that both 32- and 64-bit versions of this utility will
152  * function automatically.
153  */
154 static ACPI_TABLE_XSDT          *LocalXSDT;
155
156 #define BASE_XSDT_TABLES        8
157 #define BASE_XSDT_SIZE          (sizeof (ACPI_TABLE_XSDT) + \
158                                     ((BASE_XSDT_TABLES -1) * sizeof (UINT64)))
159
160 #define ACPI_MAX_INIT_TABLES    (32)
161 static ACPI_TABLE_DESC          Tables[ACPI_MAX_INIT_TABLES];
162
163
164 /******************************************************************************
165  *
166  * FUNCTION:    AeTableOverride
167  *
168  * DESCRIPTION: Local implementation of AcpiOsTableOverride.
169  *              Exercise the override mechanism
170  *
171  *****************************************************************************/
172
173 void
174 AeTableOverride (
175     ACPI_TABLE_HEADER       *ExistingTable,
176     ACPI_TABLE_HEADER       **NewTable)
177 {
178
179     /* This code exercises the table override mechanism in the core */
180
181     if (ACPI_COMPARE_NAME (ExistingTable->Signature, ACPI_SIG_DSDT))
182     {
183         *NewTable = DsdtToInstallOverride;
184     }
185
186     /* This code tests override of dynamically loaded tables */
187
188     else if (ACPI_COMPARE_NAME (ExistingTable->Signature, "OEM9"))
189     {
190         *NewTable = ACPI_CAST_PTR (ACPI_TABLE_HEADER, Ssdt3Code);
191     }
192 }
193
194
195 /******************************************************************************
196  *
197  * FUNCTION:    AeBuildLocalTables
198  *
199  * PARAMETERS:  TableCount      - Number of tables on the command line
200  *              TableList       - List of actual tables from files
201  *
202  * RETURN:      Status
203  *
204  * DESCRIPTION: Build a complete ACPI table chain, with a local RSDP, XSDT,
205  *              FADT, and several other test tables.
206  *
207  *****************************************************************************/
208
209 ACPI_STATUS
210 AeBuildLocalTables (
211     UINT32                  TableCount,
212     AE_TABLE_DESC           *TableList)
213 {
214     ACPI_PHYSICAL_ADDRESS   DsdtAddress = 0;
215     UINT32                  XsdtSize;
216     AE_TABLE_DESC           *NextTable;
217     UINT32                  NextIndex;
218     ACPI_TABLE_FADT         *ExternalFadt = NULL;
219
220
221     /*
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
224      * local FADT.
225      */
226     NextTable = TableList;
227     while (NextTable)
228     {
229         if (ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_DSDT) ||
230             ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_FADT))
231         {
232             TableCount--;
233         }
234         NextTable = NextTable->Next;
235     }
236
237     XsdtSize = BASE_XSDT_SIZE + (TableCount * sizeof (UINT64));
238
239     /* Build an XSDT */
240
241     LocalXSDT = AcpiOsAllocate (XsdtSize);
242     if (!LocalXSDT)
243     {
244         return (AE_NO_MEMORY);
245     }
246
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;
251
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);
255
256     /* Install two SSDTs to test multiple table support */
257
258     LocalXSDT->TableOffsetEntry[3] = ACPI_PTR_TO_PHYSADDR (&Ssdt1Code);
259     LocalXSDT->TableOffsetEntry[4] = ACPI_PTR_TO_PHYSADDR (&Ssdt2Code);
260
261     /* Install the OEM1 table to test LoadTable */
262
263     LocalXSDT->TableOffsetEntry[5] = ACPI_PTR_TO_PHYSADDR (&Oem1Code);
264
265     /* Install the OEMx table to test LoadTable */
266
267     LocalXSDT->TableOffsetEntry[6] = ACPI_PTR_TO_PHYSADDR (&OemxCode);
268
269      /* Install the ECDT table to test _REG */
270
271     LocalXSDT->TableOffsetEntry[7] = ACPI_PTR_TO_PHYSADDR (&EcdtCode);
272
273    /*
274      * Install the user tables. The DSDT must be installed in the FADT.
275      * All other tables are installed directly into the XSDT.
276      */
277     NextIndex = BASE_XSDT_TABLES;
278     NextTable = TableList;
279     while (NextTable)
280     {
281         /*
282          * Incoming DSDT or FADT are special cases. All other tables are
283          * just immediately installed into the XSDT.
284          */
285         if (ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_DSDT))
286         {
287             if (DsdtAddress)
288             {
289                 printf ("Already found a DSDT, only one allowed\n");
290                 return (AE_ALREADY_EXISTS);
291             }
292
293             /* The incoming user table is a DSDT */
294
295             DsdtAddress = ACPI_PTR_TO_PHYSADDR (&DsdtCode);
296             DsdtToInstallOverride = NextTable->Table;
297         }
298         else if (ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_FADT))
299         {
300             ExternalFadt = ACPI_CAST_PTR (ACPI_TABLE_FADT, NextTable->Table);
301             LocalXSDT->TableOffsetEntry[2] = ACPI_PTR_TO_PHYSADDR (NextTable->Table);
302         }
303         else
304         {
305             /* Install the table in the XSDT */
306
307             LocalXSDT->TableOffsetEntry[NextIndex] = ACPI_PTR_TO_PHYSADDR (NextTable->Table);
308             NextIndex++;
309         }
310
311         NextTable = NextTable->Next;
312     }
313
314     /* Build an RSDP */
315
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);
322
323     /* Set checksums for both XSDT and RSDP */
324
325     LocalXSDT->Header.Checksum = (UINT8) -AcpiTbChecksum (
326         (void *) LocalXSDT, LocalXSDT->Header.Length);
327     LocalRSDP.Checksum = (UINT8) -AcpiTbChecksum (
328         (void *) &LocalRSDP, ACPI_RSDP_CHECKSUM_LENGTH);
329
330     if (!DsdtAddress)
331     {
332         /* Use the local DSDT because incoming table(s) are all SSDT(s) */
333
334         DsdtAddress = ACPI_PTR_TO_PHYSADDR (LocalDsdtCode);
335         DsdtToInstallOverride = ACPI_CAST_PTR (ACPI_TABLE_HEADER, LocalDsdtCode);
336     }
337
338     if (ExternalFadt)
339     {
340         /*
341          * Use the external FADT, but we must update the DSDT/FACS addresses
342          * as well as the checksum
343          */
344         ExternalFadt->Dsdt = DsdtAddress;
345         if (!AcpiGbl_ReducedHardware)
346         {
347             ExternalFadt->Facs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
348         }
349
350         if (ExternalFadt->Header.Length > ACPI_PTR_DIFF (&ExternalFadt->XDsdt, ExternalFadt))
351         {
352             ExternalFadt->XDsdt = DsdtAddress;
353
354             if (!AcpiGbl_ReducedHardware)
355             {
356                 ExternalFadt->XFacs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
357             }
358         }
359
360         /* Complete the FADT with the checksum */
361
362         ExternalFadt->Header.Checksum = 0;
363         ExternalFadt->Header.Checksum = (UINT8) -AcpiTbChecksum (
364             (void *) ExternalFadt, ExternalFadt->Header.Length);
365     }
366     else if (AcpiGbl_UseHwReducedFadt)
367     {
368         ACPI_MEMCPY (&LocalFADT, HwReducedFadtCode, sizeof (ACPI_TABLE_FADT));
369         LocalFADT.Dsdt = DsdtAddress;
370         LocalFADT.XDsdt = DsdtAddress;
371
372         LocalFADT.Header.Checksum = 0;
373         LocalFADT.Header.Checksum = (UINT8) -AcpiTbChecksum (
374             (void *) &LocalFADT, LocalFADT.Header.Length);
375     }
376     else
377     {
378         /*
379          * Build a local FADT so we can test the hardware/event init
380          */
381         ACPI_MEMSET (&LocalFADT, 0, sizeof (ACPI_TABLE_FADT));
382         ACPI_MOVE_NAME (LocalFADT.Header.Signature, ACPI_SIG_FADT);
383
384         /* Setup FADT header and DSDT/FACS addresses */
385
386         LocalFADT.Dsdt = 0;
387         LocalFADT.Facs = 0;
388
389         LocalFADT.XDsdt = DsdtAddress;
390         LocalFADT.XFacs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
391
392         LocalFADT.Header.Revision = 3;
393         LocalFADT.Header.Length = sizeof (ACPI_TABLE_FADT);
394
395         /* Miscellaneous FADT fields */
396
397         LocalFADT.Gpe0BlockLength = 16;
398         LocalFADT.Gpe0Block = 0x00001234;
399
400         LocalFADT.Gpe1BlockLength = 6;
401         LocalFADT.Gpe1Block = 0x00005678;
402         LocalFADT.Gpe1Base = 96;
403
404         LocalFADT.Pm1EventLength = 4;
405         LocalFADT.Pm1aEventBlock = 0x00001aaa;
406         LocalFADT.Pm1bEventBlock = 0x00001bbb;
407
408         LocalFADT.Pm1ControlLength = 2;
409         LocalFADT.Pm1aControlBlock = 0xB0;
410
411         LocalFADT.PmTimerLength = 4;
412         LocalFADT.PmTimerBlock = 0xA0;
413
414         LocalFADT.Pm2ControlBlock = 0xC0;
415         LocalFADT.Pm2ControlLength = 1;
416
417         /* Setup one example X-64 field */
418
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);
422
423         /* Complete the FADT with the checksum */
424
425         LocalFADT.Header.Checksum = 0;
426         LocalFADT.Header.Checksum = (UINT8) -AcpiTbChecksum (
427             (void *) &LocalFADT, LocalFADT.Header.Length);
428     }
429
430     /* Build a FACS */
431
432     ACPI_MEMSET (&LocalFACS, 0, sizeof (ACPI_TABLE_FACS));
433     ACPI_MOVE_NAME (LocalFACS.Signature, ACPI_SIG_FACS);
434
435     LocalFACS.Length = sizeof (ACPI_TABLE_FACS);
436     LocalFACS.GlobalLock = 0x11AA0011;
437
438     /*
439      * Build a fake table [TEST] so that we make sure that the
440      * ACPICA core ignores it
441      */
442     ACPI_MEMSET (&LocalTEST, 0, sizeof (ACPI_TABLE_HEADER));
443     ACPI_MOVE_NAME (LocalTEST.Signature, "TEST");
444
445     LocalTEST.Revision = 1;
446     LocalTEST.Length = sizeof (ACPI_TABLE_HEADER);
447     LocalTEST.Checksum = (UINT8) -AcpiTbChecksum (
448         (void *) &LocalTEST, LocalTEST.Length);
449
450     /*
451      * Build a fake table with a bad signature [BAD!] so that we make
452      * sure that the ACPICA core ignores it
453      */
454     ACPI_MEMSET (&LocalBADTABLE, 0, sizeof (ACPI_TABLE_HEADER));
455     ACPI_MOVE_NAME (LocalBADTABLE.Signature, "BAD!");
456
457     LocalBADTABLE.Revision = 1;
458     LocalBADTABLE.Length = sizeof (ACPI_TABLE_HEADER);
459     LocalBADTABLE.Checksum = (UINT8) -AcpiTbChecksum (
460         (void *) &LocalBADTABLE, LocalBADTABLE.Length);
461
462     return (AE_OK);
463 }
464
465
466 /******************************************************************************
467  *
468  * FUNCTION:    AeInstallTables
469  *
470  * PARAMETERS:  None
471  *
472  * RETURN:      Status
473  *
474  * DESCRIPTION: Install the various ACPI tables
475  *
476  *****************************************************************************/
477
478 ACPI_STATUS
479 AeInstallTables (
480     void)
481 {
482     ACPI_STATUS             Status;
483
484
485     Status = AcpiInitializeTables (Tables, ACPI_MAX_INIT_TABLES, TRUE);
486     AE_CHECK_OK (AcpiInitializeTables, Status);
487
488     Status = AcpiReallocateRootTable ();
489     AE_CHECK_OK (AcpiReallocateRootTable, Status);
490
491     Status = AcpiLoadTables ();
492     AE_CHECK_OK (AcpiLoadTables, Status);
493
494     /*
495      * Test run-time control method installation. Do it twice to test code
496      * for an existing name.
497      */
498     Status = AcpiInstallMethod (MethodCode);
499     if (ACPI_FAILURE (Status))
500     {
501         AcpiOsPrintf ("%s, Could not install method\n",
502             AcpiFormatException (Status));
503     }
504
505     Status = AcpiInstallMethod (MethodCode);
506     if (ACPI_FAILURE (Status))
507     {
508         AcpiOsPrintf ("%s, Could not install method\n",
509             AcpiFormatException (Status));
510     }
511
512     return (AE_OK);
513 }
514
515
516 /******************************************************************************
517  *
518  * FUNCTION:    AeLocalGetRootPointer
519  *
520  * PARAMETERS:  Flags       - not used
521  *              Address     - Where the root pointer is returned
522  *
523  * RETURN:      Status
524  *
525  * DESCRIPTION: Return a local RSDP, used to dynamically load tables via the
526  *              standard ACPI mechanism.
527  *
528  *****************************************************************************/
529
530 ACPI_PHYSICAL_ADDRESS
531 AeLocalGetRootPointer (
532     void)
533 {
534
535     return ((ACPI_PHYSICAL_ADDRESS) &LocalRSDP);
536 }