mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02:00
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>
This commit is contained in:
parent
4e362abe48
commit
9caf4ea2fd
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user