resource_length - minimum_aml_resource_length - 1;
}
- /*
- * Round the length up to a multiple of the native word in order to
- * guarantee that the entire resource descriptor is native word aligned
- */
- return ((u32) ACPI_ROUND_UP_TO_NATIVE_WORD(string_length));
+ /* Round up length to 32 bits for internal structure alignment */
+
+ return (ACPI_ROUND_UP_to_32_bITS(string_length));
}
/*******************************************************************************
acpi_status status;
u8 *end_aml;
u8 *buffer;
- u32 buffer_size;
+ u32 buffer_size = 0;
u16 temp16;
u16 resource_length;
u32 extra_struct_bytes;
ACPI_FUNCTION_TRACE("rs_get_list_length");
- *size_needed = 0;
end_aml = aml_buffer + aml_buffer_length;
/* Walk the list of AML resource descriptors */
break;
case ACPI_RESOURCE_NAME_VENDOR_SMALL:
- case ACPI_RESOURCE_NAME_VENDOR_LARGE:
/*
* Vendor Resource:
- * Get the number of vendor data bytes
+ * Ensure a 32-bit boundary for the structure
*/
- extra_struct_bytes = resource_length;
+ extra_struct_bytes =
+ ACPI_ROUND_UP_to_32_bITS(resource_length);
break;
case ACPI_RESOURCE_NAME_END_TAG:
/*
* End Tag: This is the normal exit, add size of end_tag
*/
- *size_needed += ACPI_RS_SIZE_MIN;
+ *size_needed = buffer_size + ACPI_RS_SIZE_MIN;
return_ACPI_STATUS(AE_OK);
+ case ACPI_RESOURCE_NAME_VENDOR_LARGE:
+ /*
+ * Vendor Resource:
+ * Add vendor data and ensure a 32-bit boundary for the structure
+ */
+ extra_struct_bytes =
+ ACPI_ROUND_UP_to_32_bITS(resource_length);
+ break;
+
case ACPI_RESOURCE_NAME_ADDRESS32:
case ACPI_RESOURCE_NAME_ADDRESS16:
- case ACPI_RESOURCE_NAME_ADDRESS64:
/*
- * Address Resource:
- * Add the size of the optional resource_source
+ * 32-Bit or 16-bit Address Resource:
+ * Add the size of any optional data (resource_source)
*/
extra_struct_bytes =
acpi_rs_stream_option_length(resource_length,
case ACPI_RESOURCE_NAME_EXTENDED_IRQ:
/*
- * Extended IRQ Resource:
- * Using the interrupt_table_length, add 4 bytes for each additional
- * interrupt. Note: at least one interrupt is required and is
- * included in the minimum descriptor size (reason for the -1)
+ * Extended IRQ:
+ * Point past the interrupt_vector_flags to get the
+ * interrupt_table_length.
*/
- extra_struct_bytes = (buffer[1] - 1) * sizeof(u32);
-
- /* Add the size of the optional resource_source */
+ buffer++;
- extra_struct_bytes +=
+ extra_struct_bytes =
+ /*
+ * Add 4 bytes for each additional interrupt. Note: at
+ * least one interrupt is required and is included in
+ * the minimum descriptor size
+ */
+ ((*buffer - 1) * sizeof(u32)) +
+ /* Add the size of any optional data (resource_source) */
acpi_rs_stream_option_length(resource_length -
extra_struct_bytes,
minimum_aml_resource_length);
break;
+ case ACPI_RESOURCE_NAME_ADDRESS64:
+ /*
+ * 64-Bit Address Resource:
+ * Add the size of any optional data (resource_source)
+ * Ensure a 64-bit boundary for the structure
+ */
+ extra_struct_bytes =
+ ACPI_ROUND_UP_to_64_bITS
+ (acpi_rs_stream_option_length
+ (resource_length, minimum_aml_resource_length));
+ break;
+
default:
break;
}
- /*
- * Update the required buffer size for the internal descriptor structs
- *
- * Important: Round the size up for the appropriate alignment. This
- * is a requirement on IA64.
- */
- buffer_size = acpi_gbl_resource_struct_sizes[resource_index] +
- extra_struct_bytes;
- buffer_size = ACPI_ROUND_UP_TO_NATIVE_WORD(buffer_size);
-
- *size_needed += buffer_size;
+ /* Update the required buffer size for the internal descriptor structs */
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "Type %.2X, Aml %.2X internal %.2X\n",
- acpi_ut_get_resource_type(aml_buffer),
- acpi_ut_get_descriptor_length(aml_buffer),
- buffer_size));
+ temp16 = (u16) (acpi_gbl_resource_struct_sizes[resource_index] +
+ extra_struct_bytes);
+ buffer_size += (u32) ACPI_ROUND_UP_TO_NATIVE_WORD(temp16);
/*
- * Point to the next resource within the AML stream using the length
- * contained in the resource descriptor header
+ * Point to the next resource within the stream
+ * using the size of the header plus the length contained in the header
*/
aml_buffer += acpi_ut_get_descriptor_length(aml_buffer);
}
}
/*
- * Add an extra element to the end of the list, essentially a
+ * Adding an extra element to the end of the list, essentially a
* NULL terminator
*/
*buffer_size_needed =