11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/****************************************************************************** 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: tbinstal - ACPI table installation and removal 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *****************************************************************************/ 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 877848130e53b06c22fe37a7b6acbb82bb3e9bfbaBob Moore * Copyright (C) 2000 - 2012, Intel Corp. 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * All rights reserved. 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Redistribution and use in source and binary forms, with or without 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modification, are permitted provided that the following conditions 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are met: 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1. Redistributions of source code must retain the above copyright 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * notice, this list of conditions, and the following disclaimer, 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * without modification. 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2. Redistributions in binary form must reproduce at minimum a disclaimer 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * substantially similar to the "NO WARRANTY" disclaimer below 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ("Disclaimer") and any redistribution must be conditioned upon 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * including a substantially similar Disclaimer requirement for further 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * binary redistribution. 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3. Neither the names of the above-listed copyright holders nor the names 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of any contributors may be used to endorse or promote products derived 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * from this software without specific prior written permission. 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alternatively, this software may be distributed under the terms of the 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License ("GPL") version 2 as published by the Free 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Software Foundation. 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NO WARRANTY 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * POSSIBILITY OF SUCH DAMAGES. 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <acpi/acpi.h> 45e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "accommon.h" 46e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acnamesp.h" 47e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "actables.h" 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPONENT ACPI_TABLES 504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen BrownACPI_MODULE_NAME("tbinstal") 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 52f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore/****************************************************************************** 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 54f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * FUNCTION: acpi_tb_verify_table 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 56f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * PARAMETERS: table_desc - table 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 60f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * DESCRIPTION: this function is called to verify and map table 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 62f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore *****************************************************************************/ 63f3d2e7865c816258c699ff965768e46b50d536d3Bob Mooreacpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc) 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 65428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy acpi_status status = AE_OK; 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 67f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_FUNCTION_TRACE(tb_verify_table); 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 69f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore /* Map the table if necessary */ 7044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 71f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (!table_desc->pointer) { 72428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy if ((table_desc->flags & ACPI_TABLE_ORIGIN_MASK) == 73428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy ACPI_TABLE_ORIGIN_MAPPED) { 74428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy table_desc->pointer = 75428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy acpi_os_map_memory(table_desc->address, 76428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy table_desc->length); 77428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy } 78f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (!table_desc->pointer) { 79f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore return_ACPI_STATUS(AE_NO_MEMORY); 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 81f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 83f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore /* FACS is the odd table, has no standard ACPI header and no checksum */ 8452fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 85428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy if (!ACPI_COMPARE_NAME(&table_desc->signature, ACPI_SIG_FACS)) { 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 87428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy /* Always calculate checksum, ignore bad checksum if requested */ 88428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy 89428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy status = 90428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy acpi_tb_verify_checksum(table_desc->pointer, 91428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy table_desc->length); 92428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy } 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 94c5fc42ac4d4d6d3e3f619290b86890cb3725d2f8Bob Moore return_ACPI_STATUS(status); 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 99f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * FUNCTION: acpi_tb_add_table 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 101428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy * PARAMETERS: table_desc - Table descriptor 102f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * table_index - Where the table index is returned 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 106d3ccaff827cef5a5c5a0f3c97e1e2e6d99f618cbBob Moore * DESCRIPTION: This function is called to add an ACPI table. It is used to 107d3ccaff827cef5a5c5a0f3c97e1e2e6d99f618cbBob Moore * dynamically load tables via the Load and load_table AML 108d3ccaff827cef5a5c5a0f3c97e1e2e6d99f618cbBob Moore * operators. 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 112f3d2e7865c816258c699ff965768e46b50d536d3Bob Mooreacpi_status 11367a119f990063f5662574f6d6414fe9bc5ece86aBob Mooreacpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index) 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11567a119f990063f5662574f6d6414fe9bc5ece86aBob Moore u32 i; 116f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_status status = AE_OK; 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 118f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_FUNCTION_TRACE(tb_add_table); 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 120428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy if (!table_desc->pointer) { 121428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy status = acpi_tb_verify_table(table_desc); 122428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy if (ACPI_FAILURE(status) || !table_desc->pointer) { 123428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy return_ACPI_STATUS(status); 124428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy } 125428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy } 126428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy 127bc45b1d39a925b56796bebf8a397a0491489d85cBob Moore /* 128c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore * Validate the incoming table signature. 129c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore * 130c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore * 1) Originally, we checked the table signature for "SSDT" or "PSDT". 131c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore * 2) We added support for OEMx tables, signature "OEM". 132c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore * 3) Valid tables were encountered with a null signature, so we just 133c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore * gave up on validating the signature, (05/2008). 134c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore * 4) We encountered non-AML tables such as the MADT, which caused 135c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore * interpreter errors and kernel faults. So now, we once again allow 136c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore * only "SSDT", "OEMx", and now, also a null signature. (05/2011). 137bc45b1d39a925b56796bebf8a397a0491489d85cBob Moore */ 138c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore if ((table_desc->pointer->signature[0] != 0x00) && 139c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT)) 140c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore && (ACPI_STRNCMP(table_desc->pointer->signature, "OEM", 3))) { 141c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore ACPI_ERROR((AE_INFO, 142c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore "Table has invalid signature [%4.4s] (0x%8.8X), must be SSDT or OEMx", 143c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore acpi_ut_valid_acpi_name(*(u32 *)table_desc-> 144c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore pointer-> 145c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore signature) ? table_desc-> 146c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore pointer->signature : "????", 147c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore *(u32 *)table_desc->pointer->signature)); 148c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore 149c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore return_ACPI_STATUS(AE_BAD_SIGNATURE); 150c8cefe307d79c57b32ca1d4c9ebff528f8dd914cBob Moore } 151428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy 152f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 154f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore /* Check if table is already registered */ 155f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 156b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) { 157f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (!acpi_gbl_root_table_list.tables[i].pointer) { 158f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore status = 159f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_tb_verify_table(&acpi_gbl_root_table_list. 160f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore tables[i]); 161f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (ACPI_FAILURE(status) 162f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore || !acpi_gbl_root_table_list.tables[i].pointer) { 163f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore continue; 164f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } 165f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } 166f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 167a6f30539f31a8129288b0e5640d3eb1174848c15Bob Moore /* 168a6f30539f31a8129288b0e5640d3eb1174848c15Bob Moore * Check for a table match on the entire table length, 169a6f30539f31a8129288b0e5640d3eb1174848c15Bob Moore * not just the header. 170a6f30539f31a8129288b0e5640d3eb1174848c15Bob Moore */ 171a6f30539f31a8129288b0e5640d3eb1174848c15Bob Moore if (table_desc->length != 172a6f30539f31a8129288b0e5640d3eb1174848c15Bob Moore acpi_gbl_root_table_list.tables[i].length) { 173a6f30539f31a8129288b0e5640d3eb1174848c15Bob Moore continue; 174a6f30539f31a8129288b0e5640d3eb1174848c15Bob Moore } 175e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore 176428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy if (ACPI_MEMCMP(table_desc->pointer, 177428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy acpi_gbl_root_table_list.tables[i].pointer, 178a6f30539f31a8129288b0e5640d3eb1174848c15Bob Moore acpi_gbl_root_table_list.tables[i].length)) { 179f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore continue; 180f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } 181f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 182e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore /* 183e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * Note: the current mechanism does not unregister a table if it is 184e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * dynamically unloaded. The related namespace entries are deleted, 185e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * but the table remains in the root table list. 186e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * 187e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * The assumption here is that the number of different tables that 188e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * will be loaded is actually small, and there is minimal overhead 189e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * in just keeping the table in case it is needed again. 190e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * 191e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * If this assumption changes in the future (perhaps on large 192e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * machines with many table load/unload operations), tables will 193e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * need to be unregistered when they are unloaded, and slots in the 194e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * root table list should be reused when empty. 195e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore */ 196e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore 197e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore /* 198e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * Table is already registered. 199e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore * We can delete the table that was passed as a parameter. 200e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore */ 201428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy acpi_tb_delete_table(table_desc); 202f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore *table_index = i; 203e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore 204e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore if (acpi_gbl_root_table_list.tables[i]. 205e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore flags & ACPI_TABLE_IS_LOADED) { 206e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore 207e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore /* Table is still loaded, this is an error */ 208e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore 209e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore status = AE_ALREADY_EXISTS; 210e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore goto release; 211e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore } else { 212e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore /* Table was unloaded, allow it to be reloaded */ 213e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore 214e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore table_desc->pointer = 215e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore acpi_gbl_root_table_list.tables[i].pointer; 216e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore table_desc->address = 217e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore acpi_gbl_root_table_list.tables[i].address; 218e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore status = AE_OK; 219e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore goto print_header; 220e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore } 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 223d3ccaff827cef5a5c5a0f3c97e1e2e6d99f618cbBob Moore /* 224d3ccaff827cef5a5c5a0f3c97e1e2e6d99f618cbBob Moore * ACPI Table Override: 225d3ccaff827cef5a5c5a0f3c97e1e2e6d99f618cbBob Moore * Allow the host to override dynamically loaded tables. 226f7b004a17c9183f023796dea0d70284684ec000dBob Moore * NOTE: the table is fully mapped at this point, and the mapping will 227f7b004a17c9183f023796dea0d70284684ec000dBob Moore * be deleted by tb_table_override if the table is actually overridden. 228d3ccaff827cef5a5c5a0f3c97e1e2e6d99f618cbBob Moore */ 229f7b004a17c9183f023796dea0d70284684ec000dBob Moore (void)acpi_tb_table_override(table_desc->pointer, table_desc); 230d3ccaff827cef5a5c5a0f3c97e1e2e6d99f618cbBob Moore 231e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore /* Add the table to the global root table list */ 232e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore 233428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy status = acpi_tb_store_table(table_desc->address, table_desc->pointer, 234428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy table_desc->length, table_desc->flags, 235428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy table_index); 2364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 237f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore goto release; 2380c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore } 2390c9938cc75057c0fca1af55a55dcfc2842436695Robert Moore 240e56f561736e340a4e923b0db65f65dabf5d94823Bob Moore print_header: 241428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy acpi_tb_print_table_header(table_desc->address, table_desc->pointer); 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 243f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore release: 2444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); 2454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 250f7b004a17c9183f023796dea0d70284684ec000dBob Moore * FUNCTION: acpi_tb_table_override 251f7b004a17c9183f023796dea0d70284684ec000dBob Moore * 252f7b004a17c9183f023796dea0d70284684ec000dBob Moore * PARAMETERS: table_header - Header for the original table 253f7b004a17c9183f023796dea0d70284684ec000dBob Moore * table_desc - Table descriptor initialized for the 254f7b004a17c9183f023796dea0d70284684ec000dBob Moore * original table. May or may not be mapped. 255f7b004a17c9183f023796dea0d70284684ec000dBob Moore * 256f7b004a17c9183f023796dea0d70284684ec000dBob Moore * RETURN: Pointer to the entire new table. NULL if table not overridden. 257f7b004a17c9183f023796dea0d70284684ec000dBob Moore * If overridden, installs the new table within the input table 258f7b004a17c9183f023796dea0d70284684ec000dBob Moore * descriptor. 259f7b004a17c9183f023796dea0d70284684ec000dBob Moore * 260f7b004a17c9183f023796dea0d70284684ec000dBob Moore * DESCRIPTION: Attempt table override by calling the OSL override functions. 261f7b004a17c9183f023796dea0d70284684ec000dBob Moore * Note: If the table is overridden, then the entire new table 262f7b004a17c9183f023796dea0d70284684ec000dBob Moore * is mapped and returned by this function. 263f7b004a17c9183f023796dea0d70284684ec000dBob Moore * 264f7b004a17c9183f023796dea0d70284684ec000dBob Moore ******************************************************************************/ 265f7b004a17c9183f023796dea0d70284684ec000dBob Moore 266f7b004a17c9183f023796dea0d70284684ec000dBob Moorestruct acpi_table_header *acpi_tb_table_override(struct acpi_table_header 267f7b004a17c9183f023796dea0d70284684ec000dBob Moore *table_header, 268f7b004a17c9183f023796dea0d70284684ec000dBob Moore struct acpi_table_desc 269f7b004a17c9183f023796dea0d70284684ec000dBob Moore *table_desc) 270f7b004a17c9183f023796dea0d70284684ec000dBob Moore{ 271f7b004a17c9183f023796dea0d70284684ec000dBob Moore acpi_status status; 272f7b004a17c9183f023796dea0d70284684ec000dBob Moore struct acpi_table_header *new_table = NULL; 273f7b004a17c9183f023796dea0d70284684ec000dBob Moore acpi_physical_address new_address = 0; 274f7b004a17c9183f023796dea0d70284684ec000dBob Moore u32 new_table_length = 0; 275f7b004a17c9183f023796dea0d70284684ec000dBob Moore u8 new_flags; 276f7b004a17c9183f023796dea0d70284684ec000dBob Moore char *override_type; 277f7b004a17c9183f023796dea0d70284684ec000dBob Moore 278f7b004a17c9183f023796dea0d70284684ec000dBob Moore /* (1) Attempt logical override (returns a logical address) */ 279f7b004a17c9183f023796dea0d70284684ec000dBob Moore 280f7b004a17c9183f023796dea0d70284684ec000dBob Moore status = acpi_os_table_override(table_header, &new_table); 281f7b004a17c9183f023796dea0d70284684ec000dBob Moore if (ACPI_SUCCESS(status) && new_table) { 282f7b004a17c9183f023796dea0d70284684ec000dBob Moore new_address = ACPI_PTR_TO_PHYSADDR(new_table); 283f7b004a17c9183f023796dea0d70284684ec000dBob Moore new_table_length = new_table->length; 284f7b004a17c9183f023796dea0d70284684ec000dBob Moore new_flags = ACPI_TABLE_ORIGIN_OVERRIDE; 285f7b004a17c9183f023796dea0d70284684ec000dBob Moore override_type = "Logical"; 286f7b004a17c9183f023796dea0d70284684ec000dBob Moore goto finish_override; 287f7b004a17c9183f023796dea0d70284684ec000dBob Moore } 288f7b004a17c9183f023796dea0d70284684ec000dBob Moore 289f7b004a17c9183f023796dea0d70284684ec000dBob Moore /* (2) Attempt physical override (returns a physical address) */ 290f7b004a17c9183f023796dea0d70284684ec000dBob Moore 291f7b004a17c9183f023796dea0d70284684ec000dBob Moore status = acpi_os_physical_table_override(table_header, 292f7b004a17c9183f023796dea0d70284684ec000dBob Moore &new_address, 293f7b004a17c9183f023796dea0d70284684ec000dBob Moore &new_table_length); 294f7b004a17c9183f023796dea0d70284684ec000dBob Moore if (ACPI_SUCCESS(status) && new_address && new_table_length) { 295f7b004a17c9183f023796dea0d70284684ec000dBob Moore 296f7b004a17c9183f023796dea0d70284684ec000dBob Moore /* Map the entire new table */ 297f7b004a17c9183f023796dea0d70284684ec000dBob Moore 298f7b004a17c9183f023796dea0d70284684ec000dBob Moore new_table = acpi_os_map_memory(new_address, new_table_length); 299f7b004a17c9183f023796dea0d70284684ec000dBob Moore if (!new_table) { 300f7b004a17c9183f023796dea0d70284684ec000dBob Moore ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY, 301f7b004a17c9183f023796dea0d70284684ec000dBob Moore "%4.4s %p Attempted physical table override failed", 302f7b004a17c9183f023796dea0d70284684ec000dBob Moore table_header->signature, 303f7b004a17c9183f023796dea0d70284684ec000dBob Moore ACPI_CAST_PTR(void, 304f7b004a17c9183f023796dea0d70284684ec000dBob Moore table_desc->address))); 305f7b004a17c9183f023796dea0d70284684ec000dBob Moore return (NULL); 306f7b004a17c9183f023796dea0d70284684ec000dBob Moore } 307f7b004a17c9183f023796dea0d70284684ec000dBob Moore 308f7b004a17c9183f023796dea0d70284684ec000dBob Moore override_type = "Physical"; 309f7b004a17c9183f023796dea0d70284684ec000dBob Moore new_flags = ACPI_TABLE_ORIGIN_MAPPED; 310f7b004a17c9183f023796dea0d70284684ec000dBob Moore goto finish_override; 311f7b004a17c9183f023796dea0d70284684ec000dBob Moore } 312f7b004a17c9183f023796dea0d70284684ec000dBob Moore 313f7b004a17c9183f023796dea0d70284684ec000dBob Moore return (NULL); /* There was no override */ 314f7b004a17c9183f023796dea0d70284684ec000dBob Moore 315f7b004a17c9183f023796dea0d70284684ec000dBob Moore finish_override: 316f7b004a17c9183f023796dea0d70284684ec000dBob Moore 317f7b004a17c9183f023796dea0d70284684ec000dBob Moore ACPI_INFO((AE_INFO, 318f7b004a17c9183f023796dea0d70284684ec000dBob Moore "%4.4s %p %s table override, new table: %p", 319f7b004a17c9183f023796dea0d70284684ec000dBob Moore table_header->signature, 320f7b004a17c9183f023796dea0d70284684ec000dBob Moore ACPI_CAST_PTR(void, table_desc->address), 321f7b004a17c9183f023796dea0d70284684ec000dBob Moore override_type, new_table)); 322f7b004a17c9183f023796dea0d70284684ec000dBob Moore 323f7b004a17c9183f023796dea0d70284684ec000dBob Moore /* We can now unmap/delete the original table (if fully mapped) */ 324f7b004a17c9183f023796dea0d70284684ec000dBob Moore 325f7b004a17c9183f023796dea0d70284684ec000dBob Moore acpi_tb_delete_table(table_desc); 326f7b004a17c9183f023796dea0d70284684ec000dBob Moore 327f7b004a17c9183f023796dea0d70284684ec000dBob Moore /* Setup descriptor for the new table */ 328f7b004a17c9183f023796dea0d70284684ec000dBob Moore 329f7b004a17c9183f023796dea0d70284684ec000dBob Moore table_desc->address = new_address; 330f7b004a17c9183f023796dea0d70284684ec000dBob Moore table_desc->pointer = new_table; 331f7b004a17c9183f023796dea0d70284684ec000dBob Moore table_desc->length = new_table_length; 332f7b004a17c9183f023796dea0d70284684ec000dBob Moore table_desc->flags = new_flags; 333f7b004a17c9183f023796dea0d70284684ec000dBob Moore 334f7b004a17c9183f023796dea0d70284684ec000dBob Moore return (new_table); 335f7b004a17c9183f023796dea0d70284684ec000dBob Moore} 336f7b004a17c9183f023796dea0d70284684ec000dBob Moore 337f7b004a17c9183f023796dea0d70284684ec000dBob Moore/******************************************************************************* 338f7b004a17c9183f023796dea0d70284684ec000dBob Moore * 339f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * FUNCTION: acpi_tb_resize_root_table_list 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 341f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * PARAMETERS: None 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 345f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * DESCRIPTION: Expand the size of global table array 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 349f3d2e7865c816258c699ff965768e46b50d536d3Bob Mooreacpi_status acpi_tb_resize_root_table_list(void) 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 351f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore struct acpi_table_desc *tables; 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 353f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_FUNCTION_TRACE(tb_resize_root_table_list); 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 355f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore /* allow_resize flag is a parameter to acpi_initialize_tables */ 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 357c5fc42ac4d4d6d3e3f619290b86890cb3725d2f8Bob Moore if (!(acpi_gbl_root_table_list.flags & ACPI_ROOT_ALLOW_RESIZE)) { 358f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_ERROR((AE_INFO, 359f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore "Resize of Root Table Array is not allowed")); 360f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore return_ACPI_STATUS(AE_SUPPORT); 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 363f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore /* Increase the Table Array size */ 364f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 36567a119f990063f5662574f6d6414fe9bc5ece86aBob Moore tables = ACPI_ALLOCATE_ZEROED(((acpi_size) acpi_gbl_root_table_list. 366b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore max_table_count + 367ec41f193eadb6301f3c052b5e0dbc0b5636982e8Bob Moore ACPI_ROOT_TABLE_SIZE_INCREMENT) * 368ec41f193eadb6301f3c052b5e0dbc0b5636982e8Bob Moore sizeof(struct acpi_table_desc)); 369f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (!tables) { 370f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_ERROR((AE_INFO, 371f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore "Could not allocate new root table array")); 372f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore return_ACPI_STATUS(AE_NO_MEMORY); 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 375f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore /* Copy and free the previous table array */ 376f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 377f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (acpi_gbl_root_table_list.tables) { 378f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_MEMCPY(tables, acpi_gbl_root_table_list.tables, 379b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore (acpi_size) acpi_gbl_root_table_list. 380b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore max_table_count * sizeof(struct acpi_table_desc)); 381f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 382c5fc42ac4d4d6d3e3f619290b86890cb3725d2f8Bob Moore if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) { 383f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_FREE(acpi_gbl_root_table_list.tables); 384f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 387f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_gbl_root_table_list.tables = tables; 388b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore acpi_gbl_root_table_list.max_table_count += 389b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore ACPI_ROOT_TABLE_SIZE_INCREMENT; 390b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore acpi_gbl_root_table_list.flags |= (u8)ACPI_ROOT_ORIGIN_ALLOCATED; 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 392f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore return_ACPI_STATUS(AE_OK); 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 397f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * FUNCTION: acpi_tb_store_table 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 399f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * PARAMETERS: Address - Table address 400f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * Table - Table header 401f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * Length - Table length 402f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * Flags - flags 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 404f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * RETURN: Status and table index. 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 406f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * DESCRIPTION: Add an ACPI table to the global table list 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 411f3d2e7865c816258c699ff965768e46b50d536d3Bob Mooreacpi_tb_store_table(acpi_physical_address address, 412f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore struct acpi_table_header *table, 41367a119f990063f5662574f6d6414fe9bc5ece86aBob Moore u32 length, u8 flags, u32 *table_index) 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 415b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore acpi_status status; 416b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore struct acpi_table_desc *new_table; 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 418f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore /* Ensure that there is room for the table in the Root Table List */ 419f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 420b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore if (acpi_gbl_root_table_list.current_table_count >= 421b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore acpi_gbl_root_table_list.max_table_count) { 422f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore status = acpi_tb_resize_root_table_list(); 423f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (ACPI_FAILURE(status)) { 424f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore return (status); 425f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } 426f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore } 427f9f4601f331aa1226d7a798a01950efbb388f07fRobert Moore 428b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore new_table = 429b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore &acpi_gbl_root_table_list.tables[acpi_gbl_root_table_list. 430b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore current_table_count]; 431b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore 432f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore /* Initialize added table */ 433f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 434b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore new_table->address = address; 435b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore new_table->pointer = table; 436b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore new_table->length = length; 437b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore new_table->owner_id = 0; 438b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore new_table->flags = flags; 439b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore 440b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore ACPI_MOVE_32_TO_32(&new_table->signature, table->signature); 441b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore 442b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore *table_index = acpi_gbl_root_table_list.current_table_count; 443b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore acpi_gbl_root_table_list.current_table_count++; 444b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore return (AE_OK); 445f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore} 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 447f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore/******************************************************************************* 448f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 449f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * FUNCTION: acpi_tb_delete_table 450f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 451f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * PARAMETERS: table_index - Table index 452f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 453f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * RETURN: None 454f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 455f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * DESCRIPTION: Delete one internal ACPI table 456f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 457f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ******************************************************************************/ 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 459428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiyvoid acpi_tb_delete_table(struct acpi_table_desc *table_desc) 460f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore{ 461f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore /* Table must be mapped or allocated */ 462f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (!table_desc->pointer) { 463f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore return; 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 465428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy switch (table_desc->flags & ACPI_TABLE_ORIGIN_MASK) { 466428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy case ACPI_TABLE_ORIGIN_MAPPED: 467428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy acpi_os_unmap_memory(table_desc->pointer, table_desc->length); 468428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy break; 469428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy case ACPI_TABLE_ORIGIN_ALLOCATED: 470f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_FREE(table_desc->pointer); 471428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy break; 472f7b004a17c9183f023796dea0d70284684ec000dBob Moore 473f7b004a17c9183f023796dea0d70284684ec000dBob Moore /* Not mapped or allocated, there is nothing we can do */ 474f7b004a17c9183f023796dea0d70284684ec000dBob Moore 475f7b004a17c9183f023796dea0d70284684ec000dBob Moore default: 476f7b004a17c9183f023796dea0d70284684ec000dBob Moore return; 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 479f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore table_desc->pointer = NULL; 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 484f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * FUNCTION: acpi_tb_terminate 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 486f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * PARAMETERS: None 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 488f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * RETURN: None 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Delete all internal ACPI tables 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 494f3d2e7865c816258c699ff965768e46b50d536d3Bob Moorevoid acpi_tb_terminate(void) 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 49667a119f990063f5662574f6d6414fe9bc5ece86aBob Moore u32 i; 497f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 498f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_FUNCTION_TRACE(tb_terminate); 499f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 500f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); 501f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 502f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore /* Delete the individual tables */ 503f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 504b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore for (i = 0; i < acpi_gbl_root_table_list.current_table_count; i++) { 505428f211297bc95fd41f23830eab4180339020dd0Alexey Starikovskiy acpi_tb_delete_table(&acpi_gbl_root_table_list.tables[i]); 506f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 509f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * Delete the root table array if allocated locally. Array cannot be 510f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * mapped, so we don't need to check for that flag. 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 512c5fc42ac4d4d6d3e3f619290b86890cb3725d2f8Bob Moore if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) { 513f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_FREE(acpi_gbl_root_table_list.tables); 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 515f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 516f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_gbl_root_table_list.tables = NULL; 517f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_gbl_root_table_list.flags = 0; 518b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore acpi_gbl_root_table_list.current_table_count = 0; 519f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 520f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_DEBUG_PRINT((ACPI_DB_INFO, "ACPI Tables freed\n")); 521f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 526f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * FUNCTION: acpi_tb_delete_namespace_by_owner 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 528f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * PARAMETERS: table_index - Table index 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5308a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore * RETURN: Status 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 532f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * DESCRIPTION: Delete all namespace objects created when this table was loaded. 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5368a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Mooreacpi_status acpi_tb_delete_namespace_by_owner(u32 table_index) 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 538f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_owner_id owner_id; 5398a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore acpi_status status; 5408a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore 5418a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore ACPI_FUNCTION_TRACE(tb_delete_namespace_by_owner); 5428a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore 5438a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore status = acpi_ut_acquire_mutex(ACPI_MTX_TABLES); 5448a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore if (ACPI_FAILURE(status)) { 5458a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore return_ACPI_STATUS(status); 5468a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore } 5478a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore 548b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore if (table_index >= acpi_gbl_root_table_list.current_table_count) { 5498a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore 5508a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore /* The table index does not exist */ 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 552f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); 5538a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore return_ACPI_STATUS(AE_NOT_EXIST); 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5568a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore /* Get the owner ID for this table, used to delete namespace nodes */ 5578a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore 5588a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore owner_id = acpi_gbl_root_table_list.tables[table_index].owner_id; 559f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); 5608a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore 5618a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore /* 5628a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore * Need to acquire the namespace writer lock to prevent interference 5638a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore * with any concurrent namespace walks. The interpreter must be 5648a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore * released during the deletion since the acquisition of the deletion 5658a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore * lock may block, and also since the execution of a namespace walk 5668a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore * must be allowed to use the interpreter. 5678a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore */ 568e4c1ebfc65c125b1289144f5815715f238367683Bob Moore (void)acpi_ut_release_mutex(ACPI_MTX_INTERPRETER); 5698a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore status = acpi_ut_acquire_write_lock(&acpi_gbl_namespace_rw_lock); 5708a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore 571f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_ns_delete_namespace_by_owner(owner_id); 5728a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore if (ACPI_FAILURE(status)) { 5738a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore return_ACPI_STATUS(status); 5748a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore } 5758a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore 5768a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore acpi_ut_release_write_lock(&acpi_gbl_namespace_rw_lock); 5778a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore 5788a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore status = acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER); 5798a335a2331c72e60c6b3ef09b2dedd3ba00da1b1Bob Moore return_ACPI_STATUS(status); 580f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore} 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 582f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore/******************************************************************************* 583f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 584f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * FUNCTION: acpi_tb_allocate_owner_id 585f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 586f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * PARAMETERS: table_index - Table index 587f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 588f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * RETURN: Status 589f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 590f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * DESCRIPTION: Allocates owner_id in table_desc 591f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 592f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ******************************************************************************/ 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 59467a119f990063f5662574f6d6414fe9bc5ece86aBob Mooreacpi_status acpi_tb_allocate_owner_id(u32 table_index) 595f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore{ 596f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_status status = AE_BAD_PARAMETER; 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 598f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_FUNCTION_TRACE(tb_allocate_owner_id); 5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 600f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); 601b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore if (table_index < acpi_gbl_root_table_list.current_table_count) { 602f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore status = acpi_ut_allocate_owner_id 603f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (&(acpi_gbl_root_table_list.tables[table_index].owner_id)); 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6064be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); 607f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore return_ACPI_STATUS(status); 6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 612f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * FUNCTION: acpi_tb_release_owner_id 6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 614f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * PARAMETERS: table_index - Table index 6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 616f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * RETURN: Status 6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 618f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * DESCRIPTION: Releases owner_id in table_desc 6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 62267a119f990063f5662574f6d6414fe9bc5ece86aBob Mooreacpi_status acpi_tb_release_owner_id(u32 table_index) 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 624f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_status status = AE_BAD_PARAMETER; 6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 626f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_FUNCTION_TRACE(tb_release_owner_id); 6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 628f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); 629b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore if (table_index < acpi_gbl_root_table_list.current_table_count) { 630f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_ut_release_owner_id(& 631f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (acpi_gbl_root_table_list. 632f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore tables[table_index].owner_id)); 633f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore status = AE_OK; 6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 636f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); 637f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore return_ACPI_STATUS(status); 6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 642f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * FUNCTION: acpi_tb_get_owner_id 6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 644f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * PARAMETERS: table_index - Table index 645f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * owner_id - Where the table owner_id is returned 6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 647f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * RETURN: Status 6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 649f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * DESCRIPTION: returns owner_id for the ACPI table 6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 65367a119f990063f5662574f6d6414fe9bc5ece86aBob Mooreacpi_status acpi_tb_get_owner_id(u32 table_index, acpi_owner_id *owner_id) 6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 655f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_status status = AE_BAD_PARAMETER; 6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 657f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ACPI_FUNCTION_TRACE(tb_get_owner_id); 6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 659f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); 660b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore if (table_index < acpi_gbl_root_table_list.current_table_count) { 661f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore *owner_id = 662f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_gbl_root_table_list.tables[table_index].owner_id; 663f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore status = AE_OK; 6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 666f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); 667f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore return_ACPI_STATUS(status); 668f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore} 6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 670f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore/******************************************************************************* 671f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 672f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * FUNCTION: acpi_tb_is_table_loaded 673f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 674f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * PARAMETERS: table_index - Table index 675f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 676f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * RETURN: Table Loaded Flag 677f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 678f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ******************************************************************************/ 6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 68067a119f990063f5662574f6d6414fe9bc5ece86aBob Mooreu8 acpi_tb_is_table_loaded(u32 table_index) 681f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore{ 682f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore u8 is_loaded = FALSE; 6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 684f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); 685b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore if (table_index < acpi_gbl_root_table_list.current_table_count) { 686f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore is_loaded = (u8) 687ec41f193eadb6301f3c052b5e0dbc0b5636982e8Bob Moore (acpi_gbl_root_table_list.tables[table_index].flags & 688ec41f193eadb6301f3c052b5e0dbc0b5636982e8Bob Moore ACPI_TABLE_IS_LOADED); 6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 691f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); 692f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore return (is_loaded); 693f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore} 694f6dd9221dddb3550e60d32aee688588ec208312cBob Moore 695f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore/******************************************************************************* 696f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 697f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * FUNCTION: acpi_tb_set_table_loaded_flag 698f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 699f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * PARAMETERS: table_index - Table index 700f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * is_loaded - TRUE if table is loaded, FALSE otherwise 701f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 702f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * RETURN: None 703f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 704f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE. 705f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore * 706f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore ******************************************************************************/ 7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 70867a119f990063f5662574f6d6414fe9bc5ece86aBob Moorevoid acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded) 709f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore{ 7101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 711f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); 712b9ee2043096b02e5da8c62f9a8a8f2e172b3606bBob Moore if (table_index < acpi_gbl_root_table_list.current_table_count) { 713f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (is_loaded) { 714f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_gbl_root_table_list.tables[table_index].flags |= 715c5fc42ac4d4d6d3e3f619290b86890cb3725d2f8Bob Moore ACPI_TABLE_IS_LOADED; 716f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } else { 717f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_gbl_root_table_list.tables[table_index].flags &= 718c5fc42ac4d4d6d3e3f619290b86890cb3725d2f8Bob Moore ~ACPI_TABLE_IS_LOADED; 719f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } 720f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } 7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 722f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); 7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 724