1/******************************************************************************
2 *
3 * Module Name: tbinstal - ACPI table installation and removal
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2015, 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 "actables.h"
47
48#define _COMPONENT          ACPI_TABLES
49ACPI_MODULE_NAME("tbinstal")
50
51/* Local prototypes */
52static u8
53acpi_tb_compare_tables(struct acpi_table_desc *table_desc, u32 table_index);
54
55/*******************************************************************************
56 *
57 * FUNCTION:    acpi_tb_compare_tables
58 *
59 * PARAMETERS:  table_desc          - Table 1 descriptor to be compared
60 *              table_index         - Index of table 2 to be compared
61 *
62 * RETURN:      TRUE if both tables are identical.
63 *
64 * DESCRIPTION: This function compares a table with another table that has
65 *              already been installed in the root table list.
66 *
67 ******************************************************************************/
68
69static u8
70acpi_tb_compare_tables(struct acpi_table_desc *table_desc, u32 table_index)
71{
72	acpi_status status = AE_OK;
73	u8 is_identical;
74	struct acpi_table_header *table;
75	u32 table_length;
76	u8 table_flags;
77
78	status =
79	    acpi_tb_acquire_table(&acpi_gbl_root_table_list.tables[table_index],
80				  &table, &table_length, &table_flags);
81	if (ACPI_FAILURE(status)) {
82		return (FALSE);
83	}
84
85	/*
86	 * Check for a table match on the entire table length,
87	 * not just the header.
88	 */
89	is_identical = (u8)((table_desc->length != table_length ||
90			     memcmp(table_desc->pointer, table, table_length)) ?
91			    FALSE : TRUE);
92
93	/* Release the acquired table */
94
95	acpi_tb_release_table(table, table_length, table_flags);
96	return (is_identical);
97}
98
99/*******************************************************************************
100 *
101 * FUNCTION:    acpi_tb_install_table_with_override
102 *
103 * PARAMETERS:  new_table_desc          - New table descriptor to install
104 *              override                - Whether override should be performed
105 *              table_index             - Where the table index is returned
106 *
107 * RETURN:      None
108 *
109 * DESCRIPTION: Install an ACPI table into the global data structure. The
110 *              table override mechanism is called to allow the host
111 *              OS to replace any table before it is installed in the root
112 *              table array.
113 *
114 ******************************************************************************/
115
116void
117acpi_tb_install_table_with_override(struct acpi_table_desc *new_table_desc,
118				    u8 override, u32 *table_index)
119{
120	u32 i;
121	acpi_status status;
122
123	status = acpi_tb_get_next_table_descriptor(&i, NULL);
124	if (ACPI_FAILURE(status)) {
125		return;
126	}
127
128	/*
129	 * ACPI Table Override:
130	 *
131	 * Before we install the table, let the host OS override it with a new
132	 * one if desired. Any table within the RSDT/XSDT can be replaced,
133	 * including the DSDT which is pointed to by the FADT.
134	 */
135	if (override) {
136		acpi_tb_override_table(new_table_desc);
137	}
138
139	acpi_tb_init_table_descriptor(&acpi_gbl_root_table_list.tables[i],
140				      new_table_desc->address,
141				      new_table_desc->flags,
142				      new_table_desc->pointer);
143
144	acpi_tb_print_table_header(new_table_desc->address,
145				   new_table_desc->pointer);
146
147	/* This synchronizes acpi_gbl_dsdt_index */
148
149	*table_index = i;
150
151	/* Set the global integer width (based upon revision of the DSDT) */
152
153	if (i == acpi_gbl_dsdt_index) {
154		acpi_ut_set_integer_width(new_table_desc->pointer->revision);
155	}
156}
157
158/*******************************************************************************
159 *
160 * FUNCTION:    acpi_tb_install_fixed_table
161 *
162 * PARAMETERS:  address                 - Physical address of DSDT or FACS
163 *              signature               - Table signature, NULL if no need to
164 *                                        match
165 *              table_index             - Where the table index is returned
166 *
167 * RETURN:      Status
168 *
169 * DESCRIPTION: Install a fixed ACPI table (DSDT/FACS) into the global data
170 *              structure.
171 *
172 ******************************************************************************/
173
174acpi_status
175acpi_tb_install_fixed_table(acpi_physical_address address,
176			    char *signature, u32 *table_index)
177{
178	struct acpi_table_desc new_table_desc;
179	acpi_status status;
180
181	ACPI_FUNCTION_TRACE(tb_install_fixed_table);
182
183	if (!address) {
184		ACPI_ERROR((AE_INFO,
185			    "Null physical address for ACPI table [%s]",
186			    signature));
187		return (AE_NO_MEMORY);
188	}
189
190	/* Fill a table descriptor for validation */
191
192	status = acpi_tb_acquire_temp_table(&new_table_desc, address,
193					    ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL);
194	if (ACPI_FAILURE(status)) {
195		ACPI_ERROR((AE_INFO,
196			    "Could not acquire table length at %8.8X%8.8X",
197			    ACPI_FORMAT_UINT64(address)));
198		return_ACPI_STATUS(status);
199	}
200
201	/* Validate and verify a table before installation */
202
203	status = acpi_tb_verify_temp_table(&new_table_desc, signature);
204	if (ACPI_FAILURE(status)) {
205		goto release_and_exit;
206	}
207
208	/* Add the table to the global root table list */
209
210	acpi_tb_install_table_with_override(&new_table_desc, TRUE, table_index);
211
212release_and_exit:
213
214	/* Release the temporary table descriptor */
215
216	acpi_tb_release_temp_table(&new_table_desc);
217	return_ACPI_STATUS(status);
218}
219
220/*******************************************************************************
221 *
222 * FUNCTION:    acpi_tb_install_standard_table
223 *
224 * PARAMETERS:  address             - Address of the table (might be a virtual
225 *                                    address depending on the table_flags)
226 *              flags               - Flags for the table
227 *              reload              - Whether reload should be performed
228 *              override            - Whether override should be performed
229 *              table_index         - Where the table index is returned
230 *
231 * RETURN:      Status
232 *
233 * DESCRIPTION: This function is called to install an ACPI table that is
234 *              neither DSDT nor FACS (a "standard" table.)
235 *              When this function is called by "Load" or "LoadTable" opcodes,
236 *              or by acpi_load_table() API, the "Reload" parameter is set.
237 *              After sucessfully returning from this function, table is
238 *              "INSTALLED" but not "VALIDATED".
239 *
240 ******************************************************************************/
241
242acpi_status
243acpi_tb_install_standard_table(acpi_physical_address address,
244			       u8 flags,
245			       u8 reload, u8 override, u32 *table_index)
246{
247	u32 i;
248	acpi_status status = AE_OK;
249	struct acpi_table_desc new_table_desc;
250
251	ACPI_FUNCTION_TRACE(tb_install_standard_table);
252
253	/* Acquire a temporary table descriptor for validation */
254
255	status = acpi_tb_acquire_temp_table(&new_table_desc, address, flags);
256	if (ACPI_FAILURE(status)) {
257		ACPI_ERROR((AE_INFO,
258			    "Could not acquire table length at %8.8X%8.8X",
259			    ACPI_FORMAT_UINT64(address)));
260		return_ACPI_STATUS(status);
261	}
262
263	/*
264	 * Optionally do not load any SSDTs from the RSDT/XSDT. This can
265	 * be useful for debugging ACPI problems on some machines.
266	 */
267	if (!reload &&
268	    acpi_gbl_disable_ssdt_table_install &&
269	    ACPI_COMPARE_NAME(&new_table_desc.signature, ACPI_SIG_SSDT)) {
270		ACPI_INFO((AE_INFO,
271			   "Ignoring installation of %4.4s at %8.8X%8.8X",
272			   new_table_desc.signature.ascii,
273			   ACPI_FORMAT_UINT64(address)));
274		goto release_and_exit;
275	}
276
277	/* Validate and verify a table before installation */
278
279	status = acpi_tb_verify_temp_table(&new_table_desc, NULL);
280	if (ACPI_FAILURE(status)) {
281		goto release_and_exit;
282	}
283
284	if (reload) {
285		/*
286		 * Validate the incoming table signature.
287		 *
288		 * 1) Originally, we checked the table signature for "SSDT" or "PSDT".
289		 * 2) We added support for OEMx tables, signature "OEM".
290		 * 3) Valid tables were encountered with a null signature, so we just
291		 *    gave up on validating the signature, (05/2008).
292		 * 4) We encountered non-AML tables such as the MADT, which caused
293		 *    interpreter errors and kernel faults. So now, we once again allow
294		 *    only "SSDT", "OEMx", and now, also a null signature. (05/2011).
295		 */
296		if ((new_table_desc.signature.ascii[0] != 0x00) &&
297		    (!ACPI_COMPARE_NAME
298		     (&new_table_desc.signature, ACPI_SIG_SSDT))
299		    && (strncmp(new_table_desc.signature.ascii, "OEM", 3))) {
300			ACPI_BIOS_ERROR((AE_INFO,
301					 "Table has invalid signature [%4.4s] (0x%8.8X), "
302					 "must be SSDT or OEMx",
303					 acpi_ut_valid_acpi_name(new_table_desc.
304								 signature.
305								 ascii) ?
306					 new_table_desc.signature.
307					 ascii : "????",
308					 new_table_desc.signature.integer));
309
310			status = AE_BAD_SIGNATURE;
311			goto release_and_exit;
312		}
313
314		/* Check if table is already registered */
315
316		for (i = 0; i < acpi_gbl_root_table_list.current_table_count;
317		     ++i) {
318			/*
319			 * Check for a table match on the entire table length,
320			 * not just the header.
321			 */
322			if (!acpi_tb_compare_tables(&new_table_desc, i)) {
323				continue;
324			}
325
326			/*
327			 * Note: the current mechanism does not unregister a table if it is
328			 * dynamically unloaded. The related namespace entries are deleted,
329			 * but the table remains in the root table list.
330			 *
331			 * The assumption here is that the number of different tables that
332			 * will be loaded is actually small, and there is minimal overhead
333			 * in just keeping the table in case it is needed again.
334			 *
335			 * If this assumption changes in the future (perhaps on large
336			 * machines with many table load/unload operations), tables will
337			 * need to be unregistered when they are unloaded, and slots in the
338			 * root table list should be reused when empty.
339			 */
340			if (acpi_gbl_root_table_list.tables[i].
341			    flags & ACPI_TABLE_IS_LOADED) {
342
343				/* Table is still loaded, this is an error */
344
345				status = AE_ALREADY_EXISTS;
346				goto release_and_exit;
347			} else {
348				/*
349				 * Table was unloaded, allow it to be reloaded.
350				 * As we are going to return AE_OK to the caller, we should
351				 * take the responsibility of freeing the input descriptor.
352				 * Refill the input descriptor to ensure
353				 * acpi_tb_install_table_with_override() can be called again to
354				 * indicate the re-installation.
355				 */
356				acpi_tb_uninstall_table(&new_table_desc);
357				*table_index = i;
358				return_ACPI_STATUS(AE_OK);
359			}
360		}
361	}
362
363	/* Add the table to the global root table list */
364
365	acpi_tb_install_table_with_override(&new_table_desc, override,
366					    table_index);
367
368release_and_exit:
369
370	/* Release the temporary table descriptor */
371
372	acpi_tb_release_temp_table(&new_table_desc);
373	return_ACPI_STATUS(status);
374}
375
376/*******************************************************************************
377 *
378 * FUNCTION:    acpi_tb_override_table
379 *
380 * PARAMETERS:  old_table_desc      - Validated table descriptor to be
381 *                                    overridden
382 *
383 * RETURN:      None
384 *
385 * DESCRIPTION: Attempt table override by calling the OSL override functions.
386 *              Note: If the table is overridden, then the entire new table
387 *              is acquired and returned by this function.
388 *              Before/after invocation, the table descriptor is in a state
389 *              that is "VALIDATED".
390 *
391 ******************************************************************************/
392
393void acpi_tb_override_table(struct acpi_table_desc *old_table_desc)
394{
395	acpi_status status;
396	char *override_type;
397	struct acpi_table_desc new_table_desc;
398	struct acpi_table_header *table;
399	acpi_physical_address address;
400	u32 length;
401
402	/* (1) Attempt logical override (returns a logical address) */
403
404	status = acpi_os_table_override(old_table_desc->pointer, &table);
405	if (ACPI_SUCCESS(status) && table) {
406		acpi_tb_acquire_temp_table(&new_table_desc,
407					   ACPI_PTR_TO_PHYSADDR(table),
408					   ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL);
409		override_type = "Logical";
410		goto finish_override;
411	}
412
413	/* (2) Attempt physical override (returns a physical address) */
414
415	status = acpi_os_physical_table_override(old_table_desc->pointer,
416						 &address, &length);
417	if (ACPI_SUCCESS(status) && address && length) {
418		acpi_tb_acquire_temp_table(&new_table_desc, address,
419					   ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL);
420		override_type = "Physical";
421		goto finish_override;
422	}
423
424	return;			/* There was no override */
425
426finish_override:
427
428	/* Validate and verify a table before overriding */
429
430	status = acpi_tb_verify_temp_table(&new_table_desc, NULL);
431	if (ACPI_FAILURE(status)) {
432		return;
433	}
434
435	ACPI_INFO((AE_INFO, "%4.4s 0x%8.8X%8.8X"
436		   " %s table override, new table: 0x%8.8X%8.8X",
437		   old_table_desc->signature.ascii,
438		   ACPI_FORMAT_UINT64(old_table_desc->address),
439		   override_type, ACPI_FORMAT_UINT64(new_table_desc.address)));
440
441	/* We can now uninstall the original table */
442
443	acpi_tb_uninstall_table(old_table_desc);
444
445	/*
446	 * Replace the original table descriptor and keep its state as
447	 * "VALIDATED".
448	 */
449	acpi_tb_init_table_descriptor(old_table_desc, new_table_desc.address,
450				      new_table_desc.flags,
451				      new_table_desc.pointer);
452	acpi_tb_validate_temp_table(old_table_desc);
453
454	/* Release the temporary table descriptor */
455
456	acpi_tb_release_temp_table(&new_table_desc);
457}
458
459/*******************************************************************************
460 *
461 * FUNCTION:    acpi_tb_uninstall_table
462 *
463 * PARAMETERS:  table_desc          - Table descriptor
464 *
465 * RETURN:      None
466 *
467 * DESCRIPTION: Delete one internal ACPI table
468 *
469 ******************************************************************************/
470
471void acpi_tb_uninstall_table(struct acpi_table_desc *table_desc)
472{
473
474	ACPI_FUNCTION_TRACE(tb_uninstall_table);
475
476	/* Table must be installed */
477
478	if (!table_desc->address) {
479		return_VOID;
480	}
481
482	acpi_tb_invalidate_table(table_desc);
483
484	if ((table_desc->flags & ACPI_TABLE_ORIGIN_MASK) ==
485	    ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL) {
486		ACPI_FREE(ACPI_PHYSADDR_TO_PTR(table_desc->address));
487	}
488
489	table_desc->address = ACPI_PTR_TO_PHYSADDR(NULL);
490	return_VOID;
491}
492