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