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

📄 evrgnini.c

📁 h内核
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** * * Module Name: evrgnini- ACPI address_space (op_region) init * *****************************************************************************//* * 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/acevents.h>#include <acpi/acnamesp.h>#define _COMPONENT          ACPI_EVENTS	 ACPI_MODULE_NAME    ("evrgnini")/******************************************************************************* * * FUNCTION:    acpi_ev_system_memory_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: Do any prep work for region handling, a nop for now * ******************************************************************************/acpi_statusacpi_ev_system_memory_region_setup (	acpi_handle                     handle,	u32                             function,	void                            *handler_context,	void                            **region_context){	union acpi_operand_object       *region_desc = (union acpi_operand_object *) handle;	struct acpi_mem_space_context   *local_region_context;	ACPI_FUNCTION_TRACE ("ev_system_memory_region_setup");	if (function == ACPI_REGION_DEACTIVATE) {		if (*region_context) {			ACPI_MEM_FREE (*region_context);			*region_context = NULL;		}		return_ACPI_STATUS (AE_OK);	}	/* Create a new context */	local_region_context = ACPI_MEM_CALLOCATE (sizeof (struct acpi_mem_space_context));	if (!(local_region_context)) {		return_ACPI_STATUS (AE_NO_MEMORY);	}	/* Save the region length and address for use in the handler */	local_region_context->length = region_desc->region.length;	local_region_context->address = region_desc->region.address;	*region_context = local_region_context;	return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    acpi_ev_io_space_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: Do any prep work for region handling * ******************************************************************************/acpi_statusacpi_ev_io_space_region_setup (	acpi_handle                     handle,	u32                             function,	void                            *handler_context,	void                            **region_context){	ACPI_FUNCTION_TRACE ("ev_io_space_region_setup");	if (function == ACPI_REGION_DEACTIVATE) {		*region_context = NULL;	}	else {		*region_context = handler_context;	}	return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    acpi_ev_pci_config_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: Do any prep work for region handling * * MUTEX:       Assumes namespace is not locked * ******************************************************************************/acpi_statusacpi_ev_pci_config_region_setup (	acpi_handle                     handle,	u32                             function,	void                            *handler_context,	void                            **region_context){	acpi_status                     status = AE_OK;	acpi_integer                    pci_value;	struct acpi_pci_id              *pci_id = *region_context;	union acpi_operand_object       *handler_obj;	struct acpi_namespace_node      *parent_node;	struct acpi_namespace_node      *pci_root_node;	union acpi_operand_object       *region_obj = (union acpi_operand_object   *) handle;	struct acpi_device_id           object_hID;	ACPI_FUNCTION_TRACE ("ev_pci_config_region_setup");	handler_obj = region_obj->region.handler;	if (!handler_obj) {		/*		 * No installed handler. This shouldn't happen because the dispatch		 * routine checks before we get here, but we check again just in case.		 */		ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,			"Attempting to init a region %p, with no handler\n", region_obj));		return_ACPI_STATUS (AE_NOT_EXIST);	}	*region_context = NULL;	if (function == ACPI_REGION_DEACTIVATE) {		if (pci_id) {			ACPI_MEM_FREE (pci_id);		}		return_ACPI_STATUS (status);	}	parent_node = acpi_ns_get_parent_node (region_obj->region.node);	/*	 * Get the _SEG and _BBN values from the device upon which the handler	 * is installed.	 *	 * We need to get the _SEG and _BBN objects relative to the PCI BUS device.	 * This is the device the handler has been registered to handle.	 */	/*	 * If the address_space.Node is still pointing to the root, we need	 * to scan upward for a PCI Root bridge and re-associate the op_region	 * handlers with that device.	 */	if (handler_obj->address_space.node == acpi_gbl_root_node) {		/* Start search from the parent object */		pci_root_node = parent_node;		while (pci_root_node != acpi_gbl_root_node) {			status = acpi_ut_execute_HID (pci_root_node, &object_hID);			if (ACPI_SUCCESS (status)) {				/* Got a valid _HID, check if this is a PCI root */				if (!(ACPI_STRNCMP (object_hID.value, PCI_ROOT_HID_STRING,						   sizeof (PCI_ROOT_HID_STRING)))) {					/* Install a handler for this PCI root bridge */					status = acpi_install_address_space_handler ((acpi_handle) pci_root_node,							   ACPI_ADR_SPACE_PCI_CONFIG,							   ACPI_DEFAULT_HANDLER, NULL, NULL);					if (ACPI_FAILURE (status)) {						if (status == AE_SAME_HANDLER) {							/*							 * It is OK if the handler is already installed on the root							 * bridge.  Still need to return a context object for the							 * new PCI_Config operation region, however.							 */							status = AE_OK;						}						else {							ACPI_REPORT_ERROR ((								"Could not install pci_config handler for Root Bridge %4.4s, %s\n",								acpi_ut_get_node_name (pci_root_node), acpi_format_exception (status)));						}					}					break;				}			}			pci_root_node = acpi_ns_get_parent_node (pci_root_node);		}		/* PCI root bridge not found, use namespace root node */	}	else {		pci_root_node = handler_obj->address_space.node;	}	/*	 * If this region is now initialized, we are done.	 * (install_address_space_handler could have initialized it)	 */	if (region_obj->region.flags & AOPOBJ_SETUP_COMPLETE) {		return_ACPI_STATUS (AE_OK);	}	/* Region is still not initialized. Create a new context */	pci_id = ACPI_MEM_CALLOCATE (sizeof (struct acpi_pci_id));	if (!pci_id) {		return_ACPI_STATUS (AE_NO_MEMORY);	}	/*	 * For PCI_Config space access, we need the segment, bus,	 * device and function numbers.  Acquire them here.	 */	/*	 * Get the PCI device and function numbers from the _ADR object	 * contained in the parent's scope.	 */	status = acpi_ut_evaluate_numeric_object (METHOD_NAME__ADR, parent_node, &pci_value);	/*	 * The default is zero, and since the allocation above zeroed	 * the data, just do nothing on failure.	 */	if (ACPI_SUCCESS (status)) {		pci_id->device  = ACPI_HIWORD (ACPI_LODWORD (pci_value));		pci_id->function = ACPI_LOWORD (ACPI_LODWORD (pci_value));	}

⌨️ 快捷键说明

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