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

📄 rscalc.c

📁 h内核
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -