2016-02-21 9:38 GMT+01:00 Heinz Diehl htd+ml@fritha.org:
Here's the same patch ported to 4.4.2, avoiding the level 2 fuzz. It applies cleanly:
[root@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 allownon-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 }
Hey mate, applying the patch at root directory of kernel 4.2.2 (downloaded from kernel.org)
cat acs_override.patch | patch -p2 patching file drivers/pci/quirks.c HUNK #2 FAILED at 4066
Here is a paste of the reject file : cat drivers/pci/quirks.c.rej --- drivers/pci/quirks.c 2016-02-17 21:31:25.000000000 +0100 +++ drivers/pci/quirks.c 2016-02-21 09:30:52.154070792 +0100 @@ -4066,6 +4168,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 }
Not appying cleanly here, did i miss something?