diff options
author | 2024-12-16 19:56:26 +0200 | |
---|---|---|
committer | 2025-02-18 15:40:54 -0600 | |
commit | 9caf4ea2fd022e3febb8f70421b7f87e9788852e (patch) | |
tree | b76f03a8c2aae3ab63621bfefad12be116b5b7cb | |
parent | PCI: Add restore_dev_resource() (diff) | |
download | linux-rng-9caf4ea2fd022e3febb8f70421b7f87e9788852e.tar.xz linux-rng-9caf4ea2fd022e3febb8f70421b7f87e9788852e.zip |
PCI: Extend enable to check for any optional resource
pci_enable_resources() checks if device's io and mem resources are all
assigned and disallows enable if any resource failed to assign (*) but
makes an exception for the case of disabled extension ROM. There are other
optional resources, however.
Add pci_resource_is_optional() and use it instead of
pci_resource_is_disabled_rom() to cover also IOV resources that are also
optional as per pbus_size_mem().
As there will be more users of pci_resource_is_optional() inside
setup-bus.c in changes coming up after this one, the function is placed
there.
(*) In practice, resource fitting code calls reset_resource() for any
resource it fails to assign which clears resource's ->flags causing
pci_enable_resources() to never detect failed resource assignments.
This seems undesirable internal logic inconsistency, effectively
reset_resource() prevents pci_enable_resources() from functioning as
intended. This is one step of many that will be needed towards removing
reset_resource().
Link: https://lore.kernel.org/r/20241216175632.4175-20-ilpo.jarvinen@linux.intel.com
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Tested-by: Xiaochun Lee <lixc17@lenovo.com>
-rw-r--r-- | drivers/pci/pci.h | 1 | ||||
-rw-r--r-- | drivers/pci/setup-bus.c | 12 | ||||
-rw-r--r-- | drivers/pci/setup-res.c | 3 |
3 files changed, 14 insertions, 2 deletions
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 996185abd30c..4e2ac06db3c4 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -333,6 +333,7 @@ void pci_walk_bus_locked(struct pci_bus *top, void *userdata); const char *pci_resource_name(struct pci_dev *dev, unsigned int i); +bool pci_resource_is_optional(const struct pci_dev *dev, int resno); /** * pci_resource_num - Reverse lookup resource number from device resources diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 9a1c09b9efa2..0b11069938b6 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -206,6 +206,18 @@ static void pdev_sort_resources(struct pci_dev *dev, struct list_head *head) } } +bool pci_resource_is_optional(const struct pci_dev *dev, int resno) +{ + const struct resource *res = pci_resource_n(dev, resno); + + if (pci_resource_is_iov(resno)) + return true; + if (resno == PCI_ROM_RESOURCE && !(res->flags & IORESOURCE_ROM_ENABLE)) + return true; + + return false; +} + static inline void reset_resource(struct resource *res) { res->start = 0; diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index 51ff9ab1f400..b056acfda96c 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c @@ -494,8 +494,7 @@ int pci_enable_resources(struct pci_dev *dev, int mask) if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM))) continue; - if ((i == PCI_ROM_RESOURCE) && - (!(r->flags & IORESOURCE_ROM_ENABLE))) + if (pci_resource_is_optional(dev, i)) continue; if (r->flags & IORESOURCE_UNSET) { |