rsxface.c

来自「LINUX 2.6.17.4的源码」· C语言 代码 · 共 529 行 · 第 1/2 页

C
529
字号
	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;	status = acpi_rs_get_method_data(device_handle, name, &buffer);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	/* Buffer now contains the resource list */	resource = ACPI_CAST_PTR(struct acpi_resource, buffer.pointer);	resource_end =	    ACPI_ADD_PTR(struct acpi_resource, buffer.pointer, buffer.length);	/* Walk the resource list until the end_tag is found (or buffer end) */	while (resource < resource_end) {		/* Sanity check the resource */		if (resource->type > ACPI_RESOURCE_TYPE_MAX) {			status = AE_AML_INVALID_RESOURCE_TYPE;			break;		}		/* Invoke the user function, abort on any error returned */		status = user_function(resource, context);		if (ACPI_FAILURE(status)) {			if (status == AE_CTRL_TERMINATE) {				/* This is an OK termination by the user function */				status = AE_OK;			}			break;		}		/* end_tag indicates end-of-list */		if (resource->type == ACPI_RESOURCE_TYPE_END_TAG) {			break;		}		/* Get the next resource descriptor */		resource =		    ACPI_ADD_PTR(struct acpi_resource, resource,				 resource->length);	}	ACPI_MEM_FREE(buffer.pointer);	return_ACPI_STATUS(status);}EXPORT_SYMBOL(acpi_walk_resources);/******************************************************************************* * * FUNCTION:    acpi_set_current_resources * * PARAMETERS:  device_handle   - a handle to the device object for the *                                device we are changing the resources of *              in_buffer       - a pointer to a buffer containing the *                                resources to be set for the device * * RETURN:      Status * * DESCRIPTION: This function is called to set the current resources for a *              specific device.  The caller must first acquire a handle for *              the desired device.  The resource data is passed to the routine *              the buffer pointed to by the in_buffer variable. * ******************************************************************************/acpi_statusacpi_set_current_resources(acpi_handle device_handle,			   struct acpi_buffer *in_buffer){	acpi_status status;	ACPI_FUNCTION_TRACE("acpi_set_current_resources");	/* Must have a valid handle and buffer */	if ((!device_handle) ||	    (!in_buffer) || (!in_buffer->pointer) || (!in_buffer->length)) {		return_ACPI_STATUS(AE_BAD_PARAMETER);	}	status = acpi_rs_set_srs_method_data(device_handle, in_buffer);	return_ACPI_STATUS(status);}EXPORT_SYMBOL(acpi_set_current_resources);/****************************************************************************** * * FUNCTION:    acpi_resource_to_address64 * * PARAMETERS:  Resource                - Pointer to a resource *              Out                     - Pointer to the users's return *                                        buffer (a struct *                                        struct acpi_resource_address64) * * RETURN:      Status * * DESCRIPTION: If the resource is an address16, address32, or address64, *              copy it to the address64 return buffer.  This saves the *              caller from having to duplicate code for different-sized *              addresses. * ******************************************************************************/acpi_statusacpi_resource_to_address64(struct acpi_resource *resource,			   struct acpi_resource_address64 *out){	struct acpi_resource_address16 *address16;	struct acpi_resource_address32 *address32;	if (!resource || !out) {		return (AE_BAD_PARAMETER);	}	/* Convert 16 or 32 address descriptor to 64 */	switch (resource->type) {	case ACPI_RESOURCE_TYPE_ADDRESS16:		address16 = (struct acpi_resource_address16 *)&resource->data;		ACPI_COPY_ADDRESS(out, address16);		break;	case ACPI_RESOURCE_TYPE_ADDRESS32:		address32 = (struct acpi_resource_address32 *)&resource->data;		ACPI_COPY_ADDRESS(out, address32);		break;	case ACPI_RESOURCE_TYPE_ADDRESS64:		/* Simple copy for 64 bit source */		ACPI_MEMCPY(out, &resource->data,			    sizeof(struct acpi_resource_address64));		break;	default:		return (AE_BAD_PARAMETER);	}	return (AE_OK);}EXPORT_SYMBOL(acpi_resource_to_address64);/******************************************************************************* * * FUNCTION:    acpi_get_vendor_resource * * PARAMETERS:  device_handle       - Handle for the parent device object *              Name                - Method name for the parent resource *                                    (METHOD_NAME__CRS or METHOD_NAME__PRS) *              Uuid                - Pointer to the UUID to be matched. *                                    includes both subtype and 16-byte UUID *              ret_buffer          - Where the vendor resource is returned * * RETURN:      Status * * DESCRIPTION: Walk a resource template for the specified evice to find a *              vendor-defined resource that matches the supplied UUID and *              UUID subtype. Returns a struct acpi_resource of type Vendor. * ******************************************************************************/acpi_statusacpi_get_vendor_resource(acpi_handle device_handle,			 char *name,			 struct acpi_vendor_uuid * uuid,			 struct acpi_buffer * ret_buffer){	struct acpi_vendor_walk_info info;	acpi_status status;	/* Other parameters are validated by acpi_walk_resources */	if (!uuid || !ret_buffer) {		return (AE_BAD_PARAMETER);	}	info.uuid = uuid;	info.buffer = ret_buffer;	info.status = AE_NOT_EXIST;	/* Walk the _CRS or _PRS resource list for this device */	status =	    acpi_walk_resources(device_handle, name,				acpi_rs_match_vendor_resource, &info);	if (ACPI_FAILURE(status)) {		return (status);	}	return (info.status);}/******************************************************************************* * * FUNCTION:    acpi_rs_match_vendor_resource * * PARAMETERS:  ACPI_WALK_RESOURCE_CALLBACK * * RETURN:      Status * * DESCRIPTION: Match a vendor resource via the ACPI 3.0 UUID * ******************************************************************************/static acpi_statusacpi_rs_match_vendor_resource(struct acpi_resource *resource, void *context){	struct acpi_vendor_walk_info *info = context;	struct acpi_resource_vendor_typed *vendor;	struct acpi_buffer *buffer;	acpi_status status;	/* Ignore all descriptors except Vendor */	if (resource->type != ACPI_RESOURCE_TYPE_VENDOR) {		return (AE_OK);	}	vendor = &resource->data.vendor_typed;	/*	 * For a valid match, these conditions must hold:	 *	 * 1) Length of descriptor data must be at least as long as a UUID struct	 * 2) The UUID subtypes must match	 * 3) The UUID data must match	 */	if ((vendor->byte_length < (ACPI_UUID_LENGTH + 1)) ||	    (vendor->uuid_subtype != info->uuid->subtype) ||	    (ACPI_MEMCMP(vendor->uuid, info->uuid->data, ACPI_UUID_LENGTH))) {		return (AE_OK);	}	/* Validate/Allocate/Clear caller buffer */	buffer = info->buffer;	status = acpi_ut_initialize_buffer(buffer, resource->length);	if (ACPI_FAILURE(status)) {		return (status);	}	/* Found the correct resource, copy and return it */	ACPI_MEMCPY(buffer->pointer, resource, resource->length);	buffer->length = resource->length;	/* Found the desired descriptor, terminate resource walk */	info->status = AE_OK;	return (AE_CTRL_TERMINATE);}

⌨️ 快捷键说明

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