diff options
Diffstat (limited to 'drivers/acpi/acpica/nsdump.c')
| -rw-r--r-- | drivers/acpi/acpica/nsdump.c | 227 | 
1 files changed, 200 insertions, 27 deletions
diff --git a/drivers/acpi/acpica/nsdump.c b/drivers/acpi/acpica/nsdump.c index a54dc39e304..3d88ef4a3e0 100644 --- a/drivers/acpi/acpica/nsdump.c +++ b/drivers/acpi/acpica/nsdump.c @@ -5,7 +5,7 @@   *****************************************************************************/  /* - * Copyright (C) 2000 - 2010, Intel Corp. + * Copyright (C) 2000 - 2014, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -44,6 +44,7 @@  #include <acpi/acpi.h>  #include "accommon.h"  #include "acnamesp.h" +#include <acpi/acoutput.h>  #define _COMPONENT          ACPI_NAMESPACE  ACPI_MODULE_NAME("nsdump") @@ -58,12 +59,23 @@ acpi_ns_dump_one_device(acpi_handle obj_handle,  #endif  #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) + +#ifdef	ACPI_FUTURE_USAGE +static acpi_status +acpi_ns_dump_one_object_path(acpi_handle obj_handle, +			     u32 level, void *context, void **return_value); + +static acpi_status +acpi_ns_get_max_depth(acpi_handle obj_handle, +		      u32 level, void *context, void **return_value); +#endif				/* ACPI_FUTURE_USAGE */ +  /*******************************************************************************   *   * FUNCTION:    acpi_ns_print_pathname   *   * PARAMETERS:  num_segments        - Number of ACPI name segments - *              Pathname            - The compressed (internal) path + *              pathname            - The compressed (internal) path   *   * RETURN:      None   * @@ -77,8 +89,9 @@ void acpi_ns_print_pathname(u32 num_segments, char *pathname)  	ACPI_FUNCTION_NAME(ns_print_pathname); -	if (!(acpi_dbg_level & ACPI_LV_NAMES) -	    || !(acpi_dbg_layer & ACPI_NAMESPACE)) { +	/* Check if debug output enabled */ + +	if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_NAMES, ACPI_NAMESPACE)) {  		return;  	} @@ -107,10 +120,10 @@ void acpi_ns_print_pathname(u32 num_segments, char *pathname)   *   * FUNCTION:    acpi_ns_dump_pathname   * - * PARAMETERS:  Handle              - Object - *              Msg                 - Prefix message - *              Level               - Desired debug level - *              Component           - Caller's component ID + * PARAMETERS:  handle              - Object + *              msg                 - Prefix message + *              level               - Desired debug level + *              component           - Caller's component ID   *   * RETURN:      None   * @@ -127,7 +140,7 @@ acpi_ns_dump_pathname(acpi_handle handle, char *msg, u32 level, u32 component)  	/* Do this only if the requested debug level and component are enabled */ -	if (!(acpi_dbg_level & level) || !(acpi_dbg_layer & component)) { +	if (!ACPI_IS_DEBUG_ENABLED(level, component)) {  		return_VOID;  	} @@ -143,8 +156,8 @@ acpi_ns_dump_pathname(acpi_handle handle, char *msg, u32 level, u32 component)   * FUNCTION:    acpi_ns_dump_one_object   *   * PARAMETERS:  obj_handle          - Node to be dumped - *              Level               - Nesting level of the handle - *              Context             - Passed into walk_namespace + *              level               - Nesting level of the handle + *              context             - Passed into walk_namespace   *              return_value        - Not used   *   * RETURN:      Status @@ -209,14 +222,6 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,  				      "Invalid ACPI Object Type 0x%08X", type));  		} -		if (!acpi_ut_valid_acpi_name(this_node->name.integer)) { -			this_node->name.integer = -			    acpi_ut_repair_name(this_node->name.ascii); - -			ACPI_WARNING((AE_INFO, "Invalid ACPI Name %08X", -				      this_node->name.integer)); -		} -  		acpi_os_printf("%4.4s", acpi_ut_get_node_name(this_node));  	} @@ -242,7 +247,22 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,  		if (!obj_desc) { -			/* No attached object, we are done */ +			/* No attached object. Some types should always have an object */ + +			switch (type) { +			case ACPI_TYPE_INTEGER: +			case ACPI_TYPE_PACKAGE: +			case ACPI_TYPE_BUFFER: +			case ACPI_TYPE_STRING: +			case ACPI_TYPE_METHOD: + +				acpi_os_printf("<No attached object>"); +				break; + +			default: + +				break; +			}  			acpi_os_printf("\n");  			return (AE_OK); @@ -251,7 +271,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,  		switch (type) {  		case ACPI_TYPE_PROCESSOR: -			acpi_os_printf("ID %X Len %.4X Addr %p\n", +			acpi_os_printf("ID %02X Len %02X Addr %p\n",  				       obj_desc->processor.proc_id,  				       obj_desc->processor.length,  				       ACPI_CAST_PTR(void, @@ -426,6 +446,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,  			break;  		default: +  			break;  		}  		break; @@ -560,39 +581,46 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,  			goto cleanup;  		case ACPI_TYPE_BUFFER_FIELD: +  			obj_desc =  			    (union acpi_operand_object *)obj_desc->buffer_field.  			    buffer_obj;  			break;  		case ACPI_TYPE_PACKAGE: +  			obj_desc = (void *)obj_desc->package.elements;  			break;  		case ACPI_TYPE_METHOD: +  			obj_desc = (void *)obj_desc->method.aml_start;  			break;  		case ACPI_TYPE_LOCAL_REGION_FIELD: +  			obj_desc = (void *)obj_desc->field.region_obj;  			break;  		case ACPI_TYPE_LOCAL_BANK_FIELD: +  			obj_desc = (void *)obj_desc->bank_field.region_obj;  			break;  		case ACPI_TYPE_LOCAL_INDEX_FIELD: +  			obj_desc = (void *)obj_desc->index_field.index_obj;  			break;  		default: +  			goto cleanup;  		}  		obj_type = ACPI_TYPE_INVALID;	/* Terminate loop after next pass */  	} -      cleanup: +cleanup:  	acpi_os_printf("\n");  	return (AE_OK);  } @@ -602,7 +630,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,   *   * FUNCTION:    acpi_ns_dump_objects   * - * PARAMETERS:  Type                - Object type to be dumped + * PARAMETERS:  type                - Object type to be dumped   *              display_type        - 0 or ACPI_DISPLAY_SUMMARY   *              max_depth           - Maximum depth of dump. Use ACPI_UINT32_MAX   *                                    for an effectively unlimited depth. @@ -624,9 +652,22 @@ acpi_ns_dump_objects(acpi_object_type type,  		     acpi_owner_id owner_id, acpi_handle start_handle)  {  	struct acpi_walk_info info; +	acpi_status status;  	ACPI_FUNCTION_ENTRY(); +	/* +	 * Just lock the entire namespace for the duration of the dump. +	 * We don't want any changes to the namespace during this time, +	 * especially the temporary nodes since we are going to display +	 * them also. +	 */ +	status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); +	if (ACPI_FAILURE(status)) { +		acpi_os_printf("Could not acquire namespace mutex\n"); +		return; +	} +  	info.debug_level = ACPI_LV_TABLES;  	info.owner_id = owner_id;  	info.display_type = display_type; @@ -636,6 +677,138 @@ acpi_ns_dump_objects(acpi_object_type type,  				     ACPI_NS_WALK_TEMP_NODES,  				     acpi_ns_dump_one_object, NULL,  				     (void *)&info, NULL); + +	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); +} +#endif				/* ACPI_FUTURE_USAGE */ + +#ifdef	ACPI_FUTURE_USAGE +/******************************************************************************* + * + * FUNCTION:    acpi_ns_dump_one_object_path, acpi_ns_get_max_depth + * + * PARAMETERS:  obj_handle          - Node to be dumped + *              level               - Nesting level of the handle + *              context             - Passed into walk_namespace + *              return_value        - Not used + * + * RETURN:      Status + * + * DESCRIPTION: Dump the full pathname to a namespace object. acp_ns_get_max_depth + *              computes the maximum nesting depth in the namespace tree, in + *              order to simplify formatting in acpi_ns_dump_one_object_path. + *              These procedures are user_functions called by acpi_ns_walk_namespace. + * + ******************************************************************************/ + +static acpi_status +acpi_ns_dump_one_object_path(acpi_handle obj_handle, +			     u32 level, void *context, void **return_value) +{ +	u32 max_level = *((u32 *)context); +	char *pathname; +	struct acpi_namespace_node *node; +	int path_indent; + +	if (!obj_handle) { +		return (AE_OK); +	} + +	node = acpi_ns_validate_handle(obj_handle); +	if (!node) { + +		/* Ignore bad node during namespace walk */ + +		return (AE_OK); +	} + +	pathname = acpi_ns_get_external_pathname(node); + +	path_indent = 1; +	if (level <= max_level) { +		path_indent = max_level - level + 1; +	} + +	acpi_os_printf("%2d%*s%-12s%*s", +		       level, level, " ", acpi_ut_get_type_name(node->type), +		       path_indent, " "); + +	acpi_os_printf("%s\n", &pathname[1]); +	ACPI_FREE(pathname); +	return (AE_OK); +} + +static acpi_status +acpi_ns_get_max_depth(acpi_handle obj_handle, +		      u32 level, void *context, void **return_value) +{ +	u32 *max_level = (u32 *)context; + +	if (level > *max_level) { +		*max_level = level; +	} +	return (AE_OK); +} + +/******************************************************************************* + * + * FUNCTION:    acpi_ns_dump_object_paths + * + * PARAMETERS:  type                - Object type to be dumped + *              display_type        - 0 or ACPI_DISPLAY_SUMMARY + *              max_depth           - Maximum depth of dump. Use ACPI_UINT32_MAX + *                                    for an effectively unlimited depth. + *              owner_id            - Dump only objects owned by this ID. Use + *                                    ACPI_UINT32_MAX to match all owners. + *              start_handle        - Where in namespace to start/end search + * + * RETURN:      None + * + * DESCRIPTION: Dump full object pathnames within the loaded namespace. Uses + *              acpi_ns_walk_namespace in conjunction with acpi_ns_dump_one_object_path. + * + ******************************************************************************/ + +void +acpi_ns_dump_object_paths(acpi_object_type type, +			  u8 display_type, +			  u32 max_depth, +			  acpi_owner_id owner_id, acpi_handle start_handle) +{ +	acpi_status status; +	u32 max_level = 0; + +	ACPI_FUNCTION_ENTRY(); + +	/* +	 * Just lock the entire namespace for the duration of the dump. +	 * We don't want any changes to the namespace during this time, +	 * especially the temporary nodes since we are going to display +	 * them also. +	 */ +	status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); +	if (ACPI_FAILURE(status)) { +		acpi_os_printf("Could not acquire namespace mutex\n"); +		return; +	} + +	/* Get the max depth of the namespace tree, for formatting later */ + +	(void)acpi_ns_walk_namespace(type, start_handle, max_depth, +				     ACPI_NS_WALK_NO_UNLOCK | +				     ACPI_NS_WALK_TEMP_NODES, +				     acpi_ns_get_max_depth, NULL, +				     (void *)&max_level, NULL); + +	/* Now dump the entire namespace */ + +	(void)acpi_ns_walk_namespace(type, start_handle, max_depth, +				     ACPI_NS_WALK_NO_UNLOCK | +				     ACPI_NS_WALK_TEMP_NODES, +				     acpi_ns_dump_one_object_path, NULL, +				     (void *)&max_level, NULL); + +	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);  }  #endif				/* ACPI_FUTURE_USAGE */ @@ -643,7 +816,7 @@ acpi_ns_dump_objects(acpi_object_type type,   *   * FUNCTION:    acpi_ns_dump_entry   * - * PARAMETERS:  Handle              - Node to be dumped + * PARAMETERS:  handle              - Node to be dumped   *              debug_level         - Output level   *   * RETURN:      None @@ -672,7 +845,7 @@ void acpi_ns_dump_entry(acpi_handle handle, u32 debug_level)   *   * PARAMETERS:  search_base         - Root of subtree to be dumped, or   *                                    NS_ALL to dump the entire namespace - *              max_depth           - Maximum depth of dump.  Use INT_MAX + *              max_depth           - Maximum depth of dump. Use INT_MAX   *                                    for an effectively unlimited depth.   *   * RETURN:      None @@ -709,5 +882,5 @@ void acpi_ns_dump_tables(acpi_handle search_base, u32 max_depth)  			     ACPI_OWNER_ID_MAX, search_handle);  	return_VOID;  } -#endif				/* _ACPI_ASL_COMPILER */ -#endif				/* defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) */ +#endif +#endif  | 
