tbxface.c 18.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8
/******************************************************************************
 *
 * Module Name: tbxface - Public interfaces to the ACPI subsystem
 *                         ACPI table oriented interfaces
 *
 *****************************************************************************/

/*
B
Bob Moore 已提交
9
 * Copyright (C) 2000 - 2007, R. Byron Moore
L
Linus Torvalds 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    substantially similar to the "NO WARRANTY" disclaimer below
 *    ("Disclaimer") and any redistribution must be conditioned upon
 *    including a substantially similar Disclaimer requirement for further
 *    binary redistribution.
 * 3. Neither the names of the above-listed copyright holders nor the names
 *    of any contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") version 2 as published by the Free
 * Software Foundation.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 */

#include <acpi/acpi.h>
#include <acpi/acnamesp.h>
#include <acpi/actables.h>

#define _COMPONENT          ACPI_TABLES
L
Len Brown 已提交
50
ACPI_MODULE_NAME("tbxface")
L
Linus Torvalds 已提交
51

52 53 54
/* Local prototypes */
static acpi_status acpi_tb_load_namespace(void);

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
/*******************************************************************************
 *
 * FUNCTION:    acpi_allocate_root_table
 *
 * PARAMETERS:  initial_table_count - Size of initial_table_array, in number of
 *                                    struct acpi_table_desc structures
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Allocate a root table array. Used by i_aSL compiler and
 *              acpi_initialize_tables.
 *
 ******************************************************************************/

acpi_status acpi_allocate_root_table(u32 initial_table_count)
{

	acpi_gbl_root_table_list.size = initial_table_count;
	acpi_gbl_root_table_list.flags = ACPI_ROOT_ALLOW_RESIZE;

	return (acpi_tb_resize_root_table_list());
}

L
Linus Torvalds 已提交
78 79
/*******************************************************************************
 *
80
 * FUNCTION:    acpi_initialize_tables
L
Linus Torvalds 已提交
81
 *
82 83 84 85 86 87 88 89
 * PARAMETERS:  initial_table_array - Pointer to an array of pre-allocated
 *                                    struct acpi_table_desc structures. If NULL, the
 *                                    array is dynamically allocated.
 *              initial_table_count - Size of initial_table_array, in number of
 *                                    struct acpi_table_desc structures
 *              allow_realloc       - Flag to tell Table Manager if resize of
 *                                    pre-allocated array is allowed. Ignored
 *                                    if initial_table_array is NULL.
L
Linus Torvalds 已提交
90 91 92
 *
 * RETURN:      Status
 *
93 94 95 96 97 98 99 100
 * DESCRIPTION: Initialize the table manager, get the RSDP and RSDT/XSDT.
 *
 * NOTE:        Allows static allocation of the initial table array in order
 *              to avoid the use of dynamic memory in confined environments
 *              such as the kernel boot sequence where it may not be available.
 *
 *              If the host OS memory managers are initialized, use NULL for
 *              initial_table_array, and the table will be dynamically allocated.
L
Linus Torvalds 已提交
101 102
 *
 ******************************************************************************/
103

104
acpi_status __init
105
acpi_initialize_tables(struct acpi_table_desc * initial_table_array,
106
		       u32 initial_table_count, u8 allow_resize)
L
Linus Torvalds 已提交
107
{
108
	acpi_physical_address rsdp_address;
L
Len Brown 已提交
109
	acpi_status status;
L
Linus Torvalds 已提交
110

111
	ACPI_FUNCTION_TRACE(acpi_initialize_tables);
L
Linus Torvalds 已提交
112

113 114 115 116 117
	/*
	 * Set up the Root Table Array
	 * Allocate the table array if requested
	 */
	if (!initial_table_array) {
118
		status = acpi_allocate_root_table(initial_table_count);
119 120 121 122 123 124
		if (ACPI_FAILURE(status)) {
			return_ACPI_STATUS(status);
		}
	} else {
		/* Root Table Array has been statically allocated by the host */

B
Bob Moore 已提交
125
		ACPI_MEMSET(initial_table_array, 0,
126
			    initial_table_count *
B
Bob Moore 已提交
127
			    sizeof(struct acpi_table_desc));
128

129 130
		acpi_gbl_root_table_list.tables = initial_table_array;
		acpi_gbl_root_table_list.size = initial_table_count;
131
		acpi_gbl_root_table_list.flags = ACPI_ROOT_ORIGIN_UNKNOWN;
132
		if (allow_resize) {
133 134
			acpi_gbl_root_table_list.flags |=
			    ACPI_ROOT_ALLOW_RESIZE;
135
		}
L
Linus Torvalds 已提交
136 137
	}

138
	/* Get the address of the RSDP */
L
Linus Torvalds 已提交
139

140 141
	rsdp_address = acpi_os_get_root_pointer();
	if (!rsdp_address) {
142 143
		return_ACPI_STATUS(AE_NOT_FOUND);
	}
L
Linus Torvalds 已提交
144

145 146 147 148 149
	/*
	 * Get the root table (RSDT or XSDT) and extract all entries to the local
	 * Root Table Array. This array contains the information of the RSDT/XSDT
	 * in a common, more useable format.
	 */
150 151
	status =
	    acpi_tb_parse_root_table(rsdp_address, ACPI_TABLE_ORIGIN_MAPPED);
152 153
	return_ACPI_STATUS(status);
}
L
Linus Torvalds 已提交
154

155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
/*******************************************************************************
 *
 * FUNCTION:    acpi_reallocate_root_table
 *
 * PARAMETERS:  None
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Reallocate Root Table List into dynamic memory. Copies the
 *              root list from the previously provided scratch area. Should
 *              be called once dynamic memory allocation is available in the
 *              kernel
 *
 ******************************************************************************/
acpi_status acpi_reallocate_root_table(void)
{
	struct acpi_table_desc *tables;
	acpi_size new_size;

	ACPI_FUNCTION_TRACE(acpi_reallocate_root_table);

	/*
	 * Only reallocate the root table if the host provided a static buffer
	 * for the table array in the call to acpi_initialize_tables.
	 */
180
	if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
181
		return_ACPI_STATUS(AE_SUPPORT);
L
Linus Torvalds 已提交
182 183
	}

184 185 186
	new_size =
	    (acpi_gbl_root_table_list.count +
	     ACPI_ROOT_TABLE_SIZE_INCREMENT) * sizeof(struct acpi_table_desc);
L
Linus Torvalds 已提交
187

188
	/* Create new array and copy the old array */
L
Linus Torvalds 已提交
189

190 191 192
	tables = ACPI_ALLOCATE_ZEROED(new_size);
	if (!tables) {
		return_ACPI_STATUS(AE_NO_MEMORY);
L
Linus Torvalds 已提交
193 194
	}

195
	ACPI_MEMCPY(tables, acpi_gbl_root_table_list.tables, new_size);
L
Linus Torvalds 已提交
196

197 198 199
	acpi_gbl_root_table_list.size = acpi_gbl_root_table_list.count;
	acpi_gbl_root_table_list.tables = tables;
	acpi_gbl_root_table_list.flags =
200
	    ACPI_ROOT_ORIGIN_ALLOCATED | ACPI_ROOT_ALLOW_RESIZE;
B
Bob Moore 已提交
201

202 203
	return_ACPI_STATUS(AE_OK);
}
L
Linus Torvalds 已提交
204 205 206 207 208 209 210 211 212 213
/*******************************************************************************
 *
 * FUNCTION:    acpi_load_table
 *
 * PARAMETERS:  table_ptr       - pointer to a buffer containing the entire
 *                                table to be loaded
 *
 * RETURN:      Status
 *
 * DESCRIPTION: This function is called to load a table from the caller's
B
Bob Moore 已提交
214 215
 *              buffer. The buffer must contain an entire ACPI Table including
 *              a valid header. The header fields will be verified, and if it
L
Linus Torvalds 已提交
216 217 218
 *              is determined that the table is invalid, the call will fail.
 *
 ******************************************************************************/
L
Len Brown 已提交
219
acpi_status acpi_load_table(struct acpi_table_header *table_ptr)
L
Linus Torvalds 已提交
220
{
L
Len Brown 已提交
221
	acpi_status status;
222
	acpi_native_uint table_index;
223 224 225 226 227 228 229 230 231
	struct acpi_table_desc table_desc;

	if (!table_ptr)
		return AE_BAD_PARAMETER;

	ACPI_MEMSET(&table_desc, 0, sizeof(struct acpi_table_desc));
	table_desc.pointer = table_ptr;
	table_desc.length = table_ptr->length;
	table_desc.flags = ACPI_TABLE_ORIGIN_UNKNOWN;
L
Linus Torvalds 已提交
232

233 234 235
	/*
	 * Install the new table into the local data structures
	 */
236
	status = acpi_tb_add_table(&table_desc, &table_index);
L
Len Brown 已提交
237
	if (ACPI_FAILURE(status)) {
238
		return status;
239
	}
240
	status = acpi_ns_load_table(table_index, acpi_gbl_root_node);
241
	return status;
242
}
243

244
ACPI_EXPORT_SYMBOL(acpi_load_table)
B
Bob Moore 已提交
245

246 247 248 249 250 251
/******************************************************************************
 *
 * FUNCTION:    acpi_get_table_header
 *
 * PARAMETERS:  Signature           - ACPI signature of needed table
 *              Instance            - Which instance (for SSDTs)
252
 *              out_table_header    - The pointer to the table header to fill
253 254 255 256 257 258 259 260 261 262 263 264
 *
 * RETURN:      Status and pointer to mapped table header
 *
 * DESCRIPTION: Finds an ACPI table header.
 *
 * NOTE:        Caller is responsible in unmapping the header with
 *              acpi_os_unmap_memory
 *
 *****************************************************************************/
acpi_status
acpi_get_table_header(char *signature,
		      acpi_native_uint instance,
265
		      struct acpi_table_header *out_table_header)
266 267 268
{
	acpi_native_uint i;
	acpi_native_uint j;
269
	struct acpi_table_header *header;
270

271 272 273 274 275 276
	/* Parameter validation */

	if (!signature || !out_table_header) {
		return (AE_BAD_PARAMETER);
	}

277 278 279 280 281 282 283 284
	/*
	 * Walk the root table list
	 */
	for (i = 0, j = 0; i < acpi_gbl_root_table_list.count; i++) {
		if (!ACPI_COMPARE_NAME
		    (&(acpi_gbl_root_table_list.tables[i].signature),
		     signature)) {
			continue;
285 286
		}

287 288 289
		if (++j < instance) {
			continue;
		}
L
Linus Torvalds 已提交
290

291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314
		if (!acpi_gbl_root_table_list.tables[i].pointer) {
			if ((acpi_gbl_root_table_list.tables[i].
			     flags & ACPI_TABLE_ORIGIN_MASK) ==
			    ACPI_TABLE_ORIGIN_MAPPED) {
				header =
				    acpi_os_map_memory(acpi_gbl_root_table_list.
						       tables[i].address,
						       sizeof(struct
							      acpi_table_header));
				if (!header) {
					return AE_NO_MEMORY;
				}
				ACPI_MEMCPY(out_table_header, header,
					    sizeof(struct acpi_table_header));
				acpi_os_unmap_memory(header,
						     sizeof(struct
							    acpi_table_header));
			} else {
				return AE_NOT_FOUND;
			}
		} else {
			ACPI_MEMCPY(out_table_header,
				    acpi_gbl_root_table_list.tables[i].pointer,
				    sizeof(struct acpi_table_header));
315 316
		}
		return (AE_OK);
L
Linus Torvalds 已提交
317 318
	}

319
	return (AE_NOT_FOUND);
L
Linus Torvalds 已提交
320 321
}

322
ACPI_EXPORT_SYMBOL(acpi_get_table_header)
B
Bob Moore 已提交
323

324 325

/******************************************************************************
326 327 328
 *
 * FUNCTION:    acpi_unload_table_id
 *
329
 * PARAMETERS:  id            - Owner ID of the table to be removed.
330 331 332 333 334 335
 *
 * RETURN:      Status
 *
 * DESCRIPTION: This routine is used to force the unload of a table (by id)
 *
 ******************************************************************************/
336
acpi_status acpi_unload_table_id(acpi_owner_id id)
337
{
338 339
	int i;
	acpi_status status = AE_NOT_EXIST;
340

341
	ACPI_FUNCTION_TRACE(acpi_unload_table_id);
342

343
	/* Find table in the global table list */
344 345 346 347 348 349 350 351 352 353 354
	for (i = 0; i < acpi_gbl_root_table_list.count; ++i) {
		if (id != acpi_gbl_root_table_list.tables[i].owner_id) {
			continue;
		}
		/*
		* Delete all namespace objects owned by this table. Note that these
		* objects can appear anywhere in the namespace by virtue of the AML
		* "Scope" operator. Thus, we need to track ownership by an ID, not
		* simply a position within the hierarchy
		*/
		acpi_tb_delete_namespace_by_owner(i);
355
		status = acpi_tb_release_owner_id(i);
356
		acpi_tb_set_table_loaded_flag(i, FALSE);
357
		break;
358 359
	}
	return_ACPI_STATUS(status);
360 361 362 363
}

ACPI_EXPORT_SYMBOL(acpi_unload_table_id)

L
Linus Torvalds 已提交
364 365
/*******************************************************************************
 *
366
 * FUNCTION:    acpi_get_table
L
Linus Torvalds 已提交
367
 *
368 369 370
 * PARAMETERS:  Signature           - ACPI signature of needed table
 *              Instance            - Which instance (for SSDTs)
 *              out_table           - Where the pointer to the table is returned
L
Linus Torvalds 已提交
371
 *
372
 * RETURN:      Status and pointer to table
L
Linus Torvalds 已提交
373
 *
374
 * DESCRIPTION: Finds and verifies an ACPI table.
L
Linus Torvalds 已提交
375
 *
376 377 378 379
 *****************************************************************************/
acpi_status
acpi_get_table(char *signature,
	       acpi_native_uint instance, struct acpi_table_header ** out_table)
L
Linus Torvalds 已提交
380
{
381 382 383
	acpi_native_uint i;
	acpi_native_uint j;
	acpi_status status;
L
Linus Torvalds 已提交
384

385 386 387 388 389 390
	/* Parameter validation */

	if (!signature || !out_table) {
		return (AE_BAD_PARAMETER);
	}

391 392 393 394 395 396 397 398 399
	/*
	 * Walk the root table list
	 */
	for (i = 0, j = 0; i < acpi_gbl_root_table_list.count; i++) {
		if (!ACPI_COMPARE_NAME
		    (&(acpi_gbl_root_table_list.tables[i].signature),
		     signature)) {
			continue;
		}
L
Linus Torvalds 已提交
400

401 402 403
		if (++j < instance) {
			continue;
		}
L
Linus Torvalds 已提交
404

405 406 407 408 409
		status =
		    acpi_tb_verify_table(&acpi_gbl_root_table_list.tables[i]);
		if (ACPI_SUCCESS(status)) {
			*out_table = acpi_gbl_root_table_list.tables[i].pointer;
		}
B
Bob Moore 已提交
410

411
		if (!acpi_gbl_permanent_mmap) {
R
Randy Dunlap 已提交
412
			acpi_gbl_root_table_list.tables[i].pointer = NULL;
413 414
		}

415
		return (status);
L
Linus Torvalds 已提交
416 417
	}

418
	return (AE_NOT_FOUND);
L
Linus Torvalds 已提交
419 420
}

421
ACPI_EXPORT_SYMBOL(acpi_get_table)
B
Bob Moore 已提交
422

L
Linus Torvalds 已提交
423 424
/*******************************************************************************
 *
425
 * FUNCTION:    acpi_get_table_by_index
L
Linus Torvalds 已提交
426
 *
427 428
 * PARAMETERS:  table_index         - Table index
 *              Table               - Where the pointer to the table is returned
L
Linus Torvalds 已提交
429
 *
430
 * RETURN:      Status and pointer to the table
L
Linus Torvalds 已提交
431
 *
432
 * DESCRIPTION: Obtain a table by an index into the global table list.
L
Linus Torvalds 已提交
433 434 435
 *
 ******************************************************************************/
acpi_status
436 437
acpi_get_table_by_index(acpi_native_uint table_index,
			struct acpi_table_header ** table)
L
Linus Torvalds 已提交
438
{
L
Len Brown 已提交
439
	acpi_status status;
L
Linus Torvalds 已提交
440

441
	ACPI_FUNCTION_TRACE(acpi_get_table_by_index);
L
Linus Torvalds 已提交
442

443 444 445 446 447 448
	/* Parameter validation */

	if (!table) {
		return_ACPI_STATUS(AE_BAD_PARAMETER);
	}

449
	(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
L
Linus Torvalds 已提交
450

451
	/* Validate index */
L
Linus Torvalds 已提交
452

453 454
	if (table_index >= acpi_gbl_root_table_list.count) {
		(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
L
Len Brown 已提交
455
		return_ACPI_STATUS(AE_BAD_PARAMETER);
L
Linus Torvalds 已提交
456 457
	}

458
	if (!acpi_gbl_root_table_list.tables[table_index].pointer) {
L
Linus Torvalds 已提交
459

460
		/* Table is not mapped, map it */
L
Linus Torvalds 已提交
461

462 463 464 465 466 467 468
		status =
		    acpi_tb_verify_table(&acpi_gbl_root_table_list.
					 tables[table_index]);
		if (ACPI_FAILURE(status)) {
			(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
			return_ACPI_STATUS(status);
		}
L
Linus Torvalds 已提交
469 470
	}

471 472 473
	*table = acpi_gbl_root_table_list.tables[table_index].pointer;
	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
	return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
474 475
}

476
ACPI_EXPORT_SYMBOL(acpi_get_table_by_index)
L
Linus Torvalds 已提交
477 478 479

/*******************************************************************************
 *
480
 * FUNCTION:    acpi_tb_load_namespace
L
Linus Torvalds 已提交
481
 *
482
 * PARAMETERS:  None
L
Linus Torvalds 已提交
483 484 485
 *
 * RETURN:      Status
 *
486 487
 * DESCRIPTION: Load the namespace from the DSDT and all SSDTs/PSDTs found in
 *              the RSDT/XSDT.
L
Linus Torvalds 已提交
488 489
 *
 ******************************************************************************/
490
static acpi_status acpi_tb_load_namespace(void)
L
Linus Torvalds 已提交
491
{
L
Len Brown 已提交
492
	acpi_status status;
493 494
	struct acpi_table_header *table;
	acpi_native_uint i;
L
Linus Torvalds 已提交
495

496
	ACPI_FUNCTION_TRACE(tb_load_namespace);
L
Linus Torvalds 已提交
497

498
	(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
L
Linus Torvalds 已提交
499

500 501 502 503 504 505 506 507 508 509 510 511 512 513 514
	/*
	 * Load the namespace. The DSDT is required, but any SSDT and PSDT tables
	 * are optional.
	 */
	if (!acpi_gbl_root_table_list.count ||
	    !ACPI_COMPARE_NAME(&
			       (acpi_gbl_root_table_list.
				tables[ACPI_TABLE_INDEX_DSDT].signature),
			       ACPI_SIG_DSDT)
	    ||
	    ACPI_FAILURE(acpi_tb_verify_table
			 (&acpi_gbl_root_table_list.
			  tables[ACPI_TABLE_INDEX_DSDT]))) {
		status = AE_NO_ACPI_TABLES;
		goto unlock_and_exit;
L
Linus Torvalds 已提交
515 516
	}

517 518 519 520 521 522 523 524 525 526 527
	/*
	 * Find DSDT table
	 */
	status =
	    acpi_os_table_override(acpi_gbl_root_table_list.
				   tables[ACPI_TABLE_INDEX_DSDT].pointer,
				   &table);
	if (ACPI_SUCCESS(status) && table) {
		/*
		 * DSDT table has been found
		 */
528 529
		acpi_tb_delete_table(&acpi_gbl_root_table_list.
				     tables[ACPI_TABLE_INDEX_DSDT]);
530 531 532 533 534 535 536 537 538
		acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].pointer =
		    table;
		acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].length =
		    table->length;
		acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].flags =
		    ACPI_TABLE_ORIGIN_UNKNOWN;

		ACPI_INFO((AE_INFO, "Table DSDT replaced by host OS"));
		acpi_tb_print_table_header(0, table);
L
Linus Torvalds 已提交
539 540
	}

541 542 543 544 545 546
	status =
	    acpi_tb_verify_table(&acpi_gbl_root_table_list.
				 tables[ACPI_TABLE_INDEX_DSDT]);
	if (ACPI_FAILURE(status)) {

		/* A valid DSDT is required */
L
Linus Torvalds 已提交
547

548 549
		status = AE_NO_ACPI_TABLES;
		goto unlock_and_exit;
L
Linus Torvalds 已提交
550 551
	}

552
	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
L
Linus Torvalds 已提交
553

554 555 556 557
	/*
	 * Load and parse tables.
	 */
	status = acpi_ns_load_table(ACPI_TABLE_INDEX_DSDT, acpi_gbl_root_node);
L
Len Brown 已提交
558 559
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
560 561 562
	}

	/*
563
	 * Load any SSDT or PSDT tables. Note: Loop leaves tables locked
L
Linus Torvalds 已提交
564
	 */
565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584
	(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
	for (i = 0; i < acpi_gbl_root_table_list.count; ++i) {
		if ((!ACPI_COMPARE_NAME
		     (&(acpi_gbl_root_table_list.tables[i].signature),
		      ACPI_SIG_SSDT)
		     &&
		     !ACPI_COMPARE_NAME(&
					(acpi_gbl_root_table_list.tables[i].
					 signature), ACPI_SIG_PSDT))
		    ||
		    ACPI_FAILURE(acpi_tb_verify_table
				 (&acpi_gbl_root_table_list.tables[i]))) {
			continue;
		}

		/* Ignore errors while loading tables, get as many as possible */

		(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
		(void)acpi_ns_load_table(i, acpi_gbl_root_node);
		(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
L
Linus Torvalds 已提交
585 586
	}

587
	ACPI_DEBUG_PRINT((ACPI_DB_INIT, "ACPI Tables successfully acquired\n"));
L
Linus Torvalds 已提交
588

589 590 591 592
      unlock_and_exit:
	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
	return_ACPI_STATUS(status);
}
B
Bob Moore 已提交
593

594 595 596 597 598 599 600 601 602 603 604
/*******************************************************************************
 *
 * FUNCTION:    acpi_load_tables
 *
 * PARAMETERS:  None
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Load the ACPI tables from the RSDT/XSDT
 *
 ******************************************************************************/
R
Robert Moore 已提交
605

606 607 608
acpi_status acpi_load_tables(void)
{
	acpi_status status;
L
Linus Torvalds 已提交
609

610
	ACPI_FUNCTION_TRACE(acpi_load_tables);
L
Linus Torvalds 已提交
611

612 613 614 615
	/*
	 * Load the namespace from the tables
	 */
	status = acpi_tb_load_namespace();
L
Len Brown 已提交
616
	if (ACPI_FAILURE(status)) {
617 618
		ACPI_EXCEPTION((AE_INFO, status,
				"While loading namespace from ACPI tables"));
L
Linus Torvalds 已提交
619 620
	}

621
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
622 623
}

624
ACPI_EXPORT_SYMBOL(acpi_load_tables)