aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Williamson <alex.williamson@redhat.com>2017-01-19 10:51:30 -0500
committerBjorn Helgaas <bhelgaas@google.com>2017-01-28 15:46:02 -0500
commit7184f5b451cf3dc61de79091d235b5d2bba2782d (patch)
tree4d561b92857246fb58dd73bea5d983d0448c0b21
parent7ce7d89f48834cefece7804d38fc5d85382edf77 (diff)
PCI: Add ACS quirk for Intel Union Point
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>
-rw-r--r--drivers/pci/quirks.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 1800befa8b8b..a0b3cd5726dc 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -4150,15 +4150,35 @@ static int pci_quirk_intel_pch_acs(struct pci_dev *dev, u16 acs_flags)
4150 * 4150 *
4151 * N.B. This doesn't fix what lspci shows. 4151 * N.B. This doesn't fix what lspci shows.
4152 * 4152 *
4153 * The 100 series chipset specification update includes this as errata #23[3].
4154 *
4155 * The 200 series chipset (Union Point) has the same bug according to the
4156 * specification update (Intel 200 Series Chipset Family Platform Controller
4157 * Hub, Specification Update, January 2017, Revision 001, Document# 335194-001,
4158 * Errata 22)[4]. Per the datasheet[5], root port PCI Device IDs for this
4159 * chipset include:
4160 *
4161 * 0xa290-0xa29f PCI Express Root port #{0-16}
4162 * 0xa2e7-0xa2ee PCI Express Root port #{17-24}
4163 *
4153 * [1] http://www.intel.com/content/www/us/en/chipsets/100-series-chipset-datasheet-vol-2.html 4164 * [1] http://www.intel.com/content/www/us/en/chipsets/100-series-chipset-datasheet-vol-2.html
4154 * [2] http://www.intel.com/content/www/us/en/chipsets/100-series-chipset-datasheet-vol-1.html 4165 * [2] http://www.intel.com/content/www/us/en/chipsets/100-series-chipset-datasheet-vol-1.html
4166 * [3] http://www.intel.com/content/www/us/en/chipsets/100-series-chipset-spec-update.html
4167 * [4] http://www.intel.com/content/www/us/en/chipsets/200-series-chipset-pch-spec-update.html
4168 * [5] http://www.intel.com/content/www/us/en/chipsets/200-series-chipset-pch-datasheet-vol-1.html
4155 */ 4169 */
4156static bool pci_quirk_intel_spt_pch_acs_match(struct pci_dev *dev) 4170static bool pci_quirk_intel_spt_pch_acs_match(struct pci_dev *dev)
4157{ 4171{
4158 return pci_is_pcie(dev) && 4172 if (!pci_is_pcie(dev) || pci_pcie_type(dev) != PCI_EXP_TYPE_ROOT_PORT)
4159 pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT && 4173 return false;
4160 ((dev->device & ~0xf) == 0xa110 || 4174
4161 (dev->device >= 0xa167 && dev->device <= 0xa16a)); 4175 switch (dev->device) {
4176 case 0xa110 ... 0xa11f: case 0xa167 ... 0xa16a: /* Sunrise Point */
4177 case 0xa290 ... 0xa29f: case 0xa2e7 ... 0xa2ee: /* Union Point */
4178 return true;
4179 }
4180
4181 return false;
4162} 4182}
4163 4183
4164#define INTEL_SPT_ACS_CTRL (PCI_ACS_CAP + 4) 4184#define INTEL_SPT_ACS_CTRL (PCI_ACS_CAP + 4)