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

📄 exprep.c

📁 LINUX 2.6.17.4的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		/*		 * buffer_field access can be on any byte boundary, so the		 * byte_alignment is always 1 byte -- regardless of any byte_alignment		 * implied by the field access type.		 */		byte_alignment = 1;	}	*return_byte_alignment = byte_alignment;	return_UINT32(bit_length);}/******************************************************************************* * * FUNCTION:    acpi_ex_prep_common_field_object * * PARAMETERS:  obj_desc            - The field object *              field_flags         - Access, lock_rule, and update_rule. *                                    The format of a field_flag is described *                                    in the ACPI specification *              field_attribute     - Special attributes (not used) *              field_bit_position  - Field start position *              field_bit_length    - Field length in number of bits * * RETURN:      Status * * DESCRIPTION: Initialize the areas of the field object that are common *              to the various types of fields.  Note: This is very "sensitive" *              code because we are solving the general case for field *              alignment. * ******************************************************************************/acpi_statusacpi_ex_prep_common_field_object(union acpi_operand_object *obj_desc,				 u8 field_flags,				 u8 field_attribute,				 u32 field_bit_position, u32 field_bit_length){	u32 access_bit_width;	u32 byte_alignment;	u32 nearest_byte_address;	ACPI_FUNCTION_TRACE("ex_prep_common_field_object");	/*	 * Note: the structure being initialized is the	 * ACPI_COMMON_FIELD_INFO;  No structure fields outside of the common	 * area are initialized by this procedure.	 */	obj_desc->common_field.field_flags = field_flags;	obj_desc->common_field.attribute = field_attribute;	obj_desc->common_field.bit_length = field_bit_length;	/*	 * Decode the access type so we can compute offsets.  The access type gives	 * two pieces of information - the width of each field access and the	 * necessary byte_alignment (address granularity) of the access.	 *	 * For any_acc, the access_bit_width is the largest width that is both	 * necessary and possible in an attempt to access the whole field in one	 * I/O operation.  However, for any_acc, the byte_alignment is always one	 * byte.	 *	 * For all Buffer Fields, the byte_alignment is always one byte.	 *	 * For all other access types (Byte, Word, Dword, Qword), the Bitwidth is	 * the same (equivalent) as the byte_alignment.	 */	access_bit_width = acpi_ex_decode_field_access(obj_desc, field_flags,						       &byte_alignment);	if (!access_bit_width) {		return_ACPI_STATUS(AE_AML_OPERAND_VALUE);	}	/* Setup width (access granularity) fields */	obj_desc->common_field.access_byte_width = (u8)	    ACPI_DIV_8(access_bit_width);	/* 1,  2,  4,  8 */	obj_desc->common_field.access_bit_width = (u8) access_bit_width;	/*	 * base_byte_offset is the address of the start of the field within the	 * region.  It is the byte address of the first *datum* (field-width data	 * unit) of the field. (i.e., the first datum that contains at least the	 * first *bit* of the field.)	 *	 * Note: byte_alignment is always either equal to the access_bit_width or 8	 * (Byte access), and it defines the addressing granularity of the parent	 * region or buffer.	 */	nearest_byte_address =	    ACPI_ROUND_BITS_DOWN_TO_BYTES(field_bit_position);	obj_desc->common_field.base_byte_offset = (u32)	    ACPI_ROUND_DOWN(nearest_byte_address, byte_alignment);	/*	 * start_field_bit_offset is the offset of the first bit of the field within	 * a field datum.	 */	obj_desc->common_field.start_field_bit_offset = (u8)	    (field_bit_position -	     ACPI_MUL_8(obj_desc->common_field.base_byte_offset));	/*	 * Does the entire field fit within a single field access element? (datum)	 * (i.e., without crossing a datum boundary)	 */	if ((obj_desc->common_field.start_field_bit_offset +	     field_bit_length) <= (u16) access_bit_width) {		obj_desc->common.flags |= AOPOBJ_SINGLE_DATUM;	}	return_ACPI_STATUS(AE_OK);}/******************************************************************************* * * FUNCTION:    acpi_ex_prep_field_value * * PARAMETERS:  Info    - Contains all field creation info * * RETURN:      Status * * DESCRIPTION: Construct an union acpi_operand_object of type def_field and *              connect it to the parent Node. * ******************************************************************************/acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info){	union acpi_operand_object *obj_desc;	u32 type;	acpi_status status;	ACPI_FUNCTION_TRACE("ex_prep_field_value");	/* Parameter validation */	if (info->field_type != ACPI_TYPE_LOCAL_INDEX_FIELD) {		if (!info->region_node) {			ACPI_ERROR((AE_INFO, "Null region_node"));			return_ACPI_STATUS(AE_AML_NO_OPERAND);		}		type = acpi_ns_get_type(info->region_node);		if (type != ACPI_TYPE_REGION) {			ACPI_ERROR((AE_INFO,				    "Needed Region, found type %X (%s)",				    type, acpi_ut_get_type_name(type)));			return_ACPI_STATUS(AE_AML_OPERAND_TYPE);		}	}	/* Allocate a new field object */	obj_desc = acpi_ut_create_internal_object(info->field_type);	if (!obj_desc) {		return_ACPI_STATUS(AE_NO_MEMORY);	}	/* Initialize areas of the object that are common to all fields */	obj_desc->common_field.node = info->field_node;	status = acpi_ex_prep_common_field_object(obj_desc, info->field_flags,						  info->attribute,						  info->field_bit_position,						  info->field_bit_length);	if (ACPI_FAILURE(status)) {		acpi_ut_delete_object_desc(obj_desc);		return_ACPI_STATUS(status);	}	/* Initialize areas of the object that are specific to the field type */	switch (info->field_type) {	case ACPI_TYPE_LOCAL_REGION_FIELD:		obj_desc->field.region_obj =		    acpi_ns_get_attached_object(info->region_node);		/* An additional reference for the container */		acpi_ut_add_reference(obj_desc->field.region_obj);		ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,				  "region_field: bit_off %X, Off %X, Gran %X, Region %p\n",				  obj_desc->field.start_field_bit_offset,				  obj_desc->field.base_byte_offset,				  obj_desc->field.access_byte_width,				  obj_desc->field.region_obj));		break;	case ACPI_TYPE_LOCAL_BANK_FIELD:		obj_desc->bank_field.value = info->bank_value;		obj_desc->bank_field.region_obj =		    acpi_ns_get_attached_object(info->region_node);		obj_desc->bank_field.bank_obj =		    acpi_ns_get_attached_object(info->register_node);		/* An additional reference for the attached objects */		acpi_ut_add_reference(obj_desc->bank_field.region_obj);		acpi_ut_add_reference(obj_desc->bank_field.bank_obj);		ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,				  "Bank Field: bit_off %X, Off %X, Gran %X, Region %p, bank_reg %p\n",				  obj_desc->bank_field.start_field_bit_offset,				  obj_desc->bank_field.base_byte_offset,				  obj_desc->field.access_byte_width,				  obj_desc->bank_field.region_obj,				  obj_desc->bank_field.bank_obj));		break;	case ACPI_TYPE_LOCAL_INDEX_FIELD:		/* Get the Index and Data registers */		obj_desc->index_field.index_obj =		    acpi_ns_get_attached_object(info->register_node);		obj_desc->index_field.data_obj =		    acpi_ns_get_attached_object(info->data_register_node);		if (!obj_desc->index_field.data_obj		    || !obj_desc->index_field.index_obj) {			ACPI_ERROR((AE_INFO,				    "Null Index Object during field prep"));			acpi_ut_delete_object_desc(obj_desc);			return_ACPI_STATUS(AE_AML_INTERNAL);		}		/* An additional reference for the attached objects */		acpi_ut_add_reference(obj_desc->index_field.data_obj);		acpi_ut_add_reference(obj_desc->index_field.index_obj);		/*		 * The value written to the Index register is the byte offset of the		 * target field		 * Note: may change code to: ACPI_DIV_8 (Info->field_bit_position)		 */		obj_desc->index_field.value = (u32)		    (info->field_bit_position /		     ACPI_MUL_8(obj_desc->field.access_byte_width));		ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,				  "index_field: bit_off %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n",				  obj_desc->index_field.start_field_bit_offset,				  obj_desc->index_field.base_byte_offset,				  obj_desc->index_field.value,				  obj_desc->field.access_byte_width,				  obj_desc->index_field.index_obj,				  obj_desc->index_field.data_obj));		break;	default:		/* No other types should get here */		break;	}	/*	 * Store the constructed descriptor (obj_desc) into the parent Node,	 * preserving the current type of that named_obj.	 */	status = acpi_ns_attach_object(info->field_node, obj_desc,				       acpi_ns_get_type(info->field_node));	ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,			  "Set named_obj %p [%4.4s], obj_desc %p\n",			  info->field_node,			  acpi_ut_get_node_name(info->field_node), obj_desc));	/* Remove local reference to the object */	acpi_ut_remove_reference(obj_desc);	return_ACPI_STATUS(status);}

⌨️ 快捷键说明

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