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
- Lines: 583
- Date:
Sun Sep 23 09:42:32 2001
- Orig file:
v2.4.9/linux/drivers/acpi/dispatcher/dsobject.c
- Orig date:
Tue Jul 3 17:08:19 2001
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)