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

📄 rscalc.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
				temp8 = (u8) (temp16 - 44);			} else {				temp8 = 0;			}			/* Ensure a 64-bit boundary for the structure */			temp8 = (u8) ACPI_ROUND_UP_to_64_bITS(temp8);			structure_size =			    ACPI_SIZEOF_RESOURCE(struct acpi_resource_address64)			    + (temp8 * sizeof(u8));			break;		case ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE:			/*			 * 32-Bit Address Resource			 */			buffer = byte_stream_buffer;			++buffer;			ACPI_MOVE_16_TO_16(&temp16, buffer);			bytes_consumed = temp16 + 3;			/*			 * Resource Source Index and Resource Source are optional elements.			 * Check the length of the Bytestream.  If it is greater than 23,			 * that means that an Index exists and is followed by a null			 * terminated string.  Therefore, set the temp variable to the			 * length minus the minimum byte stream length plus the byte for			 * the Index to determine the size of the NULL terminated string.			 */			if (23 < temp16) {				temp8 = (u8) (temp16 - 24);			} else {				temp8 = 0;			}			/* Ensure a 32-bit boundary for the structure */			temp8 = (u8) ACPI_ROUND_UP_to_32_bITS(temp8);			structure_size =			    ACPI_SIZEOF_RESOURCE(struct acpi_resource_address32)			    + (temp8 * sizeof(u8));			break;		case ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE:			/*			 * 16-Bit Address Resource			 */			buffer = byte_stream_buffer;			++buffer;			ACPI_MOVE_16_TO_16(&temp16, buffer);			bytes_consumed = temp16 + 3;			/*			 * Resource Source Index and Resource Source are optional elements.			 * Check the length of the Bytestream.  If it is greater than 13,			 * that means that an Index exists and is followed by a null			 * terminated string.  Therefore, set the temp variable to the			 * length minus the minimum byte stream length plus the byte for			 * the Index to determine the size of the NULL terminated string.			 */			if (13 < temp16) {				temp8 = (u8) (temp16 - 14);			} else {				temp8 = 0;			}			/* Ensure a 32-bit boundary for the structure */			temp8 = (u8) ACPI_ROUND_UP_to_32_bITS(temp8);			structure_size =			    ACPI_SIZEOF_RESOURCE(struct acpi_resource_address16)			    + (temp8 * sizeof(u8));			break;		case ACPI_RDESC_TYPE_EXTENDED_XRUPT:			/*			 * Extended IRQ			 */			buffer = byte_stream_buffer;			++buffer;			ACPI_MOVE_16_TO_16(&temp16, buffer);			bytes_consumed = temp16 + 3;			/*			 * Point past the length field and the Interrupt vector flags to			 * save off the Interrupt table length to the Temp8 variable.			 */			buffer += 3;			temp8 = *buffer;			/*			 * To compensate for multiple interrupt numbers, add 4 bytes for			 * each additional interrupts greater than 1			 */			additional_bytes = (u8) ((temp8 - 1) * 4);			/*			 * Resource Source Index and Resource Source are optional elements.			 * Check the length of the Bytestream.  If it is greater than 9,			 * that means that an Index exists and is followed by a null			 * terminated string.  Therefore, set the temp variable to the			 * length minus the minimum byte stream length plus the byte for			 * the Index to determine the size of the NULL terminated string.			 */			if (9 + additional_bytes < temp16) {				temp8 = (u8) (temp16 - (9 + additional_bytes));			} else {				temp8 = 0;			}			/* Ensure a 32-bit boundary for the structure */			temp8 = (u8) ACPI_ROUND_UP_to_32_bITS(temp8);			structure_size =			    ACPI_SIZEOF_RESOURCE(struct acpi_resource_ext_irq) +			    (additional_bytes * sizeof(u8)) +			    (temp8 * sizeof(u8));			break;		case ACPI_RDESC_TYPE_IRQ_FORMAT:			/*			 * IRQ Resource.			 * Determine if it there are two or three trailing bytes			 */			buffer = byte_stream_buffer;			temp8 = *buffer;			if (temp8 & 0x01) {				bytes_consumed = 4;			} else {				bytes_consumed = 3;			}			/* Point past the descriptor */			++buffer;			/* Look at the number of bits set */			ACPI_MOVE_16_TO_16(&temp16, buffer);			for (index = 0; index < 16; index++) {				if (temp16 & 0x1) {					++number_of_interrupts;				}				temp16 >>= 1;			}			structure_size =			    ACPI_SIZEOF_RESOURCE(struct acpi_resource_io) +			    (number_of_interrupts * sizeof(u32));			break;		case ACPI_RDESC_TYPE_DMA_FORMAT:			/*			 * DMA Resource			 */			buffer = byte_stream_buffer;			bytes_consumed = 3;			/* Point past the descriptor */			++buffer;			/* Look at the number of bits set */			temp8 = *buffer;			for (index = 0; index < 8; index++) {				if (temp8 & 0x1) {					++number_of_channels;				}				temp8 >>= 1;			}			structure_size =			    ACPI_SIZEOF_RESOURCE(struct acpi_resource_dma) +			    (number_of_channels * sizeof(u32));			break;		case ACPI_RDESC_TYPE_START_DEPENDENT:			/*			 * Start Dependent Functions Resource			 * Determine if it there are two or three trailing bytes			 */			buffer = byte_stream_buffer;			temp8 = *buffer;			if (temp8 & 0x01) {				bytes_consumed = 2;			} else {				bytes_consumed = 1;			}			structure_size =			    ACPI_SIZEOF_RESOURCE(struct						 acpi_resource_start_dpf);			break;		case ACPI_RDESC_TYPE_END_DEPENDENT:			/*			 * End Dependent Functions Resource			 */			bytes_consumed = 1;			structure_size = ACPI_RESOURCE_LENGTH;			break;		case ACPI_RDESC_TYPE_IO_PORT:			/*			 * IO Port Resource			 */			bytes_consumed = 8;			structure_size =			    ACPI_SIZEOF_RESOURCE(struct acpi_resource_io);			break;		case ACPI_RDESC_TYPE_FIXED_IO_PORT:			/*			 * Fixed IO Port Resource			 */			bytes_consumed = 4;			structure_size =			    ACPI_SIZEOF_RESOURCE(struct acpi_resource_fixed_io);			break;		case ACPI_RDESC_TYPE_SMALL_VENDOR:			/*			 * Vendor Specific Resource			 */			buffer = byte_stream_buffer;			temp8 = *buffer;			temp8 = (u8) (temp8 & 0x7);			bytes_consumed = temp8 + 1;			/* Ensure a 32-bit boundary for the structure */			temp8 = (u8) ACPI_ROUND_UP_to_32_bITS(temp8);			structure_size =			    ACPI_SIZEOF_RESOURCE(struct acpi_resource_vendor) +			    (temp8 * sizeof(u8));			break;		case ACPI_RDESC_TYPE_END_TAG:			/*			 * End Tag			 */			bytes_consumed = 2;			structure_size = ACPI_RESOURCE_LENGTH;			byte_stream_buffer_length = bytes_parsed;			break;		default:			/*			 * If we get here, everything is out of sync,			 * exit with an error			 */			return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);		}		/* Update the return value and counter */		buffer_size += (u32) ACPI_ALIGN_RESOURCE_SIZE(structure_size);		bytes_parsed += bytes_consumed;		/* Set the byte stream to point to the next resource */		byte_stream_buffer += bytes_consumed;	}	/* This is the data the caller needs */	*size_needed = buffer_size;	return_ACPI_STATUS(AE_OK);}/******************************************************************************* * * FUNCTION:    acpi_rs_get_pci_routing_table_length * * PARAMETERS:  package_object          - Pointer to the package object *              buffer_size_needed      - u32 pointer of the size buffer *                                        needed to properly return the *                                        parsed data * * RETURN:      Status * * DESCRIPTION: Given a package representing a PCI routing table, this *              calculates the size of the corresponding linked list of *              descriptions. * ******************************************************************************/acpi_statusacpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,				     acpi_size * buffer_size_needed){	u32 number_of_elements;	acpi_size temp_size_needed = 0;	union acpi_operand_object **top_object_list;	u32 index;	union acpi_operand_object *package_element;	union acpi_operand_object **sub_object_list;	u8 name_found;	u32 table_index;	ACPI_FUNCTION_TRACE("rs_get_pci_routing_table_length");	number_of_elements = package_object->package.count;	/*	 * Calculate the size of the return buffer.	 * The base size is the number of elements * the sizes of the	 * structures.  Additional space for the strings is added below.	 * The minus one is to subtract the size of the u8 Source[1]	 * member because it is added below.	 *	 * But each PRT_ENTRY structure has a pointer to a string and	 * the size of that string must be found.	 */	top_object_list = package_object->package.elements;	for (index = 0; index < number_of_elements; index++) {		/* Dereference the sub-package */		package_element = *top_object_list;		/*		 * The sub_object_list will now point to an array of the		 * four IRQ elements: Address, Pin, Source and source_index		 */		sub_object_list = package_element->package.elements;		/* Scan the irq_table_elements for the Source Name String */		name_found = FALSE;		for (table_index = 0; table_index < 4 && !name_found;		     table_index++) {			if ((ACPI_TYPE_STRING ==			     ACPI_GET_OBJECT_TYPE(*sub_object_list))			    ||			    ((ACPI_TYPE_LOCAL_REFERENCE ==			      ACPI_GET_OBJECT_TYPE(*sub_object_list))			     && ((*sub_object_list)->reference.opcode ==				 AML_INT_NAMEPATH_OP))) {				name_found = TRUE;			} else {				/* Look at the next element */				sub_object_list++;			}		}		temp_size_needed += (sizeof(struct acpi_pci_routing_table) - 4);		/* Was a String type found? */		if (name_found) {			if (ACPI_GET_OBJECT_TYPE(*sub_object_list) ==			    ACPI_TYPE_STRING) {				/*				 * The length String.Length field does not include the				 * terminating NULL, add 1				 */				temp_size_needed += ((acpi_size)						     (*sub_object_list)->string.						     length + 1);			} else {				temp_size_needed += acpi_ns_get_pathname_length((*sub_object_list)->reference.node);			}		} else {			/*			 * If no name was found, then this is a NULL, which is			 * translated as a u32 zero.			 */			temp_size_needed += sizeof(u32);		}		/* Round up the size since each element must be aligned */		temp_size_needed = ACPI_ROUND_UP_to_64_bITS(temp_size_needed);		/* Point to the next union acpi_operand_object */		top_object_list++;	}	/*	 * Adding an extra element to the end of the list, essentially a	 * NULL terminator	 */	*buffer_size_needed =	    temp_size_needed + sizeof(struct acpi_pci_routing_table);	return_ACPI_STATUS(AE_OK);}

⌨️ 快捷键说明

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