patch-2.4.10 linux/drivers/acpi/dispatcher/dsobject.c

Next file: linux/drivers/acpi/dispatcher/dsopcode.c
Previous file: linux/drivers/acpi/dispatcher/dsmthdat.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.9/linux/drivers/acpi/dispatcher/dsobject.c linux/drivers/acpi/dispatcher/dsobject.c
@@ -1,7 +1,7 @@
 /******************************************************************************
  *
  * Module Name: dsobject - Dispatcher object management routines
- *              $Revision: 65 $
+ *              $Revision: 75 $
  *
  *****************************************************************************/
 
@@ -55,15 +55,15 @@
  *
  ******************************************************************************/
 
-ACPI_STATUS
+acpi_status
 acpi_ds_init_one_object (
-	ACPI_HANDLE             obj_handle,
+	acpi_handle             obj_handle,
 	u32                     level,
 	void                    *context,
 	void                    **return_value)
 {
-	ACPI_OBJECT_TYPE8       type;
-	ACPI_STATUS             status;
+	acpi_object_type8       type;
+	acpi_status             status;
 	ACPI_INIT_WALK_INFO     *info = (ACPI_INIT_WALK_INFO *) context;
 	u8                      table_revision;
 
@@ -78,8 +78,7 @@
 	 * We are only interested in objects owned by the table that
 	 * was just loaded
 	 */
-
-	if (((ACPI_NAMESPACE_NODE *) obj_handle)->owner_id !=
+	if (((acpi_namespace_node *) obj_handle)->owner_id !=
 			info->table_desc->table_id) {
 		return (AE_OK);
 	}
@@ -103,14 +102,16 @@
 
 		info->method_count++;
 
+		if (!(acpi_dbg_level & ACPI_LV_INIT)) {
+			ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, "."));
+		}
 
 		/*
 		 * Set the execution data width (32 or 64) based upon the
 		 * revision number of the parent ACPI table.
 		 */
-
 		if (table_revision == 1) {
-			((ACPI_NAMESPACE_NODE *)obj_handle)->flags |= ANOBJ_DATA_WIDTH_32;
+			((acpi_namespace_node *)obj_handle)->flags |= ANOBJ_DATA_WIDTH_32;
 		}
 
 		/*
@@ -123,6 +124,9 @@
 		/* TBD: [Errors] what do we do with an error? */
 
 		if (ACPI_FAILURE (status)) {
+			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Method %p [%4.4s] parse failed! %s\n",
+				obj_handle, &((acpi_namespace_node *)obj_handle)->name,
+				acpi_format_exception (status)));
 			break;
 		}
 
@@ -158,15 +162,23 @@
  *
  ******************************************************************************/
 
-ACPI_STATUS
+acpi_status
 acpi_ds_initialize_objects (
-	ACPI_TABLE_DESC         *table_desc,
-	ACPI_NAMESPACE_NODE     *start_node)
+	acpi_table_desc         *table_desc,
+	acpi_namespace_node     *start_node)
 {
-	ACPI_STATUS             status;
+	acpi_status             status;
 	ACPI_INIT_WALK_INFO     info;
 
 
+	FUNCTION_TRACE ("Ds_initialize_objects");
+
+
+	ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+		"**** Starting initialization of namespace objects ****\n"));
+	ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, "Parsing Methods:"));
+
+
 	info.method_count   = 0;
 	info.op_region_count = 0;
 	info.object_count   = 0;
@@ -177,8 +189,19 @@
 
 	status = acpi_walk_namespace (ACPI_TYPE_ANY, start_node, ACPI_UINT32_MAX,
 			  acpi_ds_init_one_object, &info, NULL);
+	if (ACPI_FAILURE (status)) {
+		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Walk_namespace failed! %x\n", status));
+	}
 
-	return (AE_OK);
+	ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
+		"\n%d Control Methods found and parsed (%d nodes total)\n",
+		info.method_count, info.object_count));
+	ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+		"%d Control Methods found\n", info.method_count));
+	ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+		"%d Op Regions found\n", info.op_region_count));
+
+	return_ACPI_STATUS (AE_OK);
 }
 
 
@@ -198,23 +221,25 @@
  *
  ****************************************************************************/
 
-ACPI_STATUS
+acpi_status
 acpi_ds_init_object_from_op (
-	ACPI_WALK_STATE         *walk_state,
-	ACPI_PARSE_OBJECT       *op,
+	acpi_walk_state         *walk_state,
+	acpi_parse_object       *op,
 	u16                     opcode,
-	ACPI_OPERAND_OBJECT     **obj_desc)
+	acpi_operand_object     **ret_obj_desc)
 {
-	ACPI_STATUS             status;
-	ACPI_PARSE_OBJECT       *arg;
-	ACPI_PARSE2_OBJECT      *byte_list;
-	ACPI_OPERAND_OBJECT     *arg_desc;
-	ACPI_OPCODE_INFO        *op_info;
+	acpi_status             status;
+	acpi_parse_object       *arg;
+	acpi_parse2_object      *byte_list;
+	acpi_operand_object     *arg_desc;
+	const acpi_opcode_info  *op_info;
+	acpi_operand_object     *obj_desc;
 
 
 	PROC_NAME ("Ds_init_object_from_op");
 
 
+	obj_desc = *ret_obj_desc;
 	op_info = acpi_ps_get_opcode_info (opcode);
 	if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) {
 		/* Unknown opcode */
@@ -225,7 +250,7 @@
 
 	/* Get and prepare the first argument */
 
-	switch ((*obj_desc)->common.type) {
+	switch (obj_desc->common.type) {
 	case ACPI_TYPE_BUFFER:
 
 		/* First arg is a number */
@@ -245,48 +270,51 @@
 		/* We are expecting a number */
 
 		if (arg_desc->common.type != ACPI_TYPE_INTEGER) {
+			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
+				"Expecting number, got obj: %p type %X\n",
+				arg_desc, arg_desc->common.type));
 			acpi_ut_remove_reference (arg_desc);
 			return (AE_TYPE);
 		}
 
 		/* Get the value, delete the internal object */
 
-		(*obj_desc)->buffer.length = (u32) arg_desc->integer.value;
+		obj_desc->buffer.length = (u32) arg_desc->integer.value;
 		acpi_ut_remove_reference (arg_desc);
 
 		/* Allocate the buffer */
 
-		if ((*obj_desc)->buffer.length == 0) {
-			(*obj_desc)->buffer.pointer = NULL;
+		if (obj_desc->buffer.length == 0) {
+			obj_desc->buffer.pointer = NULL;
 			REPORT_WARNING (("Buffer created with zero length in AML\n"));
 			break;
 		}
 
 		else {
-			(*obj_desc)->buffer.pointer =
-					  acpi_ut_callocate ((*obj_desc)->buffer.length);
+			obj_desc->buffer.pointer = ACPI_MEM_CALLOCATE (
+					   obj_desc->buffer.length);
 
-			if (!(*obj_desc)->buffer.pointer) {
+			if (!obj_desc->buffer.pointer) {
 				return (AE_NO_MEMORY);
 			}
 		}
 
 		/*
-		 * Second arg is the buffer data (optional)
-		 * Byte_list can be either individual bytes or a
-		 * string initializer!
+		 * Second arg is the buffer data (optional) Byte_list can be either
+		 * individual bytes or a string initializer.
 		 */
+		arg = op->value.arg;         /* skip first arg */
 
-		/* skip first arg */
-		arg = op->value.arg;
-		byte_list = (ACPI_PARSE2_OBJECT *) arg->next;
+		byte_list = (acpi_parse2_object *) arg->next;
 		if (byte_list) {
 			if (byte_list->opcode != AML_INT_BYTELIST_OP) {
+				ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Expecting bytelist, got: %x\n",
+					byte_list));
 				return (AE_TYPE);
 			}
 
-			MEMCPY ((*obj_desc)->buffer.pointer, byte_list->data,
-					(*obj_desc)->buffer.length);
+			MEMCPY (obj_desc->buffer.pointer, byte_list->data,
+					obj_desc->buffer.length);
 		}
 
 		break;
@@ -295,26 +323,30 @@
 	case ACPI_TYPE_PACKAGE:
 
 		/*
-		 * When called, an internal package object has already
-		 *  been built and is pointed to by *Obj_desc.
-		 *  Acpi_ds_build_internal_object build another internal
-		 *  package object, so remove reference to the original
-		 *  so that it is deleted.  Error checking is done
-		 *  within the remove reference function.
+		 * When called, an internal package object has already been built and
+		 * is pointed to by Obj_desc. Acpi_ds_build_internal_object builds another
+		 * internal package object, so remove reference to the original so
+		 * that it is deleted.  Error checking is done within the remove
+		 * reference function.
 		 */
-		acpi_ut_remove_reference(*obj_desc);
-
-		status = acpi_ds_build_internal_object (walk_state, op, obj_desc);
+		acpi_ut_remove_reference (obj_desc);
+		status = acpi_ds_build_internal_object (walk_state, op, ret_obj_desc);
 		break;
 
 	case ACPI_TYPE_INTEGER:
-		(*obj_desc)->integer.value = op->value.integer;
+		obj_desc->integer.value = op->value.integer;
 		break;
 
 
 	case ACPI_TYPE_STRING:
-		(*obj_desc)->string.pointer = op->value.string;
-		(*obj_desc)->string.length = STRLEN (op->value.string);
+		obj_desc->string.pointer = op->value.string;
+		obj_desc->string.length = STRLEN (op->value.string);
+
+		/*
+		 * The string is contained in the ACPI table, don't ever try
+		 * to delete it
+		 */
+		obj_desc->common.flags |= AOPOBJ_STATIC_POINTER;
 		break;
 
 
@@ -329,27 +361,29 @@
 
 			/* Split the opcode into a base opcode + offset */
 
-			(*obj_desc)->reference.opcode = AML_LOCAL_OP;
-			(*obj_desc)->reference.offset = opcode - AML_LOCAL_OP;
+			obj_desc->reference.opcode = AML_LOCAL_OP;
+			obj_desc->reference.offset = opcode - AML_LOCAL_OP;
 			break;
 
+
 		case OPTYPE_METHOD_ARGUMENT:
 
 			/* Split the opcode into a base opcode + offset */
 
-			(*obj_desc)->reference.opcode = AML_ARG_OP;
-			(*obj_desc)->reference.offset = opcode - AML_ARG_OP;
+			obj_desc->reference.opcode = AML_ARG_OP;
+			obj_desc->reference.offset = opcode - AML_ARG_OP;
 			break;
 
+
 		default: /* Constants, Literals, etc.. */
 
 			if (op->opcode == AML_INT_NAMEPATH_OP) {
 				/* Node was saved in Op */
 
-				(*obj_desc)->reference.node = op->node;
+				obj_desc->reference.node = op->node;
 			}
 
-			(*obj_desc)->reference.opcode = opcode;
+			obj_desc->reference.opcode = opcode;
 			break;
 		}
 
@@ -358,6 +392,9 @@
 
 	default:
 
+		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unimplemented data type: %x\n",
+			obj_desc->common.type));
+
 		break;
 	}
 
@@ -379,33 +416,35 @@
  *
  ****************************************************************************/
 
-static ACPI_STATUS
+static acpi_status
 acpi_ds_build_internal_simple_obj (
-	ACPI_WALK_STATE         *walk_state,
-	ACPI_PARSE_OBJECT       *op,
-	ACPI_OPERAND_OBJECT     **obj_desc_ptr)
+	acpi_walk_state         *walk_state,
+	acpi_parse_object       *op,
+	acpi_operand_object     **obj_desc_ptr)
 {
-	ACPI_OPERAND_OBJECT     *obj_desc;
-	ACPI_OBJECT_TYPE8       type;
-	ACPI_STATUS             status;
+	acpi_operand_object     *obj_desc;
+	acpi_object_type8       type;
+	acpi_status             status;
 	u32                     length;
 	char                    *name;
 
 
+	FUNCTION_TRACE ("Ds_build_internal_simple_obj");
+
+
 	if (op->opcode == AML_INT_NAMEPATH_OP) {
 		/*
 		 * This is an object reference.  If The name was
 		 * previously looked up in the NS, it is stored in this op.
 		 * Otherwise, go ahead and look it up now
 		 */
-
 		if (!op->node) {
 			status = acpi_ns_lookup (walk_state->scope_info,
 					  op->value.string, ACPI_TYPE_ANY,
 					  IMODE_EXECUTE,
 					  NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE,
 					  NULL,
-					  (ACPI_NAMESPACE_NODE **)&(op->node));
+					  (acpi_namespace_node **)&(op->node));
 
 			if (ACPI_FAILURE (status)) {
 				if (status == AE_NOT_FOUND) {
@@ -415,17 +454,19 @@
 					if (name) {
 						REPORT_WARNING (("Reference %s at AML %X not found\n",
 								 name, op->aml_offset));
-						acpi_ut_free (name);
+						ACPI_MEM_FREE (name);
 					}
+
 					else {
 						REPORT_WARNING (("Reference %s at AML %X not found\n",
 								   op->value.string, op->aml_offset));
 					}
+
 					*obj_desc_ptr = NULL;
 				}
 
 				else {
-					return (status);
+					return_ACPI_STATUS (status);
 				}
 			}
 		}
@@ -447,18 +488,18 @@
 
 	obj_desc = acpi_ut_create_internal_object (type);
 	if (!obj_desc) {
-		return (AE_NO_MEMORY);
+		return_ACPI_STATUS (AE_NO_MEMORY);
 	}
 
 	status = acpi_ds_init_object_from_op (walk_state, op, op->opcode, &obj_desc);
 	if (ACPI_FAILURE (status)) {
 		acpi_ut_remove_reference (obj_desc);
-		return (status);
+		return_ACPI_STATUS (status);
 	}
 
 	*obj_desc_ptr = obj_desc;
 
-	return (AE_OK);
+	return_ACPI_STATUS (AE_OK);
 }
 
 
@@ -476,39 +517,49 @@
  *
  ****************************************************************************/
 
-ACPI_STATUS
+acpi_status
 acpi_ds_build_internal_package_obj (
-	ACPI_WALK_STATE         *walk_state,
-	ACPI_PARSE_OBJECT       *op,
-	ACPI_OPERAND_OBJECT     **obj_desc_ptr)
+	acpi_walk_state         *walk_state,
+	acpi_parse_object       *op,
+	acpi_operand_object     **obj_desc_ptr)
 {
-	ACPI_PARSE_OBJECT       *arg;
-	ACPI_OPERAND_OBJECT     *obj_desc;
-	ACPI_STATUS             status = AE_OK;
+	acpi_parse_object       *arg;
+	acpi_operand_object     *obj_desc;
+	acpi_status             status = AE_OK;
+
+
+	FUNCTION_TRACE ("Ds_build_internal_package_obj");
 
 
 	obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_PACKAGE);
+	*obj_desc_ptr = obj_desc;
 	if (!obj_desc) {
-		return (AE_NO_MEMORY);
+		return_ACPI_STATUS (AE_NO_MEMORY);
+	}
+
+	if (op->opcode == AML_VAR_PACKAGE_OP) {
+		/*
+		 * Variable length package parameters are evaluated JIT
+		 */
+		return_ACPI_STATUS (AE_OK);
 	}
 
 	/* The first argument must be the package length */
 
 	arg = op->value.arg;
-	obj_desc->package.count = arg->value.integer;
+	obj_desc->package.count = arg->value.integer32;
 
 	/*
 	 * Allocate the array of pointers (ptrs to the
 	 * individual objects) Add an extra pointer slot so
 	 * that the list is always null terminated.
 	 */
-
-	obj_desc->package.elements =
-		acpi_ut_callocate ((obj_desc->package.count + 1) * sizeof (void *));
+	obj_desc->package.elements = ACPI_MEM_CALLOCATE (
+			 (obj_desc->package.count + 1) * sizeof (void *));
 
 	if (!obj_desc->package.elements) {
 		acpi_ut_delete_object_desc (obj_desc);
-		return (AE_NO_MEMORY);
+		return_ACPI_STATUS (AE_NO_MEMORY);
 	}
 
 	obj_desc->package.next_element = obj_desc->package.elements;
@@ -516,7 +567,6 @@
 	/*
 	 * Now init the elements of the package
 	 */
-
 	arg = arg->next;
 	while (arg) {
 		if (arg->opcode == AML_PACKAGE_OP) {
@@ -533,8 +583,8 @@
 		arg = arg->next;
 	}
 
-	*obj_desc_ptr = obj_desc;
-	return (status);
+	obj_desc->package.flags |= AOPOBJ_DATA_VALID;
+	return_ACPI_STATUS (status);
 }
 
 
@@ -552,21 +602,27 @@
  *
  ****************************************************************************/
 
-ACPI_STATUS
+acpi_status
 acpi_ds_build_internal_object (
-	ACPI_WALK_STATE         *walk_state,
-	ACPI_PARSE_OBJECT       *op,
-	ACPI_OPERAND_OBJECT     **obj_desc_ptr)
+	acpi_walk_state         *walk_state,
+	acpi_parse_object       *op,
+	acpi_operand_object     **obj_desc_ptr)
 {
-	ACPI_STATUS             status;
+	acpi_status             status;
 
 
-	if (op->opcode == AML_PACKAGE_OP) {
+	switch (op->opcode) {
+	case AML_PACKAGE_OP:
+	case AML_VAR_PACKAGE_OP:
+
 		status = acpi_ds_build_internal_package_obj (walk_state, op, obj_desc_ptr);
-	}
+		break;
+
+
+	default:
 
-	else {
 		status = acpi_ds_build_internal_simple_obj (walk_state, op, obj_desc_ptr);
+		break;
 	}
 
 	return (status);
@@ -586,31 +642,32 @@
  *
  ****************************************************************************/
 
-ACPI_STATUS
+acpi_status
 acpi_ds_create_node (
-	ACPI_WALK_STATE         *walk_state,
-	ACPI_NAMESPACE_NODE     *node,
-	ACPI_PARSE_OBJECT       *op)
+	acpi_walk_state         *walk_state,
+	acpi_namespace_node     *node,
+	acpi_parse_object       *op)
 {
-	ACPI_STATUS             status;
-	ACPI_OPERAND_OBJECT     *obj_desc;
+	acpi_status             status;
+	acpi_operand_object     *obj_desc;
+
+
+	FUNCTION_TRACE_PTR ("Ds_create_node", op);
 
 
 	if (!op->value.arg) {
 		/* No arguments, there is nothing to do */
 
-		return (AE_OK);
+		return_ACPI_STATUS (AE_OK);
 	}
 
-
 	/* Build an internal object for the argument(s) */
 
 	status = acpi_ds_build_internal_object (walk_state, op->value.arg, &obj_desc);
 	if (ACPI_FAILURE (status)) {
-		return (status);
+		return_ACPI_STATUS (status);
 	}
 
-
 	/* Re-type the object according to it's argument */
 
 	node->type = obj_desc->common.type;
@@ -622,14 +679,13 @@
 		goto cleanup;
 	}
 
-	return (status);
+	return_ACPI_STATUS (status);
 
 
 cleanup:
 
 	acpi_ut_remove_reference (obj_desc);
-
-	return (status);
+	return_ACPI_STATUS (status);
 }
 
 

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)