ACPICA: Move Package-to-Buffer repair code into common ToBuffer function
authorBob Moore <robert.moore@intel.com>
Fri, 11 Dec 2009 07:18:52 +0000 (15:18 +0800)
committerLen Brown <len.brown@intel.com>
Tue, 15 Dec 2009 22:29:36 +0000 (17:29 -0500)
Move code specific to _FDE and _GTM into the generic repair code.

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/acpica/nspredef.c
drivers/acpi/acpica/nsrepair.c
drivers/acpi/acpica/nsrepair2.c

index 1782c3d85ba214f1ec6220ae41ec7379187afe89..c6297f57fea8db79434df3ddafdf7d985bcdfa57 100644 (file)
@@ -215,6 +215,8 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
        data->node_flags = node->flags;
        data->pathname = pathname;
 
+       /* TBD: For variable-length Packages, remove NULL elements here */
+
        /*
         * Check that the type of the return object is what is expected for
         * this predefined name
@@ -223,10 +225,11 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
                                           predefined->info.expected_btypes,
                                           ACPI_NOT_PACKAGE_ELEMENT);
        if (ACPI_SUCCESS(status)) {
-
-               /* For returned Package objects, check the type of all sub-objects */
-
-               if (return_object->common.type == ACPI_TYPE_PACKAGE) {
+               /*
+                * For returned Package objects, check the type of all sub-objects.
+                * Note: Package may have been created by call above.
+                */
+               if ((*return_object_ptr)->common.type == ACPI_TYPE_PACKAGE) {
                        status = acpi_ns_check_package(data, return_object_ptr);
                }
        }
index 10629fa55d83992b7ca82084ad213eeafce28758..062a016d45549402e6fd7e75720c28c3e8c9eac7 100644 (file)
@@ -350,7 +350,7 @@ acpi_ns_convert_to_string(union acpi_operand_object *original_object,
  *
  * RETURN:      Status. AE_OK if conversion was successful.
  *
- * DESCRIPTION: Attempt to convert a Integer/String object to a Buffer.
+ * DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer.
  *
  ******************************************************************************/
 
@@ -360,6 +360,10 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
 {
        union acpi_operand_object *new_object;
        acpi_status status;
+       union acpi_operand_object **elements;
+       u32 *dword_buffer;
+       u32 count;
+       u32 i;
 
        switch (original_object->common.type) {
        case ACPI_TYPE_INTEGER:
@@ -393,6 +397,40 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
                            original_object->string.length);
                break;
 
+       case ACPI_TYPE_PACKAGE:
+
+               /* All elements of the Package must be integers */
+
+               elements = original_object->package.elements;
+               count = original_object->package.count;
+
+               for (i = 0; i < count; i++) {
+                       if ((!*elements) ||
+                           ((*elements)->common.type != ACPI_TYPE_INTEGER)) {
+                               return (AE_AML_OPERAND_TYPE);
+                       }
+                       elements++;
+               }
+
+               /* Create the new buffer object to replace the Package */
+
+               new_object = acpi_ut_create_buffer_object(ACPI_MUL_4(count));
+               if (!new_object) {
+                       return (AE_NO_MEMORY);
+               }
+
+               /* Copy the package elements (integers) to the buffer as DWORDs */
+
+               elements = original_object->package.elements;
+               dword_buffer = ACPI_CAST_PTR(u32, new_object->buffer.pointer);
+
+               for (i = 0; i < count; i++) {
+                       *dword_buffer = (u32) (*elements)->integer.value;
+                       dword_buffer++;
+                       elements++;
+               }
+               break;
+
        default:
                return (AE_AML_OPERAND_TYPE);
        }
@@ -441,7 +479,8 @@ acpi_ns_convert_to_package(union acpi_operand_object *original_object,
                buffer = original_object->buffer.pointer;
 
                while (length--) {
-                       *elements = acpi_ut_create_integer_object(*buffer);
+                       *elements =
+                           acpi_ut_create_integer_object((u64) *buffer);
                        if (!*elements) {
                                acpi_ut_remove_reference(new_object);
                                return (AE_NO_MEMORY);
index 6c35b57a7fd0e77bdb3cf4363cac916a15d8af7e..846df7047a81d6cd74d42358d53e18ce0652c572 100644 (file)
@@ -250,11 +250,9 @@ acpi_ns_repair_FDE(struct acpi_predefined_data *data,
                   union acpi_operand_object **return_object_ptr)
 {
        union acpi_operand_object *return_object = *return_object_ptr;
-       union acpi_operand_object **elements;
        union acpi_operand_object *buffer_object;
        u8 *byte_buffer;
        u32 *dword_buffer;
-       u32 count;
        u32 i;
 
        switch (return_object->common.type) {
@@ -302,47 +300,6 @@ acpi_ns_repair_FDE(struct acpi_predefined_data *data,
                                      "Expanded Byte Buffer to expected DWord Buffer"));
                break;
 
-       case ACPI_TYPE_PACKAGE:
-
-               /* All elements of the Package must be integers */
-
-               elements = return_object->package.elements;
-               count =
-                   ACPI_MIN(ACPI_FDE_FIELD_COUNT,
-                            return_object->package.count);
-
-               for (i = 0; i < count; i++) {
-                       if ((!*elements) ||
-                           ((*elements)->common.type != ACPI_TYPE_INTEGER)) {
-                               return (AE_AML_OPERAND_TYPE);
-                       }
-                       elements++;
-               }
-
-               /* Create the new buffer object to replace the Package */
-
-               buffer_object =
-                   acpi_ut_create_buffer_object(ACPI_FDE_DWORD_BUFFER_SIZE);
-               if (!buffer_object) {
-                       return (AE_NO_MEMORY);
-               }
-
-               /* Copy the package elements (integers) to the buffer */
-
-               elements = return_object->package.elements;
-               dword_buffer =
-                   ACPI_CAST_PTR(u32, buffer_object->buffer.pointer);
-
-               for (i = 0; i < count; i++) {
-                       *dword_buffer = (u32) (*elements)->integer.value;
-                       dword_buffer++;
-                       elements++;
-               }
-
-               ACPI_INFO_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
-                                     "Converted Package to expected Buffer"));
-               break;
-
        default:
                return (AE_AML_OPERAND_TYPE);
        }