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

📄 rscalc.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
				buffer = byte_stream_buffer;				++buffer;				MOVE_UNALIGNED16_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 termininated 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 terminiated string.				 */				if (13 < temp16) {					temp8 = (u8) (temp16 - 14);				}				else {					temp8 = 0;				}				/*				 * Ensure a 32-bit boundry for the structure				 */				temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);				structure_size = sizeof (ADDRESS16_RESOURCE) +						  RESOURCE_LENGTH_NO_DATA +						  (temp8 * sizeof (u8));				break;			case EXTENDED_IRQ:				/*				 * Extended IRQ				 */				buffer = byte_stream_buffer;				++buffer;				MOVE_UNALIGNED16_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 termininated 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 terminiated string.				 */				if (9 + additional_bytes < temp16) {					temp8 = (u8) (temp16 - (9 + additional_bytes));				}				else {					temp8 = 0;				}				/*				 * Ensure a 32-bit boundry for the structure				 */				temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);				structure_size = sizeof (EXTENDED_IRQ_RESOURCE) +						  RESOURCE_LENGTH_NO_DATA +						  (additional_bytes * sizeof (u8)) +						  (temp8 * sizeof (u8));				break;/* TBD: [Future] 64-bit not currently supported *//*			case 0x8A:				break;*/			default:				/*				 * If we get here, everything is out of sync,				 *  so exit with an error				 */				return (AE_AML_ERROR);				break;			}		}		else {			/*			 * Small Resource Type			 *  Only bits 7:3 are valid			 */			resource_type >>= 3;			switch (resource_type)			{			case 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				 */				MOVE_UNALIGNED16_TO_16 (&temp16, buffer);				for (index = 0; index < 16; index++) {					if (temp16 & 0x1) {						++number_of_interrupts;					}					temp16 >>= 1;				}				structure_size = sizeof (IO_RESOURCE) +						  RESOURCE_LENGTH_NO_DATA +						  (number_of_interrupts * sizeof (u32));				break;			case 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 = sizeof (DMA_RESOURCE) +						  RESOURCE_LENGTH_NO_DATA +						  (number_of_channels * sizeof (u32));				break;			case START_DEPENDENT_TAG:				/*				 * 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 =						sizeof (START_DEPENDENT_FUNCTIONS_RESOURCE) +						RESOURCE_LENGTH_NO_DATA;				break;			case END_DEPENDENT_TAG:				/*				 * End Dependent Functions Resource				 */				bytes_consumed = 1;				structure_size = RESOURCE_LENGTH;				break;			case IO_PORT_DESCRIPTOR:				/*				 * IO Port Resource				 */				bytes_consumed = 8;				structure_size = sizeof (IO_RESOURCE) +						  RESOURCE_LENGTH_NO_DATA;				break;			case FIXED_LOCATION_IO_DESCRIPTOR:				/*				 * Fixed IO Port Resource				 */				bytes_consumed = 4;				structure_size = sizeof (FIXED_IO_RESOURCE) +						  RESOURCE_LENGTH_NO_DATA;				break;			case SMALL_VENDOR_DEFINED:				/*				 * Vendor Specific Resource				 */				buffer = byte_stream_buffer;				temp8 = *buffer;				temp8 = (u8) (temp8 & 0x7);				bytes_consumed = temp8 + 1;				/*				 * Ensure a 32-bit boundry for the structure				 */				temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);				structure_size = sizeof (VENDOR_RESOURCE) +						  RESOURCE_LENGTH_NO_DATA +						  (temp8 * sizeof (u8));				break;			case END_TAG:				/*				 * End Tag				 */				bytes_consumed = 2;				structure_size = RESOURCE_LENGTH;				break;			default:				/*				 * If we get here, everything is out of sync,				 *  so exit with an error				 */				return (AE_AML_ERROR);				break;			} /* switch */		}  /* if(Resource_type & 0x80) */		/*		 * Update the return value and counter		 */		buffer_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 (AE_OK);}/******************************************************************************* * * FUNCTION:    Acpi_rs_calculate_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  AE_OK * * DESCRIPTION: Given a package representing a PCI routing table, this *                calculates the size of the corresponding linked list of *                descriptions. * ******************************************************************************/ACPI_STATUSacpi_rs_calculate_pci_routing_table_length (	ACPI_OPERAND_OBJECT     *package_object,	u32                     *buffer_size_needed){	u32                     number_of_elements;	u32                     temp_size_needed = 0;	ACPI_OPERAND_OBJECT     **top_object_list;	u32                     index;	ACPI_OPERAND_OBJECT     *package_element;	ACPI_OPERAND_OBJECT     **sub_object_list;	u8                      name_found;	u32                     table_index;	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.	 *	 * NOTE: The Number_of_elements is incremented by one to add an end	 * table structure that is essentially a structure of zeros.	 */	/*	 * 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 == (*sub_object_list)->common.type) {				name_found = TRUE;			}			else {				/*				 * Look at the next element				 */				sub_object_list++;			}		}		temp_size_needed += (sizeof (PCI_ROUTING_TABLE) - 1);		/*		 * Was a String type found?		 */		if (TRUE == name_found) {			/*			 * The length String.Length field includes the			 * terminating NULL			 */			temp_size_needed += (*sub_object_list)->string.length;		}		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 = ROUND_UP_TO_64_bITS (temp_size_needed);		/*		 * Point to the next ACPI_OPERAND_OBJECT		 */		top_object_list++;	}	*buffer_size_needed = temp_size_needed + sizeof (PCI_ROUTING_TABLE);	return (AE_OK);}

⌨️ 快捷键说明

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