/******************************************************************************* * * FUNCTION: acpi_unload_table * * PARAMETERS: table_type - Type of table to be unloaded * * RETURN: Status * * DESCRIPTION: This routine is used to force the unload of a table * ******************************************************************************/ acpi_status acpi_unload_table(acpi_table_type table_type) { struct acpi_table_desc *table_desc; ACPI_FUNCTION_TRACE(acpi_unload_table); /* Parameter validation */ if (table_type > ACPI_TABLE_ID_MAX) { return_ACPI_STATUS(AE_BAD_PARAMETER); } /* Find all tables of the requested type */ table_desc = acpi_gbl_table_lists[table_type].next; if (!table_desc) { return_ACPI_STATUS(AE_NOT_EXIST); } while (table_desc) { /* * 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_ns_delete_namespace_by_owner(table_desc->owner_id); table_desc = table_desc->next; } /* Delete (or unmap) all tables of this type */ acpi_tb_delete_tables_by_type(table_type); return_ACPI_STATUS(AE_OK); }
void acpi_tb_delete_all_tables(void) { acpi_table_type type; /* * Free memory allocated for ACPI tables * Memory can either be mapped or allocated */ for (type = 0; type < (ACPI_TABLE_ID_MAX + 1); type++) { acpi_tb_delete_tables_by_type(type); } }
acpi_status acpi_tb_get_required_tables ( void) { acpi_status status = AE_OK; u32 i; struct acpi_table_desc table_info; struct acpi_pointer address; ACPI_FUNCTION_TRACE ("tb_get_required_tables"); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%d ACPI tables in RSDT\n", acpi_gbl_rsdt_table_count)); address.pointer_type = acpi_gbl_table_flags | ACPI_LOGICAL_ADDRESSING; /* * Loop through all table pointers found in RSDT. * This will NOT include the FACS and DSDT - we must get * them after the loop. * * The only tables we are interested in getting here is the FADT and * any SSDTs. */ for (i = 0; i < acpi_gbl_rsdt_table_count; i++) { /* Get the table address from the common internal XSDT */ address.pointer.value = acpi_gbl_XSDT->table_offset_entry[i]; /* * Get the tables needed by this subsystem (FADT and any SSDTs). * NOTE: All other tables are completely ignored at this time. */ status = acpi_tb_get_primary_table (&address, &table_info); if ((status != AE_OK) && (status != AE_TABLE_NOT_SUPPORTED)) { ACPI_REPORT_WARNING (("%s, while getting table at %8.8X%8.8X\n", acpi_format_exception (status), ACPI_FORMAT_UINT64 (address.pointer.value))); } } /* We must have a FADT to continue */ if (!acpi_gbl_FADT) { ACPI_REPORT_ERROR (("No FADT present in RSDT/XSDT\n")); return_ACPI_STATUS (AE_NO_ACPI_TABLES); } /* * Convert the FADT to a common format. This allows earlier revisions of the * table to coexist with newer versions, using common access code. */ status = acpi_tb_convert_table_fadt (); if (ACPI_FAILURE (status)) { ACPI_REPORT_ERROR (("Could not convert FADT to internal common format\n")); return_ACPI_STATUS (status); } /* * Get the FACS (Pointed to by the FADT) */ address.pointer.value = acpi_gbl_FADT->xfirmware_ctrl; status = acpi_tb_get_secondary_table (&address, FACS_SIG, &table_info); if (ACPI_FAILURE (status)) { ACPI_REPORT_ERROR (("Could not get/install the FACS, %s\n", acpi_format_exception (status))); return_ACPI_STATUS (status); } /* * Create the common FACS pointer table * (Contains pointers to the original table) */ status = acpi_tb_build_common_facs (&table_info); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } /* * Get/install the DSDT (Pointed to by the FADT) */ address.pointer.value = acpi_gbl_FADT->Xdsdt; status = acpi_tb_get_secondary_table (&address, DSDT_SIG, &table_info); if (ACPI_FAILURE (status)) { ACPI_REPORT_ERROR (("Could not get/install the DSDT\n")); return_ACPI_STATUS (status); } /* Set Integer Width (32/64) based upon DSDT revision */ acpi_ut_set_integer_width (acpi_gbl_DSDT->revision); /* Dump the entire DSDT */ ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "Hex dump of entire DSDT, size %d (0x%X), Integer width = %d\n", acpi_gbl_DSDT->length, acpi_gbl_DSDT->length, acpi_gbl_integer_bit_width)); ACPI_DUMP_BUFFER ((u8 *) acpi_gbl_DSDT, acpi_gbl_DSDT->length); /* Always delete the RSDP mapping, we are done with it */ acpi_tb_delete_tables_by_type (ACPI_TABLE_RSDP); return_ACPI_STATUS (status); }