Annotation of src/sys/external/bsd/acpica/dist/tables/tbdata.c, Revision 1.2.2.6
1.1 christos 1: /******************************************************************************
2: *
3: * Module Name: tbdata - Table manager data structure functions
4: *
5: *****************************************************************************/
6:
7: /*
1.2.2.6 ! skrll 8: * Copyright (C) 2000 - 2017, Intel Corp.
1.1 christos 9: * All rights reserved.
10: *
11: * Redistribution and use in source and binary forms, with or without
12: * modification, are permitted provided that the following conditions
13: * are met:
14: * 1. Redistributions of source code must retain the above copyright
15: * notice, this list of conditions, and the following disclaimer,
16: * without modification.
17: * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18: * substantially similar to the "NO WARRANTY" disclaimer below
19: * ("Disclaimer") and any redistribution must be conditioned upon
20: * including a substantially similar Disclaimer requirement for further
21: * binary redistribution.
22: * 3. Neither the names of the above-listed copyright holders nor the names
23: * of any contributors may be used to endorse or promote products derived
24: * from this software without specific prior written permission.
25: *
26: * Alternatively, this software may be distributed under the terms of the
27: * GNU General Public License ("GPL") version 2 as published by the Free
28: * Software Foundation.
29: *
30: * NO WARRANTY
31: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35: * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40: * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41: * POSSIBILITY OF SUCH DAMAGES.
42: */
43:
44: #include "acpi.h"
45: #include "accommon.h"
46: #include "acnamesp.h"
47: #include "actables.h"
1.2.2.5 skrll 48: #include "acevents.h"
1.1 christos 49:
50: #define _COMPONENT ACPI_TABLES
51: ACPI_MODULE_NAME ("tbdata")
52:
53:
54: /*******************************************************************************
55: *
56: * FUNCTION: AcpiTbInitTableDescriptor
57: *
58: * PARAMETERS: TableDesc - Table descriptor
59: * Address - Physical address of the table
60: * Flags - Allocation flags of the table
61: * Table - Pointer to the table
62: *
63: * RETURN: None
64: *
65: * DESCRIPTION: Initialize a new table descriptor
66: *
67: ******************************************************************************/
68:
69: void
70: AcpiTbInitTableDescriptor (
71: ACPI_TABLE_DESC *TableDesc,
72: ACPI_PHYSICAL_ADDRESS Address,
73: UINT8 Flags,
74: ACPI_TABLE_HEADER *Table)
75: {
76:
77: /*
78: * Initialize the table descriptor. Set the pointer to NULL, since the
79: * table is not fully mapped at this time.
80: */
1.2.2.2 skrll 81: memset (TableDesc, 0, sizeof (ACPI_TABLE_DESC));
1.1 christos 82: TableDesc->Address = Address;
83: TableDesc->Length = Table->Length;
84: TableDesc->Flags = Flags;
85: ACPI_MOVE_32_TO_32 (TableDesc->Signature.Ascii, Table->Signature);
86: }
87:
88:
89: /*******************************************************************************
90: *
91: * FUNCTION: AcpiTbAcquireTable
92: *
93: * PARAMETERS: TableDesc - Table descriptor
94: * TablePtr - Where table is returned
95: * TableLength - Where table length is returned
96: * TableFlags - Where table allocation flags are returned
97: *
98: * RETURN: Status
99: *
100: * DESCRIPTION: Acquire an ACPI table. It can be used for tables not
101: * maintained in the AcpiGbl_RootTableList.
102: *
103: ******************************************************************************/
104:
105: ACPI_STATUS
106: AcpiTbAcquireTable (
107: ACPI_TABLE_DESC *TableDesc,
108: ACPI_TABLE_HEADER **TablePtr,
109: UINT32 *TableLength,
110: UINT8 *TableFlags)
111: {
112: ACPI_TABLE_HEADER *Table = NULL;
113:
114:
115: switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
116: {
117: case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
118:
119: Table = AcpiOsMapMemory (TableDesc->Address, TableDesc->Length);
120: break;
121:
122: case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
123: case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
124:
1.2.2.1 skrll 125: Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
1.2.2.3 skrll 126: ACPI_PHYSADDR_TO_PTR (TableDesc->Address));
1.1 christos 127: break;
128:
129: default:
130:
131: break;
132: }
133:
134: /* Table is not valid yet */
135:
136: if (!Table)
137: {
138: return (AE_NO_MEMORY);
139: }
140:
141: /* Fill the return values */
142:
143: *TablePtr = Table;
144: *TableLength = TableDesc->Length;
145: *TableFlags = TableDesc->Flags;
146: return (AE_OK);
147: }
148:
149:
150: /*******************************************************************************
151: *
152: * FUNCTION: AcpiTbReleaseTable
153: *
154: * PARAMETERS: Table - Pointer for the table
155: * TableLength - Length for the table
156: * TableFlags - Allocation flags for the table
157: *
158: * RETURN: None
159: *
160: * DESCRIPTION: Release a table. The inverse of AcpiTbAcquireTable().
161: *
162: ******************************************************************************/
163:
164: void
165: AcpiTbReleaseTable (
166: ACPI_TABLE_HEADER *Table,
167: UINT32 TableLength,
168: UINT8 TableFlags)
169: {
170:
171: switch (TableFlags & ACPI_TABLE_ORIGIN_MASK)
172: {
173: case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
174:
175: AcpiOsUnmapMemory (Table, TableLength);
176: break;
177:
178: case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
179: case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
180: default:
181:
182: break;
183: }
184: }
185:
186:
187: /*******************************************************************************
188: *
189: * FUNCTION: AcpiTbAcquireTempTable
190: *
191: * PARAMETERS: TableDesc - Table descriptor to be acquired
192: * Address - Address of the table
193: * Flags - Allocation flags of the table
194: *
195: * RETURN: Status
196: *
197: * DESCRIPTION: This function validates the table header to obtain the length
198: * of a table and fills the table descriptor to make its state as
199: * "INSTALLED". Such a table descriptor is only used for verified
200: * installation.
201: *
202: ******************************************************************************/
203:
204: ACPI_STATUS
205: AcpiTbAcquireTempTable (
206: ACPI_TABLE_DESC *TableDesc,
207: ACPI_PHYSICAL_ADDRESS Address,
208: UINT8 Flags)
209: {
210: ACPI_TABLE_HEADER *TableHeader;
211:
212:
213: switch (Flags & ACPI_TABLE_ORIGIN_MASK)
214: {
215: case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
216:
217: /* Get the length of the full table from the header */
218:
219: TableHeader = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER));
220: if (!TableHeader)
221: {
222: return (AE_NO_MEMORY);
223: }
224:
225: AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader);
226: AcpiOsUnmapMemory (TableHeader, sizeof (ACPI_TABLE_HEADER));
227: return (AE_OK);
228:
229: case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
230: case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
231:
1.2.2.1 skrll 232: TableHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
1.2.2.3 skrll 233: ACPI_PHYSADDR_TO_PTR (Address));
1.1 christos 234: if (!TableHeader)
235: {
236: return (AE_NO_MEMORY);
237: }
238:
239: AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader);
240: return (AE_OK);
241:
242: default:
243:
244: break;
245: }
246:
247: /* Table is not valid yet */
248:
249: return (AE_NO_MEMORY);
250: }
251:
252:
253: /*******************************************************************************
254: *
255: * FUNCTION: AcpiTbReleaseTempTable
256: *
257: * PARAMETERS: TableDesc - Table descriptor to be released
258: *
259: * RETURN: Status
260: *
261: * DESCRIPTION: The inverse of AcpiTbAcquireTempTable().
262: *
263: *****************************************************************************/
264:
265: void
266: AcpiTbReleaseTempTable (
267: ACPI_TABLE_DESC *TableDesc)
268: {
269:
270: /*
271: * Note that the .Address is maintained by the callers of
272: * AcpiTbAcquireTempTable(), thus do not invoke AcpiTbUninstallTable()
273: * where .Address will be freed.
274: */
275: AcpiTbInvalidateTable (TableDesc);
276: }
277:
278:
279: /******************************************************************************
280: *
281: * FUNCTION: AcpiTbValidateTable
282: *
283: * PARAMETERS: TableDesc - Table descriptor
284: *
285: * RETURN: Status
286: *
287: * DESCRIPTION: This function is called to validate the table, the returned
288: * table descriptor is in "VALIDATED" state.
289: *
290: *****************************************************************************/
291:
292: ACPI_STATUS
293: AcpiTbValidateTable (
294: ACPI_TABLE_DESC *TableDesc)
295: {
296: ACPI_STATUS Status = AE_OK;
297:
298:
299: ACPI_FUNCTION_TRACE (TbValidateTable);
300:
301:
302: /* Validate the table if necessary */
303:
304: if (!TableDesc->Pointer)
305: {
306: Status = AcpiTbAcquireTable (TableDesc, &TableDesc->Pointer,
1.2.2.3 skrll 307: &TableDesc->Length, &TableDesc->Flags);
1.1 christos 308: if (!TableDesc->Pointer)
309: {
310: Status = AE_NO_MEMORY;
311: }
312: }
313:
314: return_ACPI_STATUS (Status);
315: }
316:
317:
318: /*******************************************************************************
319: *
320: * FUNCTION: AcpiTbInvalidateTable
321: *
322: * PARAMETERS: TableDesc - Table descriptor
323: *
324: * RETURN: None
325: *
326: * DESCRIPTION: Invalidate one internal ACPI table, this is the inverse of
327: * AcpiTbValidateTable().
328: *
329: ******************************************************************************/
330:
331: void
332: AcpiTbInvalidateTable (
333: ACPI_TABLE_DESC *TableDesc)
334: {
335:
336: ACPI_FUNCTION_TRACE (TbInvalidateTable);
337:
338:
339: /* Table must be validated */
340:
341: if (!TableDesc->Pointer)
342: {
343: return_VOID;
344: }
345:
346: AcpiTbReleaseTable (TableDesc->Pointer, TableDesc->Length,
347: TableDesc->Flags);
348: TableDesc->Pointer = NULL;
349:
350: return_VOID;
351: }
352:
353:
354: /******************************************************************************
355: *
356: * FUNCTION: AcpiTbValidateTempTable
357: *
358: * PARAMETERS: TableDesc - Table descriptor
359: *
360: * RETURN: Status
361: *
362: * DESCRIPTION: This function is called to validate the table, the returned
363: * table descriptor is in "VALIDATED" state.
364: *
365: *****************************************************************************/
366:
367: ACPI_STATUS
368: AcpiTbValidateTempTable (
369: ACPI_TABLE_DESC *TableDesc)
370: {
371:
372: if (!TableDesc->Pointer && !AcpiGbl_VerifyTableChecksum)
373: {
374: /*
375: * Only validates the header of the table.
376: * Note that Length contains the size of the mapping after invoking
377: * this work around, this value is required by
378: * AcpiTbReleaseTempTable().
379: * We can do this because in AcpiInitTableDescriptor(), the Length
380: * field of the installed descriptor is filled with the actual
381: * table length obtaining from the table header.
382: */
383: TableDesc->Length = sizeof (ACPI_TABLE_HEADER);
384: }
385:
386: return (AcpiTbValidateTable (TableDesc));
387: }
388:
389:
390: /******************************************************************************
391: *
392: * FUNCTION: AcpiTbVerifyTempTable
393: *
394: * PARAMETERS: TableDesc - Table descriptor
395: * Signature - Table signature to verify
396: *
397: * RETURN: Status
398: *
399: * DESCRIPTION: This function is called to validate and verify the table, the
400: * returned table descriptor is in "VALIDATED" state.
401: *
402: *****************************************************************************/
403:
404: ACPI_STATUS
405: AcpiTbVerifyTempTable (
406: ACPI_TABLE_DESC *TableDesc,
1.2 christos 407: const char *Signature)
1.1 christos 408: {
409: ACPI_STATUS Status = AE_OK;
410:
411:
412: ACPI_FUNCTION_TRACE (TbVerifyTempTable);
413:
414:
415: /* Validate the table */
416:
417: Status = AcpiTbValidateTempTable (TableDesc);
418: if (ACPI_FAILURE (Status))
419: {
420: return_ACPI_STATUS (AE_NO_MEMORY);
421: }
422:
423: /* If a particular signature is expected (DSDT/FACS), it must match */
424:
425: if (Signature &&
426: !ACPI_COMPARE_NAME (&TableDesc->Signature, Signature))
427: {
428: ACPI_BIOS_ERROR ((AE_INFO,
429: "Invalid signature 0x%X for ACPI table, expected [%s]",
430: TableDesc->Signature.Integer, Signature));
431: Status = AE_BAD_SIGNATURE;
432: goto InvalidateAndExit;
433: }
434:
435: /* Verify the checksum */
436:
437: if (AcpiGbl_VerifyTableChecksum)
438: {
439: Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length);
440: if (ACPI_FAILURE (Status))
441: {
442: ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY,
1.2.2.1 skrll 443: "%4.4s 0x%8.8X%8.8X"
1.1 christos 444: " Attempted table install failed",
1.2.2.4 skrll 445: AcpiUtValidNameseg (TableDesc->Signature.Ascii) ?
1.1 christos 446: TableDesc->Signature.Ascii : "????",
1.2.2.1 skrll 447: ACPI_FORMAT_UINT64 (TableDesc->Address)));
1.2.2.3 skrll 448:
1.1 christos 449: goto InvalidateAndExit;
450: }
451: }
452:
453: return_ACPI_STATUS (AE_OK);
454:
455: InvalidateAndExit:
456: AcpiTbInvalidateTable (TableDesc);
457: return_ACPI_STATUS (Status);
458: }
459:
460:
461: /*******************************************************************************
462: *
463: * FUNCTION: AcpiTbResizeRootTableList
464: *
465: * PARAMETERS: None
466: *
467: * RETURN: Status
468: *
469: * DESCRIPTION: Expand the size of global table array
470: *
471: ******************************************************************************/
472:
473: ACPI_STATUS
474: AcpiTbResizeRootTableList (
475: void)
476: {
477: ACPI_TABLE_DESC *Tables;
478: UINT32 TableCount;
479:
480:
481: ACPI_FUNCTION_TRACE (TbResizeRootTableList);
482:
483:
484: /* AllowResize flag is a parameter to AcpiInitializeTables */
485:
486: if (!(AcpiGbl_RootTableList.Flags & ACPI_ROOT_ALLOW_RESIZE))
487: {
488: ACPI_ERROR ((AE_INFO, "Resize of Root Table Array is not allowed"));
489: return_ACPI_STATUS (AE_SUPPORT);
490: }
491:
492: /* Increase the Table Array size */
493:
494: if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
495: {
496: TableCount = AcpiGbl_RootTableList.MaxTableCount;
497: }
498: else
499: {
500: TableCount = AcpiGbl_RootTableList.CurrentTableCount;
501: }
502:
503: Tables = ACPI_ALLOCATE_ZEROED (
504: ((ACPI_SIZE) TableCount + ACPI_ROOT_TABLE_SIZE_INCREMENT) *
505: sizeof (ACPI_TABLE_DESC));
506: if (!Tables)
507: {
508: ACPI_ERROR ((AE_INFO, "Could not allocate new root table array"));
509: return_ACPI_STATUS (AE_NO_MEMORY);
510: }
511:
512: /* Copy and free the previous table array */
513:
514: if (AcpiGbl_RootTableList.Tables)
515: {
1.2.2.2 skrll 516: memcpy (Tables, AcpiGbl_RootTableList.Tables,
1.1 christos 517: (ACPI_SIZE) TableCount * sizeof (ACPI_TABLE_DESC));
518:
519: if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
520: {
521: ACPI_FREE (AcpiGbl_RootTableList.Tables);
522: }
523: }
524:
525: AcpiGbl_RootTableList.Tables = Tables;
526: AcpiGbl_RootTableList.MaxTableCount =
527: TableCount + ACPI_ROOT_TABLE_SIZE_INCREMENT;
528: AcpiGbl_RootTableList.Flags |= ACPI_ROOT_ORIGIN_ALLOCATED;
529:
530: return_ACPI_STATUS (AE_OK);
531: }
532:
533:
534: /*******************************************************************************
535: *
1.2.2.1 skrll 536: * FUNCTION: AcpiTbGetNextTableDescriptor
1.1 christos 537: *
538: * PARAMETERS: TableIndex - Where table index is returned
1.2.2.1 skrll 539: * TableDesc - Where table descriptor is returned
1.1 christos 540: *
1.2.2.1 skrll 541: * RETURN: Status and table index/descriptor.
1.1 christos 542: *
543: * DESCRIPTION: Allocate a new ACPI table entry to the global table list
544: *
545: ******************************************************************************/
546:
547: ACPI_STATUS
1.2.2.1 skrll 548: AcpiTbGetNextTableDescriptor (
549: UINT32 *TableIndex,
550: ACPI_TABLE_DESC **TableDesc)
1.1 christos 551: {
552: ACPI_STATUS Status;
1.2.2.1 skrll 553: UINT32 i;
1.1 christos 554:
555:
556: /* Ensure that there is room for the table in the Root Table List */
557:
558: if (AcpiGbl_RootTableList.CurrentTableCount >=
559: AcpiGbl_RootTableList.MaxTableCount)
560: {
561: Status = AcpiTbResizeRootTableList();
562: if (ACPI_FAILURE (Status))
563: {
564: return (Status);
565: }
566: }
567:
1.2.2.1 skrll 568: i = AcpiGbl_RootTableList.CurrentTableCount;
1.1 christos 569: AcpiGbl_RootTableList.CurrentTableCount++;
1.2.2.1 skrll 570:
571: if (TableIndex)
572: {
573: *TableIndex = i;
574: }
575: if (TableDesc)
576: {
577: *TableDesc = &AcpiGbl_RootTableList.Tables[i];
578: }
579:
1.1 christos 580: return (AE_OK);
581: }
582:
583:
584: /*******************************************************************************
585: *
586: * FUNCTION: AcpiTbTerminate
587: *
588: * PARAMETERS: None
589: *
590: * RETURN: None
591: *
592: * DESCRIPTION: Delete all internal ACPI tables
593: *
594: ******************************************************************************/
595:
596: void
597: AcpiTbTerminate (
598: void)
599: {
600: UINT32 i;
601:
602:
603: ACPI_FUNCTION_TRACE (TbTerminate);
604:
605:
606: (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
607:
608: /* Delete the individual tables */
609:
610: for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
611: {
612: AcpiTbUninstallTable (&AcpiGbl_RootTableList.Tables[i]);
613: }
614:
615: /*
616: * Delete the root table array if allocated locally. Array cannot be
617: * mapped, so we don't need to check for that flag.
618: */
619: if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
620: {
621: ACPI_FREE (AcpiGbl_RootTableList.Tables);
622: }
623:
624: AcpiGbl_RootTableList.Tables = NULL;
625: AcpiGbl_RootTableList.Flags = 0;
626: AcpiGbl_RootTableList.CurrentTableCount = 0;
627:
628: ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ACPI Tables freed\n"));
629:
630: (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
631: return_VOID;
632: }
633:
634:
635: /*******************************************************************************
636: *
637: * FUNCTION: AcpiTbDeleteNamespaceByOwner
638: *
639: * PARAMETERS: TableIndex - Table index
640: *
641: * RETURN: Status
642: *
643: * DESCRIPTION: Delete all namespace objects created when this table was loaded.
644: *
645: ******************************************************************************/
646:
647: ACPI_STATUS
648: AcpiTbDeleteNamespaceByOwner (
649: UINT32 TableIndex)
650: {
651: ACPI_OWNER_ID OwnerId;
652: ACPI_STATUS Status;
653:
654:
655: ACPI_FUNCTION_TRACE (TbDeleteNamespaceByOwner);
656:
657:
658: Status = AcpiUtAcquireMutex (ACPI_MTX_TABLES);
659: if (ACPI_FAILURE (Status))
660: {
661: return_ACPI_STATUS (Status);
662: }
663:
664: if (TableIndex >= AcpiGbl_RootTableList.CurrentTableCount)
665: {
666: /* The table index does not exist */
667:
668: (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
669: return_ACPI_STATUS (AE_NOT_EXIST);
670: }
671:
672: /* Get the owner ID for this table, used to delete namespace nodes */
673:
674: OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
675: (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
676:
677: /*
678: * Need to acquire the namespace writer lock to prevent interference
679: * with any concurrent namespace walks. The interpreter must be
680: * released during the deletion since the acquisition of the deletion
681: * lock may block, and also since the execution of a namespace walk
682: * must be allowed to use the interpreter.
683: */
684: Status = AcpiUtAcquireWriteLock (&AcpiGbl_NamespaceRwLock);
685: if (ACPI_FAILURE (Status))
686: {
687: return_ACPI_STATUS (Status);
688: }
1.2.2.5 skrll 689: AcpiNsDeleteNamespaceByOwner (OwnerId);
1.1 christos 690: AcpiUtReleaseWriteLock (&AcpiGbl_NamespaceRwLock);
691: return_ACPI_STATUS (Status);
692: }
693:
694:
695: /*******************************************************************************
696: *
697: * FUNCTION: AcpiTbAllocateOwnerId
698: *
699: * PARAMETERS: TableIndex - Table index
700: *
701: * RETURN: Status
702: *
703: * DESCRIPTION: Allocates OwnerId in TableDesc
704: *
705: ******************************************************************************/
706:
707: ACPI_STATUS
708: AcpiTbAllocateOwnerId (
709: UINT32 TableIndex)
710: {
711: ACPI_STATUS Status = AE_BAD_PARAMETER;
712:
713:
714: ACPI_FUNCTION_TRACE (TbAllocateOwnerId);
715:
716:
717: (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
718: if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
719: {
720: Status = AcpiUtAllocateOwnerId (
1.2.2.3 skrll 721: &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
1.1 christos 722: }
723:
724: (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
725: return_ACPI_STATUS (Status);
726: }
727:
728:
729: /*******************************************************************************
730: *
731: * FUNCTION: AcpiTbReleaseOwnerId
732: *
733: * PARAMETERS: TableIndex - Table index
734: *
735: * RETURN: Status
736: *
737: * DESCRIPTION: Releases OwnerId in TableDesc
738: *
739: ******************************************************************************/
740:
741: ACPI_STATUS
742: AcpiTbReleaseOwnerId (
743: UINT32 TableIndex)
744: {
745: ACPI_STATUS Status = AE_BAD_PARAMETER;
746:
747:
748: ACPI_FUNCTION_TRACE (TbReleaseOwnerId);
749:
750:
751: (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
752: if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
753: {
754: AcpiUtReleaseOwnerId (
755: &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
756: Status = AE_OK;
757: }
758:
759: (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
760: return_ACPI_STATUS (Status);
761: }
762:
763:
764: /*******************************************************************************
765: *
766: * FUNCTION: AcpiTbGetOwnerId
767: *
768: * PARAMETERS: TableIndex - Table index
769: * OwnerId - Where the table OwnerId is returned
770: *
771: * RETURN: Status
772: *
773: * DESCRIPTION: returns OwnerId for the ACPI table
774: *
775: ******************************************************************************/
776:
777: ACPI_STATUS
778: AcpiTbGetOwnerId (
779: UINT32 TableIndex,
780: ACPI_OWNER_ID *OwnerId)
781: {
782: ACPI_STATUS Status = AE_BAD_PARAMETER;
783:
784:
785: ACPI_FUNCTION_TRACE (TbGetOwnerId);
786:
787:
788: (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
789: if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
790: {
791: *OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
792: Status = AE_OK;
793: }
794:
795: (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
796: return_ACPI_STATUS (Status);
797: }
798:
799:
800: /*******************************************************************************
801: *
802: * FUNCTION: AcpiTbIsTableLoaded
803: *
804: * PARAMETERS: TableIndex - Index into the root table
805: *
806: * RETURN: Table Loaded Flag
807: *
808: ******************************************************************************/
809:
810: BOOLEAN
811: AcpiTbIsTableLoaded (
812: UINT32 TableIndex)
813: {
814: BOOLEAN IsLoaded = FALSE;
815:
816:
817: (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
818: if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
819: {
820: IsLoaded = (BOOLEAN)
821: (AcpiGbl_RootTableList.Tables[TableIndex].Flags &
822: ACPI_TABLE_IS_LOADED);
823: }
824:
825: (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
826: return (IsLoaded);
827: }
828:
829:
830: /*******************************************************************************
831: *
832: * FUNCTION: AcpiTbSetTableLoadedFlag
833: *
834: * PARAMETERS: TableIndex - Table index
835: * IsLoaded - TRUE if table is loaded, FALSE otherwise
836: *
837: * RETURN: None
838: *
839: * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
840: *
841: ******************************************************************************/
842:
843: void
844: AcpiTbSetTableLoadedFlag (
845: UINT32 TableIndex,
846: BOOLEAN IsLoaded)
847: {
848:
849: (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
850: if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
851: {
852: if (IsLoaded)
853: {
854: AcpiGbl_RootTableList.Tables[TableIndex].Flags |=
855: ACPI_TABLE_IS_LOADED;
856: }
857: else
858: {
859: AcpiGbl_RootTableList.Tables[TableIndex].Flags &=
860: ~ACPI_TABLE_IS_LOADED;
861: }
862: }
863:
864: (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
865: }
1.2.2.5 skrll 866:
867:
868: /*******************************************************************************
869: *
870: * FUNCTION: AcpiTbLoadTable
871: *
872: * PARAMETERS: TableIndex - Table index
873: * ParentNode - Where table index is returned
874: *
875: * RETURN: Status
876: *
877: * DESCRIPTION: Load an ACPI table
878: *
879: ******************************************************************************/
880:
881: ACPI_STATUS
882: AcpiTbLoadTable (
883: UINT32 TableIndex,
884: ACPI_NAMESPACE_NODE *ParentNode)
885: {
886: ACPI_TABLE_HEADER *Table;
887: ACPI_STATUS Status;
888: ACPI_OWNER_ID OwnerId;
889:
890:
891: ACPI_FUNCTION_TRACE (TbLoadTable);
892:
893:
894: /*
895: * Note: Now table is "INSTALLED", it must be validated before
896: * using.
897: */
898: Status = AcpiGetTableByIndex (TableIndex, &Table);
899: if (ACPI_FAILURE (Status))
900: {
901: return_ACPI_STATUS (Status);
902: }
903:
904: Status = AcpiNsLoadTable (TableIndex, ParentNode);
905:
906: /* Execute any module-level code that was found in the table */
907:
908: if (!AcpiGbl_ParseTableAsTermList && AcpiGbl_GroupModuleLevelCode)
909: {
910: AcpiNsExecModuleCodeList ();
911: }
912:
913: /*
914: * Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is
915: * responsible for discovering any new wake GPEs by running _PRW methods
916: * that may have been loaded by this table.
917: */
918: Status = AcpiTbGetOwnerId (TableIndex, &OwnerId);
919: if (ACPI_SUCCESS (Status))
920: {
921: AcpiEvUpdateGpes (OwnerId);
922: }
923:
924: /* Invoke table handler if present */
925:
926: if (AcpiGbl_TableHandler)
927: {
928: (void) AcpiGbl_TableHandler (ACPI_TABLE_EVENT_LOAD, Table,
929: AcpiGbl_TableHandlerContext);
930: }
931:
932: return_ACPI_STATUS (Status);
933: }
934:
935:
936: /*******************************************************************************
937: *
938: * FUNCTION: AcpiTbInstallAndLoadTable
939: *
1.2.2.6 ! skrll 940: * PARAMETERS: Address - Physical address of the table
1.2.2.5 skrll 941: * Flags - Allocation flags of the table
1.2.2.6 ! skrll 942: * Override - Whether override should be performed
1.2.2.5 skrll 943: * TableIndex - Where table index is returned
944: *
945: * RETURN: Status
946: *
947: * DESCRIPTION: Install and load an ACPI table
948: *
949: ******************************************************************************/
950:
951: ACPI_STATUS
952: AcpiTbInstallAndLoadTable (
953: ACPI_PHYSICAL_ADDRESS Address,
954: UINT8 Flags,
955: BOOLEAN Override,
956: UINT32 *TableIndex)
957: {
958: ACPI_STATUS Status;
959: UINT32 i;
960:
961:
1.2.2.6 ! skrll 962: ACPI_FUNCTION_TRACE (TbInstallAndLoadTable);
1.2.2.5 skrll 963:
964:
965: (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
966:
967: /* Install the table and load it into the namespace */
968:
969: Status = AcpiTbInstallStandardTable (Address, Flags, TRUE,
970: Override, &i);
971: if (ACPI_FAILURE (Status))
972: {
973: goto UnlockAndExit;
974: }
975:
1.2.2.6 ! skrll 976: (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
! 977: Status = AcpiTbLoadTable (i, AcpiGbl_RootNode);
! 978: (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
1.2.2.5 skrll 979:
1.2.2.6 ! skrll 980: UnlockAndExit:
! 981: *TableIndex = i;
1.2.2.5 skrll 982: (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
1.2.2.6 ! skrll 983: return_ACPI_STATUS (Status);
! 984: }
1.2.2.5 skrll 985:
986:
1.2.2.6 ! skrll 987: /*******************************************************************************
! 988: *
! 989: * FUNCTION: AcpiTbUnloadTable
! 990: *
! 991: * PARAMETERS: TableIndex - Table index
! 992: *
! 993: * RETURN: Status
! 994: *
! 995: * DESCRIPTION: Unload an ACPI table
! 996: *
! 997: ******************************************************************************/
1.2.2.5 skrll 998:
1.2.2.6 ! skrll 999: ACPI_STATUS
! 1000: AcpiTbUnloadTable (
! 1001: UINT32 TableIndex)
! 1002: {
! 1003: ACPI_STATUS Status = AE_OK;
! 1004: ACPI_TABLE_HEADER *Table;
! 1005:
! 1006:
! 1007: ACPI_FUNCTION_TRACE (TbUnloadTable);
! 1008:
! 1009:
! 1010: /* Ensure the table is still loaded */
! 1011:
! 1012: if (!AcpiTbIsTableLoaded (TableIndex))
1.2.2.5 skrll 1013: {
1.2.2.6 ! skrll 1014: return_ACPI_STATUS (AE_NOT_EXIST);
1.2.2.5 skrll 1015: }
1016:
1017: /* Invoke table handler if present */
1018:
1019: if (AcpiGbl_TableHandler)
1020: {
1.2.2.6 ! skrll 1021: Status = AcpiGetTableByIndex (TableIndex, &Table);
! 1022: if (ACPI_SUCCESS (Status))
! 1023: {
! 1024: (void) AcpiGbl_TableHandler (ACPI_TABLE_EVENT_UNLOAD, Table,
! 1025: AcpiGbl_TableHandlerContext);
! 1026: }
1.2.2.5 skrll 1027: }
1028:
1.2.2.6 ! skrll 1029: /* Delete the portion of the namespace owned by this table */
! 1030:
! 1031: Status = AcpiTbDeleteNamespaceByOwner (TableIndex);
! 1032: if (ACPI_FAILURE (Status))
! 1033: {
! 1034: return_ACPI_STATUS (Status);
! 1035: }
! 1036:
! 1037: (void) AcpiTbReleaseOwnerId (TableIndex);
! 1038: AcpiTbSetTableLoadedFlag (TableIndex, FALSE);
1.2.2.5 skrll 1039: return_ACPI_STATUS (Status);
1040: }
CVSweb <webmaster@jp.NetBSD.org>