mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02:00
PCI: Use pci_release_resource() instead of release_resource()
A few places in setup-bus.c call release_resource() directly and end up duplicating functionality from pci_release_resource() such as parent check, logging, and clearing the resource. Worse yet, the way the resource is cleared is inconsistent between different sites. Convert release_resource() calls into pci_release_resource() to remove code duplication. This will also make the resource start, end, and flags behavior consistent, i.e., start address is cleared, and only IORESOURCE_UNSET is asserted for the resource. While at it, eliminate the unnecessary initialization of idx variable in pci_bridge_release_resources(). Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Link: https://patch.msgid.link/20250829131113.36754-9-ilpo.jarvinen@linux.intel.com
This commit is contained in:
parent
b15f45ab65
commit
3baeae3603
|
|
@ -473,8 +473,6 @@ static void __assign_resources_sorted(struct list_head *head,
|
|||
struct pci_dev_resource *dev_res, *tmp_res, *dev_res2;
|
||||
struct resource *res;
|
||||
struct pci_dev *dev;
|
||||
const char *res_name;
|
||||
int idx;
|
||||
unsigned long fail_type;
|
||||
resource_size_t add_align, align;
|
||||
|
||||
|
|
@ -582,14 +580,7 @@ static void __assign_resources_sorted(struct list_head *head,
|
|||
res = dev_res->res;
|
||||
dev = dev_res->dev;
|
||||
|
||||
if (!res->parent)
|
||||
continue;
|
||||
|
||||
idx = pci_resource_num(dev, res);
|
||||
res_name = pci_resource_name(dev, idx);
|
||||
pci_dbg(dev, "%s %pR: releasing\n", res_name, res);
|
||||
|
||||
release_resource(res);
|
||||
pci_release_resource(dev, pci_resource_num(dev, res));
|
||||
restore_dev_resource(dev_res);
|
||||
}
|
||||
/* Restore start/end/flags from saved list */
|
||||
|
|
@ -1732,7 +1723,7 @@ static void pci_bridge_release_resources(struct pci_bus *bus,
|
|||
struct resource *r;
|
||||
unsigned int old_flags;
|
||||
struct resource *b_res;
|
||||
int idx = 1;
|
||||
int idx, ret;
|
||||
|
||||
b_res = &dev->resource[PCI_BRIDGE_RESOURCES];
|
||||
|
||||
|
|
@ -1766,21 +1757,18 @@ static void pci_bridge_release_resources(struct pci_bus *bus,
|
|||
|
||||
/* If there are children, release them all */
|
||||
release_child_resources(r);
|
||||
if (!release_resource(r)) {
|
||||
type = old_flags = r->flags & PCI_RES_TYPE_MASK;
|
||||
pci_info(dev, "resource %d %pR released\n",
|
||||
PCI_BRIDGE_RESOURCES + idx, r);
|
||||
/* Keep the old size */
|
||||
resource_set_range(r, 0, resource_size(r));
|
||||
r->flags = 0;
|
||||
|
||||
/* Avoiding touch the one without PREF */
|
||||
if (type & IORESOURCE_PREFETCH)
|
||||
type = IORESOURCE_PREFETCH;
|
||||
__pci_setup_bridge(bus, type);
|
||||
/* For next child res under same bridge */
|
||||
r->flags = old_flags;
|
||||
}
|
||||
type = old_flags = r->flags & PCI_RES_TYPE_MASK;
|
||||
ret = pci_release_resource(dev, PCI_BRIDGE_RESOURCES + idx);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
/* Avoiding touch the one without PREF */
|
||||
if (type & IORESOURCE_PREFETCH)
|
||||
type = IORESOURCE_PREFETCH;
|
||||
__pci_setup_bridge(bus, type);
|
||||
/* For next child res under same bridge */
|
||||
r->flags = old_flags;
|
||||
}
|
||||
|
||||
enum release_type {
|
||||
|
|
@ -2425,7 +2413,6 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type)
|
|||
for (i = PCI_BRIDGE_RESOURCES; i < PCI_BRIDGE_RESOURCE_END;
|
||||
i++) {
|
||||
struct resource *res = &bridge->resource[i];
|
||||
const char *res_name = pci_resource_name(bridge, i);
|
||||
|
||||
if ((res->flags ^ type) & PCI_RES_TYPE_MASK)
|
||||
continue;
|
||||
|
|
@ -2438,12 +2425,7 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type)
|
|||
if (ret)
|
||||
goto cleanup;
|
||||
|
||||
pci_info(bridge, "%s %pR: releasing\n", res_name, res);
|
||||
|
||||
if (res->parent)
|
||||
release_resource(res);
|
||||
res->start = 0;
|
||||
res->end = 0;
|
||||
pci_release_resource(bridge, i);
|
||||
break;
|
||||
}
|
||||
if (i == PCI_BRIDGE_RESOURCE_END)
|
||||
|
|
|
|||
|
|
@ -406,20 +406,25 @@ int pci_reassign_resource(struct pci_dev *dev, int resno,
|
|||
return 0;
|
||||
}
|
||||
|
||||
void pci_release_resource(struct pci_dev *dev, int resno)
|
||||
int pci_release_resource(struct pci_dev *dev, int resno)
|
||||
{
|
||||
struct resource *res = pci_resource_n(dev, resno);
|
||||
const char *res_name = pci_resource_name(dev, resno);
|
||||
int ret;
|
||||
|
||||
if (!res->parent)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
pci_info(dev, "%s %pR: releasing\n", res_name, res);
|
||||
|
||||
release_resource(res);
|
||||
ret = release_resource(res);
|
||||
if (ret)
|
||||
return ret;
|
||||
res->end = resource_size(res) - 1;
|
||||
res->start = 0;
|
||||
res->flags |= IORESOURCE_UNSET;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_release_resource);
|
||||
|
||||
|
|
|
|||
|
|
@ -1417,7 +1417,7 @@ void pci_reset_secondary_bus(struct pci_dev *dev);
|
|||
void pcibios_reset_secondary_bus(struct pci_dev *dev);
|
||||
void pci_update_resource(struct pci_dev *dev, int resno);
|
||||
int __must_check pci_assign_resource(struct pci_dev *dev, int i);
|
||||
void pci_release_resource(struct pci_dev *dev, int resno);
|
||||
int pci_release_resource(struct pci_dev *dev, int resno);
|
||||
static inline int pci_rebar_bytes_to_size(u64 bytes)
|
||||
{
|
||||
bytes = roundup_pow_of_two(bytes);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user