]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ACPI: property: Disregard references in data-only subnode lists
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 15 Sep 2025 18:23:28 +0000 (20:23 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 16 Sep 2025 17:51:37 +0000 (19:51 +0200)
Data-only subnode links following the ACPI data subnode GUID in a _DSD
package are expected to point to named objects returning _DSD-equivalent
packages.  If a reference to such an object is used in the target field
of any of those links, that object will be evaluated in place (as a
named object) and its return data will be embedded in the outer _DSD
package.

For this reason, it is not expected to see a subnode link with the
target field containing a local reference (that would mean pointing
to a device or another object that cannot be evaluated in place and
therefore cannot return a _DSD-equivalent package).

Accordingly, simplify the code parsing data-only subnode links to
simply print a message when it encounters a local reference in the
target field of one of those links.

Moreover, since acpi_nondev_subnode_data_ok() would only have one
caller after the change above, fold it into that caller.

Link: https://lore.kernel.org/linux-acpi/CAJZ5v0jVeSrDO6hrZhKgRZrH=FpGD4vNUjFD8hV9WwN9TLHjzQ@mail.gmail.com/
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Tested-by: Sakari Ailus <sakari.ailus@linux.intel.com>
drivers/acpi/property.c

index 83b03dce576c504760cfd82b452182672794a633..5b7c10a2824d680d2eed50bac5c0f58fdf5d460e 100644 (file)
@@ -124,32 +124,12 @@ static bool acpi_nondev_subnode_extract(union acpi_object *desc,
        return false;
 }
 
-static bool acpi_nondev_subnode_data_ok(acpi_handle handle,
-                                       const union acpi_object *link,
-                                       struct list_head *list,
-                                       struct fwnode_handle *parent)
-{
-       struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER };
-       acpi_status status;
-
-       status = acpi_evaluate_object_typed(handle, NULL, NULL, &buf,
-                                           ACPI_TYPE_PACKAGE);
-       if (ACPI_FAILURE(status))
-               return false;
-
-       if (acpi_nondev_subnode_extract(buf.pointer, handle, link, list,
-                                       parent))
-               return true;
-
-       ACPI_FREE(buf.pointer);
-       return false;
-}
-
 static bool acpi_nondev_subnode_ok(acpi_handle scope,
                                   const union acpi_object *link,
                                   struct list_head *list,
                                   struct fwnode_handle *parent)
 {
+       struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER };
        acpi_handle handle;
        acpi_status status;
 
@@ -161,7 +141,17 @@ static bool acpi_nondev_subnode_ok(acpi_handle scope,
        if (ACPI_FAILURE(status))
                return false;
 
-       return acpi_nondev_subnode_data_ok(handle, link, list, parent);
+       status = acpi_evaluate_object_typed(handle, NULL, NULL, &buf,
+                                           ACPI_TYPE_PACKAGE);
+       if (ACPI_FAILURE(status))
+               return false;
+
+       if (acpi_nondev_subnode_extract(buf.pointer, handle, link, list,
+                                       parent))
+               return true;
+
+       ACPI_FREE(buf.pointer);
+       return false;
 }
 
 static bool acpi_add_nondev_subnodes(acpi_handle scope,
@@ -174,7 +164,6 @@ static bool acpi_add_nondev_subnodes(acpi_handle scope,
 
        for (i = 0; i < links->package.count; i++) {
                union acpi_object *link, *desc;
-               acpi_handle handle;
                bool result;
 
                link = &links->package.elements[i];
@@ -186,22 +175,26 @@ static bool acpi_add_nondev_subnodes(acpi_handle scope,
                if (link->package.elements[0].type != ACPI_TYPE_STRING)
                        continue;
 
-               /* The second one may be a string, a reference or a package. */
+               /* The second one may be a string or a package. */
                switch (link->package.elements[1].type) {
                case ACPI_TYPE_STRING:
                        result = acpi_nondev_subnode_ok(scope, link, list,
                                                         parent);
                        break;
-               case ACPI_TYPE_LOCAL_REFERENCE:
-                       handle = link->package.elements[1].reference.handle;
-                       result = acpi_nondev_subnode_data_ok(handle, link, list,
-                                                            parent);
-                       break;
                case ACPI_TYPE_PACKAGE:
                        desc = &link->package.elements[1];
                        result = acpi_nondev_subnode_extract(desc, NULL, link,
                                                             list, parent);
                        break;
+               case ACPI_TYPE_LOCAL_REFERENCE:
+                       /*
+                        * It is not expected to see any local references in
+                        * the links package because referencing a named object
+                        * should cause it to be evaluated in place.
+                        */
+                       acpi_handle_info(scope, "subnode %s: Unexpected reference\n",
+                                        link->package.elements[0].string.pointer);
+                       fallthrough;
                default:
                        result = false;
                        break;