aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
authorBjorn Helgaas <bhelgaas@google.com>2026-06-23 17:32:02 -0500
committerBjorn Helgaas <bhelgaas@google.com>2026-06-23 17:32:02 -0500
commit131618da3a0716d10d47645214e32d75fe19efa8 (patch)
tree153225585251f1f145d333f0d8f74dae724de3ad /drivers
parent77d94e14361d58821a64f87440b8205f3eb266e2 (diff)
parente9310aa3d2a1fa155565e253841fff841e31db64 (diff)
downloadath-131618da3a0716d10d47645214e32d75fe19efa8.tar.gz
Merge branch 'pci/resource'
- Improve resource claim logging for debuggability (Ilpo Järvinen) - Rename 'added' to 'add_list' for naming consistency (Ilpo Järvinen) - Consolidate 'add_list' sanity checks (Ilpo Järvinen) - Clean up several uses of const parameters (Ilpo Järvinen) - Move pci_resource_alignment() from header to setup-res.c file (Ilpo Järvinen) * pci/resource: PCI: Move pci_resource_alignment() to setup-res.c file PCI: Convert pci_resource_alignment() input parameters to const PCI: Make pci_sriov_resource_alignment() pci_dev const powerpc/pseries: Make pseries_get_iov_fw_value() & pnv_iov_get() pci_dev const resource: Make resource_alignment() input const resource PCI: Remove const removal cast PCI: Consolidate add_list (aka realloc_head) empty sanity checks PCI: Rename 'added' to 'add_list' PCI: Log all resource claims
Diffstat (limited to 'drivers')
-rw-r--r--drivers/pci/iov.c7
-rw-r--r--drivers/pci/pci.h24
-rw-r--r--drivers/pci/setup-bus.c50
-rw-r--r--drivers/pci/setup-cardbus.c2
-rw-r--r--drivers/pci/setup-res.c14
5 files changed, 54 insertions, 43 deletions
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index 08df9bace13d1..30ca4535fc36a 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -150,7 +150,7 @@ static void virtfn_remove_bus(struct pci_bus *physbus, struct pci_bus *virtbus)
pci_remove_bus(virtbus);
}
-resource_size_t pci_iov_resource_size(struct pci_dev *dev, int resno)
+resource_size_t pci_iov_resource_size(const struct pci_dev *dev, int resno)
{
if (!dev->is_physfn)
return 0;
@@ -1090,7 +1090,7 @@ void pci_iov_update_resource(struct pci_dev *dev, int resno)
}
}
-resource_size_t __weak pcibios_iov_resource_alignment(struct pci_dev *dev,
+resource_size_t __weak pcibios_iov_resource_alignment(const struct pci_dev *dev,
int resno)
{
return pci_iov_resource_size(dev, resno);
@@ -1106,7 +1106,8 @@ resource_size_t __weak pcibios_iov_resource_alignment(struct pci_dev *dev,
* the VF BAR size multiplied by the number of VFs. The alignment
* is just the VF BAR size.
*/
-resource_size_t pci_sriov_resource_alignment(struct pci_dev *dev, int resno)
+resource_size_t pci_sriov_resource_alignment(const struct pci_dev *dev,
+ int resno)
{
return pcibios_iov_resource_alignment(dev, resno);
}
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 4a14f88e543a2..472b6c2f7c4d8 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -419,7 +419,7 @@ static inline bool pci_is_cardbus_bridge(struct pci_dev *dev)
return dev->hdr_type == PCI_HEADER_TYPE_CARDBUS;
}
#ifdef CONFIG_CARDBUS
-unsigned long pci_cardbus_resource_alignment(struct resource *res);
+unsigned long pci_cardbus_resource_alignment(const struct resource *res);
int pci_bus_size_cardbus_bridge(struct pci_bus *bus,
struct list_head *realloc_head);
int pci_cardbus_scan_bridge_extend(struct pci_bus *bus, struct pci_dev *dev,
@@ -428,7 +428,7 @@ int pci_cardbus_scan_bridge_extend(struct pci_bus *bus, struct pci_dev *dev,
int pci_setup_cardbus(char *str);
#else
-static inline unsigned long pci_cardbus_resource_alignment(struct resource *res)
+static inline unsigned long pci_cardbus_resource_alignment(const struct resource *res)
{
return 0;
}
@@ -515,7 +515,7 @@ int pci_dev_res_add_to_list(struct list_head *head, struct pci_dev *dev,
void __pci_bus_size_bridges(struct pci_bus *bus,
struct list_head *realloc_head);
void __pci_bus_assign_resources(const struct pci_bus *bus,
- struct list_head *realloc_head,
+ struct list_head *add_list,
struct list_head *fail_head);
bool pci_bus_clip_resource(struct pci_dev *dev, int idx);
void pci_walk_bus_locked(struct pci_bus *top,
@@ -947,7 +947,8 @@ int pci_iov_init(struct pci_dev *dev);
void pci_iov_release(struct pci_dev *dev);
void pci_iov_remove(struct pci_dev *dev);
void pci_iov_update_resource(struct pci_dev *dev, int resno);
-resource_size_t pci_sriov_resource_alignment(struct pci_dev *dev, int resno);
+resource_size_t pci_sriov_resource_alignment(const struct pci_dev *dev,
+ int resno);
void pci_restore_iov_state(struct pci_dev *dev);
int pci_iov_bus_range(struct pci_bus *bus);
void pci_iov_resource_set_size(struct pci_dev *dev, int resno, int size);
@@ -981,7 +982,7 @@ static inline int pci_iov_init(struct pci_dev *dev)
static inline void pci_iov_release(struct pci_dev *dev) { }
static inline void pci_iov_remove(struct pci_dev *dev) { }
static inline void pci_iov_update_resource(struct pci_dev *dev, int resno) { }
-static inline resource_size_t pci_sriov_resource_alignment(struct pci_dev *dev,
+static inline resource_size_t pci_sriov_resource_alignment(const struct pci_dev *dev,
int resno)
{
return 0;
@@ -1043,17 +1044,8 @@ static inline void pci_suspend_ptm(struct pci_dev *dev) { }
static inline void pci_resume_ptm(struct pci_dev *dev) { }
#endif
-static inline resource_size_t pci_resource_alignment(struct pci_dev *dev,
- struct resource *res)
-{
- int resno = pci_resource_num(dev, res);
-
- if (pci_resource_is_iov(resno))
- return pci_sriov_resource_alignment(dev, resno);
- if (dev->class >> 8 == PCI_CLASS_BRIDGE_CARDBUS)
- return pci_cardbus_resource_alignment(res);
- return resource_alignment(res);
-}
+resource_size_t pci_resource_alignment(const struct pci_dev *dev,
+ const struct resource *res);
resource_size_t pci_min_window_alignment(struct pci_bus *bus,
unsigned long type);
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 4cf120ebe5adf..c0a949f2c9956 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -756,13 +756,13 @@ out:
}
static void pdev_assign_resources_sorted(struct pci_dev *dev,
- struct list_head *add_head,
+ struct list_head *add_list,
struct list_head *fail_head)
{
LIST_HEAD(head);
pdev_sort_resources(dev, &head);
- __assign_resources_sorted(&head, add_head, fail_head);
+ __assign_resources_sorted(&head, add_list, fail_head);
}
@@ -1501,14 +1501,14 @@ static void pdev_assign_fixed_resources(struct pci_dev *dev)
}
}
-void __pci_bus_assign_resources(const struct pci_bus *bus,
- struct list_head *realloc_head,
- struct list_head *fail_head)
+static void __pci_bus_assign_resources_one(const struct pci_bus *bus,
+ struct list_head *add_list,
+ struct list_head *fail_head)
{
struct pci_bus *b;
struct pci_dev *dev;
- pbus_assign_resources_sorted(bus, realloc_head, fail_head);
+ pbus_assign_resources_sorted(bus, add_list, fail_head);
list_for_each_entry(dev, &bus->devices, bus_list) {
pdev_assign_fixed_resources(dev);
@@ -1517,7 +1517,7 @@ void __pci_bus_assign_resources(const struct pci_bus *bus,
if (!b)
continue;
- __pci_bus_assign_resources(b, realloc_head, fail_head);
+ __pci_bus_assign_resources_one(b, add_list, fail_head);
switch (dev->hdr_type) {
case PCI_HEADER_TYPE_BRIDGE:
@@ -1537,6 +1537,16 @@ void __pci_bus_assign_resources(const struct pci_bus *bus,
}
}
+void __pci_bus_assign_resources(const struct pci_bus *bus,
+ struct list_head *add_list,
+ struct list_head *fail_head)
+{
+ __pci_bus_assign_resources_one(bus, add_list, fail_head);
+
+ if (WARN_ON_ONCE(add_list && !list_empty(add_list)))
+ pci_dev_res_free_list(add_list);
+}
+
void pci_bus_assign_resources(const struct pci_bus *bus)
{
__pci_bus_assign_resources(bus, NULL, NULL);
@@ -1612,20 +1622,19 @@ void pci_bus_claim_resources(struct pci_bus *b)
}
EXPORT_SYMBOL(pci_bus_claim_resources);
-static void __pci_bridge_assign_resources(const struct pci_dev *bridge,
- struct list_head *add_head,
+static void __pci_bridge_assign_resources(struct pci_dev *bridge,
+ struct list_head *add_list,
struct list_head *fail_head)
{
struct pci_bus *b;
- pdev_assign_resources_sorted((struct pci_dev *)bridge,
- add_head, fail_head);
+ pdev_assign_resources_sorted(bridge, add_list, fail_head);
b = bridge->subordinate;
if (!b)
return;
- __pci_bus_assign_resources(b, add_head, fail_head);
+ __pci_bus_assign_resources(b, add_list, fail_head);
switch (bridge->class >> 8) {
case PCI_CLASS_BRIDGE_PCI:
@@ -1641,6 +1650,9 @@ static void __pci_bridge_assign_resources(const struct pci_dev *bridge,
pci_domain_nr(b), b->number);
break;
}
+
+ if (WARN_ON_ONCE(add_list && !list_empty(add_list)))
+ pci_dev_res_free_list(add_list);
}
static void pci_bridge_release_resources(struct pci_bus *bus,
@@ -2205,8 +2217,6 @@ void pci_assign_unassigned_root_bus_resources(struct pci_bus *bus)
/* Depth last, allocate resources and update the hardware. */
__pci_bus_assign_resources(bus, add_list, &fail_head);
- if (WARN_ON_ONCE(add_list && !list_empty(add_list)))
- pci_dev_res_free_list(add_list);
tried_times++;
/* Any device complain? */
@@ -2268,8 +2278,6 @@ void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge)
pci_bridge_distribute_available_resources(bridge, &add_list);
__pci_bridge_assign_resources(bridge, &add_list, &fail_head);
- if (WARN_ON_ONCE(!list_empty(&add_list)))
- pci_dev_res_free_list(&add_list);
tried_times++;
if (list_empty(&fail_head))
@@ -2303,7 +2311,7 @@ static int pbus_reassign_bridge_resources(struct pci_bus *bus, struct resource *
unsigned long type = res->flags;
struct pci_dev_resource *dev_res;
struct pci_dev *bridge = NULL;
- LIST_HEAD(added);
+ LIST_HEAD(add_list);
LIST_HEAD(failed);
unsigned int i;
int ret = 0;
@@ -2337,10 +2345,8 @@ static int pbus_reassign_bridge_resources(struct pci_bus *bus, struct resource *
if (!bridge)
return -ENOENT;
- __pci_bus_size_bridges(bridge->subordinate, &added);
- __pci_bridge_assign_resources(bridge, &added, &failed);
- if (WARN_ON_ONCE(!list_empty(&added)))
- pci_dev_res_free_list(&added);
+ __pci_bus_size_bridges(bridge->subordinate, &add_list);
+ __pci_bridge_assign_resources(bridge, &add_list, &failed);
if (!list_empty(&failed)) {
if (pci_required_resource_failed(&failed, type))
@@ -2473,7 +2479,5 @@ void pci_assign_unassigned_bus_resources(struct pci_bus *bus)
__pci_bus_size_bridges(dev->subordinate, &add_list);
up_read(&pci_bus_sem);
__pci_bus_assign_resources(bus, &add_list, NULL);
- if (WARN_ON_ONCE(!list_empty(&add_list)))
- pci_dev_res_free_list(&add_list);
}
EXPORT_SYMBOL_GPL(pci_assign_unassigned_bus_resources);
diff --git a/drivers/pci/setup-cardbus.c b/drivers/pci/setup-cardbus.c
index 1ebd13a1f7302..0cba404080ad6 100644
--- a/drivers/pci/setup-cardbus.c
+++ b/drivers/pci/setup-cardbus.c
@@ -22,7 +22,7 @@
static unsigned long pci_cardbus_io_size = DEFAULT_CARDBUS_IO_SIZE;
static unsigned long pci_cardbus_mem_size = DEFAULT_CARDBUS_MEM_SIZE;
-unsigned long pci_cardbus_resource_alignment(struct resource *res)
+unsigned long pci_cardbus_resource_alignment(const struct resource *res)
{
if (res->flags & IORESOURCE_IO)
return pci_cardbus_io_size;
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
index fbc05cda96ee0..18e8775ea848c 100644
--- a/drivers/pci/setup-res.c
+++ b/drivers/pci/setup-res.c
@@ -167,6 +167,8 @@ int pci_claim_resource(struct pci_dev *dev, int resource)
return -EBUSY;
}
+ pci_dbg(dev, "%s %pR: claiming\n", res_name, res);
+
return 0;
}
EXPORT_SYMBOL(pci_claim_resource);
@@ -244,6 +246,18 @@ static int pci_revert_fw_address(struct resource *res, struct pci_dev *dev,
return 0;
}
+resource_size_t pci_resource_alignment(const struct pci_dev *dev,
+ const struct resource *res)
+{
+ int resno = pci_resource_num(dev, res);
+
+ if (pci_resource_is_iov(resno))
+ return pci_sriov_resource_alignment(dev, resno);
+ if (dev->class >> 8 == PCI_CLASS_BRIDGE_CARDBUS)
+ return pci_cardbus_resource_alignment(res);
+ return resource_alignment(res);
+}
+
/*
* For mem bridge windows, try to relocate tail remainder space to space
* before res->start if there's enough free space there. This enables