tbxface.c revision 80062
1/******************************************************************************
2 *
3 * Module Name: tbxface - Public interfaces to the ACPI subsystem
4 *                         ACPI table oriented interfaces
5 *              $Revision: 41 $
6 *
7 *****************************************************************************/
8
9/******************************************************************************
10 *
11 * 1. Copyright Notice
12 *
13 * Some or all of this work - Copyright (c) 1999, 2000, 2001, 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 "acinterp.h"
123#include "actables.h"
124
125
126#define _COMPONENT          ACPI_TABLES
127        MODULE_NAME         ("tbxface")
128
129
130/*******************************************************************************
131 *
132 * FUNCTION:    AcpiLoadTables
133 *
134 * PARAMETERS:  None
135 *
136 * RETURN:      Status
137 *
138 * DESCRIPTION: This function is called to load the ACPI tables from the
139 *              provided RSDT
140 *
141 ******************************************************************************/
142
143ACPI_STATUS
144AcpiLoadTables (void)
145{
146    ACPI_PHYSICAL_ADDRESS   RsdpPhysicalAddress;
147    ACPI_STATUS             Status;
148    UINT32                  NumberOfTables = 0;
149
150
151    FUNCTION_TRACE ("AcpiLoadTables");
152
153
154    /* Ensure that ACPI has been initialized */
155
156    ACPI_IS_INITIALIZATION_COMPLETE (Status);
157    if (ACPI_FAILURE (Status))
158    {
159        return_ACPI_STATUS (Status);
160    }
161
162
163    /* Get the RSDP */
164
165    Status = AcpiOsGetRootPointer (ACPI_LOGICAL_ADDRESSING,
166                    &RsdpPhysicalAddress);
167    if (ACPI_FAILURE (Status))
168    {
169        REPORT_ERROR (("AcpiLoadTables: Could not get RSDP, %s\n",
170                        AcpiFormatException (Status)));
171        goto ErrorExit;
172    }
173
174    /* Map and validate the RSDP */
175
176    Status = AcpiTbVerifyRsdp (RsdpPhysicalAddress);
177    if (ACPI_FAILURE (Status))
178    {
179        REPORT_ERROR (("AcpiLoadTables: RSDP Failed validation: %s\n",
180                        AcpiFormatException (Status)));
181        goto ErrorExit;
182    }
183
184    /* Get the RSDT via the RSDP */
185
186    Status = AcpiTbGetTableRsdt (&NumberOfTables);
187    if (ACPI_FAILURE (Status))
188    {
189        REPORT_ERROR (("AcpiLoadTables: Could not load RSDT: %s\n",
190                        AcpiFormatException (Status)));
191        goto ErrorExit;
192    }
193
194    /* Now get the rest of the tables */
195
196    Status = AcpiTbGetAllTables (NumberOfTables, NULL);
197    if (ACPI_FAILURE (Status))
198    {
199        REPORT_ERROR (("AcpiLoadTables: Error getting required tables (DSDT/FADT/FACS): %s\n",
200                        AcpiFormatException (Status)));
201        goto ErrorExit;
202    }
203
204    DEBUG_PRINTP (ACPI_OK, ("ACPI Tables successfully loaded\n"));
205
206
207    /* Load the namespace from the tables */
208
209    Status = AcpiNsLoadNamespace ();
210    if (ACPI_FAILURE (Status))
211    {
212        REPORT_ERROR (("AcpiLoadTables: Could not load namespace: %s\n",
213                        AcpiFormatException (Status)));
214        goto ErrorExit;
215    }
216
217    return_ACPI_STATUS (AE_OK);
218
219
220ErrorExit:
221    REPORT_ERROR (("AcpiLoadTables: Could not load tables: %s\n",
222                    AcpiFormatException (Status)));
223
224    return_ACPI_STATUS (Status);
225}
226
227
228/*******************************************************************************
229 *
230 * FUNCTION:    AcpiLoadTable
231 *
232 * PARAMETERS:  TablePtr        - pointer to a buffer containing the entire
233 *                                table to be loaded
234 *
235 * RETURN:      Status
236 *
237 * DESCRIPTION: This function is called to load a table from the caller's
238 *              buffer.  The buffer must contain an entire ACPI Table including
239 *              a valid header.  The header fields will be verified, and if it
240 *              is determined that the table is invalid, the call will fail.
241 *
242 ******************************************************************************/
243
244ACPI_STATUS
245AcpiLoadTable (
246    ACPI_TABLE_HEADER       *TablePtr)
247{
248    ACPI_STATUS             Status;
249    ACPI_TABLE_DESC         TableInfo;
250
251
252    FUNCTION_TRACE ("AcpiLoadTable");
253
254
255    /* Ensure that ACPI has been initialized */
256
257    ACPI_IS_INITIALIZATION_COMPLETE (Status);
258    if (ACPI_FAILURE (Status))
259    {
260        return_ACPI_STATUS (Status);
261    }
262
263    if (!TablePtr)
264    {
265        return_ACPI_STATUS (AE_BAD_PARAMETER);
266    }
267
268    /* Copy the table to a local buffer */
269
270    Status = AcpiTbGetTable (0, TablePtr, &TableInfo);
271    if (ACPI_FAILURE (Status))
272    {
273        return_ACPI_STATUS (Status);
274    }
275
276    /* Install the new table into the local data structures */
277
278    Status = AcpiTbInstallTable (NULL, &TableInfo);
279    if (ACPI_FAILURE (Status))
280    {
281        /* Free table allocated by AcpiTbGetTable */
282
283        AcpiTbDeleteSingleTable (&TableInfo);
284        return_ACPI_STATUS (Status);
285    }
286
287
288    Status = AcpiNsLoadTable (TableInfo.InstalledDesc, AcpiGbl_RootNode);
289    if (ACPI_FAILURE (Status))
290    {
291        /* Uninstall table and free the buffer */
292
293        AcpiTbUninstallTable (TableInfo.InstalledDesc);
294        return_ACPI_STATUS (Status);
295    }
296
297
298    return_ACPI_STATUS (Status);
299}
300
301
302/*******************************************************************************
303 *
304 * FUNCTION:    AcpiUnloadTable
305 *
306 * PARAMETERS:  TableType     - Type of table to be unloaded
307 *
308 * RETURN:      Status
309 *
310 * DESCRIPTION: This routine is used to force the unload of a table
311 *
312 ******************************************************************************/
313
314ACPI_STATUS
315AcpiUnloadTable (
316    ACPI_TABLE_TYPE         TableType)
317{
318    ACPI_TABLE_DESC         *ListHead;
319    ACPI_STATUS             Status;
320
321
322    FUNCTION_TRACE ("AcpiUnloadTable");
323
324
325    /* Ensure that ACPI has been initialized */
326
327    ACPI_IS_INITIALIZATION_COMPLETE (Status);
328    if (ACPI_FAILURE (Status))
329    {
330        return_ACPI_STATUS (Status);
331    }
332
333    /* Parameter validation */
334
335    if (TableType > ACPI_TABLE_MAX)
336    {
337        return_ACPI_STATUS (AE_BAD_PARAMETER);
338    }
339
340
341    /* Find all tables of the requested type */
342
343    ListHead = &AcpiGbl_AcpiTables[TableType];
344    do
345    {
346        /*
347         * Delete all namespace entries owned by this table.  Note that these
348         * entries can appear anywhere in the namespace by virtue of the AML
349         * "Scope" operator.  Thus, we need to track ownership by an ID, not
350         * simply a position within the hierarchy
351         */
352        AcpiNsDeleteNamespaceByOwner (ListHead->TableId);
353
354        /* Delete (or unmap) the actual table */
355
356        AcpiTbDeleteAcpiTable (TableType);
357
358    } while (ListHead != &AcpiGbl_AcpiTables[TableType]);
359
360    return_ACPI_STATUS (AE_OK);
361}
362
363
364/*******************************************************************************
365 *
366 * FUNCTION:    AcpiGetTableHeader
367 *
368 * PARAMETERS:  TableType       - one of the defined table types
369 *              Instance        - the non zero instance of the table, allows
370 *                                support for multiple tables of the same type
371 *                                see AcpiGbl_AcpiTableFlag
372 *              OutTableHeader  - pointer to the ACPI_TABLE_HEADER if successful
373 *
374 * DESCRIPTION: This function is called to get an ACPI table header.  The caller
375 *              supplies an pointer to a data area sufficient to contain an ACPI
376 *              ACPI_TABLE_HEADER structure.
377 *
378 *              The header contains a length field that can be used to determine
379 *              the size of the buffer needed to contain the entire table.  This
380 *              function is not valid for the RSD PTR table since it does not
381 *              have a standard header and is fixed length.
382 *
383 ******************************************************************************/
384
385ACPI_STATUS
386AcpiGetTableHeader (
387    ACPI_TABLE_TYPE         TableType,
388    UINT32                  Instance,
389    ACPI_TABLE_HEADER       *OutTableHeader)
390{
391    ACPI_TABLE_HEADER       *TblPtr;
392    ACPI_STATUS             Status;
393
394
395    FUNCTION_TRACE ("AcpiGetTableHeader");
396
397
398    /* Ensure that ACPI has been initialized */
399
400    ACPI_IS_INITIALIZATION_COMPLETE (Status);
401    if (ACPI_FAILURE (Status))
402    {
403        return_ACPI_STATUS (Status);
404    }
405
406    if ((Instance == 0)                 ||
407        (TableType == ACPI_TABLE_RSDP)  ||
408        (!OutTableHeader))
409    {
410        return_ACPI_STATUS (AE_BAD_PARAMETER);
411    }
412
413    /* Check the table type and instance */
414
415    if ((TableType > ACPI_TABLE_MAX)    ||
416        (IS_SINGLE_TABLE (AcpiGbl_AcpiTableData[TableType].Flags) &&
417         Instance > 1))
418    {
419        return_ACPI_STATUS (AE_BAD_PARAMETER);
420    }
421
422
423    /* Get a pointer to the entire table */
424
425    Status = AcpiTbGetTablePtr (TableType, Instance, &TblPtr);
426    if (ACPI_FAILURE (Status))
427    {
428        return_ACPI_STATUS (Status);
429    }
430
431    /*
432     * The function will return a NULL pointer if the table is not loaded
433     */
434    if (TblPtr == NULL)
435    {
436        return_ACPI_STATUS (AE_NOT_EXIST);
437    }
438
439    /*
440     * Copy the header to the caller's buffer
441     */
442    MEMCPY ((void *) OutTableHeader, (void *) TblPtr,
443                sizeof (ACPI_TABLE_HEADER));
444
445    return_ACPI_STATUS (Status);
446}
447
448
449/*******************************************************************************
450 *
451 * FUNCTION:    AcpiGetTable
452 *
453 * PARAMETERS:  TableType       - one of the defined table types
454 *              Instance        - the non zero instance of the table, allows
455 *                                support for multiple tables of the same type
456 *                                see AcpiGbl_AcpiTableFlag
457 *              RetBuffer       - pointer to a structure containing a buffer to
458 *                                receive the table
459 *
460 * RETURN:      Status
461 *
462 * DESCRIPTION: This function is called to get an ACPI table.  The caller
463 *              supplies an OutBuffer large enough to contain the entire ACPI
464 *              table.  The caller should call the AcpiGetTableHeader function
465 *              first to determine the buffer size needed.  Upon completion
466 *              the OutBuffer->Length field will indicate the number of bytes
467 *              copied into the OutBuffer->BufPtr buffer.  This table will be
468 *              a complete table including the header.
469 *
470 ******************************************************************************/
471
472ACPI_STATUS
473AcpiGetTable (
474    ACPI_TABLE_TYPE         TableType,
475    UINT32                  Instance,
476    ACPI_BUFFER             *RetBuffer)
477{
478    ACPI_TABLE_HEADER       *TblPtr;
479    ACPI_STATUS             Status;
480    UINT32                  RetBufLen;
481
482
483    FUNCTION_TRACE ("AcpiGetTable");
484
485
486    /* Ensure that ACPI has been initialized */
487
488    ACPI_IS_INITIALIZATION_COMPLETE (Status);
489    if (ACPI_FAILURE (Status))
490    {
491        return_ACPI_STATUS (Status);
492    }
493
494    /*
495     *  If we have a buffer, we must have a length too
496     */
497    if ((Instance == 0)                 ||
498        (!RetBuffer)                    ||
499        ((!RetBuffer->Pointer) && (RetBuffer->Length)))
500    {
501        return_ACPI_STATUS (AE_BAD_PARAMETER);
502    }
503
504    /* Check the table type and instance */
505
506    if ((TableType > ACPI_TABLE_MAX)    ||
507        (IS_SINGLE_TABLE (AcpiGbl_AcpiTableData[TableType].Flags) &&
508         Instance > 1))
509    {
510        return_ACPI_STATUS (AE_BAD_PARAMETER);
511    }
512
513
514    /* Get a pointer to the entire table */
515
516    Status = AcpiTbGetTablePtr (TableType, Instance, &TblPtr);
517    if (ACPI_FAILURE (Status))
518    {
519        return_ACPI_STATUS (Status);
520    }
521
522    /*
523     * AcpiTbGetTablePtr will return a NULL pointer if the
524     * table is not loaded.
525     */
526    if (TblPtr == NULL)
527    {
528        return_ACPI_STATUS (AE_NOT_EXIST);
529    }
530
531    /*
532     * Got a table ptr, assume it's ok and copy it to the user's buffer
533     */
534    if (TableType == ACPI_TABLE_RSDP)
535    {
536        /*
537         *  RSD PTR is the only "table" without a header
538         */
539        RetBufLen = sizeof (RSDP_DESCRIPTOR);
540    }
541    else
542    {
543        RetBufLen = TblPtr->Length;
544    }
545
546    /*
547     * Verify we have space in the caller's buffer for the table
548     */
549    if (RetBuffer->Length < RetBufLen)
550    {
551        RetBuffer->Length = RetBufLen;
552        return_ACPI_STATUS (AE_BUFFER_OVERFLOW);
553    }
554
555    RetBuffer->Length = RetBufLen;
556
557    MEMCPY ((void *) RetBuffer->Pointer, (void *) TblPtr, RetBufLen);
558
559    return_ACPI_STATUS (AE_OK);
560}
561
562
563