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