Commit dfcc8d45 authored by Wei Yang's avatar Wei Yang Committed by Michael Ellerman

powerpc/powernv: boundary the total VF BAR size instead of the individual one

Each VF could have 6 BARs at most. When the total BAR size exceeds the
gate, after expanding it will also exhaust the M64 Window.

This patch limits the boundary by checking the total VF BAR size instead of
the individual BAR.
Signed-off-by: default avatarWei Yang <weiyang@linux.vnet.ibm.com>
Reviewed-by: default avatarGavin Shan <gwshan@linux.vnet.ibm.com>
Acked-by: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent f2dd0afe
...@@ -2803,7 +2803,7 @@ static void pnv_pci_ioda_fixup_iov_resources(struct pci_dev *pdev) ...@@ -2803,7 +2803,7 @@ static void pnv_pci_ioda_fixup_iov_resources(struct pci_dev *pdev)
const resource_size_t gate = phb->ioda.m64_segsize >> 2; const resource_size_t gate = phb->ioda.m64_segsize >> 2;
struct resource *res; struct resource *res;
int i; int i;
resource_size_t size; resource_size_t size, total_vf_bar_sz;
struct pci_dn *pdn; struct pci_dn *pdn;
int mul, total_vfs; int mul, total_vfs;
...@@ -2816,6 +2816,7 @@ static void pnv_pci_ioda_fixup_iov_resources(struct pci_dev *pdev) ...@@ -2816,6 +2816,7 @@ static void pnv_pci_ioda_fixup_iov_resources(struct pci_dev *pdev)
total_vfs = pci_sriov_get_totalvfs(pdev); total_vfs = pci_sriov_get_totalvfs(pdev);
mul = phb->ioda.total_pe; mul = phb->ioda.total_pe;
total_vf_bar_sz = 0;
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];
...@@ -2828,7 +2829,8 @@ static void pnv_pci_ioda_fixup_iov_resources(struct pci_dev *pdev) ...@@ -2828,7 +2829,8 @@ static void pnv_pci_ioda_fixup_iov_resources(struct pci_dev *pdev)
goto truncate_iov; goto truncate_iov;
} }
size = pci_iov_resource_size(pdev, i + PCI_IOV_RESOURCES); total_vf_bar_sz += pci_iov_resource_size(pdev,
i + PCI_IOV_RESOURCES);
/* /*
* If bigger than quarter of M64 segment size, just round up * If bigger than quarter of M64 segment size, just round up
...@@ -2842,11 +2844,11 @@ static void pnv_pci_ioda_fixup_iov_resources(struct pci_dev *pdev) ...@@ -2842,11 +2844,11 @@ static void pnv_pci_ioda_fixup_iov_resources(struct pci_dev *pdev)
* limit the system flexibility. This is a design decision to * limit the system flexibility. This is a design decision to
* set the boundary to quarter of the M64 segment size. * set the boundary to quarter of the M64 segment size.
*/ */
if (size > gate) { if (total_vf_bar_sz > gate) {
dev_info(&pdev->dev, "PowerNV: VF BAR%d: %pR IOV size "
"is bigger than %lld, roundup power2\n",
i, res, gate);
mul = roundup_pow_of_two(total_vfs); mul = roundup_pow_of_two(total_vfs);
dev_info(&pdev->dev,
"VF BAR Total IOV size %llx > %llx, roundup to %d VFs\n",
total_vf_bar_sz, gate, mul);
pdn->m64_single_mode = true; pdn->m64_single_mode = true;
break; break;
} }
......
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