patch listed as missing

Heinz Diehl htd+ml at fritha.org
Sun Feb 21 08:38:50 UTC 2016


On 20.02.2016, thibaut noah wrote: 

> I got the patch from here :
> https://ask.fedoraproject.org/en/question/73697/acs-override-patch-on-fedora-22/
 
> A modify version which is the most recent version of this patch i could
> find.

Here's the same patch ported to 4.4.2, avoiding the level 2 fuzz.
It applies cleanly:

[root at chiara linux-4.4.2]# cat quirk.diff | patch -p2
patching file drivers/pci/quirks.c


diff -urN a/linux-4.4.2/drivers/pci/quirks.c b/linux-4.4.2/drivers/pci/quirks.c
--- a/linux-4.4.2/drivers/pci/quirks.c	2016-02-17 21:31:25.000000000 +0100
+++ b/linux-4.4.2/drivers/pci/quirks.c	2016-02-21 09:30:52.154070792 +0100
@@ -3659,6 +3659,108 @@
 
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ADAPTEC2, 0x0285, quirk_fixed_dma_alias);
 
+static bool acs_on_downstream;
+static bool acs_on_multifunction;
+
+#define NUM_ACS_IDS 16
+struct acs_on_id {
+   unsigned short vendor;
+   unsigned short device;
+};
+static struct acs_on_id acs_on_ids[NUM_ACS_IDS];
+static u8 max_acs_id;
+
+static __init int pcie_acs_override_setup(char *p)
+{
+   if (!p)
+       return -EINVAL;
+
+   while (*p) {
+       if (!strncmp(p, "downstream", 10))
+           acs_on_downstream = true;
+       if (!strncmp(p, "multifunction", 13))
+           acs_on_multifunction = true;
+       if (!strncmp(p, "id:", 3)) {
+           char opt[5];
+           int ret;
+           long val;
+
+           if (max_acs_id >= NUM_ACS_IDS - 1) {
+               pr_warn("Out of PCIe ACS override slots (%d)\n",
+                   NUM_ACS_IDS);
+               goto next;
+           }
+
+           p += 3;
+           snprintf(opt, 5, "%s", p);
+           ret = kstrtol(opt, 16, &val);
+           if (ret) {
+               pr_warn("PCIe ACS ID parse error %d\n", ret);
+               goto next;
+           }
+           acs_on_ids[max_acs_id].vendor = val;
+
+           p += strcspn(p, ":");
+           if (*p != ':') {
+               pr_warn("PCIe ACS invalid ID\n");
+               goto next;
+           }
+
+           p++;
+           snprintf(opt, 5, "%s", p);
+           ret = kstrtol(opt, 16, &val);
+           if (ret) {
+               pr_warn("PCIe ACS ID parse error %d\n", ret);
+               goto next;
+           }
+           acs_on_ids[max_acs_id].device = val;
+           max_acs_id++;
+       }
+next:
+       p += strcspn(p, ",");
+       if (*p == ',')
+           p++;
+   }
+
+   if (acs_on_downstream || acs_on_multifunction || max_acs_id)
+       pr_warn("Warning: PCIe ACS overrides enabled; This may allow non-IOMMU protected peer-to-peer DMA\n");
+
+   return 0;
+}
+early_param("pcie_acs_override", pcie_acs_override_setup);
+
+static int pcie_acs_overrides(struct pci_dev *dev, u16 acs_flags)
+{
+   int i;
+
+   /* Never override ACS for legacy devices or devices with ACS caps */
+   if (!pci_is_pcie(dev) ||
+       pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS))
+       return -ENOTTY;
+
+   for (i = 0; i < max_acs_id; i++)
+       if (acs_on_ids[i].vendor == dev->vendor &&
+           acs_on_ids[i].device == dev->device)
+           return 1;
+
+   switch (pci_pcie_type(dev)) {
+   case PCI_EXP_TYPE_DOWNSTREAM:
+   case PCI_EXP_TYPE_ROOT_PORT:
+       if (acs_on_downstream)
+           return 1;
+       break;
+   case PCI_EXP_TYPE_ENDPOINT:
+   case PCI_EXP_TYPE_UPSTREAM:
+   case PCI_EXP_TYPE_LEG_END:
+   case PCI_EXP_TYPE_RC_END:
+       if (acs_on_multifunction && dev->multifunction)
+           return 1;
+   }
+
+   return -ENOTTY;
+}
+
+
 /*
  * A few PCIe-to-PCI bridges fail to expose a PCIe capability, resulting in
  * using the wrong DMA alias for the device.  Some of these devices can be
@@ -3964,6 +4066,7 @@
 	{ PCI_VENDOR_ID_INTEL, 0x15b8, pci_quirk_mf_endpoint_acs },
 	/* Intel PCH root ports */
 	{ PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_quirk_intel_pch_acs },
+	{ PCI_ANY_ID, PCI_ANY_ID, pcie_acs_overrides },
 	{ 0x19a2, 0x710, pci_quirk_mf_endpoint_acs }, /* Emulex BE3-R */
 	{ 0x10df, 0x720, pci_quirk_mf_endpoint_acs }, /* Emulex Skyhawk-R */
 	{ 0 }


More information about the users mailing list