[BACK]Return to tbdata.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / external / bsd / acpica / dist / tables

Annotation of src/sys/external/bsd/acpica/dist/tables/tbdata.c, Revision 1.1

1.1     ! christos    1: /******************************************************************************
        !             2:  *
        !             3:  * Module Name: tbdata - Table manager data structure functions
        !             4:  *
        !             5:  *****************************************************************************/
        !             6:
        !             7: /*
        !             8:  * Copyright (C) 2000 - 2014, Intel Corp.
        !             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: #define __TBDATA_C__
        !            45:
        !            46: #include "acpi.h"
        !            47: #include "accommon.h"
        !            48: #include "acnamesp.h"
        !            49: #include "actables.h"
        !            50:
        !            51: #define _COMPONENT          ACPI_TABLES
        !            52:         ACPI_MODULE_NAME    ("tbdata")
        !            53:
        !            54:
        !            55: /*******************************************************************************
        !            56:  *
        !            57:  * FUNCTION:    AcpiTbInitTableDescriptor
        !            58:  *
        !            59:  * PARAMETERS:  TableDesc               - Table descriptor
        !            60:  *              Address                 - Physical address of the table
        !            61:  *              Flags                   - Allocation flags of the table
        !            62:  *              Table                   - Pointer to the table
        !            63:  *
        !            64:  * RETURN:      None
        !            65:  *
        !            66:  * DESCRIPTION: Initialize a new table descriptor
        !            67:  *
        !            68:  ******************************************************************************/
        !            69:
        !            70: void
        !            71: AcpiTbInitTableDescriptor (
        !            72:     ACPI_TABLE_DESC         *TableDesc,
        !            73:     ACPI_PHYSICAL_ADDRESS   Address,
        !            74:     UINT8                   Flags,
        !            75:     ACPI_TABLE_HEADER       *Table)
        !            76: {
        !            77:
        !            78:     /*
        !            79:      * Initialize the table descriptor. Set the pointer to NULL, since the
        !            80:      * table is not fully mapped at this time.
        !            81:      */
        !            82:     ACPI_MEMSET (TableDesc, 0, sizeof (ACPI_TABLE_DESC));
        !            83:     TableDesc->Address = Address;
        !            84:     TableDesc->Length = Table->Length;
        !            85:     TableDesc->Flags = Flags;
        !            86:     ACPI_MOVE_32_TO_32 (TableDesc->Signature.Ascii, Table->Signature);
        !            87: }
        !            88:
        !            89:
        !            90: /*******************************************************************************
        !            91:  *
        !            92:  * FUNCTION:    AcpiTbAcquireTable
        !            93:  *
        !            94:  * PARAMETERS:  TableDesc           - Table descriptor
        !            95:  *              TablePtr            - Where table is returned
        !            96:  *              TableLength         - Where table length is returned
        !            97:  *              TableFlags          - Where table allocation flags are returned
        !            98:  *
        !            99:  * RETURN:      Status
        !           100:  *
        !           101:  * DESCRIPTION: Acquire an ACPI table. It can be used for tables not
        !           102:  *              maintained in the AcpiGbl_RootTableList.
        !           103:  *
        !           104:  ******************************************************************************/
        !           105:
        !           106: ACPI_STATUS
        !           107: AcpiTbAcquireTable (
        !           108:     ACPI_TABLE_DESC         *TableDesc,
        !           109:     ACPI_TABLE_HEADER       **TablePtr,
        !           110:     UINT32                  *TableLength,
        !           111:     UINT8                   *TableFlags)
        !           112: {
        !           113:     ACPI_TABLE_HEADER       *Table = NULL;
        !           114:
        !           115:
        !           116:     switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
        !           117:     {
        !           118:     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
        !           119:
        !           120:         Table = AcpiOsMapMemory (TableDesc->Address, TableDesc->Length);
        !           121:         break;
        !           122:
        !           123:     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
        !           124:     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
        !           125:
        !           126:         Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, TableDesc->Address);
        !           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:
        !           232:         TableHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER, Address);
        !           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,
        !           306:                     &TableDesc->Length, &TableDesc->Flags);
        !           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,
        !           406:     char                    *Signature)
        !           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,
        !           442:                 "%4.4s " ACPI_PRINTF_UINT
        !           443:                 " Attempted table install failed",
        !           444:                 AcpiUtValidAcpiName (TableDesc->Signature.Ascii) ?
        !           445:                     TableDesc->Signature.Ascii : "????",
        !           446:                 ACPI_FORMAT_TO_UINT (TableDesc->Address)));
        !           447:             goto InvalidateAndExit;
        !           448:         }
        !           449:     }
        !           450:
        !           451:     return_ACPI_STATUS (AE_OK);
        !           452:
        !           453: InvalidateAndExit:
        !           454:     AcpiTbInvalidateTable (TableDesc);
        !           455:     return_ACPI_STATUS (Status);
        !           456: }
        !           457:
        !           458:
        !           459: /*******************************************************************************
        !           460:  *
        !           461:  * FUNCTION:    AcpiTbResizeRootTableList
        !           462:  *
        !           463:  * PARAMETERS:  None
        !           464:  *
        !           465:  * RETURN:      Status
        !           466:  *
        !           467:  * DESCRIPTION: Expand the size of global table array
        !           468:  *
        !           469:  ******************************************************************************/
        !           470:
        !           471: ACPI_STATUS
        !           472: AcpiTbResizeRootTableList (
        !           473:     void)
        !           474: {
        !           475:     ACPI_TABLE_DESC         *Tables;
        !           476:     UINT32                  TableCount;
        !           477:
        !           478:
        !           479:     ACPI_FUNCTION_TRACE (TbResizeRootTableList);
        !           480:
        !           481:
        !           482:     /* AllowResize flag is a parameter to AcpiInitializeTables */
        !           483:
        !           484:     if (!(AcpiGbl_RootTableList.Flags & ACPI_ROOT_ALLOW_RESIZE))
        !           485:     {
        !           486:         ACPI_ERROR ((AE_INFO, "Resize of Root Table Array is not allowed"));
        !           487:         return_ACPI_STATUS (AE_SUPPORT);
        !           488:     }
        !           489:
        !           490:     /* Increase the Table Array size */
        !           491:
        !           492:     if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
        !           493:     {
        !           494:         TableCount = AcpiGbl_RootTableList.MaxTableCount;
        !           495:     }
        !           496:     else
        !           497:     {
        !           498:         TableCount = AcpiGbl_RootTableList.CurrentTableCount;
        !           499:     }
        !           500:
        !           501:     Tables = ACPI_ALLOCATE_ZEROED (
        !           502:         ((ACPI_SIZE) TableCount + ACPI_ROOT_TABLE_SIZE_INCREMENT) *
        !           503:         sizeof (ACPI_TABLE_DESC));
        !           504:     if (!Tables)
        !           505:     {
        !           506:         ACPI_ERROR ((AE_INFO, "Could not allocate new root table array"));
        !           507:         return_ACPI_STATUS (AE_NO_MEMORY);
        !           508:     }
        !           509:
        !           510:     /* Copy and free the previous table array */
        !           511:
        !           512:     if (AcpiGbl_RootTableList.Tables)
        !           513:     {
        !           514:         ACPI_MEMCPY (Tables, AcpiGbl_RootTableList.Tables,
        !           515:             (ACPI_SIZE) TableCount * sizeof (ACPI_TABLE_DESC));
        !           516:
        !           517:         if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
        !           518:         {
        !           519:             ACPI_FREE (AcpiGbl_RootTableList.Tables);
        !           520:         }
        !           521:     }
        !           522:
        !           523:     AcpiGbl_RootTableList.Tables = Tables;
        !           524:     AcpiGbl_RootTableList.MaxTableCount =
        !           525:         TableCount + ACPI_ROOT_TABLE_SIZE_INCREMENT;
        !           526:     AcpiGbl_RootTableList.Flags |= ACPI_ROOT_ORIGIN_ALLOCATED;
        !           527:
        !           528:     return_ACPI_STATUS (AE_OK);
        !           529: }
        !           530:
        !           531:
        !           532: /*******************************************************************************
        !           533:  *
        !           534:  * FUNCTION:    AcpiTbGetNextRootIndex
        !           535:  *
        !           536:  * PARAMETERS:  TableIndex          - Where table index is returned
        !           537:  *
        !           538:  * RETURN:      Status and table index.
        !           539:  *
        !           540:  * DESCRIPTION: Allocate a new ACPI table entry to the global table list
        !           541:  *
        !           542:  ******************************************************************************/
        !           543:
        !           544: ACPI_STATUS
        !           545: AcpiTbGetNextRootIndex (
        !           546:     UINT32                  *TableIndex)
        !           547: {
        !           548:     ACPI_STATUS             Status;
        !           549:
        !           550:
        !           551:     /* Ensure that there is room for the table in the Root Table List */
        !           552:
        !           553:     if (AcpiGbl_RootTableList.CurrentTableCount >=
        !           554:         AcpiGbl_RootTableList.MaxTableCount)
        !           555:     {
        !           556:         Status = AcpiTbResizeRootTableList();
        !           557:         if (ACPI_FAILURE (Status))
        !           558:         {
        !           559:             return (Status);
        !           560:         }
        !           561:     }
        !           562:
        !           563:     *TableIndex = AcpiGbl_RootTableList.CurrentTableCount;
        !           564:     AcpiGbl_RootTableList.CurrentTableCount++;
        !           565:     return (AE_OK);
        !           566: }
        !           567:
        !           568:
        !           569: /*******************************************************************************
        !           570:  *
        !           571:  * FUNCTION:    AcpiTbTerminate
        !           572:  *
        !           573:  * PARAMETERS:  None
        !           574:  *
        !           575:  * RETURN:      None
        !           576:  *
        !           577:  * DESCRIPTION: Delete all internal ACPI tables
        !           578:  *
        !           579:  ******************************************************************************/
        !           580:
        !           581: void
        !           582: AcpiTbTerminate (
        !           583:     void)
        !           584: {
        !           585:     UINT32                  i;
        !           586:
        !           587:
        !           588:     ACPI_FUNCTION_TRACE (TbTerminate);
        !           589:
        !           590:
        !           591:     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
        !           592:
        !           593:     /* Delete the individual tables */
        !           594:
        !           595:     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
        !           596:     {
        !           597:         AcpiTbUninstallTable (&AcpiGbl_RootTableList.Tables[i]);
        !           598:     }
        !           599:
        !           600:     /*
        !           601:      * Delete the root table array if allocated locally. Array cannot be
        !           602:      * mapped, so we don't need to check for that flag.
        !           603:      */
        !           604:     if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
        !           605:     {
        !           606:         ACPI_FREE (AcpiGbl_RootTableList.Tables);
        !           607:     }
        !           608:
        !           609:     AcpiGbl_RootTableList.Tables = NULL;
        !           610:     AcpiGbl_RootTableList.Flags = 0;
        !           611:     AcpiGbl_RootTableList.CurrentTableCount = 0;
        !           612:
        !           613:     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ACPI Tables freed\n"));
        !           614:
        !           615:     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
        !           616:     return_VOID;
        !           617: }
        !           618:
        !           619:
        !           620: /*******************************************************************************
        !           621:  *
        !           622:  * FUNCTION:    AcpiTbDeleteNamespaceByOwner
        !           623:  *
        !           624:  * PARAMETERS:  TableIndex          - Table index
        !           625:  *
        !           626:  * RETURN:      Status
        !           627:  *
        !           628:  * DESCRIPTION: Delete all namespace objects created when this table was loaded.
        !           629:  *
        !           630:  ******************************************************************************/
        !           631:
        !           632: ACPI_STATUS
        !           633: AcpiTbDeleteNamespaceByOwner (
        !           634:     UINT32                  TableIndex)
        !           635: {
        !           636:     ACPI_OWNER_ID           OwnerId;
        !           637:     ACPI_STATUS             Status;
        !           638:
        !           639:
        !           640:     ACPI_FUNCTION_TRACE (TbDeleteNamespaceByOwner);
        !           641:
        !           642:
        !           643:     Status = AcpiUtAcquireMutex (ACPI_MTX_TABLES);
        !           644:     if (ACPI_FAILURE (Status))
        !           645:     {
        !           646:         return_ACPI_STATUS (Status);
        !           647:     }
        !           648:
        !           649:     if (TableIndex >= AcpiGbl_RootTableList.CurrentTableCount)
        !           650:     {
        !           651:         /* The table index does not exist */
        !           652:
        !           653:         (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
        !           654:         return_ACPI_STATUS (AE_NOT_EXIST);
        !           655:     }
        !           656:
        !           657:     /* Get the owner ID for this table, used to delete namespace nodes */
        !           658:
        !           659:     OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
        !           660:     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
        !           661:
        !           662:     /*
        !           663:      * Need to acquire the namespace writer lock to prevent interference
        !           664:      * with any concurrent namespace walks. The interpreter must be
        !           665:      * released during the deletion since the acquisition of the deletion
        !           666:      * lock may block, and also since the execution of a namespace walk
        !           667:      * must be allowed to use the interpreter.
        !           668:      */
        !           669:     (void) AcpiUtReleaseMutex (ACPI_MTX_INTERPRETER);
        !           670:     Status = AcpiUtAcquireWriteLock (&AcpiGbl_NamespaceRwLock);
        !           671:
        !           672:     AcpiNsDeleteNamespaceByOwner (OwnerId);
        !           673:     if (ACPI_FAILURE (Status))
        !           674:     {
        !           675:         return_ACPI_STATUS (Status);
        !           676:     }
        !           677:
        !           678:     AcpiUtReleaseWriteLock (&AcpiGbl_NamespaceRwLock);
        !           679:
        !           680:     Status = AcpiUtAcquireMutex (ACPI_MTX_INTERPRETER);
        !           681:     return_ACPI_STATUS (Status);
        !           682: }
        !           683:
        !           684:
        !           685: /*******************************************************************************
        !           686:  *
        !           687:  * FUNCTION:    AcpiTbAllocateOwnerId
        !           688:  *
        !           689:  * PARAMETERS:  TableIndex          - Table index
        !           690:  *
        !           691:  * RETURN:      Status
        !           692:  *
        !           693:  * DESCRIPTION: Allocates OwnerId in TableDesc
        !           694:  *
        !           695:  ******************************************************************************/
        !           696:
        !           697: ACPI_STATUS
        !           698: AcpiTbAllocateOwnerId (
        !           699:     UINT32                  TableIndex)
        !           700: {
        !           701:     ACPI_STATUS             Status = AE_BAD_PARAMETER;
        !           702:
        !           703:
        !           704:     ACPI_FUNCTION_TRACE (TbAllocateOwnerId);
        !           705:
        !           706:
        !           707:     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
        !           708:     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
        !           709:     {
        !           710:         Status = AcpiUtAllocateOwnerId (
        !           711:                     &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
        !           712:     }
        !           713:
        !           714:     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
        !           715:     return_ACPI_STATUS (Status);
        !           716: }
        !           717:
        !           718:
        !           719: /*******************************************************************************
        !           720:  *
        !           721:  * FUNCTION:    AcpiTbReleaseOwnerId
        !           722:  *
        !           723:  * PARAMETERS:  TableIndex          - Table index
        !           724:  *
        !           725:  * RETURN:      Status
        !           726:  *
        !           727:  * DESCRIPTION: Releases OwnerId in TableDesc
        !           728:  *
        !           729:  ******************************************************************************/
        !           730:
        !           731: ACPI_STATUS
        !           732: AcpiTbReleaseOwnerId (
        !           733:     UINT32                  TableIndex)
        !           734: {
        !           735:     ACPI_STATUS             Status = AE_BAD_PARAMETER;
        !           736:
        !           737:
        !           738:     ACPI_FUNCTION_TRACE (TbReleaseOwnerId);
        !           739:
        !           740:
        !           741:     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
        !           742:     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
        !           743:     {
        !           744:         AcpiUtReleaseOwnerId (
        !           745:             &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
        !           746:         Status = AE_OK;
        !           747:     }
        !           748:
        !           749:     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
        !           750:     return_ACPI_STATUS (Status);
        !           751: }
        !           752:
        !           753:
        !           754: /*******************************************************************************
        !           755:  *
        !           756:  * FUNCTION:    AcpiTbGetOwnerId
        !           757:  *
        !           758:  * PARAMETERS:  TableIndex          - Table index
        !           759:  *              OwnerId             - Where the table OwnerId is returned
        !           760:  *
        !           761:  * RETURN:      Status
        !           762:  *
        !           763:  * DESCRIPTION: returns OwnerId for the ACPI table
        !           764:  *
        !           765:  ******************************************************************************/
        !           766:
        !           767: ACPI_STATUS
        !           768: AcpiTbGetOwnerId (
        !           769:     UINT32                  TableIndex,
        !           770:     ACPI_OWNER_ID           *OwnerId)
        !           771: {
        !           772:     ACPI_STATUS             Status = AE_BAD_PARAMETER;
        !           773:
        !           774:
        !           775:     ACPI_FUNCTION_TRACE (TbGetOwnerId);
        !           776:
        !           777:
        !           778:     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
        !           779:     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
        !           780:     {
        !           781:         *OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
        !           782:         Status = AE_OK;
        !           783:     }
        !           784:
        !           785:     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
        !           786:     return_ACPI_STATUS (Status);
        !           787: }
        !           788:
        !           789:
        !           790: /*******************************************************************************
        !           791:  *
        !           792:  * FUNCTION:    AcpiTbIsTableLoaded
        !           793:  *
        !           794:  * PARAMETERS:  TableIndex          - Index into the root table
        !           795:  *
        !           796:  * RETURN:      Table Loaded Flag
        !           797:  *
        !           798:  ******************************************************************************/
        !           799:
        !           800: BOOLEAN
        !           801: AcpiTbIsTableLoaded (
        !           802:     UINT32                  TableIndex)
        !           803: {
        !           804:     BOOLEAN                 IsLoaded = FALSE;
        !           805:
        !           806:
        !           807:     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
        !           808:     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
        !           809:     {
        !           810:         IsLoaded = (BOOLEAN)
        !           811:             (AcpiGbl_RootTableList.Tables[TableIndex].Flags &
        !           812:             ACPI_TABLE_IS_LOADED);
        !           813:     }
        !           814:
        !           815:     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
        !           816:     return (IsLoaded);
        !           817: }
        !           818:
        !           819:
        !           820: /*******************************************************************************
        !           821:  *
        !           822:  * FUNCTION:    AcpiTbSetTableLoadedFlag
        !           823:  *
        !           824:  * PARAMETERS:  TableIndex          - Table index
        !           825:  *              IsLoaded            - TRUE if table is loaded, FALSE otherwise
        !           826:  *
        !           827:  * RETURN:      None
        !           828:  *
        !           829:  * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
        !           830:  *
        !           831:  ******************************************************************************/
        !           832:
        !           833: void
        !           834: AcpiTbSetTableLoadedFlag (
        !           835:     UINT32                  TableIndex,
        !           836:     BOOLEAN                 IsLoaded)
        !           837: {
        !           838:
        !           839:     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
        !           840:     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
        !           841:     {
        !           842:         if (IsLoaded)
        !           843:         {
        !           844:             AcpiGbl_RootTableList.Tables[TableIndex].Flags |=
        !           845:                 ACPI_TABLE_IS_LOADED;
        !           846:         }
        !           847:         else
        !           848:         {
        !           849:             AcpiGbl_RootTableList.Tables[TableIndex].Flags &=
        !           850:                 ~ACPI_TABLE_IS_LOADED;
        !           851:         }
        !           852:     }
        !           853:
        !           854:     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
        !           855: }

CVSweb <webmaster@jp.NetBSD.org>