diff options
| author | Bjorn Helgaas <bhelgaas@google.com> | 2017-09-07 14:24:41 -0400 |
|---|---|---|
| committer | Bjorn Helgaas <bhelgaas@google.com> | 2017-09-07 14:24:41 -0400 |
| commit | cf2d804110d3c20dc6865ade514c44179de34855 (patch) | |
| tree | 5c2281d54c5c77ee2806ea7123beb66e99ab34b0 /drivers | |
| parent | 27e87395ae3497ebb63942150e43999c93a83ed0 (diff) | |
| parent | 0fc690a7c3f7053613dcbab6a7613bb6586d8ee2 (diff) | |
Merge branch 'pci/virtualization' into next
* pci/virtualization:
PCI: Disable VF decoding before pcibios_sriov_disable() updates resources
PCI: Add ACS quirk for APM X-Gene devices
PCI: Mark AMD Stoney GPU ATS as broken
Conflicts:
drivers/pci/quirks.c
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/pci/iov.c | 7 | ||||
| -rw-r--r-- | drivers/pci/quirks.c | 29 |
2 files changed, 33 insertions, 3 deletions
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index 120485d6f352..ac41c8be9200 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c | |||
| @@ -331,7 +331,6 @@ failed: | |||
| 331 | while (i--) | 331 | while (i--) |
| 332 | pci_iov_remove_virtfn(dev, i, 0); | 332 | pci_iov_remove_virtfn(dev, i, 0); |
| 333 | 333 | ||
| 334 | pcibios_sriov_disable(dev); | ||
| 335 | err_pcibios: | 334 | err_pcibios: |
| 336 | iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE); | 335 | iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE); |
| 337 | pci_cfg_access_lock(dev); | 336 | pci_cfg_access_lock(dev); |
| @@ -339,6 +338,8 @@ err_pcibios: | |||
| 339 | ssleep(1); | 338 | ssleep(1); |
| 340 | pci_cfg_access_unlock(dev); | 339 | pci_cfg_access_unlock(dev); |
| 341 | 340 | ||
| 341 | pcibios_sriov_disable(dev); | ||
| 342 | |||
| 342 | if (iov->link != dev->devfn) | 343 | if (iov->link != dev->devfn) |
| 343 | sysfs_remove_link(&dev->dev.kobj, "dep_link"); | 344 | sysfs_remove_link(&dev->dev.kobj, "dep_link"); |
| 344 | 345 | ||
| @@ -357,14 +358,14 @@ static void sriov_disable(struct pci_dev *dev) | |||
| 357 | for (i = 0; i < iov->num_VFs; i++) | 358 | for (i = 0; i < iov->num_VFs; i++) |
| 358 | pci_iov_remove_virtfn(dev, i, 0); | 359 | pci_iov_remove_virtfn(dev, i, 0); |
| 359 | 360 | ||
| 360 | pcibios_sriov_disable(dev); | ||
| 361 | |||
| 362 | iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE); | 361 | iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE); |
| 363 | pci_cfg_access_lock(dev); | 362 | pci_cfg_access_lock(dev); |
| 364 | pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); | 363 | pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); |
| 365 | ssleep(1); | 364 | ssleep(1); |
| 366 | pci_cfg_access_unlock(dev); | 365 | pci_cfg_access_unlock(dev); |
| 367 | 366 | ||
| 367 | pcibios_sriov_disable(dev); | ||
| 368 | |||
| 368 | if (iov->link != dev->devfn) | 369 | if (iov->link != dev->devfn) |
| 369 | sysfs_remove_link(&dev->dev.kobj, "dep_link"); | 370 | sysfs_remove_link(&dev->dev.kobj, "dep_link"); |
| 370 | 371 | ||
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 35dcd90f98c4..3821c11c9add 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -4137,6 +4137,18 @@ static int pci_quirk_cavium_acs(struct pci_dev *dev, u16 acs_flags) | |||
| 4137 | return acs_flags ? 0 : 1; | 4137 | return acs_flags ? 0 : 1; |
| 4138 | } | 4138 | } |
| 4139 | 4139 | ||
| 4140 | static int pci_quirk_xgene_acs(struct pci_dev *dev, u16 acs_flags) | ||
| 4141 | { | ||
| 4142 | /* | ||
| 4143 | * X-Gene root matching this quirk do not allow peer-to-peer | ||
| 4144 | * transactions with others, allowing masking out these bits as if they | ||
| 4145 | * were unimplemented in the ACS capability. | ||
| 4146 | */ | ||
| 4147 | acs_flags &= ~(PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF); | ||
| 4148 | |||
| 4149 | return acs_flags ? 0 : 1; | ||
| 4150 | } | ||
| 4151 | |||
| 4140 | /* | 4152 | /* |
| 4141 | * Many Intel PCH root ports do provide ACS-like features to disable peer | 4153 | * Many Intel PCH root ports do provide ACS-like features to disable peer |
| 4142 | * transactions and validate bus numbers in requests, but do not provide an | 4154 | * transactions and validate bus numbers in requests, but do not provide an |
| @@ -4385,6 +4397,8 @@ static const struct pci_dev_acs_enabled { | |||
| 4385 | { 0x10df, 0x720, pci_quirk_mf_endpoint_acs }, /* Emulex Skyhawk-R */ | 4397 | { 0x10df, 0x720, pci_quirk_mf_endpoint_acs }, /* Emulex Skyhawk-R */ |
| 4386 | /* Cavium ThunderX */ | 4398 | /* Cavium ThunderX */ |
| 4387 | { PCI_VENDOR_ID_CAVIUM, PCI_ANY_ID, pci_quirk_cavium_acs }, | 4399 | { PCI_VENDOR_ID_CAVIUM, PCI_ANY_ID, pci_quirk_cavium_acs }, |
| 4400 | /* APM X-Gene */ | ||
| 4401 | { PCI_VENDOR_ID_AMCC, 0xE004, pci_quirk_xgene_acs }, | ||
| 4388 | { 0 } | 4402 | { 0 } |
| 4389 | }; | 4403 | }; |
| 4390 | 4404 | ||
| @@ -4680,3 +4694,18 @@ static void quirk_no_ext_tags(struct pci_dev *pdev) | |||
| 4680 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0140, quirk_no_ext_tags); | 4694 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0140, quirk_no_ext_tags); |
| 4681 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0142, quirk_no_ext_tags); | 4695 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0142, quirk_no_ext_tags); |
| 4682 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0144, quirk_no_ext_tags); | 4696 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0144, quirk_no_ext_tags); |
| 4697 | |||
| 4698 | #ifdef CONFIG_PCI_ATS | ||
| 4699 | /* | ||
| 4700 | * Some devices have a broken ATS implementation causing IOMMU stalls. | ||
| 4701 | * Don't use ATS for those devices. | ||
| 4702 | */ | ||
| 4703 | static void quirk_no_ats(struct pci_dev *pdev) | ||
| 4704 | { | ||
| 4705 | dev_info(&pdev->dev, "disabling ATS (broken on this device)\n"); | ||
| 4706 | pdev->ats_cap = 0; | ||
| 4707 | } | ||
| 4708 | |||
| 4709 | /* AMD Stoney platform GPU */ | ||
| 4710 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x98e4, quirk_no_ats); | ||
| 4711 | #endif /* CONFIG_PCI_ATS */ | ||
