Skip to contentSkip to conversation

ACPI: do not match devices that have scan handler

PATCH New Aaron Lu 2 participants 3 messages Jun 4, 2013 – Jun 6, 2013 1 message not in the archive ACPI

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

Aaron Lu

author
#1 lore raw

PATCH 1/1 ACPI: do not match devices that have scan handler

With the introduction of acpi scan handler, an acpi device that has acpi scan handler does not need an acpi driver any more. For those devices, there is no meaning to match them against a newly registered acpi driver in acpi_bus_match.

This can also solve a regression caused by a broken BIOS table, where it has defined a _ROM method under PCI root. The video module would think devices that have _ROM defined under it is a display controller device since only display devices would have _ROM method defined according to the ACPI SPEC. As a resule, this method under PCI root would make video module tries to drive PCI root acpi device and the pre-assigned driver_data by PCI root's scan handler will be emptied, making subsequent call to acpi_get_pci_dev fail.

---
 drivers/acpi/scan.c | 6 ++++++
 1 file changed, 6 insertions(+)
drivers/acpi/scan.c +6 -0
index 5e7e991..67ce501 100644
@@ -553,6 +553,12 @@ static int acpi_bus_match(struct device *dev, struct device_driver *drv)
 	struct acpi_device *acpi_dev = to_acpi_device(dev);
 	struct acpi_driver *acpi_drv = to_acpi_driver(drv);
 
+	/* No need to bind driver for devices that have scan handler */
+	if (acpi_dev->handler)
+		return 0;
+
+	WARN_ON(acpi_dev->driver_data);
+
 	return acpi_dev->flags.match_driver
 		&& !acpi_match_device_ids(acpi_dev, acpi_drv->ids);
 }
Signature · 1 line
1.8.3.3.gfada522
author
#2 lore raw

PATCH v2 1/1 ACPI / scan: do not match drivers against objects having scan handlers

With the introduction of ACPI scan handlers, an ACPI device object with an ACPI scan handler attached to it must not be bound to an ACPI driver any more. Therefore it doesn't make sense to match those ACPI device objects against a newly registered ACPI driver in acpi_bus_match(), so make that function return 0 if the device object passed to it has an ACPI scan handler attached.

This also addresses a regression related to a broken ACPI table in the BIOS, where it has defined a _ROM method under the PCI root bridge object. This causes the video module to treat that object as a display controller device (since only display devices are supposed to have a _ROM method defined according to the ACPI spec). As a result, the ACPI video driver binds to the PCI root bridge object and overwrites the previously assigned driver_data field of it, causing subsequent calls to acpi_get_pci_dev() to fail.

[rjw: Subject and changelog]
References: https://bugzilla.kernel.org/show_bug.cgi?id=58091

Reported-and-tested-by Jason Cassell <[email protected]>
Reported-bisected-and-tested-by Dmitry S. Demin <[email protected]>

---
v2:
Remove WARN_ON as it would cause unnecessary warnings for devices that already have drivers bound.

drivers/acpi/scan.c | 6 ++++++

 1 file changed, 6 insertions(+)
drivers/acpi/scan.c +4 -0
index 5e7e991..67ce501 100644
@@ -553,6 +553,10 @@ static int acpi_bus_match(struct device *dev, struct device_driver *drv)
 	struct acpi_device *acpi_dev = to_acpi_device(dev);
 	struct acpi_driver *acpi_drv = to_acpi_driver(drv);
 
+	/* Skip ACPI device objects with scan handlers attached. */
+	if (acpi_dev->handler)
+		return 0;
+
 	return acpi_dev->flags.match_driver
 		&& !acpi_match_device_ids(acpi_dev, acpi_drv->ids);
 }
#3 lore raw

Re: [PATCH v2] ACPI / scan: do not match drivers against objects having scan handlers

Quoted 16 lines · Aaron Lu

With the introduction of ACPI scan handlers, an ACPI device object with an ACPI scan handler attached to it must not be bound to an ACPI driver any more. Therefore it doesn't make sense to match those ACPI device objects against a newly registered ACPI driver in acpi_bus_match(), so make that function return 0 if the device object passed to it has an ACPI scan handler attached.

This also addresses a regression related to a broken ACPI table in the BIOS, where it has defined a _ROM method under the PCI root bridge object. This causes the video module to treat that object as a display controller device (since only display devices are supposed to have a _ROM method defined according to the ACPI spec). As a result, the ACPI video driver binds to the PCI root bridge object and overwrites the previously assigned driver_data field of it, causing subsequent calls to acpi_get_pci_dev() to fail.

Quoted 6 lines

[rjw: Subject and changelog]
References: https://bugzilla.kernel.org/show_bug.cgi?id=58091

Reported-and-tested-by Jason Cassell <[email protected]>
Reported-bisected-and-tested-by Dmitry S. Demin <[email protected]>

I've applied this one already.

Thanks,
Rafael

Quoted 23 lines

---
v2:
Remove WARN_ON as it would cause unnecessary warnings for devices that already have drivers bound.

drivers/acpi/scan.c | 6 ++++++

 1 file changed, 6 insertions(+)
drivers/acpi/scan.c +4 -0
index 5e7e991..67ce501 100644
@@ -553,6 +553,10 @@ static int acpi_bus_match(struct device *dev, struct device_driver *drv)
 	struct acpi_device *acpi_dev = to_acpi_device(dev);
 	struct acpi_driver *acpi_drv = to_acpi_driver(drv);
 
+	/* Skip ACPI device objects with scan handlers attached. */
+	if (acpi_dev->handler)
+		return 0;
+
 	return acpi_dev->flags.match_driver
 		&& !acpi_match_device_ids(acpi_dev, acpi_drv->ids);
 }
Signature · 2 lines
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.