- 2.6.17 port work build breaks, but the patch set is relativly stable
[linux-flexiantxendom0-3.2.10.git] / drivers / acpi / resources / rscalc.c
index 1512389..4038dbf 100644 (file)
@@ -160,11 +160,9 @@ acpi_rs_stream_option_length(u32 resource_length,
                    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));
 }
 
 /*******************************************************************************
@@ -334,7 +332,7 @@ acpi_rs_get_list_length(u8 * aml_buffer,
        acpi_status status;
        u8 *end_aml;
        u8 *buffer;
-       u32 buffer_size;
+       u32 buffer_size = 0;
        u16 temp16;
        u16 resource_length;
        u32 extra_struct_bytes;
@@ -343,7 +341,6 @@ acpi_rs_get_list_length(u8 * aml_buffer,
 
        ACPI_FUNCTION_TRACE("rs_get_list_length");
 
-       *size_needed = 0;
        end_aml = aml_buffer + aml_buffer_length;
 
        /* Walk the list of AML resource descriptors */
@@ -389,27 +386,35 @@ acpi_rs_get_list_length(u8 * aml_buffer,
                        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,
@@ -418,46 +423,50 @@ acpi_rs_get_list_length(u8 * aml_buffer,
 
                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);
        }
@@ -580,7 +589,7 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
        }
 
        /*
-        * 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 =