acpi_status
acpi_tb_install_non_fixed_table(acpi_physical_address address,
- u8 flags, u8 reload, u32 *table_index);
+ u8 flags,
+ u8 reload, u8 override, u32 *table_index);
acpi_status
acpi_tb_store_table(acpi_physical_address address,
void
acpi_tb_install_and_override_table(u32 table_index,
- struct acpi_table_desc *new_table_desc);
+ struct acpi_table_desc *new_table_desc,
+ u8 override);
acpi_status
acpi_tb_install_fixed_table(acpi_physical_address address,
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
status = acpi_tb_install_non_fixed_table(ACPI_PTR_TO_PHYSADDR(table),
ACPI_TABLE_ORIGIN_INTERN_VIRTUAL,
- TRUE, &table_index);
+ TRUE, TRUE, &table_index);
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
if (ACPI_FAILURE(status)) {
*
* PARAMETERS: table_index - Index into root table array
* new_table_desc - New table descriptor to install
+ * override - Whether override should be performed
*
* RETURN: None
*
void
acpi_tb_install_and_override_table(u32 table_index,
- struct acpi_table_desc *new_table_desc)
+ struct acpi_table_desc *new_table_desc,
+ u8 override)
{
if (table_index >= acpi_gbl_root_table_list.current_table_count) {
return;
* one if desired. Any table within the RSDT/XSDT can be replaced,
* including the DSDT which is pointed to by the FADT.
*/
- acpi_tb_override_table(new_table_desc);
+ if (override) {
+ acpi_tb_override_table(new_table_desc);
+ }
acpi_tb_install_table(&acpi_gbl_root_table_list.tables[table_index],
new_table_desc->address, new_table_desc->flags,
goto release_and_exit;
}
- acpi_tb_install_and_override_table(table_index, &new_table_desc);
+ acpi_tb_install_and_override_table(table_index, &new_table_desc, TRUE);
release_and_exit:
* address depending on the table_flags)
* flags - Flags for the table
* reload - Whether reload should be performed
+ * override - Whether override should be performed
* table_index - Where the table index is returned
*
* RETURN: Status
acpi_status
acpi_tb_install_non_fixed_table(acpi_physical_address address,
- u8 flags, u8 reload, u32 *table_index)
+ u8 flags,
+ u8 reload, u8 override, u32 *table_index)
{
u32 i;
acpi_status status = AE_OK;
goto release_and_exit;
}
*table_index = i;
- acpi_tb_install_and_override_table(i, &new_table_desc);
+ acpi_tb_install_and_override_table(i, &new_table_desc, override);
release_and_exit:
(table_entry,
table_entry_size),
ACPI_TABLE_ORIGIN_INTERN_PHYSICAL,
- FALSE, &table_index);
+ FALSE, TRUE, &table_index);
if (ACPI_SUCCESS(status) &&
ACPI_COMPARE_NAME(&acpi_gbl_root_table_list.
return_ACPI_STATUS(status);
}
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_install_table
+ *
+ * PARAMETERS: address - Address of the ACPI table to be installed.
+ * physical - Whether the address is a physical table
+ * address or not
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Dynamically install an ACPI table.
+ * Note: This function should only be invoked after
+ * acpi_initialize_tables() and before acpi_load_tables().
+ *
+ ******************************************************************************/
+
+acpi_status __init
+acpi_install_table(acpi_physical_address address, u8 physical)
+{
+ acpi_status status;
+ u8 flags;
+ u32 table_index;
+
+ ACPI_FUNCTION_TRACE(acpi_install_table);
+
+ if (physical) {
+ flags = ACPI_TABLE_ORIGIN_EXTERN_VIRTUAL;
+ } else {
+ flags = ACPI_TABLE_ORIGIN_INTERN_PHYSICAL;
+ }
+
+ status = acpi_tb_install_non_fixed_table(address, flags,
+ FALSE, FALSE, &table_index);
+
+ return_ACPI_STATUS(status);
+}
+
+ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
+
/*******************************************************************************
*
* FUNCTION: acpi_load_table
* to ensure that the table is not deleted or unmapped.
*
******************************************************************************/
-
acpi_status acpi_load_table(struct acpi_table_header *table)
{
acpi_status status;
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
status = acpi_tb_install_non_fixed_table(ACPI_PTR_TO_PHYSADDR(table),
ACPI_TABLE_ORIGIN_EXTERN_VIRTUAL,
- TRUE, &table_index);
+ TRUE, FALSE, &table_index);
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
if (ACPI_FAILURE(status)) {
goto unlock_and_exit;
/*
* ACPI table load/unload interfaces
*/
+acpi_status __init
+acpi_install_table(acpi_physical_address address, u8 physical);
+
acpi_status acpi_load_table(struct acpi_table_header *table);
acpi_status acpi_unload_parent_table(acpi_handle object);