There is a bit too little information in the subject, it may as well be the same as the series title. On Mon, Feb 12, 2024 at 11:08 AM 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. 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..2b806112a05a 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 = false, ignore_port; It is not necessary to initialize static variables to false. > + > + 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; > -- > 2.39.2 >