⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsinit.c

📁 linux-2.6.15.6
💻 C
字号:
/****************************************************************************** * * Module Name: dsinit - Object initialization namespace walk * *****************************************************************************//* * Copyright (C) 2000 - 2005, R. Byron Moore * All rights reserved. * * 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/acpi.h>#include <acpi/acdispat.h>#include <acpi/acnamesp.h>#define _COMPONENT          ACPI_DISPATCHERACPI_MODULE_NAME("dsinit")/* Local prototypes */static acpi_statusacpi_ds_init_one_object(acpi_handle obj_handle,			u32 level, void *context, void **return_value);/******************************************************************************* * * FUNCTION:    acpi_ds_init_one_object * * PARAMETERS:  obj_handle      - Node for the object *              Level           - Current nesting level *              Context         - Points to a init info struct *              return_value    - Not used * * RETURN:      Status * * DESCRIPTION: Callback from acpi_walk_namespace. Invoked for every object *              within the namespace. * *              Currently, the only objects that require initialization are: *              1) Methods *              2) Operation Regions * ******************************************************************************/static acpi_statusacpi_ds_init_one_object(acpi_handle obj_handle,			u32 level, void *context, void **return_value){	struct acpi_init_walk_info *info =	    (struct acpi_init_walk_info *)context;	struct acpi_namespace_node *node =	    (struct acpi_namespace_node *)obj_handle;	acpi_object_type type;	acpi_status status;	ACPI_FUNCTION_NAME("ds_init_one_object");	/*	 * We are only interested in NS nodes owned by the table that	 * was just loaded	 */	if (node->owner_id != info->table_desc->owner_id) {		return (AE_OK);	}	info->object_count++;	/* And even then, we are only interested in a few object types */	type = acpi_ns_get_type(obj_handle);	switch (type) {	case ACPI_TYPE_REGION:		status = acpi_ds_initialize_region(obj_handle);		if (ACPI_FAILURE(status)) {			ACPI_DEBUG_PRINT((ACPI_DB_ERROR,					  "Region %p [%4.4s] - Init failure, %s\n",					  obj_handle,					  acpi_ut_get_node_name(obj_handle),					  acpi_format_exception(status)));		}		info->op_region_count++;		break;	case ACPI_TYPE_METHOD:		/*		 * Print a dot for each method unless we are going to print		 * the entire pathname		 */		if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {			ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "."));		}		/*		 * Set the execution data width (32 or 64) based upon the		 * revision number of the parent ACPI table.		 * TBD: This is really for possible future support of integer width		 * on a per-table basis. Currently, we just use a global for the width.		 */		if (info->table_desc->pointer->revision == 1) {			node->flags |= ANOBJ_DATA_WIDTH_32;		}		/*		 * Always parse methods to detect errors, we will delete		 * the parse tree below		 */		status = acpi_ds_parse_method(obj_handle);		if (ACPI_FAILURE(status)) {			ACPI_DEBUG_PRINT((ACPI_DB_ERROR,					  "\n+Method %p [%4.4s] - parse failure, %s\n",					  obj_handle,					  acpi_ut_get_node_name(obj_handle),					  acpi_format_exception(status)));			/* This parse failed, but we will continue parsing more methods */		}		info->method_count++;		break;	case ACPI_TYPE_DEVICE:		info->device_count++;		break;	default:		break;	}	/*	 * We ignore errors from above, and always return OK, since	 * we don't want to abort the walk on a single error.	 */	return (AE_OK);}/******************************************************************************* * * FUNCTION:    acpi_ds_initialize_objects * * PARAMETERS:  table_desc      - Descriptor for parent ACPI table *              start_node      - Root of subtree to be initialized. * * RETURN:      Status * * DESCRIPTION: Walk the namespace starting at "start_node" and perform any *              necessary initialization on the objects found therein * ******************************************************************************/acpi_statusacpi_ds_initialize_objects(struct acpi_table_desc * table_desc,			   struct acpi_namespace_node * start_node){	acpi_status status;	struct acpi_init_walk_info info;	ACPI_FUNCTION_TRACE("ds_initialize_objects");	ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,			  "**** Starting initialization of namespace objects ****\n"));	ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "Parsing all Control Methods:"));	info.method_count = 0;	info.op_region_count = 0;	info.object_count = 0;	info.device_count = 0;	info.table_desc = table_desc;	/* Walk entire namespace from the supplied root */	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, %s\n",				  acpi_format_exception(status)));	}	ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,			      "\nTable [%4.4s](id %4.4X) - %hd Objects with %hd Devices %hd Methods %hd Regions\n",			      table_desc->pointer->signature,			      table_desc->owner_id, info.object_count,			      info.device_count, info.method_count,			      info.op_region_count));	ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,			  "%hd Methods, %hd Regions\n", info.method_count,			  info.op_region_count));	return_ACPI_STATUS(AE_OK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -