|
@@ -647,6 +647,15 @@ void of_pci_parse_iov_addrs(struct pci_dev *dev, const int *indexes)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void pseries_disable_sriov_resources(struct pci_dev *pdev)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ pci_warn(pdev, "No hypervisor support for SR-IOV on this device, IOV BARs disabled.\n");
|
|
|
+ for (i = 0; i < PCI_SRIOV_NUM_BARS; i++)
|
|
|
+ pdev->resource[i + PCI_IOV_RESOURCES].flags = 0;
|
|
|
+}
|
|
|
+
|
|
|
static void pseries_pci_fixup_resources(struct pci_dev *pdev)
|
|
|
{
|
|
|
const int *indexes;
|
|
@@ -654,10 +663,10 @@ static void pseries_pci_fixup_resources(struct pci_dev *pdev)
|
|
|
|
|
|
/*Firmware must support open sriov otherwise dont configure*/
|
|
|
indexes = of_get_property(dn, "ibm,open-sriov-vf-bar-info", NULL);
|
|
|
- if (!indexes)
|
|
|
- return;
|
|
|
- /* Assign the addresses from device tree*/
|
|
|
- of_pci_set_vf_bar_size(pdev, indexes);
|
|
|
+ if (indexes)
|
|
|
+ of_pci_set_vf_bar_size(pdev, indexes);
|
|
|
+ else
|
|
|
+ pseries_disable_sriov_resources(pdev);
|
|
|
}
|
|
|
|
|
|
static void pseries_pci_fixup_iov_resources(struct pci_dev *pdev)
|
|
@@ -669,10 +678,10 @@ static void pseries_pci_fixup_iov_resources(struct pci_dev *pdev)
|
|
|
return;
|
|
|
/*Firmware must support open sriov otherwise dont configure*/
|
|
|
indexes = of_get_property(dn, "ibm,open-sriov-vf-bar-info", NULL);
|
|
|
- if (!indexes)
|
|
|
- return;
|
|
|
- /* Assign the addresses from device tree*/
|
|
|
- of_pci_parse_iov_addrs(pdev, indexes);
|
|
|
+ if (indexes)
|
|
|
+ of_pci_parse_iov_addrs(pdev, indexes);
|
|
|
+ else
|
|
|
+ pseries_disable_sriov_resources(pdev);
|
|
|
}
|
|
|
|
|
|
static resource_size_t pseries_pci_iov_resource_alignment(struct pci_dev *pdev,
|