xref: /openbmc/linux/drivers/acpi/acpica/tbdata.c (revision e3b9f1e8)
1 /******************************************************************************
2  *
3  * Module Name: tbdata - Table manager data structure functions
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2018, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #include <acpi/acpi.h>
45 #include "accommon.h"
46 #include "acnamesp.h"
47 #include "actables.h"
48 #include "acevents.h"
49 
50 #define _COMPONENT          ACPI_TABLES
51 ACPI_MODULE_NAME("tbdata")
52 
53 /* Local prototypes */
54 static acpi_status
55 acpi_tb_check_duplication(struct acpi_table_desc *table_desc, u32 *table_index);
56 
57 static u8
58 acpi_tb_compare_tables(struct acpi_table_desc *table_desc, u32 table_index);
59 
60 /*******************************************************************************
61  *
62  * FUNCTION:    acpi_tb_compare_tables
63  *
64  * PARAMETERS:  table_desc          - Table 1 descriptor to be compared
65  *              table_index         - Index of table 2 to be compared
66  *
67  * RETURN:      TRUE if both tables are identical.
68  *
69  * DESCRIPTION: This function compares a table with another table that has
70  *              already been installed in the root table list.
71  *
72  ******************************************************************************/
73 
74 static u8
75 acpi_tb_compare_tables(struct acpi_table_desc *table_desc, u32 table_index)
76 {
77 	acpi_status status = AE_OK;
78 	u8 is_identical;
79 	struct acpi_table_header *table;
80 	u32 table_length;
81 	u8 table_flags;
82 
83 	status =
84 	    acpi_tb_acquire_table(&acpi_gbl_root_table_list.tables[table_index],
85 				  &table, &table_length, &table_flags);
86 	if (ACPI_FAILURE(status)) {
87 		return (FALSE);
88 	}
89 
90 	/*
91 	 * Check for a table match on the entire table length,
92 	 * not just the header.
93 	 */
94 	is_identical = (u8)((table_desc->length != table_length ||
95 			     memcmp(table_desc->pointer, table, table_length)) ?
96 			    FALSE : TRUE);
97 
98 	/* Release the acquired table */
99 
100 	acpi_tb_release_table(table, table_length, table_flags);
101 	return (is_identical);
102 }
103 
104 /*******************************************************************************
105  *
106  * FUNCTION:    acpi_tb_init_table_descriptor
107  *
108  * PARAMETERS:  table_desc              - Table descriptor
109  *              address                 - Physical address of the table
110  *              flags                   - Allocation flags of the table
111  *              table                   - Pointer to the table
112  *
113  * RETURN:      None
114  *
115  * DESCRIPTION: Initialize a new table descriptor
116  *
117  ******************************************************************************/
118 
119 void
120 acpi_tb_init_table_descriptor(struct acpi_table_desc *table_desc,
121 			      acpi_physical_address address,
122 			      u8 flags, struct acpi_table_header *table)
123 {
124 
125 	/*
126 	 * Initialize the table descriptor. Set the pointer to NULL, since the
127 	 * table is not fully mapped at this time.
128 	 */
129 	memset(table_desc, 0, sizeof(struct acpi_table_desc));
130 	table_desc->address = address;
131 	table_desc->length = table->length;
132 	table_desc->flags = flags;
133 	ACPI_MOVE_32_TO_32(table_desc->signature.ascii, table->signature);
134 }
135 
136 /*******************************************************************************
137  *
138  * FUNCTION:    acpi_tb_acquire_table
139  *
140  * PARAMETERS:  table_desc          - Table descriptor
141  *              table_ptr           - Where table is returned
142  *              table_length        - Where table length is returned
143  *              table_flags         - Where table allocation flags are returned
144  *
145  * RETURN:      Status
146  *
147  * DESCRIPTION: Acquire an ACPI table. It can be used for tables not
148  *              maintained in the acpi_gbl_root_table_list.
149  *
150  ******************************************************************************/
151 
152 acpi_status
153 acpi_tb_acquire_table(struct acpi_table_desc *table_desc,
154 		      struct acpi_table_header **table_ptr,
155 		      u32 *table_length, u8 *table_flags)
156 {
157 	struct acpi_table_header *table = NULL;
158 
159 	switch (table_desc->flags & ACPI_TABLE_ORIGIN_MASK) {
160 	case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
161 
162 		table =
163 		    acpi_os_map_memory(table_desc->address, table_desc->length);
164 		break;
165 
166 	case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
167 	case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
168 
169 		table = ACPI_CAST_PTR(struct acpi_table_header,
170 				      ACPI_PHYSADDR_TO_PTR(table_desc->
171 							   address));
172 		break;
173 
174 	default:
175 
176 		break;
177 	}
178 
179 	/* Table is not valid yet */
180 
181 	if (!table) {
182 		return (AE_NO_MEMORY);
183 	}
184 
185 	/* Fill the return values */
186 
187 	*table_ptr = table;
188 	*table_length = table_desc->length;
189 	*table_flags = table_desc->flags;
190 	return (AE_OK);
191 }
192 
193 /*******************************************************************************
194  *
195  * FUNCTION:    acpi_tb_release_table
196  *
197  * PARAMETERS:  table               - Pointer for the table
198  *              table_length        - Length for the table
199  *              table_flags         - Allocation flags for the table
200  *
201  * RETURN:      None
202  *
203  * DESCRIPTION: Release a table. The inverse of acpi_tb_acquire_table().
204  *
205  ******************************************************************************/
206 
207 void
208 acpi_tb_release_table(struct acpi_table_header *table,
209 		      u32 table_length, u8 table_flags)
210 {
211 
212 	switch (table_flags & ACPI_TABLE_ORIGIN_MASK) {
213 	case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
214 
215 		acpi_os_unmap_memory(table, table_length);
216 		break;
217 
218 	case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
219 	case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
220 	default:
221 
222 		break;
223 	}
224 }
225 
226 /*******************************************************************************
227  *
228  * FUNCTION:    acpi_tb_acquire_temp_table
229  *
230  * PARAMETERS:  table_desc          - Table descriptor to be acquired
231  *              address             - Address of the table
232  *              flags               - Allocation flags of the table
233  *
234  * RETURN:      Status
235  *
236  * DESCRIPTION: This function validates the table header to obtain the length
237  *              of a table and fills the table descriptor to make its state as
238  *              "INSTALLED". Such a table descriptor is only used for verified
239  *              installation.
240  *
241  ******************************************************************************/
242 
243 acpi_status
244 acpi_tb_acquire_temp_table(struct acpi_table_desc *table_desc,
245 			   acpi_physical_address address, u8 flags)
246 {
247 	struct acpi_table_header *table_header;
248 
249 	switch (flags & ACPI_TABLE_ORIGIN_MASK) {
250 	case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
251 
252 		/* Get the length of the full table from the header */
253 
254 		table_header =
255 		    acpi_os_map_memory(address,
256 				       sizeof(struct acpi_table_header));
257 		if (!table_header) {
258 			return (AE_NO_MEMORY);
259 		}
260 
261 		acpi_tb_init_table_descriptor(table_desc, address, flags,
262 					      table_header);
263 		acpi_os_unmap_memory(table_header,
264 				     sizeof(struct acpi_table_header));
265 		return (AE_OK);
266 
267 	case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
268 	case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
269 
270 		table_header = ACPI_CAST_PTR(struct acpi_table_header,
271 					     ACPI_PHYSADDR_TO_PTR(address));
272 		if (!table_header) {
273 			return (AE_NO_MEMORY);
274 		}
275 
276 		acpi_tb_init_table_descriptor(table_desc, address, flags,
277 					      table_header);
278 		return (AE_OK);
279 
280 	default:
281 
282 		break;
283 	}
284 
285 	/* Table is not valid yet */
286 
287 	return (AE_NO_MEMORY);
288 }
289 
290 /*******************************************************************************
291  *
292  * FUNCTION:    acpi_tb_release_temp_table
293  *
294  * PARAMETERS:  table_desc          - Table descriptor to be released
295  *
296  * RETURN:      Status
297  *
298  * DESCRIPTION: The inverse of acpi_tb_acquire_temp_table().
299  *
300  *****************************************************************************/
301 
302 void acpi_tb_release_temp_table(struct acpi_table_desc *table_desc)
303 {
304 
305 	/*
306 	 * Note that the .Address is maintained by the callers of
307 	 * acpi_tb_acquire_temp_table(), thus do not invoke acpi_tb_uninstall_table()
308 	 * where .Address will be freed.
309 	 */
310 	acpi_tb_invalidate_table(table_desc);
311 }
312 
313 /******************************************************************************
314  *
315  * FUNCTION:    acpi_tb_validate_table
316  *
317  * PARAMETERS:  table_desc          - Table descriptor
318  *
319  * RETURN:      Status
320  *
321  * DESCRIPTION: This function is called to validate the table, the returned
322  *              table descriptor is in "VALIDATED" state.
323  *
324  *****************************************************************************/
325 
326 acpi_status acpi_tb_validate_table(struct acpi_table_desc *table_desc)
327 {
328 	acpi_status status = AE_OK;
329 
330 	ACPI_FUNCTION_TRACE(tb_validate_table);
331 
332 	/* Validate the table if necessary */
333 
334 	if (!table_desc->pointer) {
335 		status = acpi_tb_acquire_table(table_desc, &table_desc->pointer,
336 					       &table_desc->length,
337 					       &table_desc->flags);
338 		if (!table_desc->pointer) {
339 			status = AE_NO_MEMORY;
340 		}
341 	}
342 
343 	return_ACPI_STATUS(status);
344 }
345 
346 /*******************************************************************************
347  *
348  * FUNCTION:    acpi_tb_invalidate_table
349  *
350  * PARAMETERS:  table_desc          - Table descriptor
351  *
352  * RETURN:      None
353  *
354  * DESCRIPTION: Invalidate one internal ACPI table, this is the inverse of
355  *              acpi_tb_validate_table().
356  *
357  ******************************************************************************/
358 
359 void acpi_tb_invalidate_table(struct acpi_table_desc *table_desc)
360 {
361 
362 	ACPI_FUNCTION_TRACE(tb_invalidate_table);
363 
364 	/* Table must be validated */
365 
366 	if (!table_desc->pointer) {
367 		return_VOID;
368 	}
369 
370 	acpi_tb_release_table(table_desc->pointer, table_desc->length,
371 			      table_desc->flags);
372 	table_desc->pointer = NULL;
373 
374 	return_VOID;
375 }
376 
377 /******************************************************************************
378  *
379  * FUNCTION:    acpi_tb_validate_temp_table
380  *
381  * PARAMETERS:  table_desc          - Table descriptor
382  *
383  * RETURN:      Status
384  *
385  * DESCRIPTION: This function is called to validate the table, the returned
386  *              table descriptor is in "VALIDATED" state.
387  *
388  *****************************************************************************/
389 
390 acpi_status acpi_tb_validate_temp_table(struct acpi_table_desc *table_desc)
391 {
392 
393 	if (!table_desc->pointer && !acpi_gbl_enable_table_validation) {
394 		/*
395 		 * Only validates the header of the table.
396 		 * Note that Length contains the size of the mapping after invoking
397 		 * this work around, this value is required by
398 		 * acpi_tb_release_temp_table().
399 		 * We can do this because in acpi_init_table_descriptor(), the Length
400 		 * field of the installed descriptor is filled with the actual
401 		 * table length obtaining from the table header.
402 		 */
403 		table_desc->length = sizeof(struct acpi_table_header);
404 	}
405 
406 	return (acpi_tb_validate_table(table_desc));
407 }
408 
409 /*******************************************************************************
410  *
411  * FUNCTION:    acpi_tb_check_duplication
412  *
413  * PARAMETERS:  table_desc          - Table descriptor
414  *              table_index         - Where the table index is returned
415  *
416  * RETURN:      Status
417  *
418  * DESCRIPTION: Avoid installing duplicated tables. However table override and
419  *              user aided dynamic table load is allowed, thus comparing the
420  *              address of the table is not sufficient, and checking the entire
421  *              table content is required.
422  *
423  ******************************************************************************/
424 
425 static acpi_status
426 acpi_tb_check_duplication(struct acpi_table_desc *table_desc, u32 *table_index)
427 {
428 	u32 i;
429 
430 	ACPI_FUNCTION_TRACE(tb_check_duplication);
431 
432 	/* Check if table is already registered */
433 
434 	for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) {
435 
436 		/* Do not compare with unverified tables */
437 
438 		if (!
439 		    (acpi_gbl_root_table_list.tables[i].
440 		     flags & ACPI_TABLE_IS_VERIFIED)) {
441 			continue;
442 		}
443 
444 		/*
445 		 * Check for a table match on the entire table length,
446 		 * not just the header.
447 		 */
448 		if (!acpi_tb_compare_tables(table_desc, i)) {
449 			continue;
450 		}
451 
452 		/*
453 		 * Note: the current mechanism does not unregister a table if it is
454 		 * dynamically unloaded. The related namespace entries are deleted,
455 		 * but the table remains in the root table list.
456 		 *
457 		 * The assumption here is that the number of different tables that
458 		 * will be loaded is actually small, and there is minimal overhead
459 		 * in just keeping the table in case it is needed again.
460 		 *
461 		 * If this assumption changes in the future (perhaps on large
462 		 * machines with many table load/unload operations), tables will
463 		 * need to be unregistered when they are unloaded, and slots in the
464 		 * root table list should be reused when empty.
465 		 */
466 		if (acpi_gbl_root_table_list.tables[i].flags &
467 		    ACPI_TABLE_IS_LOADED) {
468 
469 			/* Table is still loaded, this is an error */
470 
471 			return_ACPI_STATUS(AE_ALREADY_EXISTS);
472 		} else {
473 			*table_index = i;
474 			return_ACPI_STATUS(AE_CTRL_TERMINATE);
475 		}
476 	}
477 
478 	/* Indicate no duplication to the caller */
479 
480 	return_ACPI_STATUS(AE_OK);
481 }
482 
483 /******************************************************************************
484  *
485  * FUNCTION:    acpi_tb_verify_temp_table
486  *
487  * PARAMETERS:  table_desc          - Table descriptor
488  *              signature           - Table signature to verify
489  *              table_index         - Where the table index is returned
490  *
491  * RETURN:      Status
492  *
493  * DESCRIPTION: This function is called to validate and verify the table, the
494  *              returned table descriptor is in "VALIDATED" state.
495  *              Note that 'TableIndex' is required to be set to !NULL to
496  *              enable duplication check.
497  *
498  *****************************************************************************/
499 
500 acpi_status
501 acpi_tb_verify_temp_table(struct acpi_table_desc *table_desc,
502 			  char *signature, u32 *table_index)
503 {
504 	acpi_status status = AE_OK;
505 
506 	ACPI_FUNCTION_TRACE(tb_verify_temp_table);
507 
508 	/* Validate the table */
509 
510 	status = acpi_tb_validate_temp_table(table_desc);
511 	if (ACPI_FAILURE(status)) {
512 		return_ACPI_STATUS(AE_NO_MEMORY);
513 	}
514 
515 	/* If a particular signature is expected (DSDT/FACS), it must match */
516 
517 	if (signature && !ACPI_COMPARE_NAME(&table_desc->signature, signature)) {
518 		ACPI_BIOS_ERROR((AE_INFO,
519 				 "Invalid signature 0x%X for ACPI table, expected [%s]",
520 				 table_desc->signature.integer, signature));
521 		status = AE_BAD_SIGNATURE;
522 		goto invalidate_and_exit;
523 	}
524 
525 	if (acpi_gbl_enable_table_validation) {
526 
527 		/* Verify the checksum */
528 
529 		status =
530 		    acpi_tb_verify_checksum(table_desc->pointer,
531 					    table_desc->length);
532 		if (ACPI_FAILURE(status)) {
533 			ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY,
534 					"%4.4s 0x%8.8X%8.8X"
535 					" Attempted table install failed",
536 					acpi_ut_valid_nameseg(table_desc->
537 							      signature.
538 							      ascii) ?
539 					table_desc->signature.ascii : "????",
540 					ACPI_FORMAT_UINT64(table_desc->
541 							   address)));
542 
543 			goto invalidate_and_exit;
544 		}
545 
546 		/* Avoid duplications */
547 
548 		if (table_index) {
549 			status =
550 			    acpi_tb_check_duplication(table_desc, table_index);
551 			if (ACPI_FAILURE(status)) {
552 				if (status != AE_CTRL_TERMINATE) {
553 					ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY,
554 							"%4.4s 0x%8.8X%8.8X"
555 							" Table is duplicated",
556 							acpi_ut_valid_nameseg
557 							(table_desc->signature.
558 							 ascii) ? table_desc->
559 							signature.
560 							ascii : "????",
561 							ACPI_FORMAT_UINT64
562 							(table_desc->address)));
563 				}
564 
565 				goto invalidate_and_exit;
566 			}
567 		}
568 
569 		table_desc->flags |= ACPI_TABLE_IS_VERIFIED;
570 	}
571 
572 	return_ACPI_STATUS(status);
573 
574 invalidate_and_exit:
575 	acpi_tb_invalidate_table(table_desc);
576 	return_ACPI_STATUS(status);
577 }
578 
579 /*******************************************************************************
580  *
581  * FUNCTION:    acpi_tb_resize_root_table_list
582  *
583  * PARAMETERS:  None
584  *
585  * RETURN:      Status
586  *
587  * DESCRIPTION: Expand the size of global table array
588  *
589  ******************************************************************************/
590 
591 acpi_status acpi_tb_resize_root_table_list(void)
592 {
593 	struct acpi_table_desc *tables;
594 	u32 table_count;
595 	u32 current_table_count, max_table_count;
596 	u32 i;
597 
598 	ACPI_FUNCTION_TRACE(tb_resize_root_table_list);
599 
600 	/* allow_resize flag is a parameter to acpi_initialize_tables */
601 
602 	if (!(acpi_gbl_root_table_list.flags & ACPI_ROOT_ALLOW_RESIZE)) {
603 		ACPI_ERROR((AE_INFO,
604 			    "Resize of Root Table Array is not allowed"));
605 		return_ACPI_STATUS(AE_SUPPORT);
606 	}
607 
608 	/* Increase the Table Array size */
609 
610 	if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
611 		table_count = acpi_gbl_root_table_list.max_table_count;
612 	} else {
613 		table_count = acpi_gbl_root_table_list.current_table_count;
614 	}
615 
616 	max_table_count = table_count + ACPI_ROOT_TABLE_SIZE_INCREMENT;
617 	tables = ACPI_ALLOCATE_ZEROED(((acpi_size)max_table_count) *
618 				      sizeof(struct acpi_table_desc));
619 	if (!tables) {
620 		ACPI_ERROR((AE_INFO,
621 			    "Could not allocate new root table array"));
622 		return_ACPI_STATUS(AE_NO_MEMORY);
623 	}
624 
625 	/* Copy and free the previous table array */
626 
627 	current_table_count = 0;
628 	if (acpi_gbl_root_table_list.tables) {
629 		for (i = 0; i < table_count; i++) {
630 			if (acpi_gbl_root_table_list.tables[i].address) {
631 				memcpy(tables + current_table_count,
632 				       acpi_gbl_root_table_list.tables + i,
633 				       sizeof(struct acpi_table_desc));
634 				current_table_count++;
635 			}
636 		}
637 
638 		if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
639 			ACPI_FREE(acpi_gbl_root_table_list.tables);
640 		}
641 	}
642 
643 	acpi_gbl_root_table_list.tables = tables;
644 	acpi_gbl_root_table_list.max_table_count = max_table_count;
645 	acpi_gbl_root_table_list.current_table_count = current_table_count;
646 	acpi_gbl_root_table_list.flags |= ACPI_ROOT_ORIGIN_ALLOCATED;
647 
648 	return_ACPI_STATUS(AE_OK);
649 }
650 
651 /*******************************************************************************
652  *
653  * FUNCTION:    acpi_tb_get_next_table_descriptor
654  *
655  * PARAMETERS:  table_index         - Where table index is returned
656  *              table_desc          - Where table descriptor is returned
657  *
658  * RETURN:      Status and table index/descriptor.
659  *
660  * DESCRIPTION: Allocate a new ACPI table entry to the global table list
661  *
662  ******************************************************************************/
663 
664 acpi_status
665 acpi_tb_get_next_table_descriptor(u32 *table_index,
666 				  struct acpi_table_desc **table_desc)
667 {
668 	acpi_status status;
669 	u32 i;
670 
671 	/* Ensure that there is room for the table in the Root Table List */
672 
673 	if (acpi_gbl_root_table_list.current_table_count >=
674 	    acpi_gbl_root_table_list.max_table_count) {
675 		status = acpi_tb_resize_root_table_list();
676 		if (ACPI_FAILURE(status)) {
677 			return (status);
678 		}
679 	}
680 
681 	i = acpi_gbl_root_table_list.current_table_count;
682 	acpi_gbl_root_table_list.current_table_count++;
683 
684 	if (table_index) {
685 		*table_index = i;
686 	}
687 	if (table_desc) {
688 		*table_desc = &acpi_gbl_root_table_list.tables[i];
689 	}
690 
691 	return (AE_OK);
692 }
693 
694 /*******************************************************************************
695  *
696  * FUNCTION:    acpi_tb_terminate
697  *
698  * PARAMETERS:  None
699  *
700  * RETURN:      None
701  *
702  * DESCRIPTION: Delete all internal ACPI tables
703  *
704  ******************************************************************************/
705 
706 void acpi_tb_terminate(void)
707 {
708 	u32 i;
709 
710 	ACPI_FUNCTION_TRACE(tb_terminate);
711 
712 	(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
713 
714 	/* Delete the individual tables */
715 
716 	for (i = 0; i < acpi_gbl_root_table_list.current_table_count; i++) {
717 		acpi_tb_uninstall_table(&acpi_gbl_root_table_list.tables[i]);
718 	}
719 
720 	/*
721 	 * Delete the root table array if allocated locally. Array cannot be
722 	 * mapped, so we don't need to check for that flag.
723 	 */
724 	if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) {
725 		ACPI_FREE(acpi_gbl_root_table_list.tables);
726 	}
727 
728 	acpi_gbl_root_table_list.tables = NULL;
729 	acpi_gbl_root_table_list.flags = 0;
730 	acpi_gbl_root_table_list.current_table_count = 0;
731 
732 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "ACPI Tables freed\n"));
733 
734 	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
735 	return_VOID;
736 }
737 
738 /*******************************************************************************
739  *
740  * FUNCTION:    acpi_tb_delete_namespace_by_owner
741  *
742  * PARAMETERS:  table_index         - Table index
743  *
744  * RETURN:      Status
745  *
746  * DESCRIPTION: Delete all namespace objects created when this table was loaded.
747  *
748  ******************************************************************************/
749 
750 acpi_status acpi_tb_delete_namespace_by_owner(u32 table_index)
751 {
752 	acpi_owner_id owner_id;
753 	acpi_status status;
754 
755 	ACPI_FUNCTION_TRACE(tb_delete_namespace_by_owner);
756 
757 	status = acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
758 	if (ACPI_FAILURE(status)) {
759 		return_ACPI_STATUS(status);
760 	}
761 
762 	if (table_index >= acpi_gbl_root_table_list.current_table_count) {
763 
764 		/* The table index does not exist */
765 
766 		(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
767 		return_ACPI_STATUS(AE_NOT_EXIST);
768 	}
769 
770 	/* Get the owner ID for this table, used to delete namespace nodes */
771 
772 	owner_id = acpi_gbl_root_table_list.tables[table_index].owner_id;
773 	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
774 
775 	/*
776 	 * Need to acquire the namespace writer lock to prevent interference
777 	 * with any concurrent namespace walks. The interpreter must be
778 	 * released during the deletion since the acquisition of the deletion
779 	 * lock may block, and also since the execution of a namespace walk
780 	 * must be allowed to use the interpreter.
781 	 */
782 	status = acpi_ut_acquire_write_lock(&acpi_gbl_namespace_rw_lock);
783 	if (ACPI_FAILURE(status)) {
784 		return_ACPI_STATUS(status);
785 	}
786 	acpi_ns_delete_namespace_by_owner(owner_id);
787 	acpi_ut_release_write_lock(&acpi_gbl_namespace_rw_lock);
788 	return_ACPI_STATUS(status);
789 }
790 
791 /*******************************************************************************
792  *
793  * FUNCTION:    acpi_tb_allocate_owner_id
794  *
795  * PARAMETERS:  table_index         - Table index
796  *
797  * RETURN:      Status
798  *
799  * DESCRIPTION: Allocates owner_id in table_desc
800  *
801  ******************************************************************************/
802 
803 acpi_status acpi_tb_allocate_owner_id(u32 table_index)
804 {
805 	acpi_status status = AE_BAD_PARAMETER;
806 
807 	ACPI_FUNCTION_TRACE(tb_allocate_owner_id);
808 
809 	(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
810 	if (table_index < acpi_gbl_root_table_list.current_table_count) {
811 		status =
812 		    acpi_ut_allocate_owner_id(&
813 					      (acpi_gbl_root_table_list.
814 					       tables[table_index].owner_id));
815 	}
816 
817 	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
818 	return_ACPI_STATUS(status);
819 }
820 
821 /*******************************************************************************
822  *
823  * FUNCTION:    acpi_tb_release_owner_id
824  *
825  * PARAMETERS:  table_index         - Table index
826  *
827  * RETURN:      Status
828  *
829  * DESCRIPTION: Releases owner_id in table_desc
830  *
831  ******************************************************************************/
832 
833 acpi_status acpi_tb_release_owner_id(u32 table_index)
834 {
835 	acpi_status status = AE_BAD_PARAMETER;
836 
837 	ACPI_FUNCTION_TRACE(tb_release_owner_id);
838 
839 	(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
840 	if (table_index < acpi_gbl_root_table_list.current_table_count) {
841 		acpi_ut_release_owner_id(&
842 					 (acpi_gbl_root_table_list.
843 					  tables[table_index].owner_id));
844 		status = AE_OK;
845 	}
846 
847 	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
848 	return_ACPI_STATUS(status);
849 }
850 
851 /*******************************************************************************
852  *
853  * FUNCTION:    acpi_tb_get_owner_id
854  *
855  * PARAMETERS:  table_index         - Table index
856  *              owner_id            - Where the table owner_id is returned
857  *
858  * RETURN:      Status
859  *
860  * DESCRIPTION: returns owner_id for the ACPI table
861  *
862  ******************************************************************************/
863 
864 acpi_status acpi_tb_get_owner_id(u32 table_index, acpi_owner_id *owner_id)
865 {
866 	acpi_status status = AE_BAD_PARAMETER;
867 
868 	ACPI_FUNCTION_TRACE(tb_get_owner_id);
869 
870 	(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
871 	if (table_index < acpi_gbl_root_table_list.current_table_count) {
872 		*owner_id =
873 		    acpi_gbl_root_table_list.tables[table_index].owner_id;
874 		status = AE_OK;
875 	}
876 
877 	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
878 	return_ACPI_STATUS(status);
879 }
880 
881 /*******************************************************************************
882  *
883  * FUNCTION:    acpi_tb_is_table_loaded
884  *
885  * PARAMETERS:  table_index         - Index into the root table
886  *
887  * RETURN:      Table Loaded Flag
888  *
889  ******************************************************************************/
890 
891 u8 acpi_tb_is_table_loaded(u32 table_index)
892 {
893 	u8 is_loaded = FALSE;
894 
895 	(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
896 	if (table_index < acpi_gbl_root_table_list.current_table_count) {
897 		is_loaded = (u8)
898 		    (acpi_gbl_root_table_list.tables[table_index].flags &
899 		     ACPI_TABLE_IS_LOADED);
900 	}
901 
902 	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
903 	return (is_loaded);
904 }
905 
906 /*******************************************************************************
907  *
908  * FUNCTION:    acpi_tb_set_table_loaded_flag
909  *
910  * PARAMETERS:  table_index         - Table index
911  *              is_loaded           - TRUE if table is loaded, FALSE otherwise
912  *
913  * RETURN:      None
914  *
915  * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
916  *
917  ******************************************************************************/
918 
919 void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded)
920 {
921 
922 	(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
923 	if (table_index < acpi_gbl_root_table_list.current_table_count) {
924 		if (is_loaded) {
925 			acpi_gbl_root_table_list.tables[table_index].flags |=
926 			    ACPI_TABLE_IS_LOADED;
927 		} else {
928 			acpi_gbl_root_table_list.tables[table_index].flags &=
929 			    ~ACPI_TABLE_IS_LOADED;
930 		}
931 	}
932 
933 	(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
934 }
935 
936 /*******************************************************************************
937  *
938  * FUNCTION:    acpi_tb_load_table
939  *
940  * PARAMETERS:  table_index             - Table index
941  *              parent_node             - Where table index is returned
942  *
943  * RETURN:      Status
944  *
945  * DESCRIPTION: Load an ACPI table
946  *
947  ******************************************************************************/
948 
949 acpi_status
950 acpi_tb_load_table(u32 table_index, struct acpi_namespace_node *parent_node)
951 {
952 	struct acpi_table_header *table;
953 	acpi_status status;
954 	acpi_owner_id owner_id;
955 
956 	ACPI_FUNCTION_TRACE(tb_load_table);
957 
958 	/*
959 	 * Note: Now table is "INSTALLED", it must be validated before
960 	 * using.
961 	 */
962 	status = acpi_get_table_by_index(table_index, &table);
963 	if (ACPI_FAILURE(status)) {
964 		return_ACPI_STATUS(status);
965 	}
966 
967 	status = acpi_ns_load_table(table_index, parent_node);
968 
969 	/* Execute any module-level code that was found in the table */
970 
971 	if (!acpi_gbl_parse_table_as_term_list
972 	    && acpi_gbl_group_module_level_code) {
973 		acpi_ns_exec_module_code_list();
974 	}
975 
976 	/*
977 	 * Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is
978 	 * responsible for discovering any new wake GPEs by running _PRW methods
979 	 * that may have been loaded by this table.
980 	 */
981 	status = acpi_tb_get_owner_id(table_index, &owner_id);
982 	if (ACPI_SUCCESS(status)) {
983 		acpi_ev_update_gpes(owner_id);
984 	}
985 
986 	/* Invoke table handler */
987 
988 	acpi_tb_notify_table(ACPI_TABLE_EVENT_LOAD, table);
989 	return_ACPI_STATUS(status);
990 }
991 
992 /*******************************************************************************
993  *
994  * FUNCTION:    acpi_tb_install_and_load_table
995  *
996  * PARAMETERS:  address                 - Physical address of the table
997  *              flags                   - Allocation flags of the table
998  *              override                - Whether override should be performed
999  *              table_index             - Where table index is returned
1000  *
1001  * RETURN:      Status
1002  *
1003  * DESCRIPTION: Install and load an ACPI table
1004  *
1005  ******************************************************************************/
1006 
1007 acpi_status
1008 acpi_tb_install_and_load_table(acpi_physical_address address,
1009 			       u8 flags, u8 override, u32 *table_index)
1010 {
1011 	acpi_status status;
1012 	u32 i;
1013 
1014 	ACPI_FUNCTION_TRACE(tb_install_and_load_table);
1015 
1016 	/* Install the table and load it into the namespace */
1017 
1018 	status = acpi_tb_install_standard_table(address, flags, TRUE,
1019 						override, &i);
1020 	if (ACPI_FAILURE(status)) {
1021 		goto exit;
1022 	}
1023 
1024 	status = acpi_tb_load_table(i, acpi_gbl_root_node);
1025 
1026 exit:
1027 	*table_index = i;
1028 	return_ACPI_STATUS(status);
1029 }
1030 
1031 ACPI_EXPORT_SYMBOL(acpi_tb_install_and_load_table)
1032 
1033 /*******************************************************************************
1034  *
1035  * FUNCTION:    acpi_tb_unload_table
1036  *
1037  * PARAMETERS:  table_index             - Table index
1038  *
1039  * RETURN:      Status
1040  *
1041  * DESCRIPTION: Unload an ACPI table
1042  *
1043  ******************************************************************************/
1044 
1045 acpi_status acpi_tb_unload_table(u32 table_index)
1046 {
1047 	acpi_status status = AE_OK;
1048 	struct acpi_table_header *table;
1049 
1050 	ACPI_FUNCTION_TRACE(tb_unload_table);
1051 
1052 	/* Ensure the table is still loaded */
1053 
1054 	if (!acpi_tb_is_table_loaded(table_index)) {
1055 		return_ACPI_STATUS(AE_NOT_EXIST);
1056 	}
1057 
1058 	/* Invoke table handler */
1059 
1060 	status = acpi_get_table_by_index(table_index, &table);
1061 	if (ACPI_SUCCESS(status)) {
1062 		acpi_tb_notify_table(ACPI_TABLE_EVENT_UNLOAD, table);
1063 	}
1064 
1065 	/* Delete the portion of the namespace owned by this table */
1066 
1067 	status = acpi_tb_delete_namespace_by_owner(table_index);
1068 	if (ACPI_FAILURE(status)) {
1069 		return_ACPI_STATUS(status);
1070 	}
1071 
1072 	(void)acpi_tb_release_owner_id(table_index);
1073 	acpi_tb_set_table_loaded_flag(table_index, FALSE);
1074 	return_ACPI_STATUS(status);
1075 }
1076 
1077 ACPI_EXPORT_SYMBOL(acpi_tb_unload_table)
1078 
1079 /*******************************************************************************
1080  *
1081  * FUNCTION:    acpi_tb_notify_table
1082  *
1083  * PARAMETERS:  event               - Table event
1084  *              table               - Validated table pointer
1085  *
1086  * RETURN:      None
1087  *
1088  * DESCRIPTION: Notify a table event to the users.
1089  *
1090  ******************************************************************************/
1091 
1092 void acpi_tb_notify_table(u32 event, void *table)
1093 {
1094 	/* Invoke table handler if present */
1095 
1096 	if (acpi_gbl_table_handler) {
1097 		(void)acpi_gbl_table_handler(event, table,
1098 					     acpi_gbl_table_handler_context);
1099 	}
1100 }
1101