patch-2.4.22 linux-2.4.22/drivers/acpi/namespace/nsinit.c
Next file: linux-2.4.22/drivers/acpi/namespace/nsload.c
Previous file: linux-2.4.22/drivers/acpi/namespace/nseval.c
Back to the patch index
Back to the overall index
- Lines: 512
- Date:
2003-08-25 04:44:41.000000000 -0700
- Orig file:
linux-2.4.21/drivers/acpi/namespace/nsinit.c
- Orig date:
2001-10-24 14:06:22.000000000 -0700
diff -urN linux-2.4.21/drivers/acpi/namespace/nsinit.c linux-2.4.22/drivers/acpi/namespace/nsinit.c
@@ -1,41 +1,59 @@
/******************************************************************************
*
* Module Name: nsinit - namespace initialization
- * $Revision: 33 $
*
*****************************************************************************/
/*
- * Copyright (C) 2000, 2001 R. Byron Moore
+ * Copyright (C) 2000 - 2003, R. Byron Moore
+ * All rights reserved.
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ * substantially similar to the "NO WARRANTY" disclaimer below
+ * ("Disclaimer") and any redistribution must be conditioned upon
+ * including a substantially similar Disclaimer requirement for further
+ * binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ * of any contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
*/
-#include "acpi.h"
-#include "acnamesp.h"
-#include "acdispat.h"
-#include "acinterp.h"
+#include <acpi/acpi.h>
+#include <acpi/acnamesp.h>
+#include <acpi/acdispat.h>
+#include <acpi/acinterp.h>
#define _COMPONENT ACPI_NAMESPACE
- MODULE_NAME ("nsinit")
+ ACPI_MODULE_NAME ("nsinit")
/*******************************************************************************
*
- * FUNCTION: Acpi_ns_initialize_objects
+ * FUNCTION: acpi_ns_initialize_objects
*
* PARAMETERS: None
*
@@ -50,24 +68,20 @@
acpi_ns_initialize_objects (
void)
{
- acpi_status status;
- acpi_init_walk_info info;
+ acpi_status status;
+ struct acpi_init_walk_info info;
- FUNCTION_TRACE ("Ns_initialize_objects");
+ ACPI_FUNCTION_TRACE ("ns_initialize_objects");
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"**** Starting initialization of namespace objects ****\n"));
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, "Completing Region and Field initialization:"));
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "Completing Region/Field/Buffer/Package initialization:"));
+ /* Set all init info to zero */
- info.field_count = 0;
- info.field_init = 0;
- info.op_region_count = 0;
- info.op_region_init = 0;
- info.object_count = 0;
-
+ ACPI_MEMSET (&info, 0, sizeof (struct acpi_init_walk_info));
/* Walk entire namespace from the supplied root */
@@ -75,17 +89,21 @@
ACPI_UINT32_MAX, acpi_ns_init_one_object,
&info, NULL);
if (ACPI_FAILURE (status)) {
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Walk_namespace failed! %x\n", status));
+ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "walk_namespace failed! %s\n",
+ acpi_format_exception (status)));
}
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
- "\n%d/%d Regions, %d/%d Fields initialized (%d nodes total)\n",
- info.op_region_init, info.op_region_count, info.field_init,
- info.field_count, info.object_count));
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
+ "\nInitialized %hd/%hd Regions %hd/%hd Fields %hd/%hd Buffers %hd/%hd Packages (%hd nodes)\n",
+ info.op_region_init, info.op_region_count,
+ info.field_init, info.field_count,
+ info.buffer_init, info.buffer_count,
+ info.package_init, info.package_count, info.object_count));
+
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
- "%d Control Methods found\n", info.method_count));
+ "%hd Control Methods found\n", info.method_count));
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
- "%d Op Regions found\n", info.op_region_count));
+ "%hd Op Regions found\n", info.op_region_count));
return_ACPI_STATUS (AE_OK);
}
@@ -93,7 +111,7 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ns_initialize_devices
+ * FUNCTION: acpi_ns_initialize_devices
*
* PARAMETERS: None
*
@@ -111,30 +129,33 @@
acpi_ns_initialize_devices (
void)
{
- acpi_status status;
- acpi_device_walk_info info;
+ acpi_status status;
+ struct acpi_device_walk_info info;
+
+ ACPI_FUNCTION_TRACE ("ns_initialize_devices");
- FUNCTION_TRACE ("Ns_initialize_devices");
+ /* Init counters */
info.device_count = 0;
info.num_STA = 0;
info.num_INI = 0;
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "Executing all Device _STA and_INI methods:"));
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, "Executing device _INI methods:"));
+ /* Walk namespace for all objects of type Device */
status = acpi_ns_walk_namespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
ACPI_UINT32_MAX, FALSE, acpi_ns_init_one_device, &info, NULL);
if (ACPI_FAILURE (status)) {
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Walk_namespace failed! %x\n", status));
+ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "walk_namespace failed! %s\n",
+ acpi_format_exception (status)));
}
-
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
- "\n%d Devices found: %d _STA, %d _INI\n",
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
+ "\n%hd Devices found containing: %hd _STA, %hd _INI methods\n",
info.device_count, info.num_STA, info.num_INI));
return_ACPI_STATUS (status);
@@ -143,16 +164,16 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ns_init_one_object
+ * FUNCTION: acpi_ns_init_one_object
*
- * PARAMETERS: Obj_handle - Node
+ * PARAMETERS: obj_handle - Node
* Level - Current nesting level
* Context - Points to a init info struct
- * Return_value - Not used
+ * return_value - Not used
*
* RETURN: Status
*
- * DESCRIPTION: Callback from Acpi_walk_namespace. Invoked for every object
+ * DESCRIPTION: Callback from acpi_walk_namespace. Invoked for every object
* within the namespace.
*
* Currently, the only objects that require initialization are:
@@ -163,37 +184,62 @@
acpi_status
acpi_ns_init_one_object (
- acpi_handle obj_handle,
- u32 level,
- void *context,
- void **return_value)
+ acpi_handle obj_handle,
+ u32 level,
+ void *context,
+ void **return_value)
{
- acpi_object_type8 type;
- acpi_status status;
- acpi_init_walk_info *info = (acpi_init_walk_info *) context;
- acpi_namespace_node *node = (acpi_namespace_node *) obj_handle;
- acpi_operand_object *obj_desc;
+ acpi_object_type type;
+ acpi_status status;
+ struct acpi_init_walk_info *info = (struct acpi_init_walk_info *) context;
+ struct acpi_namespace_node *node = (struct acpi_namespace_node *) obj_handle;
+ union acpi_operand_object *obj_desc;
- PROC_NAME ("Ns_init_one_object");
+ ACPI_FUNCTION_NAME ("ns_init_one_object");
info->object_count++;
-
/* And even then, we are only interested in a few object types */
type = acpi_ns_get_type (obj_handle);
- obj_desc = node->object;
+ obj_desc = acpi_ns_get_attached_object (node);
if (!obj_desc) {
return (AE_OK);
}
- if ((type != ACPI_TYPE_REGION) &&
- (type != ACPI_TYPE_BUFFER_FIELD)) {
+ /* Increment counters for object types we are looking for */
+
+ switch (type) {
+ case ACPI_TYPE_REGION:
+ info->op_region_count++;
+ break;
+
+ case ACPI_TYPE_BUFFER_FIELD:
+ info->field_count++;
+ break;
+
+ case ACPI_TYPE_BUFFER:
+ info->buffer_count++;
+ break;
+
+ case ACPI_TYPE_PACKAGE:
+ info->package_count++;
+ break;
+
+ default:
+
+ /* No init required, just exit now */
return (AE_OK);
}
+ /*
+ * If the object is already initialized, nothing else to do
+ */
+ if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
+ return (AE_OK);
+ }
/*
* Must lock the interpreter before executing AML code
@@ -203,61 +249,59 @@
return (status);
}
+ /*
+ * Each of these types can contain executable AML code within
+ * the declaration.
+ */
switch (type) {
-
case ACPI_TYPE_REGION:
- info->op_region_count++;
- if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
- break;
- }
-
info->op_region_init++;
status = acpi_ds_get_region_arguments (obj_desc);
- if (ACPI_FAILURE (status)) {
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ERROR, "\n"));
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
- "%s while getting region arguments [%4.4s]\n",
- acpi_format_exception (status), (char*)&node->name));
- }
-
- if (!(acpi_dbg_level & ACPI_LV_INIT)) {
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, "."));
- }
-
break;
case ACPI_TYPE_BUFFER_FIELD:
- info->field_count++;
- if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
- break;
- }
-
info->field_init++;
status = acpi_ds_get_buffer_field_arguments (obj_desc);
- if (ACPI_FAILURE (status)) {
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ERROR, "\n"));
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
- "%s while getting buffer field arguments [%4.4s]\n",
- acpi_format_exception (status), (char*)&node->name));
- }
- if (!(acpi_dbg_level & ACPI_LV_INIT)) {
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, "."));
- }
+ break;
+
+ case ACPI_TYPE_BUFFER:
+ info->buffer_init++;
+ status = acpi_ds_get_buffer_arguments (obj_desc);
+ break;
+
+
+ case ACPI_TYPE_PACKAGE:
+
+ info->package_init++;
+ status = acpi_ds_get_package_arguments (obj_desc);
break;
default:
+ /* No other types can get here */
break;
}
+ if (ACPI_FAILURE (status)) {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ERROR, "\n"));
+ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
+ "Could not execute arguments for [%4.4s] (%s), %s\n",
+ node->name.ascii, acpi_ut_get_type_name (type), acpi_format_exception (status)));
+ }
+
+ /* Print a dot for each object unless we are going to print the entire pathname */
+
+ if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
+ }
/*
* We ignore errors from above, and always return OK, since
- * we don't want to abort the walk on a single error.
+ * we don't want to abort the walk on any single error.
*/
acpi_ex_exit_interpreter ();
return (AE_OK);
@@ -266,7 +310,7 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ns_init_one_device
+ * FUNCTION: acpi_ns_init_one_device
*
* PARAMETERS: acpi_walk_callback
*
@@ -280,40 +324,46 @@
acpi_status
acpi_ns_init_one_device (
- acpi_handle obj_handle,
- u32 nesting_level,
- void *context,
- void **return_value)
+ acpi_handle obj_handle,
+ u32 nesting_level,
+ void *context,
+ void **return_value)
{
- acpi_status status;
- acpi_namespace_node *node;
- u32 flags;
- acpi_device_walk_info *info = (acpi_device_walk_info *) context;
+ acpi_status status;
+ struct acpi_namespace_node *node;
+ u32 flags;
+ struct acpi_device_walk_info *info = (struct acpi_device_walk_info *) context;
- FUNCTION_TRACE ("Ns_init_one_device");
+ ACPI_FUNCTION_TRACE ("ns_init_one_device");
- if (!(acpi_dbg_level & ACPI_LV_INIT)) {
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, "."));
+ if ((acpi_dbg_level <= ACPI_LV_ALL_EXCEPTIONS) && (!(acpi_dbg_level & ACPI_LV_INFO))) {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
}
info->device_count++;
- acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
node = acpi_ns_map_handle_to_node (obj_handle);
if (!node) {
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
- return (AE_BAD_PARAMETER);
+ (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
}
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ status = acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
/*
* Run _STA to determine if we can run _INI on the device.
*/
- DEBUG_EXEC (acpi_ut_display_init_pathname (node, "_STA [Method]"));
+ ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_METHOD, node, "_STA"));
status = acpi_ut_execute_STA (node, &flags);
if (ACPI_FAILURE (status)) {
/* Ignore error and move on to next device */
@@ -329,36 +379,41 @@
return_ACPI_STATUS(AE_CTRL_DEPTH);
}
-
/*
* The device is present. Run _INI.
*/
- DEBUG_EXEC (acpi_ut_display_init_pathname (obj_handle, "_INI [Method]"));
+ ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_METHOD, obj_handle, "_INI"));
status = acpi_ns_evaluate_relative (obj_handle, "_INI", NULL, NULL);
- if (AE_NOT_FOUND == status) {
- /* No _INI means device requires no initialization */
+ if (ACPI_FAILURE (status)) {
+ /* No _INI (AE_NOT_FOUND) means device requires no initialization */
- status = AE_OK;
- }
+ if (status != AE_NOT_FOUND) {
+ /* Ignore error and move on to next device */
- else if (ACPI_FAILURE (status)) {
- /* Ignore error and move on to next device */
+ #ifdef ACPI_DEBUG_OUTPUT
+ char *scope_name = acpi_ns_get_external_pathname (obj_handle);
-#ifdef ACPI_DEBUG
- NATIVE_CHAR *scope_name = acpi_ns_get_table_pathname (obj_handle);
+ ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "%s._INI failed: %s\n",
+ scope_name, acpi_format_exception (status)));
- ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "%s._INI failed: %s\n",
- scope_name, acpi_format_exception (status)));
+ ACPI_MEM_FREE (scope_name);
+ #endif
+ }
- ACPI_MEM_FREE (scope_name);
-#endif
+ status = AE_OK;
}
-
else {
/* Count of successful INIs */
info->num_INI++;
}
- return_ACPI_STATUS (AE_OK);
+ if (acpi_gbl_init_handler) {
+ /* External initialization handler is present, call it */
+
+ status = acpi_gbl_init_handler (obj_handle, ACPI_INIT_DEVICE_INI);
+ }
+
+
+ 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)