diff options
Diffstat (limited to 'drivers/acpi/resources/rsaddr.c')
-rw-r--r-- | drivers/acpi/resources/rsaddr.c | 1179 |
1 files changed, 536 insertions, 643 deletions
diff --git a/drivers/acpi/resources/rsaddr.c b/drivers/acpi/resources/rsaddr.c index 4788c079735d..23b54baa0cb2 100644 --- a/drivers/acpi/resources/rsaddr.c +++ b/drivers/acpi/resources/rsaddr.c @@ -41,13 +41,185 @@ * POSSIBILITY OF SUCH DAMAGES. */ - #include <acpi/acpi.h> #include <acpi/acresrc.h> #define _COMPONENT ACPI_RESOURCES - ACPI_MODULE_NAME ("rsaddr") +ACPI_MODULE_NAME("rsaddr") + +/* Local prototypes */ +static void +acpi_rs_decode_general_flags(union acpi_resource_data *resource, u8 flags); + +static u8 acpi_rs_encode_general_flags(union acpi_resource_data *resource); + +static void +acpi_rs_decode_specific_flags(union acpi_resource_data *resource, u8 flags); + +static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource); + +/******************************************************************************* + * + * FUNCTION: acpi_rs_decode_general_flags + * + * PARAMETERS: Resource - Address resource data struct + * Flags - Actual flag byte + * + * RETURN: Decoded flag bits in resource struct + * + * DESCRIPTION: Decode a general flag byte to an address resource struct + * + ******************************************************************************/ + +static void +acpi_rs_decode_general_flags(union acpi_resource_data *resource, u8 flags) +{ + ACPI_FUNCTION_ENTRY(); + + /* Producer / Consumer - flag bit[0] */ + + resource->address.producer_consumer = (u32) (flags & 0x01); + + /* Decode (_DEC) - flag bit[1] */ + + resource->address.decode = (u32) ((flags >> 1) & 0x01); + + /* Min Address Fixed (_MIF) - flag bit[2] */ + + resource->address.min_address_fixed = (u32) ((flags >> 2) & 0x01); + + /* Max Address Fixed (_MAF) - flag bit[3] */ + + resource->address.max_address_fixed = (u32) ((flags >> 3) & 0x01); +} + +/******************************************************************************* + * + * FUNCTION: acpi_rs_encode_general_flags + * + * PARAMETERS: Resource - Address resource data struct + * + * RETURN: Encoded general flag byte + * + * DESCRIPTION: Construct a general flag byte from an address resource struct + * + ******************************************************************************/ + +static u8 acpi_rs_encode_general_flags(union acpi_resource_data *resource) +{ + u8 flags; + + ACPI_FUNCTION_ENTRY(); + + /* Producer / Consumer - flag bit[0] */ + + flags = (u8) (resource->address.producer_consumer & 0x01); + + /* Decode (_DEC) - flag bit[1] */ + + flags |= (u8) ((resource->address.decode & 0x01) << 1); + + /* Min Address Fixed (_MIF) - flag bit[2] */ + + flags |= (u8) ((resource->address.min_address_fixed & 0x01) << 2); + + /* Max Address Fixed (_MAF) - flag bit[3] */ + + flags |= (u8) ((resource->address.max_address_fixed & 0x01) << 3); + + return (flags); +} + +/******************************************************************************* + * + * FUNCTION: acpi_rs_decode_specific_flags + * + * PARAMETERS: Resource - Address resource data struct + * Flags - Actual flag byte + * + * RETURN: Decoded flag bits in attribute struct + * + * DESCRIPTION: Decode a type-specific flag byte to an attribute struct. + * Type-specific flags are only defined for the Memory and IO + * resource types. + * + ******************************************************************************/ + +static void +acpi_rs_decode_specific_flags(union acpi_resource_data *resource, u8 flags) +{ + ACPI_FUNCTION_ENTRY(); + + if (resource->address.resource_type == ACPI_MEMORY_RANGE) { + /* Write Status (_RW) - flag bit[0] */ + + resource->address.attribute.memory.read_write_attribute = + (u16) (flags & 0x01); + + /* Memory Attributes (_MEM) - flag bits[2:1] */ + + resource->address.attribute.memory.cache_attribute = + (u16) ((flags >> 1) & 0x03); + } else if (resource->address.resource_type == ACPI_IO_RANGE) { + /* Ranges (_RNG) - flag bits[1:0] */ + resource->address.attribute.io.range_attribute = + (u16) (flags & 0x03); + + /* Translations (_TTP and _TRS) - flag bits[5:4] */ + + resource->address.attribute.io.translation_attribute = + (u16) ((flags >> 4) & 0x03); + } +} + +/******************************************************************************* + * + * FUNCTION: acpi_rs_encode_specific_flags + * + * PARAMETERS: Resource - Address resource data struct + * + * RETURN: Encoded type-specific flag byte + * + * DESCRIPTION: Construct a type-specific flag byte from an attribute struct. + * Type-specific flags are only defined for the Memory and IO + * resource types. + * + ******************************************************************************/ + +static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource) +{ + u8 flags = 0; + + ACPI_FUNCTION_ENTRY(); + + if (resource->address.resource_type == ACPI_MEMORY_RANGE) { + /* Write Status (_RW) - flag bit[0] */ + + flags = (u8) + (resource->address.attribute.memory. + read_write_attribute & 0x01); + + /* Memory Attributes (_MEM) - flag bits[2:1] */ + + flags |= (u8) + ((resource->address.attribute.memory. + cache_attribute & 0x03) << 1); + } else if (resource->address.resource_type == ACPI_IO_RANGE) { + /* Ranges (_RNG) - flag bits[1:0] */ + + flags = (u8) + (resource->address.attribute.io.range_attribute & 0x03); + + /* Translations (_TTP and _TRS) - flag bits[5:4] */ + + flags |= (u8) + ((resource->address.attribute.io. + translation_attribute & 0x03) << 4); + } + + return (flags); +} /******************************************************************************* * @@ -71,133 +243,89 @@ ******************************************************************************/ acpi_status -acpi_rs_address16_resource ( - u8 *byte_stream_buffer, - acpi_size *bytes_consumed, - u8 **output_buffer, - acpi_size *structure_size) +acpi_rs_address16_resource(u8 * byte_stream_buffer, + acpi_size * bytes_consumed, + u8 ** output_buffer, acpi_size * structure_size) { - u8 *buffer = byte_stream_buffer; - struct acpi_resource *output_struct = (void *) *output_buffer; - u8 *temp_ptr; - acpi_size struct_size = ACPI_SIZEOF_RESOURCE (struct acpi_resource_address16); - u32 index; - u16 temp16; - u8 temp8; - + u32 index; + u16 temp16; + u8 temp8; + u8 *temp_ptr; + u8 *buffer = byte_stream_buffer; + struct acpi_resource *output_struct = (void *)*output_buffer; + acpi_size struct_size = + ACPI_SIZEOF_RESOURCE(struct acpi_resource_address16); - ACPI_FUNCTION_TRACE ("rs_address16_resource"); + ACPI_FUNCTION_TRACE("rs_address16_resource"); + /* Get the Descriptor Length field */ - /* - * Point past the Descriptor to get the number of bytes consumed - */ buffer += 1; - ACPI_MOVE_16_TO_16 (&temp16, buffer); + ACPI_MOVE_16_TO_16(&temp16, buffer); /* Validate minimum descriptor length */ if (temp16 < 13) { - return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH); + return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH); } *bytes_consumed = temp16 + 3; output_struct->id = ACPI_RSTYPE_ADDRESS16; - /* - * Get the Resource Type (Byte3) - */ + /* 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); + return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE); } output_struct->data.address16.resource_type = temp8; - /* - * Get the General Flags (Byte4) - */ - buffer += 1; - temp8 = *buffer; + /* Get the General Flags (Byte4) */ - /* Producer / Consumer */ - - output_struct->data.address16.producer_consumer = temp8 & 0x01; + buffer += 1; + acpi_rs_decode_general_flags(&output_struct->data, *buffer); - /* Decode */ + /* Get the Type Specific Flags (Byte5) */ - output_struct->data.address16.decode = (temp8 >> 1) & 0x01; + buffer += 1; + acpi_rs_decode_specific_flags(&output_struct->data, *buffer); - /* Min Address Fixed */ + /* Get Granularity (Bytes 6-7) */ - output_struct->data.address16.min_address_fixed = (temp8 >> 2) & 0x01; + buffer += 1; + ACPI_MOVE_16_TO_32(&output_struct->data.address16.granularity, buffer); - /* Max Address Fixed */ + /* Get min_address_range (Bytes 8-9) */ - output_struct->data.address16.max_address_fixed = (temp8 >> 3) & 0x01; + buffer += 2; + ACPI_MOVE_16_TO_32(&output_struct->data.address16.min_address_range, + buffer); - /* - * Get the Type Specific Flags (Byte5) - */ - buffer += 1; - temp8 = *buffer; + /* Get max_address_range (Bytes 10-11) */ - if (ACPI_MEMORY_RANGE == output_struct->data.address16.resource_type) { - output_struct->data.address16.attribute.memory.read_write_attribute = - (u16) (temp8 & 0x01); - output_struct->data.address16.attribute.memory.cache_attribute = - (u16) ((temp8 >> 1) & 0x03); - } - else { - if (ACPI_IO_RANGE == output_struct->data.address16.resource_type) { - output_struct->data.address16.attribute.io.range_attribute = - (u16) (temp8 & 0x03); - output_struct->data.address16.attribute.io.translation_attribute = - (u16) ((temp8 >> 4) & 0x03); - } - else { - /* BUS_NUMBER_RANGE == Address16.Data->resource_type */ - /* Nothing needs to be filled in */ - } - } + buffer += 2; + ACPI_MOVE_16_TO_32(&output_struct->data.address16.max_address_range, + buffer); - /* - * Get Granularity (Bytes 6-7) - */ - buffer += 1; - ACPI_MOVE_16_TO_32 (&output_struct->data.address16.granularity, buffer); + /* Get address_translation_offset (Bytes 12-13) */ - /* - * Get min_address_range (Bytes 8-9) - */ buffer += 2; - ACPI_MOVE_16_TO_32 (&output_struct->data.address16.min_address_range, buffer); + ACPI_MOVE_16_TO_32(&output_struct->data.address16. + address_translation_offset, buffer); - /* - * Get max_address_range (Bytes 10-11) - */ - buffer += 2; - ACPI_MOVE_16_TO_32 (&output_struct->data.address16.max_address_range, buffer); + /* Get address_length (Bytes 14-15) */ - /* - * Get address_translation_offset (Bytes 12-13) - */ buffer += 2; - ACPI_MOVE_16_TO_32 (&output_struct->data.address16.address_translation_offset, buffer); + ACPI_MOVE_16_TO_32(&output_struct->data.address16.address_length, + buffer); - /* - * Get address_length (Bytes 14-15) - */ - buffer += 2; - ACPI_MOVE_16_TO_32 (&output_struct->data.address16.address_length, buffer); + /* Resource Source Index (if present) */ - /* - * Resource Source Index (if present) - */ buffer += 2; /* @@ -213,8 +341,8 @@ acpi_rs_address16_resource ( if (*bytes_consumed > (16 + 1)) { /* Dereference the Index */ - temp8 = *buffer; - output_struct->data.address16.resource_source.index = (u32) temp8; + output_struct->data.address16.resource_source.index = + (u32) * buffer; /* Point to the String */ @@ -223,28 +351,27 @@ acpi_rs_address16_resource ( /* Point the String pointer to the end of this structure */ output_struct->data.address16.resource_source.string_ptr = - (char *)((u8 * )output_struct + struct_size); + (char *)((u8 *) output_struct + struct_size); - temp_ptr = (u8 *) output_struct->data.address16.resource_source.string_ptr; + temp_ptr = (u8 *) + output_struct->data.address16.resource_source.string_ptr; - /* Copy the string into the buffer */ + /* Copy the resource_source string into the buffer */ index = 0; - - while (0x00 != *buffer) { + while (*buffer) { *temp_ptr = *buffer; - temp_ptr += 1; - buffer += 1; - index += 1; + temp_ptr++; + buffer++; + index++; } - /* - * Add the terminating null - */ - *temp_ptr = 0x00; + /* Add the terminating null and set the string length */ - output_struct->data.address16.resource_source.string_length = index + 1; + *temp_ptr = 0; + output_struct->data.address16.resource_source.string_length = + index + 1; /* * In order for the struct_size to fall on a 32-bit boundary, @@ -252,27 +379,23 @@ acpi_rs_address16_resource ( * 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 = 0x00; + 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 - */ + /* Set the Length parameter */ + output_struct->length = (u32) struct_size; - /* - * Return the final size of the structure - */ + /* Return the final size of the structure */ + *structure_size = struct_size; - return_ACPI_STATUS (AE_OK); + return_ACPI_STATUS(AE_OK); } - /******************************************************************************* * * FUNCTION: acpi_rs_address16_stream @@ -290,136 +413,95 @@ acpi_rs_address16_resource ( ******************************************************************************/ acpi_status -acpi_rs_address16_stream ( - struct acpi_resource *linked_list, - u8 **output_buffer, - acpi_size *bytes_consumed) +acpi_rs_address16_stream(struct acpi_resource *linked_list, + u8 ** output_buffer, acpi_size * bytes_consumed) { - u8 *buffer = *output_buffer; - u8 *length_field; - u8 temp8; - char *temp_pointer = NULL; - acpi_size actual_bytes; - + u8 *buffer = *output_buffer; + u8 *length_field; + acpi_size actual_bytes; - ACPI_FUNCTION_TRACE ("rs_address16_stream"); + ACPI_FUNCTION_TRACE("rs_address16_stream"); + /* Set the Descriptor Type field */ - /* - * The descriptor field is static - */ - *buffer = 0x88; + *buffer = ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE; buffer += 1; - /* - * Save a pointer to the Length field - to be filled in later - */ + /* 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) - */ - temp8 = (u8) (linked_list->data.address16.resource_type & 0x03); - *buffer = temp8; - buffer += 1; - - /* - * Set the general flags - */ - temp8 = (u8) (linked_list->data.address16.producer_consumer & 0x01); + /* Set the Resource Type (Memory, Io, bus_number) */ - temp8 |= (linked_list->data.address16.decode & 0x01) << 1; - temp8 |= (linked_list->data.address16.min_address_fixed & 0x01) << 2; - temp8 |= (linked_list->data.address16.max_address_fixed & 0x01) << 3; - - *buffer = temp8; + *buffer = (u8) (linked_list->data.address16.resource_type & 0x03); buffer += 1; - /* - * Set the type specific flags - */ - temp8 = 0; + /* Set the general flags */ - if (ACPI_MEMORY_RANGE == linked_list->data.address16.resource_type) { - temp8 = (u8) - (linked_list->data.address16.attribute.memory.read_write_attribute & - 0x01); + *buffer = acpi_rs_encode_general_flags(&linked_list->data); + buffer += 1; - temp8 |= - (linked_list->data.address16.attribute.memory.cache_attribute & - 0x03) << 1; - } - else if (ACPI_IO_RANGE == linked_list->data.address16.resource_type) { - temp8 = (u8) - (linked_list->data.address16.attribute.io.range_attribute & - 0x03); - temp8 |= - (linked_list->data.address16.attribute.io.translation_attribute & - 0x03) << 4; - } + /* Set the type specific flags */ - *buffer = temp8; + *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); + /* 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); + /* 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); + /* 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); + /* 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); + /* 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 (0 != linked_list->data.address16.resource_source.string_length) { - temp8 = (u8) linked_list->data.address16.resource_source.index; + /* Resource Source Index and Resource Source are optional */ - *buffer = temp8; + if (linked_list->data.address16.resource_source.string_length) { + *buffer = + (u8) linked_list->data.address16.resource_source.index; buffer += 1; - temp_pointer = (char *) buffer; + /* Copy the resource_source string */ - /* - * Copy the string - */ - ACPI_STRCPY (temp_pointer, - linked_list->data.address16.resource_source.string_ptr); + ACPI_STRCPY((char *)buffer, + linked_list->data.address16.resource_source. + string_ptr); /* - * Buffer needs to be set to the length of the sting + one for the + * 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); + 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); + /* Return the number of bytes consumed in this operation */ + + actual_bytes = ACPI_PTR_DIFF(buffer, *output_buffer); *bytes_consumed = actual_bytes; /* @@ -427,11 +509,10 @@ acpi_rs_address16_stream ( * minus the header size (3 bytes) */ actual_bytes -= 3; - ACPI_MOVE_SIZE_TO_16 (length_field, &actual_bytes); - return_ACPI_STATUS (AE_OK); + ACPI_MOVE_SIZE_TO_16(length_field, &actual_bytes); + return_ACPI_STATUS(AE_OK); } - /******************************************************************************* * * FUNCTION: acpi_rs_address32_resource @@ -454,141 +535,89 @@ acpi_rs_address16_stream ( ******************************************************************************/ acpi_status -acpi_rs_address32_resource ( - u8 *byte_stream_buffer, - acpi_size *bytes_consumed, - u8 **output_buffer, - acpi_size *structure_size) +acpi_rs_address32_resource(u8 * byte_stream_buffer, + acpi_size * bytes_consumed, + u8 ** output_buffer, acpi_size * structure_size) { - u8 *buffer; - struct acpi_resource *output_struct= (void *) *output_buffer; - u16 temp16; - u8 temp8; - u8 *temp_ptr; - acpi_size struct_size; - u32 index; + 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"); - ACPI_FUNCTION_TRACE ("rs_address32_resource"); + /* Get the Descriptor Length field */ - - buffer = byte_stream_buffer; - struct_size = ACPI_SIZEOF_RESOURCE (struct acpi_resource_address32); - - /* - * Point past the Descriptor to get the number of bytes consumed - */ buffer += 1; - ACPI_MOVE_16_TO_16 (&temp16, buffer); + ACPI_MOVE_16_TO_16(&temp16, buffer); /* Validate minimum descriptor length */ if (temp16 < 23) { - return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH); + return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH); } *bytes_consumed = temp16 + 3; output_struct->id = ACPI_RSTYPE_ADDRESS32; - /* - * Get the Resource Type (Byte3) - */ + /* 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); + return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE); } output_struct->data.address32.resource_type = temp8; - /* - * Get the General Flags (Byte4) - */ - buffer += 1; - temp8 = *buffer; + /* Get the General Flags (Byte4) */ - /* - * Producer / Consumer - */ - output_struct->data.address32.producer_consumer = temp8 & 0x01; + buffer += 1; + acpi_rs_decode_general_flags(&output_struct->data, *buffer); - /* - * Decode - */ - output_struct->data.address32.decode = (temp8 >> 1) & 0x01; + /* Get the Type Specific Flags (Byte5) */ - /* - * Min Address Fixed - */ - output_struct->data.address32.min_address_fixed = (temp8 >> 2) & 0x01; + buffer += 1; + acpi_rs_decode_specific_flags(&output_struct->data, *buffer); - /* - * Max Address Fixed - */ - output_struct->data.address32.max_address_fixed = (temp8 >> 3) & 0x01; + /* Get Granularity (Bytes 6-9) */ - /* - * Get the Type Specific Flags (Byte5) - */ buffer += 1; - temp8 = *buffer; + ACPI_MOVE_32_TO_32(&output_struct->data.address32.granularity, buffer); - if (ACPI_MEMORY_RANGE == output_struct->data.address32.resource_type) { - output_struct->data.address32.attribute.memory.read_write_attribute = - (u16) (temp8 & 0x01); + /* Get min_address_range (Bytes 10-13) */ - output_struct->data.address32.attribute.memory.cache_attribute = - (u16) ((temp8 >> 1) & 0x03); - } - else { - if (ACPI_IO_RANGE == output_struct->data.address32.resource_type) { - output_struct->data.address32.attribute.io.range_attribute = - (u16) (temp8 & 0x03); - output_struct->data.address32.attribute.io.translation_attribute = - (u16) ((temp8 >> 4) & 0x03); - } - else { - /* BUS_NUMBER_RANGE == output_struct->Data.Address32.resource_type */ - /* Nothing needs to be filled in */ - } - } + buffer += 4; + ACPI_MOVE_32_TO_32(&output_struct->data.address32.min_address_range, + buffer); - /* - * Get Granularity (Bytes 6-9) - */ - buffer += 1; - ACPI_MOVE_32_TO_32 (&output_struct->data.address32.granularity, buffer); + /* Get max_address_range (Bytes 14-17) */ - /* - * Get min_address_range (Bytes 10-13) - */ buffer += 4; - ACPI_MOVE_32_TO_32 (&output_struct->data.address32.min_address_range, buffer); + ACPI_MOVE_32_TO_32(&output_struct->data.address32.max_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) */ - /* - * Get address_translation_offset (Bytes 18-21) - */ buffer += 4; - ACPI_MOVE_32_TO_32 (&output_struct->data.address32.address_translation_offset, buffer); + ACPI_MOVE_32_TO_32(&output_struct->data.address32. + address_translation_offset, buffer); + + /* Get address_length (Bytes 22-25) */ - /* - * Get address_length (Bytes 22-25) - */ buffer += 4; - ACPI_MOVE_32_TO_32 (&output_struct->data.address32.address_length, buffer); + ACPI_MOVE_32_TO_32(&output_struct->data.address32.address_length, + buffer); + + /* Resource Source Index (if present) */ - /* - * Resource Source Index (if present) - */ buffer += 4; /* @@ -602,9 +631,8 @@ acpi_rs_address32_resource ( if (*bytes_consumed > (26 + 1)) { /* Dereference the Index */ - temp8 = *buffer; output_struct->data.address32.resource_source.index = - (u32) temp8; + (u32) * buffer; /* Point to the String */ @@ -613,26 +641,27 @@ acpi_rs_address32_resource ( /* Point the String pointer to the end of this structure */ output_struct->data.address32.resource_source.string_ptr = - (char *)((u8 *)output_struct + struct_size); + (char *)((u8 *) output_struct + struct_size); - temp_ptr = (u8 *) output_struct->data.address32.resource_source.string_ptr; + temp_ptr = (u8 *) + output_struct->data.address32.resource_source.string_ptr; - /* Copy the string into the buffer */ + /* Copy the resource_source string into the buffer */ index = 0; - while (0x00 != *buffer) { + while (*buffer) { *temp_ptr = *buffer; - temp_ptr += 1; - buffer += 1; - index += 1; + temp_ptr++; + buffer++; + index++; } - /* - * Add the terminating null - */ - *temp_ptr = 0x00; - output_struct->data.address32.resource_source.string_length = index + 1; + /* 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, @@ -640,27 +669,23 @@ acpi_rs_address32_resource ( * 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 = 0x00; + 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 - */ + /* Set the Length parameter */ + output_struct->length = (u32) struct_size; - /* - * Return the final size of the structure - */ + /* Return the final size of the structure */ + *structure_size = struct_size; - return_ACPI_STATUS (AE_OK); + return_ACPI_STATUS(AE_OK); } - /******************************************************************************* * * FUNCTION: acpi_rs_address32_stream @@ -678,147 +703,105 @@ acpi_rs_address32_resource ( ******************************************************************************/ acpi_status -acpi_rs_address32_stream ( - struct acpi_resource *linked_list, - u8 **output_buffer, - acpi_size *bytes_consumed) +acpi_rs_address32_stream(struct acpi_resource *linked_list, + u8 ** output_buffer, acpi_size * bytes_consumed) { - u8 *buffer; - u16 *length_field; - u8 temp8; - char *temp_pointer; - - - ACPI_FUNCTION_TRACE ("rs_address32_stream"); + u8 *buffer; + u16 *length_field; + ACPI_FUNCTION_TRACE("rs_address32_stream"); buffer = *output_buffer; - /* - * The descriptor field is static - */ - *buffer = 0x87; + /* Set the Descriptor Type field */ + + *buffer = ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE; buffer += 1; - /* - * Set a pointer to the Length field - to be filled in later - */ - length_field = ACPI_CAST_PTR (u16, buffer); + /* 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) - */ - temp8 = (u8) (linked_list->data.address32.resource_type & 0x03); + /* Set the Resource Type (Memory, Io, bus_number) */ - *buffer = temp8; + *buffer = (u8) (linked_list->data.address32.resource_type & 0x03); buffer += 1; - /* - * Set the general flags - */ - temp8 = (u8) (linked_list->data.address32.producer_consumer & 0x01); - temp8 |= (linked_list->data.address32.decode & 0x01) << 1; - temp8 |= (linked_list->data.address32.min_address_fixed & 0x01) << 2; - temp8 |= (linked_list->data.address32.max_address_fixed & 0x01) << 3; + /* Set the general flags */ - *buffer = temp8; + *buffer = acpi_rs_encode_general_flags(&linked_list->data); buffer += 1; - /* - * Set the type specific flags - */ - temp8 = 0; - - if (ACPI_MEMORY_RANGE == linked_list->data.address32.resource_type) { - temp8 = (u8) - (linked_list->data.address32.attribute.memory.read_write_attribute & - 0x01); - - temp8 |= - (linked_list->data.address32.attribute.memory.cache_attribute & - 0x03) << 1; - } - else if (ACPI_IO_RANGE == linked_list->data.address32.resource_type) { - temp8 = (u8) - (linked_list->data.address32.attribute.io.range_attribute & - 0x03); - temp8 |= - (linked_list->data.address32.attribute.io.translation_attribute & - 0x03) << 4; - } + /* Set the type specific flags */ - *buffer = temp8; + *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); + /* Set the address space granularity */ + + ACPI_MOVE_32_TO_32(buffer, &linked_list->data.address32.granularity); buffer += 4; - /* - * Set the address range minimum - */ - ACPI_MOVE_32_TO_32 (buffer, &linked_list->data.address32.min_address_range); + /* Set the address range minimum */ + + ACPI_MOVE_32_TO_32(buffer, + &linked_list->data.address32.min_address_range); buffer += 4; - /* - * Set the address range maximum - */ - ACPI_MOVE_32_TO_32 (buffer, &linked_list->data.address32.max_address_range); + /* Set the address range maximum */ + + ACPI_MOVE_32_TO_32(buffer, + &linked_list->data.address32.max_address_range); buffer += 4; - /* - * Set the address translation offset - */ - ACPI_MOVE_32_TO_32 (buffer, &linked_list->data.address32.address_translation_offset); + /* Set the address translation offset */ + + ACPI_MOVE_32_TO_32(buffer, + &linked_list->data.address32. + address_translation_offset); buffer += 4; - /* - * Set the address length - */ - ACPI_MOVE_32_TO_32 (buffer, &linked_list->data.address32.address_length); + /* Set the address length */ + + ACPI_MOVE_32_TO_32(buffer, &linked_list->data.address32.address_length); buffer += 4; - /* - * Resource Source Index and Resource Source are optional - */ - if (0 != linked_list->data.address32.resource_source.string_length) { - temp8 = (u8) linked_list->data.address32.resource_source.index; + /* Resource Source Index and Resource Source are optional */ - *buffer = temp8; + if (linked_list->data.address32.resource_source.string_length) { + *buffer = + (u8) linked_list->data.address32.resource_source.index; buffer += 1; - temp_pointer = (char *) buffer; + /* Copy the resource_source string */ - /* - * Copy the string - */ - ACPI_STRCPY (temp_pointer, - linked_list->data.address32.resource_source.string_ptr); + ACPI_STRCPY((char *)buffer, + linked_list->data.address32.resource_source. + string_ptr); /* - * Buffer needs to be set to the length of the sting + one for the + * Buffer needs to be set to the length of the string + one for the * terminating null */ - buffer += (acpi_size)(ACPI_STRLEN (linked_list->data.address32.resource_source.string_ptr) + 1); + buffer += + (acpi_size) (ACPI_STRLEN + (linked_list->data.address32.resource_source. + string_ptr) + 1); } - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = ACPI_PTR_DIFF (buffer, *output_buffer); + /* Return the number of bytes consumed in this operation */ + + *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer); /* * Set the length field to the number of bytes consumed - * minus the header size (3 bytes) + * minus the header size (3 bytes) */ *length_field = (u16) (*bytes_consumed - 3); - return_ACPI_STATUS (AE_OK); + return_ACPI_STATUS(AE_OK); } - /******************************************************************************* * * FUNCTION: acpi_rs_address64_resource @@ -841,109 +824,62 @@ acpi_rs_address32_stream ( ******************************************************************************/ acpi_status -acpi_rs_address64_resource ( - u8 *byte_stream_buffer, - acpi_size *bytes_consumed, - u8 **output_buffer, - acpi_size *structure_size) +acpi_rs_address64_resource(u8 * byte_stream_buffer, + acpi_size * bytes_consumed, + u8 ** output_buffer, acpi_size * structure_size) { - u8 *buffer; - struct acpi_resource *output_struct = (void *) *output_buffer; - u16 temp16; - u8 temp8; - u8 resource_type; - u8 *temp_ptr; - acpi_size struct_size; - u32 index; + u16 temp16; + u8 temp8; + u8 resource_type; + 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_address64); + ACPI_FUNCTION_TRACE("rs_address64_resource"); - ACPI_FUNCTION_TRACE ("rs_address64_resource"); + /* Get the Descriptor Type */ - - buffer = byte_stream_buffer; - struct_size = ACPI_SIZEOF_RESOURCE (struct acpi_resource_address64); resource_type = *buffer; - /* - * Point past the Descriptor to get the number of bytes consumed - */ + /* Get the Descriptor Length field */ + buffer += 1; - ACPI_MOVE_16_TO_16 (&temp16, buffer); + ACPI_MOVE_16_TO_16(&temp16, buffer); /* Validate minimum descriptor length */ if (temp16 < 43) { - return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH); + return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH); } *bytes_consumed = temp16 + 3; output_struct->id = ACPI_RSTYPE_ADDRESS64; - /* - * Get the Resource Type (Byte3) - */ + /* 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); + return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE); } output_struct->data.address64.resource_type = temp8; - /* - * Get the General Flags (Byte4) - */ - buffer += 1; - temp8 = *buffer; - - /* - * Producer / Consumer - */ - output_struct->data.address64.producer_consumer = temp8 & 0x01; - - /* - * Decode - */ - output_struct->data.address64.decode = (temp8 >> 1) & 0x01; - - /* - * Min Address Fixed - */ - output_struct->data.address64.min_address_fixed = (temp8 >> 2) & 0x01; - - /* - * Max Address Fixed - */ - output_struct->data.address64.max_address_fixed = (temp8 >> 3) & 0x01; + /* Get the General Flags (Byte4) */ - /* - * Get the Type Specific Flags (Byte5) - */ buffer += 1; - temp8 = *buffer; + acpi_rs_decode_general_flags(&output_struct->data, *buffer); - if (ACPI_MEMORY_RANGE == output_struct->data.address64.resource_type) { - output_struct->data.address64.attribute.memory.read_write_attribute = - (u16) (temp8 & 0x01); + /* Get the Type Specific Flags (Byte5) */ - output_struct->data.address64.attribute.memory.cache_attribute = - (u16) ((temp8 >> 1) & 0x03); - } - else { - if (ACPI_IO_RANGE == output_struct->data.address64.resource_type) { - output_struct->data.address64.attribute.io.range_attribute = - (u16) (temp8 & 0x03); - output_struct->data.address64.attribute.io.translation_attribute = - (u16) ((temp8 >> 4) & 0x03); - } - else { - /* BUS_NUMBER_RANGE == output_struct->Data.Address64.resource_type */ - /* Nothing needs to be filled in */ - } - } + buffer += 1; + acpi_rs_decode_specific_flags(&output_struct->data, *buffer); if (resource_type == ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE) { /* Move past revision_id and Reserved byte */ @@ -951,37 +887,36 @@ acpi_rs_address64_resource ( buffer += 2; } - /* - * Get Granularity (Bytes 6-13) or (Bytes 8-15) - */ + /* Get Granularity (Bytes 6-13) or (Bytes 8-15) */ + buffer += 1; - ACPI_MOVE_64_TO_64 (&output_struct->data.address64.granularity, buffer); + ACPI_MOVE_64_TO_64(&output_struct->data.address64.granularity, buffer); + + /* Get min_address_range (Bytes 14-21) or (Bytes 16-23) */ - /* - * Get min_address_range (Bytes 14-21) or (Bytes 16-23) - */ buffer += 8; - ACPI_MOVE_64_TO_64 (&output_struct->data.address64.min_address_range, buffer); + ACPI_MOVE_64_TO_64(&output_struct->data.address64.min_address_range, + buffer); + + /* Get max_address_range (Bytes 22-29) or (Bytes 24-31) */ - /* - * Get max_address_range (Bytes 22-29) or (Bytes 24-31) - */ buffer += 8; - ACPI_MOVE_64_TO_64 (&output_struct->data.address64.max_address_range, buffer); + ACPI_MOVE_64_TO_64(&output_struct->data.address64.max_address_range, + buffer); + + /* Get address_translation_offset (Bytes 30-37) or (Bytes 32-39) */ - /* - * Get address_translation_offset (Bytes 30-37) or (Bytes 32-39) - */ buffer += 8; - ACPI_MOVE_64_TO_64 (&output_struct->data.address64.address_translation_offset, buffer); + ACPI_MOVE_64_TO_64(&output_struct->data.address64. + address_translation_offset, buffer); + + /* Get address_length (Bytes 38-45) or (Bytes 40-47) */ - /* - * Get address_length (Bytes 38-45) or (Bytes 40-47) - */ buffer += 8; - ACPI_MOVE_64_TO_64 (&output_struct->data.address64.address_length, buffer); + ACPI_MOVE_64_TO_64(&output_struct->data.address64.address_length, + buffer); - output_struct->data.address64.resource_source.index = 0x00; + output_struct->data.address64.resource_source.index = 0; output_struct->data.address64.resource_source.string_length = 0; output_struct->data.address64.resource_source.string_ptr = NULL; @@ -989,14 +924,13 @@ acpi_rs_address64_resource ( /* Get type_specific_attribute (Bytes 48-55) */ buffer += 8; - ACPI_MOVE_64_TO_64 (&output_struct->data.address64.type_specific_attributes, buffer); - } - else { + ACPI_MOVE_64_TO_64(&output_struct->data.address64. + type_specific_attributes, buffer); + } else { output_struct->data.address64.type_specific_attributes = 0; - /* - * Resource Source Index (if present) - */ + /* Resource Source Index (if present) */ + buffer += 8; /* @@ -1012,9 +946,8 @@ acpi_rs_address64_resource ( if (*bytes_consumed > (46 + 1)) { /* Dereference the Index */ - temp8 = *buffer; output_struct->data.address64.resource_source.index = - (u32) temp8; + (u32) * buffer; /* Point to the String */ @@ -1022,27 +955,31 @@ acpi_rs_address64_resource ( /* Point the String pointer to the end of this structure */ - output_struct->data.address64.resource_source.string_ptr = - (char *)((u8 *)output_struct + struct_size); + output_struct->data.address64.resource_source. + string_ptr = + (char *)((u8 *) output_struct + struct_size); - temp_ptr = (u8 *) output_struct->data.address64.resource_source.string_ptr; + temp_ptr = (u8 *) + output_struct->data.address64.resource_source. + string_ptr; - /* Copy the string into the buffer */ + /* Copy the resource_source string into the buffer */ index = 0; - while (0x00 != *buffer) { + while (*buffer) { *temp_ptr = *buffer; - temp_ptr += 1; - buffer += 1; - index += 1; + temp_ptr++; + buffer++; + index++; } /* - * Add the terminating null + * Add the terminating null and set the string length */ - *temp_ptr = 0x00; - output_struct->data.address64.resource_source.string_length = index + 1; + *temp_ptr = 0; + output_struct->data.address64.resource_source. + string_length = index + 1; /* * In order for the struct_size to fall on a 32-bit boundary, @@ -1050,23 +987,20 @@ acpi_rs_address64_resource ( * struct_size to the next 32-bit boundary. */ temp8 = (u8) (index + 1); - struct_size += ACPI_ROUND_UP_to_32_bITS (temp8); + struct_size += ACPI_ROUND_UP_to_32_bITS(temp8); } } - /* - * Set the Length parameter - */ + /* Set the Length parameter */ + output_struct->length = (u32) struct_size; - /* - * Return the final size of the structure - */ + /* Return the final size of the structure */ + *structure_size = struct_size; - return_ACPI_STATUS (AE_OK); + return_ACPI_STATUS(AE_OK); } - /******************************************************************************* * * FUNCTION: acpi_rs_address64_stream @@ -1084,142 +1018,101 @@ acpi_rs_address64_resource ( ******************************************************************************/ acpi_status -acpi_rs_address64_stream ( - struct acpi_resource *linked_list, - u8 **output_buffer, - acpi_size *bytes_consumed) +acpi_rs_address64_stream(struct acpi_resource *linked_list, + u8 ** output_buffer, acpi_size * bytes_consumed) { - u8 *buffer; - u16 *length_field; - u8 temp8; - char *temp_pointer; - - - ACPI_FUNCTION_TRACE ("rs_address64_stream"); + u8 *buffer; + u16 *length_field; + ACPI_FUNCTION_TRACE("rs_address64_stream"); buffer = *output_buffer; - /* - * The descriptor field is static - */ - *buffer = 0x8A; + /* Set the Descriptor Type field */ + + *buffer = ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE; buffer += 1; - /* - * Set a pointer to the Length field - to be filled in later - */ - length_field = ACPI_CAST_PTR (u16, buffer); + /* 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) - */ - temp8 = (u8) (linked_list->data.address64.resource_type & 0x03); + /* Set the Resource Type (Memory, Io, bus_number) */ - *buffer = temp8; + *buffer = (u8) (linked_list->data.address64.resource_type & 0x03); buffer += 1; - /* - * Set the general flags - */ - temp8 = (u8) (linked_list->data.address64.producer_consumer & 0x01); - temp8 |= (linked_list->data.address64.decode & 0x01) << 1; - temp8 |= (linked_list->data.address64.min_address_fixed & 0x01) << 2; - temp8 |= (linked_list->data.address64.max_address_fixed & 0x01) << 3; + /* Set the general flags */ - *buffer = temp8; + *buffer = acpi_rs_encode_general_flags(&linked_list->data); buffer += 1; - /* - * Set the type specific flags - */ - temp8 = 0; - - if (ACPI_MEMORY_RANGE == linked_list->data.address64.resource_type) { - temp8 = (u8) - (linked_list->data.address64.attribute.memory.read_write_attribute & - 0x01); - - temp8 |= - (linked_list->data.address64.attribute.memory.cache_attribute & - 0x03) << 1; - } - else if (ACPI_IO_RANGE == linked_list->data.address64.resource_type) { - temp8 = (u8) - (linked_list->data.address64.attribute.io.range_attribute & - 0x03); - temp8 |= - (linked_list->data.address64.attribute.io.range_attribute & - 0x03) << 4; - } + /* Set the type specific flags */ - *buffer = temp8; + *buffer = acpi_rs_encode_specific_flags(&linked_list->data); buffer += 1; - /* - * Set the address space granularity - */ - ACPI_MOVE_64_TO_64 (buffer, &linked_list->data.address64.granularity); + /* Set the address space granularity */ + + ACPI_MOVE_64_TO_64(buffer, &linked_list->data.address64.granularity); buffer += 8; - /* - * Set the address range minimum - */ - ACPI_MOVE_64_TO_64 (buffer, &linked_list->data.address64.min_address_range); + /* Set the address range minimum */ + + ACPI_MOVE_64_TO_64(buffer, + &linked_list->data.address64.min_address_range); buffer += 8; - /* - * Set the address range maximum - */ - ACPI_MOVE_64_TO_64 (buffer, &linked_list->data.address64.max_address_range); + /* Set the address range maximum */ + + ACPI_MOVE_64_TO_64(buffer, + &linked_list->data.address64.max_address_range); buffer += 8; - /* - * Set the address translation offset - */ - ACPI_MOVE_64_TO_64 (buffer, &linked_list->data.address64.address_translation_offset); + /* Set the address translation offset */ + + ACPI_MOVE_64_TO_64(buffer, + &linked_list->data.address64. + address_translation_offset); buffer += 8; - /* - * Set the address length - */ - ACPI_MOVE_64_TO_64 (buffer, &linked_list->data.address64.address_length); + /* Set the address length */ + + ACPI_MOVE_64_TO_64(buffer, &linked_list->data.address64.address_length); buffer += 8; - /* - * Resource Source Index and Resource Source are optional - */ - if (0 != linked_list->data.address64.resource_source.string_length) { - temp8 = (u8) linked_list->data.address64.resource_source.index; + /* Resource Source Index and Resource Source are optional */ - *buffer = temp8; + if (linked_list->data.address64.resource_source.string_length) { + *buffer = + (u8) linked_list->data.address64.resource_source.index; buffer += 1; - temp_pointer = (char *) buffer; + /* Copy the resource_source string */ - /* - * Copy the string - */ - ACPI_STRCPY (temp_pointer, linked_list->data.address64.resource_source.string_ptr); + ACPI_STRCPY((char *)buffer, + linked_list->data.address64.resource_source. + string_ptr); /* - * Buffer needs to be set to the length of the sting + one for the + * Buffer needs to be set to the length of the string + one for the * terminating null */ - buffer += (acpi_size)(ACPI_STRLEN (linked_list->data.address64.resource_source.string_ptr) + 1); + buffer += + (acpi_size) (ACPI_STRLEN + (linked_list->data.address64.resource_source. + string_ptr) + 1); } - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = ACPI_PTR_DIFF (buffer, *output_buffer); + /* Return the number of bytes consumed in this operation */ + + *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer); /* * Set the length field to the number of bytes consumed * minus the header size (3 bytes) */ *length_field = (u16) (*bytes_consumed - 3); - return_ACPI_STATUS (AE_OK); + return_ACPI_STATUS(AE_OK); } - |