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