History

PCI/ATS: Cache PRI PRG Response PASID Required bit

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.

Bjorn Helgaas committed 7 years ago

Commit e5adf791 parent 751035b2 files · +11 −13Browse files

Unified · Split

2 files
  1. drivers/pci/ats.c +10 −13
  2. include/linux/pci.h +1 −0
drivers/pci/ats.c+10−13
@@ -161,7 +161,16 @@ EXPORT_SYMBOL_GPL(pci_ats_page_aligned); · 160 unmodified lines
161161 #ifdef CONFIG_PCI_PRI
162162 void pci_pri_init(struct pci_dev *pdev)
163163 {
164+ u16 status;
165+
164166 pdev->pri_cap = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_PRI);
167+
168+ if (!pdev->pri_cap)
169+ return;
170+
171+ pci_read_config_word(pdev, pdev->pri_cap + PCI_PRI_STATUS, &status);
172+ if (status & PCI_PRI_STATUS_PASID)
173+ pdev->pasid_required = 1;
165174 }
166175
167176 /**
@@ -301,22 +310,10 @@ EXPORT_SYMBOL_GPL(pci_reset_pri); · 133 unmodified lines
301310 */
302311 int pci_prg_resp_pasid_required(struct pci_dev *pdev)
303312 {
304− u16 status;
305− int pri;
306−
307313 if (pdev->is_virtfn)
308314 pdev = pci_physfn(pdev);
309315
310− pri = pdev->pri_cap;
311− if (!pri)
312− return 0;
313−
314− pci_read_config_word(pdev, pri + PCI_PRI_STATUS, &status);
315−
316− if (status & PCI_PRI_STATUS_PASID)
317− return 1;
318−
319− return 0;
316+ return pdev->pasid_required;
320317 }
321318 EXPORT_SYMBOL_GPL(pci_prg_resp_pasid_required);
322319 #endif /* CONFIG_PCI_PRI */
include/linux/pci.h+1−0
@@ -456,6 +456,7 @@ struct pci_dev { · 455 unmodified lines
456456 #ifdef CONFIG_PCI_PRI
457457 u16 pri_cap; /* PRI Capability offset */
458458 u32 pri_reqs_alloc; /* Number of PRI requests allocated */
459+ unsigned int pasid_required:1; /* PRG Response PASID Required */
459460 #endif
460461 #ifdef CONFIG_PCI_PASID
461462 u16 pasid_cap; /* PASID Capability offset */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t