📄 rsaddr.c
字号:
index + 1; /* * In order for the struct_size to fall on a 32-bit boundary, * calculate the length of the string and expand the * struct_size to the next 32-bit boundary. */ temp8 = (u8) (index + 1); struct_size += ACPI_ROUND_UP_to_32_bITS(temp8); } else { output_struct->data.address16.resource_source.index = 0; output_struct->data.address16.resource_source.string_length = 0; output_struct->data.address16.resource_source.string_ptr = NULL; } /* Set the Length parameter */ output_struct->length = (u32) struct_size; /* Return the final size of the structure */ *structure_size = struct_size; return_ACPI_STATUS(AE_OK);}/******************************************************************************* * * FUNCTION: acpi_rs_address16_stream * * PARAMETERS: linked_list - Pointer to the resource linked list * output_buffer - Pointer to the user's return buffer * bytes_consumed - Pointer to where the number of bytes * used in the output_buffer is returned * * RETURN: Status * * DESCRIPTION: Take the linked list resource structure and fills in the * the appropriate bytes in a byte stream * ******************************************************************************/acpi_statusacpi_rs_address16_stream(struct acpi_resource *linked_list, u8 ** output_buffer, acpi_size * bytes_consumed){ u8 *buffer = *output_buffer; u8 *length_field; acpi_size actual_bytes; ACPI_FUNCTION_TRACE("rs_address16_stream"); /* Set the Descriptor Type field */ *buffer = ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE; buffer += 1; /* Save a pointer to the Length field - to be filled in later */ length_field = buffer; buffer += 2; /* Set the Resource Type (Memory, Io, bus_number) */ *buffer = (u8) (linked_list->data.address16.resource_type & 0x03); buffer += 1; /* Set the general flags */ *buffer = acpi_rs_encode_general_flags(&linked_list->data); buffer += 1; /* Set the type specific flags */ *buffer = acpi_rs_encode_specific_flags(&linked_list->data); buffer += 1; /* Set the address space granularity */ ACPI_MOVE_32_TO_16(buffer, &linked_list->data.address16.granularity); buffer += 2; /* Set the address range minimum */ ACPI_MOVE_32_TO_16(buffer, &linked_list->data.address16.min_address_range); buffer += 2; /* Set the address range maximum */ ACPI_MOVE_32_TO_16(buffer, &linked_list->data.address16.max_address_range); buffer += 2; /* Set the address translation offset */ ACPI_MOVE_32_TO_16(buffer, &linked_list->data.address16. address_translation_offset); buffer += 2; /* Set the address length */ ACPI_MOVE_32_TO_16(buffer, &linked_list->data.address16.address_length); buffer += 2; /* Resource Source Index and Resource Source are optional */ if (linked_list->data.address16.resource_source.string_length) { *buffer = (u8) linked_list->data.address16.resource_source.index; buffer += 1; /* Copy the resource_source string */ ACPI_STRCPY((char *)buffer, linked_list->data.address16.resource_source. string_ptr); /* * Buffer needs to be set to the length of the string + one for the * terminating null */ buffer += (acpi_size) (ACPI_STRLEN (linked_list->data.address16.resource_source. string_ptr) + 1); } /* Return the number of bytes consumed in this operation */ actual_bytes = ACPI_PTR_DIFF(buffer, *output_buffer); *bytes_consumed = actual_bytes; /* * Set the length field to the number of bytes consumed * minus the header size (3 bytes) */ actual_bytes -= 3; ACPI_MOVE_SIZE_TO_16(length_field, &actual_bytes); return_ACPI_STATUS(AE_OK);}/******************************************************************************* * * FUNCTION: acpi_rs_address32_resource * * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte * stream * bytes_consumed - Pointer to where the number of bytes * consumed the byte_stream_buffer is * returned * output_buffer - Pointer to the return data buffer * structure_size - Pointer to where the number of bytes * in the return data struct is returned * * RETURN: Status * * DESCRIPTION: Take the resource byte stream and fill out the appropriate * structure pointed to by the output_buffer. Return the * number of bytes consumed from the byte stream. * ******************************************************************************/acpi_statusacpi_rs_address32_resource(u8 * byte_stream_buffer, acpi_size * bytes_consumed, u8 ** output_buffer, acpi_size * structure_size){ u16 temp16; u8 temp8; u8 *temp_ptr; u32 index; u8 *buffer = byte_stream_buffer; struct acpi_resource *output_struct = (void *)*output_buffer; acpi_size struct_size = ACPI_SIZEOF_RESOURCE(struct acpi_resource_address32); ACPI_FUNCTION_TRACE("rs_address32_resource"); /* Get the Descriptor Length field */ buffer += 1; ACPI_MOVE_16_TO_16(&temp16, buffer); /* Validate minimum descriptor length */ if (temp16 < 23) { return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH); } *bytes_consumed = temp16 + 3; output_struct->id = ACPI_RSTYPE_ADDRESS32; /* Get the Resource Type (Byte3) */ buffer += 2; temp8 = *buffer; /* Values 0-2 and 0xC0-0xFF are valid */ if ((temp8 > 2) && (temp8 < 0xC0)) { return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE); } output_struct->data.address32.resource_type = temp8; /* Get the General Flags (Byte4) */ buffer += 1; acpi_rs_decode_general_flags(&output_struct->data, *buffer); /* Get the Type Specific Flags (Byte5) */ buffer += 1; acpi_rs_decode_specific_flags(&output_struct->data, *buffer); /* Get Granularity (Bytes 6-9) */ buffer += 1; ACPI_MOVE_32_TO_32(&output_struct->data.address32.granularity, buffer); /* Get min_address_range (Bytes 10-13) */ buffer += 4; ACPI_MOVE_32_TO_32(&output_struct->data.address32.min_address_range, buffer); /* Get max_address_range (Bytes 14-17) */ buffer += 4; ACPI_MOVE_32_TO_32(&output_struct->data.address32.max_address_range, buffer); /* Get address_translation_offset (Bytes 18-21) */ buffer += 4; ACPI_MOVE_32_TO_32(&output_struct->data.address32. address_translation_offset, buffer); /* Get address_length (Bytes 22-25) */ buffer += 4; ACPI_MOVE_32_TO_32(&output_struct->data.address32.address_length, buffer); /* Resource Source Index (if present) */ buffer += 4; /* * This will leave us pointing to the Resource Source Index * If it is present, then save it off and calculate the * pointer to where the null terminated string goes: * * Note: Some resource descriptors will have an additional null, so * we add 1 to the length. */ if (*bytes_consumed > (26 + 1)) { /* Dereference the Index */ output_struct->data.address32.resource_source.index = (u32) * buffer; /* Point to the String */ buffer += 1; /* Point the String pointer to the end of this structure */ output_struct->data.address32.resource_source.string_ptr = (char *)((u8 *) output_struct + struct_size); temp_ptr = (u8 *) output_struct->data.address32.resource_source.string_ptr; /* Copy the resource_source string into the buffer */ index = 0; while (*buffer) { *temp_ptr = *buffer; temp_ptr++; buffer++; index++; } /* Add the terminating null and set the string length */ *temp_ptr = 0; output_struct->data.address32.resource_source.string_length = index + 1; /* * In order for the struct_size to fall on a 32-bit boundary, * calculate the length of the string and expand the * struct_size to the next 32-bit boundary. */ temp8 = (u8) (index + 1); struct_size += ACPI_ROUND_UP_to_32_bITS(temp8); } else { output_struct->data.address32.resource_source.index = 0; output_struct->data.address32.resource_source.string_length = 0; output_struct->data.address32.resource_source.string_ptr = NULL; } /* Set the Length parameter */ output_struct->length = (u32) struct_size; /* Return the final size of the structure */ *structure_size = struct_size; return_ACPI_STATUS(AE_OK);}/******************************************************************************* * * FUNCTION: acpi_rs_address32_stream * * PARAMETERS: linked_list - Pointer to the resource linked list * output_buffer - Pointer to the user's return buffer * bytes_consumed - Pointer to where the number of bytes * used in the output_buffer is returned * * RETURN: Status * * DESCRIPTION: Take the linked list resource structure and fills in the * the appropriate bytes in a byte stream * ******************************************************************************/acpi_statusacpi_rs_address32_stream(struct acpi_resource *linked_list, u8 ** output_buffer, acpi_size * bytes_consumed){ u8 *buffer; u16 *length_field; ACPI_FUNCTION_TRACE("rs_address32_stream"); buffer = *output_buffer; /* Set the Descriptor Type field */ *buffer = ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE; buffer += 1; /* Save a pointer to the Length field - to be filled in later */ length_field = ACPI_CAST_PTR(u16, buffer); buffer += 2; /* Set the Resource Type (Memory, Io, bus_number) */ *buffer = (u8) (linked_list->data.address32.resource_type & 0x03); buffer += 1; /* Set the general flags */ *buffer = acpi_rs_encode_general_flags(&linked_list->data); buffer += 1; /* Set the type specific flags */ *buffer = acpi_rs_encode_specific_flags(&linked_list->data); buffer += 1; /* Set the address space granularity */ ACPI_MOVE_32_TO_32(buffer, &linked_list->data.address32.granularity); buffer += 4; /* Set the address range minimum */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -