tbxface.c revision 99679
1/******************************************************************************
2 *
3 * Module Name: tbxface - Public interfaces to the ACPI subsystem
4 *                         ACPI table oriented interfaces
5 *              $Revision: 57 $
6 *
7 *****************************************************************************/
8
9/******************************************************************************
10 *
11 * 1. Copyright Notice
12 *
13 * Some or all of this work - Copyright (c) 1999 - 2002, Intel Corp.
14 * All rights reserved.
15 *
16 * 2. License
17 *
18 * 2.1. This is your license from Intel Corp. under its intellectual property
19 * rights.  You may have additional license terms from the party that provided
20 * you this software, covering your right to use that party's intellectual
21 * property rights.
22 *
23 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
24 * copy of the source code appearing in this file ("Covered Code") an
25 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
26 * base code distributed originally by Intel ("Original Intel Code") to copy,
27 * make derivatives, distribute, use and display any portion of the Covered
28 * Code in any form, with the right to sublicense such rights; and
29 *
30 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
31 * license (with the right to sublicense), under only those claims of Intel
32 * patents that are infringed by the Original Intel Code, to make, use, sell,
33 * offer to sell, and import the Covered Code and derivative works thereof
34 * solely to the minimum extent necessary to exercise the above copyright
35 * license, and in no event shall the patent license extend to any additions
36 * to or modifications of the Original Intel Code.  No other license or right
37 * is granted directly or by implication, estoppel or otherwise;
38 *
39 * The above copyright and patent license is granted only if the following
40 * conditions are met:
41 *
42 * 3. Conditions
43 *
44 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
45 * Redistribution of source code of any substantial portion of the Covered
46 * Code or modification with rights to further distribute source must include
47 * the above Copyright Notice, the above License, this list of Conditions,
48 * and the following Disclaimer and Export Compliance provision.  In addition,
49 * Licensee must cause all Covered Code to which Licensee contributes to
50 * contain a file documenting the changes Licensee made to create that Covered
51 * Code and the date of any change.  Licensee must include in that file the
52 * documentation of any changes made by any predecessor Licensee.  Licensee
53 * must include a prominent statement that the modification is derived,
54 * directly or indirectly, from Original Intel Code.
55 *
56 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
57 * Redistribution of source code of any substantial portion of the Covered
58 * Code or modification without rights to further distribute source must
59 * include the following Disclaimer and Export Compliance provision in the
60 * documentation and/or other materials provided with distribution.  In
61 * addition, Licensee may not authorize further sublicense of source of any
62 * portion of the Covered Code, and must include terms to the effect that the
63 * license from Licensee to its licensee is limited to the intellectual
64 * property embodied in the software Licensee provides to its licensee, and
65 * not to intellectual property embodied in modifications its licensee may
66 * make.
67 *
68 * 3.3. Redistribution of Executable. Redistribution in executable form of any
69 * substantial portion of the Covered Code or modification must reproduce the
70 * above Copyright Notice, and the following Disclaimer and Export Compliance
71 * provision in the documentation and/or other materials provided with the
72 * distribution.
73 *
74 * 3.4. Intel retains all right, title, and interest in and to the Original
75 * Intel Code.
76 *
77 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
78 * Intel shall be used in advertising or otherwise to promote the sale, use or
79 * other dealings in products derived from or relating to the Covered Code
80 * without prior written authorization from Intel.
81 *
82 * 4. Disclaimer and Export Compliance
83 *
84 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
85 * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
86 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
87 * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
88 * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
89 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
90 * PARTICULAR PURPOSE.
91 *
92 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
93 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
94 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
95 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
96 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
97 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
98 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
99 * LIMITED REMEDY.
100 *
101 * 4.3. Licensee shall not export, either directly or indirectly, any of this
102 * software or system incorporating such software without first obtaining any
103 * required license or other approval from the U. S. Department of Commerce or
104 * any other agency or department of the United States Government.  In the
105 * event Licensee exports any such software from the United States or
106 * re-exports any such software from a foreign destination, Licensee shall
107 * ensure that the distribution and export/re-export of the software is in
108 * compliance with all laws, regulations, orders, or other restrictions of the
109 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
110 * any of its subsidiaries will export/re-export any technical data, process,
111 * software, or service, directly or indirectly, to any country for which the
112 * United States government or any agency thereof requires an export license,
113 * other governmental approval, or letter of assurance, without first obtaining
114 * such license, approval or letter.
115 *
116 *****************************************************************************/
117
118#define __TBXFACE_C__
119
120#include "acpi.h"
121#include "acnamesp.h"
122#include "actables.h"
123
124
125#define _COMPONENT          ACPI_TABLES
126        ACPI_MODULE_NAME    ("tbxface")
127
128
129/*******************************************************************************
130 *
131 * FUNCTION:    AcpiLoadTables
132 *
133 * PARAMETERS:  None
134 *
135 * RETURN:      Status
136 *
137 * DESCRIPTION: This function is called to load the ACPI tables from the
138 *              provided RSDT
139 *
140 ******************************************************************************/
141
142ACPI_STATUS
143AcpiLoadTables (void)
144{
145    ACPI_POINTER            RsdpAddress;
146    ACPI_STATUS             Status;
147    UINT32                  NumberOfTables = 0;
148
149
150    ACPI_FUNCTION_TRACE ("AcpiLoadTables");
151
152
153    /* Get the RSDP */
154
155    Status = AcpiOsGetRootPointer (ACPI_LOGICAL_ADDRESSING,
156                    &RsdpAddress);
157    if (ACPI_FAILURE (Status))
158    {
159        ACPI_REPORT_ERROR (("AcpiLoadTables: Could not get RSDP, %s\n",
160                        AcpiFormatException (Status)));
161        goto ErrorExit;
162    }
163
164    /* Map and validate the RSDP */
165
166    AcpiGbl_TableFlags = RsdpAddress.PointerType;
167
168    Status = AcpiTbVerifyRsdp (&RsdpAddress);
169    if (ACPI_FAILURE (Status))
170    {
171        ACPI_REPORT_ERROR (("AcpiLoadTables: RSDP Failed validation: %s\n",
172                        AcpiFormatException (Status)));
173        goto ErrorExit;
174    }
175
176    /* Get the RSDT via the RSDP */
177
178    Status = AcpiTbGetTableRsdt (&NumberOfTables);
179    if (ACPI_FAILURE (Status))
180    {
181        ACPI_REPORT_ERROR (("AcpiLoadTables: Could not load RSDT: %s\n",
182                        AcpiFormatException (Status)));
183        goto ErrorExit;
184    }
185
186    /* Now get the rest of the tables */
187
188    Status = AcpiTbGetAllTables (NumberOfTables);
189    if (ACPI_FAILURE (Status))
190    {
191        ACPI_REPORT_ERROR (("AcpiLoadTables: Error getting required tables (DSDT/FADT/FACS): %s\n",
192                        AcpiFormatException (Status)));
193        goto ErrorExit;
194    }
195
196    ACPI_DEBUG_PRINT ((ACPI_DB_OK, "ACPI Tables successfully loaded\n"));
197
198
199    /* Load the namespace from the tables */
200
201    Status = AcpiNsLoadNamespace ();
202    if (ACPI_FAILURE (Status))
203    {
204        ACPI_REPORT_ERROR (("AcpiLoadTables: Could not load namespace: %s\n",
205                        AcpiFormatException (Status)));
206        goto ErrorExit;
207    }
208
209    return_ACPI_STATUS (AE_OK);
210
211
212ErrorExit:
213    ACPI_REPORT_ERROR (("AcpiLoadTables: Could not load tables: %s\n",
214                    AcpiFormatException (Status)));
215
216    return_ACPI_STATUS (Status);
217}
218
219
220/*******************************************************************************
221 *
222 * FUNCTION:    AcpiLoadTable
223 *
224 * PARAMETERS:  TablePtr        - pointer to a buffer containing the entire
225 *                                table to be loaded
226 *
227 * RETURN:      Status
228 *
229 * DESCRIPTION: This function is called to load a table from the caller's
230 *              buffer.  The buffer must contain an entire ACPI Table including
231 *              a valid header.  The header fields will be verified, and if it
232 *              is determined that the table is invalid, the call will fail.
233 *
234 ******************************************************************************/
235
236ACPI_STATUS
237AcpiLoadTable (
238    ACPI_TABLE_HEADER       *TablePtr)
239{
240    ACPI_STATUS             Status;
241    ACPI_TABLE_DESC         TableInfo;
242    ACPI_POINTER            Address;
243
244
245    ACPI_FUNCTION_TRACE ("AcpiLoadTable");
246
247
248    if (!TablePtr)
249    {
250        return_ACPI_STATUS (AE_BAD_PARAMETER);
251    }
252
253    /* Copy the table to a local buffer */
254
255    Address.PointerType     = ACPI_LOGICAL_POINTER;
256    Address.Pointer.Logical = TablePtr;
257
258    Status = AcpiTbGetTable (&Address, &TableInfo);
259    if (ACPI_FAILURE (Status))
260    {
261        return_ACPI_STATUS (Status);
262    }
263
264    /* Install the new table into the local data structures */
265
266    Status = AcpiTbInstallTable (&TableInfo);
267    if (ACPI_FAILURE (Status))
268    {
269        /* Free table allocated by AcpiTbGetTable */
270
271        AcpiTbDeleteSingleTable (&TableInfo);
272        return_ACPI_STATUS (Status);
273    }
274
275    /* Convert the table to common format if necessary */
276
277    switch (TableInfo.Type)
278    {
279    case ACPI_TABLE_FADT:
280
281        Status = AcpiTbConvertTableFadt ();
282        break;
283
284    case ACPI_TABLE_FACS:
285
286        Status = AcpiTbBuildCommonFacs (&TableInfo);
287        break;
288
289    default:
290        /* Load table into namespace if it contains executable AML */
291
292        Status = AcpiNsLoadTable (TableInfo.InstalledDesc, AcpiGbl_RootNode);
293        break;
294    }
295
296    if (ACPI_FAILURE (Status))
297    {
298        /* Uninstall table and free the buffer */
299
300        (void) AcpiTbUninstallTable (TableInfo.InstalledDesc);
301    }
302
303    return_ACPI_STATUS (Status);
304}
305
306
307/*******************************************************************************
308 *
309 * FUNCTION:    AcpiUnloadTable
310 *
311 * PARAMETERS:  TableType     - Type of table to be unloaded
312 *
313 * RETURN:      Status
314 *
315 * DESCRIPTION: This routine is used to force the unload of a table
316 *
317 ******************************************************************************/
318
319ACPI_STATUS
320AcpiUnloadTable (
321    ACPI_TABLE_TYPE         TableType)
322{
323    ACPI_TABLE_DESC         *ListHead;
324
325
326    ACPI_FUNCTION_TRACE ("AcpiUnloadTable");
327
328
329    /* Parameter validation */
330
331    if (TableType > ACPI_TABLE_MAX)
332    {
333        return_ACPI_STATUS (AE_BAD_PARAMETER);
334    }
335
336
337    /* Find all tables of the requested type */
338
339    ListHead = &AcpiGbl_AcpiTables[TableType];
340    do
341    {
342        /*
343         * Delete all namespace entries owned by this table.  Note that these
344         * entries can appear anywhere in the namespace by virtue of the AML
345         * "Scope" operator.  Thus, we need to track ownership by an ID, not
346         * simply a position within the hierarchy
347         */
348        AcpiNsDeleteNamespaceByOwner (ListHead->TableId);
349
350        /* Delete (or unmap) the actual table */
351
352        AcpiTbDeleteAcpiTable (TableType);
353
354    } while (ListHead != &AcpiGbl_AcpiTables[TableType]);
355
356    return_ACPI_STATUS (AE_OK);
357}
358
359
360/*******************************************************************************
361 *
362 * FUNCTION:    AcpiGetTableHeader
363 *
364 * PARAMETERS:  TableType       - one of the defined table types
365 *              Instance        - the non zero instance of the table, allows
366 *                                support for multiple tables of the same type
367 *                                see AcpiGbl_AcpiTableFlag
368 *              OutTableHeader  - pointer to the ACPI_TABLE_HEADER if successful
369 *
370 * DESCRIPTION: This function is called to get an ACPI table header.  The caller
371 *              supplies an pointer to a data area sufficient to contain an ACPI
372 *              ACPI_TABLE_HEADER structure.
373 *
374 *              The header contains a length field that can be used to determine
375 *              the size of the buffer needed to contain the entire table.  This
376 *              function is not valid for the RSD PTR table since it does not
377 *              have a standard header and is fixed length.
378 *
379 ******************************************************************************/
380
381ACPI_STATUS
382AcpiGetTableHeader (
383    ACPI_TABLE_TYPE         TableType,
384    UINT32                  Instance,
385    ACPI_TABLE_HEADER       *OutTableHeader)
386{
387    ACPI_TABLE_HEADER       *TblPtr;
388    ACPI_STATUS             Status;
389
390
391    ACPI_FUNCTION_TRACE ("AcpiGetTableHeader");
392
393
394    if ((Instance == 0)                 ||
395        (TableType == ACPI_TABLE_RSDP)  ||
396        (!OutTableHeader))
397    {
398        return_ACPI_STATUS (AE_BAD_PARAMETER);
399    }
400
401    /* Check the table type and instance */
402
403    if ((TableType > ACPI_TABLE_MAX)    ||
404        (ACPI_IS_SINGLE_TABLE (AcpiGbl_AcpiTableData[TableType].Flags) &&
405         Instance > 1))
406    {
407        return_ACPI_STATUS (AE_BAD_PARAMETER);
408    }
409
410
411    /* Get a pointer to the entire table */
412
413    Status = AcpiTbGetTablePtr (TableType, Instance, &TblPtr);
414    if (ACPI_FAILURE (Status))
415    {
416        return_ACPI_STATUS (Status);
417    }
418
419    /*
420     * The function will return a NULL pointer if the table is not loaded
421     */
422    if (TblPtr == NULL)
423    {
424        return_ACPI_STATUS (AE_NOT_EXIST);
425    }
426
427    /*
428     * Copy the header to the caller's buffer
429     */
430    ACPI_MEMCPY ((void *) OutTableHeader, (void *) TblPtr,
431                sizeof (ACPI_TABLE_HEADER));
432
433    return_ACPI_STATUS (Status);
434}
435
436
437/*******************************************************************************
438 *
439 * FUNCTION:    AcpiGetTable
440 *
441 * PARAMETERS:  TableType       - one of the defined table types
442 *              Instance        - the non zero instance of the table, allows
443 *                                support for multiple tables of the same type
444 *                                see AcpiGbl_AcpiTableFlag
445 *              RetBuffer       - pointer to a structure containing a buffer to
446 *                                receive the table
447 *
448 * RETURN:      Status
449 *
450 * DESCRIPTION: This function is called to get an ACPI table.  The caller
451 *              supplies an OutBuffer large enough to contain the entire ACPI
452 *              table.  The caller should call the AcpiGetTableHeader function
453 *              first to determine the buffer size needed.  Upon completion
454 *              the OutBuffer->Length field will indicate the number of bytes
455 *              copied into the OutBuffer->BufPtr buffer.  This table will be
456 *              a complete table including the header.
457 *
458 ******************************************************************************/
459
460ACPI_STATUS
461AcpiGetTable (
462    ACPI_TABLE_TYPE         TableType,
463    UINT32                  Instance,
464    ACPI_BUFFER             *RetBuffer)
465{
466    ACPI_TABLE_HEADER       *TblPtr;
467    ACPI_STATUS             Status;
468    ACPI_SIZE               TableLength;
469
470
471    ACPI_FUNCTION_TRACE ("AcpiGetTable");
472
473
474    /* Parameter validation */
475
476    if (Instance == 0)
477    {
478        return_ACPI_STATUS (AE_BAD_PARAMETER);
479    }
480
481    Status = AcpiUtValidateBuffer (RetBuffer);
482    if (ACPI_FAILURE (Status))
483    {
484        return_ACPI_STATUS (Status);
485    }
486
487    /* Check the table type and instance */
488
489    if ((TableType > ACPI_TABLE_MAX)    ||
490        (ACPI_IS_SINGLE_TABLE (AcpiGbl_AcpiTableData[TableType].Flags) &&
491         Instance > 1))
492    {
493        return_ACPI_STATUS (AE_BAD_PARAMETER);
494    }
495
496
497    /* Get a pointer to the entire table */
498
499    Status = AcpiTbGetTablePtr (TableType, Instance, &TblPtr);
500    if (ACPI_FAILURE (Status))
501    {
502        return_ACPI_STATUS (Status);
503    }
504
505    /*
506     * AcpiTbGetTablePtr will return a NULL pointer if the
507     * table is not loaded.
508     */
509    if (TblPtr == NULL)
510    {
511        return_ACPI_STATUS (AE_NOT_EXIST);
512    }
513
514    /* Get the table length */
515
516    if (TableType == ACPI_TABLE_RSDP)
517    {
518        /*
519         *  RSD PTR is the only "table" without a header
520         */
521        TableLength = sizeof (RSDP_DESCRIPTOR);
522    }
523    else
524    {
525        TableLength = (ACPI_SIZE) TblPtr->Length;
526    }
527
528    /* Validate/Allocate/Clear caller buffer */
529
530    Status = AcpiUtInitializeBuffer (RetBuffer, TableLength);
531    if (ACPI_FAILURE (Status))
532    {
533        return_ACPI_STATUS (Status);
534    }
535
536    /* Copy the table to the buffer */
537
538    ACPI_MEMCPY ((void *) RetBuffer->Pointer, (void *) TblPtr, TableLength);
539    return_ACPI_STATUS (AE_OK);
540}
541
542
543