diff options
Diffstat (limited to 'drivers/acpi/acpica/nspredef.c')
| -rw-r--r-- | drivers/acpi/acpica/nspredef.c | 213 | 
1 files changed, 56 insertions, 157 deletions
diff --git a/drivers/acpi/acpica/nspredef.c b/drivers/acpi/acpica/nspredef.c index 224c3005340..8a52916148c 100644 --- a/drivers/acpi/acpica/nspredef.c +++ b/drivers/acpi/acpica/nspredef.c @@ -76,19 +76,7 @@ static acpi_status  acpi_ns_check_reference(struct acpi_predefined_data *data,  			union acpi_operand_object *return_object); -static void acpi_ns_get_expected_types(char *buffer, u32 expected_btypes); - -/* - * Names for the types that can be returned by the predefined objects. - * Used for warning messages. Must be in the same order as the ACPI_RTYPEs - */ -static const char *acpi_rtype_names[] = { -	"/Integer", -	"/String", -	"/Buffer", -	"/Package", -	"/Reference", -}; +static u32 acpi_ns_get_bitmapped_type(union acpi_operand_object *return_object);  /*******************************************************************************   * @@ -112,7 +100,6 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,  			       acpi_status return_status,  			       union acpi_operand_object **return_object_ptr)  { -	union acpi_operand_object *return_object = *return_object_ptr;  	acpi_status status = AE_OK;  	const union acpi_predefined_info *predefined;  	char *pathname; @@ -120,7 +107,7 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,  	/* Match the name for this method/object against the predefined list */ -	predefined = acpi_ns_check_for_predefined_name(node); +	predefined = acpi_ut_match_predefined_method(node->name.ascii);  	/* Get the full pathname to the object, for use in warning messages */ @@ -152,25 +139,6 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,  	}  	/* -	 * If there is no return value, check if we require a return value for -	 * this predefined name. Either one return value is expected, or none, -	 * for both methods and other objects. -	 * -	 * Exit now if there is no return object. Warning if one was expected. -	 */ -	if (!return_object) { -		if ((predefined->info.expected_btypes) && -		    (!(predefined->info.expected_btypes & ACPI_RTYPE_NONE))) { -			ACPI_WARN_PREDEFINED((AE_INFO, pathname, -					      ACPI_WARN_ALWAYS, -					      "Missing expected return value")); - -			status = AE_AML_NO_RETURN_VALUE; -		} -		goto cleanup; -	} - -	/*  	 * Return value validation and possible repair.  	 *  	 * 1) Don't perform return value validation/repair if this feature @@ -310,8 +278,10 @@ acpi_ns_check_parameter_count(char *pathname,  	 * Validate the user-supplied parameter count.  	 * Allow two different legal argument counts (_SCP, etc.)  	 */ -	required_params_current = predefined->info.param_count & 0x0F; -	required_params_old = predefined->info.param_count >> 4; +	required_params_current = +	    predefined->info.argument_list & METHOD_ARG_MASK; +	required_params_old = +	    predefined->info.argument_list >> METHOD_ARG_BIT_WIDTH;  	if (user_param_count != ACPI_UINT32_MAX) {  		if ((user_param_count != required_params_current) && @@ -340,52 +310,6 @@ acpi_ns_check_parameter_count(char *pathname,  /*******************************************************************************   * - * FUNCTION:    acpi_ns_check_for_predefined_name - * - * PARAMETERS:  node            - Namespace node for the method/object - * - * RETURN:      Pointer to entry in predefined table. NULL indicates not found. - * - * DESCRIPTION: Check an object name against the predefined object list. - * - ******************************************************************************/ - -const union acpi_predefined_info *acpi_ns_check_for_predefined_name(struct -								    acpi_namespace_node -								    *node) -{ -	const union acpi_predefined_info *this_name; - -	/* Quick check for a predefined name, first character must be underscore */ - -	if (node->name.ascii[0] != '_') { -		return (NULL); -	} - -	/* Search info table for a predefined method/object name */ - -	this_name = predefined_names; -	while (this_name->info.name[0]) { -		if (ACPI_COMPARE_NAME(node->name.ascii, this_name->info.name)) { -			return (this_name); -		} - -		/* -		 * Skip next entry in the table if this name returns a Package -		 * (next entry contains the package info) -		 */ -		if (this_name->info.expected_btypes & ACPI_RTYPE_PACKAGE) { -			this_name++; -		} - -		this_name++; -	} - -	return (NULL);		/* Not found */ -} - -/******************************************************************************* - *   * FUNCTION:    acpi_ns_check_object_type   *   * PARAMETERS:  data            - Pointer to validation data structure @@ -410,28 +334,12 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data,  {  	union acpi_operand_object *return_object = *return_object_ptr;  	acpi_status status = AE_OK; -	u32 return_btype;  	char type_buffer[48];	/* Room for 5 types */ -	/* -	 * If we get a NULL return_object here, it is a NULL package element. -	 * Since all extraneous NULL package elements were removed earlier by a -	 * call to acpi_ns_remove_null_elements, this is an unexpected NULL element. -	 * We will attempt to repair it. -	 */ -	if (!return_object) { -		status = acpi_ns_repair_null_element(data, expected_btypes, -						     package_index, -						     return_object_ptr); -		if (ACPI_SUCCESS(status)) { -			return (AE_OK);	/* Repair was successful */ -		} -		goto type_error_exit; -	} -  	/* A Namespace node should not get here, but make sure */ -	if (ACPI_GET_DESCRIPTOR_TYPE(return_object) == ACPI_DESC_TYPE_NAMED) { +	if (return_object && +	    ACPI_GET_DESCRIPTOR_TYPE(return_object) == ACPI_DESC_TYPE_NAMED) {  		ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,  				      "Invalid return type - Found a Namespace node [%4.4s] type %s",  				      return_object->node.name.ascii, @@ -448,59 +356,31 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data,  	 * from all of the predefined names (including elements of returned  	 * packages)  	 */ -	switch (return_object->common.type) { -	case ACPI_TYPE_INTEGER: -		return_btype = ACPI_RTYPE_INTEGER; -		break; - -	case ACPI_TYPE_BUFFER: -		return_btype = ACPI_RTYPE_BUFFER; -		break; - -	case ACPI_TYPE_STRING: -		return_btype = ACPI_RTYPE_STRING; -		break; +	data->return_btype = acpi_ns_get_bitmapped_type(return_object); +	if (data->return_btype == ACPI_RTYPE_ANY) { -	case ACPI_TYPE_PACKAGE: -		return_btype = ACPI_RTYPE_PACKAGE; -		break; - -	case ACPI_TYPE_LOCAL_REFERENCE: -		return_btype = ACPI_RTYPE_REFERENCE; -		break; - -	default:  		/* Not one of the supported objects, must be incorrect */ -  		goto type_error_exit;  	} -	/* Is the object one of the expected types? */ - -	if (return_btype & expected_btypes) { - -		/* For reference objects, check that the reference type is correct */ - -		if (return_object->common.type == ACPI_TYPE_LOCAL_REFERENCE) { -			status = acpi_ns_check_reference(data, return_object); -		} +	/* For reference objects, check that the reference type is correct */ +	if ((data->return_btype & expected_btypes) == ACPI_RTYPE_REFERENCE) { +		status = acpi_ns_check_reference(data, return_object);  		return (status);  	} -	/* Type mismatch -- attempt repair of the returned object */ +	/* Attempt simple repair of the returned object if necessary */ -	status = acpi_ns_repair_object(data, expected_btypes, +	status = acpi_ns_simple_repair(data, expected_btypes,  				       package_index, return_object_ptr); -	if (ACPI_SUCCESS(status)) { -		return (AE_OK);	/* Repair was successful */ -	} +	return (status);        type_error_exit:  	/* Create a string with all expected types for this predefined object */ -	acpi_ns_get_expected_types(type_buffer, expected_btypes); +	acpi_ut_get_expected_return_types(type_buffer, expected_btypes);  	if (package_index == ACPI_NOT_PACKAGE_ELEMENT) {  		ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, @@ -558,36 +438,55 @@ acpi_ns_check_reference(struct acpi_predefined_data *data,  /*******************************************************************************   * - * FUNCTION:    acpi_ns_get_expected_types + * FUNCTION:    acpi_ns_get_bitmapped_type   * - * PARAMETERS:  buffer          - Pointer to where the string is returned - *              expected_btypes - Bitmap of expected return type(s) + * PARAMETERS:  return_object   - Object returned from method/obj evaluation   * - * RETURN:      Buffer is populated with type names. + * RETURN:      Object return type. ACPI_RTYPE_ANY indicates that the object + *              type is not supported. ACPI_RTYPE_NONE indicates that no + *              object was returned (return_object is NULL).   * - * DESCRIPTION: Translate the expected types bitmap into a string of ascii - *              names of expected types, for use in warning messages. + * DESCRIPTION: Convert object type into a bitmapped object return type.   *   ******************************************************************************/ -static void acpi_ns_get_expected_types(char *buffer, u32 expected_btypes) +static u32 acpi_ns_get_bitmapped_type(union acpi_operand_object *return_object)  { -	u32 this_rtype; -	u32 i; -	u32 j; +	u32 return_btype; -	j = 1; -	buffer[0] = 0; -	this_rtype = ACPI_RTYPE_INTEGER; +	if (!return_object) { +		return (ACPI_RTYPE_NONE); +	} -	for (i = 0; i < ACPI_NUM_RTYPES; i++) { +	/* Map acpi_object_type to internal bitmapped type */ -		/* If one of the expected types, concatenate the name of this type */ +	switch (return_object->common.type) { +	case ACPI_TYPE_INTEGER: +		return_btype = ACPI_RTYPE_INTEGER; +		break; -		if (expected_btypes & this_rtype) { -			ACPI_STRCAT(buffer, &acpi_rtype_names[i][j]); -			j = 0;	/* Use name separator from now on */ -		} -		this_rtype <<= 1;	/* Next Rtype */ +	case ACPI_TYPE_BUFFER: +		return_btype = ACPI_RTYPE_BUFFER; +		break; + +	case ACPI_TYPE_STRING: +		return_btype = ACPI_RTYPE_STRING; +		break; + +	case ACPI_TYPE_PACKAGE: +		return_btype = ACPI_RTYPE_PACKAGE; +		break; + +	case ACPI_TYPE_LOCAL_REFERENCE: +		return_btype = ACPI_RTYPE_REFERENCE; +		break; + +	default: +		/* Not one of the supported objects, must be incorrect */ + +		return_btype = ACPI_RTYPE_ANY; +		break;  	} + +	return (return_btype);  }  |