acpi_status acpi_tb_get_next_table_descriptor(u32 *table_index, struct acpi_table_desc **table_desc) { acpi_status status; u32 i; /* Ensure that there is room for the table in the Root Table List */ if (acpi_gbl_root_table_list.current_table_count >= acpi_gbl_root_table_list.max_table_count) { status = acpi_tb_resize_root_table_list(); if (ACPI_FAILURE(status)) { return (status); } } i = acpi_gbl_root_table_list.current_table_count; acpi_gbl_root_table_list.current_table_count++; if (table_index) { *table_index = i; } if (table_desc) { *table_desc = &acpi_gbl_root_table_list.tables[i]; } return (AE_OK); }
/******************************************************************************* * * 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_INIT_FUNCTION acpi_reallocate_root_table(void) { acpi_status status; struct acpi_table_desc *table_desc; u32 i, j; 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. */ if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) { return_ACPI_STATUS(AE_SUPPORT); } (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); /* * Ensure OS early boot logic, which is required by some hosts. If the * table state is reported to be wrong, developers should fix the * issue by invoking acpi_put_table() for the reported table during the * early stage. */ for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) { table_desc = &acpi_gbl_root_table_list.tables[i]; if (table_desc->pointer) { ACPI_ERROR((AE_INFO, "Table [%4.4s] is not invalidated during early boot stage", table_desc->signature.ascii)); } } if (!acpi_gbl_enable_table_validation) { /* * Now it's safe to do full table validation. We can do deferred * table initilization here once the flag is set. */ acpi_gbl_enable_table_validation = TRUE; for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) { table_desc = &acpi_gbl_root_table_list.tables[i]; if (!(table_desc->flags & ACPI_TABLE_IS_VERIFIED)) { status = acpi_tb_verify_temp_table(table_desc, NULL, &j); if (ACPI_FAILURE(status)) { acpi_tb_uninstall_table(table_desc); } } } } acpi_gbl_root_table_list.flags |= ACPI_ROOT_ALLOW_RESIZE; status = acpi_tb_resize_root_table_list(); acpi_gbl_root_table_list.flags |= ACPI_ROOT_ORIGIN_ALLOCATED; (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); return_ACPI_STATUS(status); }
/******************************************************************************* * * 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 iASL compiler and * acpi_initialize_tables. * ******************************************************************************/ acpi_status acpi_allocate_root_table(u32 initial_table_count) { acpi_gbl_root_table_list.max_table_count = initial_table_count; acpi_gbl_root_table_list.flags = ACPI_ROOT_ALLOW_RESIZE; return (acpi_tb_resize_root_table_list()); }
/******************************************************************************* * * 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 __init acpi_reallocate_root_table(void) { acpi_status status; 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. */ if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) { return_ACPI_STATUS(AE_SUPPORT); } acpi_gbl_root_table_list.flags |= ACPI_ROOT_ALLOW_RESIZE; status = acpi_tb_resize_root_table_list(); return_ACPI_STATUS(status); }
acpi_status acpi_tb_store_table(acpi_physical_address address, struct acpi_table_header *table, u32 length, u8 flags, u32 *table_index) { acpi_status status; struct acpi_table_desc *new_table; /* Ensure that there is room for the table in the Root Table List */ if (acpi_gbl_root_table_list.current_table_count >= acpi_gbl_root_table_list.max_table_count) { status = acpi_tb_resize_root_table_list(); if (ACPI_FAILURE(status)) { return (status); } } new_table = &acpi_gbl_root_table_list.tables[acpi_gbl_root_table_list. current_table_count]; /* Initialize added table */ new_table->address = address; new_table->pointer = table; new_table->length = length; new_table->owner_id = 0; new_table->flags = flags; ACPI_MOVE_32_TO_32(&new_table->signature, table->signature); *table_index = acpi_gbl_root_table_list.current_table_count; acpi_gbl_root_table_list.current_table_count++; return (AE_OK); }