mirror of
https://github.com/torvalds/linux.git
synced 2026-03-14 02:06:15 +01:00
PCI/IOV: Add pci_resource_num_to_vf_bar() to convert VF BAR number to/from IOV resource
There are multiple places where conversions between IOV resources and corresponding VF BAR numbers are done. Extract the logic to pci_resource_num_from_vf_bar() and pci_resource_num_to_vf_bar() helpers. Suggested-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Michał Winiarski <michal.winiarski@intel.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Acked-by: Christian König <christian.koenig@amd.com> Link: https://patch.msgid.link/20250702093522.518099-3-michal.winiarski@intel.com
This commit is contained in:
parent
5a8f77e24a
commit
535bdbeaac
3 changed files with 36 additions and 11 deletions
|
|
@ -151,7 +151,7 @@ resource_size_t pci_iov_resource_size(struct pci_dev *dev, int resno)
|
|||
if (!dev->is_physfn)
|
||||
return 0;
|
||||
|
||||
return dev->sriov->barsz[resno - PCI_IOV_RESOURCES];
|
||||
return dev->sriov->barsz[pci_resource_num_to_vf_bar(resno)];
|
||||
}
|
||||
|
||||
static void pci_read_vf_config_common(struct pci_dev *virtfn)
|
||||
|
|
@ -342,12 +342,14 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id)
|
|||
virtfn->multifunction = 0;
|
||||
|
||||
for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
|
||||
res = &dev->resource[i + PCI_IOV_RESOURCES];
|
||||
int idx = pci_resource_num_from_vf_bar(i);
|
||||
|
||||
res = &dev->resource[idx];
|
||||
if (!res->parent)
|
||||
continue;
|
||||
virtfn->resource[i].name = pci_name(virtfn);
|
||||
virtfn->resource[i].flags = res->flags;
|
||||
size = pci_iov_resource_size(dev, i + PCI_IOV_RESOURCES);
|
||||
size = pci_iov_resource_size(dev, idx);
|
||||
resource_set_range(&virtfn->resource[i],
|
||||
res->start + size * id, size);
|
||||
rc = request_resource(res, &virtfn->resource[i]);
|
||||
|
|
@ -644,8 +646,10 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
|
|||
|
||||
nres = 0;
|
||||
for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
|
||||
bars |= (1 << (i + PCI_IOV_RESOURCES));
|
||||
res = &dev->resource[i + PCI_IOV_RESOURCES];
|
||||
int idx = pci_resource_num_from_vf_bar(i);
|
||||
|
||||
bars |= (1 << idx);
|
||||
res = &dev->resource[idx];
|
||||
if (res->parent)
|
||||
nres++;
|
||||
}
|
||||
|
|
@ -811,8 +815,10 @@ found:
|
|||
|
||||
nres = 0;
|
||||
for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
|
||||
res = &dev->resource[i + PCI_IOV_RESOURCES];
|
||||
res_name = pci_resource_name(dev, i + PCI_IOV_RESOURCES);
|
||||
int idx = pci_resource_num_from_vf_bar(i);
|
||||
|
||||
res = &dev->resource[idx];
|
||||
res_name = pci_resource_name(dev, idx);
|
||||
|
||||
/*
|
||||
* If it is already FIXED, don't change it, something
|
||||
|
|
@ -871,7 +877,7 @@ fail_max_buses:
|
|||
dev->is_physfn = 0;
|
||||
failed:
|
||||
for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
|
||||
res = &dev->resource[i + PCI_IOV_RESOURCES];
|
||||
res = &dev->resource[pci_resource_num_from_vf_bar(i)];
|
||||
res->flags = 0;
|
||||
}
|
||||
|
||||
|
|
@ -933,7 +939,7 @@ static void sriov_restore_state(struct pci_dev *dev)
|
|||
pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, ctrl);
|
||||
|
||||
for (i = 0; i < PCI_SRIOV_NUM_BARS; i++)
|
||||
pci_update_resource(dev, i + PCI_IOV_RESOURCES);
|
||||
pci_update_resource(dev, pci_resource_num_from_vf_bar(i));
|
||||
|
||||
pci_write_config_dword(dev, iov->pos + PCI_SRIOV_SYS_PGSIZE, iov->pgsz);
|
||||
pci_iov_set_numvfs(dev, iov->num_VFs);
|
||||
|
|
@ -999,7 +1005,7 @@ void pci_iov_update_resource(struct pci_dev *dev, int resno)
|
|||
{
|
||||
struct pci_sriov *iov = dev->is_physfn ? dev->sriov : NULL;
|
||||
struct resource *res = pci_resource_n(dev, resno);
|
||||
int vf_bar = resno - PCI_IOV_RESOURCES;
|
||||
int vf_bar = pci_resource_num_to_vf_bar(resno);
|
||||
struct pci_bus_region region;
|
||||
u16 cmd;
|
||||
u32 new;
|
||||
|
|
|
|||
|
|
@ -722,6 +722,14 @@ static inline bool pci_resource_is_iov(int resno)
|
|||
{
|
||||
return resno >= PCI_IOV_RESOURCES && resno <= PCI_IOV_RESOURCE_END;
|
||||
}
|
||||
static inline int pci_resource_num_from_vf_bar(int resno)
|
||||
{
|
||||
return resno + PCI_IOV_RESOURCES;
|
||||
}
|
||||
static inline int pci_resource_num_to_vf_bar(int resno)
|
||||
{
|
||||
return resno - PCI_IOV_RESOURCES;
|
||||
}
|
||||
extern const struct attribute_group sriov_pf_dev_attr_group;
|
||||
extern const struct attribute_group sriov_vf_dev_attr_group;
|
||||
#else
|
||||
|
|
@ -750,6 +758,16 @@ static inline bool pci_resource_is_iov(int resno)
|
|||
{
|
||||
return false;
|
||||
}
|
||||
static inline int pci_resource_num_from_vf_bar(int resno)
|
||||
{
|
||||
WARN_ON_ONCE(1);
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline int pci_resource_num_to_vf_bar(int resno)
|
||||
{
|
||||
WARN_ON_ONCE(1);
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif /* CONFIG_PCI_IOV */
|
||||
|
||||
#ifdef CONFIG_PCIE_TPH
|
||||
|
|
|
|||
|
|
@ -1888,7 +1888,8 @@ static int iov_resources_unassigned(struct pci_dev *dev, void *data)
|
|||
bool *unassigned = data;
|
||||
|
||||
for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
|
||||
struct resource *r = &dev->resource[i + PCI_IOV_RESOURCES];
|
||||
int idx = pci_resource_num_from_vf_bar(i);
|
||||
struct resource *r = &dev->resource[idx];
|
||||
struct pci_bus_region region;
|
||||
|
||||
/* Not assigned or rejected by kernel? */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue