diff mbox series

[1/1] ACPI: property: Fix REF STR... reference parsing

Message ID 20250331121836.2495903-1-sakari.ailus@linux.intel.com
State New
Headers show
Series [1/1] ACPI: property: Fix REF STR... reference parsing | expand

Commit Message

Sakari Ailus March 31, 2025, 12:18 p.m. UTC
Restore parsing of ACPI data node references consisting of a device node
reference followed by one or more child data node names.

Fixes: 9880702d123f ("ACPI: property: Support using strings in reference properties")
Cc: stable@vger.kernel.org # for 6.8 and later
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
Hi Rafael,

It seems that support for REF STR... references got accidentally removed
when pure STR reference were added. The former are documented in
Documentation/firmware-guide/acpi/dsd/graph.rst .

- Sakari

 drivers/acpi/property.c | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c
index 436019d96027..4e3202a0b305 100644
--- a/drivers/acpi/property.c
+++ b/drivers/acpi/property.c
@@ -807,10 +807,27 @@  acpi_fwnode_get_named_child_node(const struct fwnode_handle *fwnode,
 static int acpi_get_ref_args(struct fwnode_reference_args *args,
 			     struct fwnode_handle *ref_fwnode,
 			     const union acpi_object **element,
-			     const union acpi_object *end, size_t num_args)
+			     const union acpi_object *end, size_t num_args,
+			     bool follow_strings)
 {
 	u32 nargs = 0, i;
 
+	/*
+	 * Parse REF STR... references by following named child nodes below the
+	 * device node pointed by REF.
+	 */
+	if (follow_strings) {
+		for (; (*element) < end && (*element)->type == ACPI_TYPE_STRING;
+		     (*element)++) {
+			const char *child_name = (*element)->string.pointer;
+
+			ref_fwnode = acpi_fwnode_get_named_child_node(ref_fwnode,
+								      child_name);
+			if (!ref_fwnode)
+				return -EINVAL;
+		}
+	}
+
 	/*
 	 * Assume the following integer elements are all args. Stop counting on
 	 * the first reference (possibly represented as a string) or end of the
@@ -999,7 +1016,7 @@  int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
 
 			ret = acpi_get_ref_args(idx == index ? args : NULL,
 						acpi_fwnode_handle(device),
-						&element, end, num_args);
+						&element, end, num_args, true);
 			if (ret < 0)
 				return ret;
 
@@ -1017,7 +1034,7 @@  int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
 
 			ret = acpi_get_ref_args(idx == index ? args : NULL,
 						ref_fwnode, &element, end,
-						num_args);
+						num_args, false);
 			if (ret < 0)
 				return ret;