Skip to content

Commit

Permalink
PCI: ACPI: Drop acpi_pci_bus
Browse files Browse the repository at this point in the history
The acpi_pci_bus structure was used primarily for running
acpi_pci_find_companion() during PCI device objects registration,
but after commit 375553a ("PCI: Setup ACPI fwnode early and at
the same time with OF") that function is called by pci_setup_device()
via pci_set_acpi_fwnode(), which happens before calling
pci_device_add() on the new PCI device object, so its ACPI companion
has been set already when acpi_device_notify() runs and it will never
call ->find_companion() from acpi_pci_bus.

For this reason, modify acpi_device_notify() and
acpi_device_notify_remove() to call pci_acpi_setup() and
pci_acpi_cleanup(), respectively, directly on PCI device objects
and drop acpi_pci_bus altogether.

While at it, notice that pci_acpi_setup() and pci_acpi_cleanup()
can obtain the ACPI companion pointer, which is guaranteed to not
be NULL, from their callers and modify them to work that way so
as to reduce the number of redundant checks somewhat.

Signed-off-by: Rafael J. Wysocki <[email protected]>
Tested-by: Ferry Toth <[email protected]>
  • Loading branch information
rafaeljw committed Sep 27, 2021
1 parent 5816b3e commit 4795448
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 40 deletions.
34 changes: 22 additions & 12 deletions drivers/acpi/glue.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
#include <linux/rwsem.h>
#include <linux/acpi.h>
#include <linux/dma-mapping.h>
#include <linux/pci.h>
#include <linux/pci-acpi.h>
#include <linux/platform_device.h>

#include "internal.h"
Expand Down Expand Up @@ -307,13 +309,17 @@ void acpi_device_notify(struct device *dev)
}
adev = ACPI_COMPANION(dev);

if (dev_is_platform(dev))
acpi_configure_pmsi_domain(dev);
if (dev_is_pci(dev)) {
pci_acpi_setup(dev, adev);
} else {
if (dev_is_platform(dev))
acpi_configure_pmsi_domain(dev);

if (type && type->setup)
type->setup(dev);
else if (adev->handler && adev->handler->bind)
adev->handler->bind(dev);
if (type && type->setup)
type->setup(dev);
else if (adev->handler && adev->handler->bind)
adev->handler->bind(dev);
}

acpi_handle_debug(ACPI_HANDLE(dev), "Bound to device %s\n",
dev_name(dev));
Expand All @@ -327,16 +333,20 @@ void acpi_device_notify(struct device *dev)
void acpi_device_notify_remove(struct device *dev)
{
struct acpi_device *adev = ACPI_COMPANION(dev);
struct acpi_bus_type *type;

if (!adev)
return;

type = acpi_get_bus_type(dev);
if (type && type->cleanup)
type->cleanup(dev);
else if (adev->handler && adev->handler->unbind)
adev->handler->unbind(dev);
if (dev_is_pci(dev)) {
pci_acpi_cleanup(dev, adev);
} else {
struct acpi_bus_type *type = acpi_get_bus_type(dev);

if (type && type->cleanup)
type->cleanup(dev);
else if (adev->handler && adev->handler->unbind)
adev->handler->unbind(dev);
}

acpi_unbind_one(dev);
}
31 changes: 3 additions & 28 deletions drivers/pci/pci-acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1353,13 +1353,9 @@ static void pci_acpi_set_external_facing(struct pci_dev *dev)
dev->external_facing = 1;
}

static void pci_acpi_setup(struct device *dev)
void pci_acpi_setup(struct device *dev, struct acpi_device *adev)
{
struct pci_dev *pci_dev = to_pci_dev(dev);
struct acpi_device *adev = ACPI_COMPANION(dev);

if (!adev)
return;

pci_acpi_optimize_delay(pci_dev, adev->handle);
pci_acpi_set_external_facing(pci_dev);
Expand All @@ -1383,14 +1379,10 @@ static void pci_acpi_setup(struct device *dev)
acpi_device_power_add_dependent(adev, dev);
}

static void pci_acpi_cleanup(struct device *dev)
void pci_acpi_cleanup(struct device *dev, struct acpi_device *adev)
{
struct acpi_device *adev = ACPI_COMPANION(dev);
struct pci_dev *pci_dev = to_pci_dev(dev);

if (!adev)
return;

pci_acpi_remove_edr_notifier(pci_dev);
pci_acpi_remove_pm_notifier(adev);
if (adev->wakeup.flags.valid) {
Expand All @@ -1402,20 +1394,6 @@ static void pci_acpi_cleanup(struct device *dev)
}
}

static bool pci_acpi_bus_match(struct device *dev)
{
return dev_is_pci(dev);
}

static struct acpi_bus_type acpi_pci_bus = {
.name = "PCI",
.match = pci_acpi_bus_match,
.find_companion = acpi_pci_find_companion,
.setup = pci_acpi_setup,
.cleanup = pci_acpi_cleanup,
};


static struct fwnode_handle *(*pci_msi_get_fwnode_cb)(struct device *dev);

/**
Expand Down Expand Up @@ -1457,8 +1435,6 @@ struct irq_domain *pci_host_bridge_acpi_msi_domain(struct pci_bus *bus)

static int __init acpi_pci_init(void)
{
int ret;

if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_MSI) {
pr_info("ACPI FADT declares the system doesn't support MSI, so disable it\n");
pci_no_msi();
Expand All @@ -1469,8 +1445,7 @@ static int __init acpi_pci_init(void)
pcie_no_aspm();
}

ret = register_acpi_bus_type(&acpi_pci_bus);
if (ret)
if (acpi_pci_disabled)
return 0;

pci_set_platform_pm(&acpi_pci_platform_pm);
Expand Down
8 changes: 8 additions & 0 deletions include/linux/pci-acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,14 @@ extern struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root,
void acpi_pci_add_bus(struct pci_bus *bus);
void acpi_pci_remove_bus(struct pci_bus *bus);

#ifdef CONFIG_PCI
void pci_acpi_setup(struct device *dev, struct acpi_device *adev);
void pci_acpi_cleanup(struct device *dev, struct acpi_device *adev);
#else
static inline void pci_acpi_setup(struct device *dev, struct acpi_device *adev) {}
static inline void pci_acpi_cleanup(struct device *dev, struct acpi_device *adev) {}
#endif

#ifdef CONFIG_ACPI_PCI_SLOT
void acpi_pci_slot_init(void);
void acpi_pci_slot_enumerate(struct pci_bus *bus);
Expand Down

0 comments on commit 4795448

Please sign in to comment.