X-Git-Url: http://git.onelab.eu/?p=linux-2.6.git;a=blobdiff_plain;f=drivers%2Facpi%2Fnamespace%2Fnsinit.c;fp=drivers%2Facpi%2Fnamespace%2Fnsinit.c;h=9f929e479fd835b66183d7ab5478f768893acfce;hp=4a46b380605b5182df6431f0147000b21416af67;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hpb=cee37fe97739d85991964371c1f3a745c00dd236 diff --git a/drivers/acpi/namespace/nsinit.c b/drivers/acpi/namespace/nsinit.c index 4a46b3806..9f929e479 100644 --- a/drivers/acpi/namespace/nsinit.c +++ b/drivers/acpi/namespace/nsinit.c @@ -5,7 +5,7 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2005, R. Byron Moore + * Copyright (C) 2000 - 2006, R. Byron Moore * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,15 +41,22 @@ * POSSIBILITY OF SUCH DAMAGES. */ - #include #include #include #include #define _COMPONENT ACPI_NAMESPACE - ACPI_MODULE_NAME ("nsinit") +ACPI_MODULE_NAME("nsinit") + +/* Local prototypes */ +static acpi_status +acpi_ns_init_one_object(acpi_handle obj_handle, + u32 level, void *context, void **return_value); +static acpi_status +acpi_ns_init_one_device(acpi_handle obj_handle, + u32 nesting_level, void *context, void **return_value); /******************************************************************************* * @@ -64,52 +71,47 @@ * ******************************************************************************/ -acpi_status -acpi_ns_initialize_objects ( - void) +acpi_status acpi_ns_initialize_objects(void) { - acpi_status status; - struct acpi_init_walk_info info; - - - ACPI_FUNCTION_TRACE ("ns_initialize_objects"); + acpi_status status; + struct acpi_init_walk_info info; + ACPI_FUNCTION_TRACE("ns_initialize_objects"); - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "**** Starting initialization of namespace objects ****\n")); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, - "Completing Region/Field/Buffer/Package initialization:")); + ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, + "**** Starting initialization of namespace objects ****\n")); + ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, + "Completing Region/Field/Buffer/Package initialization:")); /* Set all init info to zero */ - ACPI_MEMSET (&info, 0, sizeof (struct acpi_init_walk_info)); + ACPI_MEMSET(&info, 0, sizeof(struct acpi_init_walk_info)); /* Walk entire namespace from the supplied root */ - status = acpi_walk_namespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, acpi_ns_init_one_object, - &info, NULL); - if (ACPI_FAILURE (status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "walk_namespace failed! %s\n", - acpi_format_exception (status))); + status = acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, + ACPI_UINT32_MAX, acpi_ns_init_one_object, + &info, NULL); + if (ACPI_FAILURE(status)) { + ACPI_EXCEPTION((AE_INFO, status, "During walk_namespace")); } - 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_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, - "%hd Control Methods found\n", info.method_count)); - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "%hd Op Regions found\n", info.op_region_count)); + ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, + "%hd Control Methods found\n", info.method_count)); + ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, + "%hd Op Regions found\n", info.op_region_count)); - return_ACPI_STATUS (AE_OK); + return_ACPI_STATUS(AE_OK); } - /******************************************************************************* * * FUNCTION: acpi_ns_initialize_devices @@ -126,16 +128,12 @@ acpi_ns_initialize_objects ( * ******************************************************************************/ -acpi_status -acpi_ns_initialize_devices ( - void) +acpi_status acpi_ns_initialize_devices(void) { - acpi_status status; - struct acpi_device_walk_info info; - - - ACPI_FUNCTION_TRACE ("ns_initialize_devices"); + acpi_status status; + struct acpi_device_walk_info info; + ACPI_FUNCTION_TRACE("ns_initialize_devices"); /* Init counters */ @@ -143,34 +141,33 @@ acpi_ns_initialize_devices ( 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_INIT, + "Executing all Device _STA and_INI methods:")); - status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); + status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); + if (ACPI_FAILURE(status)) { + return_ACPI_STATUS(status); } /* Walk namespace for all objects */ - status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, TRUE, acpi_ns_init_one_device, &info, NULL); + status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, + ACPI_UINT32_MAX, TRUE, + acpi_ns_init_one_device, &info, NULL); - (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); + (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); - if (ACPI_FAILURE (status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "walk_namespace failed! %s\n", - acpi_format_exception (status))); + if (ACPI_FAILURE(status)) { + ACPI_EXCEPTION((AE_INFO, status, "During walk_namespace")); } - 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)); + ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, + "\n%hd Devices found - executed %hd _STA, %hd _INI methods\n", + info.device_count, info.num_STA, info.num_INI)); - return_ACPI_STATUS (status); + return_ACPI_STATUS(status); } - /******************************************************************************* * * FUNCTION: acpi_ns_init_one_object @@ -191,29 +188,26 @@ acpi_ns_initialize_devices ( * ******************************************************************************/ -acpi_status -acpi_ns_init_one_object ( - acpi_handle obj_handle, - u32 level, - void *context, - void **return_value) +static acpi_status +acpi_ns_init_one_object(acpi_handle obj_handle, + u32 level, void *context, void **return_value) { - 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; - - - ACPI_FUNCTION_NAME ("ns_init_one_object"); + 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; + 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 = acpi_ns_get_attached_object (node); + type = acpi_ns_get_type(obj_handle); + obj_desc = acpi_ns_get_attached_object(node); if (!obj_desc) { return (AE_OK); } @@ -253,8 +247,8 @@ acpi_ns_init_one_object ( /* * Must lock the interpreter before executing AML code */ - status = acpi_ex_enter_interpreter (); - if (ACPI_FAILURE (status)) { + status = acpi_ex_enter_interpreter(); + if (ACPI_FAILURE(status)) { return (status); } @@ -266,25 +260,25 @@ acpi_ns_init_one_object ( case ACPI_TYPE_REGION: info->op_region_init++; - status = acpi_ds_get_region_arguments (obj_desc); + status = acpi_ds_get_region_arguments(obj_desc); break; case ACPI_TYPE_BUFFER_FIELD: info->field_init++; - status = acpi_ds_get_buffer_field_arguments (obj_desc); + status = acpi_ds_get_buffer_field_arguments(obj_desc); break; case ACPI_TYPE_BUFFER: info->buffer_init++; - status = acpi_ds_get_buffer_arguments (obj_desc); + status = acpi_ds_get_buffer_arguments(obj_desc); break; case ACPI_TYPE_PACKAGE: info->package_init++; - status = acpi_ds_get_package_arguments (obj_desc); + status = acpi_ds_get_package_arguments(obj_desc); break; default: @@ -292,12 +286,11 @@ acpi_ns_init_one_object ( 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", - acpi_ut_get_node_name (node), acpi_ut_get_type_name (type), - acpi_format_exception (status))); + if (ACPI_FAILURE(status)) { + ACPI_EXCEPTION((AE_INFO, status, + "Could not execute arguments for [%4.4s] (%s)", + acpi_ut_get_node_name(node), + acpi_ut_get_type_name(type))); } /* @@ -305,18 +298,17 @@ acpi_ns_init_one_object ( * pathname */ if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, ".")); + 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 any single error. */ - acpi_ex_exit_interpreter (); + acpi_ex_exit_interpreter(); return (AE_OK); } - /******************************************************************************* * * FUNCTION: acpi_ns_init_one_device @@ -331,99 +323,110 @@ acpi_ns_init_one_object ( * ******************************************************************************/ -acpi_status -acpi_ns_init_one_device ( - acpi_handle obj_handle, - u32 nesting_level, - void *context, - void **return_value) +static acpi_status +acpi_ns_init_one_device(acpi_handle obj_handle, + u32 nesting_level, void *context, void **return_value) { - struct acpi_device_walk_info *info = (struct acpi_device_walk_info *) context; - struct acpi_parameter_info pinfo; - u32 flags; - acpi_status status; - - - ACPI_FUNCTION_TRACE ("ns_init_one_device"); - - - pinfo.parameters = NULL; - pinfo.parameter_type = ACPI_PARAM_ARGS; - - pinfo.node = acpi_ns_map_handle_to_node (obj_handle); - if (!pinfo.node) { - return_ACPI_STATUS (AE_BAD_PARAMETER); + struct acpi_device_walk_info *info = + (struct acpi_device_walk_info *)context; + struct acpi_parameter_info pinfo; + u32 flags; + acpi_status status; + struct acpi_namespace_node *ini_node; + struct acpi_namespace_node *device_node; + + ACPI_FUNCTION_TRACE("ns_init_one_device"); + + device_node = acpi_ns_map_handle_to_node(obj_handle); + if (!device_node) { + return_ACPI_STATUS(AE_BAD_PARAMETER); } /* * We will run _STA/_INI on Devices, Processors and thermal_zones only */ - if ((pinfo.node->type != ACPI_TYPE_DEVICE) && - (pinfo.node->type != ACPI_TYPE_PROCESSOR) && - (pinfo.node->type != ACPI_TYPE_THERMAL)) { - return_ACPI_STATUS (AE_OK); + if ((device_node->type != ACPI_TYPE_DEVICE) && + (device_node->type != ACPI_TYPE_PROCESSOR) && + (device_node->type != ACPI_TYPE_THERMAL)) { + return_ACPI_STATUS(AE_OK); } if ((acpi_dbg_level <= ACPI_LV_ALL_EXCEPTIONS) && - (!(acpi_dbg_level & ACPI_LV_INFO))) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, ".")); + (!(acpi_dbg_level & ACPI_LV_INFO))) { + ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, ".")); } info->device_count++; /* - * Run _STA to determine if we can run _INI on the device. + * Check if the _INI method exists for this device - + * if _INI does not exist, there is no need to run _STA + * No _INI means device requires no initialization */ - ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_METHOD, pinfo.node, "_STA")); - status = acpi_ut_execute_STA (pinfo.node, &flags); + status = acpi_ns_search_node(*ACPI_CAST_PTR(u32, METHOD_NAME__INI), + device_node, ACPI_TYPE_METHOD, &ini_node); + if (ACPI_FAILURE(status)) { + /* No _INI method found - move on to next device */ - if (ACPI_FAILURE (status)) { - if (pinfo.node->type == ACPI_TYPE_DEVICE) { - /* Ignore error and move on to next device */ + return_ACPI_STATUS(AE_OK); + } - return_ACPI_STATUS (AE_OK); - } + /* + * Run _STA to determine if we can run _INI on the device - + * the device must be present before _INI can be run. + * However, _STA is not required - assume device present if no _STA + */ + ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_METHOD, + device_node, + METHOD_NAME__STA)); + + pinfo.node = device_node; + pinfo.parameters = NULL; + pinfo.parameter_type = ACPI_PARAM_ARGS; + + status = acpi_ut_execute_STA(pinfo.node, &flags); + if (ACPI_FAILURE(status)) { + /* Ignore error and move on to next device */ - /* _STA is not required for Processor or thermal_zone objects */ + return_ACPI_STATUS(AE_OK); } - else { + + if (flags != ACPI_UINT32_MAX) { info->num_STA++; + } - if (!(flags & 0x01)) { - /* Don't look at children of a not present device */ + if (!(flags & ACPI_STA_DEVICE_PRESENT)) { + /* Don't look at children of a not present device */ - return_ACPI_STATUS(AE_CTRL_DEPTH); - } + return_ACPI_STATUS(AE_CTRL_DEPTH); } /* - * The device is present. Run _INI. + * The device is present and _INI exists. Run the _INI method. + * (We already have the _INI node from above) */ - ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_METHOD, pinfo.node, "_INI")); - status = acpi_ns_evaluate_relative ("_INI", &pinfo); - if (ACPI_FAILURE (status)) { - /* No _INI (AE_NOT_FOUND) means device requires no initialization */ + ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_METHOD, + pinfo.node, + METHOD_NAME__INI)); - if (status != AE_NOT_FOUND) { - /* Ignore error and move on to next device */ + pinfo.node = ini_node; + status = acpi_ns_evaluate_by_handle(&pinfo); + if (ACPI_FAILURE(status)) { + /* Ignore error and move on to next device */ #ifdef ACPI_DEBUG_OUTPUT - char *scope_name = acpi_ns_get_external_pathname (pinfo.node); + char *scope_name = acpi_ns_get_external_pathname(ini_node); - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "%s._INI failed: %s\n", - scope_name, acpi_format_exception (status))); + ACPI_WARNING((AE_INFO, "%s._INI failed: %s", + scope_name, acpi_format_exception(status))); - ACPI_MEM_FREE (scope_name); + ACPI_MEM_FREE(scope_name); #endif - } - - status = AE_OK; - } - else { + } else { /* Delete any return object (especially if implicit_return is enabled) */ if (pinfo.return_object) { - acpi_ut_remove_reference (pinfo.return_object); + acpi_ut_remove_reference(pinfo.return_object); } /* Count of successful INIs */ @@ -434,8 +437,9 @@ acpi_ns_init_one_device ( if (acpi_gbl_init_handler) { /* External initialization handler is present, call it */ - status = acpi_gbl_init_handler (pinfo.node, ACPI_INIT_DEVICE_INI); + status = + acpi_gbl_init_handler(pinfo.node, ACPI_INIT_DEVICE_INI); } - return_ACPI_STATUS (status); + return_ACPI_STATUS(AE_OK); }