diff options
author | Alex Williamson <alex.williamson@redhat.com> | 2017-04-04 15:32:26 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-04-12 06:41:20 -0400 |
commit | f36d3f1fe79e3cbf9af18434b3b2800e6a210cf4 (patch) | |
tree | 9359b04fec6429944867b959a944235c3cb9d61a | |
parent | a452e4eb6ee2cee7a062c3c3fca3b3ec0956e08d (diff) |
PCI: Add ACS quirk for Intel Union Point
[ Upstream commit 7184f5b451cf3dc61de79091d235b5d2bba2782d ]
Intel 200-series chipsets have the same errata as 100-series: the ACS
capability doesn't follow the PCIe spec, the capability and control
registers are dwords rather than words. Add PCIe root port device IDs to
existing quirk.
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/pci/quirks.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 585131a77f6f..19a35fadc346 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -4151,15 +4151,35 @@ static int pci_quirk_intel_pch_acs(struct pci_dev *dev, u16 acs_flags) | |||
4151 | * | 4151 | * |
4152 | * N.B. This doesn't fix what lspci shows. | 4152 | * N.B. This doesn't fix what lspci shows. |
4153 | * | 4153 | * |
4154 | * The 100 series chipset specification update includes this as errata #23[3]. | ||
4155 | * | ||
4156 | * The 200 series chipset (Union Point) has the same bug according to the | ||
4157 | * specification update (Intel 200 Series Chipset Family Platform Controller | ||
4158 | * Hub, Specification Update, January 2017, Revision 001, Document# 335194-001, | ||
4159 | * Errata 22)[4]. Per the datasheet[5], root port PCI Device IDs for this | ||
4160 | * chipset include: | ||
4161 | * | ||
4162 | * 0xa290-0xa29f PCI Express Root port #{0-16} | ||
4163 | * 0xa2e7-0xa2ee PCI Express Root port #{17-24} | ||
4164 | * | ||
4154 | * [1] http://www.intel.com/content/www/us/en/chipsets/100-series-chipset-datasheet-vol-2.html | 4165 | * [1] http://www.intel.com/content/www/us/en/chipsets/100-series-chipset-datasheet-vol-2.html |
4155 | * [2] http://www.intel.com/content/www/us/en/chipsets/100-series-chipset-datasheet-vol-1.html | 4166 | * [2] http://www.intel.com/content/www/us/en/chipsets/100-series-chipset-datasheet-vol-1.html |
4167 | * [3] http://www.intel.com/content/www/us/en/chipsets/100-series-chipset-spec-update.html | ||
4168 | * [4] http://www.intel.com/content/www/us/en/chipsets/200-series-chipset-pch-spec-update.html | ||
4169 | * [5] http://www.intel.com/content/www/us/en/chipsets/200-series-chipset-pch-datasheet-vol-1.html | ||
4156 | */ | 4170 | */ |
4157 | static bool pci_quirk_intel_spt_pch_acs_match(struct pci_dev *dev) | 4171 | static bool pci_quirk_intel_spt_pch_acs_match(struct pci_dev *dev) |
4158 | { | 4172 | { |
4159 | return pci_is_pcie(dev) && | 4173 | if (!pci_is_pcie(dev) || pci_pcie_type(dev) != PCI_EXP_TYPE_ROOT_PORT) |
4160 | pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT && | 4174 | return false; |
4161 | ((dev->device & ~0xf) == 0xa110 || | 4175 | |
4162 | (dev->device >= 0xa167 && dev->device <= 0xa16a)); | 4176 | switch (dev->device) { |
4177 | case 0xa110 ... 0xa11f: case 0xa167 ... 0xa16a: /* Sunrise Point */ | ||
4178 | case 0xa290 ... 0xa29f: case 0xa2e7 ... 0xa2ee: /* Union Point */ | ||
4179 | return true; | ||
4180 | } | ||
4181 | |||
4182 | return false; | ||
4163 | } | 4183 | } |
4164 | 4184 | ||
4165 | #define INTEL_SPT_ACS_CTRL (PCI_ACS_CAP + 4) | 4185 | #define INTEL_SPT_ACS_CTRL (PCI_ACS_CAP + 4) |