diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2018-10-20 11:45:35 -0500 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2018-10-20 11:45:35 -0500 |
commit | eff81b6f7b1ecad7e8cdf4f44b010b54ef438864 (patch) | |
tree | 6231f738f74be610a1c649baf96f87a694436449 /drivers/pci | |
parent | 1734715493e010d034ae8d65c9a228ee7ad24a08 (diff) | |
parent | 4c243716e77d4f54e37834757ee5067e56099219 (diff) | |
download | linux-eff81b6f7b1ecad7e8cdf4f44b010b54ef438864.tar.bz2 |
Merge branch 'pci/virtualization'
- Cache VF config space size to optimize enumeration of many VFs
(KarimAllah Ahmed)
- Remove unnecessary <linux/pci-ats.h> include (Bjorn Helgaas)
* pci/virtualization:
PCI/IOV: Remove unnecessary include of <linux/pci-ats.h>
PCI/IOV: Use VF0 cached config space size for other VFs
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/iov.c | 3 | ||||
-rw-r--r-- | drivers/pci/pci.h | 1 | ||||
-rw-r--r-- | drivers/pci/probe.c | 17 |
3 files changed, 20 insertions, 1 deletions
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index c5f3cd4ed766..9616eca3182f 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c @@ -13,7 +13,6 @@ #include <linux/export.h> #include <linux/string.h> #include <linux/delay.h> -#include <linux/pci-ats.h> #include "pci.h" #define VIRTFN_ID_LEN 16 @@ -133,6 +132,8 @@ static void pci_read_vf_config_common(struct pci_dev *virtfn) &physfn->sriov->subsystem_vendor); pci_read_config_word(virtfn, PCI_SUBSYSTEM_ID, &physfn->sriov->subsystem_device); + + physfn->sriov->cfg_size = pci_cfg_space_size(virtfn); } int pci_iov_add_virtfn(struct pci_dev *dev, int id) diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 672ba4d1659e..662b7457db23 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -290,6 +290,7 @@ struct pci_sriov { u16 driver_max_VFs; /* Max num VFs driver supports */ struct pci_dev *dev; /* Lowest numbered PF */ struct pci_dev *self; /* This PF */ + u32 cfg_size; /* VF config space size */ u32 class; /* VF device */ u8 hdr_type; /* VF header type */ u16 subsystem_vendor; /* VF subsystem vendor */ diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 966641d517ba..b1c05b5054a0 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -1439,12 +1439,29 @@ static int pci_cfg_space_size_ext(struct pci_dev *dev) return PCI_CFG_SPACE_EXP_SIZE; } +#ifdef CONFIG_PCI_IOV +static bool is_vf0(struct pci_dev *dev) +{ + if (pci_iov_virtfn_devfn(dev->physfn, 0) == dev->devfn && + pci_iov_virtfn_bus(dev->physfn, 0) == dev->bus->number) + return true; + + return false; +} +#endif + int pci_cfg_space_size(struct pci_dev *dev) { int pos; u32 status; u16 class; +#ifdef CONFIG_PCI_IOV + /* Read cached value for all VFs except for VF0 */ + if (dev->is_virtfn && !is_vf0(dev)) + return dev->physfn->sriov->cfg_size; +#endif + if (dev->bus->bus_flags & PCI_BUS_FLAGS_NO_EXTCFG) return PCI_CFG_SPACE_SIZE; |