Commit a0be516f authored by Oliver O'Halloran's avatar Oliver O'Halloran Committed by Michael Ellerman

powerpc/powernv/sriov: Refactor M64 BAR setup

Split up the logic so that we have one branch that handles setting up a
segmented window and another that handles setting up single PE windows for
each VF.
Signed-off-by: default avatarOliver O'Halloran <oohall@gmail.com>
Reviewed-by: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200722065715.1432738-14-oohall@gmail.com
parent 39efc03e
...@@ -437,52 +437,49 @@ static int pnv_pci_vf_assign_m64(struct pci_dev *pdev, u16 num_vfs) ...@@ -437,52 +437,49 @@ static int pnv_pci_vf_assign_m64(struct pci_dev *pdev, u16 num_vfs)
struct resource *res; struct resource *res;
int i, j; int i, j;
int64_t rc; int64_t rc;
int total_vfs;
resource_size_t size, start; resource_size_t size, start;
int m64_bars; int base_pe_num;
phb = pci_bus_to_pnvhb(pdev->bus); phb = pci_bus_to_pnvhb(pdev->bus);
iov = pnv_iov_get(pdev); iov = pnv_iov_get(pdev);
total_vfs = pci_sriov_get_totalvfs(pdev);
if (iov->m64_single_mode)
m64_bars = num_vfs;
else
m64_bars = 1;
for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
res = &pdev->resource[i + PCI_IOV_RESOURCES]; res = &pdev->resource[i + PCI_IOV_RESOURCES];
if (!res->flags || !res->parent) if (!res->flags || !res->parent)
continue; continue;
for (j = 0; j < m64_bars; j++) { /* don't need single mode? map everything in one go! */
if (!iov->m64_single_mode) {
win = pnv_pci_alloc_m64_bar(phb, iov); win = pnv_pci_alloc_m64_bar(phb, iov);
if (win < 0) if (win < 0)
goto m64_failed; goto m64_failed;
if (iov->m64_single_mode) { size = resource_size(res);
int pe_num = iov->vf_pe_arr[j].pe_number; start = res->start;
size = pci_iov_resource_size(pdev,
PCI_IOV_RESOURCES + i);
start = res->start + size * j;
rc = pnv_ioda_map_m64_single(phb, win,
pe_num,
start,
size);
} else {
size = resource_size(res);
start = res->start;
rc = pnv_ioda_map_m64_segmented(phb, win, start,
size);
}
if (rc != OPAL_SUCCESS) { rc = pnv_ioda_map_m64_segmented(phb, win, start, size);
dev_err(&pdev->dev, "Failed to map M64 window #%d: %lld\n", if (rc)
win, rc); goto m64_failed;
continue;
}
/* otherwise map each VF with single PE BARs */
size = pci_iov_resource_size(pdev, PCI_IOV_RESOURCES + i);
base_pe_num = iov->vf_pe_arr[0].pe_number;
for (j = 0; j < num_vfs; j++) {
win = pnv_pci_alloc_m64_bar(phb, iov);
if (win < 0)
goto m64_failed;
start = res->start + size * j;
rc = pnv_ioda_map_m64_single(phb, win,
base_pe_num + j,
start,
size);
if (rc)
goto m64_failed; goto m64_failed;
}
} }
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment