]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
PCI: Extend enable to check for any optional resource
authorIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Mon, 16 Dec 2024 17:56:26 +0000 (19:56 +0200)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 18 Feb 2025 21:40:54 +0000 (15:40 -0600)
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>
drivers/pci/pci.h
drivers/pci/setup-bus.c
drivers/pci/setup-res.c

index 996185abd30cba971e9c4a95eafb02cc018999b0..4e2ac06db3c471bfb0143c7508e414940d1f211a 100644 (file)
@@ -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
index 9a1c09b9efa21f9b638f5f2c626e7abfe88ab9ea..0b11069938b6ed423ca3a0b3273cae6c8e52cf91 100644 (file)
@@ -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;
index 51ff9ab1f4002bd3cc1902e45834ed86083f7361..b056acfda96ca0b95aca51d8f54182e703aec365 100644 (file)
@@ -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) {