layerscape: update patches-4.9 to LSDK1712
authorYangbo Lu <yangbo.lu@nxp.com>
Tue, 6 Feb 2018 04:39:05 +0000 (12:39 +0800)
committerJohn Crispin <john@phrozen.org>
Tue, 13 Feb 2018 09:01:49 +0000 (10:01 +0100)
Patches changes
- Updated patches-4.9 to NXP LSDK1712 linux-4.9.
- Merged changes of patch 303 into integrated patch 201.
- Split changes of patch 706 into dpaa part and dpaa2
  part, and merged these changes into integrated patches
  701 and 705.
- Removed patch 819 since ehci-fsl driver could be compiled now.
- Refreshed these patches.

Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
33 files changed:
target/linux/layerscape/patches-4.9/201-config-support-layerscape.patch
target/linux/layerscape/patches-4.9/202-core-linux-support-layerscape.patch
target/linux/layerscape/patches-4.9/301-arch-support-layerscape.patch
target/linux/layerscape/patches-4.9/302-dts-support-layercape.patch
target/linux/layerscape/patches-4.9/303-arm-imx-select-ARCH_DMA_ADDR_T_64BIT-for-LPAE.patch [deleted file]
target/linux/layerscape/patches-4.9/401-mtd-spi-nor-support-layerscape.patch
target/linux/layerscape/patches-4.9/402-mtd-support-layerscape.patch
target/linux/layerscape/patches-4.9/701-sdk_dpaa-support-layerscape.patch
target/linux/layerscape/patches-4.9/702-pci-support-layerscape.patch
target/linux/layerscape/patches-4.9/703-phy-support-layerscape.patch
target/linux/layerscape/patches-4.9/704-fsl-mc-layerscape-support.patch
target/linux/layerscape/patches-4.9/705-dpaa2-support-layerscape.patch
target/linux/layerscape/patches-4.9/706-fsl-dpaa-use-4-9-ndo-get-stats64.patch [deleted file]
target/linux/layerscape/patches-4.9/706-fsl_ppfe-support-layercape.patch
target/linux/layerscape/patches-4.9/801-ata-support-layerscape.patch
target/linux/layerscape/patches-4.9/802-clk-support-layerscape.patch
target/linux/layerscape/patches-4.9/803-cpufreq-support-layerscape.patch
target/linux/layerscape/patches-4.9/804-crypto-support-layerscape.patch
target/linux/layerscape/patches-4.9/805-dma-support-layerscape.patch
target/linux/layerscape/patches-4.9/806-flextimer-support-layerscape.patch
target/linux/layerscape/patches-4.9/807-gpu-support-layerscape.patch
target/linux/layerscape/patches-4.9/808-guts-support-layerscape.patch
target/linux/layerscape/patches-4.9/809-i2c-support-layerscape.patch
target/linux/layerscape/patches-4.9/810-iommu-support-layerscape.patch
target/linux/layerscape/patches-4.9/811-irqchip-support-layerscape.patch
target/linux/layerscape/patches-4.9/812-mmc-layerscape-support.patch
target/linux/layerscape/patches-4.9/813-qe-support-layerscape.patch
target/linux/layerscape/patches-4.9/814-rtc-support-layerscape.patch
target/linux/layerscape/patches-4.9/815-spi-support-layerscape.patch
target/linux/layerscape/patches-4.9/816-tty-serial-support-layerscape.patch
target/linux/layerscape/patches-4.9/817-usb-support-layerscape.patch
target/linux/layerscape/patches-4.9/818-vfio-support-layerscape.patch
target/linux/layerscape/patches-4.9/819-Revert-usb-kconfig-remove-dependency-FSL_SOC-for-ehc.patch [deleted file]

index ccfce1d..2184212 100644 (file)
@@ -1,12 +1,12 @@
-From 7992b4384d94c5e1bad998ca3a9a5781caac8e62 Mon Sep 17 00:00:00 2001
+From e43dec70614b55ba1ce24dfcdf8f51e36d800af2 Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 25 Sep 2017 09:52:26 +0800
-Subject: [PATCH] config: support layerscape
+Date: Wed, 17 Jan 2018 15:26:46 +0800
+Subject: [PATCH 01/30] config: support layerscape
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
 
-This is a integrated patch for layerscape config/makefile support.
+This is an integrated patch for layerscape config/makefile support.
 
 Signed-off-by: Yuantian Tang <andy.tang@nxp.com>
 Signed-off-by: Zhang Ying-22455 <ying.zhang22455@nxp.com>
@@ -16,33 +16,42 @@ Signed-off-by: Zhao Qiang <qiang.zhao@nxp.com>
 Signed-off-by: Horia Geantă <horia.geanta@nxp.com>
 Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 ---
drivers/base/Kconfig                    |   1 +
- drivers/crypto/Makefile                 |   2 +-
- drivers/net/ethernet/freescale/Kconfig  |   4 +-
- drivers/net/ethernet/freescale/Makefile |   2 +
- drivers/ptp/Kconfig                     |  29 ++++++
- drivers/rtc/Kconfig                     |   8 ++
- drivers/rtc/Makefile                    |   1 +
- drivers/soc/Kconfig                     |   3 +-
- drivers/soc/fsl/Kconfig                 |  22 +++++
- drivers/soc/fsl/Kconfig.arm             |  16 ++++
- drivers/soc/fsl/Makefile                |   4 +
- drivers/soc/fsl/layerscape/Kconfig      |  10 +++
- drivers/soc/fsl/layerscape/Makefile     |   1 +
- drivers/soc/fsl/rcpm.c                  | 154 ++++++++++++++++++++++++++++++++
- drivers/staging/Kconfig                 |   6 ++
- drivers/staging/Makefile                |   3 +
- drivers/staging/fsl-dpaa2/Kconfig       |  41 +++++++++
- drivers/staging/fsl-dpaa2/Makefile      |   9 ++
- 18 files changed, 312 insertions(+), 4 deletions(-)
arch/arm/mach-imx/Kconfig               |  1 +
+ drivers/base/Kconfig                    |  1 +
+ drivers/crypto/Makefile                 |  2 +-
+ drivers/net/ethernet/freescale/Kconfig  |  4 ++-
+ drivers/net/ethernet/freescale/Makefile |  2 ++
+ drivers/ptp/Kconfig                     | 29 +++++++++++++++++++
+ drivers/rtc/Kconfig                     |  8 ++++++
+ drivers/rtc/Makefile                    |  1 +
+ drivers/soc/Kconfig                     |  3 +-
+ drivers/soc/fsl/Kconfig                 | 22 ++++++++++++++
+ drivers/soc/fsl/Kconfig.arm             | 16 +++++++++++
+ drivers/soc/fsl/Makefile                |  4 +++
+ drivers/soc/fsl/layerscape/Kconfig      | 10 +++++++
+ drivers/soc/fsl/layerscape/Makefile     |  1 +
+ drivers/staging/Kconfig                 |  6 ++++
+ drivers/staging/Makefile                |  3 ++
+ drivers/staging/fsl-dpaa2/Kconfig       | 51 +++++++++++++++++++++++++++++++++
+ drivers/staging/fsl-dpaa2/Makefile      |  9 ++++++
+ 18 files changed, 169 insertions(+), 4 deletions(-)
  create mode 100644 drivers/soc/fsl/Kconfig
  create mode 100644 drivers/soc/fsl/Kconfig.arm
  create mode 100644 drivers/soc/fsl/layerscape/Kconfig
  create mode 100644 drivers/soc/fsl/layerscape/Makefile
- create mode 100644 drivers/soc/fsl/rcpm.c
  create mode 100644 drivers/staging/fsl-dpaa2/Kconfig
  create mode 100644 drivers/staging/fsl-dpaa2/Makefile
 
+--- a/arch/arm/mach-imx/Kconfig
++++ b/arch/arm/mach-imx/Kconfig
+@@ -1,6 +1,7 @@
+ menuconfig ARCH_MXC
+       bool "Freescale i.MX family"
+       depends on ARCH_MULTI_V4_V5 || ARCH_MULTI_V6_V7 || ARM_SINGLE_ARMV7M
++      select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE
+       select ARCH_SUPPORTS_BIG_ENDIAN
+       select CLKSRC_IMX_GPT
+       select GENERIC_IRQ_CHIP
 --- a/drivers/base/Kconfig
 +++ b/drivers/base/Kconfig
 @@ -240,6 +240,7 @@ config GENERIC_CPU_VULNERABILITIES
@@ -239,163 +248,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +++ b/drivers/soc/fsl/layerscape/Makefile
 @@ -0,0 +1 @@
 +obj-$(CONFIG_FTM_ALARM) += ftm_alarm.o
---- /dev/null
-+++ b/drivers/soc/fsl/rcpm.c
-@@ -0,0 +1,154 @@
-+/*
-+ * Run Control and Power Management (RCPM) driver
-+ *
-+ * Copyright 2016 NXP
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ */
-+#define pr_fmt(fmt) "RCPM: %s: " fmt, __func__
-+
-+#include <linux/kernel.h>
-+#include <linux/io.h>
-+#include <linux/of_platform.h>
-+#include <linux/of_address.h>
-+#include <linux/suspend.h>
-+
-+/* RCPM register offset */
-+#define RCPM_IPPDEXPCR0                       0x140
-+
-+#define RCPM_WAKEUP_CELL_SIZE 2
-+
-+struct rcpm_config {
-+      int ipp_num;
-+      int ippdexpcr_offset;
-+      u32 ippdexpcr[2];
-+      void *rcpm_reg_base;
-+};
-+
-+static struct rcpm_config *rcpm;
-+
-+static inline void rcpm_reg_write(u32 offset, u32 value)
-+{
-+      iowrite32be(value, rcpm->rcpm_reg_base + offset);
-+}
-+
-+static inline u32 rcpm_reg_read(u32 offset)
-+{
-+      return ioread32be(rcpm->rcpm_reg_base + offset);
-+}
-+
-+static void rcpm_wakeup_fixup(struct device *dev, void *data)
-+{
-+      struct device_node *node = dev ? dev->of_node : NULL;
-+      u32 value[RCPM_WAKEUP_CELL_SIZE];
-+      int ret, i;
-+
-+      if (!dev || !node || !device_may_wakeup(dev))
-+              return;
-+
-+      /*
-+       * Get the values in the "rcpm-wakeup" property.
-+       * Three values are:
-+       * The first is a pointer to the RCPM node.
-+       * The second is the value of the ippdexpcr0 register.
-+       * The third is the value of the ippdexpcr1 register.
-+       */
-+      ret = of_property_read_u32_array(node, "fsl,rcpm-wakeup",
-+                                       value, RCPM_WAKEUP_CELL_SIZE);
-+      if (ret)
-+              return;
-+
-+      pr_debug("wakeup source: the device %s\n", node->full_name);
-+
-+      for (i = 0; i < rcpm->ipp_num; i++)
-+              rcpm->ippdexpcr[i] |= value[i + 1];
-+}
-+
-+static int rcpm_suspend_prepare(void)
-+{
-+      int i;
-+
-+      BUG_ON(!rcpm);
-+
-+      for (i = 0; i < rcpm->ipp_num; i++)
-+              rcpm->ippdexpcr[i] = 0;
-+
-+      dpm_for_each_dev(NULL, rcpm_wakeup_fixup);
-+
-+      for (i = 0; i < rcpm->ipp_num; i++) {
-+              rcpm_reg_write(rcpm->ippdexpcr_offset + 4 * i,
-+                             rcpm->ippdexpcr[i]);
-+              pr_debug("ippdexpcr%d = 0x%x\n", i, rcpm->ippdexpcr[i]);
-+      }
-+
-+      return 0;
-+}
-+
-+static int rcpm_suspend_notifier_call(struct notifier_block *bl,
-+                                    unsigned long state,
-+                                    void *unused)
-+{
-+      switch (state) {
-+      case PM_SUSPEND_PREPARE:
-+              rcpm_suspend_prepare();
-+              break;
-+      }
-+
-+      return NOTIFY_DONE;
-+}
-+
-+static struct rcpm_config rcpm_default_config = {
-+      .ipp_num = 1,
-+      .ippdexpcr_offset = RCPM_IPPDEXPCR0,
-+};
-+
-+static const struct of_device_id rcpm_matches[] = {
-+      {
-+              .compatible = "fsl,qoriq-rcpm-2.1",
-+              .data = &rcpm_default_config,
-+      },
-+      {}
-+};
-+
-+static struct notifier_block rcpm_suspend_notifier = {
-+      .notifier_call = rcpm_suspend_notifier_call,
-+};
-+
-+static int __init layerscape_rcpm_init(void)
-+{
-+      const struct of_device_id *match;
-+      struct device_node *np;
-+
-+      np = of_find_matching_node_and_match(NULL, rcpm_matches, &match);
-+      if (!np) {
-+              pr_err("Can't find the RCPM node.\n");
-+              return -EINVAL;
-+      }
-+
-+      if (match->data)
-+              rcpm = (struct rcpm_config *)match->data;
-+      else
-+              return -EINVAL;
-+
-+      rcpm->rcpm_reg_base = of_iomap(np, 0);
-+      of_node_put(np);
-+      if (!rcpm->rcpm_reg_base)
-+              return -ENOMEM;
-+
-+      register_pm_notifier(&rcpm_suspend_notifier);
-+
-+      pr_info("The RCPM driver initialized.\n");
-+
-+      return 0;
-+}
-+
-+subsys_initcall(layerscape_rcpm_init);
 --- a/drivers/staging/Kconfig
 +++ b/drivers/staging/Kconfig
 @@ -94,6 +94,8 @@ source "drivers/staging/fbtft/Kconfig"
@@ -433,7 +285,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +obj-$(CONFIG_FSL_PPFE)                += fsl_ppfe/
 --- /dev/null
 +++ b/drivers/staging/fsl-dpaa2/Kconfig
-@@ -0,0 +1,41 @@
+@@ -0,0 +1,51 @@
 +#
 +# Freescale DataPath Acceleration Architecture Gen2 (DPAA2) drivers
 +#
@@ -470,6 +322,16 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      default n
 +      ---help---
 +        Enable advanced statistics through debugfs interface.
++
++config FSL_DPAA2_ETH_DCB
++        bool "Data Center Bridging (DCB) Support"
++        default n
++        depends on DCB
++        ---help---
++          Say Y here if you want to use Data Center Bridging (DCB) features
++          (PFC) in the driver.
++
++          If unsure, say N.
 +endif
 +
 +source "drivers/staging/fsl-dpaa2/mac/Kconfig"
index 5140825..158ce0c 100644 (file)
@@ -1,9 +1,9 @@
-From c37953457a7ebeb0d97ae8574b3d41274fcd9119 Mon Sep 17 00:00:00 2001
+From 67a2eceebe9dcd92a1a5f3e912340c8975c84434 Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Wed, 1 Nov 2017 16:22:33 +0800
-Subject: [PATCH] core-linux: support layerscape
+Date: Wed, 17 Jan 2018 14:50:41 +0800
+Subject: [PATCH 02/30] core-linux: support layerscape
 
-This is a integrated patch for layerscape core-linux support.
+This is an integrated patch for layerscape core-linux support.
 
 Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com>
 Signed-off-by: Zhao Qiang <qiang.zhao@nxp.com>
@@ -18,7 +18,7 @@ Signed-off-by: Arnd Bergmann <arnd@arndb.de>
 Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 ---
  drivers/base/devres.c           | 66 ++++++++++++++++++++++++++++
- drivers/base/soc.c              | 66 ++++++++++++++++++++++++++++
+ drivers/base/soc.c              | 70 +++++++++++++++++++++++++++++
  include/linux/device.h          | 19 ++++++++
  include/linux/fsl/svr.h         | 97 +++++++++++++++++++++++++++++++++++++++++
  include/linux/fsl_devices.h     |  3 ++
@@ -30,7 +30,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  net/core/dev.c                  | 13 +++++-
  net/core/skbuff.c               | 29 +++++++++++-
  net/sched/sch_generic.c         |  7 +++
- 13 files changed, 309 insertions(+), 3 deletions(-)
+ 13 files changed, 313 insertions(+), 3 deletions(-)
  create mode 100644 include/linux/fsl/svr.h
 
 --- a/drivers/base/devres.c
@@ -122,7 +122,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
  static DEFINE_IDA(soc_ida);
  
-@@ -159,3 +160,68 @@ static int __init soc_bus_register(void)
+@@ -159,3 +160,72 @@ static int __init soc_bus_register(void)
        return bus_register(&soc_bus_type);
  }
  core_initcall(soc_bus_register);
@@ -133,19 +133,23 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      const struct soc_device_attribute *match = arg;
 +
 +      if (match->machine &&
-+          !glob_match(match->machine, soc_dev->attr->machine))
++          (!soc_dev->attr->machine ||
++           !glob_match(match->machine, soc_dev->attr->machine)))
 +              return 0;
 +
 +      if (match->family &&
-+          !glob_match(match->family, soc_dev->attr->family))
++          (!soc_dev->attr->family ||
++           !glob_match(match->family, soc_dev->attr->family)))
 +              return 0;
 +
 +      if (match->revision &&
-+          !glob_match(match->revision, soc_dev->attr->revision))
++          (!soc_dev->attr->revision ||
++           !glob_match(match->revision, soc_dev->attr->revision)))
 +              return 0;
 +
 +      if (match->soc_id &&
-+          !glob_match(match->soc_id, soc_dev->attr->soc_id))
++          (!soc_dev->attr->soc_id ||
++           !glob_match(match->soc_id, soc_dev->attr->soc_id)))
 +              return 0;
 +
 +      return 1;
index 135333e..0276ebe 100644 (file)
@@ -1,12 +1,12 @@
-From 739029f49bd9181b821298f9d27b29ce2d292967 Mon Sep 17 00:00:00 2001
+From 45e934873f9147f692dddbb61abc088f4c8059d7 Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 25 Sep 2017 10:03:52 +0800
-Subject: [PATCH] arch: support layerscape
+Date: Wed, 17 Jan 2018 14:51:29 +0800
+Subject: [PATCH 03/30] arch: support layerscape
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
 
-This is a integrated patch for layerscape arch support.
+This is an integrated patch for layerscape arch support.
 
 Signed-off-by: Madalin Bucur <madalin.bucur@nxp.com>
 Signed-off-by: Nipun Gupta <nipun.gupta@nxp.com>
@@ -29,13 +29,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  arch/arm/mm/ioremap.c                 |  7 ++++
  arch/arm/mm/mmu.c                     |  9 +++++
  arch/arm64/include/asm/cache.h        |  2 +-
- arch/arm64/include/asm/io.h           |  2 ++
+ arch/arm64/include/asm/io.h           | 30 +++++++++++++++++
  arch/arm64/include/asm/pci.h          |  4 +++
  arch/arm64/include/asm/pgtable-prot.h |  1 +
  arch/arm64/include/asm/pgtable.h      |  5 +++
  arch/arm64/kernel/pci.c               | 62 +++++++++++++++++++++++++++++++++++
- arch/arm64/mm/dma-mapping.c           | 23 ++++++++++---
- 15 files changed, 209 insertions(+), 8 deletions(-)
+ arch/arm64/mm/dma-mapping.c           |  6 ++++
+ 15 files changed, 225 insertions(+), 3 deletions(-)
 
 --- a/arch/arm/include/asm/delay.h
 +++ b/arch/arm/include/asm/delay.h
@@ -284,6 +284,41 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                                                __pgprot(PROT_NORMAL_NS))
  #define iounmap                               __iounmap
  
+ /*
+@@ -184,6 +186,34 @@ extern void __iomem *ioremap_cache(phys_
+ #define iowrite32be(v,p)      ({ __iowmb(); __raw_writel((__force __u32)cpu_to_be32(v), p); })
+ #define iowrite64be(v,p)      ({ __iowmb(); __raw_writeq((__force __u64)cpu_to_be64(v), p); })
++/* access ports */
++#define setbits32(_addr, _v) iowrite32be(ioread32be(_addr) |  (_v), (_addr))
++#define clrbits32(_addr, _v) iowrite32be(ioread32be(_addr) & ~(_v), (_addr))
++
++#define setbits16(_addr, _v) iowrite16be(ioread16be(_addr) |  (_v), (_addr))
++#define clrbits16(_addr, _v) iowrite16be(ioread16be(_addr) & ~(_v), (_addr))
++
++#define setbits8(_addr, _v) iowrite8(ioread8(_addr) |  (_v), (_addr))
++#define clrbits8(_addr, _v) iowrite8(ioread8(_addr) & ~(_v), (_addr))
++
++/* Clear and set bits in one shot.  These macros can be used to clear and
++ * set multiple bits in a register using a single read-modify-write.  These
++ * macros can also be used to set a multiple-bit bit pattern using a mask,
++ * by specifying the mask in the 'clear' parameter and the new bit pattern
++ * in the 'set' parameter.
++ */
++
++#define clrsetbits_be32(addr, clear, set) \
++      iowrite32be((ioread32be(addr) & ~(clear)) | (set), (addr))
++#define clrsetbits_le32(addr, clear, set) \
++      iowrite32le((ioread32le(addr) & ~(clear)) | (set), (addr))
++#define clrsetbits_be16(addr, clear, set) \
++      iowrite16be((ioread16be(addr) & ~(clear)) | (set), (addr))
++#define clrsetbits_le16(addr, clear, set) \
++      iowrite16le((ioread16le(addr) & ~(clear)) | (set), (addr))
++#define clrsetbits_8(addr, clear, set) \
++      iowrite8((ioread8(addr) & ~(clear)) | (set), (addr))
++
+ #include <asm-generic/io.h>
  /*
 --- a/arch/arm64/include/asm/pci.h
 +++ b/arch/arm64/include/asm/pci.h
index 7dae7d6..361f43c 100644 (file)
@@ -1,9 +1,9 @@
-From bfa4a794f91162cfeccfa4d59121cde9a84e32a3 Mon Sep 17 00:00:00 2001
+From 1806d342beb334c8cb0a438315ad5529262b2791 Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 25 Sep 2017 10:02:10 +0800
-Subject: [PATCH] dts: support layercape
+Date: Wed, 17 Jan 2018 14:52:50 +0800
+Subject: [PATCH 04/30] dts: support layercape
 
-This is a integrated patch for layerscape dts support.
+This is an integrated patch for layerscape dts support.
 
 Signed-off-by: Amrita Kumari <amrita.kumari@nxp.com>
 Signed-off-by: Alison Wang <b18965@freescale.com>
@@ -32,9 +32,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  arch/arm/boot/dts/ecx-2000.dts                     |   2 +-
  arch/arm/boot/dts/imx6ul.dtsi                      |   4 +-
  arch/arm/boot/dts/keystone.dtsi                    |   4 +-
- arch/arm/boot/dts/ls1021a-qds.dts                  |  13 +
- arch/arm/boot/dts/ls1021a-twr.dts                  |  13 +
- arch/arm/boot/dts/ls1021a.dtsi                     | 155 ++--
+ arch/arm/boot/dts/ls1021a-qds.dts                  |  21 +
+ arch/arm/boot/dts/ls1021a-twr.dts                  |  25 +
+ arch/arm/boot/dts/ls1021a.dtsi                     | 197 +++--
  arch/arm/boot/dts/mt6580.dtsi                      |   2 +-
  arch/arm/boot/dts/mt6589.dtsi                      |   2 +-
  arch/arm/boot/dts/mt8127.dtsi                      |   2 +-
@@ -44,28 +44,29 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  arch/arm/boot/dts/sun7i-a20.dtsi                   |   4 +-
  arch/arm/boot/dts/sun8i-a23-a33.dtsi               |   2 +-
  arch/arm/boot/dts/sun9i-a80.dtsi                   |   2 +-
- arch/arm64/boot/dts/freescale/Makefile             |  16 +
+ arch/arm64/boot/dts/freescale/Makefile             |  17 +
+ .../boot/dts/freescale/fsl-ls1012a-2g5rdb.dts      | 123 +++
  arch/arm64/boot/dts/freescale/fsl-ls1012a-frdm.dts | 177 ++++
- arch/arm64/boot/dts/freescale/fsl-ls1012a-qds.dts  | 198 +++++
- arch/arm64/boot/dts/freescale/fsl-ls1012a-rdb.dts  | 13+++
- arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi     | 594 ++++++++++++++
+ arch/arm64/boot/dts/freescale/fsl-ls1012a-qds.dts  | 202 +++++
+ arch/arm64/boot/dts/freescale/fsl-ls1012a-rdb.dts  | 138 ++++
+ arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi     | 602 ++++++++++++++
  arch/arm64/boot/dts/freescale/fsl-ls1043-post.dtsi |  45 +
  .../boot/dts/freescale/fsl-ls1043a-qds-sdk.dts     |  69 ++
  arch/arm64/boot/dts/freescale/fsl-ls1043a-qds.dts  | 171 +++-
  .../boot/dts/freescale/fsl-ls1043a-rdb-sdk.dts     |  69 ++
  .../boot/dts/freescale/fsl-ls1043a-rdb-usdpaa.dts  | 117 +++
  arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts  | 113 ++-
- arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi     | 302 ++++++-
+ arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi     | 308 ++++++-
  arch/arm64/boot/dts/freescale/fsl-ls1046-post.dtsi |  48 ++
- .../boot/dts/freescale/fsl-ls1046a-qds-sdk.dts     | 109 +++
+ .../boot/dts/freescale/fsl-ls1046a-qds-sdk.dts     | 110 +++
  arch/arm64/boot/dts/freescale/fsl-ls1046a-qds.dts  | 363 ++++++++
- .../boot/dts/freescale/fsl-ls1046a-rdb-sdk.dts     |  76 ++
+ .../boot/dts/freescale/fsl-ls1046a-rdb-sdk.dts     |  83 ++
  .../boot/dts/freescale/fsl-ls1046a-rdb-usdpaa.dts  | 110 +++
  arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts  | 218 +++++
- arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi     | 793 ++++++++++++++++++
+ arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi     | 800 ++++++++++++++++++
  arch/arm64/boot/dts/freescale/fsl-ls1088a-qds.dts  | 173 ++++
  arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dts  | 236 ++++++
- arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi     | 818 ++++++++++++++++++
+ arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi     | 825 ++++++++++++++++++
  arch/arm64/boot/dts/freescale/fsl-ls2080a-qds.dts  | 191 ++---
  arch/arm64/boot/dts/freescale/fsl-ls2080a-rdb.dts  | 169 ++--
  arch/arm64/boot/dts/freescale/fsl-ls2080a-simu.dts |   9 +-
@@ -76,9 +77,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  arch/arm64/boot/dts/freescale/fsl-ls2088a.dtsi     | 195 +++++
  arch/arm64/boot/dts/freescale/fsl-ls208xa-qds.dtsi | 198 +++++
  arch/arm64/boot/dts/freescale/fsl-ls208xa-rdb.dtsi | 161 ++++
- arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi     | 912 +++++++++++++++++++++
+ arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi     | 919 +++++++++++++++++++++
  .../boot/dts/freescale/qoriq-bman1-portals.dtsi    |  81 ++
- arch/arm64/boot/dts/freescale/qoriq-dpaa-eth.dtsi  |  66 ++
+ arch/arm64/boot/dts/freescale/qoriq-dpaa-eth.dtsi  |  73 ++
  .../boot/dts/freescale/qoriq-fman3-0-10g-0.dtsi    |  43 +
  .../boot/dts/freescale/qoriq-fman3-0-10g-1.dtsi    |  43 +
  .../boot/dts/freescale/qoriq-fman3-0-1g-0.dtsi     |  42 +
@@ -93,7 +94,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  arch/powerpc/boot/dts/fsl/qoriq-bman1-portals.dtsi |  10 +
  arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi |   4 +-
  arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi |   4 +-
- 66 files changed, 7988 insertions(+), 1021 deletions(-)
+ 67 files changed, 8231 insertions(+), 1022 deletions(-)
+ create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1012a-2g5rdb.dts
  create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1012a-frdm.dts
  create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1012a-qds.dts
  create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1012a-rdb.dts
@@ -221,6 +223,18 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  &enet0 {
        tbi-handle = <&tbi0>;
        phy-handle = <&sgmii_phy1c>;
+@@ -331,3 +344,11 @@
+ &uart1 {
+       status = "okay";
+ };
++
++&can0 {
++      status = "okay";
++};
++
++&can1 {
++      status = "okay";
++};
 --- a/arch/arm/boot/dts/ls1021a-twr.dts
 +++ b/arch/arm/boot/dts/ls1021a-twr.dts
 @@ -142,6 +142,19 @@
@@ -243,6 +257,29 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  &enet0 {
        tbi-handle = <&tbi1>;
        phy-handle = <&sgmii_phy2>;
+@@ -228,6 +241,10 @@
+       };
+ };
++&esdhc {
++        status = "okay";
++};
++
+ &sai1 {
+       status = "okay";
+ };
+@@ -243,3 +260,11 @@
+ &uart1 {
+       status = "okay";
+ };
++
++&can0 {
++      status = "okay";
++};
++
++&can1 {
++      status = "okay";
++};
 --- a/arch/arm/boot/dts/ls1021a.dtsi
 +++ b/arch/arm/boot/dts/ls1021a.dtsi
 @@ -74,17 +74,24 @@
@@ -303,7 +340,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        reg = <0x0 0x1570e08 0x0 0x8>;
                        msi-controller;
                        interrupts = <GIC_SPI 180 IRQ_TYPE_LEVEL_HIGH>;
-@@ -137,11 +144,12 @@
+@@ -137,16 +144,17 @@
                        compatible = "fsl,ifc", "simple-bus";
                        reg = <0x0 0x1530000 0x0 0x10000>;
                        interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
@@ -317,6 +354,12 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        big-endian;
                };
  
+               esdhc: esdhc@1560000 {
+-                      compatible = "fsl,esdhc";
++                      compatible = "fsl,ls1021a-esdhc","fsl,esdhc";
+                       reg = <0x0 0x1560000 0x0 0x10000>;
+                       interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
+                       clock-frequency = <0>;
 @@ -163,7 +171,7 @@
                              <0x0 0x20220520 0x0 0x4>;
                        reg-names = "ahci", "sata-ecc";
@@ -536,9 +579,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +              qdma: qdma@8390000 {
 +                      compatible = "fsl,ls1021a-qdma";
-+                      reg = <0x0 0x8388000 0x0 0x1000>, /* Controller regs */
-+                            <0x0 0x8389000 0x0 0x1000>, /* Status regs */
-+                            <0x0 0x838a000 0x0 0x2000>; /* Block regs */
++                      reg = <0x0 0x8398000 0x0 0x1000>, /* Controller regs */
++                            <0x0 0x8399000 0x0 0x1000>, /* Status regs */
++                            <0x0 0x839a000 0x0 0x2000>; /* Block regs */
 +                      interrupts = <GIC_SPI 185 IRQ_TYPE_LEVEL_HIGH>,
 +                                   <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
 +                      interrupt-names = "qdma-error", "qdma-queue";
@@ -609,6 +652,52 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        #interrupt-cells = <1>;
                        interrupt-map-mask = <0 0 0 7>;
                        interrupt-map = <0000 0 0 1 &gic GIC_SPI 92  IRQ_TYPE_LEVEL_HIGH>,
+@@ -674,5 +697,45 @@
+                                       <0000 0 0 3 &gic GIC_SPI 191 IRQ_TYPE_LEVEL_HIGH>,
+                                       <0000 0 0 4 &gic GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>;
+               };
++
++              can0: can@2a70000 {
++                      compatible = "fsl,ls1021ar2-flexcan";
++                      reg = <0x0 0x2a70000 0x0 0x1000>;
++                      interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>;
++                      clocks = <&clockgen 4 1>, <&clockgen 4 1>;
++                      clock-names = "ipg", "per";
++                      big-endian;
++                      status = "disabled";
++              };
++
++              can1: can@2a80000 {
++                      compatible = "fsl,ls1021ar2-flexcan";
++                      reg = <0x0 0x2a80000 0x0 0x1000>;
++                      interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>;
++                      clocks = <&clockgen 4 1>, <&clockgen 4 1>;
++                      clock-names = "ipg", "per";
++                      big-endian;
++                      status = "disabled";
++              };
++
++              can2: can@2a90000 {
++                      compatible = "fsl,ls1021ar2-flexcan";
++                      reg = <0x0 0x2a90000 0x0 0x1000>;
++                      interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>;
++                      clocks = <&clockgen 4 1>, <&clockgen 4 1>;
++                      clock-names = "ipg", "per";
++                      big-endian;
++                      status = "disabled";
++              };
++
++              can3: can@2aa0000 {
++                      compatible = "fsl,ls1021ar2-flexcan";
++                      reg = <0x0 0x2aa0000 0x0 0x1000>;
++                      interrupts = <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>;
++                      clocks = <&clockgen 4 1>, <&clockgen 4 1>;
++                      clock-names = "ipg", "per";
++                      big-endian;
++                      status = "disabled";
++              };
+       };
+ };
 --- a/arch/arm/boot/dts/mt6580.dtsi
 +++ b/arch/arm/boot/dts/mt6580.dtsi
 @@ -91,7 +91,7 @@
@@ -713,10 +802,11 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        interrupt-controller;
 --- a/arch/arm64/boot/dts/freescale/Makefile
 +++ b/arch/arm64/boot/dts/freescale/Makefile
-@@ -1,8 +1,24 @@
+@@ -1,8 +1,25 @@
 +dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1012a-frdm.dtb
 +dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1012a-qds.dtb
 +dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1012a-rdb.dtb
++dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1012a-2g5rdb.dtb
  dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1043a-qds.dtb
 +dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1043a-qds-sdk.dtb
  dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1043a-rdb.dtb
@@ -739,6 +829,132 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  always                := $(dtb-y)
  subdir-y      := $(dts-dirs)
 --- /dev/null
++++ b/arch/arm64/boot/dts/freescale/fsl-ls1012a-2g5rdb.dts
+@@ -0,0 +1,123 @@
++/*
++ * Device Tree file for NXP LS1012A 2G5RDB Board.
++ *
++ * Copyright 2017 NXP
++ *
++ * Bhaskar Upadhaya <bhaskar.upadhaya@nxp.com>
++ *
++ * This file is dual-licensed: you can use it either under the terms
++ * of the GPLv2 or the X11 license, at your option. Note that this dual
++ * licensing only applies to this file, and not this project as a
++ * whole.
++ *
++ *  a) This library is free software; you can redistribute it and/or
++ *     modify it under the terms of the GNU General Public License as
++ *     published by the Free Software Foundation; either version 2 of the
++ *     License, or (at your option) any later version.
++ *
++ *     This library is distributed in the hope that it will be useful,
++ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *     GNU General Public License for more details.
++ *
++ * Or, alternatively,
++ *
++ *  b) Permission is hereby granted, free of charge, to any person
++ *     obtaining a copy of this software and associated documentation
++ *     files (the "Software"), to deal in the Software without
++ *     restriction, including without limitation the rights to use,
++ *     copy, modify, merge, publish, distribute, sublicense, and/or
++ *     sell copies of the Software, and to permit persons to whom the
++ *     Software is furnished to do so, subject to the following
++ *     conditions:
++ *
++ *     The above copyright notice and this permission notice shall be
++ *     included in all copies or substantial portions of the Software.
++ *
++ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
++ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
++ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
++ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ *     OTHER DEALINGS IN THE SOFTWARE.
++ */
++/dts-v1/;
++
++#include "fsl-ls1012a.dtsi"
++
++/ {
++      model = "LS1012A 2G5RDB Board";
++      compatible = "fsl,ls1012a-rdb", "fsl,ls1012a";
++
++      aliases {
++              ethernet0 = &pfe_mac0;
++              ethernet1 = &pfe_mac1;
++      };
++};
++
++&duart0 {
++      status = "okay";
++};
++
++&i2c0 {
++      status = "okay";
++};
++
++&qspi {
++      num-cs = <2>;
++      bus-num = <0>;
++      status = "okay";
++
++      qflash0: s25fs512s@0 {
++              compatible = "spansion,m25p80";
++              #address-cells = <1>;
++              #size-cells = <1>;
++              spi-max-frequency = <20000000>;
++              m25p,fast-read;
++              reg = <0>;
++      };
++};
++
++&sata {
++      status = "okay";
++};
++
++&pfe {
++      status = "okay";
++      #address-cells = <1>;
++      #size-cells = <0>;
++
++      ethernet@0 {
++              compatible = "fsl,pfe-gemac-port";
++              #address-cells = <1>;
++              #size-cells = <0>;
++              reg = <0x0>;    /* GEM_ID */
++              fsl,gemac-bus-id = <0x0>;       /* BUS_ID */
++              fsl,gemac-phy-id = <0x1>;       /* PHY_ID */
++              fsl,mdio-mux-val = <0x0>;
++              phy-mode = "sgmii-2500";
++              fsl,pfe-phy-if-flags = <0x0>;
++
++              mdio@0 {
++                      reg = <0x1>; /* enabled/disabled */
++              };
++      };
++
++      ethernet@1 {
++              compatible = "fsl,pfe-gemac-port";
++              #address-cells = <1>;
++              #size-cells = <0>;
++              reg = <0x1>;    /* GEM_ID */
++              fsl,gemac-bus-id = < 0x0>;      /* BUS_ID */
++              fsl,gemac-phy-id = < 0x2>;      /* PHY_ID */
++              fsl,mdio-mux-val = <0x0>;
++              phy-mode = "sgmii-2500";
++              fsl,pfe-phy-if-flags = <0x0>;
++
++              mdio@0 {
++                      reg = <0x0>; /* enabled/disabled */
++              };
++      };
++};
+--- /dev/null
 +++ b/arch/arm64/boot/dts/freescale/fsl-ls1012a-frdm.dts
 @@ -0,0 +1,177 @@
 +/*
@@ -920,7 +1136,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +};
 --- /dev/null
 +++ b/arch/arm64/boot/dts/freescale/fsl-ls1012a-qds.dts
-@@ -0,0 +1,198 @@
+@@ -0,0 +1,202 @@
 +/*
 + * Device Tree file for Freescale LS1012A QDS Board.
 + *
@@ -1021,6 +1237,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      };
 +};
 +
++&pcie {
++      status = "okay";
++};
++
 +&duart0 {
 +      status = "okay";
 +};
@@ -1121,7 +1341,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +};
 --- /dev/null
 +++ b/arch/arm64/boot/dts/freescale/fsl-ls1012a-rdb.dts
-@@ -0,0 +1,134 @@
+@@ -0,0 +1,138 @@
 +/*
 + * Device Tree file for Freescale LS1012A RDB Board.
 + *
@@ -1179,6 +1399,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      };
 +};
 +
++&pcie {
++      status = "okay";
++};
++
 +&duart0 {
 +      status = "okay";
 +};
@@ -1258,7 +1482,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +};
 --- /dev/null
 +++ b/arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi
-@@ -0,0 +1,594 @@
+@@ -0,0 +1,602 @@
 +/*
 + * Device Tree Include file for Freescale Layerscape-1012A family SoC.
 + *
@@ -1641,7 +1865,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      #size-cells = <0>;
 +                      reg = <0x0 0x2180000 0x0 0x10000>;
 +                      interrupts = <0 56 IRQ_TYPE_LEVEL_HIGH>;
-+                      clocks = <&clockgen 4 0>;
++                      clocks = <&clockgen 4 3>;
 +                      status = "disabled";
 +              };
 +
@@ -1651,7 +1875,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      #size-cells = <0>;
 +                      reg = <0x0 0x2190000 0x0 0x10000>;
 +                      interrupts = <0 57 IRQ_TYPE_LEVEL_HIGH>;
-+                      clocks = <&clockgen 4 0>;
++                      clocks = <&clockgen 4 3>;
 +                      status = "disabled";
 +              };
 +
@@ -1794,7 +2018,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      interrupts = <0 126 IRQ_TYPE_LEVEL_HIGH>;
 +              };
 +
-+              pcie@3400000 {
++              pcie: pcie@3400000 {
 +                      compatible = "fsl,ls1012a-pcie", "snps,dw-pcie";
 +                      reg = <0x00 0x03400000 0x0 0x00100000   /* controller registers */
 +                             0x40 0x00000000 0x0 0x00002000>; /* configuration space */
@@ -1816,6 +2040,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                                      <0000 0 0 2 &gic 0 111 IRQ_TYPE_LEVEL_HIGH>,
 +                                      <0000 0 0 3 &gic 0 112 IRQ_TYPE_LEVEL_HIGH>,
 +                                      <0000 0 0 4 &gic 0 113 IRQ_TYPE_LEVEL_HIGH>;
++                      status = "disabled";
 +              };
 +      };
 +
@@ -1852,6 +2077,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              pfe_mac1: ethernet@1 {
 +              };
 +      };
++
++      firmware {
++              optee {
++                      compatible = "linaro,optee-tz";
++                      method = "smc";
++              };
++      };
 +};
 --- /dev/null
 +++ b/arch/arm64/boot/dts/freescale/fsl-ls1043-post.dtsi
@@ -3006,9 +3238,16 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        #interrupt-cells = <1>;
                        interrupt-map-mask = <0 0 0 7>;
                        interrupt-map = <0000 0 0 1 &gic 0 154 0x4>,
-@@ -608,3 +869,6 @@
+@@ -607,4 +868,13 @@
+               };
        };
  
++      firmware {
++              optee {
++                      compatible = "linaro,optee-tz";
++                      method = "smc";
++              };
++      };
  };
 +
 +#include "qoriq-qman1-portals.dtsi"
@@ -3066,7 +3305,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +};
 --- /dev/null
 +++ b/arch/arm64/boot/dts/freescale/fsl-ls1046a-qds-sdk.dts
-@@ -0,0 +1,109 @@
+@@ -0,0 +1,110 @@
 +/*
 + * Device Tree Include file for Freescale Layerscape-1046A family SoC.
 + *
@@ -3137,6 +3376,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      ethernet@9 {
 +              compatible = "fsl,dpa-ethernet";
 +              fsl,fman-mac = <&enet7>;
++              dma-coherent;
 +      };
 +};
 +
@@ -3544,7 +3784,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +};
 --- /dev/null
 +++ b/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb-sdk.dts
-@@ -0,0 +1,76 @@
+@@ -0,0 +1,83 @@
 +/*
 + * Device Tree Include file for Freescale Layerscape-1046A family SoC.
 + *
@@ -3612,9 +3852,16 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +};
 +
 +&fsldpaa {
++      ethernet@0 {
++              status = "disabled";
++      };
++      ethernet@1 {
++              status = "disabled";
++      };
 +      ethernet@9 {
 +              compatible = "fsl,dpa-ethernet";
 +              fsl,fman-mac = <&enet7>;
++              dma-coherent;
 +      };
 +};
 +
@@ -3957,7 +4204,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +};
 --- /dev/null
 +++ b/arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi
-@@ -0,0 +1,793 @@
+@@ -0,0 +1,800 @@
 +/*
 + * Device Tree Include file for Freescale Layerscape-1046A family SoC.
 + *
@@ -4747,6 +4994,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      no-map;
 +              };
 +      };
++
++      firmware {
++              optee {
++                      compatible = "linaro,optee-tz";
++                      method = "smc";
++              };
++      };
 +};
 +
 +#include "qoriq-qman1-portals.dtsi"
@@ -5168,7 +5422,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +};
 --- /dev/null
 +++ b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
-@@ -0,0 +1,818 @@
+@@ -0,0 +1,825 @@
 +/*
 + * Device Tree Include file for NXP Layerscape-1088A family SoC.
 + *
@@ -5694,7 +5948,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      #size-cells = <0>;
 +                      reg = <0x0 0x2000000 0x0 0x10000>;
 +                      interrupts = <0 34 IRQ_TYPE_LEVEL_HIGH>;
-+                      clocks = <&clockgen 4 3>;
++                      clocks = <&clockgen 4 7>;
 +                      status = "disabled";
 +              };
 +
@@ -5704,7 +5958,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      #size-cells = <0>;
 +                      reg = <0x0 0x2010000 0x0 0x10000>;
 +                      interrupts = <0 34 IRQ_TYPE_LEVEL_HIGH>;
-+                      clocks = <&clockgen 4 3>;
++                      clocks = <&clockgen 4 7>;
 +                      status = "disabled";
 +              };
 +
@@ -5714,7 +5968,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      #size-cells = <0>;
 +                      reg = <0x0 0x2020000 0x0 0x10000>;
 +                      interrupts = <0 35 IRQ_TYPE_LEVEL_HIGH>;
-+                      clocks = <&clockgen 4 3>;
++                      clocks = <&clockgen 4 7>;
 +                      status = "disabled";
 +              };
 +
@@ -5724,7 +5978,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      #size-cells = <0>;
 +                      reg = <0x0 0x2030000 0x0 0x10000>;
 +                      interrupts = <0 35 IRQ_TYPE_LEVEL_HIGH>;
-+                      clocks = <&clockgen 4 3>;
++                      clocks = <&clockgen 4 7>;
 +                      status = "disabled";
 +              };
 +
@@ -5986,6 +6240,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              };
 +      };
 +
++      firmware {
++              optee {
++                      compatible = "linaro,optee-tz";
++                      method = "smc";
++              };
++      };
++
 +};
 --- a/arch/arm64/boot/dts/freescale/fsl-ls2080a-qds.dts
 +++ b/arch/arm64/boot/dts/freescale/fsl-ls2080a-qds.dts
@@ -8332,7 +8593,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +};
 --- /dev/null
 +++ b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
-@@ -0,0 +1,912 @@
+@@ -0,0 +1,919 @@
 +/*
 + * Device Tree Include file for Freescale Layerscape-2080A family SoC.
 + *
@@ -9024,7 +9285,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      reg = <0x0 0x2000000 0x0 0x10000>;
 +                      interrupts = <0 34 0x4>; /* Level high type */
 +                      clock-names = "i2c";
-+                      clocks = <&clockgen 4 3>;
++                      clocks = <&clockgen 4 1>;
 +              };
 +
 +              i2c1: i2c@2010000 {
@@ -9035,7 +9296,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      reg = <0x0 0x2010000 0x0 0x10000>;
 +                      interrupts = <0 34 0x4>; /* Level high type */
 +                      clock-names = "i2c";
-+                      clocks = <&clockgen 4 3>;
++                      clocks = <&clockgen 4 1>;
 +              };
 +
 +              i2c2: i2c@2020000 {
@@ -9046,7 +9307,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      reg = <0x0 0x2020000 0x0 0x10000>;
 +                      interrupts = <0 35 0x4>; /* Level high type */
 +                      clock-names = "i2c";
-+                      clocks = <&clockgen 4 3>;
++                      clocks = <&clockgen 4 1>;
 +              };
 +
 +              i2c3: i2c@2030000 {
@@ -9057,7 +9318,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      reg = <0x0 0x2030000 0x0 0x10000>;
 +                      interrupts = <0 35 0x4>; /* Level high type */
 +                      clock-names = "i2c";
-+                      clocks = <&clockgen 4 3>;
++                      clocks = <&clockgen 4 1>;
 +              };
 +
 +              ifc: ifc@2240000 {
@@ -9244,6 +9505,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              interrupts = <0 18 0x4>;
 +              little-endian;
 +      };
++
++      firmware {
++              optee {
++                      compatible = "linaro,optee-tz";
++                      method = "smc";
++              };
++      };
 +};
 --- /dev/null
 +++ b/arch/arm64/boot/dts/freescale/qoriq-bman1-portals.dtsi
@@ -9331,7 +9599,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +};
 --- /dev/null
 +++ b/arch/arm64/boot/dts/freescale/qoriq-dpaa-eth.dtsi
-@@ -0,0 +1,66 @@
+@@ -0,0 +1,73 @@
 +/*
 + * QorIQ FMan v3 10g port #1 device tree stub [ controller @ offset 0x400000 ]
 + *
@@ -9371,30 +9639,37 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      ethernet@0 {
 +              compatible = "fsl,dpa-ethernet";
 +              fsl,fman-mac = <&enet0>;
++              dma-coherent;
 +      };
 +      ethernet@1 {
 +              compatible = "fsl,dpa-ethernet";
 +              fsl,fman-mac = <&enet1>;
++              dma-coherent;
 +      };
 +      ethernet@2 {
 +              compatible = "fsl,dpa-ethernet";
 +              fsl,fman-mac = <&enet2>;
++              dma-coherent;
 +      };
 +      ethernet@3 {
 +              compatible = "fsl,dpa-ethernet";
 +              fsl,fman-mac = <&enet3>;
++              dma-coherent;
 +      };
 +      ethernet@4 {
 +              compatible = "fsl,dpa-ethernet";
 +              fsl,fman-mac = <&enet4>;
++              dma-coherent;
 +      };
 +      ethernet@5 {
 +              compatible = "fsl,dpa-ethernet";
 +              fsl,fman-mac = <&enet5>;
++              dma-coherent;
 +      };
 +      ethernet@8 {
 +              compatible = "fsl,dpa-ethernet";
 +              fsl,fman-mac = <&enet6>;
++              dma-coherent;
 +      };
 +};
 +
diff --git a/target/linux/layerscape/patches-4.9/303-arm-imx-select-ARCH_DMA_ADDR_T_64BIT-for-LPAE.patch b/target/linux/layerscape/patches-4.9/303-arm-imx-select-ARCH_DMA_ADDR_T_64BIT-for-LPAE.patch
deleted file mode 100644 (file)
index 097c432..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-From c079739fa1101dcf7a1e40a195e019065e327d15 Mon Sep 17 00:00:00 2001
-From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Fri, 20 Oct 2017 16:45:17 +0800
-Subject: [PATCH] arm: imx: select ARCH_DMA_ADDR_T_64BIT for LPAE
-
-Selected ARCH_DMA_ADDR_T_64BIT for LPAE since
-hardware could support it.
-
-Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
----
- arch/arm/mach-imx/Kconfig | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/arm/mach-imx/Kconfig
-+++ b/arch/arm/mach-imx/Kconfig
-@@ -1,6 +1,7 @@
- menuconfig ARCH_MXC
-       bool "Freescale i.MX family"
-       depends on ARCH_MULTI_V4_V5 || ARCH_MULTI_V6_V7 || ARM_SINGLE_ARMV7M
-+      select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE
-       select ARCH_SUPPORTS_BIG_ENDIAN
-       select CLKSRC_IMX_GPT
-       select GENERIC_IRQ_CHIP
index e4e7ff4..6ffc2e1 100644 (file)
@@ -1,9 +1,9 @@
-From a3757157751a8a5302ee5e11faf828dc5db02018 Mon Sep 17 00:00:00 2001
+From 825d57369b196b64387348922b47adc5b651622c Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 25 Sep 2017 10:53:50 +0800
-Subject: [PATCH] mtd: spi-nor: support layerscape
+Date: Wed, 17 Jan 2018 14:55:47 +0800
+Subject: [PATCH 05/30] mtd: spi-nor: support layerscape
 
-This is a integrated patch for layerscape qspi support.
+This is an integrated patch for layerscape qspi support.
 
 Signed-off-by: Suresh Gupta <suresh.gupta@nxp.com>
 Signed-off-by: Yunhui Cui <B56489@freescale.com>
index c4f1511..14f503f 100644 (file)
@@ -1,9 +1,9 @@
-From c0e4767d3b26f21e5043fe2d15a24a1958de766e Mon Sep 17 00:00:00 2001
+From d9d0181f74146507026c31cccd52dda27ec3d966 Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 25 Sep 2017 10:17:28 +0800
-Subject: [PATCH] mtd: support layerscape
+Date: Wed, 17 Jan 2018 14:57:31 +0800
+Subject: [PATCH 06/30] mtd: support layerscape
 
-This is a integrated patch for layerscape ifc-nor-nand support.
+This is an integrated patch for layerscape ifc-nor-nand support.
 
 Signed-off-by: Alison Wang <b18965@freescale.com>
 Signed-off-by: Prabhakar Kushwaha <prabhakar.kushwaha@nxp.com>
index 4ebcdc7..c318c57 100644 (file)
@@ -1,29 +1,30 @@
-From 3cd36deb674720ab34eabb9783648ed743e52121 Mon Sep 17 00:00:00 2001
+From 2f887ade916e7e1de2f8a84d3902aaa30af4b163 Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 25 Sep 2017 11:58:03 +0800
-Subject: [PATCH] sdk_dpaa: support layerscape
+Date: Wed, 17 Jan 2018 14:59:15 +0800
+Subject: [PATCH 07/30] sdk_dpaa: support layerscape
 
-This is a integrated patch for layerscape dpaa1-sdk support.
+This is an integrated patch for layerscape dpaa1-sdk support.
 
 Signed-off-by: Camelia Groza <camelia.groza@nxp.com>
 Signed-off-by: Zhao Qiang <qiang.zhao@nxp.com>
 Signed-off-by: Zhang Ying-22455 <ying.zhang22455@nxp.com>
 Signed-off-by: Madalin Bucur <madalin.bucur@nxp.com>
+Signed-off-by: Mathew McBride <matt@traverse.com.au>
 Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 ---
- drivers/net/ethernet/freescale/sdk_dpaa/Kconfig    |  173 +
+ drivers/net/ethernet/freescale/sdk_dpaa/Kconfig    |  196 +
  drivers/net/ethernet/freescale/sdk_dpaa/Makefile   |   46 +
  .../net/ethernet/freescale/sdk_dpaa/dpaa_1588.c    |  580 ++
  .../net/ethernet/freescale/sdk_dpaa/dpaa_1588.h    |  138 +
  .../net/ethernet/freescale/sdk_dpaa/dpaa_debugfs.c |  180 +
  .../net/ethernet/freescale/sdk_dpaa/dpaa_debugfs.h |   43 +
- drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c | 1213 ++++
+ drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c | 1224 ++++
  drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.h |  687 ++
  .../ethernet/freescale/sdk_dpaa/dpaa_eth_base.c    |  205 +
  .../ethernet/freescale/sdk_dpaa/dpaa_eth_base.h    |   49 +
- .../ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.c   | 1992 +++++
- .../ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.h   |  237 +
- .../ethernet/freescale/sdk_dpaa/dpaa_eth_common.c  | 1820 +++++
+ .../ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.c   | 2013 ++++++
+ .../ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.h   |  238 +
+ .../ethernet/freescale/sdk_dpaa/dpaa_eth_common.c  | 1802 +++++
  .../ethernet/freescale/sdk_dpaa/dpaa_eth_common.h  |  225 +
  .../ethernet/freescale/sdk_dpaa/dpaa_eth_proxy.c   |  381 +
  .../net/ethernet/freescale/sdk_dpaa/dpaa_eth_sg.c  | 1168 +++
@@ -241,14 +242,14 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  drivers/staging/fsl_qbman/dpa_sys_arm64.h          |  102 +
  drivers/staging/fsl_qbman/dpa_sys_ppc32.h          |   70 +
  drivers/staging/fsl_qbman/dpa_sys_ppc64.h          |   79 +
- drivers/staging/fsl_qbman/fsl_usdpaa.c             | 1983 +++++
+ drivers/staging/fsl_qbman/fsl_usdpaa.c             | 2007 ++++++
  drivers/staging/fsl_qbman/fsl_usdpaa_irq.c         |  289 +
  drivers/staging/fsl_qbman/qbman_driver.c           |   88 +
  drivers/staging/fsl_qbman/qman_config.c            | 1224 ++++
  drivers/staging/fsl_qbman/qman_debugfs.c           | 1594 ++++
  drivers/staging/fsl_qbman/qman_driver.c            |  977 +++
  drivers/staging/fsl_qbman/qman_high.c              | 5669 +++++++++++++++
- drivers/staging/fsl_qbman/qman_low.h               | 1427 ++++
+ drivers/staging/fsl_qbman/qman_low.h               | 1442 ++++
  drivers/staging/fsl_qbman/qman_private.h           |  398 +
  drivers/staging/fsl_qbman/qman_test.c              |   57 +
  drivers/staging/fsl_qbman/qman_test.h              |   45 +
@@ -268,7 +269,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  .../linux/fmd/integrations/integration_ioctls.h    |   56 +
  include/uapi/linux/fmd/ioctls.h                    |   96 +
  include/uapi/linux/fmd/net_ioctls.h                |  430 ++
- 257 files changed, 153159 insertions(+)
+ 257 files changed, 153236 insertions(+)
  create mode 100644 drivers/net/ethernet/freescale/sdk_dpaa/Kconfig
  create mode 100644 drivers/net/ethernet/freescale/sdk_dpaa/Makefile
  create mode 100644 drivers/net/ethernet/freescale/sdk_dpaa/dpaa_1588.c
@@ -529,7 +530,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 
 --- /dev/null
 +++ b/drivers/net/ethernet/freescale/sdk_dpaa/Kconfig
-@@ -0,0 +1,173 @@
+@@ -0,0 +1,196 @@
 +menuconfig FSL_SDK_DPAA_ETH
 +      tristate "DPAA Ethernet"
 +      depends on (FSL_SOC || ARM64 || ARM) && FSL_SDK_BMAN && FSL_SDK_QMAN && FSL_SDK_FMAN && !FSL_DPAA_ETH
@@ -552,6 +553,29 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      help
 +      Enable QoS offloading support through the CEETM hardware block.
 +
++config FSL_DPAA_CEETM_CCS_THRESHOLD_1G
++      hex "CEETM egress congestion threshold on 1G ports"
++      depends on FSL_DPAA_CEETM
++      range 0x1000 0x10000000
++      default "0x000a0000"
++      help
++        The size in bytes of the CEETM egress Class Congestion State threshold on 1G ports.
++        The threshold needs to be configured keeping in mind the following factors:
++             - A threshold too large will buffer frames for a long time in the TX queues,
++             when a small shaping rate is configured. This will cause buffer pool depletion
++             or out of memory errors. This in turn will cause frame loss on RX;
++             - A threshold too small will cause unnecessary frame loss by entering
++             congestion too often.
++
++config FSL_DPAA_CEETM_CCS_THRESHOLD_10G
++      hex "CEETM egress congestion threshold on 10G ports"
++      depends on FSL_DPAA_CEETM
++      range 0x1000 0x20000000
++      default "0x00640000"
++      help
++        The size in bytes of the CEETM egress Class Congestion State threshold on 10G ports.
++        See FSL_DPAA_CEETM_CCS_THRESHOLD_1G for details.
++
 +config FSL_DPAA_OFFLINE_PORTS
 +      bool "Offline Ports support"
 +      depends on FSL_SDK_DPAA_ETH
@@ -1707,7 +1731,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif /* DPAA_DEBUGFS_H_ */
 --- /dev/null
 +++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c
-@@ -0,0 +1,1213 @@
+@@ -0,0 +1,1224 @@
 +/* Copyright 2008-2013 Freescale Semiconductor Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -2485,6 +2509,17 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      /* Advertise NETIF_F_HW_ACCEL_MQ to avoid Tx timeout warnings */
 +      net_dev->features |= NETIF_F_HW_ACCEL_MQ;
 +
++#ifndef CONFIG_PPC
++      /* Due to the A010022 FMan errata, we can not use contig frames larger
++       * than 4K, nor S/G frames. We need to stop advertising S/G and GSO
++       * support.
++       */
++      if (unlikely(dpaa_errata_a010022)) {
++              net_dev->hw_features &= ~NETIF_F_SG;
++              net_dev->features &= ~NETIF_F_GSO;
++      }
++#endif
++
 +      return dpa_netdev_init(net_dev, mac_addr, tx_timeout);
 +}
 +
@@ -2573,7 +2608,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +      for (i = 0; i < count; i++) {
 +              int err;
-+              err = dpa_bp_alloc(&dpa_bp[i]);
++              err = dpa_bp_alloc(&dpa_bp[i], net_dev->dev.parent);
 +              if (err < 0) {
 +                      dpa_bp_free(priv);
 +                      priv->dpa_bp = NULL;
@@ -3792,7 +3827,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +      for (i = 0; i < count; i++) {
 +              int err;
-+              err = dpa_bp_alloc(&dpa_bp[i]);
++              err = dpa_bp_alloc(&dpa_bp[i], net_dev->dev.parent);
 +              if (err < 0) {
 +                      dpa_bp_free(priv);
 +                      priv->dpa_bp = NULL;
@@ -3873,7 +3908,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif /* __DPAA_ETH_BASE_H */
 --- /dev/null
 +++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.c
-@@ -0,0 +1,1992 @@
+@@ -0,0 +1,2013 @@
 +/* Copyright 2008-2016 Freescale Semiconductor Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -3945,24 +3980,27 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +static void ceetm_ern(struct qman_portal *portal, struct qman_fq *fq,
 +                    const struct qm_mr_entry *msg)
 +{
-+      struct net_device *net_dev;
-+      struct ceetm_class *cls;
++      struct dpa_percpu_priv_s *dpa_percpu_priv;
 +      struct ceetm_class_stats *cstats = NULL;
 +      const struct dpa_priv_s *dpa_priv;
-+      struct dpa_percpu_priv_s *dpa_percpu_priv;
-+      struct sk_buff *skb;
 +      struct qm_fd fd = msg->ern.fd;
++      struct net_device *net_dev;
++      struct ceetm_fq *ceetm_fq;
++      struct ceetm_class *cls;
++      struct sk_buff *skb;
 +
-+      net_dev = ((struct ceetm_fq *)fq)->net_dev;
++      ceetm_fq = container_of(fq, struct ceetm_fq, fq);
++      net_dev = ceetm_fq->net_dev;
 +      dpa_priv = netdev_priv(net_dev);
 +      dpa_percpu_priv = raw_cpu_ptr(dpa_priv->percpu_priv);
 +
 +      /* Increment DPA counters */
 +      dpa_percpu_priv->stats.tx_dropped++;
 +      dpa_percpu_priv->stats.tx_fifo_errors++;
++      count_ern(dpa_percpu_priv, msg);
 +
 +      /* Increment CEETM counters */
-+      cls = ((struct ceetm_fq *)fq)->ceetm_cls;
++      cls = ceetm_fq->ceetm_cls;
 +      switch (cls->type) {
 +      case CEETM_PRIO:
 +              cstats = this_cpu_ptr(cls->prio.cstats);
@@ -3975,11 +4013,15 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      if (cstats)
 +              cstats->ern_drop_count++;
 +
++      /* Release the buffers that were supposed to be recycled. */
 +      if (fd.bpid != 0xff) {
 +              dpa_fd_release(net_dev, &fd);
 +              return;
 +      }
 +
++      /* Release the frames that were supposed to return on the
++       * confirmation path.
++       */
 +      skb = _dpa_cleanup_tx_fd(dpa_priv, &fd);
 +      dev_kfree_skb_any(skb);
 +}
@@ -4001,16 +4043,16 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              break;
 +      }
 +
++      ceetm_fq->congested = congested;
++
 +      if (congested) {
 +              dpa_priv->cgr_data.congestion_start_jiffies = jiffies;
-+              netif_tx_stop_all_queues(dpa_priv->net_dev);
 +              dpa_priv->cgr_data.cgr_congested_count++;
 +              if (cstats)
 +                      cstats->congested_count++;
 +      } else {
 +              dpa_priv->cgr_data.congested_jiffies +=
 +                      (jiffies - dpa_priv->cgr_data.congestion_start_jiffies);
-+              netif_tx_wake_all_queues(dpa_priv->net_dev);
 +      }
 +}
 +
@@ -4024,6 +4066,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +      (*fq)->net_dev = dev;
 +      (*fq)->ceetm_cls = cls;
++      (*fq)->congested = 0;
 +      return 0;
 +}
 +
@@ -4061,9 +4104,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +      /* Set the congestion state thresholds according to the link speed */
 +      if (dpa_priv->mac_dev->if_support & SUPPORTED_10000baseT_Full)
-+              cs_th = CONFIG_FSL_DPAA_CS_THRESHOLD_10G;
++              cs_th = CONFIG_FSL_DPAA_CEETM_CCS_THRESHOLD_10G;
 +      else
-+              cs_th = CONFIG_FSL_DPAA_CS_THRESHOLD_1G;
++              cs_th = CONFIG_FSL_DPAA_CEETM_CCS_THRESHOLD_1G;
 +
 +      qm_cgr_cs_thres_set64(&ccg_params.cs_thres_in, cs_th, 1);
 +      qm_cgr_cs_thres_set64(&ccg_params.cs_thres_out,
@@ -5784,17 +5827,22 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +int __hot ceetm_tx(struct sk_buff *skb, struct net_device *net_dev)
 +{
-+      int ret;
-+      bool act_drop = false;
++      const int queue_mapping = dpa_get_queue_mapping(skb);
 +      struct Qdisc *sch = net_dev->qdisc;
-+      struct ceetm_class *cl;
-+      struct dpa_priv_s *priv_dpa;
-+      struct qman_fq *egress_fq, *conf_fq;
-+      struct ceetm_qdisc *priv = qdisc_priv(sch);
-+      struct ceetm_qdisc_stats *qstats = this_cpu_ptr(priv->root.qstats);
 +      struct ceetm_class_stats *cstats;
-+      const int queue_mapping = dpa_get_queue_mapping(skb);
-+      spinlock_t *root_lock = qdisc_lock(sch);
++      struct ceetm_qdisc_stats *qstats;
++      struct dpa_priv_s *priv_dpa;
++      struct ceetm_fq *ceetm_fq;
++      struct ceetm_qdisc *priv;
++      struct qman_fq *conf_fq;
++      struct ceetm_class *cl;
++      spinlock_t *root_lock;
++      bool act_drop = false;
++      int ret;
++
++      root_lock = qdisc_lock(sch);
++      priv = qdisc_priv(sch);
++      qstats = this_cpu_ptr(priv->root.qstats);
 +
 +      spin_lock(root_lock);
 +      cl = ceetm_classify(skb, sch, &ret, &act_drop);
@@ -5821,11 +5869,11 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +       */
 +      switch (cl->type) {
 +      case CEETM_PRIO:
-+              egress_fq = &cl->prio.fq->fq;
++              ceetm_fq = cl->prio.fq;
 +              cstats = this_cpu_ptr(cl->prio.cstats);
 +              break;
 +      case CEETM_WBFS:
-+              egress_fq = &cl->wbfs.fq->fq;
++              ceetm_fq = cl->wbfs.fq;
 +              cstats = this_cpu_ptr(cl->wbfs.cstats);
 +              break;
 +      default:
@@ -5833,8 +5881,16 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              goto drop;
 +      }
 +
++      /* If the FQ is congested, avoid enqueuing the frame and dropping it
++       * when it returns on the ERN path. Drop it here directly instead.
++       */
++      if (unlikely(ceetm_fq->congested)) {
++              qstats->drops++;
++              goto drop;
++      }
++
 +      bstats_update(&cstats->bstats, skb);
-+      return dpa_tx_extended(skb, net_dev, egress_fq, conf_fq);
++      return dpa_tx_extended(skb, net_dev, &ceetm_fq->fq, conf_fq);
 +
 +drop:
 +      dev_kfree_skb_any(skb);
@@ -5868,7 +5924,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +module_exit(ceetm_unregister);
 --- /dev/null
 +++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.h
-@@ -0,0 +1,237 @@
+@@ -0,0 +1,238 @@
 +/* Copyright 2008-2016 Freescale Semiconductor Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -5976,6 +6032,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      struct qman_fq fq;
 +      struct net_device *net_dev;
 +      struct ceetm_class *ceetm_cls;
++      int congested; /* Congestion status */
 +};
 +
 +struct root_q {
@@ -6108,7 +6165,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif
 --- /dev/null
 +++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.c
-@@ -0,0 +1,1820 @@
+@@ -0,0 +1,1802 @@
 +/* Copyright 2008-2013 Freescale Semiconductor, Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -6350,8 +6407,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 + * Calculates the statistics for the given device by adding the statistics
 + * collected by each CPU.
 + */
-+void __cold
-+dpa_get_stats64(struct net_device *net_dev,
++struct rtnl_link_stats64 __cold
++*dpa_get_stats64(struct net_device *net_dev,
 +              struct rtnl_link_stats64 *stats)
 +{
 +      struct dpa_priv_s *priv = netdev_priv(net_dev);
@@ -6369,6 +6426,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              for (j = 0; j < numstats; j++)
 +                      netstats[j] += cpustats[j];
 +      }
++      return stats;
 +}
 +EXPORT_SYMBOL(dpa_get_stats64);
 +
@@ -6580,14 +6638,18 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#ifdef CONFIG_FSL_DPAA_1588
 +      struct dpa_priv_s *priv = netdev_priv(dev);
 +#endif
-+      int ret = 0;
++      int ret = -EINVAL;
 +
-+      /* at least one timestamping feature must be enabled */
-+#ifdef CONFIG_FSL_DPAA_TS
 +      if (!netif_running(dev))
-+#endif
 +              return -EINVAL;
 +
++      if (cmd == SIOCGMIIREG) {
++              if (!dev->phydev)
++                      ret = -EINVAL;
++              else
++                      ret = phy_mii_ioctl(dev->phydev, rq, cmd);
++      }
++
 +#ifdef CONFIG_FSL_DPAA_TS
 +      if (cmd == SIOCSHWTSTAMP)
 +              return dpa_ts_ioctl(dev, rq, cmd);
@@ -6822,11 +6884,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +EXPORT_SYMBOL(dpa_set_buffers_layout);
 +
 +int __attribute__((nonnull))
-+dpa_bp_alloc(struct dpa_bp *dpa_bp)
++dpa_bp_alloc(struct dpa_bp *dpa_bp, struct device *dev)
 +{
 +      int err;
 +      struct bman_pool_params  bp_params;
-+      struct platform_device *pdev;
 +
 +      if (dpa_bp->size == 0 || dpa_bp->config_count == 0) {
 +              pr_err("Buffer pool is not properly initialized! Missing size or initial number of buffers");
@@ -6859,44 +6920,25 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +      dpa_bp->bpid = (uint8_t)bman_get_params(dpa_bp->pool)->bpid;
 +
-+      pdev = platform_device_register_simple("dpaa_eth_bpool",
-+                      dpa_bp->bpid, NULL, 0);
-+      if (IS_ERR(pdev)) {
-+              pr_err("platform_device_register_simple() failed\n");
-+              err = PTR_ERR(pdev);
-+              goto pdev_register_failed;
-+      }
-+      {
-+              struct dma_map_ops *ops = get_dma_ops(&pdev->dev);
-+              ops->dma_supported = NULL;
-+      }
-+      err = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(40));
++      err = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(40));
 +      if (err) {
 +              pr_err("dma_coerce_mask_and_coherent() failed\n");
-+              goto pdev_mask_failed;
++              goto bman_free_pool;
 +      }
-+#ifdef CONFIG_FMAN_ARM
-+      /* force coherency */
-+      pdev->dev.archdata.dma_coherent = true;
-+      arch_setup_dma_ops(&pdev->dev, 0, 0, NULL, true);
-+#endif
 +
-+      dpa_bp->dev = &pdev->dev;
++      dpa_bp->dev = dev;
 +
 +      if (dpa_bp->seed_cb) {
 +              err = dpa_bp->seed_cb(dpa_bp);
 +              if (err)
-+                      goto pool_seed_failed;
++                      goto bman_free_pool;
 +      }
 +
 +      dpa_bpid2pool_map(dpa_bp->bpid, dpa_bp);
 +
 +      return 0;
 +
-+pool_seed_failed:
-+pdev_mask_failed:
-+      platform_device_unregister(pdev);
-+pdev_register_failed:
++bman_free_pool:
 +      bman_free_pool(dpa_bp->pool);
 +
 +      return err;
@@ -6958,9 +7000,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +      dpa_bp_array[bp->bpid] = NULL;
 +      bman_free_pool(bp->pool);
-+
-+      if (bp->dev)
-+              platform_device_unregister(to_platform_device(bp->dev));
 +}
 +
 +void __cold __attribute__((nonnull))
@@ -8074,8 +8113,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +int __cold dpa_start(struct net_device *net_dev);
 +int __cold dpa_stop(struct net_device *net_dev);
 +void __cold dpa_timeout(struct net_device *net_dev);
-+void __cold
-+dpa_get_stats64(struct net_device *net_dev,
++struct rtnl_link_stats64 __cold
++*dpa_get_stats64(struct net_device *net_dev,
 +              struct rtnl_link_stats64 *stats);
 +int dpa_change_mtu(struct net_device *net_dev, int new_mtu);
 +int dpa_ndo_init(struct net_device *net_dev);
@@ -8098,7 +8137,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +void dpa_set_buffers_layout(struct mac_device *mac_dev,
 +              struct dpa_buffer_layout_s *layout);
 +int __attribute__((nonnull))
-+dpa_bp_alloc(struct dpa_bp *dpa_bp);
++dpa_bp_alloc(struct dpa_bp *dpa_bp, struct device *dev);
 +void __cold __attribute__((nonnull))
 +dpa_bp_free(struct dpa_priv_s *priv);
 +struct dpa_bp *dpa_bpid2pool(int bpid);
@@ -11972,7 +12011,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      [PHY_INTERFACE_MODE_RGMII_TXID] = "rgmii-txid",
 +      [PHY_INTERFACE_MODE_RTBI]       = "rtbi",
 +      [PHY_INTERFACE_MODE_XGMII]      = "xgmii",
-+      [PHY_INTERFACE_MODE_SGMII_2500] = "sgmii-2500",
++      [PHY_INTERFACE_MODE_2500SGMII] = "sgmii-2500",
 +};
 +
 +static phy_interface_t __pure __attribute__((nonnull)) str2phy(const char *str)
@@ -11999,7 +12038,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      [PHY_INTERFACE_MODE_RGMII_TXID] = SPEED_1000,
 +      [PHY_INTERFACE_MODE_RTBI]       = SPEED_1000,
 +      [PHY_INTERFACE_MODE_XGMII]      = SPEED_10000,
-+      [PHY_INTERFACE_MODE_SGMII_2500] = SPEED_2500,
++      [PHY_INTERFACE_MODE_2500SGMII] = SPEED_2500,
 +};
 +
 +static struct mac_device * __cold
@@ -129503,7 +129542,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif
 --- /dev/null
 +++ b/drivers/staging/fsl_qbman/fsl_usdpaa.c
-@@ -0,0 +1,1983 @@
+@@ -0,0 +1,2007 @@
 +/* Copyright (C) 2008-2012 Freescale Semiconductor, Inc.
 + * Authors: Andy Fleming <afleming@freescale.com>
 + *        Timur Tabi <timur@freescale.com>
@@ -129877,6 +129916,16 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +#define DQRR_MAXFILL 15
 +
++
++/* Invalidate a portal */
++void dbci_portal(void *addr)
++{
++      int i;
++
++      for (i = 0; i < 0x4000; i += 64)
++              dcbi(addr + i);
++}
++
 +/* Reset a QMan portal to its default state */
 +static int init_qm_portal(struct qm_portal_config *config,
 +                        struct qm_portal *portal)
@@ -129890,6 +129939,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      /* Make sure interrupts are inhibited */
 +      qm_out(IIR, 1);
 +
++      /*
++       * Invalidate the entire CE portal are to ensure no stale
++       * cachelines are present.  This should be done on all
++       * cores as the portal is mapped as M=0 (non-coherent).
++       */
++      on_each_cpu(dbci_portal, portal->addr.addr_ce, 1);
++
 +      /* Initialize the DQRR.  This will stop any dequeue
 +         commands that are in progress */
 +      if (qm_dqrr_init(portal, config, qm_dqrr_dpush, qm_dqrr_pvb,
@@ -129941,6 +129997,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      portal->addr.addr_ce = config->addr_virt[DPA_PORTAL_CE];
 +      portal->addr.addr_ci = config->addr_virt[DPA_PORTAL_CI];
 +
++      /*
++       * Invalidate the entire CE portal are to ensure no stale
++       * cachelines are present.  This should be done on all
++       * cores as the portal is mapped as M=0 (non-coherent).
++       */
++      on_each_cpu(dbci_portal, portal->addr.addr_ce, 1);
++
 +      if (bm_rcr_init(portal, bm_rcr_pvb, bm_rcr_cce)) {
 +              pr_err("Bman RCR initialisation failed\n");
 +      return 1;
@@ -141348,7 +141411,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +}
 --- /dev/null
 +++ b/drivers/staging/fsl_qbman/qman_low.h
-@@ -0,0 +1,1427 @@
+@@ -0,0 +1,1442 @@
 +/* Copyright 2008-2011 Freescale Semiconductor, Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -142446,11 +142509,26 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +static inline int qm_mc_init(struct qm_portal *portal)
 +{
++      u8 rr0, rr1;
 +      register struct qm_mc *mc = &portal->mc;
++
 +      mc->cr = portal->addr.addr_ce + QM_CL_CR;
 +      mc->rr = portal->addr.addr_ce + QM_CL_RR0;
-+      mc->rridx = (__raw_readb(&mc->cr->__dont_write_directly__verb) &
-+                      QM_MCC_VERB_VBIT) ?  0 : 1;
++
++      /*
++       * The expected valid bit polarity for the next CR command is 0
++       * if RR1 contains a valid response, and is 1 if RR0 contains a
++       * valid response. If both RR contain all 0, this indicates either
++       * that no command has been executed since reset (in which case the
++       * expected valid bit polarity is 1)
++       */
++      rr0 = __raw_readb(&mc->rr->verb);
++      rr1 = __raw_readb(&(mc->rr+1)->verb);
++      if ((rr0 == 0 && rr1 == 0) || rr0 != 0)
++              mc->rridx = 1;
++      else
++              mc->rridx = 0;
++
 +      mc->vbit = mc->rridx ? QM_MCC_VERB_VBIT : 0;
 +#ifdef CONFIG_FSL_DPA_CHECKING
 +      mc->state = qman_mc_idle;
index 6524351..4d68e23 100644 (file)
@@ -1,9 +1,9 @@
-From 9e6e0a53b29190dbd86a39304b59c3028f5b36c2 Mon Sep 17 00:00:00 2001
+From 5fcb42fbd224e1103bacbae4785745842cfd6304 Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 25 Sep 2017 11:04:10 +0800
-Subject: [PATCH] pci: support layerscape
+Date: Wed, 17 Jan 2018 15:00:43 +0800
+Subject: [PATCH 08/30] pci: support layerscape
 
-This is a integrated patch for layerscape pcie support.
+This is an integrated patch for layerscape pcie support.
 
 Signed-off-by: Po Liu <po.liu@nxp.com>
 Signed-off-by: Liu Gang <Gang.Liu@nxp.com>
@@ -20,12 +20,14 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  drivers/pci/host/pci-layerscape-ep-debugfs.c | 758 +++++++++++++++++++++++++++
  drivers/pci/host/pci-layerscape-ep.c         | 309 +++++++++++
  drivers/pci/host/pci-layerscape-ep.h         | 115 ++++
- drivers/pci/host/pci-layerscape.c            |  38 +-
+ drivers/pci/host/pci-layerscape.c            |  48 +-
  drivers/pci/host/pcie-designware.c           |   6 +
  drivers/pci/host/pcie-designware.h           |   1 +
+ drivers/pci/pci.c                            |   2 +-
  drivers/pci/pcie/portdrv_core.c              | 181 +++----
+ drivers/pci/quirks.c                         |   8 +
  include/linux/pci.h                          |   1 +
- 10 files changed, 1520 insertions(+), 148 deletions(-)
+ 12 files changed, 1539 insertions(+), 149 deletions(-)
  create mode 100644 drivers/pci/host/pci-layerscape-ep-debugfs.c
  create mode 100644 drivers/pci/host/pci-layerscape-ep.c
  create mode 100644 drivers/pci/host/pci-layerscape-ep.h
@@ -1606,8 +1608,12 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif /* _PCIE_LAYERSCAPE_EP_H */
 --- a/drivers/pci/host/pci-layerscape.c
 +++ b/drivers/pci/host/pci-layerscape.c
-@@ -35,12 +35,14 @@
+@@ -33,14 +33,18 @@
+ /* PEX Internal Configuration Registers */
  #define PCIE_STRFMR1          0x71c /* Symbol Timer & Filter Mask Register1 */
++#define PCIE_ABSERR           0x8d0 /* Bridge Slave Error Response Register */
++#define PCIE_ABSERR_SETTING   0x9401 /* Forward error of non-posted request */
  #define PCIE_DBI_RO_WR_EN     0x8bc /* DBI Read-Only Write Enable Register */
  
 -/* PEX LUT registers */
@@ -1623,7 +1629,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        struct pcie_host_ops *ops;
  };
  
-@@ -86,6 +88,14 @@ static void ls_pcie_drop_msg_tlp(struct
+@@ -86,6 +90,14 @@ static void ls_pcie_drop_msg_tlp(struct
        iowrite32(val, pcie->pp.dbi_base + PCIE_STRFMR1);
  }
  
@@ -1638,7 +1644,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  static int ls1021_pcie_link_up(struct pcie_port *pp)
  {
        u32 state;
-@@ -134,7 +144,7 @@ static int ls_pcie_link_up(struct pcie_p
+@@ -134,7 +146,7 @@ static int ls_pcie_link_up(struct pcie_p
        struct ls_pcie *pcie = to_ls_pcie(pp);
        u32 state;
  
@@ -1647,17 +1653,31 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                 pcie->drvdata->ltssm_shift) &
                 LTSSM_STATE_MASK;
  
-@@ -153,6 +163,9 @@ static void ls_pcie_host_init(struct pci
+@@ -144,6 +156,12 @@ static int ls_pcie_link_up(struct pcie_p
+       return 1;
+ }
++/* Forward error response of outbound non-posted requests */
++static void ls_pcie_fix_error_response(struct ls_pcie *pcie)
++{
++      iowrite32(PCIE_ABSERR_SETTING, pcie->pp.dbi_base + PCIE_ABSERR);
++}
++
+ static void ls_pcie_host_init(struct pcie_port *pp)
+ {
+       struct ls_pcie *pcie = to_ls_pcie(pp);
+@@ -153,6 +171,10 @@ static void ls_pcie_host_init(struct pci
        ls_pcie_clear_multifunction(pcie);
        ls_pcie_drop_msg_tlp(pcie);
        iowrite32(0, pcie->pp.dbi_base + PCIE_DBI_RO_WR_EN);
 +
 +      ls_pcie_disable_outbound_atus(pcie);
++      ls_pcie_fix_error_response(pcie);
 +      dw_pcie_setup_rc(pp);
  }
  
  static int ls_pcie_msi_host_init(struct pcie_port *pp,
-@@ -196,20 +209,39 @@ static struct ls_pcie_drvdata ls1021_drv
+@@ -196,20 +218,40 @@ static struct ls_pcie_drvdata ls1021_drv
  static struct ls_pcie_drvdata ls1043_drvdata = {
        .lut_offset = 0x10000,
        .ltssm_shift = 24,
@@ -1694,6 +1714,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        { .compatible = "fsl,ls2080a-pcie", .data = &ls2080_drvdata },
        { .compatible = "fsl,ls2085a-pcie", .data = &ls2080_drvdata },
 +      { .compatible = "fsl,ls2088a-pcie", .data = &ls2088_drvdata },
++      { .compatible = "fsl,ls1088a-pcie", .data = &ls2088_drvdata },
        { },
  };
  
@@ -1721,6 +1742,17 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +void dw_pcie_disable_outbound_atu(struct pcie_port *pp, int index);
  
  #endif /* _PCIE_DESIGNWARE_H */
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -454,7 +454,7 @@ struct resource *pci_find_parent_resourc
+       pci_bus_for_each_resource(bus, r, i) {
+               if (!r)
+                       continue;
+-              if (res->start && resource_contains(r, res)) {
++              if (resource_contains(r, res)) {
+                       /*
+                        * If the window is prefetchable but the BAR is
 --- a/drivers/pci/pcie/portdrv_core.c
 +++ b/drivers/pci/pcie/portdrv_core.c
 @@ -44,52 +44,30 @@ static void release_pcie_device(struct d
@@ -2026,6 +2058,20 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                driver->remove(pciedev);
                put_device(dev);
        }
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -4642,3 +4642,11 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_IN
+ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x2031, quirk_no_aersid);
+ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x2032, quirk_no_aersid);
+ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x2033, quirk_no_aersid);
++
++/* Freescale PCIe doesn't support MSI in RC mode */
++static void quirk_fsl_no_msi(struct pci_dev *pdev)
++{
++      if (pci_pcie_type(pdev) == PCI_EXP_TYPE_ROOT_PORT)
++              pdev->no_msi = 1;
++}
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_FREESCALE, PCI_ANY_ID, quirk_fsl_no_msi);
 --- a/include/linux/pci.h
 +++ b/include/linux/pci.h
 @@ -1823,6 +1823,7 @@ void pcibios_release_device(struct pci_d
index 907fb33..197fd9c 100644 (file)
@@ -1,9 +1,9 @@
-From be07319b9897738a4ab1501880b7dd9be26eba66 Mon Sep 17 00:00:00 2001
+From 8949ebc0c5b982eab7ca493dad7b86c30befa6ec Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 25 Sep 2017 11:54:28 +0800
-Subject: [PATCH] phy: support layerscape
+Date: Wed, 17 Jan 2018 15:01:30 +0800
+Subject: [PATCH 09/30] phy: support layerscape
 
-This is a integrated patch for layerscape mdio-phy support.
+This is an integrated patch for layerscape mdio-phy support.
 
 Signed-off-by: Bogdan Purcareata <bogdan.purcareata@nxp.com>
 Signed-off-by: Zhang Ying-22455 <ying.zhang22455@nxp.com>
@@ -18,11 +18,12 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  drivers/net/phy/aquantia.c      |   28 +
  drivers/net/phy/cortina.c       |  118 ++++
  drivers/net/phy/fsl_backplane.c | 1358 +++++++++++++++++++++++++++++++++++++++
+ drivers/net/phy/marvell.c       |    2 +-
  drivers/net/phy/phy.c           |   23 +-
  drivers/net/phy/phy_device.c    |    6 +-
  drivers/net/phy/swphy.c         |    1 +
- include/linux/phy.h             |    4 +
9 files changed, 1544 insertions(+), 7 deletions(-)
+ include/linux/phy.h             |    6 +
10 files changed, 1547 insertions(+), 8 deletions(-)
  create mode 100644 drivers/net/phy/cortina.c
  create mode 100644 drivers/net/phy/fsl_backplane.c
 
@@ -1604,6 +1605,17 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +MODULE_DESCRIPTION("Freescale Backplane driver");
 +MODULE_AUTHOR("Shaohui Xie <Shaohui.Xie@freescale.com>");
 +MODULE_LICENSE("GPL v2");
+--- a/drivers/net/phy/marvell.c
++++ b/drivers/net/phy/marvell.c
+@@ -1610,7 +1610,7 @@ static struct phy_driver marvell_drivers
+               .flags = PHY_HAS_INTERRUPT,
+               .probe = marvell_probe,
+               .config_init = &m88e1145_config_init,
+-              .config_aneg = &marvell_config_aneg,
++              .config_aneg = &m88e1101_config_aneg,
+               .read_status = &genphy_read_status,
+               .ack_interrupt = &marvell_ack_interrupt,
+               .config_intr = &marvell_config_intr,
 --- a/drivers/net/phy/phy.c
 +++ b/drivers/net/phy/phy.c
 @@ -585,7 +585,7 @@ int phy_mii_ioctl(struct phy_device *phy
@@ -1737,11 +1749,20 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        PHY_INTERFACE_MODE_MOCA,
        PHY_INTERFACE_MODE_QSGMII,
        PHY_INTERFACE_MODE_TRGMII,
-+      PHY_INTERFACE_MODE_SGMII_2500,
++      PHY_INTERFACE_MODE_2500SGMII,
        PHY_INTERFACE_MODE_MAX,
  } phy_interface_t;
  
-@@ -791,6 +792,9 @@ int phy_stop_interrupts(struct phy_devic
+@@ -126,6 +127,8 @@ static inline const char *phy_modes(phy_
+               return "qsgmii";
+       case PHY_INTERFACE_MODE_TRGMII:
+               return "trgmii";
++      case PHY_INTERFACE_MODE_2500SGMII:
++              return "sgmii-2500";
+       default:
+               return "unknown";
+       }
+@@ -791,6 +794,9 @@ int phy_stop_interrupts(struct phy_devic
  
  static inline int phy_read_status(struct phy_device *phydev)
  {
index a35e593..976f801 100644 (file)
@@ -1,12 +1,12 @@
-From afb7254de9f03c3efaf4e306dcf5f88e1873fc6b Mon Sep 17 00:00:00 2001
+From 667f0792b6f6d000c10f21c29c397c84cbe77f4a Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 25 Sep 2017 12:06:25 +0800
-Subject: [PATCH] fsl-mc: layerscape support
+Date: Wed, 17 Jan 2018 15:11:45 +0800
+Subject: [PATCH 10/30] fsl-mc: layerscape support
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
 
-This is a integrated patch for layerscape mc-bus support.
+This is an integrated patch for layerscape mc-bus support.
 
 Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
 Signed-off-by: Bharat Bhushan <Bharat.Bhushan@nxp.com>
@@ -28,7 +28,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  drivers/staging/fsl-mc/bus/dpio/Makefile           |   11 +
  .../{include/dpcon-cmd.h => bus/dpio/dpio-cmd.h}   |   73 +-
  drivers/staging/fsl-mc/bus/dpio/dpio-driver.c      |  296 ++++++
- drivers/staging/fsl-mc/bus/dpio/dpio-driver.txt    |  135 +++
  drivers/staging/fsl-mc/bus/dpio/dpio-service.c     |  693 +++++++++++++
  drivers/staging/fsl-mc/bus/dpio/dpio.c             |  224 +++++
  drivers/staging/fsl-mc/bus/dpio/dpio.h             |  109 ++
@@ -48,9 +47,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  drivers/staging/fsl-mc/bus/fsl-mc-allocator.c      |   78 +-
  drivers/staging/fsl-mc/bus/fsl-mc-bus.c            |  318 +++---
  drivers/staging/fsl-mc/bus/fsl-mc-iommu.c          |  104 ++
- drivers/staging/fsl-mc/bus/fsl-mc-msi.c            |    3 +-
+ drivers/staging/fsl-mc/bus/fsl-mc-msi.c            |    2 +-
  drivers/staging/fsl-mc/bus/fsl-mc-private.h        |    6 +-
- .../staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c |   11 +-
+ .../staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c |   10 +-
  drivers/staging/fsl-mc/bus/mc-io.c                 |    4 +-
  drivers/staging/fsl-mc/bus/mc-ioctl.h              |   22 +
  drivers/staging/fsl-mc/bus/mc-restool.c            |  405 ++++++++
@@ -68,14 +67,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  drivers/staging/fsl-mc/include/mc-cmd.h            |   44 +-
  drivers/staging/fsl-mc/include/mc-sys.h            |    3 +-
  drivers/staging/fsl-mc/include/mc.h                |   17 +-
- 49 files changed, 7384 insertions(+), 2612 deletions(-)
+ 48 files changed, 7247 insertions(+), 2612 deletions(-)
  create mode 100644 drivers/staging/fsl-mc/bus/dpbp-cmd.h
  create mode 100644 drivers/staging/fsl-mc/bus/dpcon-cmd.h
  create mode 100644 drivers/staging/fsl-mc/bus/dpcon.c
  create mode 100644 drivers/staging/fsl-mc/bus/dpio/Makefile
  rename drivers/staging/fsl-mc/{include/dpcon-cmd.h => bus/dpio/dpio-cmd.h} (64%)
  create mode 100644 drivers/staging/fsl-mc/bus/dpio/dpio-driver.c
- create mode 100644 drivers/staging/fsl-mc/bus/dpio/dpio-driver.txt
  create mode 100644 drivers/staging/fsl-mc/bus/dpio/dpio-service.c
  create mode 100644 drivers/staging/fsl-mc/bus/dpio/dpio.c
  create mode 100644 drivers/staging/fsl-mc/bus/dpio/dpio.h
@@ -1633,144 +1631,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +module_init(dpio_driver_init);
 +module_exit(dpio_driver_exit);
 --- /dev/null
-+++ b/drivers/staging/fsl-mc/bus/dpio/dpio-driver.txt
-@@ -0,0 +1,135 @@
-+Copyright 2016 NXP
-+
-+Introduction
-+------------
-+
-+A DPAA2 DPIO (Data Path I/O) is a hardware object that provides
-+interfaces to enqueue and dequeue frames to/from network interfaces
-+and other accelerators.  A DPIO also provides hardware buffer
-+pool management for network interfaces.
-+
-+This document provides an overview the Linux DPIO driver, its
-+subcomponents, and its APIs.
-+
-+See Documentation/dpaa2/overview.txt for a general overview of DPAA2
-+and the general DPAA2 driver architecture in Linux.
-+
-+Driver Overview
-+---------------
-+
-+The DPIO driver is bound to DPIO objects discovered on the fsl-mc bus and
-+provides services that:
-+  A) allow other drivers, such as the Ethernet driver, to enqueue and dequeue
-+     frames for their respective objects
-+  B) allow drivers to register callbacks for data availability notifications
-+     when data becomes available on a queue or channel
-+  C) allow drivers to manage hardware buffer pools
-+
-+The Linux DPIO driver consists of 3 primary components--
-+   DPIO object driver-- fsl-mc driver that manages the DPIO object
-+   DPIO service-- provides APIs to other Linux drivers for services
-+   QBman portal interface-- sends portal commands, gets responses
-+
-+          fsl-mc          other
-+           bus           drivers
-+            |               |
-+        +---+----+   +------+-----+
-+        |DPIO obj|   |DPIO service|
-+        | driver |---|  (DPIO)    |
-+        +--------+   +------+-----+
-+                            |
-+                     +------+-----+
-+                     |    QBman   |
-+                     | portal i/f |
-+                     +------------+
-+                            |
-+                         hardware
-+
-+The diagram below shows how the DPIO driver components fit with the other
-+DPAA2 Linux driver components:
-+                                                   +------------+
-+                                                   | OS Network |
-+                                                   |   Stack    |
-+                 +------------+                    +------------+
-+                 | Allocator  |. . . . . . .       |  Ethernet  |
-+                 |(DPMCP,DPBP)|                    |   (DPNI)   |
-+                 +-.----------+                    +---+---+----+
-+                  .          .                         ^   |
-+                 .            .           <data avail, |   |<enqueue,
-+                .              .           tx confirm> |   | dequeue>
-+    +-------------+             .                      |   |
-+    | DPRC driver |              .    +--------+ +------------+
-+    |   (DPRC)    |               . . |DPIO obj| |DPIO service|
-+    +----------+--+                   | driver |-|  (DPIO)    |
-+               |                      +--------+ +------+-----+
-+               |<dev add/remove>                 +------|-----+
-+               |                                 |   QBman    |
-+          +----+--------------+                  | portal i/f |
-+          |   MC-bus driver   |                  +------------+
-+          |                   |                     |
-+          | /soc/fsl-mc       |                     |
-+          +-------------------+                     |
-+                                                    |
-+ =========================================|=========|========================
-+                                        +-+--DPIO---|-----------+
-+                                        |           |           |
-+                                        |        QBman Portal   |
-+                                        +-----------------------+
-+
-+ ============================================================================
-+
-+
-+DPIO Object Driver (dpio-driver.c)
-+----------------------------------
-+
-+   The dpio-driver component registers with the fsl-mc bus to handle objects of
-+   type "dpio".  The implementation of probe() handles basic initialization
-+   of the DPIO including mapping of the DPIO regions (the QBman SW portal)
-+   and initializing interrupts and registering irq handlers.  The dpio-driver
-+   registers the probed DPIO with dpio-service.
-+
-+DPIO service  (dpio-service.c, dpaa2-io.h)
-+------------------------------------------
-+
-+   The dpio service component provides queuing, notification, and buffers
-+   management services to DPAA2 drivers, such as the Ethernet driver.  A system
-+   will typically allocate 1 DPIO object per CPU to allow queuing operations
-+   to happen simultaneously across all CPUs.
-+
-+   Notification handling
-+      dpaa2_io_service_register()
-+      dpaa2_io_service_deregister()
-+      dpaa2_io_service_rearm()
-+
-+   Queuing
-+      dpaa2_io_service_pull_fq()
-+      dpaa2_io_service_pull_channel()
-+      dpaa2_io_service_enqueue_fq()
-+      dpaa2_io_service_enqueue_qd()
-+      dpaa2_io_store_create()
-+      dpaa2_io_store_destroy()
-+      dpaa2_io_store_next()
-+
-+   Buffer pool management
-+      dpaa2_io_service_release()
-+      dpaa2_io_service_acquire()
-+
-+QBman portal interface (qbman-portal.c)
-+---------------------------------------
-+
-+   The qbman-portal component provides APIs to do the low level hardware
-+   bit twiddling for operations such as:
-+      -initializing Qman software portals
-+      -building and sending portal commands
-+      -portal interrupt configuration and processing
-+
-+   The qbman-portal APIs are not public to other drivers, and are
-+   only used by dpio-service.
-+
-+Other (dpaa2-fd.h, dpaa2-global.h)
-+----------------------------------
-+
-+   Frame descriptor and scatter-gather definitions and the APIs used to
-+   manipulate them are defined in dpaa2-fd.h.
-+
-+   Dequeue result struct and parsing APIs are defined in dpaa2-global.h.
---- /dev/null
 +++ b/drivers/staging/fsl-mc/bus/dpio/dpio-service.c
 @@ -0,0 +1,693 @@
 +/*
index 51abc03..c0f5819 100644 (file)
@@ -1,15 +1,16 @@
-From 3a302437605308079db398b67000a77a4fe92da8 Mon Sep 17 00:00:00 2001
+From 72b1e89ab8edb5e883e812d07d0751fe2b140548 Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 25 Sep 2017 12:07:58 +0800
-Subject: [PATCH] dpaa2: support layerscape
+Date: Wed, 17 Jan 2018 15:12:58 +0800
+Subject: [PATCH 11/30] dpaa2: support layerscape
 
-This is a integrated patch for layerscape dpaa2 support.
+This is an integrated patch for layerscape dpaa2 support.
 
 Signed-off-by: Bogdan Purcareata <bogdan.purcareata@nxp.com>
 Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
 Signed-off-by: Razvan Stefanescu <razvan.stefanescu@nxp.com>
 Signed-off-by: costi <constantin.tudor@freescale.com>
 Signed-off-by: Catalin Horghidan <catalin.horghidan@nxp.com>
+Signed-off-by: Mathew McBride <matt@traverse.com.au>
 Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 ---
  drivers/soc/fsl/ls2-console/Kconfig                |    4 +
@@ -17,41 +18,41 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  drivers/soc/fsl/ls2-console/ls2-console.c          |  284 ++
  drivers/staging/fsl-dpaa2/ethernet/Makefile        |   11 +
  drivers/staging/fsl-dpaa2/ethernet/README          |  186 ++
- .../staging/fsl-dpaa2/ethernet/dpaa2-eth-debugfs.c |  350 +++
+ .../staging/fsl-dpaa2/ethernet/dpaa2-eth-debugfs.c |  35++
  .../staging/fsl-dpaa2/ethernet/dpaa2-eth-debugfs.h |   60 +
- .../staging/fsl-dpaa2/ethernet/dpaa2-eth-trace.h   |  184 ++
- drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c     | 3155 ++++++++++++++++++++
- drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.h     |  460 +++
- drivers/staging/fsl-dpaa2/ethernet/dpaa2-ethtool.c |  856 ++++++
- drivers/staging/fsl-dpaa2/ethernet/dpkg.h          |  176 ++
- drivers/staging/fsl-dpaa2/ethernet/dpni-cmd.h      |  600 ++++
- drivers/staging/fsl-dpaa2/ethernet/dpni.c          | 1770 +++++++++++
- drivers/staging/fsl-dpaa2/ethernet/dpni.h          |  989 ++++++
+ .../staging/fsl-dpaa2/ethernet/dpaa2-eth-trace.h   |  184 +
+ drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c     | 3516 ++++++++++++++++++++
+ drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.h     |  499 +++
+ drivers/staging/fsl-dpaa2/ethernet/dpaa2-ethtool.c |  864 +++++
+ drivers/staging/fsl-dpaa2/ethernet/dpkg.h          |  176 +
+ drivers/staging/fsl-dpaa2/ethernet/dpni-cmd.h      |  658 ++++
+ drivers/staging/fsl-dpaa2/ethernet/dpni.c          | 1903 +++++++++++
+ drivers/staging/fsl-dpaa2/ethernet/dpni.h          | 1053 ++++++
  drivers/staging/fsl-dpaa2/ethernet/net.h           |  480 +++
  drivers/staging/fsl-dpaa2/ethsw/Kconfig            |    6 +
  drivers/staging/fsl-dpaa2/ethsw/Makefile           |   10 +
- drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h         |  851 ++++++
- drivers/staging/fsl-dpaa2/ethsw/dpsw.c             | 2762 +++++++++++++++++
- drivers/staging/fsl-dpaa2/ethsw/dpsw.h             | 1269 ++++++++
- drivers/staging/fsl-dpaa2/ethsw/switch.c           | 1857 ++++++++++++
+ drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h         |  851 +++++
+ drivers/staging/fsl-dpaa2/ethsw/dpsw.c             | 2762 +++++++++++++++
+ drivers/staging/fsl-dpaa2/ethsw/dpsw.h             | 1269 +++++++
+ drivers/staging/fsl-dpaa2/ethsw/switch.c           | 1857 +++++++++++
  drivers/staging/fsl-dpaa2/evb/Kconfig              |    7 +
  drivers/staging/fsl-dpaa2/evb/Makefile             |   10 +
  drivers/staging/fsl-dpaa2/evb/dpdmux-cmd.h         |  279 ++
  drivers/staging/fsl-dpaa2/evb/dpdmux.c             | 1112 +++++++
  drivers/staging/fsl-dpaa2/evb/dpdmux.h             |  453 +++
- drivers/staging/fsl-dpaa2/evb/evb.c                | 1350 +++++++++
+ drivers/staging/fsl-dpaa2/evb/evb.c                | 1350 ++++++++
  drivers/staging/fsl-dpaa2/mac/Kconfig              |   23 +
  drivers/staging/fsl-dpaa2/mac/Makefile             |   10 +
- drivers/staging/fsl-dpaa2/mac/dpmac-cmd.h          |  172 ++
+ drivers/staging/fsl-dpaa2/mac/dpmac-cmd.h          |  172 +
  drivers/staging/fsl-dpaa2/mac/dpmac.c              |  620 ++++
- drivers/staging/fsl-dpaa2/mac/dpmac.h              |  342 +++
- drivers/staging/fsl-dpaa2/mac/mac.c                |  666 +++++
+ drivers/staging/fsl-dpaa2/mac/dpmac.h              |  342 ++
+ drivers/staging/fsl-dpaa2/mac/mac.c                |  66++++
  drivers/staging/fsl-dpaa2/rtc/Makefile             |   10 +
  drivers/staging/fsl-dpaa2/rtc/dprtc-cmd.h          |  160 +
  drivers/staging/fsl-dpaa2/rtc/dprtc.c              |  746 +++++
- drivers/staging/fsl-dpaa2/rtc/dprtc.h              |  172 ++
+ drivers/staging/fsl-dpaa2/rtc/dprtc.h              |  172 +
  drivers/staging/fsl-dpaa2/rtc/rtc.c                |  243 ++
- 39 files changed, 22696 insertions(+)
+ 39 files changed, 23364 insertions(+)
  create mode 100644 drivers/soc/fsl/ls2-console/Kconfig
  create mode 100644 drivers/soc/fsl/ls2-console/Makefile
  create mode 100644 drivers/soc/fsl/ls2-console/ls2-console.c
@@ -595,7 +596,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +non-standard driver stats can be consulted through ethtool -S option.
 --- /dev/null
 +++ b/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth-debugfs.c
-@@ -0,0 +1,350 @@
+@@ -0,0 +1,352 @@
 +
 +/* Copyright 2015 Freescale Semiconductor Inc.
 + *
@@ -708,9 +709,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      int i, err;
 +
 +      seq_printf(file, "FQ stats for %s:\n", priv->net_dev->name);
-+      seq_printf(file, "%s%16s%16s%16s%16s%16s\n",
-+                 "VFQID", "CPU", "Type", "Frames", "Pending frames",
-+                 "Congestion");
++      seq_printf(file, "%s%16s%16s%16s%16s%16s%16s\n",
++                 "VFQID", "CPU", "Traffic Class", "Type", "Frames",
++                 "Pending frames", "Congestion");
 +
 +      for (i = 0; i <  priv->num_fqs; i++) {
 +              fq = &priv->fq[i];
@@ -718,9 +719,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              if (err)
 +                      fcnt = 0;
 +
-+              seq_printf(file, "%5d%16d%16s%16llu%16u%16llu\n",
++              seq_printf(file, "%5d%16d%16d%16s%16llu%16u%16llu\n",
 +                         fq->fqid,
 +                         fq->target_cpu,
++                         fq->tc,
 +                         fq_type_to_str(fq),
 +                         fq->stats.frames,
 +                         fcnt,
@@ -756,19 +758,20 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      int i;
 +
 +      seq_printf(file, "Channel stats for %s:\n", priv->net_dev->name);
-+      seq_printf(file, "%s%16s%16s%16s%16s%16s\n",
++      seq_printf(file, "%s%16s%16s%16s%16s%16s%16s\n",
 +                 "CHID", "CPU", "Deq busy", "Frames", "CDANs",
-+                 "Avg frm/CDAN");
++                 "Avg frm/CDAN", "Buf count");
 +
 +      for (i = 0; i < priv->num_channels; i++) {
 +              ch = priv->channel[i];
-+              seq_printf(file, "%4d%16d%16llu%16llu%16llu%16llu\n",
++              seq_printf(file, "%4d%16d%16llu%16llu%16llu%16llu%16d\n",
 +                         ch->ch_id,
 +                         ch->nctx.desired_cpu,
 +                         ch->stats.dequeue_portal_busy,
 +                         ch->stats.frames,
 +                         ch->stats.cdan,
-+                         ch->stats.frames / ch->stats.cdan);
++                         ch->stats.frames / ch->stats.cdan,
++                         ch->buf_count);
 +      }
 +
 +      return 0;
@@ -1198,7 +1201,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#include <trace/define_trace.h>
 --- /dev/null
 +++ b/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c
-@@ -0,0 +1,3155 @@
+@@ -0,0 +1,3516 @@
 +/* Copyright 2014-2015 Freescale Semiconductor Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -1338,6 +1341,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      u16 fd_offset = dpaa2_fd_get_offset(fd);
 +      u32 fd_length = dpaa2_fd_get_len(fd);
 +
++      ch->buf_count--;
++
 +      skb = build_skb(fd_vaddr, DPAA2_ETH_SKB_SIZE);
 +      if (unlikely(!skb))
 +              return NULL;
@@ -1345,8 +1350,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      skb_reserve(skb, fd_offset);
 +      skb_put(skb, fd_length);
 +
-+      ch->buf_count--;
-+
 +      return skb;
 +}
 +
@@ -1384,7 +1387,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      /* We build the skb around the first data buffer */
 +                      skb = build_skb(sg_vaddr, DPAA2_ETH_SKB_SIZE);
 +                      if (unlikely(!skb))
-+                              return NULL;
++                              goto err_build;
 +
 +                      sg_offset = dpaa2_sg_get_offset(sge);
 +                      skb_reserve(skb, sg_offset);
@@ -1415,6 +1418,32 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      ch->buf_count -= i + 2;
 +
 +      return skb;
++
++err_build:
++      /* We still need to subtract the buffers used by this FD from our
++       * software counter
++       */
++      for (i = 0; i < DPAA2_ETH_MAX_SG_ENTRIES; i++)
++              if (dpaa2_sg_is_final(&sgt[i]))
++                      break;
++      ch->buf_count -= i + 2;
++
++      return NULL;
++}
++
++static void free_bufs(struct dpaa2_eth_priv *priv, u64 *buf_array, int count)
++{
++      struct device *dev = priv->net_dev->dev.parent;
++      void *vaddr;
++      int i;
++
++      for (i = 0; i < count; i++) {
++              /* Same logic as on regular Rx path */
++              vaddr = dpaa2_eth_iova_to_virt(priv->iommu_domain, buf_array[i]);
++              dma_unmap_single(dev, buf_array[i], DPAA2_ETH_RX_BUF_SIZE,
++                               DMA_FROM_DEVICE);
++              put_page(virt_to_head_page(vaddr));
++      }
 +}
 +
 +/* Main Rx frame processing routine */
@@ -1722,7 +1751,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      dpaa2_fd_set_addr(fd, addr);
 +      dpaa2_fd_set_len(fd, skb->len);
 +
-+      fd->simple.ctrl = DPAA2_FD_CTRL_ASAL | FD_CTRL_PTA | FD_CTRL_PTV1;
++      fd->simple.ctrl = DPAA2_FD_CTRL_ASAL | FD_CTRL_PTA;
 +
 +      if (priv->ts_tx_en && skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)
 +              enable_tx_tstamp(fd, sgt_buf);
@@ -1779,7 +1808,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      dpaa2_fd_set_len(fd, skb->len);
 +      dpaa2_fd_set_format(fd, dpaa2_fd_single);
 +
-+      fd->simple.ctrl = DPAA2_FD_CTRL_ASAL | FD_CTRL_PTA | FD_CTRL_PTV1;
++      fd->simple.ctrl = DPAA2_FD_CTRL_ASAL | FD_CTRL_PTA;
 +
 +      if (priv->ts_tx_en && skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)
 +              enable_tx_tstamp(fd, buffer_start);
@@ -1798,7 +1827,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 + */
 +static void free_tx_fd(const struct dpaa2_eth_priv *priv,
 +                     const struct dpaa2_fd *fd,
-+                     u32 *status)
++                     u32 *status, bool in_napi)
 +{
 +      struct device *dev = priv->net_dev->dev.parent;
 +      dma_addr_t fd_addr;
@@ -1877,7 +1906,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              kfree(skbh);
 +
 +      /* Move on with skb release */
-+      dev_kfree_skb(skb);
++      napi_consume_skb(skb, in_napi);
 +}
 +
 +static int dpaa2_eth_tx(struct sk_buff *skb, struct net_device *net_dev)
@@ -1961,7 +1990,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      if (unlikely(err < 0)) {
 +              percpu_stats->tx_errors++;
 +              /* Clean up everything, including freeing the skb */
-+              free_tx_fd(priv, &fd, NULL);
++              free_tx_fd(priv, &fd, NULL, false);
 +      } else {
 +              percpu_stats->tx_packets++;
 +              percpu_stats->tx_bytes += dpaa2_fd_get_len(&fd);
@@ -2014,7 +2043,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                                 fd->simple.ctrl & DPAA2_FD_TX_ERR_MASK);
 +      }
 +
-+      free_tx_fd(priv, fd, check_fas_errors ? &status : NULL);
++      free_tx_fd(priv, fd, check_fas_errors ? &status : NULL, true);
 +
 +      /* if there are no errors, we're done */
 +      if (likely(!errors))
@@ -2084,7 +2113,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      u64 buf_array[DPAA2_ETH_BUFS_PER_CMD];
 +      void *buf;
 +      dma_addr_t addr;
-+      int i;
++      int i, err;
 +
 +      for (i = 0; i < DPAA2_ETH_BUFS_PER_CMD; i++) {
 +              /* Allocate buffer visible to WRIOP + skb shared info +
@@ -2111,22 +2140,25 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      }
 +
 +release_bufs:
-+      /* In case the portal is busy, retry until successful.
-+       * The buffer release function would only fail if the QBMan portal
-+       * was busy, which implies portal contention (i.e. more CPUs than
-+       * portals, i.e. GPPs w/o affine DPIOs). For all practical purposes,
-+       * there is little we can realistically do, short of giving up -
-+       * in which case we'd risk depleting the buffer pool and never again
-+       * receiving the Rx interrupt which would kick-start the refill logic.
-+       * So just keep retrying, at the risk of being moved to ksoftirqd.
-+       */
-+      while (dpaa2_io_service_release(NULL, bpid, buf_array, i))
++      /* In case the portal is busy, retry until successful */
++      while ((err = dpaa2_io_service_release(NULL, bpid,
++                                             buf_array, i)) == -EBUSY)
 +              cpu_relax();
++
++      /* If release command failed, clean up and bail out; not much
++       * else we can do about it
++       */
++      if (unlikely(err)) {
++              free_bufs(priv, buf_array, i);
++              return 0;
++      }
++
 +      return i;
 +
 +err_map:
 +      put_page(virt_to_head_page(buf));
 +err_alloc:
++      /* If we managed to allocate at least some buffers, release them */
 +      if (i)
 +              goto release_bufs;
 +
@@ -2169,10 +2201,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 + */
 +static void drain_bufs(struct dpaa2_eth_priv *priv, int count)
 +{
-+      struct device *dev = priv->net_dev->dev.parent;
 +      u64 buf_array[DPAA2_ETH_BUFS_PER_CMD];
-+      void *vaddr;
-+      int ret, i;
++      int ret;
 +
 +      do {
 +              ret = dpaa2_io_service_acquire(NULL, priv->bpid,
@@ -2181,15 +2211,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      netdev_err(priv->net_dev, "dpaa2_io_service_acquire() failed\n");
 +                      return;
 +              }
-+              for (i = 0; i < ret; i++) {
-+                      /* Same logic as on regular Rx path */
-+                      vaddr = dpaa2_eth_iova_to_virt(priv->iommu_domain,
-+                                                     buf_array[i]);
-+                      dma_unmap_single(dev, buf_array[i],
-+                                       DPAA2_ETH_RX_BUF_SIZE,
-+                                       DMA_FROM_DEVICE);
-+                      put_page(virt_to_head_page(vaddr));
-+              }
++              free_bufs(priv, buf_array, ret);
 +      } while (ret);
 +}
 +
@@ -2497,7 +2519,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +/** Fill in counters maintained by the GPP driver. These may be different from
 + * the hardware counters obtained by ethtool.
 + */
-+static void dpaa2_eth_get_stats(struct net_device *net_dev,
++static struct rtnl_link_stats64 *dpaa2_eth_get_stats(struct net_device *net_dev,
 +                              struct rtnl_link_stats64 *stats)
 +{
 +      struct dpaa2_eth_priv *priv = netdev_priv(net_dev);
@@ -2513,6 +2535,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              for (j = 0; j < num; j++)
 +                      netstats[j] += cpustats[j];
 +      }
++      return stats;
 +}
 +
 +static int dpaa2_eth_change_mtu(struct net_device *net_dev, int mtu)
@@ -3039,7 +3062,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +static void setup_fqs(struct dpaa2_eth_priv *priv)
 +{
-+      int i;
++      int i, j;
 +
 +      /* We have one TxConf FQ per Tx flow. Tx queues MUST be at the
 +       * beginning of the queue array.
@@ -3052,11 +3075,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              priv->fq[priv->num_fqs++].flowid = (u16)i;
 +      }
 +
-+      for (i = 0; i < dpaa2_eth_queue_count(priv); i++) {
-+              priv->fq[priv->num_fqs].type = DPAA2_RX_FQ;
-+              priv->fq[priv->num_fqs].consume = dpaa2_eth_rx;
-+              priv->fq[priv->num_fqs++].flowid = (u16)i;
-+      }
++      for (i = 0; i < dpaa2_eth_tc_count(priv); i++)
++              for (j = 0; j < dpaa2_eth_queue_count(priv); j++) {
++                      priv->fq[priv->num_fqs].type = DPAA2_RX_FQ;
++                      priv->fq[priv->num_fqs].consume = dpaa2_eth_rx;
++                      priv->fq[priv->num_fqs].tc = (u8)i;
++                      priv->fq[priv->num_fqs++].flowid = (u16)j;
++              }
 +
 +#ifdef CONFIG_FSL_DPAA2_ETH_USE_ERR_QUEUE
 +      /* We have exactly one Rx error queue per DPNI */
@@ -3299,9 +3324,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              dev_warn(dev, "Tx data offset (%d) not a multiple of 64B",
 +                       priv->tx_data_offset);
 +
-+      /* Accommodate software annotation space (SWA) */
-+      priv->tx_data_offset += DPAA2_ETH_SWA_SIZE;
-+
 +      /* Enable congestion notifications for Tx queues */
 +      err = setup_tx_congestion(priv);
 +      if (err)
@@ -3357,39 +3379,111 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      kfree(priv->cscn_unaligned);
 +}
 +
-+int setup_fqs_taildrop(struct dpaa2_eth_priv *priv,
-+                     bool enable)
++static int set_queue_taildrop(struct dpaa2_eth_priv *priv,
++                            struct dpni_taildrop *td)
 +{
 +      struct device *dev = priv->net_dev->dev.parent;
-+      struct dpni_taildrop td;
-+      int err = 0, i;
++      int err, i;
 +
-+      td.enable = enable;
-+      td.threshold = DPAA2_ETH_TAILDROP_THRESH;
-+
-+      if (enable) {
-+              priv->num_bufs = DPAA2_ETH_NUM_BUFS_TD;
-+              priv->refill_thresh = DPAA2_ETH_REFILL_THRESH_TD;
-+      } else {
-+              priv->num_bufs = DPAA2_ETH_NUM_BUFS_FC /
-+                      priv->num_channels;
-+              priv->refill_thresh = priv->num_bufs - DPAA2_ETH_BUFS_PER_CMD;
-+      }
 +
 +      for (i = 0; i < priv->num_fqs; i++) {
 +              if (priv->fq[i].type != DPAA2_RX_FQ)
 +                      continue;
 +
 +              err = dpni_set_taildrop(priv->mc_io, 0, priv->mc_token,
-+                                      DPNI_CP_QUEUE, DPNI_QUEUE_RX, 0,
-+                                      priv->fq[i].flowid, &td);
++                                      DPNI_CP_QUEUE, DPNI_QUEUE_RX,
++                                      priv->fq[i].tc, priv->fq[i].flowid,
++                                      td);
 +              if (err) {
 +                      dev_err(dev, "dpni_set_taildrop() failed (%d)\n", err);
-+                      break;
++                      return err;
 +              }
 +      }
 +
-+      return err;
++      return 0;
++}
++
++static int set_group_taildrop(struct dpaa2_eth_priv *priv,
++                            struct dpni_taildrop *td)
++{
++      struct device *dev = priv->net_dev->dev.parent;
++      struct dpni_taildrop disable_td, *tc_td;
++      int i, err;
++
++      memset(&disable_td, 0, sizeof(struct dpni_taildrop));
++      for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {
++              if (td->enable && dpaa2_eth_is_pfc_enabled(priv, i))
++                      /* Do not set taildrop thresholds for PFC-enabled
++                       * traffic classes. We will enable congestion
++                       * notifications for them.
++                       */
++                      tc_td = &disable_td;
++              else
++                      tc_td = td;
++
++              err = dpni_set_taildrop(priv->mc_io, 0, priv->mc_token,
++                                      DPNI_CP_GROUP, DPNI_QUEUE_RX,
++                                      i, 0, tc_td);
++              if (err) {
++                      dev_err(dev, "dpni_set_taildrop() failed (%d)\n", err);
++                      return err;
++              }
++      }
++      return 0;
++}
++
++/* Enable/disable Rx FQ taildrop
++ *
++ * Rx FQ taildrop is mutually exclusive with flow control and it only gets
++ * disabled when FC is active. Depending on FC status, we need to compute
++ * the maximum number of buffers in the pool differently, so use the
++ * opportunity to update max number of buffers as well.
++ */
++int set_rx_taildrop(struct dpaa2_eth_priv *priv)
++{
++      enum dpaa2_eth_td_cfg cfg = dpaa2_eth_get_td_type(priv);
++      struct dpni_taildrop td_queue, td_group;
++      int err = 0;
++
++      switch (cfg) {
++      case DPAA2_ETH_TD_NONE:
++              memset(&td_queue, 0, sizeof(struct dpni_taildrop));
++              memset(&td_group, 0, sizeof(struct dpni_taildrop));
++              priv->num_bufs = DPAA2_ETH_NUM_BUFS_FC /
++                                      priv->num_channels;
++              break;
++      case DPAA2_ETH_TD_QUEUE:
++              memset(&td_group, 0, sizeof(struct dpni_taildrop));
++              td_queue.enable = 1;
++              td_queue.units = DPNI_CONGESTION_UNIT_BYTES;
++              td_queue.threshold = DPAA2_ETH_TAILDROP_THRESH /
++                                   dpaa2_eth_tc_count(priv);
++              priv->num_bufs = DPAA2_ETH_NUM_BUFS_TD;
++              break;
++      case DPAA2_ETH_TD_GROUP:
++              memset(&td_queue, 0, sizeof(struct dpni_taildrop));
++              td_group.enable = 1;
++              td_group.units = DPNI_CONGESTION_UNIT_FRAMES;
++              td_group.threshold = NAPI_POLL_WEIGHT *
++                                   dpaa2_eth_queue_count(priv);
++              priv->num_bufs = NAPI_POLL_WEIGHT *
++                                      dpaa2_eth_tc_count(priv);
++              break;
++      default:
++              break;
++      }
++
++      err = set_queue_taildrop(priv, &td_queue);
++      if (err)
++              return err;
++
++      err = set_group_taildrop(priv, &td_group);
++      if (err)
++              return err;
++
++      priv->refill_thresh = priv->num_bufs - DPAA2_ETH_BUFS_PER_CMD;
++
++      return 0;
 +}
 +
 +static int setup_rx_flow(struct dpaa2_eth_priv *priv,
@@ -3402,7 +3496,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      int err;
 +
 +      err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,
-+                           DPNI_QUEUE_RX, 0, fq->flowid, &q, &qid);
++                           DPNI_QUEUE_RX, fq->tc, fq->flowid, &q, &qid);
 +      if (err) {
 +              dev_err(dev, "dpni_get_queue() failed (%d)\n", err);
 +              return err;
@@ -3415,7 +3509,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      q.destination.priority = 1;
 +      q.user_context = (u64)fq;
 +      err = dpni_set_queue(priv->mc_io, 0, priv->mc_token,
-+                           DPNI_QUEUE_RX, 0, fq->flowid, q_opt, &q);
++                           DPNI_QUEUE_RX, fq->tc, fq->flowid, q_opt, &q);
 +      if (err) {
 +              dev_err(dev, "dpni_set_queue() failed (%d)\n", err);
 +              return err;
@@ -3612,7 +3706,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              dist_cfg.dist_mode = DPNI_DIST_MODE_HASH;
 +      }
 +
-+      err = dpni_set_rx_tc_dist(priv->mc_io, 0, priv->mc_token, 0, &dist_cfg);
++      for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {
++              err = dpni_set_rx_tc_dist(priv->mc_io, 0, priv->mc_token, i,
++                                        &dist_cfg);
++              if (err)
++                      break;
++      }
++
 +      dma_unmap_single(dev, dist_cfg.key_cfg_iova,
 +                       DPAA2_CLASSIFIER_DMA_SIZE, DMA_TO_DEVICE);
 +      if (err)
@@ -3639,6 +3739,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      pools_params.num_dpbp = 1;
 +      pools_params.pools[0].dpbp_id = priv->dpbp_dev->obj_desc.id;
 +      pools_params.pools[0].backup_pool = 0;
++      pools_params.pools[0].priority_mask = 0xff;
 +      pools_params.pools[0].buffer_size = DPAA2_ETH_RX_BUF_SIZE;
 +      err = dpni_set_pools(priv->mc_io, 0, priv->mc_token, &pools_params);
 +      if (err) {
@@ -4124,6 +4225,264 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              device_remove_file(dev, &dpaa2_eth_attrs[i]);
 +}
 +
++#ifdef CONFIG_FSL_DPAA2_ETH_DCB
++static int dpaa2_eth_dcbnl_ieee_getpfc(struct net_device *net_dev,
++                                     struct ieee_pfc *pfc)
++{
++      struct dpaa2_eth_priv *priv = netdev_priv(net_dev);
++      struct dpni_congestion_notification_cfg notification_cfg;
++      struct dpni_link_state state;
++      int err, i;
++
++      pfc->pfc_cap = dpaa2_eth_tc_count(priv);
++
++      err = dpni_get_link_state(priv->mc_io, 0, priv->mc_token, &state);
++      if (err) {
++              netdev_err(net_dev, "ERROR %d getting link state", err);
++              return err;
++      }
++
++      if (!(state.options & DPNI_LINK_OPT_PFC_PAUSE))
++              return 0;
++
++      priv->pfc.pfc_en = 0;
++      for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {
++              err = dpni_get_congestion_notification(priv->mc_io, 0,
++                                                     priv->mc_token,
++                                                     DPNI_QUEUE_RX,
++                                                     i, &notification_cfg);
++              if (err) {
++                      netdev_err(net_dev, "Error %d getting congestion notif",
++                                 err);
++                      return err;
++              }
++
++              if (notification_cfg.threshold_entry)
++                      priv->pfc.pfc_en |= 1 << i;
++      }
++
++      pfc->pfc_en = priv->pfc.pfc_en;
++      pfc->mbc = priv->pfc.mbc;
++      pfc->delay = priv->pfc.delay;
++
++      return 0;
++}
++
++/* Configure ingress classification based on VLAN PCP */
++static int set_vlan_qos(struct dpaa2_eth_priv *priv)
++{
++      struct device *dev = priv->net_dev->dev.parent;
++      struct dpkg_profile_cfg kg_cfg = {0};
++      struct dpni_qos_tbl_cfg qos_cfg = {0};
++      struct dpni_rule_cfg key_params;
++      u8 *params_iova;
++      __be16 key, mask = cpu_to_be16(VLAN_PRIO_MASK);
++      int err = 0, i, j = 0;
++
++      if (priv->vlan_clsf_set)
++              return 0;
++
++      params_iova = kzalloc(DPAA2_CLASSIFIER_DMA_SIZE, GFP_KERNEL);
++      if (!params_iova)
++              return -ENOMEM;
++
++      kg_cfg.num_extracts = 1;
++      kg_cfg.extracts[0].type = DPKG_EXTRACT_FROM_HDR;
++      kg_cfg.extracts[0].extract.from_hdr.prot = NET_PROT_VLAN;
++      kg_cfg.extracts[0].extract.from_hdr.type = DPKG_FULL_FIELD;
++      kg_cfg.extracts[0].extract.from_hdr.field = NH_FLD_VLAN_TCI;
++
++      err = dpni_prepare_key_cfg(&kg_cfg, params_iova);
++      if (err) {
++              dev_err(dev, "dpkg_prepare_key_cfg failed: %d\n", err);
++              goto out_free;
++      }
++
++      /* Set QoS table */
++      qos_cfg.default_tc = 0;
++      qos_cfg.discard_on_miss = 0;
++      qos_cfg.key_cfg_iova = dma_map_single(dev, params_iova,
++                                            DPAA2_CLASSIFIER_DMA_SIZE,
++                                            DMA_TO_DEVICE);
++      if (dma_mapping_error(dev, qos_cfg.key_cfg_iova)) {
++              dev_err(dev, "%s: DMA mapping failed\n", __func__);
++              err = -ENOMEM;
++              goto out_free;
++      }
++      err = dpni_set_qos_table(priv->mc_io, 0, priv->mc_token, &qos_cfg);
++      dma_unmap_single(dev, qos_cfg.key_cfg_iova,
++                       DPAA2_CLASSIFIER_DMA_SIZE, DMA_TO_DEVICE);
++
++      if (err) {
++              dev_err(dev, "dpni_set_qos_table failed: %d\n", err);
++              goto out_free;
++      }
++
++      key_params.key_size = sizeof(key);
++
++      if (dpaa2_eth_fs_mask_enabled(priv)) {
++              key_params.mask_iova = dma_map_single(dev, &mask, sizeof(mask),
++                                                    DMA_TO_DEVICE);
++              if (dma_mapping_error(dev, key_params.mask_iova)) {
++                      dev_err(dev, "DMA mapping failed %s\n", __func__);
++                      err = -ENOMEM;
++                      goto out_free;
++              }
++      } else {
++              key_params.mask_iova = 0;
++      }
++
++      key_params.key_iova = dma_map_single(dev, &key, sizeof(key),
++                                           DMA_TO_DEVICE);
++      if (dma_mapping_error(dev, key_params.key_iova)) {
++              dev_err(dev, "%s: DMA mapping failed\n", __func__);
++              err = -ENOMEM;
++              goto out_unmap_mask;
++      }
++
++      for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {
++              key = cpu_to_be16(i << VLAN_PRIO_SHIFT);
++              dma_sync_single_for_device(dev, key_params.key_iova,
++                                         sizeof(key), DMA_TO_DEVICE);
++
++              err = dpni_add_qos_entry(priv->mc_io, 0, priv->mc_token,
++                                       &key_params, i, j++);
++              if (err) {
++                      dev_err(dev, "dpni_add_qos_entry failed: %d\n", err);
++                      goto out_unmap;
++              }
++      }
++
++      priv->vlan_clsf_set = true;
++
++out_unmap:
++      dma_unmap_single(dev, key_params.key_iova, sizeof(key), DMA_TO_DEVICE);
++out_unmap_mask:
++      if (key_params.mask_iova)
++              dma_unmap_single(dev, key_params.mask_iova, sizeof(mask),
++                               DMA_TO_DEVICE);
++out_free:
++      kfree(params_iova);
++      return err;
++}
++
++static int dpaa2_eth_dcbnl_ieee_setpfc(struct net_device *net_dev,
++                                     struct ieee_pfc *pfc)
++{
++      struct dpaa2_eth_priv *priv = netdev_priv(net_dev);
++      struct dpni_congestion_notification_cfg notification_cfg = {0};
++      struct dpni_link_state state = {0};
++      struct dpni_link_cfg cfg = {0};
++      int err = 0, i;
++
++      if (priv->pfc.pfc_en == pfc->pfc_en)
++              /* Same enabled mask, nothing to be done */
++              return 0;
++
++      err = set_vlan_qos(priv);
++      if (err)
++              return err;
++
++      err = dpni_get_link_state(priv->mc_io, 0, priv->mc_token, &state);
++      if (err) {
++              netdev_err(net_dev, "ERROR %d getting link state", err);
++              return err;
++      }
++
++      cfg.rate = state.rate;
++      cfg.options = state.options;
++      if (pfc->pfc_en)
++              cfg.options |= DPNI_LINK_OPT_PFC_PAUSE;
++      else
++              cfg.options &= ~DPNI_LINK_OPT_PFC_PAUSE;
++
++      err = dpni_set_link_cfg(priv->mc_io, 0, priv->mc_token, &cfg);
++      if (err) {
++              netdev_err(net_dev, "ERROR %d setting link cfg", err);
++              return err;
++      }
++
++      memcpy(&priv->pfc, pfc, sizeof(priv->pfc));
++
++      err = set_rx_taildrop(priv);
++      if (err)
++              return err;
++
++      /* configure congestion notifications */
++      notification_cfg.notification_mode = DPNI_CONG_OPT_FLOW_CONTROL;
++      notification_cfg.units = DPNI_CONGESTION_UNIT_FRAMES;
++      notification_cfg.message_iova = 0ULL;
++      notification_cfg.message_ctx = 0ULL;
++
++      for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {
++              if (dpaa2_eth_is_pfc_enabled(priv, i)) {
++                      notification_cfg.threshold_entry = NAPI_POLL_WEIGHT;
++                      notification_cfg.threshold_exit = NAPI_POLL_WEIGHT / 2;
++              } else {
++                      notification_cfg.threshold_entry = 0;
++                      notification_cfg.threshold_exit = 0;
++              }
++
++              err = dpni_set_congestion_notification(priv->mc_io, 0,
++                                                     priv->mc_token,
++                                                     DPNI_QUEUE_RX,
++                                                     i, &notification_cfg);
++              if (err) {
++                      netdev_err(net_dev, "Error %d setting congestion notif",
++                                 err);
++                      return err;
++              }
++      }
++
++      return 0;
++}
++
++static u8 dpaa2_eth_dcbnl_getdcbx(struct net_device *net_dev)
++{
++      struct dpaa2_eth_priv *priv = netdev_priv(net_dev);
++
++      return priv->dcbx_mode;
++}
++
++static u8 dpaa2_eth_dcbnl_setdcbx(struct net_device *net_dev, u8 mode)
++{
++      struct dpaa2_eth_priv *priv = netdev_priv(net_dev);
++
++      priv->dcbx_mode = mode;
++      return 0;
++}
++
++static u8 dpaa2_eth_dcbnl_getcap(struct net_device *net_dev, int capid, u8 *cap)
++{
++      struct dpaa2_eth_priv *priv = netdev_priv(net_dev);
++
++      switch (capid) {
++      case DCB_CAP_ATTR_PFC:
++              *cap = true;
++              break;
++      case DCB_CAP_ATTR_PFC_TCS:
++              *cap = 1 << dpaa2_eth_tc_count(priv);
++              break;
++      case DCB_CAP_ATTR_DCBX:
++              *cap = priv->dcbx_mode;
++              break;
++      default:
++              *cap = false;
++              break;
++      }
++
++      return 0;
++}
++
++const struct dcbnl_rtnl_ops dpaa2_eth_dcbnl_ops = {
++      .ieee_getpfc    = dpaa2_eth_dcbnl_ieee_getpfc,
++      .ieee_setpfc    = dpaa2_eth_dcbnl_ieee_setpfc,
++      .getdcbx        = dpaa2_eth_dcbnl_getdcbx,
++      .setdcbx        = dpaa2_eth_dcbnl_setdcbx,
++      .getcap         = dpaa2_eth_dcbnl_getcap,
++};
++#endif
++
 +static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev)
 +{
 +      struct device *dev;
@@ -4152,7 +4511,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      err = fsl_mc_portal_allocate(dpni_dev, FSL_MC_IO_ATOMIC_CONTEXT_PORTAL,
 +                                   &priv->mc_io);
 +      if (err) {
-+              dev_err(dev, "MC portal allocation failed\n");
++              dev_dbg(dev, "MC portal allocation failed\n");
++              err = -EPROBE_DEFER;
 +              goto err_portal_alloc;
 +      }
 +
@@ -4178,10 +4538,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      if (err)
 +              goto err_bind;
 +
-+      /* Add a NAPI context for each channel */
-+      add_ch_napi(priv);
-+      enable_ch_napi(priv);
-+
 +      /* Percpu statistics */
 +      priv->percpu_stats = alloc_percpu(*priv->percpu_stats);
 +      if (!priv->percpu_stats) {
@@ -4224,6 +4580,14 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              goto err_alloc_rings;
 +
 +      net_dev->ethtool_ops = &dpaa2_ethtool_ops;
++#ifdef CONFIG_FSL_DPAA2_ETH_DCB
++      net_dev->dcbnl_ops = &dpaa2_eth_dcbnl_ops;
++      priv->dcbx_mode = DCB_CAP_DCBX_HOST | DCB_CAP_DCBX_VER_IEEE;
++#endif
++
++      /* Add a NAPI context for each channel */
++      add_ch_napi(priv);
++      enable_ch_napi(priv);
 +
 +      err = setup_irqs(dpni_dev);
 +      if (err) {
@@ -4287,6 +4651,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif
 +      dpaa2_eth_sysfs_remove(&net_dev->dev);
 +
++      disable_ch_napi(priv);
++      del_ch_napi(priv);
++
 +      unregister_netdev(net_dev);
 +      dev_info(net_dev->dev.parent, "Removed interface %s\n", net_dev->name);
 +
@@ -4298,9 +4665,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      free_rings(priv);
 +      free_percpu(priv->percpu_stats);
 +      free_percpu(priv->percpu_extras);
-+
-+      disable_ch_napi(priv);
-+      del_ch_napi(priv);
 +      free_dpbp(priv);
 +      free_dpio(priv);
 +      free_dpni(priv);
@@ -4356,7 +4720,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +module_exit(dpaa2_eth_driver_exit);
 --- /dev/null
 +++ b/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.h
-@@ -0,0 +1,460 @@
+@@ -0,0 +1,499 @@
 +/* Copyright 2014-2015 Freescale Semiconductor Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -4392,6 +4756,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#define __DPAA2_ETH_H
 +
 +#include <linux/atomic.h>
++#include <linux/dcbnl.h>
 +#include <linux/netdevice.h>
 +#include <linux/if_vlan.h>
 +#include "../../fsl-mc/include/dpaa2-io.h"
@@ -4455,7 +4820,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#define DPAA2_ETH_RX_BUF_ALIGN                64
 +#define DPAA2_ETH_RX_BUF_ALIGN_V1     256
 +#define DPAA2_ETH_NEEDED_HEADROOM(p_priv) \
-+      ((p_priv)->tx_data_offset + DPAA2_ETH_TX_BUF_ALIGN)
++      ((p_priv)->tx_data_offset + DPAA2_ETH_TX_BUF_ALIGN - HH_DATA_MOD)
 +
 +/* rx_extra_head prevents reallocations in L3 processing. */
 +#define DPAA2_ETH_SKB_SIZE \
@@ -4473,17 +4838,19 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +/* PTP nominal frequency 1GHz */
 +#define DPAA2_PTP_NOMINAL_FREQ_PERIOD_NS 1
 +
-+/* Leave enough extra space in the headroom to make sure the skb is
-+ * not realloc'd in forwarding scenarios.
-+ */
-+#define DPAA2_ETH_RX_HEAD_ROOM                192
-+
 +/* We are accommodating a skb backpointer and some S/G info
 + * in the frame's software annotation. The hardware
 + * options are either 0 or 64, so we choose the latter.
 + */
 +#define DPAA2_ETH_SWA_SIZE            64
 +
++/* Extra headroom space requested to hardware, in order to make sure there's
++ * no realloc'ing in forwarding scenarios
++ */
++#define DPAA2_ETH_RX_HEAD_ROOM \
++      (DPAA2_ETH_TX_HWA_SIZE - DPAA2_ETH_RX_HWA_SIZE + \
++       DPAA2_ETH_TX_BUF_ALIGN)
++
 +/* Must keep this struct smaller than DPAA2_ETH_SWA_SIZE */
 +struct dpaa2_eth_swa {
 +      struct sk_buff *skb;
@@ -4660,16 +5027,17 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      __u64 pull_err;
 +};
 +
++#define DPAA2_ETH_MAX_DPCONS          NR_CPUS
++#define DPAA2_ETH_MAX_TCS             8
++
 +/* Maximum number of queues associated with a DPNI */
-+#define DPAA2_ETH_MAX_RX_QUEUES               16
-+#define DPAA2_ETH_MAX_TX_QUEUES               NR_CPUS
++#define DPAA2_ETH_MAX_RX_QUEUES               (DPNI_MAX_DIST_SIZE * DPAA2_ETH_MAX_TCS)
++#define DPAA2_ETH_MAX_TX_QUEUES               DPNI_MAX_SENDERS
 +#define DPAA2_ETH_MAX_RX_ERR_QUEUES   1
 +#define DPAA2_ETH_MAX_QUEUES          (DPAA2_ETH_MAX_RX_QUEUES + \
 +                                      DPAA2_ETH_MAX_TX_QUEUES + \
 +                                      DPAA2_ETH_MAX_RX_ERR_QUEUES)
 +
-+#define DPAA2_ETH_MAX_DPCONS          NR_CPUS
-+
 +enum dpaa2_eth_fq_type {
 +      DPAA2_RX_FQ = 0,
 +      DPAA2_TX_CONF_FQ,
@@ -4682,6 +5050,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      u32 fqid;
 +      u32 tx_qdbin;
 +      u16 flowid;
++      u8 tc;
 +      int target_cpu;
 +      struct dpaa2_eth_channel *channel;
 +      enum dpaa2_eth_fq_type type;
@@ -4788,6 +5157,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      struct dpaa2_eth_cls_rule *cls_rule;
 +
 +      struct dpni_tx_shaping_cfg shaping_cfg;
++
++      u8 dcbx_mode;
++      struct ieee_pfc pfc;
++      bool vlan_clsf_set;
 +};
 +
 +#define dpaa2_eth_hash_enabled(priv)  \
@@ -4813,13 +5186,43 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      return priv->dpni_attrs.num_queues;
 +}
 +
++static inline int dpaa2_eth_tc_count(struct dpaa2_eth_priv *priv)
++{
++      return priv->dpni_attrs.num_tcs;
++}
++
++static inline bool dpaa2_eth_is_pfc_enabled(struct dpaa2_eth_priv *priv,
++                                          int traffic_class)
++{
++      return priv->pfc.pfc_en & (1 << traffic_class);
++}
++
++enum dpaa2_eth_td_cfg {
++      DPAA2_ETH_TD_NONE,
++      DPAA2_ETH_TD_QUEUE,
++      DPAA2_ETH_TD_GROUP
++};
++
++static inline enum dpaa2_eth_td_cfg
++dpaa2_eth_get_td_type(struct dpaa2_eth_priv *priv)
++{
++      bool pfc_enabled = !!(priv->pfc.pfc_en);
++
++      if (pfc_enabled)
++              return DPAA2_ETH_TD_GROUP;
++      else if (priv->tx_pause_frames)
++              return DPAA2_ETH_TD_NONE;
++      else
++              return DPAA2_ETH_TD_QUEUE;
++}
++
 +void check_cls_support(struct dpaa2_eth_priv *priv);
 +
-+int setup_fqs_taildrop(struct dpaa2_eth_priv *priv, bool enable);
++int set_rx_taildrop(struct dpaa2_eth_priv *priv);
 +#endif        /* __DPAA2_H */
 --- /dev/null
 +++ b/drivers/staging/fsl-dpaa2/ethernet/dpaa2-ethtool.c
-@@ -0,0 +1,856 @@
+@@ -0,0 +1,864 @@
 +/* Copyright 2014-2015 Freescale Semiconductor Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -5052,7 +5455,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      if (current_tx_pause == pause->tx_pause)
 +              goto out;
 +
-+      err = setup_fqs_taildrop(priv, !pause->tx_pause);
++      priv->tx_pause_frames = pause->tx_pause;
++      err = set_rx_taildrop(priv);
 +      if (err)
 +              netdev_dbg(net_dev, "ERROR %d configuring taildrop", err);
 +
@@ -5498,7 +5902,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      struct dpni_rule_cfg rule_cfg;
 +      struct dpni_fs_action_cfg fs_act = { 0 };
 +      void *dma_mem;
-+      int err = 0;
++      int err = 0, tc;
 +
 +      if (!dpaa2_eth_fs_enabled(priv)) {
 +              netdev_err(net_dev, "dev does not support steering!\n");
@@ -5541,12 +5945,19 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      else
 +              fs_act.flow_id = fs->ring_cookie;
 +
-+      if (add)
-+              err = dpni_add_fs_entry(priv->mc_io, 0, priv->mc_token,
-+                                      0, fs->location, &rule_cfg, &fs_act);
-+      else
-+              err = dpni_remove_fs_entry(priv->mc_io, 0, priv->mc_token,
-+                                         0, &rule_cfg);
++      for (tc = 0; tc < dpaa2_eth_tc_count(priv); tc++) {
++              if (add)
++                      err = dpni_add_fs_entry(priv->mc_io, 0, priv->mc_token,
++                                              tc, fs->location, &rule_cfg,
++                                              &fs_act);
++              else
++                      err = dpni_remove_fs_entry(priv->mc_io, 0,
++                                                 priv->mc_token, tc,
++                                                 &rule_cfg);
++
++              if (err)
++                      break;
++      }
 +
 +      dma_unmap_single(dev, rule_cfg.key_iova,
 +                       rule_cfg.key_size * 2, DMA_TO_DEVICE);
@@ -5857,7 +6268,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif /* __FSL_DPKG_H_ */
 --- /dev/null
 +++ b/drivers/staging/fsl-dpaa2/ethernet/dpni-cmd.h
-@@ -0,0 +1,600 @@
+@@ -0,0 +1,658 @@
 +/* Copyright 2013-2016 Freescale Semiconductor Inc.
 + * Copyright 2016 NXP
 + *
@@ -5897,9 +6308,11 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#define DPNI_VER_MAJOR                                7
 +#define DPNI_VER_MINOR                                0
 +#define DPNI_CMD_BASE_VERSION                 1
++#define DPNI_CMD_2ND_VERSION                  2
 +#define DPNI_CMD_ID_OFFSET                    4
 +
 +#define DPNI_CMD(id)  (((id) << DPNI_CMD_ID_OFFSET) | DPNI_CMD_BASE_VERSION)
++#define DPNI_CMD_V2(id)       (((id) << DPNI_CMD_ID_OFFSET) | DPNI_CMD_2ND_VERSION)
 +
 +#define DPNI_CMDID_OPEN                                       DPNI_CMD(0x801)
 +#define DPNI_CMDID_CLOSE                              DPNI_CMD(0x800)
@@ -5922,7 +6335,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#define DPNI_CMDID_GET_IRQ_STATUS                     DPNI_CMD(0x016)
 +#define DPNI_CMDID_CLEAR_IRQ_STATUS                   DPNI_CMD(0x017)
 +
-+#define DPNI_CMDID_SET_POOLS                          DPNI_CMD(0x200)
++#define DPNI_CMDID_SET_POOLS                          DPNI_CMD_V2(0x200)
 +#define DPNI_CMDID_SET_ERRORS_BEHAVIOR                        DPNI_CMD(0x20B)
 +
 +#define DPNI_CMDID_GET_QDID                           DPNI_CMD(0x210)
@@ -5945,6 +6358,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +#define DPNI_CMDID_SET_RX_TC_DIST                     DPNI_CMD(0x235)
 +
++#define DPNI_CMDID_SET_QOS_TBL                                DPNI_CMD(0x240)
++#define DPNI_CMDID_ADD_QOS_ENT                                DPNI_CMD(0x241)
 +#define DPNI_CMDID_ADD_FS_ENT                         DPNI_CMD(0x244)
 +#define DPNI_CMDID_REMOVE_FS_ENT                      DPNI_CMD(0x245)
 +#define DPNI_CMDID_CLR_FS_ENT                         DPNI_CMD(0x246)
@@ -5985,13 +6400,14 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +#define DPNI_BACKUP_POOL(val, order)  (((val) & 0x1) << (order))
 +struct dpni_cmd_set_pools {
-+      /* cmd word 0 */
 +      u8 num_dpbp;
 +      u8 backup_pool_mask;
 +      __le16 pad;
-+      /* cmd word 0..4 */
-+      __le32 dpbp_id[DPNI_MAX_DPBP];
-+      /* cmd word 4..6 */
++      struct {
++              __le16 dpbp_id;
++              u8 priority_mask;
++              u8 pad;
++      } pool[DPNI_MAX_DPBP];
 +      __le16 buffer_size[DPNI_MAX_DPBP];
 +};
 +
@@ -6370,6 +6786,36 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      __le64 user_context;
 +};
 +
++#define DPNI_DISCARD_ON_MISS_SHIFT    0
++#define DPNI_DISCARD_ON_MISS_SIZE     1
++
++struct dpni_cmd_set_qos_table {
++      u32 pad;
++      u8 default_tc;
++      /* only the LSB */
++      u8 discard_on_miss;
++      u16 pad1[21];
++      u64 key_cfg_iova;
++};
++
++struct dpni_cmd_add_qos_entry {
++      u16 pad;
++      u8 tc_id;
++      u8 key_size;
++      u16 index;
++      u16 pad2;
++      u64 key_iova;
++      u64 mask_iova;
++};
++
++struct dpni_cmd_remove_qos_entry {
++      u8 pad1[3];
++      u8 key_size;
++      u32 pad2;
++      u64 key_iova;
++      u64 mask_iova;
++};
++
 +struct dpni_cmd_add_fs_entry {
 +      /* cmd word 0 */
 +      u16 options;
@@ -6457,10 +6903,33 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      u32 threshold_exit;
 +};
 +
++struct dpni_cmd_get_congestion_notification {
++      /* cmd word 0 */
++      u8 qtype;
++      u8 tc;
++};
++
++struct dpni_rsp_get_congestion_notification {
++      /* cmd word 0 */
++      u64 pad;
++      /* cmd word 1 */
++      u32 dest_id;
++      u16 notification_mode;
++      u8 dest_priority;
++      /* from LSB: dest_type: 4 units:2 */
++      u8 type_units;
++      /* cmd word 2 */
++      u64 message_iova;
++      /* cmd word 3 */
++      u64 message_ctx;
++      /* cmd word 4 */
++      u32 threshold_entry;
++      u32 threshold_exit;
++};
 +#endif /* _FSL_DPNI_CMD_H */
 --- /dev/null
 +++ b/drivers/staging/fsl-dpaa2/ethernet/dpni.c
-@@ -0,0 +1,1770 @@
+@@ -0,0 +1,1903 @@
 +/* Copyright 2013-2016 Freescale Semiconductor Inc.
 + * Copyright 2016 NXP
 + *
@@ -6661,7 +7130,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      cmd_params = (struct dpni_cmd_set_pools *)cmd.params;
 +      cmd_params->num_dpbp = cfg->num_dpbp;
 +      for (i = 0; i < DPNI_MAX_DPBP; i++) {
-+              cmd_params->dpbp_id[i] = cpu_to_le32(cfg->pools[i].dpbp_id);
++              cmd_params->pool[i].dpbp_id =
++                      cpu_to_le16(cfg->pools[i].dpbp_id);
++              cmd_params->pool[i].priority_mask =
++                      cfg->pools[i].priority_mask;
 +              cmd_params->buffer_size[i] =
 +                      cpu_to_le16(cfg->pools[i].buffer_size);
 +              cmd_params->backup_pool_mask |=
@@ -7837,6 +8309,82 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      return mc_send_command(mc_io, &cmd);
 +}
 +
++/*
++ * dpni_set_qos_table() - Set QoS mapping table
++ * @mc_io:    Pointer to MC portal's I/O object
++ * @cmd_flags:        Command flags; one or more of 'MC_CMD_FLAG_'
++ * @token:    Token of DPNI object
++ * @cfg:      QoS table configuration
++ *
++ * This function and all QoS-related functions require that
++ *'max_tcs > 1' was set at DPNI creation.
++ *
++ * warning: Before calling this function, call dpkg_prepare_key_cfg() to
++ *                    prepare the key_cfg_iova parameter
++ *
++ * Return:    '0' on Success; Error code otherwise.
++ */
++int dpni_set_qos_table(struct fsl_mc_io *mc_io,
++                     u32 cmd_flags,
++                     u16 token,
++                     const struct dpni_qos_tbl_cfg *cfg)
++{
++      struct dpni_cmd_set_qos_table *cmd_params;
++      struct mc_command cmd = { 0 };
++
++      /* prepare command */
++      cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QOS_TBL,
++                                        cmd_flags,
++                                        token);
++      cmd_params = (struct dpni_cmd_set_qos_table *)cmd.params;
++      cmd_params->default_tc = cfg->default_tc;
++      cmd_params->key_cfg_iova = cpu_to_le64(cfg->key_cfg_iova);
++      dpni_set_field(cmd_params->discard_on_miss,
++                     ENABLE,
++                     cfg->discard_on_miss);
++
++      /* send command to mc*/
++      return mc_send_command(mc_io, &cmd);
++}
++
++/**
++ * dpni_add_qos_entry() - Add QoS mapping entry (to select a traffic class)
++ * @mc_io:    Pointer to MC portal's I/O object
++ * @cmd_flags:        Command flags; one or more of 'MC_CMD_FLAG_'
++ * @token:    Token of DPNI object
++ * @cfg:      QoS rule to add
++ * @tc_id:    Traffic class selection (0-7)
++ * @index:    Location in the QoS table where to insert the entry.
++ *            Only relevant if MASKING is enabled for QoS classification on
++ *            this DPNI, it is ignored for exact match.
++ *
++ * Return:    '0' on Success; Error code otherwise.
++ */
++int dpni_add_qos_entry(struct fsl_mc_io *mc_io,
++                     u32 cmd_flags,
++                     u16 token,
++                     const struct dpni_rule_cfg *cfg,
++                     u8 tc_id,
++                     u16 index)
++{
++      struct dpni_cmd_add_qos_entry *cmd_params;
++      struct mc_command cmd = { 0 };
++
++      /* prepare command */
++      cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_QOS_ENT,
++                                        cmd_flags,
++                                        token);
++      cmd_params = (struct dpni_cmd_add_qos_entry *)cmd.params;
++      cmd_params->tc_id = tc_id;
++      cmd_params->key_size = cfg->key_size;
++      cmd_params->index = cpu_to_le16(index);
++      cmd_params->key_iova = cpu_to_le64(cfg->key_iova);
++      cmd_params->mask_iova = cpu_to_le64(cfg->mask_iova);
++
++      /* send command to mc*/
++      return mc_send_command(mc_io, &cmd);
++}
++
 +/**
 + * dpni_add_fs_entry() - Add Flow Steering entry for a specific traffic class
 + *                    (to select a flow ID)
@@ -7961,6 +8509,60 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +}
 +
 +/**
++ * dpni_get_congestion_notification() - Get traffic class congestion
++ *    notification configuration
++ * @mc_io:    Pointer to MC portal's I/O object
++ * @cmd_flags:        Command flags; one or more of 'MC_CMD_FLAG_'
++ * @token:    Token of DPNI object
++ * @qtype:    Type of queue - Rx, Tx and Tx confirm types are supported
++ * @tc_id:    Traffic class selection (0-7)
++ * @cfg:      congestion notification configuration
++ *
++ * Return:    '0' on Success; error code otherwise.
++ */
++int dpni_get_congestion_notification(
++                      struct fsl_mc_io *mc_io,
++                      u32 cmd_flags,
++                      u16 token,
++                      enum dpni_queue_type qtype,
++                      u8 tc_id,
++                      struct dpni_congestion_notification_cfg *cfg)
++{
++      struct dpni_rsp_get_congestion_notification *rsp_params;
++      struct dpni_cmd_get_congestion_notification *cmd_params;
++      struct mc_command cmd = { 0 };
++      int err;
++
++      /* prepare command */
++      cmd.header = mc_encode_cmd_header(
++                              DPNI_CMDID_GET_CONGESTION_NOTIFICATION,
++                              cmd_flags,
++                              token);
++      cmd_params = (struct dpni_cmd_get_congestion_notification *)cmd.params;
++      cmd_params->qtype = qtype;
++      cmd_params->tc = tc_id;
++
++      /* send command to mc*/
++      err = mc_send_command(mc_io, &cmd);
++      if (err)
++              return err;
++
++      rsp_params = (struct dpni_rsp_get_congestion_notification *)cmd.params;
++      cfg->units = dpni_get_field(rsp_params->type_units, CONG_UNITS);
++      cfg->threshold_entry = le32_to_cpu(rsp_params->threshold_entry);
++      cfg->threshold_exit = le32_to_cpu(rsp_params->threshold_exit);
++      cfg->message_ctx = le64_to_cpu(rsp_params->message_ctx);
++      cfg->message_iova = le64_to_cpu(rsp_params->message_iova);
++      cfg->notification_mode = le16_to_cpu(rsp_params->notification_mode);
++      cfg->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id);
++      cfg->dest_cfg.priority = rsp_params->dest_priority;
++      cfg->dest_cfg.dest_type = dpni_get_field(rsp_params->type_units,
++                                               DEST_TYPE);
++
++      return 0;
++}
++
++/**
 + * dpni_set_queue() - Set queue parameters
 + * @mc_io:    Pointer to MC portal's I/O object
 + * @cmd_flags:        Command flags; one or more of 'MC_CMD_FLAG_'
@@ -8233,7 +8835,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +}
 --- /dev/null
 +++ b/drivers/staging/fsl-dpaa2/ethernet/dpni.h
-@@ -0,0 +1,989 @@
+@@ -0,0 +1,1053 @@
 +/* Copyright 2013-2016 Freescale Semiconductor Inc.
 + * Copyright 2016 NXP
 + *
@@ -8288,6 +8890,14 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 + * Maximum number of buffer pools per DPNI
 + */
 +#define DPNI_MAX_DPBP                         8
++/**
++ * Maximum number of senders
++ */
++#define DPNI_MAX_SENDERS                      8
++/**
++ * Maximum distribution size
++ */
++#define DPNI_MAX_DIST_SIZE                    8
 +
 +/**
 + * All traffic classes considered; see dpni_set_queue()
@@ -8359,13 +8969,15 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      /**
 +       * struct pools - Buffer pools parameters
 +       * @dpbp_id: DPBP object ID
++       * @priority_mask: priorities served by DPBP
 +       * @buffer_size: Buffer size
 +       * @backup_pool: Backup pool
 +       */
 +      struct {
-+              int     dpbp_id;
++              u16     dpbp_id;
++              u8      priority_mask;
 +              u16     buffer_size;
-+              int     backup_pool;
++              u8      backup_pool;
 +      } pools[DPNI_MAX_DPBP];
 +};
 +
@@ -8745,6 +9357,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 + * Enable a-symmetric pause frames
 + */
 +#define DPNI_LINK_OPT_ASYM_PAUSE      0x0000000000000008ULL
++/**
++ * Enable priority flow control pause frames
++ */
++#define DPNI_LINK_OPT_PFC_PAUSE               0x0000000000000010ULL
 +
 +/**
 + * struct - Structure representing DPNI link configuration
@@ -8894,6 +9510,26 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                       u8 *key_cfg_buf);
 +
 +/**
++ * struct dpni_qos_tbl_cfg - Structure representing QOS table configuration
++ * @key_cfg_iova: I/O virtual address of 256 bytes DMA-able memory filled with
++ *            key extractions to be used as the QoS criteria by calling
++ *            dpkg_prepare_key_cfg()
++ * @discard_on_miss: Set to '1' to discard frames in case of no match (miss);
++ *            '0' to use the 'default_tc' in such cases
++ * @default_tc: Used in case of no-match and 'discard_on_miss'= 0
++ */
++struct dpni_qos_tbl_cfg {
++      u64 key_cfg_iova;
++      int discard_on_miss;
++      u8 default_tc;
++};
++
++int dpni_set_qos_table(struct fsl_mc_io *mc_io,
++                     u32 cmd_flags,
++                     u16 token,
++                     const struct dpni_qos_tbl_cfg *cfg);
++
++/**
 + * struct dpni_rx_tc_dist_cfg - Rx traffic class distribution configuration
 + * @dist_size: Set the distribution size;
 + *    supported values: 1,2,3,4,6,7,8,12,14,16,24,28,32,48,56,64,96,
@@ -9086,6 +9722,12 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 + * sw-portal's DQRR, the DQRI interrupt is asserted immediately (if enabled)
 + */
 +#define DPNI_CONG_OPT_INTR_COALESCING_DISABLED        0x00000020
++/**
++ * This congestion will trigger flow control or priority flow control.
++ * This will have effect only if flow control is enabled with
++ * dpni_set_link_cfg().
++ */
++#define DPNI_CONG_OPT_FLOW_CONTROL    0x00000040
 +
 +/**
 + * struct dpni_congestion_notification_cfg - congestion notification
@@ -9119,6 +9761,14 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      u8 tc_id,
 +                      const struct dpni_congestion_notification_cfg *cfg);
 +
++int dpni_get_congestion_notification(
++                      struct fsl_mc_io *mc_io,
++                      u32 cmd_flags,
++                      u16 token,
++                      enum dpni_queue_type qtype,
++                      u8 tc_id,
++                      struct dpni_congestion_notification_cfg *cfg);
++
 +/**
 + * struct dpni_taildrop - Structure representing the taildrop
 + * @enable:   Indicates whether the taildrop is active or not.
@@ -9165,6 +9815,22 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      u8      key_size;
 +};
 +
++int dpni_add_qos_entry(struct fsl_mc_io *mc_io,
++                     u32 cmd_flags,
++                     u16 token,
++                     const struct dpni_rule_cfg *cfg,
++                     u8 tc_id,
++                     u16 index);
++
++int dpni_remove_qos_entry(struct fsl_mc_io *mc_io,
++                        u32 cmd_flags,
++                        u16 token,
++                        const struct dpni_rule_cfg *cfg);
++
++int dpni_clear_qos_table(struct fsl_mc_io *mc_io,
++                       u32 cmd_flags,
++                       u16 token);
++
 +/**
 + * Discard matching traffic.  If set, this takes precedence over any other
 + * configuration and matching traffic is always discarded.
@@ -15718,7 +16384,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      return 0;
 +}
 +
-+void ethsw_port_get_stats(struct net_device *netdev,
++struct rtnl_link_stats64 *ethsw_port_get_stats(struct net_device *netdev,
 +                        struct rtnl_link_stats64 *storage)
 +{
 +      struct ethsw_port_priv  *port_priv = netdev_priv(netdev);
@@ -15778,7 +16444,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      if (err)
 +              goto error;
 +
-+      return;
++      return storage;
 +
 +error:
 +      netdev_err(netdev, "dpsw_if_get_counter err %d\n", err);
@@ -19125,7 +19791,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      return 0;
 +}
 +
-+void evb_port_get_stats(struct net_device *netdev,
++struct rtnl_link_stats64 *evb_port_get_stats(struct net_device *netdev,
 +                      struct rtnl_link_stats64 *storage)
 +{
 +      struct evb_port_priv    *port_priv = netdev_priv(netdev);
@@ -19202,7 +19868,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      if (unlikely(err))
 +              goto error;
 +
-+      return;
++      return storage;
 +
 +error:
 +      netdev_err(netdev, "dpdmux_if_get_counter err %d\n", err);
@@ -20892,7 +21558,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif /* __FSL_DPMAC_H */
 --- /dev/null
 +++ b/drivers/staging/fsl-dpaa2/mac/mac.c
-@@ -0,0 +1,666 @@
+@@ -0,0 +1,669 @@
 +/* Copyright 2015 Freescale Semiconductor Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -21014,15 +21680,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              dev_err(&priv->mc_dev->dev, "dpmac_set_link_state: %d\n", err);
 +}
 +
-+#ifdef CONFIG_FSL_DPAA2_MAC_NETDEVS
-+static netdev_tx_t dpaa2_mac_drop_frame(struct sk_buff *skb,
-+                                      struct net_device *dev)
-+{
-+      /* we don't support I/O for now, drop the frame */
-+      dev_kfree_skb_any(skb);
-+      return NETDEV_TX_OK;
-+}
-+
 +static int dpaa2_mac_open(struct net_device *netdev)
 +{
 +      /* start PHY state machine */
@@ -21047,6 +21704,15 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      return 0;
 +}
 +
++#ifdef CONFIG_FSL_DPAA2_MAC_NETDEVS
++static netdev_tx_t dpaa2_mac_drop_frame(struct sk_buff *skb,
++                                      struct net_device *dev)
++{
++      /* we don't support I/O for now, drop the frame */
++      dev_kfree_skb_any(skb);
++      return NETDEV_TX_OK;
++}
++
 +static int dpaa2_mac_get_settings(struct net_device *netdev,
 +                                struct ethtool_cmd *cmd)
 +{
@@ -21207,9 +21873,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +}
 +
 +static const struct net_device_ops dpaa2_mac_ndo_ops = {
-+      .ndo_start_xmit         = &dpaa2_mac_drop_frame,
 +      .ndo_open               = &dpaa2_mac_open,
 +      .ndo_stop               = &dpaa2_mac_stop,
++      .ndo_start_xmit         = &dpaa2_mac_drop_frame,
 +      .ndo_get_stats64        = &dpaa2_mac_get_stats,
 +};
 +
@@ -21437,10 +22103,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      }
 +#endif /* CONFIG_FSL_DPAA2_MAC_NETDEVS */
 +
-+      /* probe the PHY as a fixed-link if the link type declared in DPC
-+       * explicitly mandates this
++      /* probe the PHY as a fixed-link if there's a phy-handle defined
++       * in the device tree
 +       */
-+
 +      phy_node = of_parse_phandle(dpmac_node, "phy-handle", 0);
 +      if (!phy_node) {
 +              goto probe_fixed_link;
@@ -21492,12 +22157,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              dev_info(dev, "Registered fixed PHY.\n");
 +      }
 +
-+      /* start PHY state machine */
-+#ifdef CONFIG_FSL_DPAA2_MAC_NETDEVS
 +      dpaa2_mac_open(netdev);
-+#else /* CONFIG_FSL_DPAA2_MAC_NETDEVS */
-+      phy_start(netdev->phydev);
-+#endif /* CONFIG_FSL_DPAA2_MAC_NETDEVS */
++
 +      return 0;
 +
 +err_defer:
@@ -21521,6 +22182,15 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +{
 +      struct device           *dev = &mc_dev->dev;
 +      struct dpaa2_mac_priv   *priv = dev_get_drvdata(dev);
++      struct net_device       *netdev = priv->netdev;
++
++      dpaa2_mac_stop(netdev);
++
++      if (phy_is_pseudo_fixed_link(netdev->phydev))
++              fixed_phy_unregister(netdev->phydev);
++      else
++              phy_disconnect(netdev->phydev);
++      netdev->phydev = NULL;
 +
 +#ifdef CONFIG_FSL_DPAA2_MAC_NETDEVS
 +      unregister_netdev(priv->netdev);
@@ -21531,7 +22201,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      free_netdev(priv->netdev);
 +
 +      dev_set_drvdata(dev, NULL);
-+      kfree(priv);
 +
 +      return 0;
 +}
diff --git a/target/linux/layerscape/patches-4.9/706-fsl-dpaa-use-4-9-ndo-get-stats64.patch b/target/linux/layerscape/patches-4.9/706-fsl-dpaa-use-4-9-ndo-get-stats64.patch
deleted file mode 100644 (file)
index 4fa29b2..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-From: Mathew McBride <matt@traverse.com.au>
-Date: Tue, 24 Oct 2017 11:30:00 +1100
-Subject: [PATCH] dpaa: backport use of 4.9 ndo_get_stats64
-
-This patch changes the declarations of ndo_get_stats64 handlers
-to the previous struct rtnl_link_stats64 * return type instead of
-the mainline void return.
-
-Suggested-by: Adrien Gallouët <adrien@gallouet.fr>
-Signed-off-by: Mathew McBride <matt@traverse.com.au>
-
----
- drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.c |    5 +++--
- drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.h |    4 ++--
- drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c            |    3 ++-
- drivers/staging/fsl-dpaa2/ethsw/switch.c                  |    4 ++--
- drivers/staging/fsl-dpaa2/evb/evb.c                       |    4 ++--
- 5 files changed, 11 insertions(+), 9 deletions(-)
-
---- a/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c
-+++ b/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c
-@@ -1296,7 +1296,7 @@ static int dpaa2_eth_set_addr(struct net
- /** Fill in counters maintained by the GPP driver. These may be different from
-  * the hardware counters obtained by ethtool.
-  */
--static void dpaa2_eth_get_stats(struct net_device *net_dev,
-+static struct rtnl_link_stats64 *dpaa2_eth_get_stats(struct net_device *net_dev,
-                               struct rtnl_link_stats64 *stats)
- {
-       struct dpaa2_eth_priv *priv = netdev_priv(net_dev);
-@@ -1312,6 +1312,7 @@ static void dpaa2_eth_get_stats(struct n
-               for (j = 0; j < num; j++)
-                       netstats[j] += cpustats[j];
-       }
-+      return stats;
- }
- static int dpaa2_eth_change_mtu(struct net_device *net_dev, int mtu)
---- a/drivers/staging/fsl-dpaa2/ethsw/switch.c
-+++ b/drivers/staging/fsl-dpaa2/ethsw/switch.c
-@@ -1094,7 +1094,7 @@ static int ethsw_port_fdb_del(struct ndm
-       return 0;
- }
--void ethsw_port_get_stats(struct net_device *netdev,
-+struct rtnl_link_stats64 *ethsw_port_get_stats(struct net_device *netdev,
-                         struct rtnl_link_stats64 *storage)
- {
-       struct ethsw_port_priv  *port_priv = netdev_priv(netdev);
-@@ -1154,7 +1154,7 @@ void ethsw_port_get_stats(struct net_dev
-       if (err)
-               goto error;
--      return;
-+      return storage;
- error:
-       netdev_err(netdev, "dpsw_if_get_counter err %d\n", err);
---- a/drivers/staging/fsl-dpaa2/evb/evb.c
-+++ b/drivers/staging/fsl-dpaa2/evb/evb.c
-@@ -765,7 +765,7 @@ static int evb_dellink(struct net_device
-       return 0;
- }
--void evb_port_get_stats(struct net_device *netdev,
-+struct rtnl_link_stats64 *evb_port_get_stats(struct net_device *netdev,
-                       struct rtnl_link_stats64 *storage)
- {
-       struct evb_port_priv    *port_priv = netdev_priv(netdev);
-@@ -842,7 +842,7 @@ void evb_port_get_stats(struct net_devic
-       if (unlikely(err))
-               goto error;
--      return;
-+      return storage;
- error:
-       netdev_err(netdev, "dpdmux_if_get_counter err %d\n", err);
---- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.c
-+++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.c
-@@ -239,8 +239,8 @@ EXPORT_SYMBOL(dpa_timeout);
-  * Calculates the statistics for the given device by adding the statistics
-  * collected by each CPU.
-  */
--void __cold
--dpa_get_stats64(struct net_device *net_dev,
-+struct rtnl_link_stats64 __cold
-+*dpa_get_stats64(struct net_device *net_dev,
-               struct rtnl_link_stats64 *stats)
- {
-       struct dpa_priv_s *priv = netdev_priv(net_dev);
-@@ -258,6 +258,7 @@ dpa_get_stats64(struct net_device *net_d
-               for (j = 0; j < numstats; j++)
-                       netstats[j] += cpustats[j];
-       }
-+      return stats;
- }
- EXPORT_SYMBOL(dpa_get_stats64);
---- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.h
-+++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.h
-@@ -140,8 +140,8 @@ int dpa_netdev_init(struct net_device *n
- int __cold dpa_start(struct net_device *net_dev);
- int __cold dpa_stop(struct net_device *net_dev);
- void __cold dpa_timeout(struct net_device *net_dev);
--void __cold
--dpa_get_stats64(struct net_device *net_dev,
-+struct rtnl_link_stats64 __cold
-+*dpa_get_stats64(struct net_device *net_dev,
-               struct rtnl_link_stats64 *stats);
- int dpa_change_mtu(struct net_device *net_dev, int new_mtu);
- int dpa_ndo_init(struct net_device *net_dev);
index 4104272..068f021 100644 (file)
@@ -1,9 +1,9 @@
-From 8b7935a883d42187716fe486c83352f24d01ddcd Mon Sep 17 00:00:00 2001
+From 8089957ac5ac5f4f8436b1052dda7840f3bff3ea Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Thu, 19 Oct 2017 12:48:19 +0800
-Subject: [PATCH] fsl_ppfe: support layercape
+Date: Wed, 17 Jan 2018 15:14:12 +0800
+Subject: [PATCH 12/30] fsl_ppfe: support layercape
 
-This is a integrated patch for layerscape pfe support.
+This is an integrated patch for layerscape pfe support.
 
 Calvin Johnson <calvin.johnson@nxp.com>
 Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
@@ -25,15 +25,15 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  drivers/staging/fsl_ppfe/pfe_ctrl.h                |  112 +
  drivers/staging/fsl_ppfe/pfe_debugfs.c             |  111 +
  drivers/staging/fsl_ppfe/pfe_debugfs.h             |   25 +
- drivers/staging/fsl_ppfe/pfe_eth.c                 | 2434 ++++++++++++++++++++
+ drivers/staging/fsl_ppfe/pfe_eth.c                 | 2474 ++++++++++++++++++++
  drivers/staging/fsl_ppfe/pfe_eth.h                 |  184 ++
  drivers/staging/fsl_ppfe/pfe_firmware.c            |  314 +++
  drivers/staging/fsl_ppfe/pfe_firmware.h            |   32 +
  drivers/staging/fsl_ppfe/pfe_hal.c                 | 1516 ++++++++++++
  drivers/staging/fsl_ppfe/pfe_hif.c                 | 1072 +++++++++
  drivers/staging/fsl_ppfe/pfe_hif.h                 |  211 ++
- drivers/staging/fsl_ppfe/pfe_hif_lib.c             |  601 +++++
- drivers/staging/fsl_ppfe/pfe_hif_lib.h             |  239 ++
+ drivers/staging/fsl_ppfe/pfe_hif_lib.c             |  637 +++++
+ drivers/staging/fsl_ppfe/pfe_hif_lib.h             |  240 ++
  drivers/staging/fsl_ppfe/pfe_hw.c                  |  176 ++
  drivers/staging/fsl_ppfe/pfe_hw.h                  |   27 +
  drivers/staging/fsl_ppfe/pfe_ls1012a_platform.c    |  394 ++++
@@ -42,7 +42,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  drivers/staging/fsl_ppfe/pfe_perfmon.h             |   38 +
  drivers/staging/fsl_ppfe/pfe_sysfs.c               |  818 +++++++
  drivers/staging/fsl_ppfe/pfe_sysfs.h               |   29 +
- 34 files changed, 10366 insertions(+)
+ 34 files changed, 10443 insertions(+)
  create mode 100644 drivers/staging/fsl_ppfe/Kconfig
  create mode 100644 drivers/staging/fsl_ppfe/Makefile
  create mode 100644 drivers/staging/fsl_ppfe/TODO
@@ -2159,7 +2159,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif /* _PFE_DEBUGFS_H_ */
 --- /dev/null
 +++ b/drivers/staging/fsl_ppfe/pfe_eth.c
-@@ -0,0 +1,2434 @@
+@@ -0,0 +1,2474 @@
 +/*
 + * Copyright 2015-2016 Freescale Semiconductor, Inc.
 + * Copyright 2017 NXP
@@ -2455,10 +2455,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      /* Initialize the default values */
 +
 +      /*
-+       * By default, packets without conntrack will use this default high
++       * By default, packets without conntrack will use this default low
 +       * priority queue
 +       */
-+      priv->default_priority = 15;
++      priv->default_priority = 0;
 +
 +      /* Create our sysfs files */
 +      err = device_create_file(&ndev->dev, &dev_attr_default_priority);
@@ -2739,7 +2739,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      if (!phydev)
 +              return -ENODEV;
 +
-+      return phy_ethtool_ksettings_get(phydev, cmd);
++      phy_ethtool_ksettings_get(phydev, cmd);
++
++      return 0;
 +}
 +
 +/*
@@ -3083,7 +3085,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                           struct ls1012a_mdio_platform_data *minfo)
 +{
 +      struct mii_bus *bus;
-+      int rc;
++      int rc, ii;
++      struct phy_device *phydev;
 +
 +      netif_info(priv, drv, priv->ndev, "%s\n", __func__);
 +      pr_info("%s\n", __func__);
@@ -3122,6 +3125,31 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      }
 +
 +      priv->mii_bus = bus;
++
++      /* For clause 45 we need to call get_phy_device() with it's
++       * 3rd argument as true and then register the phy device
++       * via phy_device_register()
++       */
++
++      if (priv->einfo->mii_config == PHY_INTERFACE_MODE_2500SGMII) {
++              for (ii = 0; ii < NUM_GEMAC_SUPPORT; ii++) {
++                      phydev = get_phy_device(priv->mii_bus,
++                                      priv->einfo->phy_id + ii, true);
++                      if (!phydev || IS_ERR(phydev)) {
++                              rc = -EIO;
++                              netdev_err(priv->ndev, "fail to get device\n");
++                              goto err1;
++                      }
++                      rc = phy_device_register(phydev);
++                      if (rc) {
++                              phy_device_free(phydev);
++                              netdev_err(priv->ndev,
++                                      "phy_device_register() failed\n");
++                              goto err1;
++                      }
++              }
++      }
++
 +      pfe_eth_mdio_reset(bus);
 +
 +      return 0;
@@ -3307,8 +3335,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      struct pfe_eth_priv_s *priv = pfe->eth.eth_priv[0];
 +      int sgmii_2500 = 0;
 +      struct mii_bus *bus = priv->mii_bus;
++      u16 value = 0;
 +
-+      if (priv->einfo->mii_config == PHY_INTERFACE_MODE_SGMII_2500)
++      if (priv->einfo->mii_config == PHY_INTERFACE_MODE_2500SGMII)
 +              sgmii_2500 = 1;
 +
 +      netif_info(priv, drv, ndev, "%s\n", __func__);
@@ -3324,14 +3353,16 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              pfe_eth_mdio_write(bus, 0, 0x4, 0x4001);
 +              pfe_eth_mdio_write(bus, 0, 0x12, 0xa120);
 +              pfe_eth_mdio_write(bus, 0, 0x13, 0x7);
++              /* Autonegotiation need to be disabled for 2.5G SGMII mode*/
++              value = 0x0140;
++              pfe_eth_mdio_write(bus, 0, 0x0, value);
 +      } else {
 +              pfe_eth_mdio_write(bus, 0, 0x14, 0xb);
 +              pfe_eth_mdio_write(bus, 0, 0x4, 0x1a1);
 +              pfe_eth_mdio_write(bus, 0, 0x12, 0x400);
 +              pfe_eth_mdio_write(bus, 0, 0x13, 0x0);
++              pfe_eth_mdio_write(bus, 0, 0x0, 0x1140);
 +      }
-+
-+      pfe_eth_mdio_write(bus, 0, 0x0, 0x1140);
 +}
 +
 +/*
@@ -3357,7 +3388,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      netif_info(priv, drv, ndev, "%s: %s\n", __func__, phy_id);
 +      interface = priv->einfo->mii_config;
 +      if ((interface == PHY_INTERFACE_MODE_SGMII) ||
-+          (interface == PHY_INTERFACE_MODE_SGMII_2500)) {
++          (interface == PHY_INTERFACE_MODE_2500SGMII)) {
 +              /*Configure SGMII PCS */
 +              if (pfe->scfg) {
 +                      /*Config MDIO from serdes */
@@ -3725,10 +3756,17 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                               unsigned int n_segs)
 +{
 +      ktime_t kt;
++      int tried = 0;
 +
++try_again:
 +      if (unlikely((__hif_tx_avail(&pfe->hif) < n_desc) ||
-+                   (hif_lib_tx_avail(&priv->client, queuenum) < n_desc) ||
++      (hif_lib_tx_avail(&priv->client, queuenum) < n_desc) ||
 +      (hif_lib_tx_credit_avail(pfe, priv->id, queuenum) < n_segs))) {
++              if (!tried) {
++                      __hif_lib_update_credit(&priv->client, queuenum);
++                      tried = 1;
++                      goto try_again;
++              }
 +#ifdef PFE_ETH_TX_STATS
 +              if (__hif_tx_avail(&pfe->hif) < n_desc) {
 +                      priv->stop_queue_hif[queuenum]++;
@@ -3851,8 +3889,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +      netif_info(priv, tx_done, priv->ndev, "%s\n", __func__);
 +
-+      for (ii = 0; ii < emac_txq_cnt; ii++)
++      for (ii = 0; ii < emac_txq_cnt; ii++) {
 +              pfe_eth_flush_txQ(priv, ii, 0, 0);
++              __hif_lib_update_credit(&priv->client, ii);
++      }
 +}
 +
 +void pfe_tx_get_req_desc(struct sk_buff *skb, unsigned int *n_desc, unsigned int
@@ -7943,7 +7983,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif /* _PFE_HIF_H_ */
 --- /dev/null
 +++ b/drivers/staging/fsl_ppfe/pfe_hif_lib.c
-@@ -0,0 +1,601 @@
+@@ -0,0 +1,637 @@
 +/*
 + * Copyright 2015-2016 Freescale Semiconductor, Inc.
 + * Copyright 2017 NXP
@@ -7980,7 +8020,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +unsigned int lro_mode;
 +unsigned int page_mode;
-+unsigned int tx_qos;
++unsigned int tx_qos = 1;
++module_param(tx_qos, uint, 0444);
++MODULE_PARM_DESC(tx_qos, "0: disable ,\n"
++                       "1: enable (default), guarantee no packet drop at TMU level\n");
 +unsigned int pfe_pkt_size;
 +unsigned int pfe_pkt_headroom;
 +unsigned int emac_txq_cnt;
@@ -8511,6 +8554,39 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              }
 +}
 +
++/* __hif_lib_update_credit
++ *
++ * @param[in] client  hif client context
++ * @param[in] queue   queue number in match with TMU
++ */
++void __hif_lib_update_credit(struct hif_client_s *client, unsigned int queue)
++{
++      unsigned int tmu_tx_packets, tmp;
++
++      if (tx_qos) {
++              tmu_tx_packets = be32_to_cpu(pe_dmem_read(TMU0_ID +
++                      client->id, (TMU_DM_TX_TRANS + (queue * 4)), 4));
++
++              /* tx_packets counter overflowed */
++              if (tmu_tx_packets >
++                  pfe->tmu_credit.tx_packets[client->id][queue]) {
++                      tmp = UINT_MAX - tmu_tx_packets +
++                      pfe->tmu_credit.tx_packets[client->id][queue];
++
++                      pfe->tmu_credit.tx_credit[client->id][queue] =
++                      pfe->tmu_credit.tx_credit_max[client->id][queue] - tmp;
++              } else {
++              /* TMU tx <= pfe_eth tx, normal case or both OF since
++               * last time
++               */
++                      pfe->tmu_credit.tx_credit[client->id][queue] =
++                      pfe->tmu_credit.tx_credit_max[client->id][queue] -
++                      (pfe->tmu_credit.tx_packets[client->id][queue] -
++                      tmu_tx_packets);
++              }
++      }
++}
++
 +int pfe_hif_lib_init(struct pfe *pfe)
 +{
 +      int rc;
@@ -8547,7 +8623,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +}
 --- /dev/null
 +++ b/drivers/staging/fsl_ppfe/pfe_hif_lib.h
-@@ -0,0 +1,239 @@
+@@ -0,0 +1,240 @@
 +/*
 + * Copyright 2015-2016 Freescale Semiconductor, Inc.
 + * Copyright 2017 NXP
@@ -8735,6 +8811,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +void *hif_lib_receive_pkt(struct hif_client_s *client, int qno, int *len, int
 +                              *ofst, unsigned int *rx_ctrl,
 +                              unsigned int *desc_ctrl, void **priv_data);
++void __hif_lib_update_credit(struct hif_client_s *client, unsigned int queue);
 +void hif_lib_set_rx_cpu_affinity(struct hif_client_s *client, int cpu_id);
 +void hif_lib_set_tx_queue_nocpy(struct hif_client_s *client, int qno, int
 +                                      enable);
index 0c1cd1b..e9d34d3 100644 (file)
@@ -1,9 +1,9 @@
-From 505eb62bdb7a4cc25b13491dd5c68d0741c5d6da Mon Sep 17 00:00:00 2001
+From 4c3979602db05bca439bfc98db88dc14a8663db0 Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 25 Sep 2017 12:21:13 +0800
-Subject: [PATCH] ata: support layerscape
+Date: Wed, 17 Jan 2018 15:14:57 +0800
+Subject: [PATCH 13/30] ata: support layerscape
 
-This is a integrated patch for layerscape sata support.
+This is an integrated patch for layerscape sata support.
 
 Signed-off-by: Tang Yuantian <Yuantian.Tang@nxp.com>
 Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
index 2f7d6f8..0d05dc7 100644 (file)
@@ -1,17 +1,17 @@
-From bd3df6d053a28d5aa630524c9087c21def30e764 Mon Sep 17 00:00:00 2001
+From 82a391a067491f4c46b75d0dfe2bf9e5a11aca8e Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 25 Sep 2017 12:09:35 +0800
-Subject: [PATCH] clk: support layerscape
+Date: Wed, 17 Jan 2018 15:15:44 +0800
+Subject: [PATCH 14/30] clk: support layerscape
 
-This is a integrated patch for layerscape clock support.
+This is an integrated patch for layerscape clock support.
 
 Signed-off-by: Yuantian Tang <andy.tang@nxp.com>
 Signed-off-by: Mingkai Hu <mingkai.hu@nxp.com>
 Signed-off-by: Scott Wood <oss@buserror.net>
 Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 ---
- drivers/clk/clk-qoriq.c | 170 ++++++++++++++++++++++++++++++++++++++++++++----
- 1 file changed, 156 insertions(+), 14 deletions(-)
+ drivers/clk/clk-qoriq.c | 179 ++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 164 insertions(+), 15 deletions(-)
 
 --- a/drivers/clk/clk-qoriq.c
 +++ b/drivers/clk/clk-qoriq.c
@@ -23,6 +23,15 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  #include <linux/fsl/guts.h>
  #include <linux/io.h>
  #include <linux/kernel.h>
+@@ -40,7 +41,7 @@ struct clockgen_pll_div {
+ };
+ struct clockgen_pll {
+-      struct clockgen_pll_div div[4];
++      struct clockgen_pll_div div[8];
+ };
+ #define CLKSEL_VALID  1
 @@ -87,7 +88,7 @@ struct clockgen {
        struct device_node *node;
        void __iomem *regs;
@@ -244,11 +253,18 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        if (cg->info.flags & CG_VER3) {
                switch (idx) {
                case PLATFORM_PLL:
-@@ -1000,12 +1125,13 @@ static void __init create_one_pll(struct
+@@ -1000,12 +1125,20 @@ static void __init create_one_pll(struct
  
        for (i = 0; i < ARRAY_SIZE(pll->div); i++) {
                struct clk *clk;
 +              int ret;
++
++              /*
++               * For platform PLL, there are 8 divider clocks.
++               * For core PLL, there are 4 divider clocks at most.
++               */
++              if (idx != 0 && i >= 4)
++                      break;
  
                snprintf(pll->div[i].name, sizeof(pll->div[i].name),
                         "cg-pll%d-div%d", idx, i + 1);
@@ -259,7 +275,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                if (IS_ERR(clk)) {
                        pr_err("%s: %s: register failed %ld\n",
                               __func__, pll->div[i].name, PTR_ERR(clk));
-@@ -1013,6 +1139,11 @@ static void __init create_one_pll(struct
+@@ -1013,6 +1146,11 @@ static void __init create_one_pll(struct
                }
  
                pll->div[i].clk = clk;
@@ -271,7 +287,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        }
  }
  
-@@ -1142,6 +1273,13 @@ static struct clk *clockgen_clk_get(stru
+@@ -1142,6 +1280,13 @@ static struct clk *clockgen_clk_get(stru
                        goto bad_args;
                clk = pll->div[idx].clk;
                break;
@@ -285,7 +301,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        default:
                goto bad_args;
        }
-@@ -1253,6 +1391,7 @@ static void __init clockgen_init(struct
+@@ -1253,6 +1398,7 @@ static void __init clockgen_init(struct
                clockgen.info.flags |= CG_CMUX_GE_PLAT;
  
        clockgen.sysclk = create_sysclk("cg-sysclk");
@@ -293,7 +309,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        create_plls(&clockgen);
        create_muxes(&clockgen);
  
-@@ -1273,8 +1412,11 @@ err:
+@@ -1273,8 +1419,11 @@ err:
  
  CLK_OF_DECLARE(qoriq_clockgen_1, "fsl,qoriq-clockgen-1.0", clockgen_init);
  CLK_OF_DECLARE(qoriq_clockgen_2, "fsl,qoriq-clockgen-2.0", clockgen_init);
index 2bc0f24..2da45b6 100644 (file)
@@ -1,9 +1,9 @@
-From a9ebdf9fa18fd317a4e97f46e8c5263898094864 Mon Sep 17 00:00:00 2001
+From b018e44a68dc2f4df819ae194e39e07313841dad Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Mon, 25 Sep 2017 12:20:10 +0800
-Subject: [PATCH] cpufreq: support layerscape
+Date: Wed, 17 Jan 2018 15:27:58 +0800
+Subject: [PATCH 15/30] cpufreq: support layerscape
 
-This is a integrated patch for layerscape pm support.
+This is an integrated patch for layerscape pm support.
 
 Signed-off-by: Tang Yuantian <Yuantian.Tang@nxp.com>
 Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
@@ -11,7 +11,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  drivers/cpufreq/Kconfig         |   2 +-
  drivers/cpufreq/qoriq-cpufreq.c | 176 +++++++++++++++-------------------------
  drivers/firmware/psci.c         |  12 ++-
- 3 files changed, 77 insertions(+), 113 deletions(-)
+ drivers/soc/fsl/rcpm.c          | 158 ++++++++++++++++++++++++++++++++++++
+ 4 files changed, 235 insertions(+), 113 deletions(-)
+ create mode 100644 drivers/soc/fsl/rcpm.c
 
 --- a/drivers/cpufreq/Kconfig
 +++ b/drivers/cpufreq/Kconfig
@@ -359,3 +361,164 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  }
  
  /*
+--- /dev/null
++++ b/drivers/soc/fsl/rcpm.c
+@@ -0,0 +1,158 @@
++/*
++ * Run Control and Power Management (RCPM) driver
++ *
++ * Copyright 2016 NXP
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ */
++#define pr_fmt(fmt) "RCPM: %s: " fmt, __func__
++
++#include <linux/kernel.h>
++#include <linux/io.h>
++#include <linux/of_platform.h>
++#include <linux/of_address.h>
++#include <linux/suspend.h>
++
++/* RCPM register offset */
++#define RCPM_IPPDEXPCR0                       0x140
++
++#define RCPM_WAKEUP_CELL_SIZE 2
++
++struct rcpm_config {
++      int ipp_num;
++      int ippdexpcr_offset;
++      u32 ippdexpcr[2];
++      void *rcpm_reg_base;
++};
++
++static struct rcpm_config *rcpm;
++
++static inline void rcpm_reg_write(u32 offset, u32 value)
++{
++      iowrite32be(value, rcpm->rcpm_reg_base + offset);
++}
++
++static inline u32 rcpm_reg_read(u32 offset)
++{
++      return ioread32be(rcpm->rcpm_reg_base + offset);
++}
++
++static void rcpm_wakeup_fixup(struct device *dev, void *data)
++{
++      struct device_node *node = dev ? dev->of_node : NULL;
++      u32 value[RCPM_WAKEUP_CELL_SIZE];
++      int ret, i;
++
++      if (!dev || !node || !device_may_wakeup(dev))
++              return;
++
++      /*
++       * Get the values in the "rcpm-wakeup" property.
++       * Three values are:
++       * The first is a pointer to the RCPM node.
++       * The second is the value of the ippdexpcr0 register.
++       * The third is the value of the ippdexpcr1 register.
++       */
++      ret = of_property_read_u32_array(node, "fsl,rcpm-wakeup",
++                                       value, RCPM_WAKEUP_CELL_SIZE);
++      if (ret)
++              return;
++
++      pr_debug("wakeup source: the device %s\n", node->full_name);
++
++      for (i = 0; i < rcpm->ipp_num; i++)
++              rcpm->ippdexpcr[i] |= value[i + 1];
++}
++
++static int rcpm_suspend_prepare(void)
++{
++      int i;
++      u32 val;
++
++      BUG_ON(!rcpm);
++
++      for (i = 0; i < rcpm->ipp_num; i++)
++              rcpm->ippdexpcr[i] = 0;
++
++      dpm_for_each_dev(NULL, rcpm_wakeup_fixup);
++
++      for (i = 0; i < rcpm->ipp_num; i++) {
++              if (rcpm->ippdexpcr[i]) {
++                      val = rcpm_reg_read(rcpm->ippdexpcr_offset + 4 * i);
++                      rcpm_reg_write(rcpm->ippdexpcr_offset + 4 * i,
++                                             val | rcpm->ippdexpcr[i]);
++                      pr_debug("ippdexpcr%d = 0x%x\n", i, rcpm->ippdexpcr[i]);
++              }
++      }
++
++      return 0;
++}
++
++static int rcpm_suspend_notifier_call(struct notifier_block *bl,
++                                    unsigned long state,
++                                    void *unused)
++{
++      switch (state) {
++      case PM_SUSPEND_PREPARE:
++              rcpm_suspend_prepare();
++              break;
++      }
++
++      return NOTIFY_DONE;
++}
++
++static struct rcpm_config rcpm_default_config = {
++      .ipp_num = 1,
++      .ippdexpcr_offset = RCPM_IPPDEXPCR0,
++};
++
++static const struct of_device_id rcpm_matches[] = {
++      {
++              .compatible = "fsl,qoriq-rcpm-2.1",
++              .data = &rcpm_default_config,
++      },
++      {}
++};
++
++static struct notifier_block rcpm_suspend_notifier = {
++      .notifier_call = rcpm_suspend_notifier_call,
++};
++
++static int __init layerscape_rcpm_init(void)
++{
++      const struct of_device_id *match;
++      struct device_node *np;
++
++      np = of_find_matching_node_and_match(NULL, rcpm_matches, &match);
++      if (!np) {
++              pr_err("Can't find the RCPM node.\n");
++              return -EINVAL;
++      }
++
++      if (match->data)
++              rcpm = (struct rcpm_config *)match->data;
++      else
++              return -EINVAL;
++
++      rcpm->rcpm_reg_base = of_iomap(np, 0);
++      of_node_put(np);
++      if (!rcpm->rcpm_reg_base)
++              return -ENOMEM;
++
++      register_pm_notifier(&rcpm_suspend_notifier);
++
++      pr_info("The RCPM driver initialized.\n");
++
++      return 0;
++}
++
++subsys_initcall(layerscape_rcpm_init);
index 6deb5f9..c456eb8 100644 (file)
@@ -1,12 +1,12 @@
-From 9c9579d76ccd6e738ab98c9b4c73c168912cdb8a Mon Sep 17 00:00:00 2001
+From a3310d64d7cb1ba0f9279e77d21f13a75fa66ab5 Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Wed, 27 Sep 2017 15:02:01 +0800
-Subject: [PATCH] crypto: support layerscape
+Date: Wed, 17 Jan 2018 15:29:23 +0800
+Subject: [PATCH 16/30] crypto: support layerscape
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
 
-This is a integrated patch for layerscape sec support.
+This is an integrated patch for layerscape sec support.
 
 Signed-off-by: Radu Alexe <radu.alexe@nxp.com>
 Signed-off-by: Fabio Estevam <festevam@gmail.com>
@@ -36,39 +36,41 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  crypto/crypto_user.c                              |   19 +
  crypto/scompress.c                                |  356 ++
  crypto/tcrypt.c                                   |   17 +-
- crypto/testmgr.c                                  | 1701 ++++----
- crypto/testmgr.h                                  | 1125 +++---
+ crypto/testmgr.c                                  | 1708 +++---
+ crypto/testmgr.h                                  | 1125 ++--
  crypto/tls.c                                      |  607 +++
- drivers/crypto/caam/Kconfig                       |   72 +-
- drivers/crypto/caam/Makefile                      |   15 +-
- drivers/crypto/caam/caamalg.c                     | 2125 +++-------
- drivers/crypto/caam/caamalg_desc.c                | 1913 +++++++++
+ drivers/crypto/caam/Kconfig                       |   77 +-
+ drivers/crypto/caam/Makefile                      |   16 +-
+ drivers/crypto/caam/caamalg.c                     | 2171 ++------
+ drivers/crypto/caam/caamalg_desc.c                | 1961 +++++++
  drivers/crypto/caam/caamalg_desc.h                |  127 +
- drivers/crypto/caam/caamalg_qi.c                  | 2877 +++++++++++++
- drivers/crypto/caam/caamalg_qi2.c                 | 4428 +++++++++++++++++++++
- drivers/crypto/caam/caamalg_qi2.h                 |  265 ++
- drivers/crypto/caam/caamhash.c                    |  521 +--
- drivers/crypto/caam/caampkc.c                     |  471 ++-
+ drivers/crypto/caam/caamalg_qi.c                  | 2929 ++++++++++
+ drivers/crypto/caam/caamalg_qi2.c                 | 5920 +++++++++++++++++++++
+ drivers/crypto/caam/caamalg_qi2.h                 |  281 +
+ drivers/crypto/caam/caamhash.c                    |  550 +-
+ drivers/crypto/caam/caamhash_desc.c               |  108 +
+ drivers/crypto/caam/caamhash_desc.h               |   49 +
+ drivers/crypto/caam/caampkc.c                     |  471 +-
  drivers/crypto/caam/caampkc.h                     |   58 +
  drivers/crypto/caam/caamrng.c                     |   16 +-
  drivers/crypto/caam/compat.h                      |    1 +
- drivers/crypto/caam/ctrl.c                        |  356 +-
+ drivers/crypto/caam/ctrl.c                        |  358 +-
  drivers/crypto/caam/ctrl.h                        |    2 +
- drivers/crypto/caam/desc.h                        |   55 +-
- drivers/crypto/caam/desc_constr.h                 |  139 +-
- drivers/crypto/caam/dpseci.c                      |  859 ++++
+ drivers/crypto/caam/desc.h                        |   84 +-
+ drivers/crypto/caam/desc_constr.h                 |  180 +-
+ drivers/crypto/caam/dpseci.c                      |  859 +++
  drivers/crypto/caam/dpseci.h                      |  395 ++
- drivers/crypto/caam/dpseci_cmd.h                  |  261 ++
+ drivers/crypto/caam/dpseci_cmd.h                  |  261 +
  drivers/crypto/caam/error.c                       |  127 +-
  drivers/crypto/caam/error.h                       |   10 +-
  drivers/crypto/caam/intern.h                      |   31 +-
- drivers/crypto/caam/jr.c                          |   97 +-
+ drivers/crypto/caam/jr.c                          |   72 +-
  drivers/crypto/caam/jr.h                          |    2 +
  drivers/crypto/caam/key_gen.c                     |   32 +-
  drivers/crypto/caam/key_gen.h                     |   36 +-
  drivers/crypto/caam/pdb.h                         |   62 +
  drivers/crypto/caam/pkc_desc.c                    |   36 +
- drivers/crypto/caam/qi.c                          |  797 ++++
+ drivers/crypto/caam/qi.c                          |  797 +++
  drivers/crypto/caam/qi.h                          |  204 +
  drivers/crypto/caam/regs.h                        |   63 +-
  drivers/crypto/caam/sg_sw_qm.h                    |  126 +
@@ -77,14 +79,14 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  drivers/net/wireless/rsi/rsi_91x_usb.c            |    2 +-
  drivers/staging/wilc1000/linux_wlan.c             |    2 +-
  drivers/staging/wilc1000/wilc_wfi_cfgoperations.c |    2 +-
- include/crypto/acompress.h                        |  269 ++
+ include/crypto/acompress.h                        |  269 +
  include/crypto/internal/acompress.h               |   81 +
  include/crypto/internal/scompress.h               |  136 +
  include/linux/crypto.h                            |    3 +
  include/uapi/linux/cryptouser.h                   |    5 +
  scripts/spelling.txt                              |    3 +
  sound/soc/amd/acp-pcm-dma.c                       |    2 +-
- 55 files changed, 17310 insertions(+), 3955 deletions(-)
+ 57 files changed, 19177 insertions(+), 3988 deletions(-)
  create mode 100644 crypto/acompress.c
  create mode 100644 crypto/scompress.c
  create mode 100644 crypto/tls.c
@@ -93,6 +95,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  create mode 100644 drivers/crypto/caam/caamalg_qi.c
  create mode 100644 drivers/crypto/caam/caamalg_qi2.c
  create mode 100644 drivers/crypto/caam/caamalg_qi2.h
+ create mode 100644 drivers/crypto/caam/caamhash_desc.c
+ create mode 100644 drivers/crypto/caam/caamhash_desc.h
  create mode 100644 drivers/crypto/caam/dpseci.c
  create mode 100644 drivers/crypto/caam/dpseci.h
  create mode 100644 drivers/crypto/caam/dpseci_cmd.h
@@ -1257,7 +1261,31 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                           const bool diff_dst, const int align_offset)
  {
        const char *algo =
-@@ -1330,7 +1571,8 @@ out_nobuf:
+@@ -1079,12 +1320,16 @@ static int __test_skcipher(struct crypto
+       const char *e, *d;
+       struct tcrypt_result result;
+       void *data;
+-      char iv[MAX_IVLEN];
++      char *iv;
+       char *xbuf[XBUFSIZE];
+       char *xoutbuf[XBUFSIZE];
+       int ret = -ENOMEM;
+       unsigned int ivsize = crypto_skcipher_ivsize(tfm);
++      iv = kmalloc(MAX_IVLEN, GFP_KERNEL);
++      if (!iv)
++              return ret;
++
+       if (testmgr_alloc_buf(xbuf))
+               goto out_nobuf;
+@@ -1325,12 +1570,14 @@ out:
+               testmgr_free_buf(xoutbuf);
+ out_nooutbuf:
+       testmgr_free_buf(xbuf);
++      kfree(iv);
+ out_nobuf:
+       return ret;
  }
  
  static int test_skcipher(struct crypto_skcipher *tfm, int enc,
@@ -1267,7 +1295,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  {
        unsigned int alignmask;
        int ret;
-@@ -1362,8 +1604,10 @@ static int test_skcipher(struct crypto_s
+@@ -1362,8 +1609,10 @@ static int test_skcipher(struct crypto_s
        return 0;
  }
  
@@ -1280,7 +1308,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  {
        const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
        unsigned int i;
-@@ -1442,7 +1686,154 @@ out:
+@@ -1442,7 +1691,154 @@ out:
        return ret;
  }
  
@@ -1436,7 +1464,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                      unsigned int tcount)
  {
        const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
-@@ -1509,7 +1900,7 @@ static int alg_test_aead(const struct al
+@@ -1509,7 +1905,7 @@ static int alg_test_aead(const struct al
        struct crypto_aead *tfm;
        int err = 0;
  
@@ -1445,7 +1473,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        if (IS_ERR(tfm)) {
                printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
                       "%ld\n", driver, PTR_ERR(tfm));
-@@ -1538,7 +1929,7 @@ static int alg_test_cipher(const struct
+@@ -1538,7 +1934,7 @@ static int alg_test_cipher(const struct
        struct crypto_cipher *tfm;
        int err = 0;
  
@@ -1454,7 +1482,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        if (IS_ERR(tfm)) {
                printk(KERN_ERR "alg: cipher: Failed to load transform for "
                       "%s: %ld\n", driver, PTR_ERR(tfm));
-@@ -1567,7 +1958,7 @@ static int alg_test_skcipher(const struc
+@@ -1567,7 +1963,7 @@ static int alg_test_skcipher(const struc
        struct crypto_skcipher *tfm;
        int err = 0;
  
@@ -1463,7 +1491,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        if (IS_ERR(tfm)) {
                printk(KERN_ERR "alg: skcipher: Failed to load transform for "
                       "%s: %ld\n", driver, PTR_ERR(tfm));
-@@ -1593,22 +1984,38 @@ out:
+@@ -1593,22 +1989,38 @@ out:
  static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
                         u32 type, u32 mask)
  {
@@ -1514,7 +1542,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        return err;
  }
  
-@@ -1618,7 +2025,7 @@ static int alg_test_hash(const struct al
+@@ -1618,7 +2030,7 @@ static int alg_test_hash(const struct al
        struct crypto_ahash *tfm;
        int err;
  
@@ -1523,7 +1551,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        if (IS_ERR(tfm)) {
                printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
                       "%ld\n", driver, PTR_ERR(tfm));
-@@ -1646,7 +2053,7 @@ static int alg_test_crc32c(const struct
+@@ -1646,7 +2058,7 @@ static int alg_test_crc32c(const struct
        if (err)
                goto out;
  
@@ -1532,7 +1560,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        if (IS_ERR(tfm)) {
                printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
                       "%ld\n", driver, PTR_ERR(tfm));
-@@ -1688,7 +2095,7 @@ static int alg_test_cprng(const struct a
+@@ -1688,7 +2100,7 @@ static int alg_test_cprng(const struct a
        struct crypto_rng *rng;
        int err;
  
@@ -1541,7 +1569,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        if (IS_ERR(rng)) {
                printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
                       "%ld\n", driver, PTR_ERR(rng));
-@@ -1703,7 +2110,7 @@ static int alg_test_cprng(const struct a
+@@ -1703,7 +2115,7 @@ static int alg_test_cprng(const struct a
  }
  
  
@@ -1550,7 +1578,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                          const char *driver, u32 type, u32 mask)
  {
        int ret = -EAGAIN;
-@@ -1715,7 +2122,7 @@ static int drbg_cavs_test(struct drbg_te
+@@ -1715,7 +2127,7 @@ static int drbg_cavs_test(struct drbg_te
        if (!buf)
                return -ENOMEM;
  
@@ -1559,7 +1587,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        if (IS_ERR(drng)) {
                printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
                       "%s\n", driver);
-@@ -1777,7 +2184,7 @@ static int alg_test_drbg(const struct al
+@@ -1777,7 +2189,7 @@ static int alg_test_drbg(const struct al
        int err = 0;
        int pr = 0;
        int i = 0;
@@ -1568,7 +1596,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        unsigned int tcount = desc->suite.drbg.count;
  
        if (0 == memcmp(driver, "drbg_pr_", 8))
-@@ -1796,7 +2203,7 @@ static int alg_test_drbg(const struct al
+@@ -1796,7 +2208,7 @@ static int alg_test_drbg(const struct al
  
  }
  
@@ -1577,7 +1605,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                       const char *alg)
  {
        struct kpp_request *req;
-@@ -1888,7 +2295,7 @@ free_req:
+@@ -1888,7 +2300,7 @@ free_req:
  }
  
  static int test_kpp(struct crypto_kpp *tfm, const char *alg,
@@ -1586,7 +1614,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  {
        int ret, i;
  
-@@ -1909,7 +2316,7 @@ static int alg_test_kpp(const struct alg
+@@ -1909,7 +2321,7 @@ static int alg_test_kpp(const struct alg
        struct crypto_kpp *tfm;
        int err = 0;
  
@@ -1595,7 +1623,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        if (IS_ERR(tfm)) {
                pr_err("alg: kpp: Failed to load tfm for %s: %ld\n",
                       driver, PTR_ERR(tfm));
-@@ -1924,7 +2331,7 @@ static int alg_test_kpp(const struct alg
+@@ -1924,7 +2336,7 @@ static int alg_test_kpp(const struct alg
  }
  
  static int test_akcipher_one(struct crypto_akcipher *tfm,
@@ -1604,7 +1632,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  {
        char *xbuf[XBUFSIZE];
        struct akcipher_request *req;
-@@ -2044,7 +2451,8 @@ free_xbuf:
+@@ -2044,7 +2456,8 @@ free_xbuf:
  }
  
  static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
@@ -1614,7 +1642,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  {
        const char *algo =
                crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm));
-@@ -2068,7 +2476,7 @@ static int alg_test_akcipher(const struc
+@@ -2068,7 +2481,7 @@ static int alg_test_akcipher(const struc
        struct crypto_akcipher *tfm;
        int err = 0;
  
@@ -1623,7 +1651,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        if (IS_ERR(tfm)) {
                pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
                       driver, PTR_ERR(tfm));
-@@ -2088,112 +2496,23 @@ static int alg_test_null(const struct al
+@@ -2088,112 +2501,23 @@ static int alg_test_null(const struct al
        return 0;
  }
  
@@ -1741,7 +1769,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2201,12 +2520,7 @@ static const struct alg_test_desc alg_te
+@@ -2201,12 +2525,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_aead,
                .suite = {
                        .aead = {
@@ -1755,7 +1783,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2214,12 +2528,7 @@ static const struct alg_test_desc alg_te
+@@ -2214,12 +2533,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_aead,
                .suite = {
                        .aead = {
@@ -1769,7 +1797,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2228,12 +2537,7 @@ static const struct alg_test_desc alg_te
+@@ -2228,12 +2542,7 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .aead = {
@@ -1783,7 +1811,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2245,18 +2549,8 @@ static const struct alg_test_desc alg_te
+@@ -2245,18 +2554,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_aead,
                .suite = {
                        .aead = {
@@ -1804,7 +1832,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2268,12 +2562,7 @@ static const struct alg_test_desc alg_te
+@@ -2268,12 +2567,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_aead,
                .suite = {
                        .aead = {
@@ -1818,7 +1846,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2282,12 +2571,7 @@ static const struct alg_test_desc alg_te
+@@ -2282,12 +2576,7 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .aead = {
@@ -1832,7 +1860,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2296,12 +2580,7 @@ static const struct alg_test_desc alg_te
+@@ -2296,12 +2585,7 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .aead = {
@@ -1846,7 +1874,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2309,12 +2588,7 @@ static const struct alg_test_desc alg_te
+@@ -2309,12 +2593,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_aead,
                .suite = {
                        .aead = {
@@ -1860,7 +1888,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2323,12 +2597,7 @@ static const struct alg_test_desc alg_te
+@@ -2323,12 +2602,7 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .aead = {
@@ -1874,7 +1902,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2344,12 +2613,7 @@ static const struct alg_test_desc alg_te
+@@ -2344,12 +2618,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_aead,
                .suite = {
                        .aead = {
@@ -1888,7 +1916,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2358,12 +2622,7 @@ static const struct alg_test_desc alg_te
+@@ -2358,12 +2627,7 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .aead = {
@@ -1902,7 +1930,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2380,12 +2639,7 @@ static const struct alg_test_desc alg_te
+@@ -2380,12 +2644,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_aead,
                .suite = {
                        .aead = {
@@ -1916,7 +1944,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2393,12 +2647,7 @@ static const struct alg_test_desc alg_te
+@@ -2393,12 +2652,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_aead,
                .suite = {
                        .aead = {
@@ -1930,7 +1958,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2407,12 +2656,7 @@ static const struct alg_test_desc alg_te
+@@ -2407,12 +2661,7 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .aead = {
@@ -1944,7 +1972,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2429,14 +2673,8 @@ static const struct alg_test_desc alg_te
+@@ -2429,14 +2678,8 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .cipher = {
@@ -1961,7 +1989,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2444,14 +2682,8 @@ static const struct alg_test_desc alg_te
+@@ -2444,14 +2687,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -1978,7 +2006,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2459,14 +2691,8 @@ static const struct alg_test_desc alg_te
+@@ -2459,14 +2696,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -1995,7 +2023,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2474,14 +2700,8 @@ static const struct alg_test_desc alg_te
+@@ -2474,14 +2705,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2012,7 +2040,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2489,14 +2709,8 @@ static const struct alg_test_desc alg_te
+@@ -2489,14 +2714,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2029,7 +2057,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2504,14 +2718,8 @@ static const struct alg_test_desc alg_te
+@@ -2504,14 +2723,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2046,7 +2074,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2519,14 +2727,8 @@ static const struct alg_test_desc alg_te
+@@ -2519,14 +2732,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2063,7 +2091,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2535,14 +2737,8 @@ static const struct alg_test_desc alg_te
+@@ -2535,14 +2742,8 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .cipher = {
@@ -2080,7 +2108,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2550,14 +2746,8 @@ static const struct alg_test_desc alg_te
+@@ -2550,14 +2751,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2097,7 +2125,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2565,30 +2755,25 @@ static const struct alg_test_desc alg_te
+@@ -2565,30 +2760,25 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2139,7 +2167,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2596,14 +2781,8 @@ static const struct alg_test_desc alg_te
+@@ -2596,14 +2786,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2156,7 +2184,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2611,20 +2790,14 @@ static const struct alg_test_desc alg_te
+@@ -2611,20 +2795,14 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .test = alg_test_hash,
                .suite = {
@@ -2179,7 +2207,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                }
        }, {
                .alg = "compress_null",
-@@ -2633,94 +2806,30 @@ static const struct alg_test_desc alg_te
+@@ -2633,94 +2811,30 @@ static const struct alg_test_desc alg_te
                .alg = "crc32",
                .test = alg_test_hash,
                .suite = {
@@ -2279,7 +2307,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2728,14 +2837,8 @@ static const struct alg_test_desc alg_te
+@@ -2728,14 +2842,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2296,7 +2324,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2743,14 +2846,8 @@ static const struct alg_test_desc alg_te
+@@ -2743,14 +2851,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2313,7 +2341,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2758,14 +2855,8 @@ static const struct alg_test_desc alg_te
+@@ -2758,14 +2860,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2330,7 +2358,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2773,14 +2864,8 @@ static const struct alg_test_desc alg_te
+@@ -2773,14 +2869,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2347,7 +2375,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2788,29 +2873,18 @@ static const struct alg_test_desc alg_te
+@@ -2788,29 +2878,18 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2382,7 +2410,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2818,14 +2892,8 @@ static const struct alg_test_desc alg_te
+@@ -2818,14 +2897,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2399,7 +2427,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2833,14 +2901,8 @@ static const struct alg_test_desc alg_te
+@@ -2833,14 +2906,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2416,7 +2444,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2848,14 +2910,8 @@ static const struct alg_test_desc alg_te
+@@ -2848,14 +2915,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2433,7 +2461,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2864,14 +2920,8 @@ static const struct alg_test_desc alg_te
+@@ -2864,14 +2925,8 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .comp = {
@@ -2450,7 +2478,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -2879,10 +2929,7 @@ static const struct alg_test_desc alg_te
+@@ -2879,10 +2934,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_kpp,
                .fips_allowed = 1,
                .suite = {
@@ -2462,7 +2490,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                }
        }, {
                .alg = "digest_null",
-@@ -2892,30 +2939,21 @@ static const struct alg_test_desc alg_te
+@@ -2892,30 +2944,21 @@ static const struct alg_test_desc alg_te
                .test = alg_test_drbg,
                .fips_allowed = 1,
                .suite = {
@@ -2496,7 +2524,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                }
        }, {
                /*
-@@ -2930,11 +2968,7 @@ static const struct alg_test_desc alg_te
+@@ -2930,11 +2973,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_drbg,
                .fips_allowed = 1,
                .suite = {
@@ -2509,7 +2537,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                }
        }, {
                /* covered by drbg_nopr_hmac_sha256 test */
-@@ -2954,10 +2988,7 @@ static const struct alg_test_desc alg_te
+@@ -2954,10 +2993,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_drbg,
                .fips_allowed = 1,
                .suite = {
@@ -2521,7 +2549,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                }
        }, {
                /* covered by drbg_nopr_sha256 test */
-@@ -2973,10 +3004,7 @@ static const struct alg_test_desc alg_te
+@@ -2973,10 +3009,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_drbg,
                .fips_allowed = 1,
                .suite = {
@@ -2533,7 +2561,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                }
        }, {
                /* covered by drbg_pr_ctr_aes128 test */
-@@ -2996,10 +3024,7 @@ static const struct alg_test_desc alg_te
+@@ -2996,10 +3029,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_drbg,
                .fips_allowed = 1,
                .suite = {
@@ -2545,7 +2573,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                }
        }, {
                /* covered by drbg_pr_hmac_sha256 test */
-@@ -3019,10 +3044,7 @@ static const struct alg_test_desc alg_te
+@@ -3019,10 +3049,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_drbg,
                .fips_allowed = 1,
                .suite = {
@@ -2557,7 +2585,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                }
        }, {
                /* covered by drbg_pr_sha256 test */
-@@ -3034,23 +3056,13 @@ static const struct alg_test_desc alg_te
+@@ -3034,23 +3061,13 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .test = alg_test_null,
        }, {
@@ -2583,7 +2611,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3058,14 +3070,8 @@ static const struct alg_test_desc alg_te
+@@ -3058,14 +3075,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2600,7 +2628,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3073,14 +3079,8 @@ static const struct alg_test_desc alg_te
+@@ -3073,14 +3084,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2617,7 +2645,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3088,14 +3088,8 @@ static const struct alg_test_desc alg_te
+@@ -3088,14 +3093,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2634,7 +2662,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3103,14 +3097,8 @@ static const struct alg_test_desc alg_te
+@@ -3103,14 +3102,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2651,7 +2679,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3118,14 +3106,8 @@ static const struct alg_test_desc alg_te
+@@ -3118,14 +3111,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2668,7 +2696,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3133,14 +3115,8 @@ static const struct alg_test_desc alg_te
+@@ -3133,14 +3120,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2685,7 +2713,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3151,14 +3127,8 @@ static const struct alg_test_desc alg_te
+@@ -3151,14 +3132,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2702,7 +2730,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3167,14 +3137,8 @@ static const struct alg_test_desc alg_te
+@@ -3167,14 +3142,8 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .cipher = {
@@ -2719,7 +2747,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3197,14 +3161,8 @@ static const struct alg_test_desc alg_te
+@@ -3197,14 +3166,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2736,7 +2764,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3212,14 +3170,8 @@ static const struct alg_test_desc alg_te
+@@ -3212,14 +3175,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2753,7 +2781,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3227,14 +3179,8 @@ static const struct alg_test_desc alg_te
+@@ -3227,14 +3184,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2770,7 +2798,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3242,14 +3188,8 @@ static const struct alg_test_desc alg_te
+@@ -3242,14 +3193,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2787,7 +2815,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3257,14 +3197,8 @@ static const struct alg_test_desc alg_te
+@@ -3257,14 +3202,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2804,7 +2832,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3272,14 +3206,8 @@ static const struct alg_test_desc alg_te
+@@ -3272,14 +3211,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2821,7 +2849,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3287,14 +3215,8 @@ static const struct alg_test_desc alg_te
+@@ -3287,14 +3220,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2838,7 +2866,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3302,14 +3224,8 @@ static const struct alg_test_desc alg_te
+@@ -3302,14 +3229,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -2855,7 +2883,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3317,10 +3233,7 @@ static const struct alg_test_desc alg_te
+@@ -3317,10 +3238,7 @@ static const struct alg_test_desc alg_te
                .test = alg_test_kpp,
                .fips_allowed = 1,
                .suite = {
@@ -2867,7 +2895,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                }
        }, {
                .alg = "gcm(aes)",
-@@ -3328,14 +3241,8 @@ static const struct alg_test_desc alg_te
+@@ -3328,14 +3246,8 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .aead = {
@@ -2884,7 +2912,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3343,136 +3250,94 @@ static const struct alg_test_desc alg_te
+@@ -3343,136 +3255,94 @@ static const struct alg_test_desc alg_te
                .test = alg_test_hash,
                .fips_allowed = 1,
                .suite = {
@@ -3035,7 +3063,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                }
        }, {
                .alg = "jitterentropy_rng",
-@@ -3484,14 +3349,8 @@ static const struct alg_test_desc alg_te
+@@ -3484,14 +3354,8 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .cipher = {
@@ -3052,7 +3080,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3499,14 +3358,8 @@ static const struct alg_test_desc alg_te
+@@ -3499,14 +3363,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -3069,7 +3097,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3514,14 +3367,8 @@ static const struct alg_test_desc alg_te
+@@ -3514,14 +3372,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -3086,7 +3114,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3529,14 +3376,8 @@ static const struct alg_test_desc alg_te
+@@ -3529,14 +3381,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -3103,7 +3131,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3544,14 +3385,8 @@ static const struct alg_test_desc alg_te
+@@ -3544,14 +3390,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -3120,7 +3148,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3559,14 +3394,8 @@ static const struct alg_test_desc alg_te
+@@ -3559,14 +3399,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -3137,7 +3165,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3575,14 +3404,8 @@ static const struct alg_test_desc alg_te
+@@ -3575,14 +3409,8 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .comp = {
@@ -3154,7 +3182,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3591,14 +3414,8 @@ static const struct alg_test_desc alg_te
+@@ -3591,14 +3419,8 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .comp = {
@@ -3171,7 +3199,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3607,42 +3424,27 @@ static const struct alg_test_desc alg_te
+@@ -3607,42 +3429,27 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .comp = {
@@ -3219,7 +3247,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                }
        }, {
                .alg = "ofb(aes)",
-@@ -3650,14 +3452,8 @@ static const struct alg_test_desc alg_te
+@@ -3650,14 +3457,8 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .cipher = {
@@ -3236,7 +3264,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3665,24 +3461,15 @@ static const struct alg_test_desc alg_te
+@@ -3665,24 +3466,15 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -3264,7 +3292,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                }
        }, {
                .alg = "rfc3686(ctr(aes))",
-@@ -3690,14 +3477,8 @@ static const struct alg_test_desc alg_te
+@@ -3690,14 +3482,8 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .cipher = {
@@ -3281,7 +3309,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3706,14 +3487,8 @@ static const struct alg_test_desc alg_te
+@@ -3706,14 +3492,8 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .aead = {
@@ -3298,7 +3326,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3722,14 +3497,8 @@ static const struct alg_test_desc alg_te
+@@ -3722,14 +3502,8 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .aead = {
@@ -3315,7 +3343,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3737,14 +3506,8 @@ static const struct alg_test_desc alg_te
+@@ -3737,14 +3511,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_aead,
                .suite = {
                        .aead = {
@@ -3332,7 +3360,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3752,14 +3515,8 @@ static const struct alg_test_desc alg_te
+@@ -3752,14 +3520,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_aead,
                .suite = {
                        .aead = {
@@ -3349,7 +3377,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3767,71 +3524,47 @@ static const struct alg_test_desc alg_te
+@@ -3767,71 +3529,47 @@ static const struct alg_test_desc alg_te
                .test = alg_test_aead,
                .suite = {
                        .aead = {
@@ -3429,7 +3457,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -3839,162 +3572,120 @@ static const struct alg_test_desc alg_te
+@@ -3839,162 +3577,120 @@ static const struct alg_test_desc alg_te
                .test = alg_test_hash,
                .fips_allowed = 1,
                .suite = {
@@ -3617,7 +3645,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                }
        }, {
                .alg = "xts(aes)",
-@@ -4002,14 +3693,8 @@ static const struct alg_test_desc alg_te
+@@ -4002,14 +3698,8 @@ static const struct alg_test_desc alg_te
                .fips_allowed = 1,
                .suite = {
                        .cipher = {
@@ -3634,7 +3662,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -4017,14 +3702,8 @@ static const struct alg_test_desc alg_te
+@@ -4017,14 +3707,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -3651,7 +3679,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -4032,14 +3711,8 @@ static const struct alg_test_desc alg_te
+@@ -4032,14 +3716,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -3668,7 +3696,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -4047,14 +3720,8 @@ static const struct alg_test_desc alg_te
+@@ -4047,14 +3725,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -3685,7 +3713,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        }
                }
        }, {
-@@ -4062,14 +3729,8 @@ static const struct alg_test_desc alg_te
+@@ -4062,14 +3734,8 @@ static const struct alg_test_desc alg_te
                .test = alg_test_skcipher,
                .suite = {
                        .cipher = {
@@ -6987,7 +7015,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        default y
        select CRYPTO_RNG
        select HW_RANDOM
-@@ -124,13 +149,26 @@ config CRYPTO_DEV_FSL_CAAM_RNG_API
+@@ -124,13 +149,31 @@ config CRYPTO_DEV_FSL_CAAM_RNG_API
          To compile this as a module, choose M here: the module
          will be called caamrng.
  
@@ -7011,6 +7039,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      select CRYPTO_BLKCIPHER
 +      select CRYPTO_AUTHENC
 +      select CRYPTO_AEAD
++      select CRYPTO_HASH
 +      ---help---
 +        CAAM driver for QorIQ Data Path Acceleration Architecture 2.
 +        It handles DPSECI DPAA2 objects that sit on the Management Complex
@@ -7023,9 +7052,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      def_tristate (CRYPTO_DEV_FSL_CAAM_CRYPTO_API || \
 +                    CRYPTO_DEV_FSL_CAAM_CRYPTO_API_QI || \
 +                    CRYPTO_DEV_FSL_DPAA2_CAAM)
++
++config CRYPTO_DEV_FSL_CAAM_AHASH_API_DESC
++      def_tristate (CRYPTO_DEV_FSL_CAAM_AHASH_API || \
++                    CRYPTO_DEV_FSL_DPAA2_CAAM)
 --- a/drivers/crypto/caam/Makefile
 +++ b/drivers/crypto/caam/Makefile
-@@ -5,13 +5,26 @@ ifeq ($(CONFIG_CRYPTO_DEV_FSL_CAAM_DEBUG
+@@ -5,13 +5,27 @@ ifeq ($(CONFIG_CRYPTO_DEV_FSL_CAAM_DEBUG
        ccflags-y := -DDEBUG
  endif
  
@@ -7038,6 +7071,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_QI) += caamalg_qi.o
 +obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_DESC) += caamalg_desc.o
  obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM_AHASH_API) += caamhash.o
++obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM_AHASH_API_DESC) += caamhash_desc.o
  obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM_RNG_API) += caamrng.o
  obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM_PKC_API) += caam_pkc.o
  
@@ -7166,7 +7200,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        bool rfc3686;
        bool geniv;
  };
-@@ -163,302 +96,67 @@ struct caam_aead_alg {
+@@ -163,302 +96,70 @@ struct caam_aead_alg {
        bool registered;
  };
  
@@ -7308,6 +7342,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        struct device *jrdev = ctx->jrdev;
 -      bool keys_fit_inline = false;
 -      u32 *key_jump_cmd, *jump_cmd, *read_move_cmd, *write_move_cmd;
++      struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
        u32 *desc;
 +      int rem_bytes = CAAM_DESC_BYTES_MAX - AEAD_DESC_JOB_IO_LEN -
 +                      ctx->adata.keylen_pad;
@@ -7394,7 +7429,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 -                     DUMP_PREFIX_ADDRESS, 16, 4, desc,
 -                     desc_bytes(desc), 1);
 -#endif
-+      cnstr_shdsc_aead_null_encap(desc, &ctx->adata, ctx->authsize);
++      cnstr_shdsc_aead_null_encap(desc, &ctx->adata, ctx->authsize,
++                                  ctrlpriv->era);
 +      dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
 +                                 desc_bytes(desc), DMA_TO_DEVICE);
  
@@ -7490,18 +7526,20 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 -                     desc_bytes(desc), 1);
 -#endif
 +      desc = ctx->sh_desc_dec;
-+      cnstr_shdsc_aead_null_decap(desc, &ctx->adata, ctx->authsize);
++      cnstr_shdsc_aead_null_decap(desc, &ctx->adata, ctx->authsize,
++                                  ctrlpriv->era);
 +      dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
 +                                 desc_bytes(desc), DMA_TO_DEVICE);
  
        return 0;
  }
-@@ -470,11 +168,11 @@ static int aead_set_sh_desc(struct crypt
+@@ -470,11 +171,12 @@ static int aead_set_sh_desc(struct crypt
        unsigned int ivsize = crypto_aead_ivsize(aead);
        struct caam_ctx *ctx = crypto_aead_ctx(aead);
        struct device *jrdev = ctx->jrdev;
 -      bool keys_fit_inline;
 -      u32 geniv, moveiv;
++      struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
        u32 ctx1_iv_off = 0;
 -      u32 *desc;
 -      const bool ctr_mode = ((ctx->class1_alg_type & OP_ALG_AAI_MASK) ==
@@ -7512,7 +7550,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                               OP_ALG_AAI_CTR_MOD128);
        const bool is_rfc3686 = alg->caam.rfc3686;
  
-@@ -482,7 +180,7 @@ static int aead_set_sh_desc(struct crypt
+@@ -482,7 +184,7 @@ static int aead_set_sh_desc(struct crypt
                return 0;
  
        /* NULL encryption / decryption */
@@ -7521,7 +7559,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                return aead_null_set_sh_desc(aead);
  
        /*
-@@ -497,8 +195,14 @@ static int aead_set_sh_desc(struct crypt
+@@ -497,8 +199,14 @@ static int aead_set_sh_desc(struct crypt
         * RFC3686 specific:
         *      CONTEXT1[255:128] = {NONCE, IV, COUNTER}
         */
@@ -7537,7 +7575,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
        if (alg->caam.geniv)
                goto skip_enc;
-@@ -507,146 +211,64 @@ static int aead_set_sh_desc(struct crypt
+@@ -507,146 +215,64 @@ static int aead_set_sh_desc(struct crypt
         * Job Descriptor and Shared Descriptors
         * must all fit into the 64-word Descriptor h/w Buffer
         */
@@ -7557,33 +7595,31 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 -      /* Class 2 operation */
 -      append_operation(desc, ctx->class2_alg_type |
 -                       OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT);
+-
+-      /* Read and write assoclen bytes */
+-      append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
+-      append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
 +      if (desc_inline_query(DESC_AEAD_ENC_LEN +
 +                            (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
 +                            AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask,
 +                            ARRAY_SIZE(data_len)) < 0)
 +              return -EINVAL;
  
--      /* Read and write assoclen bytes */
--      append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
--      append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
+-      /* Skip assoc data */
+-      append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
 +      if (inl_mask & 1)
 +              ctx->adata.key_virt = ctx->key;
 +      else
 +              ctx->adata.key_dma = ctx->key_dma;
  
--      /* Skip assoc data */
--      append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
+-      /* read assoc before reading payload */
+-      append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
+-                                    FIFOLDST_VLF);
 +      if (inl_mask & 2)
 +              ctx->cdata.key_virt = ctx->key + ctx->adata.keylen_pad;
 +      else
 +              ctx->cdata.key_dma = ctx->key_dma + ctx->adata.keylen_pad;
  
--      /* read assoc before reading payload */
--      append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
--                                    FIFOLDST_VLF);
-+      ctx->adata.key_inline = !!(inl_mask & 1);
-+      ctx->cdata.key_inline = !!(inl_mask & 2);
 -      /* Load Counter into CONTEXT1 reg */
 -      if (is_rfc3686)
 -              append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
@@ -7603,7 +7639,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 -      /* Write ICV */
 -      append_seq_store(desc, ctx->authsize, LDST_CLASS_2_CCB |
 -                       LDST_SRCDST_BYTE_CONTEXT);
--
++      ctx->adata.key_inline = !!(inl_mask & 1);
++      ctx->cdata.key_inline = !!(inl_mask & 2);
 -      ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc,
 -                                            desc_bytes(desc),
 -                                            DMA_TO_DEVICE);
@@ -7620,7 +7658,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      desc = ctx->sh_desc_enc;
 +      cnstr_shdsc_aead_encap(desc, &ctx->cdata, &ctx->adata, ivsize,
 +                             ctx->authsize, is_rfc3686, nonce, ctx1_iv_off,
-+                             false);
++                             false, ctrlpriv->era);
 +      dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
 +                                 desc_bytes(desc), DMA_TO_DEVICE);
  
@@ -7720,13 +7758,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      desc = ctx->sh_desc_dec;
 +      cnstr_shdsc_aead_decap(desc, &ctx->cdata, &ctx->adata, ivsize,
 +                             ctx->authsize, alg->caam.geniv, is_rfc3686,
-+                             nonce, ctx1_iv_off, false);
++                             nonce, ctx1_iv_off, false, ctrlpriv->era);
 +      dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
 +                                 desc_bytes(desc), DMA_TO_DEVICE);
  
        if (!alg->caam.geniv)
                goto skip_givenc;
-@@ -655,107 +277,32 @@ skip_enc:
+@@ -655,107 +281,32 @@ skip_enc:
         * Job Descriptor and Shared Descriptors
         * must all fit into the 64-word Descriptor h/w Buffer
         */
@@ -7850,13 +7888,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      desc = ctx->sh_desc_enc;
 +      cnstr_shdsc_aead_givencap(desc, &ctx->cdata, &ctx->adata, ivsize,
 +                                ctx->authsize, is_rfc3686, nonce,
-+                                ctx1_iv_off, false);
++                                ctx1_iv_off, false, ctrlpriv->era);
 +      dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
 +                                 desc_bytes(desc), DMA_TO_DEVICE);
  
  skip_givenc:
        return 0;
-@@ -776,12 +323,12 @@ static int gcm_set_sh_desc(struct crypto
+@@ -776,12 +327,12 @@ static int gcm_set_sh_desc(struct crypto
  {
        struct caam_ctx *ctx = crypto_aead_ctx(aead);
        struct device *jrdev = ctx->jrdev;
@@ -7873,7 +7911,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                return 0;
  
        /*
-@@ -789,175 +336,35 @@ static int gcm_set_sh_desc(struct crypto
+@@ -789,175 +340,35 @@ static int gcm_set_sh_desc(struct crypto
         * Job Descriptor and Shared Descriptor
         * must fit into the 64-word Descriptor h/w Buffer
         */
@@ -8069,7 +8107,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
        return 0;
  }
-@@ -976,11 +383,12 @@ static int rfc4106_set_sh_desc(struct cr
+@@ -976,11 +387,12 @@ static int rfc4106_set_sh_desc(struct cr
  {
        struct caam_ctx *ctx = crypto_aead_ctx(aead);
        struct device *jrdev = ctx->jrdev;
@@ -8085,7 +8123,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                return 0;
  
        /*
-@@ -988,148 +396,37 @@ static int rfc4106_set_sh_desc(struct cr
+@@ -988,148 +400,37 @@ static int rfc4106_set_sh_desc(struct cr
         * Job Descriptor and Shared Descriptor
         * must fit into the 64-word Descriptor h/w Buffer
         */
@@ -8256,7 +8294,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
        return 0;
  }
-@@ -1149,12 +446,12 @@ static int rfc4543_set_sh_desc(struct cr
+@@ -1149,12 +450,12 @@ static int rfc4543_set_sh_desc(struct cr
  {
        struct caam_ctx *ctx = crypto_aead_ctx(aead);
        struct device *jrdev = ctx->jrdev;
@@ -8273,7 +8311,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                return 0;
  
        /*
-@@ -1162,151 +459,37 @@ static int rfc4543_set_sh_desc(struct cr
+@@ -1162,151 +463,37 @@ static int rfc4543_set_sh_desc(struct cr
         * Job Descriptor and Shared Descriptor
         * must fit into the 64-word Descriptor h/w Buffer
         */
@@ -8447,7 +8485,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
        return 0;
  }
-@@ -1322,19 +505,9 @@ static int rfc4543_setauthsize(struct cr
+@@ -1322,74 +509,67 @@ static int rfc4543_setauthsize(struct cr
        return 0;
  }
  
@@ -8466,8 +8504,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 -      static const u8 mdpadlen[] = { 16, 20, 32, 32, 64, 64 };
        struct caam_ctx *ctx = crypto_aead_ctx(aead);
        struct device *jrdev = ctx->jrdev;
++      struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
        struct crypto_authenc_keys keys;
-@@ -1343,53 +516,32 @@ static int aead_setkey(struct crypto_aea
+       int ret = 0;
        if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
                goto badkey;
  
@@ -8490,6 +8530,27 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  #endif
  
 -      ret = gen_split_aead_key(ctx, keys.authkey, keys.authkeylen);
++      /*
++       * If DKP is supported, use it in the shared descriptor to generate
++       * the split key.
++       */
++      if (ctrlpriv->era >= 6) {
++              ctx->adata.keylen = keys.authkeylen;
++              ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype &
++                                                    OP_ALG_ALGSEL_MASK);
++
++              if (ctx->adata.keylen_pad + keys.enckeylen > CAAM_MAX_KEY_SIZE)
++                      goto badkey;
++
++              memcpy(ctx->key, keys.authkey, keys.authkeylen);
++              memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey,
++                     keys.enckeylen);
++              dma_sync_single_for_device(jrdev, ctx->key_dma,
++                                         ctx->adata.keylen_pad +
++                                         keys.enckeylen, DMA_TO_DEVICE);
++              goto skip_split_key;
++      }
++
 +      ret = gen_split_key(ctx->jrdev, ctx->key, &ctx->adata, keys.authkey,
 +                          keys.authkeylen, CAAM_MAX_KEY_SIZE -
 +                          keys.enckeylen);
@@ -8515,7 +8576,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 -                     ctx->split_key_pad_len + keys.enckeylen, 1);
 +                     ctx->adata.keylen_pad + keys.enckeylen, 1);
  #endif
--
 -      ctx->enckeylen = keys.enckeylen;
 -
 -      ret = aead_set_sh_desc(aead);
@@ -8525,12 +8586,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 -      }
 -
 -      return ret;
++skip_split_key:
 +      ctx->cdata.keylen = keys.enckeylen;
 +      return aead_set_sh_desc(aead);
  badkey:
        crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN);
        return -EINVAL;
-@@ -1400,7 +552,6 @@ static int gcm_setkey(struct crypto_aead
+@@ -1400,7 +580,6 @@ static int gcm_setkey(struct crypto_aead
  {
        struct caam_ctx *ctx = crypto_aead_ctx(aead);
        struct device *jrdev = ctx->jrdev;
@@ -8538,7 +8600,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
  #ifdef DEBUG
        print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ",
-@@ -1408,21 +559,10 @@ static int gcm_setkey(struct crypto_aead
+@@ -1408,21 +587,10 @@ static int gcm_setkey(struct crypto_aead
  #endif
  
        memcpy(ctx->key, key, keylen);
@@ -8549,21 +8611,21 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 -              return -ENOMEM;
 -      }
 -      ctx->enckeylen = keylen;
--
++      dma_sync_single_for_device(jrdev, ctx->key_dma, keylen, DMA_TO_DEVICE);
++      ctx->cdata.keylen = keylen;
 -      ret = gcm_set_sh_desc(aead);
 -      if (ret) {
 -              dma_unmap_single(jrdev, ctx->key_dma, ctx->enckeylen,
 -                               DMA_TO_DEVICE);
 -      }
-+      dma_sync_single_for_device(jrdev, ctx->key_dma, keylen, DMA_TO_DEVICE);
-+      ctx->cdata.keylen = keylen;
+-
 -      return ret;
 +      return gcm_set_sh_desc(aead);
  }
  
  static int rfc4106_setkey(struct crypto_aead *aead,
-@@ -1430,7 +570,6 @@ static int rfc4106_setkey(struct crypto_
+@@ -1430,7 +598,6 @@ static int rfc4106_setkey(struct crypto_
  {
        struct caam_ctx *ctx = crypto_aead_ctx(aead);
        struct device *jrdev = ctx->jrdev;
@@ -8571,7 +8633,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
        if (keylen < 4)
                return -EINVAL;
-@@ -1446,22 +585,10 @@ static int rfc4106_setkey(struct crypto_
+@@ -1446,22 +613,10 @@ static int rfc4106_setkey(struct crypto_
         * The last four bytes of the key material are used as the salt value
         * in the nonce. Update the AES key length.
         */
@@ -8598,7 +8660,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  }
  
  static int rfc4543_setkey(struct crypto_aead *aead,
-@@ -1469,7 +596,6 @@ static int rfc4543_setkey(struct crypto_
+@@ -1469,7 +624,6 @@ static int rfc4543_setkey(struct crypto_
  {
        struct caam_ctx *ctx = crypto_aead_ctx(aead);
        struct device *jrdev = ctx->jrdev;
@@ -8606,7 +8668,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
        if (keylen < 4)
                return -EINVAL;
-@@ -1485,43 +611,28 @@ static int rfc4543_setkey(struct crypto_
+@@ -1485,43 +639,28 @@ static int rfc4543_setkey(struct crypto_
         * The last four bytes of the key material are used as the salt value
         * in the nonce. Update the AES key length.
         */
@@ -8657,7 +8719,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  #ifdef DEBUG
        print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ",
                       DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
-@@ -1544,215 +655,33 @@ static int ablkcipher_setkey(struct cryp
+@@ -1544,215 +683,33 @@ static int ablkcipher_setkey(struct cryp
                keylen -= CTR_RFC3686_NONCE_SIZE;
        }
  
@@ -8890,7 +8952,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  }
  
  static int xts_ablkcipher_setkey(struct crypto_ablkcipher *ablkcipher,
-@@ -1760,8 +689,7 @@ static int xts_ablkcipher_setkey(struct
+@@ -1760,8 +717,7 @@ static int xts_ablkcipher_setkey(struct
  {
        struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher);
        struct device *jrdev = ctx->jrdev;
@@ -8900,7 +8962,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
        if (keylen != 2 * AES_MIN_KEY_SIZE  && keylen != 2 * AES_MAX_KEY_SIZE) {
                crypto_ablkcipher_set_flags(ablkcipher,
-@@ -1771,126 +699,38 @@ static int xts_ablkcipher_setkey(struct
+@@ -1771,126 +727,38 @@ static int xts_ablkcipher_setkey(struct
        }
  
        memcpy(ctx->key, key, keylen);
@@ -9040,7 +9102,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        int sec4_sg_bytes;
        dma_addr_t sec4_sg_dma;
        struct sec4_sg_entry *sec4_sg;
-@@ -1899,12 +739,12 @@ struct aead_edesc {
+@@ -1899,12 +767,12 @@ struct aead_edesc {
  
  /*
   * ablkcipher_edesc - s/w-extended ablkcipher descriptor
@@ -9056,7 +9118,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
   * @hw_desc: the h/w job descriptor followed by any referenced link tables
   */
  struct ablkcipher_edesc {
-@@ -1924,10 +764,11 @@ static void caam_unmap(struct device *de
+@@ -1924,10 +792,11 @@ static void caam_unmap(struct device *de
                       int sec4_sg_bytes)
  {
        if (dst != src) {
@@ -9071,7 +9133,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        }
  
        if (iv_dma)
-@@ -2021,8 +862,7 @@ static void ablkcipher_encrypt_done(stru
+@@ -2021,8 +890,7 @@ static void ablkcipher_encrypt_done(stru
        dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
  #endif
  
@@ -9081,7 +9143,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
        if (err)
                caam_jr_strstatus(jrdev, err);
-@@ -2031,10 +871,10 @@ static void ablkcipher_encrypt_done(stru
+@@ -2031,10 +899,10 @@ static void ablkcipher_encrypt_done(stru
        print_hex_dump(KERN_ERR, "dstiv  @"__stringify(__LINE__)": ",
                       DUMP_PREFIX_ADDRESS, 16, 4, req->info,
                       edesc->src_nents > 1 ? 100 : ivsize, 1);
@@ -9095,7 +9157,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
        ablkcipher_unmap(jrdev, edesc, req);
  
-@@ -2062,8 +902,7 @@ static void ablkcipher_decrypt_done(stru
+@@ -2062,8 +930,7 @@ static void ablkcipher_decrypt_done(stru
        dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
  #endif
  
@@ -9105,7 +9167,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        if (err)
                caam_jr_strstatus(jrdev, err);
  
-@@ -2071,10 +910,10 @@ static void ablkcipher_decrypt_done(stru
+@@ -2071,10 +938,10 @@ static void ablkcipher_decrypt_done(stru
        print_hex_dump(KERN_ERR, "dstiv  @"__stringify(__LINE__)": ",
                       DUMP_PREFIX_ADDRESS, 16, 4, req->info,
                       ivsize, 1);
@@ -9119,7 +9181,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
        ablkcipher_unmap(jrdev, edesc, req);
  
-@@ -2114,7 +953,7 @@ static void init_aead_job(struct aead_re
+@@ -2114,7 +981,7 @@ static void init_aead_job(struct aead_re
        init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE);
  
        if (all_contig) {
@@ -9128,7 +9190,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                in_options = 0;
        } else {
                src_dma = edesc->sec4_sg_dma;
-@@ -2129,7 +968,7 @@ static void init_aead_job(struct aead_re
+@@ -2129,7 +996,7 @@ static void init_aead_job(struct aead_re
        out_options = in_options;
  
        if (unlikely(req->src != req->dst)) {
@@ -9137,7 +9199,25 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        dst_dma = sg_dma_address(req->dst);
                } else {
                        dst_dma = edesc->sec4_sg_dma +
-@@ -2175,7 +1014,7 @@ static void init_gcm_job(struct aead_req
+@@ -2147,9 +1014,6 @@ static void init_aead_job(struct aead_re
+               append_seq_out_ptr(desc, dst_dma,
+                                  req->assoclen + req->cryptlen - authsize,
+                                  out_options);
+-
+-      /* REG3 = assoclen */
+-      append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen);
+ }
+ static void init_gcm_job(struct aead_request *req,
+@@ -2164,6 +1028,7 @@ static void init_gcm_job(struct aead_req
+       unsigned int last;
+       init_aead_job(req, edesc, all_contig, encrypt);
++      append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen);
+       /* BUG This should not be specific to generic GCM. */
+       last = 0;
+@@ -2175,7 +1040,7 @@ static void init_gcm_job(struct aead_req
                         FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 | 12 | last);
        /* Append Salt */
        if (!generic_gcm)
@@ -9146,16 +9226,33 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        /* Append IV */
        append_data(desc, req->iv, ivsize);
        /* End of blank commands */
-@@ -2190,7 +1029,7 @@ static void init_authenc_job(struct aead
+@@ -2190,7 +1055,8 @@ static void init_authenc_job(struct aead
                                                 struct caam_aead_alg, aead);
        unsigned int ivsize = crypto_aead_ivsize(aead);
        struct caam_ctx *ctx = crypto_aead_ctx(aead);
 -      const bool ctr_mode = ((ctx->class1_alg_type & OP_ALG_AAI_MASK) ==
++      struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctx->jrdev->parent);
 +      const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) ==
                               OP_ALG_AAI_CTR_MOD128);
        const bool is_rfc3686 = alg->caam.rfc3686;
        u32 *desc = edesc->hw_desc;
-@@ -2236,16 +1075,15 @@ static void init_ablkcipher_job(u32 *sh_
+@@ -2213,6 +1079,15 @@ static void init_authenc_job(struct aead
+       init_aead_job(req, edesc, all_contig, encrypt);
++      /*
++       * {REG3, DPOVRD} = assoclen, depending on whether MATH command supports
++       * having DPOVRD as destination.
++       */
++      if (ctrlpriv->era < 3)
++              append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen);
++      else
++              append_math_add_imm_u32(desc, DPOVRD, ZERO, IMM, req->assoclen);
++
+       if (ivsize && ((is_rfc3686 && encrypt) || !alg->caam.geniv))
+               append_load_as_imm(desc, req->iv, ivsize,
+                                  LDST_CLASS_1_CCB |
+@@ -2236,16 +1111,15 @@ static void init_ablkcipher_job(u32 *sh_
        int len, sec4_sg_index = 0;
  
  #ifdef DEBUG
@@ -9177,7 +9274,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
        len = desc_len(sh_desc);
        init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE);
-@@ -2261,7 +1099,7 @@ static void init_ablkcipher_job(u32 *sh_
+@@ -2261,7 +1135,7 @@ static void init_ablkcipher_job(u32 *sh_
        append_seq_in_ptr(desc, src_dma, req->nbytes + ivsize, in_options);
  
        if (likely(req->src == req->dst)) {
@@ -9186,7 +9283,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        dst_dma = sg_dma_address(req->src);
                } else {
                        dst_dma = edesc->sec4_sg_dma +
-@@ -2269,7 +1107,7 @@ static void init_ablkcipher_job(u32 *sh_
+@@ -2269,7 +1143,7 @@ static void init_ablkcipher_job(u32 *sh_
                        out_options = LDST_SGF;
                }
        } else {
@@ -9195,7 +9292,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        dst_dma = sg_dma_address(req->dst);
                } else {
                        dst_dma = edesc->sec4_sg_dma +
-@@ -2296,20 +1134,18 @@ static void init_ablkcipher_giv_job(u32
+@@ -2296,20 +1170,18 @@ static void init_ablkcipher_giv_job(u32
        int len, sec4_sg_index = 0;
  
  #ifdef DEBUG
@@ -9220,7 +9317,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                src_dma = sg_dma_address(req->src);
                in_options = 0;
        } else {
-@@ -2340,87 +1176,100 @@ static struct aead_edesc *aead_edesc_all
+@@ -2340,87 +1212,100 @@ static struct aead_edesc *aead_edesc_all
        struct crypto_aead *aead = crypto_aead_reqtfm(req);
        struct caam_ctx *ctx = crypto_aead_ctx(aead);
        struct device *jrdev = ctx->jrdev;
@@ -9376,7 +9473,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                                   edesc->sec4_sg + sec4_sg_index, 0);
        }
  
-@@ -2573,13 +1422,9 @@ static int aead_decrypt(struct aead_requ
+@@ -2573,13 +1458,9 @@ static int aead_decrypt(struct aead_requ
        u32 *desc;
        int ret = 0;
  
@@ -9393,7 +9490,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  
        /* allocate extended descriptor */
        edesc = aead_edesc_alloc(req, AUTHENC_DESC_JOB_IO_LEN,
-@@ -2619,51 +1464,80 @@ static struct ablkcipher_edesc *ablkciph
+@@ -2619,51 +1500,80 @@ static struct ablkcipher_edesc *ablkciph
        struct device *jrdev = ctx->jrdev;
        gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
                       GFP_KERNEL : GFP_ATOMIC;
@@ -9497,7 +9594,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                return ERR_PTR(-ENOMEM);
        }
  
-@@ -2673,23 +1547,24 @@ static struct ablkcipher_edesc *ablkciph
+@@ -2673,23 +1583,24 @@ static struct ablkcipher_edesc *ablkciph
        edesc->sec4_sg = (void *)edesc + sizeof(struct ablkcipher_edesc) +
                         desc_bytes;
  
@@ -9529,7 +9626,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                return ERR_PTR(-ENOMEM);
        }
  
-@@ -2701,7 +1576,7 @@ static struct ablkcipher_edesc *ablkciph
+@@ -2701,7 +1612,7 @@ static struct ablkcipher_edesc *ablkciph
                       sec4_sg_bytes, 1);
  #endif
  
@@ -9538,7 +9635,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        return edesc;
  }
  
-@@ -2792,30 +1667,54 @@ static struct ablkcipher_edesc *ablkciph
+@@ -2792,30 +1703,54 @@ static struct ablkcipher_edesc *ablkciph
        struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
        struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher);
        struct device *jrdev = ctx->jrdev;
@@ -9555,10 +9652,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      bool out_contig;
        int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
 -      int sec4_sg_index;
--
--      src_nents = sg_count(req->src, req->nbytes);
 +      int dst_sg_idx, sec4_sg_ents, sec4_sg_bytes;
  
+-      src_nents = sg_count(req->src, req->nbytes);
+-
 -      if (unlikely(req->dst != req->src))
 -              dst_nents = sg_count(req->dst, req->nbytes);
 +      src_nents = sg_nents_for_len(req->src, req->nbytes);
@@ -9609,7 +9706,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        }
  
        /*
-@@ -2825,21 +1724,29 @@ static struct ablkcipher_edesc *ablkciph
+@@ -2825,21 +1760,29 @@ static struct ablkcipher_edesc *ablkciph
        iv_dma = dma_map_single(jrdev, greq->giv, ivsize, DMA_TO_DEVICE);
        if (dma_mapping_error(jrdev, iv_dma)) {
                dev_err(jrdev, "unable to map IV\n");
@@ -9645,7 +9742,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                return ERR_PTR(-ENOMEM);
        }
  
-@@ -2849,24 +1756,24 @@ static struct ablkcipher_edesc *ablkciph
+@@ -2849,24 +1792,24 @@ static struct ablkcipher_edesc *ablkciph
        edesc->sec4_sg = (void *)edesc + sizeof(struct ablkcipher_edesc) +
                         desc_bytes;
  
@@ -9680,7 +9777,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                return ERR_PTR(-ENOMEM);
        }
        edesc->iv_dma = iv_dma;
-@@ -2878,7 +1785,7 @@ static struct ablkcipher_edesc *ablkciph
+@@ -2878,7 +1821,7 @@ static struct ablkcipher_edesc *ablkciph
                       sec4_sg_bytes, 1);
  #endif
  
@@ -9689,7 +9786,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        return edesc;
  }
  
-@@ -2889,7 +1796,7 @@ static int ablkcipher_givencrypt(struct
+@@ -2889,7 +1832,7 @@ static int ablkcipher_givencrypt(struct
        struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
        struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher);
        struct device *jrdev = ctx->jrdev;
@@ -9698,7 +9795,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
        u32 *desc;
        int ret = 0;
  
-@@ -2933,7 +1840,6 @@ struct caam_alg_template {
+@@ -2933,7 +1876,6 @@ struct caam_alg_template {
        } template_u;
        u32 class1_alg_type;
        u32 class2_alg_type;
@@ -9706,7 +9803,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
  };
  
  static struct caam_alg_template driver_algs[] = {
-@@ -3118,7 +2024,6 @@ static struct caam_aead_alg driver_aeads
+@@ -3118,7 +2060,6 @@ static struct caam_aead_alg driver_aeads
                .caam = {
                        .class2_alg_type = OP_ALG_ALGSEL_MD5 |
                                           OP_ALG_AAI_HMAC_PRECOMP,
@@ -9714,7 +9811,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                },
        },
        {
-@@ -3140,7 +2045,6 @@ static struct caam_aead_alg driver_aeads
+@@ -3140,7 +2081,6 @@ static struct caam_aead_alg driver_aeads
                .caam = {
                        .class2_alg_type = OP_ALG_ALGSEL_SHA1 |
                                           OP_ALG_AAI_HMAC_PRECOMP,
@@ -9722,7 +9819,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                },
        },
        {
-@@ -3162,7 +2066,6 @@ static struct caam_aead_alg driver_aeads
+@@ -3162,7 +2102,6 @@ static struct caam_aead_alg driver_aeads
                .caam = {
                        .class2_alg_type = OP_ALG_ALGSEL_SHA224 |
                                           OP_ALG_AAI_HMAC_PRECOMP,
@@ -9730,7 +9827,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                },
        },
        {
-@@ -3184,7 +2087,6 @@ static struct caam_aead_alg driver_aeads
+@@ -3184,7 +2123,6 @@ static struct caam_aead_alg driver_aeads
                .caam = {
                        .class2_alg_type = OP_ALG_ALGSEL_SHA256 |
                                           OP_ALG_AAI_HMAC_PRECOMP,
@@ -9738,7 +9835,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                },
        },
        {
-@@ -3206,7 +2108,6 @@ static struct caam_aead_alg driver_aeads
+@@ -3206,7 +2144,6 @@ static struct caam_aead_alg driver_aeads
                .caam = {
                        .class2_alg_type = OP_ALG_ALGSEL_SHA384 |
                                           OP_ALG_AAI_HMAC_PRECOMP,
@@ -9746,7 +9843,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                },
        },
        {
-@@ -3228,7 +2129,6 @@ static struct caam_aead_alg driver_aeads
+@@ -3228,7 +2165,6 @@ static struct caam_aead_alg driver_aeads
                .caam = {
                        .class2_alg_type = OP_ALG_ALGSEL_SHA512 |
                                           OP_ALG_AAI_HMAC_PRECOMP,
@@ -9754,7 +9851,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                },
        },
        {
-@@ -3250,7 +2150,6 @@ static struct caam_aead_alg driver_aeads
+@@ -3250,7 +2186,6 @@ static struct caam_aead_alg driver_aeads
                        .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
                        .class2_alg_type = OP_ALG_ALGSEL_MD5 |
                                           OP_ALG_AAI_HMAC_PRECOMP,
@@ -9762,7 +9859,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                },
        },
        {
-@@ -3273,7 +2172,6 @@ static struct caam_aead_alg driver_aeads
+@@ -3273,7 +2208,6 @@ static struct caam_aead_alg driver_aeads
                        .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
                        .class2_alg_type = OP_ALG_ALGSEL_MD5 |
                                           OP_ALG_AAI_HMAC_PRECOMP,
@@ -9770,7 +9867,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        .geniv = true,
                },
        },
-@@ -3296,7 +2194,6 @@ static struct caam_aead_alg driver_aeads
+@@ -3296,7 +2230,6 @@ static struct caam_aead_alg driver_aeads
                        .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
                        .class2_alg_type = OP_ALG_ALGSEL_SHA1 |
                                           OP_ALG_AAI_HMAC_PRECOMP,
@@ -9778,7 +9875,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                },
        },
        {
-@@ -3319,7 +2216,6 @@ static struct caam_aead_alg driver_aeads
+@@ -3319,7 +2252,6 @@ static struct caam_aead_alg driver_aeads
                        .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
                        .class2_alg_type = OP_ALG_ALGSEL_SHA1 |
                                           OP_ALG_AAI_HMAC_PRECOMP,
@@ -9786,7 +9883,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                        .geniv = true,
                },
        },
-@@ -3342,7 +2238,6 @@ static struct caam_aead_alg driver_aeads
+@@ -3342,7 +2274,6 @@ static struct caam_aead_alg driver_aeads
                        .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
                        .class2_alg_type = OP_ALG_ALGSEL_SHA224 |
                                           OP_ALG_AAI_HMAC_PRECOMP,
@@ -9794,7 +9891,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
                },
        },
        {
-@@ -3365,7 +2260,6 @@ static struct caam_aead_alg driver_aeads
+@@ -3365,7 +2296,6 @@ static struct caam_aead_alg driver_aeads
                        .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
                        .class2_alg_type = OP_ALG_ALGSEL_SHA224 |
                                           OP_ALG_AAI_HMAC_PRECOMP,
@@ -9802,7 +9899,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>