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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxxx # for 6.8 and later
Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>
---
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 --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;
 
-- 
2.39.5





[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]
  Powered by Linux