@@ -21,6 +21,15 @@ static void pci_pri_init(struct pci_dev *pdev)
#ifdef CONFIG_PCI_PRI
int pos;
+ /*
+ * As per PCIe r4.0, sec 9.3.7.11, only PF is permitted to
+ * implement PRI and all associated VFs can only use it.
+ * Since PF already initialized the PRI parameters there is
+ * no need to proceed further.
+ */
+ if (pdev->is_virtfn)
+ return;
+
pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_PRI);
if (!pos)
return;
@@ -210,6 +219,20 @@ int pci_enable_pri(struct pci_dev *pdev, u32 reqs)
{
u16 control, status;
u32 max_requests;
+ struct pci_dev *pf = pci_physfn(pdev);
+
+ /*
+ * IOMMU is the only user of this function and as per
+ * current usage, PF PRI enable always happens before
+ * VF and hence we don't need to do anything special
+ * for VF. So just return success if PRI is enabled in PF.
+ */
+ if (pdev->is_virtfn) {
+ if (pf->pri_enabled)
+ return 0;
+ else
+ return -EINVAL;
+ }
if (WARN_ON(pdev->pri_enabled))
return -EBUSY;
@@ -246,6 +269,14 @@ void pci_disable_pri(struct pci_dev *pdev)
{
u16 control;
+ /*
+ * As per PCIe r4.0, sec 9.3.7.11, only PF is permitted to
+ * implement PRI and all associated VFs can only use it.
+ * So don't do anything for VF and just return.
+ */
+ if (pdev->is_virtfn)
+ return;
+
if (WARN_ON(!pdev->pri_enabled))
return;
@@ -269,6 +300,9 @@ void pci_restore_pri_state(struct pci_dev *pdev)
u16 control = PCI_PRI_CTRL_ENABLE;
u32 reqs = pdev->pri_reqs_alloc;
+ if (pdev->is_virtfn)
+ return;
+
if (!pdev->pri_enabled)
return;
@@ -291,6 +325,9 @@ int pci_reset_pri(struct pci_dev *pdev)
{
u16 control;
+ if (pdev->is_virtfn)
+ return 0;
+
if (WARN_ON(pdev->pri_enabled))
return -EBUSY;
@@ -427,11 +464,12 @@ EXPORT_SYMBOL_GPL(pci_pasid_features);
int pci_prg_resp_pasid_required(struct pci_dev *pdev)
{
u16 status;
+ struct pci_dev *pf = pci_physfn(pdev);
- if (!pdev->pri_cap)
+ if (!pf->pri_cap)
return 0;
- pci_read_config_word(pdev, pdev->pri_cap + PCI_PRI_STATUS, &status);
+ pci_read_config_word(pf, pf->pri_cap + PCI_PRI_STATUS, &status);
if (status & PCI_PRI_STATUS_PASID)
return 1;