ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/target/linux/layerscape/patches-5.4/701-net-0360-sdk_dpaa-sdk_fman-ls1043a-errata-detect-based-on-DTB.patch b/target/linux/layerscape/patches-5.4/701-net-0360-sdk_dpaa-sdk_fman-ls1043a-errata-detect-based-on-DTB.patch
new file mode 100644
index 0000000..e9e5ae0
--- /dev/null
+++ b/target/linux/layerscape/patches-5.4/701-net-0360-sdk_dpaa-sdk_fman-ls1043a-errata-detect-based-on-DTB.patch
@@ -0,0 +1,297 @@
+From 6dbf409f09fd85d738652c7867a5822f682d5682 Mon Sep 17 00:00:00 2001
+From: Camelia Groza <camelia.groza@nxp.com>
+Date: Thu, 12 Dec 2019 14:15:05 +0200
+Subject: [PATCH] sdk_dpaa: sdk_fman: ls1043a errata: detect based on DTB
+ property
+
+Detect if the platform is vulnerable to the A010022 erratum based on device
+tree properties instead of the SoC family.
+
+Signed-off-by: Camelia Groza <camelia.groza@nxp.com>
+---
+ drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c | 31 +---------------------
+ drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.h | 14 +++++-----
+ .../net/ethernet/freescale/sdk_dpaa/dpaa_eth_sg.c  | 25 ++++++++---------
+ .../inc/integrations/LS1043/dpaa_integration_ext.h |  3 +++
+ .../sdk_fman/src/inc/wrapper/lnxwrp_fsl_fman.h     | 10 +++++++
+ .../freescale/sdk_fman/src/wrapper/lnxwrp_fm.c     | 17 ++++++++++++
+ 6 files changed, 51 insertions(+), 49 deletions(-)
+
+--- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c
++++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c
+@@ -1,4 +1,5 @@
+ /* Copyright 2008-2013 Freescale Semiconductor Inc.
++ * Copyright 2019 NXP
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions are met:
+@@ -105,11 +106,6 @@ static const char rtx[][3] = {
+ 	[TX] = "TX"
+ };
+ 
+-#ifndef CONFIG_PPC
+-bool dpaa_errata_a010022;
+-EXPORT_SYMBOL(dpaa_errata_a010022);
+-#endif
+-
+ /* BM */
+ 
+ #define DPAA_ETH_MAX_PAD (L1_CACHE_BYTES * 8)
+@@ -1133,26 +1129,6 @@ static struct platform_driver dpa_driver
+ 	.remove		= dpa_remove
+ };
+ 
+-#ifndef CONFIG_PPC
+-static bool __init __cold soc_has_errata_a010022(void)
+-{
+-#ifdef CONFIG_SOC_BUS
+-	const struct soc_device_attribute soc_msi_matches[] = {
+-		{ .family = "QorIQ LS1043A",
+-		  .data = NULL },
+-		{ },
+-	};
+-
+-	if (soc_device_match(soc_msi_matches))
+-		return true;
+-
+-	return false;
+-#else
+-	return true; /* cannot identify SoC */
+-#endif
+-}
+-#endif
+-
+ static int __init __cold dpa_load(void)
+ {
+ 	int	 _errno;
+@@ -1168,11 +1144,6 @@ static int __init __cold dpa_load(void)
+ 	dpa_max_frm = fm_get_max_frm();
+ 	dpa_num_cpus = num_possible_cpus();
+ 
+-#ifndef CONFIG_PPC
+-	/* Detect if the current SoC requires the 4K alignment workaround */
+-	dpaa_errata_a010022 = soc_has_errata_a010022();
+-#endif
+-
+ #ifdef CONFIG_FSL_DPAA_DBG_LOOP
+ 	memset(dpa_loop_netdevs, 0, sizeof(dpa_loop_netdevs));
+ #endif
+--- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.h
++++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.h
+@@ -1,4 +1,5 @@
+ /* Copyright 2008-2012 Freescale Semiconductor Inc.
++ * Copyright 2019 NXP
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions are met:
+@@ -98,15 +99,15 @@ struct dpa_buffer_layout_s {
+  * space to account for further alignments.
+  */
+ #define DPA_MAX_FRM_SIZE	9600
+-#ifdef CONFIG_PPC
++#ifndef FM_ERRATUM_A010022
+ #define DPA_BP_RAW_SIZE \
+ 	((DPA_MAX_FRM_SIZE + DPA_MAX_FD_OFFSET + \
+ 	  sizeof(struct skb_shared_info) + 128) & ~(SMP_CACHE_BYTES - 1))
+-#else /* CONFIG_PPC */
+-#define DPA_BP_RAW_SIZE ((unlikely(dpaa_errata_a010022)) ? 2048 : \
++#else /* FM_ERRATUM_A010022 */
++#define DPA_BP_RAW_SIZE ((unlikely(fm_has_errata_a010022())) ? 2048 : \
+ 	((DPA_MAX_FRM_SIZE + DPA_MAX_FD_OFFSET + \
+ 	  sizeof(struct skb_shared_info) + 128) & ~(SMP_CACHE_BYTES - 1)))
+-#endif /* CONFIG_PPC */
++#endif /* FM_ERRATUM_A010022 */
+ #endif /* CONFIG_FSL_DPAA_ETH_JUMBO_FRAME */
+ 
+ /* This is what FMan is ever allowed to use.
+@@ -659,8 +660,7 @@ static inline void _dpa_bp_free_pf(void
+  * on egress.
+  */
+ 
+-#ifndef CONFIG_PPC
+-extern bool dpaa_errata_a010022; /* SoC affected by A010022 errata */
++#ifdef FM_ERRATUM_A010022
+ #define CROSS_4K(start, size) \
+ 	(((uintptr_t)(start) + (size)) > \
+ 	 (((uintptr_t)(start) + 0x1000) & ~0xFFF))
+@@ -668,6 +668,6 @@ extern bool dpaa_errata_a010022; /* SoC
+  * we reserve 256 bytes instead to guarantee 256 data alignment.
+  */
+ #define DPAA_A010022_HEADROOM	256
+-#endif  /* !CONFIG_PPC */
++#endif  /* FM_ERRATUM_A010022 */
+ 
+ #endif	/* __DPA_H */
+--- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_sg.c
++++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_sg.c
+@@ -1,4 +1,5 @@
+ /* Copyright 2012 Freescale Semiconductor Inc.
++ * Copyright 2019 NXP
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions are met:
+@@ -100,8 +101,8 @@ static int _dpa_bp_add_8_bufs(const stru
+ 		 * We only need enough space to store a pointer, but allocate
+ 		 * an entire cacheline for performance reasons.
+ 		 */
+-#ifndef CONFIG_PPC
+-		if (unlikely(dpaa_errata_a010022)) {
++#ifdef FM_ERRATUM_A010022
++		if (unlikely(fm_has_errata_a010022())) {
+ 			struct page *new_page = alloc_page(GFP_ATOMIC);
+ 			if (unlikely(!new_page))
+ 				goto netdev_alloc_failed;
+@@ -764,7 +765,7 @@ int __hot skb_to_contig_fd(struct dpa_pr
+ }
+ EXPORT_SYMBOL(skb_to_contig_fd);
+ 
+-#ifndef CONFIG_PPC
++#ifdef FM_ERRATUM_A010022
+ /* Verify the conditions that trigger the A010022 errata:
+  * - 4K memory address boundary crossings when the data/SG fragments aren't
+  *   aligned to 256 bytes
+@@ -940,8 +941,8 @@ int __hot skb_to_sg_fd(struct dpa_priv_s
+ 	/* Get a page frag to store the SGTable, or a full page if the errata
+ 	 * is in place and we need to avoid crossing a 4k boundary.
+ 	 */
+-#ifndef CONFIG_PPC
+-	if (unlikely(dpaa_errata_a010022)) {
++#ifdef FM_ERRATUM_A010022
++	if (unlikely(fm_has_errata_a010022())) {
+ 		struct page *new_page = alloc_page(GFP_ATOMIC);
+ 
+ 		if (unlikely(!new_page))
+@@ -1120,8 +1121,8 @@ int __hot dpa_tx_extended(struct sk_buff
+ 
+ 	clear_fd(&fd);
+ 
+-#ifndef CONFIG_PPC
+-	if (unlikely(dpaa_errata_a010022) && a010022_check_skb(skb, priv))
++#ifdef FM_ERRATUM_A010022
++	if (unlikely(fm_has_errata_a010022()) && a010022_check_skb(skb, priv))
+ 		skb_need_wa = true;
+ #endif
+ 
+@@ -1193,12 +1194,12 @@ int __hot dpa_tx_extended(struct sk_buff
+ 			 * more fragments than we support. In this case,
+ 			 * we have no choice but to linearize it ourselves.
+ 			 */
+-#ifndef CONFIG_PPC
++#ifdef FM_ERRATUM_A010022
+ 			/* No point in linearizing the skb now if we are going
+ 			 * to realign and linearize it again further down due
+ 			 * to the A010022 errata
+ 			 */
+-			if (unlikely(dpaa_errata_a010022))
++			if (unlikely(fm_has_errata_a010022()))
+ 				skb_need_wa = true;
+ 			else
+ #endif
+@@ -1208,15 +1209,15 @@ int __hot dpa_tx_extended(struct sk_buff
+ 			/* Common out-of-memory error path */
+ 			goto enomem;
+ 
+-#ifndef CONFIG_PPC
++#ifdef FM_ERRATUM_A010022
+ 		/* Verify the skb a second time if it has been updated since
+ 		 * the previous check
+ 		 */
+-		if (unlikely(dpaa_errata_a010022) && skb_changed &&
++		if (unlikely(fm_has_errata_a010022()) && skb_changed &&
+ 		    a010022_check_skb(skb, priv))
+ 			skb_need_wa = true;
+ 
+-		if (unlikely(dpaa_errata_a010022) && skb_need_wa) {
++		if (unlikely(fm_has_errata_a010022()) && skb_need_wa) {
+ 			nskb = a010022_realign_skb(skb, priv);
+ 			if (!nskb)
+ 				goto skb_to_fd_failed;
+--- a/drivers/net/ethernet/freescale/sdk_fman/inc/integrations/LS1043/dpaa_integration_ext.h
++++ b/drivers/net/ethernet/freescale/sdk_fman/inc/integrations/LS1043/dpaa_integration_ext.h
+@@ -1,5 +1,6 @@
+ /*
+  * Copyright 2012 Freescale Semiconductor Inc.
++ * Copyright 2019 NXP
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions are met:
+@@ -270,6 +271,8 @@ typedef enum
+ #define FM_AID_MODE_NO_TNUM_SW005 /* refer to pdm TKT068794 - only support of port_id on aid */
+ #define FM_ERROR_VSP_NO_MATCH_SW006 /* refer to pdm TKT174304 - no match between errorQ and VSP */
+ 
++#define FM_ERRATUM_A010022
++
+ /*****************************************************************************
+  RMan INTEGRATION-SPECIFIC DEFINITIONS
+ ******************************************************************************/
+--- a/drivers/net/ethernet/freescale/sdk_fman/src/inc/wrapper/lnxwrp_fsl_fman.h
++++ b/drivers/net/ethernet/freescale/sdk_fman/src/inc/wrapper/lnxwrp_fsl_fman.h
+@@ -1,5 +1,6 @@
+ /*
+  * Copyright 2008-2012 Freescale Semiconductor Inc.
++ * Copyright 2019 NXP
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions are met:
+@@ -489,6 +490,15 @@ int fm_get_max_frm(void);
+ int fm_get_rx_extra_headroom(void);
+ 
+ /**************************************************************************//**
++ @Function	fm_has_errata_a010022
++
++ @Description   Detect if the SoC is vulnerable to the A010022 errata
++*//***************************************************************************/
++#ifdef FM_ERRATUM_A010022
++bool fm_has_errata_a010022(void);
++#endif
++
++/**************************************************************************//**
+ @Function     fm_port_set_rate_limit
+ 
+ @Description  Configure Shaper parameter on FM-port device (Tx port).
+--- a/drivers/net/ethernet/freescale/sdk_fman/src/wrapper/lnxwrp_fm.c
++++ b/drivers/net/ethernet/freescale/sdk_fman/src/wrapper/lnxwrp_fm.c
+@@ -1,5 +1,6 @@
+ /*
+  * Copyright 2008-2012 Freescale Semiconductor Inc.
++ * Copyright 2019 NXP
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions are met:
+@@ -155,6 +156,10 @@ static int fsl_fm_pfc_quanta[] = {
+ 
+ static t_LnxWrpFm   lnxWrpFm;
+ 
++#ifdef FM_ERRATUM_A010022
++static bool fm_has_err_a010022;
++#endif
++
+ int fm_get_max_frm()
+ {
+ 	return fsl_fm_max_frm;
+@@ -167,6 +172,14 @@ int fm_get_rx_extra_headroom()
+ }
+ EXPORT_SYMBOL(fm_get_rx_extra_headroom);
+ 
++#ifdef FM_ERRATUM_A010022
++bool fm_has_errata_a010022(void)
++{
++	return fm_has_err_a010022;
++}
++EXPORT_SYMBOL(fm_has_errata_a010022);
++#endif
++
+ static int __init fm_set_max_frm(char *str)
+ {
+ 	int ret = 0;
+@@ -749,6 +762,10 @@ static t_LnxWrpFmDev * ReadFmDevTreeNode
+             p_LnxWrpFmDev->defPcd = e_NO_PCD;
+     }
+ 
++#ifdef FM_ERRATUM_A010022
++    fm_has_err_a010022 = of_property_read_bool(fm_node, "fsl,erratum-a010022");
++#endif
++
+     of_node_put(fm_node);
+ 
+     p_LnxWrpFmDev->hcCh =