Merge branch 'acpica'

* acpica:
  ACPI: Clean up incorrect inclusions of ACPICA headers
  ACPICA: Update version to 20131115.
  ACPICA: Add support to delete all objects attached to the root namespace node.
  ACPICA: Delete all attached data objects during namespace node deletion.
  ACPICA: Resources: Fix loop termination for the get AML length function.
  ACPICA: Tests: Add CHECKSUM_ABORT protection for test utilities.
  ACPICA: Debug output: Do not emit function nesting level for kernel build.
This commit is contained in:
Rafael J. Wysocki 2013-11-27 01:03:27 +01:00
commit 2d304ba757
11 changed files with 79 additions and 47 deletions

View File

@ -184,7 +184,7 @@ acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer,
struct acpi_buffer *output_buffer); struct acpi_buffer *output_buffer);
acpi_status acpi_status
acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer, acpi_rs_create_aml_resources(struct acpi_buffer *resource_list,
struct acpi_buffer *output_buffer); struct acpi_buffer *output_buffer);
acpi_status acpi_status
@ -227,8 +227,8 @@ acpi_rs_get_list_length(u8 * aml_buffer,
u32 aml_buffer_length, acpi_size * size_needed); u32 aml_buffer_length, acpi_size * size_needed);
acpi_status acpi_status
acpi_rs_get_aml_length(struct acpi_resource *linked_list_buffer, acpi_rs_get_aml_length(struct acpi_resource *resource_list,
acpi_size * size_needed); acpi_size resource_list_size, acpi_size * size_needed);
acpi_status acpi_status
acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object, acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,

View File

@ -106,6 +106,7 @@ struct acpi_namespace_node *acpi_ns_create_node(u32 name)
void acpi_ns_delete_node(struct acpi_namespace_node *node) void acpi_ns_delete_node(struct acpi_namespace_node *node)
{ {
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
union acpi_operand_object *next_desc;
ACPI_FUNCTION_NAME(ns_delete_node); ACPI_FUNCTION_NAME(ns_delete_node);
@ -114,12 +115,13 @@ void acpi_ns_delete_node(struct acpi_namespace_node *node)
acpi_ns_detach_object(node); acpi_ns_detach_object(node);
/* /*
* Delete an attached data object if present (an object that was created * Delete an attached data object list if present (objects that were
* and attached via acpi_attach_data). Note: After any normal object is * attached via acpi_attach_data). Note: After any normal object is
* detached above, the only possible remaining object is a data object. * detached above, the only possible remaining object(s) are data
* objects, in a linked list.
*/ */
obj_desc = node->object; obj_desc = node->object;
if (obj_desc && (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) { while (obj_desc && (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) {
/* Invoke the attached data deletion handler if present */ /* Invoke the attached data deletion handler if present */
@ -127,7 +129,15 @@ void acpi_ns_delete_node(struct acpi_namespace_node *node)
obj_desc->data.handler(node, obj_desc->data.pointer); obj_desc->data.handler(node, obj_desc->data.pointer);
} }
next_desc = obj_desc->common.next_object;
acpi_ut_remove_reference(obj_desc); acpi_ut_remove_reference(obj_desc);
obj_desc = next_desc;
}
/* Special case for the statically allocated root node */
if (node == acpi_gbl_root_node) {
return;
} }
/* Now we can delete the node */ /* Now we can delete the node */

View File

@ -593,24 +593,26 @@ struct acpi_namespace_node *acpi_ns_validate_handle(acpi_handle handle)
void acpi_ns_terminate(void) void acpi_ns_terminate(void)
{ {
union acpi_operand_object *obj_desc; acpi_status status;
ACPI_FUNCTION_TRACE(ns_terminate); ACPI_FUNCTION_TRACE(ns_terminate);
/* /*
* 1) Free the entire namespace -- all nodes and objects * Free the entire namespace -- all nodes and all objects
* * attached to the nodes
* Delete all object descriptors attached to namepsace nodes
*/ */
acpi_ns_delete_namespace_subtree(acpi_gbl_root_node); acpi_ns_delete_namespace_subtree(acpi_gbl_root_node);
/* Detach any objects attached to the root */ /* Delete any objects attached to the root node */
obj_desc = acpi_ns_get_attached_object(acpi_gbl_root_node); status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
if (obj_desc) { if (ACPI_FAILURE(status)) {
acpi_ns_detach_object(acpi_gbl_root_node); return_VOID;
} }
acpi_ns_delete_node(acpi_gbl_root_node);
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Namespace freed\n")); ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Namespace freed\n"));
return_VOID; return_VOID;
} }

View File

@ -174,6 +174,7 @@ acpi_rs_stream_option_length(u32 resource_length,
* FUNCTION: acpi_rs_get_aml_length * FUNCTION: acpi_rs_get_aml_length
* *
* PARAMETERS: resource - Pointer to the resource linked list * PARAMETERS: resource - Pointer to the resource linked list
* resource_list_size - Size of the resource linked list
* size_needed - Where the required size is returned * size_needed - Where the required size is returned
* *
* RETURN: Status * RETURN: Status
@ -185,16 +186,20 @@ acpi_rs_stream_option_length(u32 resource_length,
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed) acpi_rs_get_aml_length(struct acpi_resource *resource,
acpi_size resource_list_size, acpi_size * size_needed)
{ {
acpi_size aml_size_needed = 0; acpi_size aml_size_needed = 0;
struct acpi_resource *resource_end;
acpi_rs_length total_size; acpi_rs_length total_size;
ACPI_FUNCTION_TRACE(rs_get_aml_length); ACPI_FUNCTION_TRACE(rs_get_aml_length);
/* Traverse entire list of internal resource descriptors */ /* Traverse entire list of internal resource descriptors */
while (resource) { resource_end =
ACPI_ADD_PTR(struct acpi_resource, resource, resource_list_size);
while (resource < resource_end) {
/* Validate the descriptor type */ /* Validate the descriptor type */

View File

@ -418,22 +418,21 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
* *
* FUNCTION: acpi_rs_create_aml_resources * FUNCTION: acpi_rs_create_aml_resources
* *
* PARAMETERS: linked_list_buffer - Pointer to the resource linked list * PARAMETERS: resource_list - Pointer to the resource list buffer
* output_buffer - Pointer to the user's buffer * output_buffer - Where the AML buffer is returned
* *
* RETURN: Status AE_OK if okay, else a valid acpi_status code. * RETURN: Status AE_OK if okay, else a valid acpi_status code.
* If the output_buffer is too small, the error will be * If the output_buffer is too small, the error will be
* AE_BUFFER_OVERFLOW and output_buffer->Length will point * AE_BUFFER_OVERFLOW and output_buffer->Length will point
* to the size buffer needed. * to the size buffer needed.
* *
* DESCRIPTION: Takes the linked list of device resources and * DESCRIPTION: Converts a list of device resources to an AML bytestream
* creates a bytestream to be used as input for the * to be used as input for the _SRS control method.
* _SRS control method.
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer, acpi_rs_create_aml_resources(struct acpi_buffer *resource_list,
struct acpi_buffer *output_buffer) struct acpi_buffer *output_buffer)
{ {
acpi_status status; acpi_status status;
@ -441,16 +440,16 @@ acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer,
ACPI_FUNCTION_TRACE(rs_create_aml_resources); ACPI_FUNCTION_TRACE(rs_create_aml_resources);
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "LinkedListBuffer = %p\n", /* Params already validated, no need to re-validate here */
linked_list_buffer));
/* ACPI_DEBUG_PRINT((ACPI_DB_INFO, "ResourceList Buffer = %p\n",
* Params already validated, so we don't re-validate here resource_list->pointer));
*
* Pass the linked_list_buffer into a module that calculates /* Get the buffer size needed for the AML byte stream */
* the buffer size needed for the byte stream.
*/ status = acpi_rs_get_aml_length(resource_list->pointer,
status = acpi_rs_get_aml_length(linked_list_buffer, &aml_size_needed); resource_list->length,
&aml_size_needed);
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n", ACPI_DEBUG_PRINT((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n",
(u32)aml_size_needed, acpi_format_exception(status))); (u32)aml_size_needed, acpi_format_exception(status)));
@ -467,10 +466,9 @@ acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer,
/* Do the conversion */ /* Do the conversion */
status = status = acpi_rs_convert_resources_to_aml(resource_list->pointer,
acpi_rs_convert_resources_to_aml(linked_list_buffer, aml_size_needed,
aml_size_needed, output_buffer->pointer);
output_buffer->pointer);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }

View File

@ -753,7 +753,7 @@ acpi_rs_set_srs_method_data(struct acpi_namespace_node *node,
* Convert the linked list into a byte stream * Convert the linked list into a byte stream
*/ */
buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
status = acpi_rs_create_aml_resources(in_buffer->pointer, &buffer); status = acpi_rs_create_aml_resources(in_buffer, &buffer);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto cleanup; goto cleanup;
} }

View File

@ -185,6 +185,7 @@ acpi_debug_print(u32 requested_debug_level,
} }
acpi_gbl_prev_thread_id = thread_id; acpi_gbl_prev_thread_id = thread_id;
acpi_gbl_nesting_level = 0;
} }
/* /*
@ -193,13 +194,21 @@ acpi_debug_print(u32 requested_debug_level,
*/ */
acpi_os_printf("%9s-%04ld ", module_name, line_number); acpi_os_printf("%9s-%04ld ", module_name, line_number);
#ifdef ACPI_EXEC_APP
/*
* For acpi_exec only, emit the thread ID and nesting level.
* Note: nesting level is really only useful during a single-thread
* execution. Otherwise, multiple threads will keep resetting the
* level.
*/
if (ACPI_LV_THREADS & acpi_dbg_level) { if (ACPI_LV_THREADS & acpi_dbg_level) {
acpi_os_printf("[%u] ", (u32)thread_id); acpi_os_printf("[%u] ", (u32)thread_id);
} }
acpi_os_printf("[%02ld] %-22.22s: ", acpi_os_printf("[%02ld] ", acpi_gbl_nesting_level);
acpi_gbl_nesting_level, #endif
acpi_ut_trim_function_name(function_name));
acpi_os_printf("%-22.22s: ", acpi_ut_trim_function_name(function_name));
va_start(args, format); va_start(args, format);
acpi_os_vprintf(format, args); acpi_os_vprintf(format, args);
@ -420,7 +429,9 @@ acpi_ut_exit(u32 line_number,
component_id, "%s\n", acpi_gbl_fn_exit_str); component_id, "%s\n", acpi_gbl_fn_exit_str);
} }
acpi_gbl_nesting_level--; if (acpi_gbl_nesting_level) {
acpi_gbl_nesting_level--;
}
} }
ACPI_EXPORT_SYMBOL(acpi_ut_exit) ACPI_EXPORT_SYMBOL(acpi_ut_exit)
@ -467,7 +478,9 @@ acpi_ut_status_exit(u32 line_number,
} }
} }
acpi_gbl_nesting_level--; if (acpi_gbl_nesting_level) {
acpi_gbl_nesting_level--;
}
} }
ACPI_EXPORT_SYMBOL(acpi_ut_status_exit) ACPI_EXPORT_SYMBOL(acpi_ut_status_exit)
@ -504,7 +517,9 @@ acpi_ut_value_exit(u32 line_number,
ACPI_FORMAT_UINT64(value)); ACPI_FORMAT_UINT64(value));
} }
acpi_gbl_nesting_level--; if (acpi_gbl_nesting_level) {
acpi_gbl_nesting_level--;
}
} }
ACPI_EXPORT_SYMBOL(acpi_ut_value_exit) ACPI_EXPORT_SYMBOL(acpi_ut_value_exit)
@ -540,7 +555,9 @@ acpi_ut_ptr_exit(u32 line_number,
ptr); ptr);
} }
acpi_gbl_nesting_level--; if (acpi_gbl_nesting_level) {
acpi_gbl_nesting_level--;
}
} }
#endif #endif

View File

@ -13,7 +13,6 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/acpi_io.h> #include <linux/acpi_io.h>
#include <acpi/acpiosxf.h>
/* ACPI NVS regions, APEI may use it */ /* ACPI NVS regions, APEI may use it */

View File

@ -18,7 +18,6 @@
#include <linux/err.h> #include <linux/err.h>
#include <acpi/acpi.h> #include <acpi/acpi.h>
#include <acpi/acpixf.h>
#include <acpi/acpi_drivers.h> #include <acpi/acpi_drivers.h>
#include <acpi/acpi_bus.h> #include <acpi/acpi_bus.h>

View File

@ -83,7 +83,9 @@
* Should the subsystem abort the loading of an ACPI table if the * Should the subsystem abort the loading of an ACPI table if the
* table checksum is incorrect? * table checksum is incorrect?
*/ */
#ifndef ACPI_CHECKSUM_ABORT
#define ACPI_CHECKSUM_ABORT FALSE #define ACPI_CHECKSUM_ABORT FALSE
#endif
/* /*
* Generate a version of ACPICA that only supports "reduced hardware" * Generate a version of ACPICA that only supports "reduced hardware"

View File

@ -46,7 +46,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */ /* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20130927 #define ACPI_CA_VERSION 0x20131115
#include <acpi/acconfig.h> #include <acpi/acconfig.h>
#include <acpi/actypes.h> #include <acpi/actypes.h>