dsinit.c

来自「linux 内核源代码」· C语言 代码 · 共 205 行

C
205
字号
/****************************************************************************** * * Module Name: dsinit - Object initialization namespace walk * *****************************************************************************//* * Copyright (C) 2000 - 2007, 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>#include <acpi/actables.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_ENTRY();	/*	 * We are only interested in NS nodes owned by the table that	 * was just loaded	 */	if (node->owner_id != info->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_EXCEPTION((AE_INFO, status,					"During Region initialization %p [%4.4s]",					obj_handle,					acpi_ut_get_node_name(obj_handle)));		}		info->op_region_count++;		break;	case ACPI_TYPE_METHOD:		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 "StartNode" and perform any *              necessary initialization on the objects found therein * ******************************************************************************/acpi_statusacpi_ds_initialize_objects(acpi_native_uint table_index,			   struct acpi_namespace_node * start_node){	acpi_status status;	struct acpi_init_walk_info info;	struct acpi_table_header *table;	acpi_owner_id owner_id;	ACPI_FUNCTION_TRACE(ds_initialize_objects);	status = acpi_tb_get_owner_id(table_index, &owner_id);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	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_index = table_index;	info.owner_id = owner_id;	/* 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_EXCEPTION((AE_INFO, status, "During WalkNamespace"));	}	status = acpi_get_table_by_index(table_index, &table);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(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->signature, 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 + =
减小字号Ctrl + -
显示快捷键?