ACPICA: Interpreter: Update handling for Alias operator
authorBob Moore <robert.moore@intel.com>
Thu, 3 Aug 2017 06:27:09 +0000 (14:27 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 3 Aug 2017 21:34:17 +0000 (23:34 +0200)
ACPICA commit 719d0bdd48e3e8e7a62a86c04922b9f41da6def0

Provide common creation code for the Alias operator. All objects
are now handled the same, with the only exception being the
Method() operator. It has a special internal Alias type.

Link: https://github.com/acpica/acpica/commit/719d0bdd
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/excreate.c

index 68675868e20fa6f83d2066e9e7caf787cfd1aed8..b8adb11f1b075ab9f3cf2d1784bea6d0ad4a560f 100644 (file)
@@ -88,72 +88,39 @@ acpi_status acpi_ex_create_alias(struct acpi_walk_state *walk_state)
        }
 
        /* Ensure that the target node is valid */
+
        if (!target_node) {
                return_ACPI_STATUS(AE_NULL_OBJECT);
        }
 
-       /*
-        * For objects that can never change (i.e., the NS node will
-        * permanently point to the same object), we can simply attach
-        * the object to the new NS node. For other objects (such as
-        * Integers, buffers, etc.), we have to point the Alias node
-        * to the original Node.
-        */
-       switch (target_node->type) {
-
-               /* For these types, the sub-object can change dynamically via a Store */
-
-       case ACPI_TYPE_INTEGER:
-       case ACPI_TYPE_STRING:
-       case ACPI_TYPE_BUFFER:
-       case ACPI_TYPE_PACKAGE:
-       case ACPI_TYPE_BUFFER_FIELD:
-               /*
-                * These types open a new scope, so we need the NS node in order to access
-                * any children.
-                */
-       case ACPI_TYPE_DEVICE:
-       case ACPI_TYPE_POWER:
-       case ACPI_TYPE_PROCESSOR:
-       case ACPI_TYPE_THERMAL:
-       case ACPI_TYPE_LOCAL_SCOPE:
-               /*
-                * The new alias has the type ALIAS and points to the original
-                * NS node, not the object itself.
-                */
-               alias_node->type = ACPI_TYPE_LOCAL_ALIAS;
-               alias_node->object =
-                   ACPI_CAST_PTR(union acpi_operand_object, target_node);
-               break;
+       /* Construct the alias object (a namespace node) */
 
+       switch (target_node->type) {
        case ACPI_TYPE_METHOD:
                /*
-                * Control method aliases need to be differentiated
+                * Control method aliases need to be differentiated with
+                * a special type
                 */
                alias_node->type = ACPI_TYPE_LOCAL_METHOD_ALIAS;
-               alias_node->object =
-                   ACPI_CAST_PTR(union acpi_operand_object, target_node);
                break;
 
        default:
-
-               /* Attach the original source object to the new Alias Node */
-
                /*
-                * The new alias assumes the type of the target, and it points
-                * to the same object. The reference count of the object has an
-                * additional reference to prevent deletion out from under either the
-                * target node or the alias Node
+                * All other object types.
+                *
+                * The new alias has the type ALIAS and points to the original
+                * NS node, not the object itself.
                 */
-               status = acpi_ns_attach_object(alias_node,
-                                              acpi_ns_get_attached_object
-                                              (target_node),
-                                              target_node->type);
+               alias_node->type = ACPI_TYPE_LOCAL_ALIAS;
+               alias_node->object =
+                   ACPI_CAST_PTR(union acpi_operand_object, target_node);
                break;
        }
 
        /* Since both operands are Nodes, we don't need to delete them */
 
+       alias_node->object =
+           ACPI_CAST_PTR(union acpi_operand_object, target_node);
        return_ACPI_STATUS(status);
 }