ACPICA: Fix for Device/Thermal objects with ObjectType and DerefOf
authorBob Moore <robert.moore@intel.com>
Mon, 5 Jun 2017 08:41:18 +0000 (16:41 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 27 Jun 2017 20:25:22 +0000 (22:25 +0200)
ACPICA commit 89565151aa4db7b546d4935b187bf2c4a86885ee

These types must be special cased because the namespace node
does not contain a subobject as do all other types.

Link: https://github.com/acpica/acpica/commit/89565151
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/exoparg1.c
drivers/acpi/acpica/exresolv.c

index e327349675cdb5451334a611e9ebf6bf7c105b6f..f787651348c1170b5d2d9e914db42531ae3bd204 100644 (file)
@@ -921,13 +921,26 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
                         * This is a deref_of (object_reference)
                         * Get the actual object from the Node (This is the dereference).
                         * This case may only happen when a local_x or arg_x is
-                        * dereferenced above.
+                        * dereferenced above, or for references to device and
+                        * thermal objects.
                         */
-                       return_desc = acpi_ns_get_attached_object((struct
-                                                                  acpi_namespace_node
-                                                                  *)
-                                                                 operand[0]);
-                       acpi_ut_add_reference(return_desc);
+                       switch (((struct acpi_namespace_node *)operand[0])->
+                               type) {
+                       case ACPI_TYPE_DEVICE:
+                       case ACPI_TYPE_THERMAL:
+
+                               /* These types have no node subobject, return the NS node */
+
+                               return_desc = operand[0];
+                               break;
+
+                       default:
+                               /* For most types, get the object attached to the node */
+
+                               return_desc = acpi_ns_get_attached_object((struct acpi_namespace_node *)operand[0]);
+                               acpi_ut_add_reference(return_desc);
+                               break;
+                       }
                } else {
                        /*
                         * This must be a reference object produced by either the
index aa8c6fd74cc393413c96f3e88b8e4cabf9f39618..5e1854ea85f6026f53697ef192806b62be4bcff4 100644 (file)
@@ -368,11 +368,24 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
                                                                *)obj_desc);
                }
 
-               if (!obj_desc) {
-                       ACPI_ERROR((AE_INFO,
-                                   "[%4.4s] Node is unresolved or uninitialized",
-                                   acpi_ut_get_node_name(node)));
-                       return_ACPI_STATUS(AE_AML_UNINITIALIZED_NODE);
+               switch (type) {
+               case ACPI_TYPE_DEVICE:
+               case ACPI_TYPE_THERMAL:
+
+                       /* These types have no attached subobject */
+                       break;
+
+               default:
+
+                       /* All other types require a subobject */
+
+                       if (!obj_desc) {
+                               ACPI_ERROR((AE_INFO,
+                                           "[%4.4s] Node is unresolved or uninitialized",
+                                           acpi_ut_get_node_name(node)));
+                               return_ACPI_STATUS(AE_AML_UNINITIALIZED_NODE);
+                       }
+                       break;
                }
                break;