aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-4.14/202-core-linux-support-layerscape.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/layerscape/patches-4.14/202-core-linux-support-layerscape.patch')
-rw-r--r--target/linux/layerscape/patches-4.14/202-core-linux-support-layerscape.patch1056
1 files changed, 0 insertions, 1056 deletions
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
index 07fc71f0d4..0000000000
--- a/target/linux/layerscape/patches-4.14/202-core-linux-support-layerscape.patch
+++ /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