Re: [PATCH v2 2/2] ACPI: property: Ignore bad graph port nodes on Dell XPS 9315

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

 



On Tue, Feb 13, 2024 at 2:46 PM Sakari Ailus
<sakari.ailus@xxxxxxxxxxxxxxx> wrote:
>
> Some systems were shipped with both Windows and Linux camera descriptions.
> In general, if Linux description exist, they will be used and Windows
> description ignored.
>
> In this case the Linux descriptions were buggy so use Windows definition
> instead. This patch ignores the bad graph port nodes on Dell XPS 9315 and
> there are likely other such systems, too. The corresponding information
> has been added to ipu-bridge to cover the missing bits.
>
> Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>
> ---
>  drivers/acpi/internal.h       |  1 +
>  drivers/acpi/mipi-disco-img.c | 71 +++++++++++++++++++++++++++++++++++
>  drivers/acpi/property.c       |  3 ++
>  3 files changed, 75 insertions(+)
>
> diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
> index 6588525c45ef..e0145df519bd 100644
> --- a/drivers/acpi/internal.h
> +++ b/drivers/acpi/internal.h
> @@ -301,5 +301,6 @@ void acpi_mipi_check_crs_csi2(acpi_handle handle);
>  void acpi_mipi_scan_crs_csi2(void);
>  void acpi_mipi_init_crs_csi2_swnodes(void);
>  void acpi_mipi_crs_csi2_cleanup(void);
> +bool acpi_graph_ignore_port(acpi_handle handle);
>
>  #endif /* _ACPI_INTERNAL_H_ */
> diff --git a/drivers/acpi/mipi-disco-img.c b/drivers/acpi/mipi-disco-img.c
> index 7286cf4579bc..da71eb4bf6a6 100644
> --- a/drivers/acpi/mipi-disco-img.c
> +++ b/drivers/acpi/mipi-disco-img.c
> @@ -19,6 +19,7 @@
>   */
>
>  #include <linux/acpi.h>
> +#include <linux/dmi.h>
>  #include <linux/limits.h>
>  #include <linux/list.h>
>  #include <linux/module.h>
> @@ -723,3 +724,73 @@ void acpi_mipi_crs_csi2_cleanup(void)
>         list_for_each_entry_safe(csi2, csi2_tmp, &acpi_mipi_crs_csi2_list, entry)
>                 acpi_mipi_del_crs_csi2(csi2);
>  }
> +
> +static const struct dmi_system_id dmi_ignore_port_nodes[] = {
> +       {
> +               .matches = {
> +                       DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
> +                       DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "XPS 9315"),
> +               },
> +       },
> +       { 0 }
> +};
> +
> +static const char *strnext(const char *s1, const char *s2)
> +{
> +       s1 = strstr(s1, s2);
> +
> +       if (!s1)
> +               return NULL;
> +
> +       return s1 + strlen(s2);
> +}
> +
> +/**
> + * acpi_graph_ignore_port - Tell whether a port node should be ignored
> + * @handle: The ACPI handle of the node (which may be a port node)
> + *
> + * Returns true if a port node should be ignored and the data to that should
> + * come from other sources instead (Windows ACPI definitions and
> + * ipu-bridge). This is currently used to ignore bad port nodes related to IPU6
> + * ("IPU?") and camera sensor devices ("LNK?") in certain Dell systems with
> + * Intel VSC.
> + */
> +bool acpi_graph_ignore_port(acpi_handle handle)
> +{
> +       const char *path = NULL, *orig_path;
> +       static bool dmi_tested, ignore_port;
> +
> +       if (!dmi_tested) {
> +               ignore_port = dmi_first_match(dmi_ignore_port_nodes);
> +               dmi_tested = true;
> +       }
> +
> +       if (!ignore_port)
> +               return false;
> +
> +       /* Check if the device is either "IPU" or "LNK" (sensor). */
> +       orig_path = acpi_handle_path(handle);
> +       if (!orig_path)
> +               return false;
> +       path = strnext(orig_path, "IPU");
> +       if (!path)
> +               path = strnext(orig_path, "LNK");
> +       if (!path)
> +               goto out_free;
> +
> +       if (!(path[0] >= '0' && path[0] <= '9' && path[1] == '.'))
> +               goto out_free;
> +
> +       /* Check if the node has a "PRT" prefix. */
> +       path = strnext(path, "PRT");
> +       if (path && path[0] >= '0' && path[0] <= '9' && !path[1]) {
> +               acpi_handle_debug(handle, "ignoring data node\n");
> +
> +               kfree(orig_path);
> +               return true;
> +       }
> +
> +out_free:
> +       kfree(orig_path);
> +       return false;
> +}
> diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c
> index a6ead5204046..2b73580c9f36 100644
> --- a/drivers/acpi/property.c
> +++ b/drivers/acpi/property.c
> @@ -80,6 +80,9 @@ static bool acpi_nondev_subnode_extract(union acpi_object *desc,
>         struct acpi_data_node *dn;
>         bool result;
>
> +       if (acpi_graph_ignore_port(handle))
> +               return false;
> +
>         dn = kzalloc(sizeof(*dn), GFP_KERNEL);
>         if (!dn)
>                 return false;
> --

Applied as 6.9 material along with the [1/2], thanks!





[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