Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3c75e237 authored by Andrew Patterson's avatar Andrew Patterson Committed by Greg Kroah-Hartman
Browse files

PCI: Run ACPI _OSC method on root bridges only



According to the PCI Firmware Specification Revision 3.0 section 4.5, _OSC
should only be called on a root brdige.  Here is the relevant passage: "The
_OSC interface defined in this section applies only to Host Bridge ACPI
devices that originate PCI, PCI-X, or PCI Express hierarchies". Changed the
code to find the parent root bridge of the device and call _OSC on that.

Signed-off-by: default avatarAndrew Patterson <andrew.patterson@hp.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent d8634ddd
Loading
Loading
Loading
Loading
+6 −16
Original line number Diff line number Diff line
@@ -31,23 +31,13 @@ int aer_osc_setup(struct pcie_device *pciedev)
{
	acpi_status status = AE_NOT_FOUND;
	struct pci_dev *pdev = pciedev->port;
	acpi_handle handle = DEVICE_ACPI_HANDLE(&pdev->dev);
	struct pci_bus *parent;
	acpi_handle handle = 0;

	while (!handle) {
		if (!pdev || !pdev->bus->parent)
			break;
		parent = pdev->bus->parent;
		if (!parent->self)
			/* Parent must be a host bridge */
	/* Find root host bridge */
	while (pdev->bus && pdev->bus->self)
		pdev = pdev->bus->self;
	handle = acpi_get_pci_rootbridge_handle(
					pci_domain_nr(parent),
					parent->number);
		else
			handle = DEVICE_ACPI_HANDLE(
					&(parent->self->dev));
		pdev = parent->self;
	}
		pci_domain_nr(pdev->bus), pdev->bus->number);

	if (handle) {
		pcie_osc_support_set(OSC_EXT_PCI_CONFIG_SUPPORT);