evrgnini.c

来自「linux 内核源代码」· C语言 代码 · 共 689 行 · 第 1/2 页

C
689
字号
static u8 acpi_ev_match_pci_root_bridge(char *id){	/*	 * Check if this is a PCI root.	 * ACPI 3.0+: check for a PCI Express root also.	 */	if (!(ACPI_STRNCMP(id,			   PCI_ROOT_HID_STRING,			   sizeof(PCI_ROOT_HID_STRING))) ||	    !(ACPI_STRNCMP(id,			   PCI_EXPRESS_ROOT_HID_STRING,			   sizeof(PCI_EXPRESS_ROOT_HID_STRING)))) {		return (TRUE);	}	return (FALSE);}/******************************************************************************* * * FUNCTION:    acpi_ev_is_pci_root_bridge * * PARAMETERS:  Node            - Device node being examined * * RETURN:      TRUE if device is a PCI/PCI-Express Root Bridge * * DESCRIPTION: Determine if the input device represents a PCI Root Bridge by *              examining the _HID and _CID for the device. * ******************************************************************************/static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node){	acpi_status status;	struct acpica_device_id hid;	struct acpi_compatible_id_list *cid;	acpi_native_uint i;	/*	 * Get the _HID and check for a PCI Root Bridge	 */	status = acpi_ut_execute_HID(node, &hid);	if (ACPI_FAILURE(status)) {		return (FALSE);	}	if (acpi_ev_match_pci_root_bridge(hid.value)) {		return (TRUE);	}	/*	 * The _HID did not match.	 * Get the _CID and check for a PCI Root Bridge	 */	status = acpi_ut_execute_CID(node, &cid);	if (ACPI_FAILURE(status)) {		return (FALSE);	}	/* Check all _CIDs in the returned list */	for (i = 0; i < cid->count; i++) {		if (acpi_ev_match_pci_root_bridge(cid->id[i].value)) {			ACPI_FREE(cid);			return (TRUE);		}	}	ACPI_FREE(cid);	return (FALSE);}/******************************************************************************* * * FUNCTION:    acpi_ev_pci_bar_region_setup * * PARAMETERS:  Handle              - Region we are interested in *              Function            - Start or stop *              handler_context     - Address space handler context *              region_context      - Region specific context * * RETURN:      Status * * DESCRIPTION: Setup a pci_bAR operation region * * MUTEX:       Assumes namespace is not locked * ******************************************************************************/acpi_statusacpi_ev_pci_bar_region_setup(acpi_handle handle,			     u32 function,			     void *handler_context, void **region_context){	ACPI_FUNCTION_TRACE(ev_pci_bar_region_setup);	return_ACPI_STATUS(AE_OK);}/******************************************************************************* * * FUNCTION:    acpi_ev_cmos_region_setup * * PARAMETERS:  Handle              - Region we are interested in *              Function            - Start or stop *              handler_context     - Address space handler context *              region_context      - Region specific context * * RETURN:      Status * * DESCRIPTION: Setup a CMOS operation region * * MUTEX:       Assumes namespace is not locked * ******************************************************************************/acpi_statusacpi_ev_cmos_region_setup(acpi_handle handle,			  u32 function,			  void *handler_context, void **region_context){	ACPI_FUNCTION_TRACE(ev_cmos_region_setup);	return_ACPI_STATUS(AE_OK);}/******************************************************************************* * * FUNCTION:    acpi_ev_default_region_setup * * PARAMETERS:  Handle              - Region we are interested in *              Function            - Start or stop *              handler_context     - Address space handler context *              region_context      - Region specific context * * RETURN:      Status * * DESCRIPTION: Default region initialization * ******************************************************************************/acpi_statusacpi_ev_default_region_setup(acpi_handle handle,			     u32 function,			     void *handler_context, void **region_context){	ACPI_FUNCTION_TRACE(ev_default_region_setup);	if (function == ACPI_REGION_DEACTIVATE) {		*region_context = NULL;	} else {		*region_context = handler_context;	}	return_ACPI_STATUS(AE_OK);}/******************************************************************************* * * FUNCTION:    acpi_ev_initialize_region * * PARAMETERS:  region_obj      - Region we are initializing *              acpi_ns_locked  - Is namespace locked? * * RETURN:      Status * * DESCRIPTION: Initializes the region, finds any _REG methods and saves them *              for execution at a later time * *              Get the appropriate address space handler for a newly *              created region. * *              This also performs address space specific initialization.  For *              example, PCI regions must have an _ADR object that contains *              a PCI address in the scope of the definition.  This address is *              required to perform an access to PCI config space. * * MUTEX:       Interpreter should be unlocked, because we may run the _REG *              method for this region. * ******************************************************************************/acpi_statusacpi_ev_initialize_region(union acpi_operand_object *region_obj,			  u8 acpi_ns_locked){	union acpi_operand_object *handler_obj;	union acpi_operand_object *obj_desc;	acpi_adr_space_type space_id;	struct acpi_namespace_node *node;	acpi_status status;	struct acpi_namespace_node *method_node;	acpi_name *reg_name_ptr = (acpi_name *) METHOD_NAME__REG;	union acpi_operand_object *region_obj2;	ACPI_FUNCTION_TRACE_U32(ev_initialize_region, acpi_ns_locked);	if (!region_obj) {		return_ACPI_STATUS(AE_BAD_PARAMETER);	}	if (region_obj->common.flags & AOPOBJ_OBJECT_INITIALIZED) {		return_ACPI_STATUS(AE_OK);	}	region_obj2 = acpi_ns_get_secondary_object(region_obj);	if (!region_obj2) {		return_ACPI_STATUS(AE_NOT_EXIST);	}	node = acpi_ns_get_parent_node(region_obj->region.node);	space_id = region_obj->region.space_id;	/* Setup defaults */	region_obj->region.handler = NULL;	region_obj2->extra.method_REG = NULL;	region_obj->common.flags &= ~(AOPOBJ_SETUP_COMPLETE);	region_obj->common.flags |= AOPOBJ_OBJECT_INITIALIZED;	/* Find any "_REG" method associated with this region definition */	status =	    acpi_ns_search_one_scope(*reg_name_ptr, node, ACPI_TYPE_METHOD,				     &method_node);	if (ACPI_SUCCESS(status)) {		/*		 * The _REG method is optional and there can be only one per region		 * definition.  This will be executed when the handler is attached		 * or removed		 */		region_obj2->extra.method_REG = method_node;	}	/*	 * The following loop depends upon the root Node having no parent	 * ie: acpi_gbl_root_node->parent_entry being set to NULL	 */	while (node) {		/* Check to see if a handler exists */		handler_obj = NULL;		obj_desc = acpi_ns_get_attached_object(node);		if (obj_desc) {			/* Can only be a handler if the object exists */			switch (node->type) {			case ACPI_TYPE_DEVICE:				handler_obj = obj_desc->device.handler;				break;			case ACPI_TYPE_PROCESSOR:				handler_obj = obj_desc->processor.handler;				break;			case ACPI_TYPE_THERMAL:				handler_obj = obj_desc->thermal_zone.handler;				break;			default:				/* Ignore other objects */				break;			}			while (handler_obj) {				/* Is this handler of the correct type? */				if (handler_obj->address_space.space_id ==				    space_id) {					/* Found correct handler */					ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,							  "Found handler %p for region %p in obj %p\n",							  handler_obj,							  region_obj,							  obj_desc));					status =					    acpi_ev_attach_region(handler_obj,								  region_obj,								  acpi_ns_locked);					/*					 * Tell all users that this region is usable by running the _REG					 * method					 */					if (acpi_ns_locked) {						status =						    acpi_ut_release_mutex						    (ACPI_MTX_NAMESPACE);						if (ACPI_FAILURE(status)) {							return_ACPI_STATUS							    (status);						}					}					status =					    acpi_ev_execute_reg_method					    (region_obj, 1);					if (acpi_ns_locked) {						status =						    acpi_ut_acquire_mutex						    (ACPI_MTX_NAMESPACE);						if (ACPI_FAILURE(status)) {							return_ACPI_STATUS							    (status);						}					}					return_ACPI_STATUS(AE_OK);				}				/* Try next handler in the list */				handler_obj = handler_obj->address_space.next;			}		}		/*		 * This node does not have the handler we need;		 * Pop up one level		 */		node = acpi_ns_get_parent_node(node);	}	/* If we get here, there is no handler for this region */	ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,			  "No handler for RegionType %s(%X) (RegionObj %p)\n",			  acpi_ut_get_region_name(space_id), space_id,			  region_obj));	return_ACPI_STATUS(AE_NOT_EXIST);}

⌨️ 快捷键说明

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