layerscape: remove support for kernel 4.14
[openwrt/staging/dedeckeh.git] / target / linux / layerscape / patches-4.14 / 202-core-linux-support-layerscape.patch
diff --git a/target/linux/layerscape/patches-4.14/202-core-linux-support-layerscape.patch b/target/linux/layerscape/patches-4.14/202-core-linux-support-layerscape.patch
deleted file mode 100644 (file)
index 07fc71f..0000000
+++ /dev/null
@@ -1,1056 +0,0 @@
-From d2ef9f2f6d16d34d7eee74cb8efd269341fec5a1 Mon Sep 17 00:00:00 2001
-From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 6 May 2019 16:54:17 +0800
-Subject: [PATCH] core-linux: support layerscape
-
-This is an integrated patch of core-linux for layerscape
-
-Signed-off-by: Aaron Lu <aaron.lu@intel.com>
-Signed-off-by: Abhijit Ayarekar <abhijit.ayarekar@caviumnetworks.com>
-Signed-off-by: Amrita Kumari <amrita.kumari@nxp.com>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Ashish Kumar <Ashish.Kumar@nxp.com>
-Signed-off-by: Biwen Li <biwen.li@nxp.com>
-Signed-off-by: Camelia Groza <camelia.groza@nxp.com>
-Signed-off-by: Christoph Hellwig <hch@lst.de>
-Signed-off-by: David Ahern <dsahern@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Signed-off-by: Guanhua Gao <guanhua.gao@nxp.com>
-Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
-Signed-off-by: Jiri Pirko <jiri@mellanox.com>
-Signed-off-by: Joel Fernandes <joelaf@google.com>
-Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com>
-Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-Signed-off-by: Li Yang <leoyang.li@nxp.com>
-Signed-off-by: Lukas Wunner <lukas@wunner.de>
-Signed-off-by: Madalin Bucur <madalin.bucur@nxp.com>
-Signed-off-by: Mark Brown <broonie@kernel.org>
-Signed-off-by: Nikhil Badola <nikhil.badola@freescale.com>
-Signed-off-by: Nipun Gupta <nipun.gupta@nxp.com>
-Signed-off-by: Pankaj Bansal <pankaj.bansal@nxp.com>
-Signed-off-by: pascal paillet <p.paillet@st.com>
-Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-Signed-off-by: Ramneek Mehresh <ramneek.mehresh@freescale.com>
-Signed-off-by: Robin Murphy <robin.murphy@arm.com>
-Signed-off-by: Suresh Gupta <suresh.gupta@freescale.com>
-Signed-off-by: Vivek Gautam <vivek.gautam@codeaurora.org>
-Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
----
- drivers/base/core.c                       | 122 ++++++++++++++++++++++++++----
- drivers/base/dma-mapping.c                |   7 ++
- drivers/gpu/ipu-v3/ipu-pre.c              |   3 +-
- drivers/gpu/ipu-v3/ipu-prg.c              |   3 +-
- drivers/iommu/dma-iommu.c                 |   3 +
- drivers/mux/Kconfig                       |  12 +--
- drivers/mux/mmio.c                        |   6 +-
- drivers/of/device.c                       |  14 +++-
- drivers/soc/imx/gpc.c                     |   2 +-
- include/linux/device.h                    |  20 +++--
- include/linux/fsl_devices.h               |   2 +
- include/linux/netdevice.h                 |  10 ++-
- include/linux/skbuff.h                    |   2 +
- lib/dma-noop.c                            |  19 +++++
- mm/page_alloc.c                           |  10 ++-
- net/core/dev.c                            |  81 ++++++++++++--------
- net/core/skbuff.c                         |  29 ++++++-
- samples/bpf/Makefile                      |  12 ++-
- samples/bpf/map_perf_test_kern.c          |   2 +-
- samples/bpf/map_perf_test_user.c          |   2 +-
- tools/testing/selftests/bpf/bpf_helpers.h |  56 ++++++++++++--
- 21 files changed, 337 insertions(+), 80 deletions(-)
-
---- a/drivers/base/core.c
-+++ b/drivers/base/core.c
-@@ -162,10 +162,10 @@ static int device_reorder_to_tail(struct
-  * of the link.  If DL_FLAG_PM_RUNTIME is not set, DL_FLAG_RPM_ACTIVE will be
-  * ignored.
-  *
-- * If the DL_FLAG_AUTOREMOVE is set, the link will be removed automatically
-- * when the consumer device driver unbinds from it.  The combination of both
-- * DL_FLAG_AUTOREMOVE and DL_FLAG_STATELESS set is invalid and will cause NULL
-- * to be returned.
-+ * If the DL_FLAG_AUTOREMOVE_CONSUMER is set, the link will be removed
-+ * automatically when the consumer device driver unbinds from it.
-+ * The combination of both DL_FLAG_AUTOREMOVE_CONSUMER and DL_FLAG_STATELESS
-+ * set is invalid and will cause NULL to be returned.
-  *
-  * A side effect of the link creation is re-ordering of dpm_list and the
-  * devices_kset list by moving the consumer device and all devices depending
-@@ -183,7 +183,8 @@ struct device_link *device_link_add(stru
-       bool rpm_put_supplier = false;
-       if (!consumer || !supplier ||
--          ((flags & DL_FLAG_STATELESS) && (flags & DL_FLAG_AUTOREMOVE)))
-+          ((flags & DL_FLAG_STATELESS) &&
-+           (flags & DL_FLAG_AUTOREMOVE_CONSUMER)))
-               return NULL;
-       if (flags & DL_FLAG_PM_RUNTIME && flags & DL_FLAG_RPM_ACTIVE) {
-@@ -209,8 +210,10 @@ struct device_link *device_link_add(stru
-       }
-       list_for_each_entry(link, &supplier->links.consumers, s_node)
--              if (link->consumer == consumer)
-+              if (link->consumer == consumer) {
-+                      kref_get(&link->kref);
-                       goto out;
-+              }
-       link = kzalloc(sizeof(*link), GFP_KERNEL);
-       if (!link)
-@@ -237,6 +240,7 @@ struct device_link *device_link_add(stru
-       link->consumer = consumer;
-       INIT_LIST_HEAD(&link->c_node);
-       link->flags = flags;
-+      kref_init(&link->kref);
-       /* Determine the initial link state. */
-       if (flags & DL_FLAG_STATELESS) {
-@@ -311,8 +315,10 @@ static void __device_link_free_srcu(stru
-       device_link_free(container_of(rhead, struct device_link, rcu_head));
- }
--static void __device_link_del(struct device_link *link)
-+static void __device_link_del(struct kref *kref)
- {
-+      struct device_link *link = container_of(kref, struct device_link, kref);
-+
-       dev_info(link->consumer, "Dropping the link to %s\n",
-                dev_name(link->supplier));
-@@ -324,8 +330,10 @@ static void __device_link_del(struct dev
-       call_srcu(&device_links_srcu, &link->rcu_head, __device_link_free_srcu);
- }
- #else /* !CONFIG_SRCU */
--static void __device_link_del(struct device_link *link)
-+static void __device_link_del(struct kref *kref)
- {
-+      struct device_link *link = container_of(kref, struct device_link, kref);
-+
-       dev_info(link->consumer, "Dropping the link to %s\n",
-                dev_name(link->supplier));
-@@ -343,18 +351,50 @@ static void __device_link_del(struct dev
-  * @link: Device link to delete.
-  *
-  * The caller must ensure proper synchronization of this function with runtime
-- * PM.
-+ * PM.  If the link was added multiple times, it needs to be deleted as often.
-+ * Care is required for hotplugged devices:  Their links are purged on removal
-+ * and calling device_link_del() is then no longer allowed.
-  */
- void device_link_del(struct device_link *link)
- {
-       device_links_write_lock();
-       device_pm_lock();
--      __device_link_del(link);
-+      kref_put(&link->kref, __device_link_del);
-       device_pm_unlock();
-       device_links_write_unlock();
- }
- EXPORT_SYMBOL_GPL(device_link_del);
-+/**
-+ * device_link_remove - remove a link between two devices.
-+ * @consumer: Consumer end of the link.
-+ * @supplier: Supplier end of the link.
-+ *
-+ * The caller must ensure proper synchronization of this function with runtime
-+ * PM.
-+ */
-+void device_link_remove(void *consumer, struct device *supplier)
-+{
-+      struct device_link *link;
-+
-+      if (WARN_ON(consumer == supplier))
-+              return;
-+
-+      device_links_write_lock();
-+      device_pm_lock();
-+
-+      list_for_each_entry(link, &supplier->links.consumers, s_node) {
-+              if (link->consumer == consumer) {
-+                      kref_put(&link->kref, __device_link_del);
-+                      break;
-+              }
-+      }
-+
-+      device_pm_unlock();
-+      device_links_write_unlock();
-+}
-+EXPORT_SYMBOL_GPL(device_link_remove);
-+
- static void device_links_missing_supplier(struct device *dev)
- {
-       struct device_link *link;
-@@ -462,8 +502,8 @@ static void __device_links_no_driver(str
-               if (link->flags & DL_FLAG_STATELESS)
-                       continue;
--              if (link->flags & DL_FLAG_AUTOREMOVE)
--                      __device_link_del(link);
-+              if (link->flags & DL_FLAG_AUTOREMOVE_CONSUMER)
-+                      kref_put(&link->kref, __device_link_del);
-               else if (link->status != DL_STATE_SUPPLIER_UNBIND)
-                       WRITE_ONCE(link->status, DL_STATE_AVAILABLE);
-       }
-@@ -498,8 +538,18 @@ void device_links_driver_cleanup(struct
-               if (link->flags & DL_FLAG_STATELESS)
-                       continue;
--              WARN_ON(link->flags & DL_FLAG_AUTOREMOVE);
-+              WARN_ON(link->flags & DL_FLAG_AUTOREMOVE_CONSUMER);
-               WARN_ON(link->status != DL_STATE_SUPPLIER_UNBIND);
-+
-+              /*
-+               * autoremove the links between this @dev and its consumer
-+               * devices that are not active, i.e. where the link state
-+               * has moved to DL_STATE_SUPPLIER_UNBIND.
-+               */
-+              if (link->status == DL_STATE_SUPPLIER_UNBIND &&
-+                  link->flags & DL_FLAG_AUTOREMOVE_SUPPLIER)
-+                      kref_put(&link->kref, __device_link_del);
-+
-               WRITE_ONCE(link->status, DL_STATE_DORMANT);
-       }
-@@ -616,13 +666,13 @@ static void device_links_purge(struct de
-       list_for_each_entry_safe_reverse(link, ln, &dev->links.suppliers, c_node) {
-               WARN_ON(link->status == DL_STATE_ACTIVE);
--              __device_link_del(link);
-+              __device_link_del(&link->kref);
-       }
-       list_for_each_entry_safe_reverse(link, ln, &dev->links.consumers, s_node) {
-               WARN_ON(link->status != DL_STATE_DORMANT &&
-                       link->status != DL_STATE_NONE);
--              __device_link_del(link);
-+              __device_link_del(&link->kref);
-       }
-       device_links_write_unlock();
-@@ -1044,6 +1094,34 @@ static ssize_t online_store(struct devic
- }
- static DEVICE_ATTR_RW(online);
-+static ssize_t suppliers_show(struct device *dev, struct device_attribute *attr,
-+                            char *buf)
-+{
-+      struct device_link *link;
-+      size_t count = 0;
-+
-+      list_for_each_entry(link, &dev->links.suppliers, c_node)
-+              count += scnprintf(buf + count, PAGE_SIZE - count, "%s\n",
-+                                 dev_name(link->supplier));
-+
-+      return count;
-+}
-+static DEVICE_ATTR_RO(suppliers);
-+
-+static ssize_t consumers_show(struct device *dev, struct device_attribute *attr,
-+                            char *buf)
-+{
-+      struct device_link *link;
-+      size_t count = 0;
-+
-+      list_for_each_entry(link, &dev->links.consumers, s_node)
-+              count += scnprintf(buf + count, PAGE_SIZE - count, "%s\n",
-+                                 dev_name(link->consumer));
-+
-+      return count;
-+}
-+static DEVICE_ATTR_RO(consumers);
-+
- int device_add_groups(struct device *dev, const struct attribute_group **groups)
- {
-       return sysfs_create_groups(&dev->kobj, groups);
-@@ -1215,8 +1293,20 @@ static int device_add_attrs(struct devic
-                       goto err_remove_dev_groups;
-       }
-+      error = device_create_file(dev, &dev_attr_suppliers);
-+      if (error)
-+              goto err_remove_online;
-+
-+      error = device_create_file(dev, &dev_attr_consumers);
-+      if (error)
-+              goto err_remove_suppliers;
-+
-       return 0;
-+ err_remove_suppliers:
-+      device_remove_file(dev, &dev_attr_suppliers);
-+ err_remove_online:
-+      device_remove_file(dev, &dev_attr_online);
-  err_remove_dev_groups:
-       device_remove_groups(dev, dev->groups);
-  err_remove_type_groups:
-@@ -1234,6 +1324,8 @@ static void device_remove_attrs(struct d
-       struct class *class = dev->class;
-       const struct device_type *type = dev->type;
-+      device_remove_file(dev, &dev_attr_consumers);
-+      device_remove_file(dev, &dev_attr_suppliers);
-       device_remove_file(dev, &dev_attr_online);
-       device_remove_groups(dev, dev->groups);
---- a/drivers/base/dma-mapping.c
-+++ b/drivers/base/dma-mapping.c
-@@ -335,6 +335,7 @@ void dma_common_free_remap(void *cpu_add
-  * Common configuration to enable DMA API use for a device
-  */
- #include <linux/pci.h>
-+#include <linux/fsl/mc.h>
- int dma_configure(struct device *dev)
- {
-@@ -350,6 +351,12 @@ int dma_configure(struct device *dev)
-                       dma_dev = dma_dev->parent;
-       }
-+      if (dev_is_fsl_mc(dev)) {
-+              dma_dev = dev;
-+              while (dev_is_fsl_mc(dma_dev))
-+                      dma_dev = dma_dev->parent;
-+      }
-+
-       if (dma_dev->of_node) {
-               ret = of_dma_configure(dev, dma_dev->of_node);
-       } else if (has_acpi_companion(dma_dev)) {
---- a/drivers/gpu/ipu-v3/ipu-pre.c
-+++ b/drivers/gpu/ipu-v3/ipu-pre.c
-@@ -125,7 +125,8 @@ ipu_pre_lookup_by_phandle(struct device
-       list_for_each_entry(pre, &ipu_pre_list, list) {
-               if (pre_node == pre->dev->of_node) {
-                       mutex_unlock(&ipu_pre_list_mutex);
--                      device_link_add(dev, pre->dev, DL_FLAG_AUTOREMOVE);
-+                      device_link_add(dev, pre->dev,
-+                                      DL_FLAG_AUTOREMOVE_CONSUMER);
-                       of_node_put(pre_node);
-                       return pre;
-               }
---- a/drivers/gpu/ipu-v3/ipu-prg.c
-+++ b/drivers/gpu/ipu-v3/ipu-prg.c
-@@ -99,7 +99,8 @@ ipu_prg_lookup_by_phandle(struct device
-       list_for_each_entry(prg, &ipu_prg_list, list) {
-               if (prg_node == prg->dev->of_node) {
-                       mutex_unlock(&ipu_prg_list_mutex);
--                      device_link_add(dev, prg->dev, DL_FLAG_AUTOREMOVE);
-+                      device_link_add(dev, prg->dev,
-+                                      DL_FLAG_AUTOREMOVE_CONSUMER);
-                       prg->id = ipu_id;
-                       of_node_put(prg_node);
-                       return prg;
---- a/drivers/iommu/dma-iommu.c
-+++ b/drivers/iommu/dma-iommu.c
-@@ -381,6 +381,9 @@ static dma_addr_t iommu_dma_alloc_iova(s
-       if (iova_len < (1 << (IOVA_RANGE_CACHE_MAX_SIZE - 1)))
-               iova_len = roundup_pow_of_two(iova_len);
-+      if (dev->bus_dma_mask)
-+              dma_limit &= dev->bus_dma_mask;
-+
-       if (domain->geometry.force_aperture)
-               dma_limit = min(dma_limit, domain->geometry.aperture_end);
---- a/drivers/mux/Kconfig
-+++ b/drivers/mux/Kconfig
-@@ -35,14 +35,14 @@ config MUX_GPIO
-         be called mux-gpio.
- config MUX_MMIO
--      tristate "MMIO register bitfield-controlled Multiplexer"
--      depends on (OF && MFD_SYSCON) || COMPILE_TEST
-+      tristate "MMIO/Regmap register bitfield-controlled Multiplexer"
-+      depends on OF || COMPILE_TEST
-       help
--        MMIO register bitfield-controlled Multiplexer controller.
-+        MMIO/Regmap register bitfield-controlled Multiplexer controller.
--        The driver builds multiplexer controllers for bitfields in a syscon
--        register. For N bit wide bitfields, there will be 2^N possible
--        multiplexer states.
-+        The driver builds multiplexer controllers for bitfields in either
-+        a syscon register or a driver regmap register. For N bit wide
-+        bitfields, there will be 2^N possible multiplexer states.
-         To compile the driver as a module, choose M here: the module will
-         be called mux-mmio.
---- a/drivers/mux/mmio.c
-+++ b/drivers/mux/mmio.c
-@@ -31,6 +31,7 @@ static const struct mux_control_ops mux_
- static const struct of_device_id mux_mmio_dt_ids[] = {
-       { .compatible = "mmio-mux", },
-+      { .compatible = "reg-mux", },
-       { /* sentinel */ }
- };
- MODULE_DEVICE_TABLE(of, mux_mmio_dt_ids);
-@@ -46,7 +47,10 @@ static int mux_mmio_probe(struct platfor
-       int ret;
-       int i;
--      regmap = syscon_node_to_regmap(np->parent);
-+      if (of_device_is_compatible(np, "mmio-mux"))
-+              regmap = syscon_node_to_regmap(np->parent);
-+      else
-+              regmap = dev_get_regmap(dev->parent, NULL) ?: ERR_PTR(-ENODEV);
-       if (IS_ERR(regmap)) {
-               ret = PTR_ERR(regmap);
-               dev_err(dev, "failed to get regmap: %d\n", ret);
---- a/drivers/of/device.c
-+++ b/drivers/of/device.c
-@@ -15,6 +15,9 @@
- #include <asm/errno.h>
- #include "of_private.h"
-+#ifdef CONFIG_FSL_MC_BUS
-+#include <linux/fsl/mc.h>
-+#endif
- /**
-  * of_match_device - Tell if a struct device matches an of_device_id list
-@@ -105,6 +108,9 @@ int of_dma_configure(struct device *dev,
- #ifdef CONFIG_ARM_AMBA
-                   dev->bus != &amba_bustype &&
- #endif
-+#ifdef CONFIG_FSL_MC_BUS
-+                  dev->bus != &fsl_mc_bus_type &&
-+#endif
-                   dev->bus != &platform_bus_type)
-                       return ret == -ENODEV ? 0 : ret;
-@@ -152,10 +158,16 @@ int of_dma_configure(struct device *dev,
-        * set by the driver.
-        */
-       mask = DMA_BIT_MASK(ilog2(dma_addr + size - 1) + 1);
-+      dev->bus_dma_mask = mask;
-       dev->coherent_dma_mask &= mask;
-       *dev->dma_mask &= mask;
--      coherent = of_dma_is_coherent(np);
-+#ifdef CONFIG_FSL_MC_BUS
-+      if (dev_is_fsl_mc(dev))
-+              coherent = fsl_mc_is_dev_coherent(dev);
-+      else
-+#endif
-+              coherent = of_dma_is_coherent(np);
-       dev_dbg(dev, "device is%sdma coherent\n",
-               coherent ? " " : " not ");
---- a/drivers/soc/imx/gpc.c
-+++ b/drivers/soc/imx/gpc.c
-@@ -210,7 +210,7 @@ static int imx_pgc_power_domain_probe(st
-                       goto genpd_err;
-       }
--      device_link_add(dev, dev->parent, DL_FLAG_AUTOREMOVE);
-+      device_link_add(dev, dev->parent, DL_FLAG_AUTOREMOVE_CONSUMER);
-       return 0;
---- a/include/linux/device.h
-+++ b/include/linux/device.h
-@@ -55,6 +55,8 @@ struct bus_attribute {
-       struct bus_attribute bus_attr_##_name = __ATTR_RW(_name)
- #define BUS_ATTR_RO(_name) \
-       struct bus_attribute bus_attr_##_name = __ATTR_RO(_name)
-+#define BUS_ATTR_WO(_name) \
-+      struct bus_attribute bus_attr_##_name = __ATTR_WO(_name)
- extern int __must_check bus_create_file(struct bus_type *,
-                                       struct bus_attribute *);
-@@ -751,14 +753,16 @@ enum device_link_state {
-  * Device link flags.
-  *
-  * STATELESS: The core won't track the presence of supplier/consumer drivers.
-- * AUTOREMOVE: Remove this link automatically on consumer driver unbind.
-+ * AUTOREMOVE_CONSUMER: Remove the link automatically on consumer driver unbind.
-  * PM_RUNTIME: If set, the runtime PM framework will use this link.
-  * RPM_ACTIVE: Run pm_runtime_get_sync() on the supplier during link creation.
-+ * AUTOREMOVE_SUPPLIER: Remove the link automatically on supplier driver unbind.
-  */
--#define DL_FLAG_STATELESS     BIT(0)
--#define DL_FLAG_AUTOREMOVE    BIT(1)
--#define DL_FLAG_PM_RUNTIME    BIT(2)
--#define DL_FLAG_RPM_ACTIVE    BIT(3)
-+#define DL_FLAG_STATELESS             BIT(0)
-+#define DL_FLAG_AUTOREMOVE_CONSUMER   BIT(1)
-+#define DL_FLAG_PM_RUNTIME            BIT(2)
-+#define DL_FLAG_RPM_ACTIVE            BIT(3)
-+#define DL_FLAG_AUTOREMOVE_SUPPLIER   BIT(4)
- /**
-  * struct device_link - Device link representation.
-@@ -769,6 +773,7 @@ enum device_link_state {
-  * @status: The state of the link (with respect to the presence of drivers).
-  * @flags: Link flags.
-  * @rpm_active: Whether or not the consumer device is runtime-PM-active.
-+ * @kref: Count repeated addition of the same link.
-  * @rcu_head: An RCU head to use for deferred execution of SRCU callbacks.
-  */
- struct device_link {
-@@ -779,6 +784,7 @@ struct device_link {
-       enum device_link_state status;
-       u32 flags;
-       bool rpm_active;
-+      struct kref kref;
- #ifdef CONFIG_SRCU
-       struct rcu_head rcu_head;
- #endif
-@@ -851,6 +857,8 @@ struct dev_links_info {
-  * @coherent_dma_mask: Like dma_mask, but for alloc_coherent mapping as not all
-  *            hardware supports 64-bit addresses for consistent allocations
-  *            such descriptors.
-+ * @bus_dma_mask: Mask of an upstream bridge or bus which imposes a smaller DMA
-+ *            limit than the device itself supports.
-  * @dma_pfn_offset: offset of DMA memory range relatively of RAM
-  * @dma_parms:        A low level driver may set these to teach IOMMU code about
-  *            segment limitations.
-@@ -930,6 +938,7 @@ struct device {
-                                            not all hardware supports
-                                            64 bit addresses for consistent
-                                            allocations such descriptors. */
-+      u64             bus_dma_mask;   /* upstream dma_mask constraint */
-       unsigned long   dma_pfn_offset;
-       struct device_dma_parameters *dma_parms;
-@@ -1268,6 +1277,7 @@ extern const char *dev_driver_string(con
- struct device_link *device_link_add(struct device *consumer,
-                                   struct device *supplier, u32 flags);
- void device_link_del(struct device_link *link);
-+void device_link_remove(void *consumer, struct device *supplier);
- #ifdef CONFIG_PRINTK
---- a/include/linux/fsl_devices.h
-+++ b/include/linux/fsl_devices.h
-@@ -99,7 +99,9 @@ struct fsl_usb2_platform_data {
-       unsigned        suspended:1;
-       unsigned        already_suspended:1;
-       unsigned        has_fsl_erratum_a007792:1;
-+      unsigned        has_fsl_erratum_14:1;
-       unsigned        has_fsl_erratum_a005275:1;
-+      unsigned        has_fsl_erratum_a006918:1;
-       unsigned        has_fsl_erratum_a005697:1;
-       unsigned        check_phy_clk_valid:1;
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -2349,7 +2349,8 @@ int register_netdevice_notifier(struct n
- int unregister_netdevice_notifier(struct notifier_block *nb);
- struct netdev_notifier_info {
--      struct net_device *dev;
-+      struct net_device       *dev;
-+      struct netlink_ext_ack  *extack;
- };
- struct netdev_notifier_info_ext {
-@@ -2381,6 +2382,7 @@ static inline void netdev_notifier_info_
-                                            struct net_device *dev)
- {
-       info->dev = dev;
-+      info->extack = NULL;
- }
- static inline struct net_device *
-@@ -2389,6 +2391,12 @@ netdev_notifier_info_to_dev(const struct
-       return info->dev;
- }
-+static inline struct netlink_ext_ack *
-+netdev_notifier_info_to_extack(const struct netdev_notifier_info *info)
-+{
-+      return info->extack;
-+}
-+
- int call_netdevice_notifiers(unsigned long val, struct net_device *dev);
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -964,6 +964,7 @@ void kfree_skb_list(struct sk_buff *segs
- void skb_tx_error(struct sk_buff *skb);
- void consume_skb(struct sk_buff *skb);
- void __consume_stateless_skb(struct sk_buff *skb);
-+void skb_recycle(struct sk_buff *skb);
- void  __kfree_skb(struct sk_buff *skb);
- extern struct kmem_cache *skbuff_head_cache;
-@@ -3315,6 +3316,7 @@ static inline void skb_free_datagram_loc
- }
- int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags);
- int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len);
-+void copy_skb_header(struct sk_buff *new, const struct sk_buff *old);
- int skb_store_bits(struct sk_buff *skb, int offset, const void *from, int len);
- __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset, u8 *to,
-                             int len, __wsum csum);
---- a/lib/dma-noop.c
-+++ b/lib/dma-noop.c
-@@ -58,11 +58,30 @@ static int dma_noop_map_sg(struct device
-       return nents;
- }
-+static int dma_noop_supported(struct device *dev, u64 mask)
-+{
-+#ifdef CONFIG_ZONE_DMA
-+      if (mask < DMA_BIT_MASK(ARCH_ZONE_DMA_BITS))
-+      return 0;
-+#else
-+      /*
-+       * Because 32-bit DMA masks are so common we expect every architecture
-+       * to be able to satisfy them - either by not supporting more physical
-+       * memory, or by providing a ZONE_DMA32.  If neither is the case, the
-+       * architecture needs to use an IOMMU instead of the direct mapping.
-+       */
-+      if (dev->bus_dma_mask && mask > dev->bus_dma_mask)
-+              return 0;
-+#endif
-+      return 1;
-+}
-+
- const struct dma_map_ops dma_noop_ops = {
-       .alloc                  = dma_noop_alloc,
-       .free                   = dma_noop_free,
-       .map_page               = dma_noop_map_page,
-       .map_sg                 = dma_noop_map_sg,
-+      dma_supported           = dma_noop_supported
- };
- EXPORT_SYMBOL(dma_noop_ops);
---- a/mm/page_alloc.c
-+++ b/mm/page_alloc.c
-@@ -4366,8 +4366,14 @@ void page_frag_free(void *addr)
- {
-       struct page *page = virt_to_head_page(addr);
--      if (unlikely(put_page_testzero(page)))
--              __free_pages_ok(page, compound_order(page));
-+      if (unlikely(put_page_testzero(page))) {
-+              unsigned int order = compound_order(page);
-+
-+              if (order == 0)         /* Via pcp? */
-+                      free_hot_cold_page(page, false);
-+              else
-+                      __free_pages_ok(page, order);
-+      }
- }
- EXPORT_SYMBOL(page_frag_free);
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -162,7 +162,6 @@ static struct list_head offload_base __r
- static int netif_rx_internal(struct sk_buff *skb);
- static int call_netdevice_notifiers_info(unsigned long val,
--                                       struct net_device *dev,
-                                        struct netdev_notifier_info *info);
- static struct napi_struct *napi_by_id(unsigned int napi_id);
-@@ -1312,10 +1311,11 @@ EXPORT_SYMBOL(netdev_features_change);
- void netdev_state_change(struct net_device *dev)
- {
-       if (dev->flags & IFF_UP) {
--              struct netdev_notifier_change_info change_info;
-+              struct netdev_notifier_change_info change_info = {
-+                      .info.dev = dev,
-+              };
--              change_info.flags_changed = 0;
--              call_netdevice_notifiers_info(NETDEV_CHANGE, dev,
-+              call_netdevice_notifiers_info(NETDEV_CHANGE,
-                                             &change_info.info);
-               rtmsg_ifinfo(RTM_NEWLINK, dev, 0, GFP_KERNEL);
-       }
-@@ -1536,9 +1536,10 @@ EXPORT_SYMBOL(dev_disable_lro);
- static int call_netdevice_notifier(struct notifier_block *nb, unsigned long val,
-                                  struct net_device *dev)
- {
--      struct netdev_notifier_info info;
-+      struct netdev_notifier_info info = {
-+              .dev = dev,
-+      };
--      netdev_notifier_info_init(&info, dev);
-       return nb->notifier_call(nb, val, &info);
- }
-@@ -1663,11 +1664,9 @@ EXPORT_SYMBOL(unregister_netdevice_notif
-  */
- static int call_netdevice_notifiers_info(unsigned long val,
--                                       struct net_device *dev,
-                                        struct netdev_notifier_info *info)
- {
-       ASSERT_RTNL();
--      netdev_notifier_info_init(info, dev);
-       return raw_notifier_call_chain(&netdev_chain, val, info);
- }
-@@ -1682,9 +1681,11 @@ static int call_netdevice_notifiers_info
- int call_netdevice_notifiers(unsigned long val, struct net_device *dev)
- {
--      struct netdev_notifier_info info;
-+      struct netdev_notifier_info info = {
-+              .dev = dev,
-+      };
--      return call_netdevice_notifiers_info(val, dev, &info);
-+      return call_netdevice_notifiers_info(val, &info);
- }
- EXPORT_SYMBOL(call_netdevice_notifiers);
-@@ -1707,7 +1708,7 @@ static int call_netdevice_notifiers_mtu(
-       BUILD_BUG_ON(offsetof(struct netdev_notifier_info_ext, info) != 0);
--      return call_netdevice_notifiers_info(val, dev, &info.info);
-+      return call_netdevice_notifiers_info(val, &info.info);
- }
- #ifdef CONFIG_NET_INGRESS
-@@ -6342,7 +6343,15 @@ static int __netdev_upper_dev_link(struc
-                                  struct net_device *upper_dev, bool master,
-                                  void *upper_priv, void *upper_info)
- {
--      struct netdev_notifier_changeupper_info changeupper_info;
-+      struct netdev_notifier_changeupper_info changeupper_info = {
-+              .info = {
-+                      .dev = dev,
-+              },
-+              .upper_dev = upper_dev,
-+              .master = master,
-+              .linking = true,
-+              .upper_info = upper_info,
-+      };
-       int ret = 0;
-       ASSERT_RTNL();
-@@ -6360,12 +6369,7 @@ static int __netdev_upper_dev_link(struc
-       if (master && netdev_master_upper_dev_get(dev))
-               return -EBUSY;
--      changeupper_info.upper_dev = upper_dev;
--      changeupper_info.master = master;
--      changeupper_info.linking = true;
--      changeupper_info.upper_info = upper_info;
--
--      ret = call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER, dev,
-+      ret = call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER,
-                                           &changeupper_info.info);
-       ret = notifier_to_errno(ret);
-       if (ret)
-@@ -6377,7 +6381,7 @@ static int __netdev_upper_dev_link(struc
-               return ret;
-       netdev_update_addr_mask(dev);
--      ret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, dev,
-+      ret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER,
-                                           &changeupper_info.info);
-       ret = notifier_to_errno(ret);
-       if (ret)
-@@ -6441,21 +6445,25 @@ EXPORT_SYMBOL(netdev_master_upper_dev_li
- void netdev_upper_dev_unlink(struct net_device *dev,
-                            struct net_device *upper_dev)
- {
--      struct netdev_notifier_changeupper_info changeupper_info;
-+      struct netdev_notifier_changeupper_info changeupper_info = {
-+              .info = {
-+                      .dev = dev,
-+              },
-+              .upper_dev = upper_dev,
-+              .linking = false,
-+      };
-       ASSERT_RTNL();
--      changeupper_info.upper_dev = upper_dev;
-       changeupper_info.master = netdev_master_upper_dev_get(dev) == upper_dev;
--      changeupper_info.linking = false;
--      call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER, dev,
-+      call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER,
-                                     &changeupper_info.info);
-       __netdev_adjacent_dev_unlink_neighbour(dev, upper_dev);
-       netdev_update_addr_mask(dev);
--      call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, dev,
-+      call_netdevice_notifiers_info(NETDEV_CHANGEUPPER,
-                                     &changeupper_info.info);
- }
- EXPORT_SYMBOL(netdev_upper_dev_unlink);
-@@ -6471,11 +6479,13 @@ EXPORT_SYMBOL(netdev_upper_dev_unlink);
- void netdev_bonding_info_change(struct net_device *dev,
-                               struct netdev_bonding_info *bonding_info)
- {
--      struct netdev_notifier_bonding_info     info;
-+      struct netdev_notifier_bonding_info info = {
-+              .info.dev = dev,
-+      };
-       memcpy(&info.bonding_info, bonding_info,
-              sizeof(struct netdev_bonding_info));
--      call_netdevice_notifiers_info(NETDEV_BONDING_INFO, dev,
-+      call_netdevice_notifiers_info(NETDEV_BONDING_INFO,
-                                     &info.info);
- }
- EXPORT_SYMBOL(netdev_bonding_info_change);
-@@ -6601,11 +6611,13 @@ EXPORT_SYMBOL(dev_get_nest_level);
- void netdev_lower_state_changed(struct net_device *lower_dev,
-                               void *lower_state_info)
- {
--      struct netdev_notifier_changelowerstate_info changelowerstate_info;
-+      struct netdev_notifier_changelowerstate_info changelowerstate_info = {
-+              .info.dev = lower_dev,
-+      };
-       ASSERT_RTNL();
-       changelowerstate_info.lower_state_info = lower_state_info;
--      call_netdevice_notifiers_info(NETDEV_CHANGELOWERSTATE, lower_dev,
-+      call_netdevice_notifiers_info(NETDEV_CHANGELOWERSTATE,
-                                     &changelowerstate_info.info);
- }
- EXPORT_SYMBOL(netdev_lower_state_changed);
-@@ -6896,11 +6908,14 @@ void __dev_notify_flags(struct net_devic
-       if (dev->flags & IFF_UP &&
-           (changes & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI | IFF_VOLATILE))) {
--              struct netdev_notifier_change_info change_info;
-+              struct netdev_notifier_change_info change_info = {
-+                      .info = {
-+                              .dev = dev,
-+                      },
-+                      .flags_changed = changes,
-+              };
--              change_info.flags_changed = changes;
--              call_netdevice_notifiers_info(NETDEV_CHANGE, dev,
--                                            &change_info.info);
-+              call_netdevice_notifiers_info(NETDEV_CHANGE, &change_info.info);
-       }
- }
---- a/net/core/skbuff.c
-+++ b/net/core/skbuff.c
-@@ -803,6 +803,32 @@ void napi_consume_skb(struct sk_buff *sk
- }
- EXPORT_SYMBOL(napi_consume_skb);
-+/**
-+ *    skb_recycle - clean up an skb for reuse
-+ *    @skb: buffer
-+ *
-+ *    Recycles the skb to be reused as a receive buffer. This
-+ *    function does any necessary reference count dropping, and
-+ *    cleans up the skbuff as if it just came from __alloc_skb().
-+ */
-+void skb_recycle(struct sk_buff *skb)
-+{
-+      struct skb_shared_info *shinfo;
-+      u8 head_frag = skb->head_frag;
-+
-+      skb_release_head_state(skb);
-+
-+      shinfo = skb_shinfo(skb);
-+      memset(shinfo, 0, offsetof(struct skb_shared_info, dataref));
-+      atomic_set(&shinfo->dataref, 1);
-+
-+      memset(skb, 0, offsetof(struct sk_buff, tail));
-+      skb->data = skb->head + NET_SKB_PAD;
-+      skb->head_frag = head_frag;
-+      skb_reset_tail_pointer(skb);
-+}
-+EXPORT_SYMBOL(skb_recycle);
-+
- /* Make sure a field is enclosed inside headers_start/headers_end section */
- #define CHECK_SKB_FIELD(field) \
-       BUILD_BUG_ON(offsetof(struct sk_buff, field) <          \
-@@ -1322,7 +1348,7 @@ static void skb_headers_offset_update(st
-       skb->inner_mac_header += off;
- }
--static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
-+void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
- {
-       __copy_skb_header(new, old);
-@@ -1330,6 +1356,7 @@ static void copy_skb_header(struct sk_bu
-       skb_shinfo(new)->gso_segs = skb_shinfo(old)->gso_segs;
-       skb_shinfo(new)->gso_type = skb_shinfo(old)->gso_type;
- }
-+EXPORT_SYMBOL(copy_skb_header);
- static inline int skb_alloc_rx_flag(const struct sk_buff *skb)
- {
---- a/samples/bpf/Makefile
-+++ b/samples/bpf/Makefile
-@@ -178,6 +178,12 @@ HOSTLOADLIBES_syscall_tp += -lelf
- LLC ?= llc
- CLANG ?= clang
-+# Detect that we're cross compiling and use the cross compiler
-+ifdef CROSS_COMPILE
-+HOSTCC = $(CROSS_COMPILE)gcc
-+CLANG_ARCH_ARGS = -target $(ARCH)
-+endif
-+
- # Trick to allow make to be run from this directory
- all: $(LIBBPF)
-       $(MAKE) -C ../../ $(CURDIR)/
-@@ -228,9 +234,9 @@ $(obj)/tracex5_kern.o: $(obj)/syscall_nr
- $(obj)/%.o: $(src)/%.c
-       $(CLANG) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) -I$(obj) \
-               -I$(srctree)/tools/testing/selftests/bpf/ \
--              -D__KERNEL__ -D__ASM_SYSREG_H -Wno-unused-value -Wno-pointer-sign \
--              -Wno-compare-distinct-pointer-types \
-+              -D__KERNEL__ -Wno-unused-value -Wno-pointer-sign \
-+              -D__TARGET_ARCH_$(ARCH) -Wno-compare-distinct-pointer-types \
-               -Wno-gnu-variable-sized-type-not-at-end \
-               -Wno-address-of-packed-member -Wno-tautological-compare \
--              -Wno-unknown-warning-option \
-+              -Wno-unknown-warning-option $(CLANG_ARCH_ARGS) \
-               -O2 -emit-llvm -c $< -o -| $(LLC) -march=bpf -filetype=obj -o $@
---- a/samples/bpf/map_perf_test_kern.c
-+++ b/samples/bpf/map_perf_test_kern.c
-@@ -266,7 +266,7 @@ int stress_hash_map_lookup(struct pt_reg
-       return 0;
- }
--SEC("kprobe/sys_getpgrp")
-+SEC("kprobe/sys_getppid")
- int stress_array_map_lookup(struct pt_regs *ctx)
- {
-       u32 key = 1, i;
---- a/samples/bpf/map_perf_test_user.c
-+++ b/samples/bpf/map_perf_test_user.c
-@@ -282,7 +282,7 @@ static void test_array_lookup(int cpu)
-       start_time = time_get_ns();
-       for (i = 0; i < max_cnt; i++)
--              syscall(__NR_getpgrp, 0);
-+              syscall(__NR_getppid, 0);
-       printf("%d:array_lookup %lld lookups per sec\n",
-              cpu, max_cnt * 1000000000ll * 64 / (time_get_ns() - start_time));
- }
---- a/tools/testing/selftests/bpf/bpf_helpers.h
-+++ b/tools/testing/selftests/bpf/bpf_helpers.h
-@@ -110,7 +110,47 @@ static int (*bpf_skb_under_cgroup)(void
- static int (*bpf_skb_change_head)(void *, int len, int flags) =
-       (void *) BPF_FUNC_skb_change_head;
-+/* Scan the ARCH passed in from ARCH env variable (see Makefile) */
-+#if defined(__TARGET_ARCH_x86)
-+      #define bpf_target_x86
-+      #define bpf_target_defined
-+#elif defined(__TARGET_ARCH_s930x)
-+      #define bpf_target_s930x
-+      #define bpf_target_defined
-+#elif defined(__TARGET_ARCH_arm64)
-+      #define bpf_target_arm64
-+      #define bpf_target_defined
-+#elif defined(__TARGET_ARCH_mips)
-+      #define bpf_target_mips
-+      #define bpf_target_defined
-+#elif defined(__TARGET_ARCH_powerpc)
-+      #define bpf_target_powerpc
-+      #define bpf_target_defined
-+#elif defined(__TARGET_ARCH_sparc)
-+      #define bpf_target_sparc
-+      #define bpf_target_defined
-+#else
-+      #undef bpf_target_defined
-+#endif
-+
-+/* Fall back to what the compiler says */
-+#ifndef bpf_target_defined
- #if defined(__x86_64__)
-+      #define bpf_target_x86
-+#elif defined(__s390x__)
-+      #define bpf_target_s930x
-+#elif defined(__aarch64__)
-+      #define bpf_target_arm64
-+#elif defined(__mips__)
-+      #define bpf_target_mips
-+#elif defined(__powerpc__)
-+      #define bpf_target_powerpc
-+#elif defined(__sparc__)
-+      #define bpf_target_sparc
-+#endif
-+#endif
-+
-+#if defined(bpf_target_x86)
- #define PT_REGS_PARM1(x) ((x)->di)
- #define PT_REGS_PARM2(x) ((x)->si)
-@@ -123,7 +163,7 @@ static int (*bpf_skb_change_head)(void *
- #define PT_REGS_SP(x) ((x)->sp)
- #define PT_REGS_IP(x) ((x)->ip)
--#elif defined(__s390x__)
-+#elif defined(bpf_target_s390x)
- #define PT_REGS_PARM1(x) ((x)->gprs[2])
- #define PT_REGS_PARM2(x) ((x)->gprs[3])
-@@ -136,7 +176,7 @@ static int (*bpf_skb_change_head)(void *
- #define PT_REGS_SP(x) ((x)->gprs[15])
- #define PT_REGS_IP(x) ((x)->psw.addr)
--#elif defined(__aarch64__)
-+#elif defined(bpf_target_arm64)
- #define PT_REGS_PARM1(x) ((x)->regs[0])
- #define PT_REGS_PARM2(x) ((x)->regs[1])
-@@ -149,7 +189,7 @@ static int (*bpf_skb_change_head)(void *
- #define PT_REGS_SP(x) ((x)->sp)
- #define PT_REGS_IP(x) ((x)->pc)
--#elif defined(__mips__)
-+#elif defined(bpf_target_mips)
- #define PT_REGS_PARM1(x) ((x)->regs[4])
- #define PT_REGS_PARM2(x) ((x)->regs[5])
-@@ -162,7 +202,7 @@ static int (*bpf_skb_change_head)(void *
- #define PT_REGS_SP(x) ((x)->regs[29])
- #define PT_REGS_IP(x) ((x)->cp0_epc)
--#elif defined(__powerpc__)
-+#elif defined(bpf_target_powerpc)
- #define PT_REGS_PARM1(x) ((x)->gpr[3])
- #define PT_REGS_PARM2(x) ((x)->gpr[4])
-@@ -173,7 +213,7 @@ static int (*bpf_skb_change_head)(void *
- #define PT_REGS_SP(x) ((x)->sp)
- #define PT_REGS_IP(x) ((x)->nip)
--#elif defined(__sparc__)
-+#elif defined(bpf_target_sparc)
- #define PT_REGS_PARM1(x) ((x)->u_regs[UREG_I0])
- #define PT_REGS_PARM2(x) ((x)->u_regs[UREG_I1])
-@@ -183,6 +223,8 @@ static int (*bpf_skb_change_head)(void *
- #define PT_REGS_RET(x) ((x)->u_regs[UREG_I7])
- #define PT_REGS_RC(x) ((x)->u_regs[UREG_I0])
- #define PT_REGS_SP(x) ((x)->u_regs[UREG_FP])
-+
-+/* Should this also be a bpf_target check for the sparc case? */
- #if defined(__arch64__)
- #define PT_REGS_IP(x) ((x)->tpc)
- #else
-@@ -191,10 +233,10 @@ static int (*bpf_skb_change_head)(void *
- #endif
--#ifdef __powerpc__
-+#ifdef bpf_target_powerpc
- #define BPF_KPROBE_READ_RET_IP(ip, ctx)               ({ (ip) = (ctx)->link; })
- #define BPF_KRETPROBE_READ_RET_IP             BPF_KPROBE_READ_RET_IP
--#elif defined(__sparc__)
-+#elif bpf_target_sparc
- #define BPF_KPROBE_READ_RET_IP(ip, ctx)               ({ (ip) = PT_REGS_RET(ctx); })
- #define BPF_KRETPROBE_READ_RET_IP             BPF_KPROBE_READ_RET_IP
- #else