PCI/ATS: Cache PRI PRG Response PASID Required bit
authorBjorn Helgaas <bhelgaas@google.com>
Wed, 9 Oct 2019 21:07:51 +0000 (16:07 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 15 Oct 2019 21:39:10 +0000 (16:39 -0500)
The PRG Response PASID Required bit in the PRI Capability is read-only.
Read it once when we enumerate the device and cache the value so we don't
need to read it again.

Based-on-patch-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/ats.c
include/linux/pci.h

index d5ac808cae21ef27ce7f27b64e2cf4e248b06f4e..76ae518d55f4db7f19f846dcb61b4cadd8b0ed85 100644 (file)
@@ -161,7 +161,16 @@ EXPORT_SYMBOL_GPL(pci_ats_page_aligned);
 #ifdef CONFIG_PCI_PRI
 void pci_pri_init(struct pci_dev *pdev)
 {
+       u16 status;
+
        pdev->pri_cap = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_PRI);
+
+       if (!pdev->pri_cap)
+               return;
+
+       pci_read_config_word(pdev, pdev->pri_cap + PCI_PRI_STATUS, &status);
+       if (status & PCI_PRI_STATUS_PASID)
+               pdev->pasid_required = 1;
 }
 
 /**
@@ -301,22 +310,10 @@ EXPORT_SYMBOL_GPL(pci_reset_pri);
  */
 int pci_prg_resp_pasid_required(struct pci_dev *pdev)
 {
-       u16 status;
-       int pri;
-
        if (pdev->is_virtfn)
                pdev = pci_physfn(pdev);
 
-       pri = pdev->pri_cap;
-       if (!pri)
-               return 0;
-
-       pci_read_config_word(pdev, pri + PCI_PRI_STATUS, &status);
-
-       if (status & PCI_PRI_STATUS_PASID)
-               return 1;
-
-       return 0;
+       return pdev->pasid_required;
 }
 EXPORT_SYMBOL_GPL(pci_prg_resp_pasid_required);
 #endif /* CONFIG_PCI_PRI */
index 6542100bd2dd480129e715c442465d3b44dd250a..64d35e730fab900dd6ed4be4ed56f047974d2a22 100644 (file)
@@ -456,6 +456,7 @@ struct pci_dev {
 #ifdef CONFIG_PCI_PRI
        u16             pri_cap;        /* PRI Capability offset */
        u32             pri_reqs_alloc; /* Number of PRI requests allocated */
+       unsigned int    pasid_required:1; /* PRG Response PASID Required */
 #endif
 #ifdef CONFIG_PCI_PASID
        u16             pasid_cap;      /* PASID Capability offset */