|
@@ -4015,6 +4015,95 @@ DECLARE_PCI_FIXUP_CLASS_EARLY(0x1797, 0x6868, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
DECLARE_PCI_FIXUP_CLASS_EARLY(0x1797, 0x6869, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
quirk_tw686x_class);
|
|
|
|
|
|
+/*
|
|
|
+ * Some devices have problems with Transaction Layer Packets with the Relaxed
|
|
|
+ * Ordering Attribute set. Such devices should mark themselves and other
|
|
|
+ * Device Drivers should check before sending TLPs with RO set.
|
|
|
+ */
|
|
|
+static void quirk_relaxedordering_disable(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ dev->dev_flags |= PCI_DEV_FLAGS_NO_RELAXED_ORDERING;
|
|
|
+ dev_info(&dev->dev, "Disable Relaxed Ordering Attributes to avoid PCIe Completion erratum\n");
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Intel Xeon processors based on Broadwell/Haswell microarchitecture Root
|
|
|
+ * Complex has a Flow Control Credit issue which can cause performance
|
|
|
+ * problems with Upstream Transaction Layer Packets with Relaxed Ordering set.
|
|
|
+ */
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f01, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f02, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f03, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f04, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f05, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f06, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f07, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f08, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f09, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0a, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0b, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0c, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0d, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0e, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f01, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f02, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f03, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f04, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f05, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f06, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f07, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f08, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f09, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0a, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0b, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0c, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0d, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0e, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+
|
|
|
+/*
|
|
|
+ * The AMD ARM A1100 (AKA "SEATTLE") SoC has a bug in its PCIe Root Complex
|
|
|
+ * where Upstream Transaction Layer Packets with the Relaxed Ordering
|
|
|
+ * Attribute clear are allowed to bypass earlier TLPs with Relaxed Ordering
|
|
|
+ * set. This is a violation of the PCIe 3.0 Transaction Ordering Rules
|
|
|
+ * outlined in Section 2.4.1 (PCI Express(r) Base Specification Revision 3.0
|
|
|
+ * November 10, 2010). As a result, on this platform we can't use Relaxed
|
|
|
+ * Ordering for Upstream TLPs.
|
|
|
+ */
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_AMD, 0x1a00, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_AMD, 0x1a01, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_AMD, 0x1a02, PCI_CLASS_NOT_DEFINED, 8,
|
|
|
+ quirk_relaxedordering_disable);
|
|
|
+
|
|
|
/*
|
|
|
* Per PCIe r3.0, sec 2.2.9, "Completion headers must supply the same
|
|
|
* values for the Attribute as were supplied in the header of the
|