History

PCI: Cache ACS capability offset in device

Currently the ACS capability is being looked up at a number of places. Read and store it once at enumeration so that it can be used by all later. No functional change intended.

Rajat Jain committed 6 years ago

Commit 52fbf5b1 parent cbe42036 files · +24 −11Browse files

Unified · Split

6 files
  1. drivers/pci/p2pdma.c +1 −1
  2. drivers/pci/pci.c +16 −4
  3. drivers/pci/pci.h +1 −1
  4. drivers/pci/probe.c +1 −1
  5. drivers/pci/quirks.c +4 −4
  6. include/linux/pci.h +1 −0
drivers/pci/p2pdma.c+1−1
@@ -253,7 +253,7 @@ static int pci_bridge_has_acs_redir(struct pci_dev *pdev) · 252 unmodified lines
253 int pos;253 int pos;
254 u16 ctrl;254 u16 ctrl;
255 255
256 pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ACS);256 pos = pdev->acs_cap;
257 if (!pos)257 if (!pos)
258 return 0;258 return 0;
259 259
drivers/pci/pci.c+16−4
@@ -831,7 +831,7 @@ static void pci_disable_acs_redir(struct pci_dev *dev) · 830 unmodified lines
831 if (!pci_dev_specific_disable_acs_redir(dev))831 if (!pci_dev_specific_disable_acs_redir(dev))
832 return;832 return;
833 833
834 pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS);834 pos = dev->acs_cap;
835 if (!pos) {835 if (!pos) {
836 pci_warn(dev, "cannot disable ACS redirect for this hardware as it does not have ACS capabilities\n");836 pci_warn(dev, "cannot disable ACS redirect for this hardware as it does not have ACS capabilities\n");
837 return;837 return;
@@ -857,7 +857,7 @@ static void pci_std_enable_acs(struct pci_dev *dev) · 19 unmodified lines
857 u16 cap;857 u16 cap;
858 u16 ctrl;858 u16 ctrl;
859 859
860 pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS);860 pos = dev->acs_cap;
861 if (!pos)861 if (!pos)
862 return;862 return;
863 863
@@ -883,7 +883,7 @@ static void pci_std_enable_acs(struct pci_dev *dev) · 19 unmodified lines
883 * pci_enable_acs - enable ACS if hardware support it883 * pci_enable_acs - enable ACS if hardware support it
884 * @dev: the PCI device884 * @dev: the PCI device
885 */885 */
886void pci_enable_acs(struct pci_dev *dev)886static void pci_enable_acs(struct pci_dev *dev)
887{887{
888 if (!pci_acs_enable)888 if (!pci_acs_enable)
889 goto disable_acs_redir;889 goto disable_acs_redir;
@@ -3362,7 +3362,7 @@ static bool pci_acs_flags_enabled(struct pci_dev *pdev, u16 acs_flags) · 2472 unmodified lines
3362 int pos;3362 int pos;
3363 u16 cap, ctrl;3363 u16 cap, ctrl;
3364 3364
3365 pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ACS);3365 pos = pdev->acs_cap;
3366 if (!pos)3366 if (!pos)
3367 return false;3367 return false;
3368 3368
@@ -3487,6 +3487,18 @@ bool pci_acs_path_enabled(struct pci_dev *start, · 118 unmodified lines
3487 return true;3487 return true;
3488}3488}
3489 3489
3490/**
3491 * pci_acs_init - Initialize ACS if hardware supports it
3492 * @dev: the PCI device
3493 */
3494void pci_acs_init(struct pci_dev *dev)
3495{
3496 dev->acs_cap = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS);
3497
3498 if (dev->acs_cap)
3499 pci_enable_acs(dev);
3500}
3501
3490/**3502/**
3491 * pci_rebar_find_pos - find position of resize ctrl reg for BAR3503 * pci_rebar_find_pos - find position of resize ctrl reg for BAR
3492 * @pdev: PCI device3504 * @pdev: PCI device
drivers/pci/pci.h+1−1
@@ -532,7 +532,7 @@ static inline resource_size_t pci_resource_alignment(struct pci_dev *dev, · 531 unmodified lines
532 return resource_alignment(res);532 return resource_alignment(res);
533}533}
534 534
535void pci_enable_acs(struct pci_dev *dev);535void pci_acs_init(struct pci_dev *dev);
536#ifdef CONFIG_PCI_QUIRKS536#ifdef CONFIG_PCI_QUIRKS
537int pci_dev_specific_acs_enabled(struct pci_dev *dev, u16 acs_flags);537int pci_dev_specific_acs_enabled(struct pci_dev *dev, u16 acs_flags);
538int pci_dev_specific_enable_acs(struct pci_dev *dev);538int pci_dev_specific_enable_acs(struct pci_dev *dev);
drivers/pci/probe.c+1−1
@@ -2390,7 +2390,7 @@ static void pci_init_capabilities(struct pci_dev *dev) · 2389 unmodified lines
2390 pci_ats_init(dev); /* Address Translation Services */2390 pci_ats_init(dev); /* Address Translation Services */
2391 pci_pri_init(dev); /* Page Request Interface */2391 pci_pri_init(dev); /* Page Request Interface */
2392 pci_pasid_init(dev); /* Process Address Space ID */2392 pci_pasid_init(dev); /* Process Address Space ID */
2393 pci_enable_acs(dev); /* Enable ACS P2P upstream forwarding */2393 pci_acs_init(dev); /* Access Control Services */
2394 pci_ptm_init(dev); /* Precision Time Measurement */2394 pci_ptm_init(dev); /* Precision Time Measurement */
2395 pci_aer_init(dev); /* Advanced Error Reporting */2395 pci_aer_init(dev); /* Advanced Error Reporting */
2396 pci_dpc_init(dev); /* Downstream Port Containment */2396 pci_dpc_init(dev); /* Downstream Port Containment */
drivers/pci/quirks.c+4−4
@@ -4653,7 +4653,7 @@ static int pci_quirk_intel_spt_pch_acs(struct pci_dev *dev, u16 acs_flags) · 4652 unmodified lines
4653 if (!pci_quirk_intel_spt_pch_acs_match(dev))4653 if (!pci_quirk_intel_spt_pch_acs_match(dev))
4654 return -ENOTTY;4654 return -ENOTTY;
4655 4655
4656 pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS);4656 pos = dev->acs_cap;
4657 if (!pos)4657 if (!pos)
4658 return -ENOTTY;4658 return -ENOTTY;
4659 4659
@@ -4961,7 +4961,7 @@ static int pci_quirk_enable_intel_spt_pch_acs(struct pci_dev *dev) · 301 unmodified lines
4961 if (!pci_quirk_intel_spt_pch_acs_match(dev))4961 if (!pci_quirk_intel_spt_pch_acs_match(dev))
4962 return -ENOTTY;4962 return -ENOTTY;
4963 4963
4964 pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS);4964 pos = dev->acs_cap;
4965 if (!pos)4965 if (!pos)
4966 return -ENOTTY;4966 return -ENOTTY;
4967 4967
@@ -4988,7 +4988,7 @@ static int pci_quirk_disable_intel_spt_pch_acs_redir(struct pci_dev *dev) · 20 unmodified lines
4988 if (!pci_quirk_intel_spt_pch_acs_match(dev))4988 if (!pci_quirk_intel_spt_pch_acs_match(dev))
4989 return -ENOTTY;4989 return -ENOTTY;
4990 4990
4991 pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS);4991 pos = dev->acs_cap;
4992 if (!pos)4992 if (!pos)
4993 return -ENOTTY;4993 return -ENOTTY;
4994 4994
@@ -5355,7 +5355,7 @@ int pci_idt_bus_quirk(struct pci_bus *bus, int devfn, u32 *l, int timeout) · 360 unmodified lines
5355 bool found;5355 bool found;
5356 struct pci_dev *bridge = bus->self;5356 struct pci_dev *bridge = bus->self;
5357 5357
5358 pos = pci_find_ext_capability(bridge, PCI_EXT_CAP_ID_ACS);5358 pos = bridge->acs_cap;
5359 5359
5360 /* Disable ACS SV before initial config reads */5360 /* Disable ACS SV before initial config reads */
5361 if (pos) {5361 if (pos) {
include/linux/pci.h+1−0
@@ -486,6 +486,7 @@ struct pci_dev { · 485 unmodified lines
486#ifdef CONFIG_PCI_P2PDMA486#ifdef CONFIG_PCI_P2PDMA
487 struct pci_p2pdma *p2pdma;487 struct pci_p2pdma *p2pdma;
488#endif488#endif
489 u16 acs_cap; /* ACS Capability offset */
489 phys_addr_t rom; /* Physical address if not from BAR */490 phys_addr_t rom; /* Physical address if not from BAR */
490 size_t romlen; /* Length if not from BAR */491 size_t romlen; /* Length if not from BAR */
491 char *driver_override; /* Driver name to force a match */492 char *driver_override; /* Driver name to force a match */