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

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

 



On Mon, Mar 31, 2025 at 2:18 PM Sakari Ailus
<sakari.ailus@xxxxxxxxxxxxxxx> wrote:
>
> 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 .

It would be good to provide an ASL example that is not parsed as
expected before the change and will be parsed correctly after it.

Admittedly, I can't quite recall the history leading to the above
commit, but this paragraphs is present in its changelog:

"Also remove the mechanism allowing data nodes to be referenced
 indirectly, with the help of an object reference pointing to the
 "ancestor" device and a path relative to it (this mechanism is not
 expected to be in use in any production platform firmware in the field)."

so the change in question appears to be intentional rather than accidental.

>  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