mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
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
This commit is contained in:
commit
131618da3a
|
|
@ -169,7 +169,7 @@ struct machdep_calls {
|
|||
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
void (*pcibios_fixup_sriov)(struct pci_dev *pdev);
|
||||
resource_size_t (*pcibios_iov_resource_alignment)(struct pci_dev *, int resno);
|
||||
resource_size_t (*pcibios_iov_resource_alignment)(const struct pci_dev *, int resno);
|
||||
int (*pcibios_sriov_enable)(struct pci_dev *pdev, u16 num_vfs);
|
||||
int (*pcibios_sriov_disable)(struct pci_dev *pdev);
|
||||
#endif /* CONFIG_PCI_IOV */
|
||||
|
|
|
|||
|
|
@ -254,7 +254,7 @@ resource_size_t pcibios_default_alignment(void)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
resource_size_t pcibios_iov_resource_alignment(struct pci_dev *pdev, int resno)
|
||||
resource_size_t pcibios_iov_resource_alignment(const struct pci_dev *pdev, int resno)
|
||||
{
|
||||
if (ppc_md.pcibios_iov_resource_alignment)
|
||||
return ppc_md.pcibios_iov_resource_alignment(pdev, resno);
|
||||
|
|
|
|||
|
|
@ -244,8 +244,8 @@ void pnv_pci_ioda_fixup_iov(struct pci_dev *pdev)
|
|||
}
|
||||
}
|
||||
|
||||
resource_size_t pnv_pci_iov_resource_alignment(struct pci_dev *pdev,
|
||||
int resno)
|
||||
resource_size_t pnv_pci_iov_resource_alignment(const struct pci_dev *pdev,
|
||||
int resno)
|
||||
{
|
||||
resource_size_t align = pci_iov_resource_size(pdev, resno);
|
||||
struct pnv_phb *phb = pci_bus_to_pnvhb(pdev->bus);
|
||||
|
|
|
|||
|
|
@ -251,13 +251,14 @@ struct pnv_iov_data {
|
|||
struct resource holes[PCI_SRIOV_NUM_BARS];
|
||||
};
|
||||
|
||||
static inline struct pnv_iov_data *pnv_iov_get(struct pci_dev *pdev)
|
||||
static inline struct pnv_iov_data *pnv_iov_get(const struct pci_dev *pdev)
|
||||
{
|
||||
return pdev->dev.archdata.iov_data;
|
||||
}
|
||||
|
||||
void pnv_pci_ioda_fixup_iov(struct pci_dev *pdev);
|
||||
resource_size_t pnv_pci_iov_resource_alignment(struct pci_dev *pdev, int resno);
|
||||
resource_size_t pnv_pci_iov_resource_alignment(const struct pci_dev *pdev,
|
||||
int resno);
|
||||
|
||||
int pnv_pcibios_sriov_enable(struct pci_dev *pdev, u16 num_vfs);
|
||||
int pnv_pcibios_sriov_disable(struct pci_dev *pdev);
|
||||
|
|
|
|||
|
|
@ -658,7 +658,8 @@ enum get_iov_fw_value_index {
|
|||
WDW_SIZE = 3 /* Get Window Size */
|
||||
};
|
||||
|
||||
static resource_size_t pseries_get_iov_fw_value(struct pci_dev *dev, int resno,
|
||||
static resource_size_t pseries_get_iov_fw_value(const struct pci_dev *dev,
|
||||
int resno,
|
||||
enum get_iov_fw_value_index value)
|
||||
{
|
||||
const int *indexes;
|
||||
|
|
@ -788,7 +789,7 @@ static void pseries_pci_fixup_iov_resources(struct pci_dev *pdev)
|
|||
pseries_disable_sriov_resources(pdev);
|
||||
}
|
||||
|
||||
static resource_size_t pseries_pci_iov_resource_alignment(struct pci_dev *pdev,
|
||||
static resource_size_t pseries_pci_iov_resource_alignment(const struct pci_dev *pdev,
|
||||
int resno)
|
||||
{
|
||||
const __be32 *reg;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -756,13 +756,13 @@ static void __assign_resources_sorted(struct list_head *head,
|
|||
}
|
||||
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -261,7 +261,7 @@ extern int allocate_resource(struct resource *root, struct resource *new,
|
|||
struct resource *lookup_resource(struct resource *root, resource_size_t start);
|
||||
int adjust_resource(struct resource *res, resource_size_t start,
|
||||
resource_size_t size);
|
||||
resource_size_t resource_alignment(struct resource *res);
|
||||
resource_size_t resource_alignment(const struct resource *res);
|
||||
|
||||
/**
|
||||
* resource_set_size - Calculate resource end address from size and start
|
||||
|
|
|
|||
|
|
@ -2549,7 +2549,7 @@ int pci_vfs_assigned(struct pci_dev *dev);
|
|||
int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs);
|
||||
int pci_sriov_get_totalvfs(struct pci_dev *dev);
|
||||
int pci_sriov_configure_simple(struct pci_dev *dev, int nr_virtfn);
|
||||
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);
|
||||
int pci_iov_vf_bar_set_size(struct pci_dev *dev, int resno, int size);
|
||||
u32 pci_iov_vf_bar_get_sizes(struct pci_dev *dev, int resno, int num_vfs);
|
||||
void pci_vf_drivers_autoprobe(struct pci_dev *dev, bool probe);
|
||||
|
|
@ -2557,7 +2557,8 @@ void pci_vf_drivers_autoprobe(struct pci_dev *dev, bool probe);
|
|||
/* Arch may override these (weak) */
|
||||
int pcibios_sriov_enable(struct pci_dev *pdev, u16 num_vfs);
|
||||
int pcibios_sriov_disable(struct pci_dev *pdev);
|
||||
resource_size_t pcibios_iov_resource_alignment(struct pci_dev *dev, int resno);
|
||||
resource_size_t pcibios_iov_resource_alignment(const struct pci_dev *dev,
|
||||
int resno);
|
||||
#else
|
||||
static inline int pci_iov_virtfn_bus(struct pci_dev *dev, int id)
|
||||
{
|
||||
|
|
@ -2602,7 +2603,8 @@ static inline int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs)
|
|||
static inline int pci_sriov_get_totalvfs(struct pci_dev *dev)
|
||||
{ return 0; }
|
||||
#define pci_sriov_configure_simple NULL
|
||||
static inline resource_size_t pci_iov_resource_size(struct pci_dev *dev, int resno)
|
||||
static inline resource_size_t pci_iov_resource_size(const struct pci_dev *dev,
|
||||
int resno)
|
||||
{ return 0; }
|
||||
static inline int pci_iov_vf_bar_set_size(struct pci_dev *dev, int resno, int size)
|
||||
{ return -ENODEV; }
|
||||
|
|
|
|||
|
|
@ -1238,7 +1238,7 @@ reserve_region_with_split(struct resource *root, resource_size_t start,
|
|||
*
|
||||
* Returns alignment on success, 0 (invalid alignment) on failure.
|
||||
*/
|
||||
resource_size_t resource_alignment(struct resource *res)
|
||||
resource_size_t resource_alignment(const struct resource *res)
|
||||
{
|
||||
switch (res->flags & (IORESOURCE_SIZEALIGN | IORESOURCE_STARTALIGN)) {
|
||||
case IORESOURCE_SIZEALIGN:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user