xref: /haiku/src/add-ons/kernel/bus_managers/acpi/acpica/components/tables/tbdata.c (revision d0ac609964842f8cdb6d54b3c539c6c15293e172)
1 /******************************************************************************
2  *
3  * Module Name: tbdata - Table manager data structure functions
4  *
5  *****************************************************************************/
6 
7 /******************************************************************************
8  *
9  * 1. Copyright Notice
10  *
11  * Some or all of this work - Copyright (c) 1999 - 2015, 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 "acpi.h"
117 #include "accommon.h"
118 #include "acnamesp.h"
119 #include "actables.h"
120 
121 #define _COMPONENT          ACPI_TABLES
122         ACPI_MODULE_NAME    ("tbdata")
123 
124 
125 /*******************************************************************************
126  *
127  * FUNCTION:    AcpiTbInitTableDescriptor
128  *
129  * PARAMETERS:  TableDesc               - Table descriptor
130  *              Address                 - Physical address of the table
131  *              Flags                   - Allocation flags of the table
132  *              Table                   - Pointer to the table
133  *
134  * RETURN:      None
135  *
136  * DESCRIPTION: Initialize a new table descriptor
137  *
138  ******************************************************************************/
139 
140 void
141 AcpiTbInitTableDescriptor (
142     ACPI_TABLE_DESC         *TableDesc,
143     ACPI_PHYSICAL_ADDRESS   Address,
144     UINT8                   Flags,
145     ACPI_TABLE_HEADER       *Table)
146 {
147 
148     /*
149      * Initialize the table descriptor. Set the pointer to NULL, since the
150      * table is not fully mapped at this time.
151      */
152     memset (TableDesc, 0, sizeof (ACPI_TABLE_DESC));
153     TableDesc->Address = Address;
154     TableDesc->Length = Table->Length;
155     TableDesc->Flags = Flags;
156     ACPI_MOVE_32_TO_32 (TableDesc->Signature.Ascii, Table->Signature);
157 }
158 
159 
160 /*******************************************************************************
161  *
162  * FUNCTION:    AcpiTbAcquireTable
163  *
164  * PARAMETERS:  TableDesc           - Table descriptor
165  *              TablePtr            - Where table is returned
166  *              TableLength         - Where table length is returned
167  *              TableFlags          - Where table allocation flags are returned
168  *
169  * RETURN:      Status
170  *
171  * DESCRIPTION: Acquire an ACPI table. It can be used for tables not
172  *              maintained in the AcpiGbl_RootTableList.
173  *
174  ******************************************************************************/
175 
176 ACPI_STATUS
177 AcpiTbAcquireTable (
178     ACPI_TABLE_DESC         *TableDesc,
179     ACPI_TABLE_HEADER       **TablePtr,
180     UINT32                  *TableLength,
181     UINT8                   *TableFlags)
182 {
183     ACPI_TABLE_HEADER       *Table = NULL;
184 
185 
186     switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
187     {
188     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
189 
190         Table = AcpiOsMapMemory (TableDesc->Address, TableDesc->Length);
191         break;
192 
193     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
194     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
195 
196         Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
197                     ACPI_PHYSADDR_TO_PTR (TableDesc->Address));
198         break;
199 
200     default:
201 
202         break;
203     }
204 
205     /* Table is not valid yet */
206 
207     if (!Table)
208     {
209         return (AE_NO_MEMORY);
210     }
211 
212     /* Fill the return values */
213 
214     *TablePtr = Table;
215     *TableLength = TableDesc->Length;
216     *TableFlags = TableDesc->Flags;
217     return (AE_OK);
218 }
219 
220 
221 /*******************************************************************************
222  *
223  * FUNCTION:    AcpiTbReleaseTable
224  *
225  * PARAMETERS:  Table               - Pointer for the table
226  *              TableLength         - Length for the table
227  *              TableFlags          - Allocation flags for the table
228  *
229  * RETURN:      None
230  *
231  * DESCRIPTION: Release a table. The inverse of AcpiTbAcquireTable().
232  *
233  ******************************************************************************/
234 
235 void
236 AcpiTbReleaseTable (
237     ACPI_TABLE_HEADER       *Table,
238     UINT32                  TableLength,
239     UINT8                   TableFlags)
240 {
241 
242     switch (TableFlags & ACPI_TABLE_ORIGIN_MASK)
243     {
244     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
245 
246         AcpiOsUnmapMemory (Table, TableLength);
247         break;
248 
249     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
250     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
251     default:
252 
253         break;
254     }
255 }
256 
257 
258 /*******************************************************************************
259  *
260  * FUNCTION:    AcpiTbAcquireTempTable
261  *
262  * PARAMETERS:  TableDesc           - Table descriptor to be acquired
263  *              Address             - Address of the table
264  *              Flags               - Allocation flags of the table
265  *
266  * RETURN:      Status
267  *
268  * DESCRIPTION: This function validates the table header to obtain the length
269  *              of a table and fills the table descriptor to make its state as
270  *              "INSTALLED". Such a table descriptor is only used for verified
271  *              installation.
272  *
273  ******************************************************************************/
274 
275 ACPI_STATUS
276 AcpiTbAcquireTempTable (
277     ACPI_TABLE_DESC         *TableDesc,
278     ACPI_PHYSICAL_ADDRESS   Address,
279     UINT8                   Flags)
280 {
281     ACPI_TABLE_HEADER       *TableHeader;
282 
283 
284     switch (Flags & ACPI_TABLE_ORIGIN_MASK)
285     {
286     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
287 
288         /* Get the length of the full table from the header */
289 
290         TableHeader = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER));
291         if (!TableHeader)
292         {
293             return (AE_NO_MEMORY);
294         }
295 
296         AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader);
297         AcpiOsUnmapMemory (TableHeader, sizeof (ACPI_TABLE_HEADER));
298         return (AE_OK);
299 
300     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
301     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
302 
303         TableHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
304                         ACPI_PHYSADDR_TO_PTR (Address));
305         if (!TableHeader)
306         {
307             return (AE_NO_MEMORY);
308         }
309 
310         AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader);
311         return (AE_OK);
312 
313     default:
314 
315         break;
316     }
317 
318     /* Table is not valid yet */
319 
320     return (AE_NO_MEMORY);
321 }
322 
323 
324 /*******************************************************************************
325  *
326  * FUNCTION:    AcpiTbReleaseTempTable
327  *
328  * PARAMETERS:  TableDesc           - Table descriptor to be released
329  *
330  * RETURN:      Status
331  *
332  * DESCRIPTION: The inverse of AcpiTbAcquireTempTable().
333  *
334  *****************************************************************************/
335 
336 void
337 AcpiTbReleaseTempTable (
338     ACPI_TABLE_DESC         *TableDesc)
339 {
340 
341     /*
342      * Note that the .Address is maintained by the callers of
343      * AcpiTbAcquireTempTable(), thus do not invoke AcpiTbUninstallTable()
344      * where .Address will be freed.
345      */
346     AcpiTbInvalidateTable (TableDesc);
347 }
348 
349 
350 /******************************************************************************
351  *
352  * FUNCTION:    AcpiTbValidateTable
353  *
354  * PARAMETERS:  TableDesc           - Table descriptor
355  *
356  * RETURN:      Status
357  *
358  * DESCRIPTION: This function is called to validate the table, the returned
359  *              table descriptor is in "VALIDATED" state.
360  *
361  *****************************************************************************/
362 
363 ACPI_STATUS
364 AcpiTbValidateTable (
365     ACPI_TABLE_DESC         *TableDesc)
366 {
367     ACPI_STATUS             Status = AE_OK;
368 
369 
370     ACPI_FUNCTION_TRACE (TbValidateTable);
371 
372 
373     /* Validate the table if necessary */
374 
375     if (!TableDesc->Pointer)
376     {
377         Status = AcpiTbAcquireTable (TableDesc, &TableDesc->Pointer,
378                     &TableDesc->Length, &TableDesc->Flags);
379         if (!TableDesc->Pointer)
380         {
381             Status = AE_NO_MEMORY;
382         }
383     }
384 
385     return_ACPI_STATUS (Status);
386 }
387 
388 
389 /*******************************************************************************
390  *
391  * FUNCTION:    AcpiTbInvalidateTable
392  *
393  * PARAMETERS:  TableDesc           - Table descriptor
394  *
395  * RETURN:      None
396  *
397  * DESCRIPTION: Invalidate one internal ACPI table, this is the inverse of
398  *              AcpiTbValidateTable().
399  *
400  ******************************************************************************/
401 
402 void
403 AcpiTbInvalidateTable (
404     ACPI_TABLE_DESC         *TableDesc)
405 {
406 
407     ACPI_FUNCTION_TRACE (TbInvalidateTable);
408 
409 
410     /* Table must be validated */
411 
412     if (!TableDesc->Pointer)
413     {
414         return_VOID;
415     }
416 
417     AcpiTbReleaseTable (TableDesc->Pointer, TableDesc->Length,
418         TableDesc->Flags);
419     TableDesc->Pointer = NULL;
420 
421     return_VOID;
422 }
423 
424 
425 /******************************************************************************
426  *
427  * FUNCTION:    AcpiTbValidateTempTable
428  *
429  * PARAMETERS:  TableDesc           - Table descriptor
430  *
431  * RETURN:      Status
432  *
433  * DESCRIPTION: This function is called to validate the table, the returned
434  *              table descriptor is in "VALIDATED" state.
435  *
436  *****************************************************************************/
437 
438 ACPI_STATUS
439 AcpiTbValidateTempTable (
440     ACPI_TABLE_DESC         *TableDesc)
441 {
442 
443     if (!TableDesc->Pointer && !AcpiGbl_VerifyTableChecksum)
444     {
445         /*
446          * Only validates the header of the table.
447          * Note that Length contains the size of the mapping after invoking
448          * this work around, this value is required by
449          * AcpiTbReleaseTempTable().
450          * We can do this because in AcpiInitTableDescriptor(), the Length
451          * field of the installed descriptor is filled with the actual
452          * table length obtaining from the table header.
453          */
454         TableDesc->Length = sizeof (ACPI_TABLE_HEADER);
455     }
456 
457     return (AcpiTbValidateTable (TableDesc));
458 }
459 
460 
461 /******************************************************************************
462  *
463  * FUNCTION:    AcpiTbVerifyTempTable
464  *
465  * PARAMETERS:  TableDesc           - Table descriptor
466  *              Signature           - Table signature to verify
467  *
468  * RETURN:      Status
469  *
470  * DESCRIPTION: This function is called to validate and verify the table, the
471  *              returned table descriptor is in "VALIDATED" state.
472  *
473  *****************************************************************************/
474 
475 ACPI_STATUS
476 AcpiTbVerifyTempTable (
477     ACPI_TABLE_DESC         *TableDesc,
478     char                    *Signature)
479 {
480     ACPI_STATUS             Status = AE_OK;
481 
482 
483     ACPI_FUNCTION_TRACE (TbVerifyTempTable);
484 
485 
486     /* Validate the table */
487 
488     Status = AcpiTbValidateTempTable (TableDesc);
489     if (ACPI_FAILURE (Status))
490     {
491         return_ACPI_STATUS (AE_NO_MEMORY);
492     }
493 
494     /* If a particular signature is expected (DSDT/FACS), it must match */
495 
496     if (Signature &&
497         !ACPI_COMPARE_NAME (&TableDesc->Signature, Signature))
498     {
499         ACPI_BIOS_ERROR ((AE_INFO,
500             "Invalid signature 0x%X for ACPI table, expected [%s]",
501             TableDesc->Signature.Integer, Signature));
502         Status = AE_BAD_SIGNATURE;
503         goto InvalidateAndExit;
504     }
505 
506     /* Verify the checksum */
507 
508     if (AcpiGbl_VerifyTableChecksum)
509     {
510         Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length);
511         if (ACPI_FAILURE (Status))
512         {
513             ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY,
514                 "%4.4s 0x%8.8X%8.8X"
515                 " Attempted table install failed",
516                 AcpiUtValidAcpiName (TableDesc->Signature.Ascii) ?
517                     TableDesc->Signature.Ascii : "????",
518                 ACPI_FORMAT_UINT64 (TableDesc->Address)));
519             goto InvalidateAndExit;
520         }
521     }
522 
523     return_ACPI_STATUS (AE_OK);
524 
525 InvalidateAndExit:
526     AcpiTbInvalidateTable (TableDesc);
527     return_ACPI_STATUS (Status);
528 }
529 
530 
531 /*******************************************************************************
532  *
533  * FUNCTION:    AcpiTbResizeRootTableList
534  *
535  * PARAMETERS:  None
536  *
537  * RETURN:      Status
538  *
539  * DESCRIPTION: Expand the size of global table array
540  *
541  ******************************************************************************/
542 
543 ACPI_STATUS
544 AcpiTbResizeRootTableList (
545     void)
546 {
547     ACPI_TABLE_DESC         *Tables;
548     UINT32                  TableCount;
549 
550 
551     ACPI_FUNCTION_TRACE (TbResizeRootTableList);
552 
553 
554     /* AllowResize flag is a parameter to AcpiInitializeTables */
555 
556     if (!(AcpiGbl_RootTableList.Flags & ACPI_ROOT_ALLOW_RESIZE))
557     {
558         ACPI_ERROR ((AE_INFO, "Resize of Root Table Array is not allowed"));
559         return_ACPI_STATUS (AE_SUPPORT);
560     }
561 
562     /* Increase the Table Array size */
563 
564     if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
565     {
566         TableCount = AcpiGbl_RootTableList.MaxTableCount;
567     }
568     else
569     {
570         TableCount = AcpiGbl_RootTableList.CurrentTableCount;
571     }
572 
573     Tables = ACPI_ALLOCATE_ZEROED (
574         ((ACPI_SIZE) TableCount + ACPI_ROOT_TABLE_SIZE_INCREMENT) *
575         sizeof (ACPI_TABLE_DESC));
576     if (!Tables)
577     {
578         ACPI_ERROR ((AE_INFO, "Could not allocate new root table array"));
579         return_ACPI_STATUS (AE_NO_MEMORY);
580     }
581 
582     /* Copy and free the previous table array */
583 
584     if (AcpiGbl_RootTableList.Tables)
585     {
586         memcpy (Tables, AcpiGbl_RootTableList.Tables,
587             (ACPI_SIZE) TableCount * sizeof (ACPI_TABLE_DESC));
588 
589         if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
590         {
591             ACPI_FREE (AcpiGbl_RootTableList.Tables);
592         }
593     }
594 
595     AcpiGbl_RootTableList.Tables = Tables;
596     AcpiGbl_RootTableList.MaxTableCount =
597         TableCount + ACPI_ROOT_TABLE_SIZE_INCREMENT;
598     AcpiGbl_RootTableList.Flags |= ACPI_ROOT_ORIGIN_ALLOCATED;
599 
600     return_ACPI_STATUS (AE_OK);
601 }
602 
603 
604 /*******************************************************************************
605  *
606  * FUNCTION:    AcpiTbGetNextTableDescriptor
607  *
608  * PARAMETERS:  TableIndex          - Where table index is returned
609  *              TableDesc           - Where table descriptor is returned
610  *
611  * RETURN:      Status and table index/descriptor.
612  *
613  * DESCRIPTION: Allocate a new ACPI table entry to the global table list
614  *
615  ******************************************************************************/
616 
617 ACPI_STATUS
618 AcpiTbGetNextTableDescriptor (
619     UINT32                  *TableIndex,
620     ACPI_TABLE_DESC         **TableDesc)
621 {
622     ACPI_STATUS             Status;
623     UINT32                  i;
624 
625 
626     /* Ensure that there is room for the table in the Root Table List */
627 
628     if (AcpiGbl_RootTableList.CurrentTableCount >=
629         AcpiGbl_RootTableList.MaxTableCount)
630     {
631         Status = AcpiTbResizeRootTableList();
632         if (ACPI_FAILURE (Status))
633         {
634             return (Status);
635         }
636     }
637 
638     i = AcpiGbl_RootTableList.CurrentTableCount;
639     AcpiGbl_RootTableList.CurrentTableCount++;
640 
641     if (TableIndex)
642     {
643         *TableIndex = i;
644     }
645     if (TableDesc)
646     {
647         *TableDesc = &AcpiGbl_RootTableList.Tables[i];
648     }
649 
650     return (AE_OK);
651 }
652 
653 
654 /*******************************************************************************
655  *
656  * FUNCTION:    AcpiTbTerminate
657  *
658  * PARAMETERS:  None
659  *
660  * RETURN:      None
661  *
662  * DESCRIPTION: Delete all internal ACPI tables
663  *
664  ******************************************************************************/
665 
666 void
667 AcpiTbTerminate (
668     void)
669 {
670     UINT32                  i;
671 
672 
673     ACPI_FUNCTION_TRACE (TbTerminate);
674 
675 
676     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
677 
678     /* Delete the individual tables */
679 
680     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
681     {
682         AcpiTbUninstallTable (&AcpiGbl_RootTableList.Tables[i]);
683     }
684 
685     /*
686      * Delete the root table array if allocated locally. Array cannot be
687      * mapped, so we don't need to check for that flag.
688      */
689     if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
690     {
691         ACPI_FREE (AcpiGbl_RootTableList.Tables);
692     }
693 
694     AcpiGbl_RootTableList.Tables = NULL;
695     AcpiGbl_RootTableList.Flags = 0;
696     AcpiGbl_RootTableList.CurrentTableCount = 0;
697 
698     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ACPI Tables freed\n"));
699 
700     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
701     return_VOID;
702 }
703 
704 
705 /*******************************************************************************
706  *
707  * FUNCTION:    AcpiTbDeleteNamespaceByOwner
708  *
709  * PARAMETERS:  TableIndex          - Table index
710  *
711  * RETURN:      Status
712  *
713  * DESCRIPTION: Delete all namespace objects created when this table was loaded.
714  *
715  ******************************************************************************/
716 
717 ACPI_STATUS
718 AcpiTbDeleteNamespaceByOwner (
719     UINT32                  TableIndex)
720 {
721     ACPI_OWNER_ID           OwnerId;
722     ACPI_STATUS             Status;
723 
724 
725     ACPI_FUNCTION_TRACE (TbDeleteNamespaceByOwner);
726 
727 
728     Status = AcpiUtAcquireMutex (ACPI_MTX_TABLES);
729     if (ACPI_FAILURE (Status))
730     {
731         return_ACPI_STATUS (Status);
732     }
733 
734     if (TableIndex >= AcpiGbl_RootTableList.CurrentTableCount)
735     {
736         /* The table index does not exist */
737 
738         (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
739         return_ACPI_STATUS (AE_NOT_EXIST);
740     }
741 
742     /* Get the owner ID for this table, used to delete namespace nodes */
743 
744     OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
745     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
746 
747     /*
748      * Need to acquire the namespace writer lock to prevent interference
749      * with any concurrent namespace walks. The interpreter must be
750      * released during the deletion since the acquisition of the deletion
751      * lock may block, and also since the execution of a namespace walk
752      * must be allowed to use the interpreter.
753      */
754     (void) AcpiUtReleaseMutex (ACPI_MTX_INTERPRETER);
755     Status = AcpiUtAcquireWriteLock (&AcpiGbl_NamespaceRwLock);
756 
757     AcpiNsDeleteNamespaceByOwner (OwnerId);
758     if (ACPI_FAILURE (Status))
759     {
760         return_ACPI_STATUS (Status);
761     }
762 
763     AcpiUtReleaseWriteLock (&AcpiGbl_NamespaceRwLock);
764 
765     Status = AcpiUtAcquireMutex (ACPI_MTX_INTERPRETER);
766     return_ACPI_STATUS (Status);
767 }
768 
769 
770 /*******************************************************************************
771  *
772  * FUNCTION:    AcpiTbAllocateOwnerId
773  *
774  * PARAMETERS:  TableIndex          - Table index
775  *
776  * RETURN:      Status
777  *
778  * DESCRIPTION: Allocates OwnerId in TableDesc
779  *
780  ******************************************************************************/
781 
782 ACPI_STATUS
783 AcpiTbAllocateOwnerId (
784     UINT32                  TableIndex)
785 {
786     ACPI_STATUS             Status = AE_BAD_PARAMETER;
787 
788 
789     ACPI_FUNCTION_TRACE (TbAllocateOwnerId);
790 
791 
792     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
793     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
794     {
795         Status = AcpiUtAllocateOwnerId (
796                     &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
797     }
798 
799     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
800     return_ACPI_STATUS (Status);
801 }
802 
803 
804 /*******************************************************************************
805  *
806  * FUNCTION:    AcpiTbReleaseOwnerId
807  *
808  * PARAMETERS:  TableIndex          - Table index
809  *
810  * RETURN:      Status
811  *
812  * DESCRIPTION: Releases OwnerId in TableDesc
813  *
814  ******************************************************************************/
815 
816 ACPI_STATUS
817 AcpiTbReleaseOwnerId (
818     UINT32                  TableIndex)
819 {
820     ACPI_STATUS             Status = AE_BAD_PARAMETER;
821 
822 
823     ACPI_FUNCTION_TRACE (TbReleaseOwnerId);
824 
825 
826     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
827     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
828     {
829         AcpiUtReleaseOwnerId (
830             &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
831         Status = AE_OK;
832     }
833 
834     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
835     return_ACPI_STATUS (Status);
836 }
837 
838 
839 /*******************************************************************************
840  *
841  * FUNCTION:    AcpiTbGetOwnerId
842  *
843  * PARAMETERS:  TableIndex          - Table index
844  *              OwnerId             - Where the table OwnerId is returned
845  *
846  * RETURN:      Status
847  *
848  * DESCRIPTION: returns OwnerId for the ACPI table
849  *
850  ******************************************************************************/
851 
852 ACPI_STATUS
853 AcpiTbGetOwnerId (
854     UINT32                  TableIndex,
855     ACPI_OWNER_ID           *OwnerId)
856 {
857     ACPI_STATUS             Status = AE_BAD_PARAMETER;
858 
859 
860     ACPI_FUNCTION_TRACE (TbGetOwnerId);
861 
862 
863     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
864     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
865     {
866         *OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
867         Status = AE_OK;
868     }
869 
870     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
871     return_ACPI_STATUS (Status);
872 }
873 
874 
875 /*******************************************************************************
876  *
877  * FUNCTION:    AcpiTbIsTableLoaded
878  *
879  * PARAMETERS:  TableIndex          - Index into the root table
880  *
881  * RETURN:      Table Loaded Flag
882  *
883  ******************************************************************************/
884 
885 BOOLEAN
886 AcpiTbIsTableLoaded (
887     UINT32                  TableIndex)
888 {
889     BOOLEAN                 IsLoaded = FALSE;
890 
891 
892     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
893     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
894     {
895         IsLoaded = (BOOLEAN)
896             (AcpiGbl_RootTableList.Tables[TableIndex].Flags &
897             ACPI_TABLE_IS_LOADED);
898     }
899 
900     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
901     return (IsLoaded);
902 }
903 
904 
905 /*******************************************************************************
906  *
907  * FUNCTION:    AcpiTbSetTableLoadedFlag
908  *
909  * PARAMETERS:  TableIndex          - Table index
910  *              IsLoaded            - TRUE if table is loaded, FALSE otherwise
911  *
912  * RETURN:      None
913  *
914  * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
915  *
916  ******************************************************************************/
917 
918 void
919 AcpiTbSetTableLoadedFlag (
920     UINT32                  TableIndex,
921     BOOLEAN                 IsLoaded)
922 {
923 
924     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
925     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
926     {
927         if (IsLoaded)
928         {
929             AcpiGbl_RootTableList.Tables[TableIndex].Flags |=
930                 ACPI_TABLE_IS_LOADED;
931         }
932         else
933         {
934             AcpiGbl_RootTableList.Tables[TableIndex].Flags &=
935                 ~ACPI_TABLE_IS_LOADED;
936         }
937     }
938 
939     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
940 }
941