xref: /dpdk/drivers/net/dpaa2/dpaa2_ethdev.c (revision 25d0ae6242453c3e482d752495d5a30f3ada11dd)
1131a75b6SHemant Agrawal /* * SPDX-License-Identifier: BSD-3-Clause
2c147eae0SHemant Agrawal  *
3c147eae0SHemant Agrawal  *   Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved.
412d98eceSJun Yang  *   Copyright 2016-2024 NXP
5c147eae0SHemant Agrawal  *
6c147eae0SHemant Agrawal  */
7c147eae0SHemant Agrawal 
8c147eae0SHemant Agrawal #include <time.h>
9c147eae0SHemant Agrawal #include <net/if.h>
10c147eae0SHemant Agrawal 
11c147eae0SHemant Agrawal #include <rte_mbuf.h>
12df96fd0dSBruce Richardson #include <ethdev_driver.h>
13c147eae0SHemant Agrawal #include <rte_malloc.h>
14c147eae0SHemant Agrawal #include <rte_memcpy.h>
15c147eae0SHemant Agrawal #include <rte_string_fns.h>
16c147eae0SHemant Agrawal #include <rte_cycles.h>
17c147eae0SHemant Agrawal #include <rte_kvargs.h>
181acb7f54SDavid Marchand #include <dev_driver.h>
19b4f22ca5SDavid Marchand #include <bus_fslmc_driver.h>
20fe2b986aSSunil Kumar Kori #include <rte_flow_driver.h>
216ac5a55bSJun Yang #include "rte_dpaa2_mempool.h"
22c147eae0SHemant Agrawal 
23a10a988aSShreyansh Jain #include "dpaa2_pmd_logs.h"
24c147eae0SHemant Agrawal #include <fslmc_vfio.h>
253e5a335dSHemant Agrawal #include <dpaa2_hw_pvt.h>
26bee61d86SHemant Agrawal #include <dpaa2_hw_mempool.h>
273cf50ff5SHemant Agrawal #include <dpaa2_hw_dpio.h>
28748eccb9SHemant Agrawal #include <mc/fsl_dpmng.h>
29c147eae0SHemant Agrawal #include "dpaa2_ethdev.h"
3072ec7a67SSunil Kumar Kori #include "dpaa2_sparser.h"
31f40adb40SHemant Agrawal #include <fsl_qbman_debug.h>
32c147eae0SHemant Agrawal 
33c7ec1ba8SHemant Agrawal #define DRIVER_LOOPBACK_MODE "drv_loopback"
3420191ab3SNipun Gupta #define DRIVER_NO_PREFETCH_MODE "drv_no_prefetch"
358d21c563SHemant Agrawal #define DRIVER_TX_CONF "drv_tx_conf"
364690a611SNipun Gupta #define DRIVER_ERROR_QUEUE  "drv_err_queue"
37eadcfd95SRohit Raj #define CHECK_INTERVAL         100  /* 100ms */
38eadcfd95SRohit Raj #define MAX_REPEAT_TIME        90   /* 9s (90 * 100ms) in total */
39a3a997f0SHemant Agrawal 
40175fe7d9SSunil Kumar Kori /* Supported Rx offloads */
41175fe7d9SSunil Kumar Kori static uint64_t dev_rx_offloads_sup =
42295968d1SFerruh Yigit 		RTE_ETH_RX_OFFLOAD_CHECKSUM |
43295968d1SFerruh Yigit 		RTE_ETH_RX_OFFLOAD_SCTP_CKSUM |
44295968d1SFerruh Yigit 		RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM |
45295968d1SFerruh Yigit 		RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM |
46295968d1SFerruh Yigit 		RTE_ETH_RX_OFFLOAD_VLAN_STRIP |
47295968d1SFerruh Yigit 		RTE_ETH_RX_OFFLOAD_VLAN_FILTER |
48295968d1SFerruh Yigit 		RTE_ETH_RX_OFFLOAD_TIMESTAMP;
49175fe7d9SSunil Kumar Kori 
50175fe7d9SSunil Kumar Kori /* Rx offloads which cannot be disabled */
51175fe7d9SSunil Kumar Kori static uint64_t dev_rx_offloads_nodis =
52295968d1SFerruh Yigit 		RTE_ETH_RX_OFFLOAD_RSS_HASH |
53295968d1SFerruh Yigit 		RTE_ETH_RX_OFFLOAD_SCATTER;
54175fe7d9SSunil Kumar Kori 
55175fe7d9SSunil Kumar Kori /* Supported Tx offloads */
56175fe7d9SSunil Kumar Kori static uint64_t dev_tx_offloads_sup =
57295968d1SFerruh Yigit 		RTE_ETH_TX_OFFLOAD_VLAN_INSERT |
58295968d1SFerruh Yigit 		RTE_ETH_TX_OFFLOAD_IPV4_CKSUM |
59295968d1SFerruh Yigit 		RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
60295968d1SFerruh Yigit 		RTE_ETH_TX_OFFLOAD_TCP_CKSUM |
61295968d1SFerruh Yigit 		RTE_ETH_TX_OFFLOAD_SCTP_CKSUM |
62295968d1SFerruh Yigit 		RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM |
63295968d1SFerruh Yigit 		RTE_ETH_TX_OFFLOAD_MT_LOCKFREE |
64295968d1SFerruh Yigit 		RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE;
65175fe7d9SSunil Kumar Kori 
66175fe7d9SSunil Kumar Kori /* Tx offloads which cannot be disabled */
67175fe7d9SSunil Kumar Kori static uint64_t dev_tx_offloads_nodis =
68295968d1SFerruh Yigit 		RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
69175fe7d9SSunil Kumar Kori 
70c1870f65SAkhil Goyal /* enable timestamp in mbuf */
71724f79dfSHemant Agrawal bool dpaa2_enable_ts[RTE_MAX_ETHPORTS];
7261c41e2eSThomas Monjalon uint64_t dpaa2_timestamp_rx_dynflag;
7361c41e2eSThomas Monjalon int dpaa2_timestamp_dynfield_offset = -1;
74c1870f65SAkhil Goyal 
754690a611SNipun Gupta /* Enable error queue */
764690a611SNipun Gupta bool dpaa2_enable_err_queue;
774690a611SNipun Gupta 
7893e41cb3SJun Yang bool dpaa2_print_parser_result;
7993e41cb3SJun Yang 
8035dc25d1SRohit Raj #define MAX_NB_RX_DESC		11264
8135dc25d1SRohit Raj int total_nb_rx_desc;
8235dc25d1SRohit Raj 
8375e2a1d4SGagandeep Singh int dpaa2_valid_dev;
8475e2a1d4SGagandeep Singh struct rte_mempool *dpaa2_tx_sg_pool;
8575e2a1d4SGagandeep Singh 
861d6329b2SHemant Agrawal struct rte_dpaa2_xstats_name_off {
871d6329b2SHemant Agrawal 	char name[RTE_ETH_XSTATS_NAME_SIZE];
881d6329b2SHemant Agrawal 	uint8_t page_id; /* dpni statistics page id */
891d6329b2SHemant Agrawal 	uint8_t stats_id; /* stats id in the given page */
901d6329b2SHemant Agrawal };
911d6329b2SHemant Agrawal 
921d6329b2SHemant Agrawal static const struct rte_dpaa2_xstats_name_off dpaa2_xstats_strings[] = {
931d6329b2SHemant Agrawal 	{"ingress_multicast_frames", 0, 2},
941d6329b2SHemant Agrawal 	{"ingress_multicast_bytes", 0, 3},
951d6329b2SHemant Agrawal 	{"ingress_broadcast_frames", 0, 4},
961d6329b2SHemant Agrawal 	{"ingress_broadcast_bytes", 0, 5},
971d6329b2SHemant Agrawal 	{"egress_multicast_frames", 1, 2},
981d6329b2SHemant Agrawal 	{"egress_multicast_bytes", 1, 3},
991d6329b2SHemant Agrawal 	{"egress_broadcast_frames", 1, 4},
1001d6329b2SHemant Agrawal 	{"egress_broadcast_bytes", 1, 5},
1011d6329b2SHemant Agrawal 	{"ingress_filtered_frames", 2, 0},
1021d6329b2SHemant Agrawal 	{"ingress_discarded_frames", 2, 1},
1031d6329b2SHemant Agrawal 	{"ingress_nobuffer_discards", 2, 2},
1041d6329b2SHemant Agrawal 	{"egress_discarded_frames", 2, 3},
1051d6329b2SHemant Agrawal 	{"egress_confirmed_frames", 2, 4},
106c720c5f6SHemant Agrawal 	{"cgr_reject_frames", 4, 0},
107c720c5f6SHemant Agrawal 	{"cgr_reject_bytes", 4, 1},
1081d6329b2SHemant Agrawal };
1091d6329b2SHemant Agrawal 
110c147eae0SHemant Agrawal static struct rte_dpaa2_driver rte_dpaa2_pmd;
111c5acbb5eSHemant Agrawal static int dpaa2_dev_link_update(struct rte_eth_dev *dev,
112c5acbb5eSHemant Agrawal 				 int wait_to_complete);
113a1f3a12cSHemant Agrawal static int dpaa2_dev_set_link_up(struct rte_eth_dev *dev);
114a1f3a12cSHemant Agrawal static int dpaa2_dev_set_link_down(struct rte_eth_dev *dev);
115e1640849SHemant Agrawal static int dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
116c147eae0SHemant Agrawal 
1173ce294f2SHemant Agrawal static int
1183ce294f2SHemant Agrawal dpaa2_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
1193ce294f2SHemant Agrawal {
1203ce294f2SHemant Agrawal 	int ret;
1213ce294f2SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
12281c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = dev->process_private;
1233ce294f2SHemant Agrawal 
1243ce294f2SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1253ce294f2SHemant Agrawal 
126*25d0ae62SJun Yang 	if (!dpni) {
127a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
128*25d0ae62SJun Yang 		return -EINVAL;
1293ce294f2SHemant Agrawal 	}
1303ce294f2SHemant Agrawal 
1313ce294f2SHemant Agrawal 	if (on)
13296f7bfe8SSachin Saxena 		ret = dpni_add_vlan_id(dpni, CMD_PRI_LOW, priv->token,
13396f7bfe8SSachin Saxena 				       vlan_id, 0, 0, 0);
1343ce294f2SHemant Agrawal 	else
1353ce294f2SHemant Agrawal 		ret = dpni_remove_vlan_id(dpni, CMD_PRI_LOW,
1363ce294f2SHemant Agrawal 					  priv->token, vlan_id);
1373ce294f2SHemant Agrawal 
1383ce294f2SHemant Agrawal 	if (ret < 0)
139a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("ret = %d Unable to add/rem vlan %d hwid =%d",
1403ce294f2SHemant Agrawal 			      ret, vlan_id, priv->hw_id);
1413ce294f2SHemant Agrawal 
1423ce294f2SHemant Agrawal 	return ret;
1433ce294f2SHemant Agrawal }
1443ce294f2SHemant Agrawal 
145289ba0c0SDavid Harton static int
1463ce294f2SHemant Agrawal dpaa2_vlan_offload_set(struct rte_eth_dev *dev, int mask)
1473ce294f2SHemant Agrawal {
1483ce294f2SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
14981c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = dev->process_private;
15050ce3e7aSWei Hu (Xavier) 	int ret = 0;
1513ce294f2SHemant Agrawal 
1523ce294f2SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1533ce294f2SHemant Agrawal 
154295968d1SFerruh Yigit 	if (mask & RTE_ETH_VLAN_FILTER_MASK) {
1557be78d02SJosh Soref 		/* VLAN Filter not available */
156c172f85eSHemant Agrawal 		if (!priv->max_vlan_filters) {
157a10a988aSShreyansh Jain 			DPAA2_PMD_INFO("VLAN filter not available");
15850ce3e7aSWei Hu (Xavier) 			return -ENOTSUP;
159c172f85eSHemant Agrawal 		}
160c172f85eSHemant Agrawal 
1610ebce612SSunil Kumar Kori 		if (dev->data->dev_conf.rxmode.offloads &
162295968d1SFerruh Yigit 			RTE_ETH_RX_OFFLOAD_VLAN_FILTER)
1633ce294f2SHemant Agrawal 			ret = dpni_enable_vlan_filter(dpni, CMD_PRI_LOW,
1643ce294f2SHemant Agrawal 						      priv->token, true);
1653ce294f2SHemant Agrawal 		else
1663ce294f2SHemant Agrawal 			ret = dpni_enable_vlan_filter(dpni, CMD_PRI_LOW,
1673ce294f2SHemant Agrawal 						      priv->token, false);
1683ce294f2SHemant Agrawal 		if (ret < 0)
169a10a988aSShreyansh Jain 			DPAA2_PMD_INFO("Unable to set vlan filter = %d", ret);
1703ce294f2SHemant Agrawal 	}
171289ba0c0SDavid Harton 
17250ce3e7aSWei Hu (Xavier) 	return ret;
1733ce294f2SHemant Agrawal }
1743ce294f2SHemant Agrawal 
175748eccb9SHemant Agrawal static int
176e59b75ffSHemant Agrawal dpaa2_vlan_tpid_set(struct rte_eth_dev *dev,
177e59b75ffSHemant Agrawal 	enum rte_vlan_type vlan_type __rte_unused,
178e59b75ffSHemant Agrawal 	uint16_t tpid)
179e59b75ffSHemant Agrawal {
180e59b75ffSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
18181c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = dev->process_private;
182e59b75ffSHemant Agrawal 	int ret = -ENOTSUP;
183e59b75ffSHemant Agrawal 
184e59b75ffSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
185e59b75ffSHemant Agrawal 
186e59b75ffSHemant Agrawal 	/* nothing to be done for standard vlan tpids */
187e59b75ffSHemant Agrawal 	if (tpid == 0x8100 || tpid == 0x88A8)
188e59b75ffSHemant Agrawal 		return 0;
189e59b75ffSHemant Agrawal 
190e59b75ffSHemant Agrawal 	ret = dpni_add_custom_tpid(dpni, CMD_PRI_LOW,
191e59b75ffSHemant Agrawal 				   priv->token, tpid);
192e59b75ffSHemant Agrawal 	if (ret < 0)
193e59b75ffSHemant Agrawal 		DPAA2_PMD_INFO("Unable to set vlan tpid = %d", ret);
194e59b75ffSHemant Agrawal 	/* if already configured tpids, remove them first */
195e59b75ffSHemant Agrawal 	if (ret == -EBUSY) {
196e59b75ffSHemant Agrawal 		struct dpni_custom_tpid_cfg tpid_list = {0};
197e59b75ffSHemant Agrawal 
198e59b75ffSHemant Agrawal 		ret = dpni_get_custom_tpid(dpni, CMD_PRI_LOW,
199e59b75ffSHemant Agrawal 				   priv->token, &tpid_list);
200e59b75ffSHemant Agrawal 		if (ret < 0)
201e59b75ffSHemant Agrawal 			goto fail;
202e59b75ffSHemant Agrawal 		ret = dpni_remove_custom_tpid(dpni, CMD_PRI_LOW,
203e59b75ffSHemant Agrawal 				   priv->token, tpid_list.tpid1);
204e59b75ffSHemant Agrawal 		if (ret < 0)
205e59b75ffSHemant Agrawal 			goto fail;
206e59b75ffSHemant Agrawal 		ret = dpni_add_custom_tpid(dpni, CMD_PRI_LOW,
207e59b75ffSHemant Agrawal 					   priv->token, tpid);
208e59b75ffSHemant Agrawal 	}
209e59b75ffSHemant Agrawal fail:
210e59b75ffSHemant Agrawal 	return ret;
211e59b75ffSHemant Agrawal }
212e59b75ffSHemant Agrawal 
213e59b75ffSHemant Agrawal static int
214748eccb9SHemant Agrawal dpaa2_fw_version_get(struct rte_eth_dev *dev,
215*25d0ae62SJun Yang 	char *fw_version, size_t fw_size)
216748eccb9SHemant Agrawal {
217748eccb9SHemant Agrawal 	int ret;
21881c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = dev->process_private;
219748eccb9SHemant Agrawal 	struct mc_soc_version mc_plat_info = {0};
220748eccb9SHemant Agrawal 	struct mc_version mc_ver_info = {0};
221748eccb9SHemant Agrawal 
222748eccb9SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
223748eccb9SHemant Agrawal 
224748eccb9SHemant Agrawal 	if (mc_get_soc_version(dpni, CMD_PRI_LOW, &mc_plat_info))
225a10a988aSShreyansh Jain 		DPAA2_PMD_WARN("\tmc_get_soc_version failed");
226748eccb9SHemant Agrawal 
227748eccb9SHemant Agrawal 	if (mc_get_version(dpni, CMD_PRI_LOW, &mc_ver_info))
228a10a988aSShreyansh Jain 		DPAA2_PMD_WARN("\tmc_get_version failed");
229748eccb9SHemant Agrawal 
230748eccb9SHemant Agrawal 	ret = snprintf(fw_version, fw_size,
231748eccb9SHemant Agrawal 		       "%x-%d.%d.%d",
232748eccb9SHemant Agrawal 		       mc_plat_info.svr,
233748eccb9SHemant Agrawal 		       mc_ver_info.major,
234748eccb9SHemant Agrawal 		       mc_ver_info.minor,
235748eccb9SHemant Agrawal 		       mc_ver_info.revision);
236d345d6c9SFerruh Yigit 	if (ret < 0)
237d345d6c9SFerruh Yigit 		return -EINVAL;
238748eccb9SHemant Agrawal 
239748eccb9SHemant Agrawal 	ret += 1; /* add the size of '\0' */
240d345d6c9SFerruh Yigit 	if (fw_size < (size_t)ret)
241748eccb9SHemant Agrawal 		return ret;
242748eccb9SHemant Agrawal 	else
243748eccb9SHemant Agrawal 		return 0;
244748eccb9SHemant Agrawal }
245748eccb9SHemant Agrawal 
246bdad90d1SIvan Ilchenko static int
247*25d0ae62SJun Yang dpaa2_dev_info_get(struct rte_eth_dev *dev,
248*25d0ae62SJun Yang 	struct rte_eth_dev_info *dev_info)
2493e5a335dSHemant Agrawal {
2503e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
2513e5a335dSHemant Agrawal 
2523e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
2533e5a335dSHemant Agrawal 
25433fad432SHemant Agrawal 	dev_info->max_mac_addrs = priv->max_mac_filters;
255bee61d86SHemant Agrawal 	dev_info->max_rx_pktlen = DPAA2_MAX_RX_PKT_LEN;
256bee61d86SHemant Agrawal 	dev_info->min_rx_bufsize = DPAA2_MIN_RX_BUF_SIZE;
2573e5a335dSHemant Agrawal 	dev_info->max_rx_queues = (uint16_t)priv->nb_rx_queues;
2583e5a335dSHemant Agrawal 	dev_info->max_tx_queues = (uint16_t)priv->nb_tx_queues;
259175fe7d9SSunil Kumar Kori 	dev_info->rx_offload_capa = dev_rx_offloads_sup |
260175fe7d9SSunil Kumar Kori 					dev_rx_offloads_nodis;
261175fe7d9SSunil Kumar Kori 	dev_info->tx_offload_capa = dev_tx_offloads_sup |
262175fe7d9SSunil Kumar Kori 					dev_tx_offloads_nodis;
263295968d1SFerruh Yigit 	dev_info->speed_capa = RTE_ETH_LINK_SPEED_1G |
264295968d1SFerruh Yigit 			RTE_ETH_LINK_SPEED_2_5G |
265295968d1SFerruh Yigit 			RTE_ETH_LINK_SPEED_10G;
2662fe6f1b7SDmitry Kozlyuk 	dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP;
267762b275fSHemant Agrawal 
268762b275fSHemant Agrawal 	dev_info->max_hash_mac_addrs = 0;
269762b275fSHemant Agrawal 	dev_info->max_vfs = 0;
270295968d1SFerruh Yigit 	dev_info->max_vmdq_pools = RTE_ETH_16_POOLS;
271762b275fSHemant Agrawal 	dev_info->flow_type_rss_offloads = DPAA2_RSS_OFFLOAD_ALL;
272bdad90d1SIvan Ilchenko 
273e35ead33SHemant Agrawal 	dev_info->default_rxportconf.burst_size = dpaa2_dqrr_size;
274e35ead33SHemant Agrawal 	/* same is rx size for best perf */
275e35ead33SHemant Agrawal 	dev_info->default_txportconf.burst_size = dpaa2_dqrr_size;
276e35ead33SHemant Agrawal 
277e35ead33SHemant Agrawal 	dev_info->default_rxportconf.nb_queues = 1;
278e35ead33SHemant Agrawal 	dev_info->default_txportconf.nb_queues = 1;
279e35ead33SHemant Agrawal 	dev_info->default_txportconf.ring_size = CONG_ENTER_TX_THRESHOLD;
280e35ead33SHemant Agrawal 	dev_info->default_rxportconf.ring_size = DPAA2_RX_DEFAULT_NBDESC;
281e35ead33SHemant Agrawal 
2827e2c3f14SHemant Agrawal 	if (dpaa2_svr_family == SVR_LX2160A) {
283295968d1SFerruh Yigit 		dev_info->speed_capa |= RTE_ETH_LINK_SPEED_25G |
284295968d1SFerruh Yigit 				RTE_ETH_LINK_SPEED_40G |
285295968d1SFerruh Yigit 				RTE_ETH_LINK_SPEED_50G |
286295968d1SFerruh Yigit 				RTE_ETH_LINK_SPEED_100G;
2877e2c3f14SHemant Agrawal 	}
2887e2c3f14SHemant Agrawal 
289bdad90d1SIvan Ilchenko 	return 0;
2903e5a335dSHemant Agrawal }
2913e5a335dSHemant Agrawal 
2923e5a335dSHemant Agrawal static int
293ddbc2b66SApeksha Gupta dpaa2_dev_rx_burst_mode_get(struct rte_eth_dev *dev,
294ddbc2b66SApeksha Gupta 	__rte_unused uint16_t queue_id,
295ddbc2b66SApeksha Gupta 	struct rte_eth_burst_mode *mode)
296ddbc2b66SApeksha Gupta {
297ddbc2b66SApeksha Gupta 	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
298ddbc2b66SApeksha Gupta 	int ret = -EINVAL;
299ddbc2b66SApeksha Gupta 	unsigned int i;
300ddbc2b66SApeksha Gupta 	const struct burst_info {
301ddbc2b66SApeksha Gupta 		uint64_t flags;
302ddbc2b66SApeksha Gupta 		const char *output;
303ddbc2b66SApeksha Gupta 	} rx_offload_map[] = {
304295968d1SFerruh Yigit 			{RTE_ETH_RX_OFFLOAD_CHECKSUM, " Checksum,"},
305295968d1SFerruh Yigit 			{RTE_ETH_RX_OFFLOAD_SCTP_CKSUM, " SCTP csum,"},
306295968d1SFerruh Yigit 			{RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM, " Outer IPV4 csum,"},
307295968d1SFerruh Yigit 			{RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM, " Outer UDP csum,"},
308295968d1SFerruh Yigit 			{RTE_ETH_RX_OFFLOAD_VLAN_STRIP, " VLAN strip,"},
309295968d1SFerruh Yigit 			{RTE_ETH_RX_OFFLOAD_VLAN_FILTER, " VLAN filter,"},
310295968d1SFerruh Yigit 			{RTE_ETH_RX_OFFLOAD_TIMESTAMP, " Timestamp,"},
311295968d1SFerruh Yigit 			{RTE_ETH_RX_OFFLOAD_RSS_HASH, " RSS,"},
312295968d1SFerruh Yigit 			{RTE_ETH_RX_OFFLOAD_SCATTER, " Scattered,"}
313ddbc2b66SApeksha Gupta 	};
314ddbc2b66SApeksha Gupta 
315ddbc2b66SApeksha Gupta 	/* Update Rx offload info */
316ddbc2b66SApeksha Gupta 	for (i = 0; i < RTE_DIM(rx_offload_map); i++) {
317ddbc2b66SApeksha Gupta 		if (eth_conf->rxmode.offloads & rx_offload_map[i].flags) {
318ddbc2b66SApeksha Gupta 			snprintf(mode->info, sizeof(mode->info), "%s",
319ddbc2b66SApeksha Gupta 				rx_offload_map[i].output);
320ddbc2b66SApeksha Gupta 			ret = 0;
321ddbc2b66SApeksha Gupta 			break;
322ddbc2b66SApeksha Gupta 		}
323ddbc2b66SApeksha Gupta 	}
324ddbc2b66SApeksha Gupta 	return ret;
325ddbc2b66SApeksha Gupta }
326ddbc2b66SApeksha Gupta 
327ddbc2b66SApeksha Gupta static int
328ddbc2b66SApeksha Gupta dpaa2_dev_tx_burst_mode_get(struct rte_eth_dev *dev,
329ddbc2b66SApeksha Gupta 			__rte_unused uint16_t queue_id,
330ddbc2b66SApeksha Gupta 			struct rte_eth_burst_mode *mode)
331ddbc2b66SApeksha Gupta {
332ddbc2b66SApeksha Gupta 	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
333ddbc2b66SApeksha Gupta 	int ret = -EINVAL;
334ddbc2b66SApeksha Gupta 	unsigned int i;
335ddbc2b66SApeksha Gupta 	const struct burst_info {
336ddbc2b66SApeksha Gupta 		uint64_t flags;
337ddbc2b66SApeksha Gupta 		const char *output;
338ddbc2b66SApeksha Gupta 	} tx_offload_map[] = {
339295968d1SFerruh Yigit 			{RTE_ETH_TX_OFFLOAD_VLAN_INSERT, " VLAN Insert,"},
340295968d1SFerruh Yigit 			{RTE_ETH_TX_OFFLOAD_IPV4_CKSUM, " IPV4 csum,"},
341295968d1SFerruh Yigit 			{RTE_ETH_TX_OFFLOAD_UDP_CKSUM, " UDP csum,"},
342295968d1SFerruh Yigit 			{RTE_ETH_TX_OFFLOAD_TCP_CKSUM, " TCP csum,"},
343295968d1SFerruh Yigit 			{RTE_ETH_TX_OFFLOAD_SCTP_CKSUM, " SCTP csum,"},
344295968d1SFerruh Yigit 			{RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM, " Outer IPV4 csum,"},
345295968d1SFerruh Yigit 			{RTE_ETH_TX_OFFLOAD_MT_LOCKFREE, " MT lockfree,"},
346295968d1SFerruh Yigit 			{RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE, " MBUF free disable,"},
347295968d1SFerruh Yigit 			{RTE_ETH_TX_OFFLOAD_MULTI_SEGS, " Scattered,"}
348ddbc2b66SApeksha Gupta 	};
349ddbc2b66SApeksha Gupta 
350ddbc2b66SApeksha Gupta 	/* Update Tx offload info */
351ddbc2b66SApeksha Gupta 	for (i = 0; i < RTE_DIM(tx_offload_map); i++) {
352ddbc2b66SApeksha Gupta 		if (eth_conf->txmode.offloads & tx_offload_map[i].flags) {
353ddbc2b66SApeksha Gupta 			snprintf(mode->info, sizeof(mode->info), "%s",
354ddbc2b66SApeksha Gupta 				tx_offload_map[i].output);
355ddbc2b66SApeksha Gupta 			ret = 0;
356ddbc2b66SApeksha Gupta 			break;
357ddbc2b66SApeksha Gupta 		}
358ddbc2b66SApeksha Gupta 	}
359ddbc2b66SApeksha Gupta 	return ret;
360ddbc2b66SApeksha Gupta }
361ddbc2b66SApeksha Gupta 
362ddbc2b66SApeksha Gupta static int
3633e5a335dSHemant Agrawal dpaa2_alloc_rx_tx_queues(struct rte_eth_dev *dev)
3643e5a335dSHemant Agrawal {
3653e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
3663e5a335dSHemant Agrawal 	uint16_t dist_idx;
3673e5a335dSHemant Agrawal 	uint32_t vq_id;
3682d5f7f52SAshish Jain 	uint8_t num_rxqueue_per_tc;
3693e5a335dSHemant Agrawal 	struct dpaa2_queue *mc_q, *mcq;
3703e5a335dSHemant Agrawal 	uint32_t tot_queues;
37112d98eceSJun Yang 	int i, ret = 0;
3723e5a335dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
3733e5a335dSHemant Agrawal 
3743e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
3753e5a335dSHemant Agrawal 
3762d5f7f52SAshish Jain 	num_rxqueue_per_tc = (priv->nb_rx_queues / priv->num_rx_tc);
3778d21c563SHemant Agrawal 	if (priv->flags & DPAA2_TX_CONF_ENABLE)
3789ceacab7SPriyanka Jain 		tot_queues = priv->nb_rx_queues + 2 * priv->nb_tx_queues;
3799ceacab7SPriyanka Jain 	else
3803e5a335dSHemant Agrawal 		tot_queues = priv->nb_rx_queues + priv->nb_tx_queues;
3813e5a335dSHemant Agrawal 	mc_q = rte_malloc(NULL, sizeof(struct dpaa2_queue) * tot_queues,
3823e5a335dSHemant Agrawal 			  RTE_CACHE_LINE_SIZE);
3833e5a335dSHemant Agrawal 	if (!mc_q) {
384a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Memory allocation failed for rx/tx queues");
385*25d0ae62SJun Yang 		return -ENOBUFS;
3863e5a335dSHemant Agrawal 	}
3873e5a335dSHemant Agrawal 
3883e5a335dSHemant Agrawal 	for (i = 0; i < priv->nb_rx_queues; i++) {
38985ee5ddaSShreyansh Jain 		mc_q->eth_data = dev->data;
3903e5a335dSHemant Agrawal 		priv->rx_vq[i] = mc_q++;
39112d98eceSJun Yang 		dpaa2_q = priv->rx_vq[i];
39212d98eceSJun Yang 		ret = dpaa2_queue_storage_alloc(dpaa2_q,
39312d98eceSJun Yang 			RTE_MAX_LCORE);
39412d98eceSJun Yang 		if (ret)
3953cf50ff5SHemant Agrawal 			goto fail;
3963e5a335dSHemant Agrawal 	}
3973e5a335dSHemant Agrawal 
3984690a611SNipun Gupta 	if (dpaa2_enable_err_queue) {
3994690a611SNipun Gupta 		priv->rx_err_vq = rte_zmalloc("dpni_rx_err",
4004690a611SNipun Gupta 			sizeof(struct dpaa2_queue), 0);
401*25d0ae62SJun Yang 		if (!priv->rx_err_vq) {
402*25d0ae62SJun Yang 			ret = -ENOBUFS;
40329e5519dSWeiguo Li 			goto fail;
404*25d0ae62SJun Yang 		}
4054690a611SNipun Gupta 
40612d98eceSJun Yang 		dpaa2_q = priv->rx_err_vq;
40712d98eceSJun Yang 		ret = dpaa2_queue_storage_alloc(dpaa2_q,
40812d98eceSJun Yang 			RTE_MAX_LCORE);
40912d98eceSJun Yang 		if (ret)
4104690a611SNipun Gupta 			goto fail;
4114690a611SNipun Gupta 	}
4124690a611SNipun Gupta 
4133e5a335dSHemant Agrawal 	for (i = 0; i < priv->nb_tx_queues; i++) {
41485ee5ddaSShreyansh Jain 		mc_q->eth_data = dev->data;
415*25d0ae62SJun Yang 		mc_q->flow_id = DPAA2_INVALID_FLOW_ID;
4163e5a335dSHemant Agrawal 		priv->tx_vq[i] = mc_q++;
4177ae777d0SHemant Agrawal 		dpaa2_q = (struct dpaa2_queue *)priv->tx_vq[i];
4187ae777d0SHemant Agrawal 		dpaa2_q->cscn = rte_malloc(NULL,
4197ae777d0SHemant Agrawal 					   sizeof(struct qbman_result), 16);
420*25d0ae62SJun Yang 		if (!dpaa2_q->cscn) {
421*25d0ae62SJun Yang 			ret = -ENOBUFS;
4227ae777d0SHemant Agrawal 			goto fail_tx;
4233e5a335dSHemant Agrawal 		}
424*25d0ae62SJun Yang 	}
4253e5a335dSHemant Agrawal 
4268d21c563SHemant Agrawal 	if (priv->flags & DPAA2_TX_CONF_ENABLE) {
4279ceacab7SPriyanka Jain 		/*Setup tx confirmation queues*/
4289ceacab7SPriyanka Jain 		for (i = 0; i < priv->nb_tx_queues; i++) {
4299ceacab7SPriyanka Jain 			mc_q->eth_data = dev->data;
4309ceacab7SPriyanka Jain 			mc_q->tc_index = i;
4319ceacab7SPriyanka Jain 			mc_q->flow_id = 0;
4329ceacab7SPriyanka Jain 			priv->tx_conf_vq[i] = mc_q++;
43312d98eceSJun Yang 			dpaa2_q = priv->tx_conf_vq[i];
43412d98eceSJun Yang 			ret = dpaa2_queue_storage_alloc(dpaa2_q,
43512d98eceSJun Yang 					RTE_MAX_LCORE);
43612d98eceSJun Yang 			if (ret)
4379ceacab7SPriyanka Jain 				goto fail_tx_conf;
4389ceacab7SPriyanka Jain 		}
4399ceacab7SPriyanka Jain 	}
4409ceacab7SPriyanka Jain 
4413e5a335dSHemant Agrawal 	vq_id = 0;
442599017a2SHemant Agrawal 	for (dist_idx = 0; dist_idx < priv->nb_rx_queues; dist_idx++) {
44312d98eceSJun Yang 		mcq = priv->rx_vq[vq_id];
4442d5f7f52SAshish Jain 		mcq->tc_index = dist_idx / num_rxqueue_per_tc;
4452d5f7f52SAshish Jain 		mcq->flow_id = dist_idx % num_rxqueue_per_tc;
4463e5a335dSHemant Agrawal 		vq_id++;
4473e5a335dSHemant Agrawal 	}
4483e5a335dSHemant Agrawal 
4493e5a335dSHemant Agrawal 	return 0;
4509ceacab7SPriyanka Jain fail_tx_conf:
4519ceacab7SPriyanka Jain 	i -= 1;
4529ceacab7SPriyanka Jain 	while (i >= 0) {
45312d98eceSJun Yang 		dpaa2_q = priv->tx_conf_vq[i];
45412d98eceSJun Yang 		dpaa2_queue_storage_free(dpaa2_q, RTE_MAX_LCORE);
4559ceacab7SPriyanka Jain 		priv->tx_conf_vq[i--] = NULL;
4569ceacab7SPriyanka Jain 	}
4579ceacab7SPriyanka Jain 	i = priv->nb_tx_queues;
4587ae777d0SHemant Agrawal fail_tx:
4597ae777d0SHemant Agrawal 	i -= 1;
4607ae777d0SHemant Agrawal 	while (i >= 0) {
46112d98eceSJun Yang 		dpaa2_q = priv->tx_vq[i];
4627ae777d0SHemant Agrawal 		rte_free(dpaa2_q->cscn);
4637ae777d0SHemant Agrawal 		priv->tx_vq[i--] = NULL;
4647ae777d0SHemant Agrawal 	}
4657ae777d0SHemant Agrawal 	i = priv->nb_rx_queues;
4663e5a335dSHemant Agrawal fail:
4673e5a335dSHemant Agrawal 	i -= 1;
4683e5a335dSHemant Agrawal 	mc_q = priv->rx_vq[0];
4693e5a335dSHemant Agrawal 	while (i >= 0) {
47012d98eceSJun Yang 		dpaa2_q = priv->rx_vq[i];
47112d98eceSJun Yang 		dpaa2_queue_storage_free(dpaa2_q, RTE_MAX_LCORE);
4723e5a335dSHemant Agrawal 		priv->rx_vq[i--] = NULL;
4733e5a335dSHemant Agrawal 	}
4744690a611SNipun Gupta 
4754690a611SNipun Gupta 	if (dpaa2_enable_err_queue) {
47612d98eceSJun Yang 		dpaa2_q = priv->rx_err_vq;
47712d98eceSJun Yang 		dpaa2_queue_storage_free(dpaa2_q, RTE_MAX_LCORE);
4784690a611SNipun Gupta 	}
4794690a611SNipun Gupta 
4803e5a335dSHemant Agrawal 	rte_free(mc_q);
481*25d0ae62SJun Yang 	return ret;
4823e5a335dSHemant Agrawal }
4833e5a335dSHemant Agrawal 
4845d9a1e4dSHemant Agrawal static void
4855d9a1e4dSHemant Agrawal dpaa2_free_rx_tx_queues(struct rte_eth_dev *dev)
4865d9a1e4dSHemant Agrawal {
4875d9a1e4dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
4885d9a1e4dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
4895d9a1e4dSHemant Agrawal 	int i;
4905d9a1e4dSHemant Agrawal 
4915d9a1e4dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
4925d9a1e4dSHemant Agrawal 
4935d9a1e4dSHemant Agrawal 	/* Queue allocation base */
4945d9a1e4dSHemant Agrawal 	if (priv->rx_vq[0]) {
4955d9a1e4dSHemant Agrawal 		/* cleaning up queue storage */
4965d9a1e4dSHemant Agrawal 		for (i = 0; i < priv->nb_rx_queues; i++) {
49712d98eceSJun Yang 			dpaa2_q = priv->rx_vq[i];
49812d98eceSJun Yang 			dpaa2_queue_storage_free(dpaa2_q,
49912d98eceSJun Yang 				RTE_MAX_LCORE);
5005d9a1e4dSHemant Agrawal 		}
5015d9a1e4dSHemant Agrawal 		/* cleanup tx queue cscn */
5025d9a1e4dSHemant Agrawal 		for (i = 0; i < priv->nb_tx_queues; i++) {
50312d98eceSJun Yang 			dpaa2_q = priv->tx_vq[i];
5045d9a1e4dSHemant Agrawal 			rte_free(dpaa2_q->cscn);
5055d9a1e4dSHemant Agrawal 		}
5068d21c563SHemant Agrawal 		if (priv->flags & DPAA2_TX_CONF_ENABLE) {
5079ceacab7SPriyanka Jain 			/* cleanup tx conf queue storage */
5089ceacab7SPriyanka Jain 			for (i = 0; i < priv->nb_tx_queues; i++) {
50912d98eceSJun Yang 				dpaa2_q = priv->tx_conf_vq[i];
51012d98eceSJun Yang 				dpaa2_queue_storage_free(dpaa2_q,
51112d98eceSJun Yang 					RTE_MAX_LCORE);
5129ceacab7SPriyanka Jain 			}
5139ceacab7SPriyanka Jain 		}
5145d9a1e4dSHemant Agrawal 		/*free memory for all queues (RX+TX) */
5155d9a1e4dSHemant Agrawal 		rte_free(priv->rx_vq[0]);
5165d9a1e4dSHemant Agrawal 		priv->rx_vq[0] = NULL;
5175d9a1e4dSHemant Agrawal 	}
5185d9a1e4dSHemant Agrawal }
5195d9a1e4dSHemant Agrawal 
5203e5a335dSHemant Agrawal static int
5213e5a335dSHemant Agrawal dpaa2_eth_dev_configure(struct rte_eth_dev *dev)
5223e5a335dSHemant Agrawal {
52321ce788cSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
52481c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = dev->process_private;
52521ce788cSHemant Agrawal 	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
5260ebce612SSunil Kumar Kori 	uint64_t rx_offloads = eth_conf->rxmode.offloads;
5270ebce612SSunil Kumar Kori 	uint64_t tx_offloads = eth_conf->txmode.offloads;
5280ebce612SSunil Kumar Kori 	int rx_l3_csum_offload = false;
5290ebce612SSunil Kumar Kori 	int rx_l4_csum_offload = false;
5300ebce612SSunil Kumar Kori 	int tx_l3_csum_offload = false;
5310ebce612SSunil Kumar Kori 	int tx_l4_csum_offload = false;
532271f5aeeSJun Yang 	int ret, tc_index;
5331bb4a528SFerruh Yigit 	uint32_t max_rx_pktlen;
5342013e308SVanshika Shukla #if defined(RTE_LIBRTE_IEEE1588)
5352013e308SVanshika Shukla 	uint16_t ptp_correction_offset;
5362013e308SVanshika Shukla #endif
5373e5a335dSHemant Agrawal 
5383e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
5393e5a335dSHemant Agrawal 
5407bdf45f9SHemant Agrawal 	/* Rx offloads which are enabled by default */
541175fe7d9SSunil Kumar Kori 	if (dev_rx_offloads_nodis & ~rx_offloads) {
5427bdf45f9SHemant Agrawal 		DPAA2_PMD_INFO(
5437bdf45f9SHemant Agrawal 		"Some of rx offloads enabled by default - requested 0x%" PRIx64
5447bdf45f9SHemant Agrawal 		" fixed are 0x%" PRIx64,
545175fe7d9SSunil Kumar Kori 		rx_offloads, dev_rx_offloads_nodis);
546175fe7d9SSunil Kumar Kori 	}
5470ebce612SSunil Kumar Kori 
5487bdf45f9SHemant Agrawal 	/* Tx offloads which are enabled by default */
549175fe7d9SSunil Kumar Kori 	if (dev_tx_offloads_nodis & ~tx_offloads) {
5507bdf45f9SHemant Agrawal 		DPAA2_PMD_INFO(
5517bdf45f9SHemant Agrawal 		"Some of tx offloads enabled by default - requested 0x%" PRIx64
5527bdf45f9SHemant Agrawal 		" fixed are 0x%" PRIx64,
553175fe7d9SSunil Kumar Kori 		tx_offloads, dev_tx_offloads_nodis);
554175fe7d9SSunil Kumar Kori 	}
5550ebce612SSunil Kumar Kori 
5561bb4a528SFerruh Yigit 	max_rx_pktlen = eth_conf->rxmode.mtu + RTE_ETHER_HDR_LEN +
5571bb4a528SFerruh Yigit 				RTE_ETHER_CRC_LEN + VLAN_TAG_SIZE;
5581bb4a528SFerruh Yigit 	if (max_rx_pktlen <= DPAA2_MAX_RX_PKT_LEN) {
55944ea7355SAshish Jain 		ret = dpni_set_max_frame_length(dpni, CMD_PRI_LOW,
5601bb4a528SFerruh Yigit 			priv->token, max_rx_pktlen - RTE_ETHER_CRC_LEN);
5611bb4a528SFerruh Yigit 		if (ret != 0) {
5621bb4a528SFerruh Yigit 			DPAA2_PMD_ERR("Unable to set mtu. check config");
563e1640849SHemant Agrawal 			return ret;
564e1640849SHemant Agrawal 		}
565de08b474SApeksha Gupta 		DPAA2_PMD_DEBUG("MTU configured for the device: %d",
56679ef9825SHemant Agrawal 				dev->data->mtu);
567e1640849SHemant Agrawal 	} else {
568de08b474SApeksha Gupta 		DPAA2_PMD_ERR("Configured mtu %d and calculated max-pkt-len is %d which should be <= %d",
569de08b474SApeksha Gupta 			eth_conf->rxmode.mtu, max_rx_pktlen, DPAA2_MAX_RX_PKT_LEN);
570e1640849SHemant Agrawal 		return -1;
571e1640849SHemant Agrawal 	}
572e1640849SHemant Agrawal 
573295968d1SFerruh Yigit 	if (eth_conf->rxmode.mq_mode == RTE_ETH_MQ_RX_RSS) {
574271f5aeeSJun Yang 		for (tc_index = 0; tc_index < priv->num_rx_tc; tc_index++) {
57589c2ea8fSHemant Agrawal 			ret = dpaa2_setup_flow_dist(dev,
576271f5aeeSJun Yang 					eth_conf->rx_adv_conf.rss_conf.rss_hf,
577271f5aeeSJun Yang 					tc_index);
57889c2ea8fSHemant Agrawal 			if (ret) {
579271f5aeeSJun Yang 				DPAA2_PMD_ERR(
580271f5aeeSJun Yang 					"Unable to set flow distribution on tc%d."
581271f5aeeSJun Yang 					"Check queue config", tc_index);
58289c2ea8fSHemant Agrawal 				return ret;
58389c2ea8fSHemant Agrawal 			}
58489c2ea8fSHemant Agrawal 		}
585271f5aeeSJun Yang 	}
586c5acbb5eSHemant Agrawal 
587295968d1SFerruh Yigit 	if (rx_offloads & RTE_ETH_RX_OFFLOAD_IPV4_CKSUM)
5880ebce612SSunil Kumar Kori 		rx_l3_csum_offload = true;
5890ebce612SSunil Kumar Kori 
590295968d1SFerruh Yigit 	if ((rx_offloads & RTE_ETH_RX_OFFLOAD_UDP_CKSUM) ||
591295968d1SFerruh Yigit 		(rx_offloads & RTE_ETH_RX_OFFLOAD_TCP_CKSUM) ||
592295968d1SFerruh Yigit 		(rx_offloads & RTE_ETH_RX_OFFLOAD_SCTP_CKSUM))
5930ebce612SSunil Kumar Kori 		rx_l4_csum_offload = true;
59421ce788cSHemant Agrawal 
59521ce788cSHemant Agrawal 	ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token,
5960ebce612SSunil Kumar Kori 			       DPNI_OFF_RX_L3_CSUM, rx_l3_csum_offload);
59721ce788cSHemant Agrawal 	if (ret) {
598a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error to set RX l3 csum:Error = %d", ret);
59921ce788cSHemant Agrawal 		return ret;
60021ce788cSHemant Agrawal 	}
60121ce788cSHemant Agrawal 
60221ce788cSHemant Agrawal 	ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token,
6030ebce612SSunil Kumar Kori 			       DPNI_OFF_RX_L4_CSUM, rx_l4_csum_offload);
60421ce788cSHemant Agrawal 	if (ret) {
605a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error to get RX l4 csum:Error = %d", ret);
60621ce788cSHemant Agrawal 		return ret;
60721ce788cSHemant Agrawal 	}
60821ce788cSHemant Agrawal 
6097eaf1323SGagandeep Singh #if !defined(RTE_LIBRTE_IEEE1588)
610295968d1SFerruh Yigit 	if (rx_offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP)
6117eaf1323SGagandeep Singh #endif
61261c41e2eSThomas Monjalon 	{
61361c41e2eSThomas Monjalon 		ret = rte_mbuf_dyn_rx_timestamp_register(
61461c41e2eSThomas Monjalon 				&dpaa2_timestamp_dynfield_offset,
61561c41e2eSThomas Monjalon 				&dpaa2_timestamp_rx_dynflag);
61661c41e2eSThomas Monjalon 		if (ret != 0) {
61761c41e2eSThomas Monjalon 			DPAA2_PMD_ERR("Error to register timestamp field/flag");
61861c41e2eSThomas Monjalon 			return -rte_errno;
61961c41e2eSThomas Monjalon 		}
620724f79dfSHemant Agrawal 		dpaa2_enable_ts[dev->data->port_id] = true;
62161c41e2eSThomas Monjalon 	}
62220196043SHemant Agrawal 
6232013e308SVanshika Shukla #if defined(RTE_LIBRTE_IEEE1588)
6242013e308SVanshika Shukla 	/* By default setting ptp correction offset for Ethernet SYNC packets */
6252013e308SVanshika Shukla 	ptp_correction_offset = RTE_ETHER_HDR_LEN + 8;
6262013e308SVanshika Shukla 	rte_pmd_dpaa2_set_one_step_ts(dev->data->port_id, ptp_correction_offset, 0);
6272013e308SVanshika Shukla #endif
628295968d1SFerruh Yigit 	if (tx_offloads & RTE_ETH_TX_OFFLOAD_IPV4_CKSUM)
6290ebce612SSunil Kumar Kori 		tx_l3_csum_offload = true;
6300ebce612SSunil Kumar Kori 
631295968d1SFerruh Yigit 	if ((tx_offloads & RTE_ETH_TX_OFFLOAD_UDP_CKSUM) ||
632295968d1SFerruh Yigit 		(tx_offloads & RTE_ETH_TX_OFFLOAD_TCP_CKSUM) ||
633295968d1SFerruh Yigit 		(tx_offloads & RTE_ETH_TX_OFFLOAD_SCTP_CKSUM))
6340ebce612SSunil Kumar Kori 		tx_l4_csum_offload = true;
6350ebce612SSunil Kumar Kori 
63621ce788cSHemant Agrawal 	ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token,
6370ebce612SSunil Kumar Kori 			       DPNI_OFF_TX_L3_CSUM, tx_l3_csum_offload);
63821ce788cSHemant Agrawal 	if (ret) {
639a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error to set TX l3 csum:Error = %d", ret);
64021ce788cSHemant Agrawal 		return ret;
64121ce788cSHemant Agrawal 	}
64221ce788cSHemant Agrawal 
64321ce788cSHemant Agrawal 	ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token,
6440ebce612SSunil Kumar Kori 			       DPNI_OFF_TX_L4_CSUM, tx_l4_csum_offload);
64521ce788cSHemant Agrawal 	if (ret) {
646a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error to get TX l4 csum:Error = %d", ret);
64721ce788cSHemant Agrawal 		return ret;
64821ce788cSHemant Agrawal 	}
64921ce788cSHemant Agrawal 
650ffb3389cSNipun Gupta 	/* Enabling hash results in FD requires setting DPNI_FLCTYPE_HASH in
651ffb3389cSNipun Gupta 	 * dpni_set_offload API. Setting this FLCTYPE for DPNI sets the FD[SC]
652ffb3389cSNipun Gupta 	 * to 0 for LS2 in the hardware thus disabling data/annotation
653ffb3389cSNipun Gupta 	 * stashing. For LX2 this is fixed in hardware and thus hash result and
654ffb3389cSNipun Gupta 	 * parse results can be received in FD using this option.
655ffb3389cSNipun Gupta 	 */
656ffb3389cSNipun Gupta 	if (dpaa2_svr_family == SVR_LX2160A) {
657ffb3389cSNipun Gupta 		ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token,
658ffb3389cSNipun Gupta 				       DPNI_FLCTYPE_HASH, true);
659ffb3389cSNipun Gupta 		if (ret) {
660a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("Error setting FLCTYPE: Err = %d", ret);
661ffb3389cSNipun Gupta 			return ret;
662ffb3389cSNipun Gupta 		}
663ffb3389cSNipun Gupta 	}
664ffb3389cSNipun Gupta 
665295968d1SFerruh Yigit 	if (rx_offloads & RTE_ETH_RX_OFFLOAD_VLAN_FILTER)
666295968d1SFerruh Yigit 		dpaa2_vlan_offload_set(dev, RTE_ETH_VLAN_FILTER_MASK);
667c172f85eSHemant Agrawal 
668f023d059SJun Yang 	if (eth_conf->lpbk_mode) {
669f023d059SJun Yang 		ret = dpaa2_dev_recycle_config(dev);
670f023d059SJun Yang 		if (ret) {
671f023d059SJun Yang 			DPAA2_PMD_ERR("Error to configure %s to recycle port.",
672f023d059SJun Yang 				dev->data->name);
673f023d059SJun Yang 
674f023d059SJun Yang 			return ret;
675f023d059SJun Yang 		}
676f023d059SJun Yang 	} else {
677f023d059SJun Yang 		/** User may disable loopback mode by calling
678f023d059SJun Yang 		 * "dev_configure" with lpbk_mode cleared.
679f023d059SJun Yang 		 * No matter the port was configured recycle or not,
680f023d059SJun Yang 		 * recycle de-configure is called here.
681f023d059SJun Yang 		 * If port is not recycled, the de-configure will return directly.
682f023d059SJun Yang 		 */
683f023d059SJun Yang 		ret = dpaa2_dev_recycle_deconfig(dev);
684f023d059SJun Yang 		if (ret) {
685f023d059SJun Yang 			DPAA2_PMD_ERR("Error to de-configure recycle port %s.",
686f023d059SJun Yang 				dev->data->name);
687f023d059SJun Yang 
688f023d059SJun Yang 			return ret;
689f023d059SJun Yang 		}
690f023d059SJun Yang 	}
691f023d059SJun Yang 
692ac624068SGagandeep Singh 	dpaa2_tm_init(dev);
693ac624068SGagandeep Singh 
6943e5a335dSHemant Agrawal 	return 0;
6953e5a335dSHemant Agrawal }
6963e5a335dSHemant Agrawal 
6973e5a335dSHemant Agrawal /* Function to setup RX flow information. It contains traffic class ID,
6983e5a335dSHemant Agrawal  * flow ID, destination configuration etc.
6993e5a335dSHemant Agrawal  */
7003e5a335dSHemant Agrawal static int
7013e5a335dSHemant Agrawal dpaa2_dev_rx_queue_setup(struct rte_eth_dev *dev,
7023e5a335dSHemant Agrawal 	uint16_t rx_queue_id,
70313b856acSHemant Agrawal 	uint16_t nb_rx_desc,
7043e5a335dSHemant Agrawal 	unsigned int socket_id __rte_unused,
705988a7c38SHemant Agrawal 	const struct rte_eth_rxconf *rx_conf,
7063e5a335dSHemant Agrawal 	struct rte_mempool *mb_pool)
7073e5a335dSHemant Agrawal {
7083e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
709*25d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
7103e5a335dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
7113e5a335dSHemant Agrawal 	struct dpni_queue cfg;
7123e5a335dSHemant Agrawal 	uint8_t options = 0;
7133e5a335dSHemant Agrawal 	uint8_t flow_id;
714bee61d86SHemant Agrawal 	uint32_t bpid;
71513b856acSHemant Agrawal 	int i, ret;
7163e5a335dSHemant Agrawal 
7173e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
7183e5a335dSHemant Agrawal 
719a10a988aSShreyansh Jain 	DPAA2_PMD_DEBUG("dev =%p, queue =%d, pool = %p, conf =%p",
7203e5a335dSHemant Agrawal 			dev, rx_queue_id, mb_pool, rx_conf);
7213e5a335dSHemant Agrawal 
72235dc25d1SRohit Raj 	total_nb_rx_desc += nb_rx_desc;
72335dc25d1SRohit Raj 	if (total_nb_rx_desc > MAX_NB_RX_DESC) {
724f665790aSDavid Marchand 		DPAA2_PMD_WARN("Total nb_rx_desc exceeds %d limit. Please use Normal buffers",
72535dc25d1SRohit Raj 			       MAX_NB_RX_DESC);
72635dc25d1SRohit Raj 		DPAA2_PMD_WARN("To use Normal buffers, run 'export DPNI_NORMAL_BUF=1' before running dynamic_dpl.sh script");
72735dc25d1SRohit Raj 	}
72835dc25d1SRohit Raj 
729988a7c38SHemant Agrawal 	/* Rx deferred start is not supported */
730988a7c38SHemant Agrawal 	if (rx_conf->rx_deferred_start) {
731*25d0ae62SJun Yang 		DPAA2_PMD_ERR("%s:Rx deferred start not supported",
732*25d0ae62SJun Yang 			dev->data->name);
733988a7c38SHemant Agrawal 		return -EINVAL;
734988a7c38SHemant Agrawal 	}
735988a7c38SHemant Agrawal 
736bee61d86SHemant Agrawal 	if (!priv->bp_list || priv->bp_list->mp != mb_pool) {
7376ac5a55bSJun Yang 		if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
7386ac5a55bSJun Yang 			ret = rte_dpaa2_bpid_info_init(mb_pool);
7396ac5a55bSJun Yang 			if (ret)
7406ac5a55bSJun Yang 				return ret;
7416ac5a55bSJun Yang 		}
742bee61d86SHemant Agrawal 		bpid = mempool_to_bpid(mb_pool);
7436ac5a55bSJun Yang 		ret = dpaa2_attach_bp_list(priv, dpni,
744bee61d86SHemant Agrawal 				rte_dpaa2_bpid_info[bpid].bp_list);
745bee61d86SHemant Agrawal 		if (ret)
746bee61d86SHemant Agrawal 			return ret;
747bee61d86SHemant Agrawal 	}
748*25d0ae62SJun Yang 	dpaa2_q = priv->rx_vq[rx_queue_id];
7493e5a335dSHemant Agrawal 	dpaa2_q->mb_pool = mb_pool; /**< mbuf pool to populate RX ring. */
750109df460SShreyansh Jain 	dpaa2_q->bp_array = rte_dpaa2_bpid_info;
751de1d70f0SHemant Agrawal 	dpaa2_q->nb_desc = UINT16_MAX;
752de1d70f0SHemant Agrawal 	dpaa2_q->offloads = rx_conf->offloads;
7533e5a335dSHemant Agrawal 
754599017a2SHemant Agrawal 	/*Get the flow id from given VQ id*/
75513b856acSHemant Agrawal 	flow_id = dpaa2_q->flow_id;
7563e5a335dSHemant Agrawal 	memset(&cfg, 0, sizeof(struct dpni_queue));
7573e5a335dSHemant Agrawal 
7583e5a335dSHemant Agrawal 	options = options | DPNI_QUEUE_OPT_USER_CTX;
7595ae1edffSHemant Agrawal 	cfg.user_context = (size_t)(dpaa2_q);
7603e5a335dSHemant Agrawal 
76113b856acSHemant Agrawal 	/* check if a private cgr available. */
76213b856acSHemant Agrawal 	for (i = 0; i < priv->max_cgs; i++) {
76313b856acSHemant Agrawal 		if (!priv->cgid_in_use[i]) {
76413b856acSHemant Agrawal 			priv->cgid_in_use[i] = 1;
76513b856acSHemant Agrawal 			break;
76613b856acSHemant Agrawal 		}
76713b856acSHemant Agrawal 	}
76813b856acSHemant Agrawal 
76913b856acSHemant Agrawal 	if (i < priv->max_cgs) {
77013b856acSHemant Agrawal 		options |= DPNI_QUEUE_OPT_SET_CGID;
77113b856acSHemant Agrawal 		cfg.cgid = i;
77213b856acSHemant Agrawal 		dpaa2_q->cgid = cfg.cgid;
77313b856acSHemant Agrawal 	} else {
774*25d0ae62SJun Yang 		dpaa2_q->cgid = DPAA2_INVALID_CGID;
77513b856acSHemant Agrawal 	}
77613b856acSHemant Agrawal 
77737529eceSHemant Agrawal 	/*if ls2088 or rev2 device, enable the stashing */
77830db823eSHemant Agrawal 
779e0ded73bSHemant Agrawal 	if ((dpaa2_svr_family & 0xffff0000) != SVR_LS2080A) {
78037529eceSHemant Agrawal 		options |= DPNI_QUEUE_OPT_FLC;
78137529eceSHemant Agrawal 		cfg.flc.stash_control = true;
782c794f2caSJun Yang 		dpaa2_flc_stashing_clear_all(&cfg.flc.value);
783c794f2caSJun Yang 		if (getenv("DPAA2_DATA_STASHING_OFF")) {
784c794f2caSJun Yang 			dpaa2_flc_stashing_set(DPAA2_FLC_DATA_STASHING, 0,
785c794f2caSJun Yang 				&cfg.flc.value);
786c794f2caSJun Yang 			dpaa2_q->data_stashing_off = 1;
787c794f2caSJun Yang 		} else {
788c794f2caSJun Yang 			dpaa2_flc_stashing_set(DPAA2_FLC_DATA_STASHING, 1,
789c794f2caSJun Yang 				&cfg.flc.value);
790c794f2caSJun Yang 			dpaa2_q->data_stashing_off = 0;
791c794f2caSJun Yang 		}
792c794f2caSJun Yang 		if ((dpaa2_svr_family & 0xffff0000) != SVR_LX2160A) {
793c794f2caSJun Yang 			dpaa2_flc_stashing_set(DPAA2_FLC_ANNO_STASHING, 1,
794c794f2caSJun Yang 				&cfg.flc.value);
795c794f2caSJun Yang 		}
79637529eceSHemant Agrawal 	}
7973e5a335dSHemant Agrawal 	ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token, DPNI_QUEUE_RX,
7983e5a335dSHemant Agrawal 			dpaa2_q->tc_index, flow_id, options, &cfg);
7993e5a335dSHemant Agrawal 	if (ret) {
800a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error in setting the rx flow: = %d", ret);
801*25d0ae62SJun Yang 		return ret;
8023e5a335dSHemant Agrawal 	}
8033e5a335dSHemant Agrawal 
80423d6a87eSHemant Agrawal 	if (!(priv->flags & DPAA2_RX_TAILDROP_OFF)) {
80523d6a87eSHemant Agrawal 		struct dpni_taildrop taildrop;
80623d6a87eSHemant Agrawal 
80723d6a87eSHemant Agrawal 		taildrop.enable = 1;
808de1d70f0SHemant Agrawal 		dpaa2_q->nb_desc = nb_rx_desc;
80913b856acSHemant Agrawal 		/* Private CGR will use tail drop length as nb_rx_desc.
81013b856acSHemant Agrawal 		 * for rest cases we can use standard byte based tail drop.
81113b856acSHemant Agrawal 		 * There is no HW restriction, but number of CGRs are limited,
81213b856acSHemant Agrawal 		 * hence this restriction is placed.
81313b856acSHemant Agrawal 		 */
814*25d0ae62SJun Yang 		if (dpaa2_q->cgid != DPAA2_INVALID_CGID) {
81523d6a87eSHemant Agrawal 			/*enabling per rx queue congestion control */
81613b856acSHemant Agrawal 			taildrop.threshold = nb_rx_desc;
81713b856acSHemant Agrawal 			taildrop.units = DPNI_CONGESTION_UNIT_FRAMES;
81813b856acSHemant Agrawal 			taildrop.oal = 0;
81913b856acSHemant Agrawal 			DPAA2_PMD_DEBUG("Enabling CG Tail Drop on queue = %d",
82013b856acSHemant Agrawal 					rx_queue_id);
82113b856acSHemant Agrawal 			ret = dpni_set_taildrop(dpni, CMD_PRI_LOW, priv->token,
82213b856acSHemant Agrawal 						DPNI_CP_CONGESTION_GROUP,
82313b856acSHemant Agrawal 						DPNI_QUEUE_RX,
82413b856acSHemant Agrawal 						dpaa2_q->tc_index,
8257a3a9d56SJun Yang 						dpaa2_q->cgid, &taildrop);
82613b856acSHemant Agrawal 		} else {
82713b856acSHemant Agrawal 			/*enabling per rx queue congestion control */
82813b856acSHemant Agrawal 			taildrop.threshold = CONG_THRESHOLD_RX_BYTES_Q;
82923d6a87eSHemant Agrawal 			taildrop.units = DPNI_CONGESTION_UNIT_BYTES;
830d47f0292SHemant Agrawal 			taildrop.oal = CONG_RX_OAL;
83113b856acSHemant Agrawal 			DPAA2_PMD_DEBUG("Enabling Byte based Drop on queue= %d",
83223d6a87eSHemant Agrawal 					rx_queue_id);
83323d6a87eSHemant Agrawal 			ret = dpni_set_taildrop(dpni, CMD_PRI_LOW, priv->token,
83423d6a87eSHemant Agrawal 						DPNI_CP_QUEUE, DPNI_QUEUE_RX,
83513b856acSHemant Agrawal 						dpaa2_q->tc_index, flow_id,
83613b856acSHemant Agrawal 						&taildrop);
83713b856acSHemant Agrawal 		}
83813b856acSHemant Agrawal 		if (ret) {
83913b856acSHemant Agrawal 			DPAA2_PMD_ERR("Error in setting taildrop. err=(%d)",
84013b856acSHemant Agrawal 				ret);
841*25d0ae62SJun Yang 			return ret;
84213b856acSHemant Agrawal 		}
84313b856acSHemant Agrawal 	} else { /* Disable tail Drop */
84413b856acSHemant Agrawal 		struct dpni_taildrop taildrop = {0};
84513b856acSHemant Agrawal 		DPAA2_PMD_INFO("Tail drop is disabled on queue");
84613b856acSHemant Agrawal 
84713b856acSHemant Agrawal 		taildrop.enable = 0;
848*25d0ae62SJun Yang 		if (dpaa2_q->cgid != DPAA2_INVALID_CGID) {
84913b856acSHemant Agrawal 			ret = dpni_set_taildrop(dpni, CMD_PRI_LOW, priv->token,
85013b856acSHemant Agrawal 					DPNI_CP_CONGESTION_GROUP, DPNI_QUEUE_RX,
85113b856acSHemant Agrawal 					dpaa2_q->tc_index,
8527a3a9d56SJun Yang 					dpaa2_q->cgid, &taildrop);
85313b856acSHemant Agrawal 		} else {
85413b856acSHemant Agrawal 			ret = dpni_set_taildrop(dpni, CMD_PRI_LOW, priv->token,
85513b856acSHemant Agrawal 					DPNI_CP_QUEUE, DPNI_QUEUE_RX,
85623d6a87eSHemant Agrawal 					dpaa2_q->tc_index, flow_id, &taildrop);
85713b856acSHemant Agrawal 		}
85823d6a87eSHemant Agrawal 		if (ret) {
859a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("Error in setting taildrop. err=(%d)",
860a10a988aSShreyansh Jain 				ret);
861*25d0ae62SJun Yang 			return ret;
86223d6a87eSHemant Agrawal 		}
86323d6a87eSHemant Agrawal 	}
86423d6a87eSHemant Agrawal 
8653e5a335dSHemant Agrawal 	dev->data->rx_queues[rx_queue_id] = dpaa2_q;
8663e5a335dSHemant Agrawal 	return 0;
8673e5a335dSHemant Agrawal }
8683e5a335dSHemant Agrawal 
8693e5a335dSHemant Agrawal static int
8703e5a335dSHemant Agrawal dpaa2_dev_tx_queue_setup(struct rte_eth_dev *dev,
8713e5a335dSHemant Agrawal 	uint16_t tx_queue_id,
872b5869095SHemant Agrawal 	uint16_t nb_tx_desc,
8733e5a335dSHemant Agrawal 	unsigned int socket_id __rte_unused,
874988a7c38SHemant Agrawal 	const struct rte_eth_txconf *tx_conf)
8753e5a335dSHemant Agrawal {
8763e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
877*25d0ae62SJun Yang 	struct dpaa2_queue *dpaa2_q = priv->tx_vq[tx_queue_id];
878*25d0ae62SJun Yang 	struct dpaa2_queue *dpaa2_tx_conf_q = priv->tx_conf_vq[tx_queue_id];
87981c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = dev->process_private;
8803e5a335dSHemant Agrawal 	struct dpni_queue tx_conf_cfg;
8813e5a335dSHemant Agrawal 	struct dpni_queue tx_flow_cfg;
8823e5a335dSHemant Agrawal 	uint8_t options = 0, flow_id;
883591200efSGagandeep Singh 	uint8_t ceetm_ch_idx;
88472100f0dSGagandeep Singh 	uint16_t channel_id;
885e26bf82eSSachin Saxena 	struct dpni_queue_id qid;
8863e5a335dSHemant Agrawal 	uint32_t tc_id;
8873e5a335dSHemant Agrawal 	int ret;
888*25d0ae62SJun Yang 	uint64_t iova;
8893e5a335dSHemant Agrawal 
8903e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
8913e5a335dSHemant Agrawal 
892988a7c38SHemant Agrawal 	/* Tx deferred start is not supported */
893988a7c38SHemant Agrawal 	if (tx_conf->tx_deferred_start) {
894*25d0ae62SJun Yang 		DPAA2_PMD_ERR("%s:Tx deferred start not supported",
895*25d0ae62SJun Yang 			dev->data->name);
896988a7c38SHemant Agrawal 		return -EINVAL;
897988a7c38SHemant Agrawal 	}
898988a7c38SHemant Agrawal 
899de1d70f0SHemant Agrawal 	dpaa2_q->nb_desc = UINT16_MAX;
900de1d70f0SHemant Agrawal 	dpaa2_q->offloads = tx_conf->offloads;
901de1d70f0SHemant Agrawal 
9023e5a335dSHemant Agrawal 	/* Return if queue already configured */
903*25d0ae62SJun Yang 	if (dpaa2_q->flow_id != DPAA2_INVALID_FLOW_ID) {
904f9989673SAkhil Goyal 		dev->data->tx_queues[tx_queue_id] = dpaa2_q;
9053e5a335dSHemant Agrawal 		return 0;
906f9989673SAkhil Goyal 	}
9073e5a335dSHemant Agrawal 
9083e5a335dSHemant Agrawal 	memset(&tx_conf_cfg, 0, sizeof(struct dpni_queue));
9093e5a335dSHemant Agrawal 	memset(&tx_flow_cfg, 0, sizeof(struct dpni_queue));
9103e5a335dSHemant Agrawal 
911591200efSGagandeep Singh 	if (!tx_queue_id) {
912591200efSGagandeep Singh 		for (ceetm_ch_idx = 0;
913591200efSGagandeep Singh 			ceetm_ch_idx <= (priv->num_channels - 1);
914591200efSGagandeep Singh 			ceetm_ch_idx++) {
9153e5a335dSHemant Agrawal 			/*Set tx-conf and error configuration*/
916591200efSGagandeep Singh 			if (priv->flags & DPAA2_TX_CONF_ENABLE) {
917591200efSGagandeep Singh 				ret = dpni_set_tx_confirmation_mode(dpni,
918591200efSGagandeep Singh 						CMD_PRI_LOW, priv->token,
919591200efSGagandeep Singh 						ceetm_ch_idx,
9209ceacab7SPriyanka Jain 						DPNI_CONF_AFFINE);
921591200efSGagandeep Singh 			} else {
922591200efSGagandeep Singh 				ret = dpni_set_tx_confirmation_mode(dpni,
923591200efSGagandeep Singh 						CMD_PRI_LOW, priv->token,
924591200efSGagandeep Singh 						ceetm_ch_idx,
9253e5a335dSHemant Agrawal 						DPNI_CONF_DISABLE);
926591200efSGagandeep Singh 			}
9273e5a335dSHemant Agrawal 			if (ret) {
928591200efSGagandeep Singh 				DPAA2_PMD_ERR("Error(%d) in tx conf setting",
929591200efSGagandeep Singh 					ret);
930591200efSGagandeep Singh 				return ret;
931591200efSGagandeep Singh 			}
9323e5a335dSHemant Agrawal 		}
9333e5a335dSHemant Agrawal 	}
93472100f0dSGagandeep Singh 
93572100f0dSGagandeep Singh 	tc_id = tx_queue_id % priv->num_tx_tc;
93672100f0dSGagandeep Singh 	channel_id = (uint8_t)(tx_queue_id / priv->num_tx_tc) % priv->num_channels;
93772100f0dSGagandeep Singh 	flow_id = 0;
93872100f0dSGagandeep Singh 
93972100f0dSGagandeep Singh 	ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token, DPNI_QUEUE_TX,
94072100f0dSGagandeep Singh 			((channel_id << 8) | tc_id), flow_id, options, &tx_flow_cfg);
94172100f0dSGagandeep Singh 	if (ret) {
94272100f0dSGagandeep Singh 		DPAA2_PMD_ERR("Error in setting the tx flow: "
94372100f0dSGagandeep Singh 			"tc_id=%d, flow=%d err=%d",
94472100f0dSGagandeep Singh 			tc_id, flow_id, ret);
945*25d0ae62SJun Yang 			return ret;
94672100f0dSGagandeep Singh 	}
94772100f0dSGagandeep Singh 
94872100f0dSGagandeep Singh 	dpaa2_q->flow_id = flow_id;
94972100f0dSGagandeep Singh 
9503e5a335dSHemant Agrawal 	dpaa2_q->tc_index = tc_id;
9513e5a335dSHemant Agrawal 
952e26bf82eSSachin Saxena 	ret = dpni_get_queue(dpni, CMD_PRI_LOW, priv->token,
95372100f0dSGagandeep Singh 			DPNI_QUEUE_TX, ((channel_id << 8) | dpaa2_q->tc_index),
954e26bf82eSSachin Saxena 			dpaa2_q->flow_id, &tx_flow_cfg, &qid);
955e26bf82eSSachin Saxena 	if (ret) {
956e26bf82eSSachin Saxena 		DPAA2_PMD_ERR("Error in getting LFQID err=%d", ret);
957*25d0ae62SJun Yang 		return ret;
958e26bf82eSSachin Saxena 	}
959e26bf82eSSachin Saxena 	dpaa2_q->fqid = qid.fqid;
960e26bf82eSSachin Saxena 
961a0840963SHemant Agrawal 	if (!(priv->flags & DPAA2_TX_CGR_OFF)) {
96213b856acSHemant Agrawal 		struct dpni_congestion_notification_cfg cong_notif_cfg = {0};
9637ae777d0SHemant Agrawal 
964de1d70f0SHemant Agrawal 		dpaa2_q->nb_desc = nb_tx_desc;
965de1d70f0SHemant Agrawal 
96629dfa62fSHemant Agrawal 		cong_notif_cfg.units = DPNI_CONGESTION_UNIT_FRAMES;
967b5869095SHemant Agrawal 		cong_notif_cfg.threshold_entry = nb_tx_desc;
9687ae777d0SHemant Agrawal 		/* Notify that the queue is not congested when the data in
9697be78d02SJosh Soref 		 * the queue is below this threshold.(90% of value)
9707ae777d0SHemant Agrawal 		 */
97138a0ac75SHemant Agrawal 		cong_notif_cfg.threshold_exit = (nb_tx_desc * 9) / 10;
9727ae777d0SHemant Agrawal 		cong_notif_cfg.message_ctx = 0;
973*25d0ae62SJun Yang 
974*25d0ae62SJun Yang 		iova = DPAA2_VADDR_TO_IOVA_AND_CHECK(dpaa2_q->cscn,
975*25d0ae62SJun Yang 			sizeof(struct qbman_result));
976*25d0ae62SJun Yang 		if (iova == RTE_BAD_IOVA) {
977*25d0ae62SJun Yang 			DPAA2_PMD_ERR("No IOMMU map for cscn(%p)(size=%x)",
978*25d0ae62SJun Yang 				dpaa2_q->cscn, (uint32_t)sizeof(struct qbman_result));
979*25d0ae62SJun Yang 
980*25d0ae62SJun Yang 			return -ENOBUFS;
981*25d0ae62SJun Yang 		}
982*25d0ae62SJun Yang 
983*25d0ae62SJun Yang 		cong_notif_cfg.message_iova = iova;
9847ae777d0SHemant Agrawal 		cong_notif_cfg.dest_cfg.dest_type = DPNI_DEST_NONE;
9857ae777d0SHemant Agrawal 		cong_notif_cfg.notification_mode =
9867ae777d0SHemant Agrawal 					 DPNI_CONG_OPT_WRITE_MEM_ON_ENTER |
9877ae777d0SHemant Agrawal 					 DPNI_CONG_OPT_WRITE_MEM_ON_EXIT |
9887ae777d0SHemant Agrawal 					 DPNI_CONG_OPT_COHERENT_WRITE;
98955984a9bSShreyansh Jain 		cong_notif_cfg.cg_point = DPNI_CP_QUEUE;
9907ae777d0SHemant Agrawal 
991*25d0ae62SJun Yang 		ret = dpni_set_congestion_notification(dpni,
992*25d0ae62SJun Yang 				CMD_PRI_LOW, priv->token, DPNI_QUEUE_TX,
993*25d0ae62SJun Yang 				((channel_id << 8) | tc_id), &cong_notif_cfg);
9947ae777d0SHemant Agrawal 		if (ret) {
995*25d0ae62SJun Yang 			DPAA2_PMD_ERR("Set TX congestion notification err=%d",
996*25d0ae62SJun Yang 			   ret);
997*25d0ae62SJun Yang 			return ret;
9987ae777d0SHemant Agrawal 		}
9997ae777d0SHemant Agrawal 	}
100016c4a3c4SNipun Gupta 	dpaa2_q->cb_eqresp_free = dpaa2_dev_free_eqresp_buf;
10013e5a335dSHemant Agrawal 	dev->data->tx_queues[tx_queue_id] = dpaa2_q;
10029ceacab7SPriyanka Jain 
10038d21c563SHemant Agrawal 	if (priv->flags & DPAA2_TX_CONF_ENABLE) {
10049ceacab7SPriyanka Jain 		dpaa2_q->tx_conf_queue = dpaa2_tx_conf_q;
10059ceacab7SPriyanka Jain 		options = options | DPNI_QUEUE_OPT_USER_CTX;
10069ceacab7SPriyanka Jain 		tx_conf_cfg.user_context = (size_t)(dpaa2_q);
10079ceacab7SPriyanka Jain 		ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token,
1008*25d0ae62SJun Yang 				DPNI_QUEUE_TX_CONFIRM,
1009*25d0ae62SJun Yang 				((channel_id << 8) | dpaa2_tx_conf_q->tc_index),
1010*25d0ae62SJun Yang 				dpaa2_tx_conf_q->flow_id,
1011*25d0ae62SJun Yang 				options, &tx_conf_cfg);
10129ceacab7SPriyanka Jain 		if (ret) {
1013*25d0ae62SJun Yang 			DPAA2_PMD_ERR("Set TC[%d].TX[%d] conf flow err=%d",
10149ceacab7SPriyanka Jain 				dpaa2_tx_conf_q->tc_index,
10159ceacab7SPriyanka Jain 				dpaa2_tx_conf_q->flow_id, ret);
1016*25d0ae62SJun Yang 			return ret;
10179ceacab7SPriyanka Jain 		}
10189ceacab7SPriyanka Jain 
10199ceacab7SPriyanka Jain 		ret = dpni_get_queue(dpni, CMD_PRI_LOW, priv->token,
1020*25d0ae62SJun Yang 				DPNI_QUEUE_TX_CONFIRM,
1021*25d0ae62SJun Yang 				((channel_id << 8) | dpaa2_tx_conf_q->tc_index),
10229ceacab7SPriyanka Jain 				dpaa2_tx_conf_q->flow_id, &tx_conf_cfg, &qid);
10239ceacab7SPriyanka Jain 		if (ret) {
10249ceacab7SPriyanka Jain 			DPAA2_PMD_ERR("Error in getting LFQID err=%d", ret);
1025*25d0ae62SJun Yang 			return ret;
10269ceacab7SPriyanka Jain 		}
10279ceacab7SPriyanka Jain 		dpaa2_tx_conf_q->fqid = qid.fqid;
10289ceacab7SPriyanka Jain 	}
10293e5a335dSHemant Agrawal 	return 0;
10303e5a335dSHemant Agrawal }
10313e5a335dSHemant Agrawal 
10323e5a335dSHemant Agrawal static void
10337483341aSXueming Li dpaa2_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t rx_queue_id)
10343e5a335dSHemant Agrawal {
10357483341aSXueming Li 	struct dpaa2_queue *dpaa2_q = dev->data->rx_queues[rx_queue_id];
103613b856acSHemant Agrawal 	struct dpaa2_dev_priv *priv = dpaa2_q->eth_data->dev_private;
1037*25d0ae62SJun Yang 	struct fsl_mc_io *dpni = priv->eth_dev->process_private;
103813b856acSHemant Agrawal 	uint8_t options = 0;
103913b856acSHemant Agrawal 	int ret;
104013b856acSHemant Agrawal 	struct dpni_queue cfg;
104113b856acSHemant Agrawal 
104213b856acSHemant Agrawal 	memset(&cfg, 0, sizeof(struct dpni_queue));
10433e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
104435dc25d1SRohit Raj 
104535dc25d1SRohit Raj 	total_nb_rx_desc -= dpaa2_q->nb_desc;
104635dc25d1SRohit Raj 
1047*25d0ae62SJun Yang 	if (dpaa2_q->cgid != DPAA2_INVALID_CGID) {
104813b856acSHemant Agrawal 		options = DPNI_QUEUE_OPT_CLEAR_CGID;
104913b856acSHemant Agrawal 		cfg.cgid = dpaa2_q->cgid;
105013b856acSHemant Agrawal 
105113b856acSHemant Agrawal 		ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token,
105213b856acSHemant Agrawal 				     DPNI_QUEUE_RX,
105313b856acSHemant Agrawal 				     dpaa2_q->tc_index, dpaa2_q->flow_id,
105413b856acSHemant Agrawal 				     options, &cfg);
105513b856acSHemant Agrawal 		if (ret)
105613b856acSHemant Agrawal 			DPAA2_PMD_ERR("Unable to clear CGR from q=%u err=%d",
105713b856acSHemant Agrawal 					dpaa2_q->fqid, ret);
105813b856acSHemant Agrawal 		priv->cgid_in_use[dpaa2_q->cgid] = 0;
1059*25d0ae62SJun Yang 		dpaa2_q->cgid = DPAA2_INVALID_CGID;
106013b856acSHemant Agrawal 	}
10613e5a335dSHemant Agrawal }
10623e5a335dSHemant Agrawal 
1063f40adb40SHemant Agrawal static uint32_t
10648d7d4fcdSKonstantin Ananyev dpaa2_dev_rx_queue_count(void *rx_queue)
1065f40adb40SHemant Agrawal {
1066f40adb40SHemant Agrawal 	int32_t ret;
1067f40adb40SHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
1068f40adb40SHemant Agrawal 	struct qbman_swp *swp;
1069f40adb40SHemant Agrawal 	struct qbman_fq_query_np_rslt state;
1070f40adb40SHemant Agrawal 	uint32_t frame_cnt = 0;
1071f40adb40SHemant Agrawal 
1072f40adb40SHemant Agrawal 	if (unlikely(!DPAA2_PER_LCORE_DPIO)) {
1073f40adb40SHemant Agrawal 		ret = dpaa2_affine_qbman_swp();
1074f40adb40SHemant Agrawal 		if (ret) {
1075d527f5d9SNipun Gupta 			DPAA2_PMD_ERR(
1076f665790aSDavid Marchand 				"Failed to allocate IO portal, tid: %d",
1077d527f5d9SNipun Gupta 				rte_gettid());
1078f40adb40SHemant Agrawal 			return -EINVAL;
1079f40adb40SHemant Agrawal 		}
1080f40adb40SHemant Agrawal 	}
1081f40adb40SHemant Agrawal 	swp = DPAA2_PER_LCORE_PORTAL;
1082f40adb40SHemant Agrawal 
10838d7d4fcdSKonstantin Ananyev 	dpaa2_q = rx_queue;
1084f40adb40SHemant Agrawal 
1085f40adb40SHemant Agrawal 	if (qbman_fq_query_state(swp, dpaa2_q->fqid, &state) == 0) {
1086f40adb40SHemant Agrawal 		frame_cnt = qbman_fq_state_frame_count(&state);
10878d7d4fcdSKonstantin Ananyev 		DPAA2_PMD_DP_DEBUG("RX frame count for q(%p) is %u",
10888d7d4fcdSKonstantin Ananyev 				rx_queue, frame_cnt);
1089f40adb40SHemant Agrawal 	}
1090f40adb40SHemant Agrawal 	return frame_cnt;
1091f40adb40SHemant Agrawal }
1092f40adb40SHemant Agrawal 
1093a5fc38d4SHemant Agrawal static const uint32_t *
1094ba6a168aSSivaramakrishnan Venkat dpaa2_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)
1095a5fc38d4SHemant Agrawal {
1096a5fc38d4SHemant Agrawal 	static const uint32_t ptypes[] = {
1097a5fc38d4SHemant Agrawal 		/*todo -= add more types */
1098a5fc38d4SHemant Agrawal 		RTE_PTYPE_L2_ETHER,
1099a5fc38d4SHemant Agrawal 		RTE_PTYPE_L3_IPV4,
1100a5fc38d4SHemant Agrawal 		RTE_PTYPE_L3_IPV4_EXT,
1101a5fc38d4SHemant Agrawal 		RTE_PTYPE_L3_IPV6,
1102a5fc38d4SHemant Agrawal 		RTE_PTYPE_L3_IPV6_EXT,
1103a5fc38d4SHemant Agrawal 		RTE_PTYPE_L4_TCP,
1104a5fc38d4SHemant Agrawal 		RTE_PTYPE_L4_UDP,
1105a5fc38d4SHemant Agrawal 		RTE_PTYPE_L4_SCTP,
1106a5fc38d4SHemant Agrawal 		RTE_PTYPE_L4_ICMP,
1107a5fc38d4SHemant Agrawal 	};
1108a5fc38d4SHemant Agrawal 
1109a3a997f0SHemant Agrawal 	if (dev->rx_pkt_burst == dpaa2_dev_prefetch_rx ||
111020191ab3SNipun Gupta 		dev->rx_pkt_burst == dpaa2_dev_rx ||
1111ba6a168aSSivaramakrishnan Venkat 		dev->rx_pkt_burst == dpaa2_dev_loopback_rx) {
1112ba6a168aSSivaramakrishnan Venkat 		*no_of_elements = RTE_DIM(ptypes);
1113a5fc38d4SHemant Agrawal 		return ptypes;
1114ba6a168aSSivaramakrishnan Venkat 	}
1115a5fc38d4SHemant Agrawal 	return NULL;
1116a5fc38d4SHemant Agrawal }
1117a5fc38d4SHemant Agrawal 
1118c5acbb5eSHemant Agrawal /**
1119c5acbb5eSHemant Agrawal  * Dpaa2 link Interrupt handler
1120c5acbb5eSHemant Agrawal  *
1121c5acbb5eSHemant Agrawal  * @param param
11227be78d02SJosh Soref  *  The address of parameter (struct rte_eth_dev *) registered before.
1123c5acbb5eSHemant Agrawal  *
1124c5acbb5eSHemant Agrawal  * @return
1125c5acbb5eSHemant Agrawal  *  void
1126c5acbb5eSHemant Agrawal  */
1127c5acbb5eSHemant Agrawal static void
1128c5acbb5eSHemant Agrawal dpaa2_interrupt_handler(void *param)
1129c5acbb5eSHemant Agrawal {
1130c5acbb5eSHemant Agrawal 	struct rte_eth_dev *dev = param;
1131c5acbb5eSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
113281c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
1133c5acbb5eSHemant Agrawal 	int ret;
1134c5acbb5eSHemant Agrawal 	int irq_index = DPNI_IRQ_INDEX;
1135c5acbb5eSHemant Agrawal 	unsigned int status = 0, clear = 0;
1136c5acbb5eSHemant Agrawal 
1137c5acbb5eSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1138c5acbb5eSHemant Agrawal 
1139c5acbb5eSHemant Agrawal 	if (dpni == NULL) {
1140a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1141c5acbb5eSHemant Agrawal 		return;
1142c5acbb5eSHemant Agrawal 	}
1143c5acbb5eSHemant Agrawal 
1144c5acbb5eSHemant Agrawal 	ret = dpni_get_irq_status(dpni, CMD_PRI_LOW, priv->token,
1145c5acbb5eSHemant Agrawal 				  irq_index, &status);
1146c5acbb5eSHemant Agrawal 	if (unlikely(ret)) {
1147a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Can't get irq status (err %d)", ret);
1148c5acbb5eSHemant Agrawal 		clear = 0xffffffff;
1149c5acbb5eSHemant Agrawal 		goto out;
1150c5acbb5eSHemant Agrawal 	}
1151c5acbb5eSHemant Agrawal 
1152c5acbb5eSHemant Agrawal 	if (status & DPNI_IRQ_EVENT_LINK_CHANGED) {
1153c5acbb5eSHemant Agrawal 		clear = DPNI_IRQ_EVENT_LINK_CHANGED;
1154c5acbb5eSHemant Agrawal 		dpaa2_dev_link_update(dev, 0);
1155c5acbb5eSHemant Agrawal 		/* calling all the apps registered for link status event */
11565723fbedSFerruh Yigit 		rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL);
1157c5acbb5eSHemant Agrawal 	}
1158c5acbb5eSHemant Agrawal out:
1159c5acbb5eSHemant Agrawal 	ret = dpni_clear_irq_status(dpni, CMD_PRI_LOW, priv->token,
1160c5acbb5eSHemant Agrawal 				    irq_index, clear);
1161c5acbb5eSHemant Agrawal 	if (unlikely(ret))
1162a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Can't clear irq status (err %d)", ret);
1163c5acbb5eSHemant Agrawal }
1164c5acbb5eSHemant Agrawal 
1165c5acbb5eSHemant Agrawal static int
1166c5acbb5eSHemant Agrawal dpaa2_eth_setup_irqs(struct rte_eth_dev *dev, int enable)
1167c5acbb5eSHemant Agrawal {
1168c5acbb5eSHemant Agrawal 	int err = 0;
1169c5acbb5eSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
117081c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
1171c5acbb5eSHemant Agrawal 	int irq_index = DPNI_IRQ_INDEX;
1172c5acbb5eSHemant Agrawal 	unsigned int mask = DPNI_IRQ_EVENT_LINK_CHANGED;
1173c5acbb5eSHemant Agrawal 
1174c5acbb5eSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1175c5acbb5eSHemant Agrawal 
1176c5acbb5eSHemant Agrawal 	err = dpni_set_irq_mask(dpni, CMD_PRI_LOW, priv->token,
1177c5acbb5eSHemant Agrawal 				irq_index, mask);
1178c5acbb5eSHemant Agrawal 	if (err < 0) {
1179a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error: dpni_set_irq_mask():%d (%s)", err,
1180c5acbb5eSHemant Agrawal 			      strerror(-err));
1181c5acbb5eSHemant Agrawal 		return err;
1182c5acbb5eSHemant Agrawal 	}
1183c5acbb5eSHemant Agrawal 
1184c5acbb5eSHemant Agrawal 	err = dpni_set_irq_enable(dpni, CMD_PRI_LOW, priv->token,
1185c5acbb5eSHemant Agrawal 				  irq_index, enable);
1186c5acbb5eSHemant Agrawal 	if (err < 0)
1187a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error: dpni_set_irq_enable():%d (%s)", err,
1188c5acbb5eSHemant Agrawal 			      strerror(-err));
1189c5acbb5eSHemant Agrawal 
1190c5acbb5eSHemant Agrawal 	return err;
1191c5acbb5eSHemant Agrawal }
1192c5acbb5eSHemant Agrawal 
11933e5a335dSHemant Agrawal static int
11943e5a335dSHemant Agrawal dpaa2_dev_start(struct rte_eth_dev *dev)
11953e5a335dSHemant Agrawal {
1196c5acbb5eSHemant Agrawal 	struct rte_device *rdev = dev->device;
1197c5acbb5eSHemant Agrawal 	struct rte_dpaa2_device *dpaa2_dev;
11983e5a335dSHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
11993e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = data->dev_private;
120081c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
12013e5a335dSHemant Agrawal 	struct dpni_queue cfg;
1202ef18dafeSHemant Agrawal 	struct dpni_error_cfg	err_cfg;
12033e5a335dSHemant Agrawal 	struct dpni_queue_id qid;
12043e5a335dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
12053e5a335dSHemant Agrawal 	int ret, i;
1206c5acbb5eSHemant Agrawal 	struct rte_intr_handle *intr_handle;
1207c5acbb5eSHemant Agrawal 
1208c5acbb5eSHemant Agrawal 	dpaa2_dev = container_of(rdev, struct rte_dpaa2_device, device);
1209d61138d4SHarman Kalra 	intr_handle = dpaa2_dev->intr_handle;
12103e5a335dSHemant Agrawal 
12113e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
12123e5a335dSHemant Agrawal 	ret = dpni_enable(dpni, CMD_PRI_LOW, priv->token);
12133e5a335dSHemant Agrawal 	if (ret) {
1214a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Failure in enabling dpni %d device: err=%d",
1215a10a988aSShreyansh Jain 			      priv->hw_id, ret);
12163e5a335dSHemant Agrawal 		return ret;
12173e5a335dSHemant Agrawal 	}
12183e5a335dSHemant Agrawal 
1219aa8c595aSHemant Agrawal 	/* Power up the phy. Needed to make the link go UP */
1220a1f3a12cSHemant Agrawal 	dpaa2_dev_set_link_up(dev);
1221a1f3a12cSHemant Agrawal 
12223e5a335dSHemant Agrawal 	for (i = 0; i < data->nb_rx_queues; i++) {
1223*25d0ae62SJun Yang 		dpaa2_q = data->rx_queues[i];
12243e5a335dSHemant Agrawal 		ret = dpni_get_queue(dpni, CMD_PRI_LOW, priv->token,
12253e5a335dSHemant Agrawal 				DPNI_QUEUE_RX, dpaa2_q->tc_index,
12263e5a335dSHemant Agrawal 				dpaa2_q->flow_id, &cfg, &qid);
12273e5a335dSHemant Agrawal 		if (ret) {
1228a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("Error in getting flow information: "
1229a10a988aSShreyansh Jain 				      "err=%d", ret);
12303e5a335dSHemant Agrawal 			return ret;
12313e5a335dSHemant Agrawal 		}
12323e5a335dSHemant Agrawal 		dpaa2_q->fqid = qid.fqid;
12333e5a335dSHemant Agrawal 	}
12343e5a335dSHemant Agrawal 
12354690a611SNipun Gupta 	if (dpaa2_enable_err_queue) {
12364690a611SNipun Gupta 		ret = dpni_get_queue(dpni, CMD_PRI_LOW, priv->token,
12374690a611SNipun Gupta 				     DPNI_QUEUE_RX_ERR, 0, 0, &cfg, &qid);
12384690a611SNipun Gupta 		if (ret) {
12394690a611SNipun Gupta 			DPAA2_PMD_ERR("Error getting rx err flow information: err=%d",
12404690a611SNipun Gupta 						ret);
12414690a611SNipun Gupta 			return ret;
12424690a611SNipun Gupta 		}
1243*25d0ae62SJun Yang 		dpaa2_q = priv->rx_err_vq;
12444690a611SNipun Gupta 		dpaa2_q->fqid = qid.fqid;
12454690a611SNipun Gupta 		dpaa2_q->eth_data = dev->data;
12464690a611SNipun Gupta 
12474690a611SNipun Gupta 		err_cfg.errors =  DPNI_ERROR_DISC;
12484690a611SNipun Gupta 		err_cfg.error_action = DPNI_ERROR_ACTION_SEND_TO_ERROR_QUEUE;
12494690a611SNipun Gupta 	} else {
12504690a611SNipun Gupta 		/* checksum errors, send them to normal path
12514690a611SNipun Gupta 		 * and set it in annotation
12524690a611SNipun Gupta 		 */
1253ef18dafeSHemant Agrawal 		err_cfg.errors = DPNI_ERROR_L3CE | DPNI_ERROR_L4CE;
12544690a611SNipun Gupta 
12554690a611SNipun Gupta 		/* if packet with parse error are not to be dropped */
125634356a5dSShreyansh Jain 		err_cfg.errors |= DPNI_ERROR_PHE;
1257ef18dafeSHemant Agrawal 
1258ef18dafeSHemant Agrawal 		err_cfg.error_action = DPNI_ERROR_ACTION_CONTINUE;
12594690a611SNipun Gupta 	}
1260ef18dafeSHemant Agrawal 	err_cfg.set_frame_annotation = true;
1261ef18dafeSHemant Agrawal 
1262ef18dafeSHemant Agrawal 	ret = dpni_set_errors_behavior(dpni, CMD_PRI_LOW,
1263ef18dafeSHemant Agrawal 				       priv->token, &err_cfg);
1264ef18dafeSHemant Agrawal 	if (ret) {
1265a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error to dpni_set_errors_behavior: code = %d",
1266a10a988aSShreyansh Jain 			      ret);
1267ef18dafeSHemant Agrawal 		return ret;
1268ef18dafeSHemant Agrawal 	}
1269ef18dafeSHemant Agrawal 
1270c5acbb5eSHemant Agrawal 	/* if the interrupts were configured on this devices*/
1271d61138d4SHarman Kalra 	if (intr_handle && rte_intr_fd_get(intr_handle) &&
1272d61138d4SHarman Kalra 	    dev->data->dev_conf.intr_conf.lsc != 0) {
1273c5acbb5eSHemant Agrawal 		/* Registering LSC interrupt handler */
1274c5acbb5eSHemant Agrawal 		rte_intr_callback_register(intr_handle,
1275c5acbb5eSHemant Agrawal 					   dpaa2_interrupt_handler,
1276c5acbb5eSHemant Agrawal 					   (void *)dev);
1277c5acbb5eSHemant Agrawal 
1278c5acbb5eSHemant Agrawal 		/* enable vfio intr/eventfd mapping
1279c5acbb5eSHemant Agrawal 		 * Interrupt index 0 is required, so we can not use
1280c5acbb5eSHemant Agrawal 		 * rte_intr_enable.
1281c5acbb5eSHemant Agrawal 		 */
1282c5acbb5eSHemant Agrawal 		rte_dpaa2_intr_enable(intr_handle, DPNI_IRQ_INDEX);
1283c5acbb5eSHemant Agrawal 
1284c5acbb5eSHemant Agrawal 		/* enable dpni_irqs */
1285c5acbb5eSHemant Agrawal 		dpaa2_eth_setup_irqs(dev, 1);
1286c5acbb5eSHemant Agrawal 	}
1287c5acbb5eSHemant Agrawal 
128816c4a3c4SNipun Gupta 	/* Change the tx burst function if ordered queues are used */
128916c4a3c4SNipun Gupta 	if (priv->en_ordered)
129016c4a3c4SNipun Gupta 		dev->tx_pkt_burst = dpaa2_dev_tx_ordered;
129116c4a3c4SNipun Gupta 
1292f4909c42SJie Hai 	for (i = 0; i < dev->data->nb_rx_queues; i++)
1293f4909c42SJie Hai 		dev->data->rx_queue_state[i] = RTE_ETH_QUEUE_STATE_STARTED;
1294f4909c42SJie Hai 	for (i = 0; i < dev->data->nb_tx_queues; i++)
1295f4909c42SJie Hai 		dev->data->tx_queue_state[i] = RTE_ETH_QUEUE_STATE_STARTED;
1296f4909c42SJie Hai 
12973e5a335dSHemant Agrawal 	return 0;
12983e5a335dSHemant Agrawal }
12993e5a335dSHemant Agrawal 
13003e5a335dSHemant Agrawal /**
13013e5a335dSHemant Agrawal  *  This routine disables all traffic on the adapter by issuing a
13023e5a335dSHemant Agrawal  *  global reset on the MAC.
13033e5a335dSHemant Agrawal  */
130462024eb8SIvan Ilchenko static int
13053e5a335dSHemant Agrawal dpaa2_dev_stop(struct rte_eth_dev *dev)
13063e5a335dSHemant Agrawal {
13073e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1308*25d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
13093e5a335dSHemant Agrawal 	int ret;
1310c56c86ffSHemant Agrawal 	struct rte_eth_link link;
1311d192fd32SVanshika Shukla 	struct rte_device *rdev = dev->device;
1312d192fd32SVanshika Shukla 	struct rte_intr_handle *intr_handle;
1313d192fd32SVanshika Shukla 	struct rte_dpaa2_device *dpaa2_dev;
1314f4909c42SJie Hai 	uint16_t i;
1315d192fd32SVanshika Shukla 
1316d192fd32SVanshika Shukla 	dpaa2_dev = container_of(rdev, struct rte_dpaa2_device, device);
1317d192fd32SVanshika Shukla 	intr_handle = dpaa2_dev->intr_handle;
13183e5a335dSHemant Agrawal 
13193e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
13203e5a335dSHemant Agrawal 
1321c5acbb5eSHemant Agrawal 	/* reset interrupt callback  */
1322d61138d4SHarman Kalra 	if (intr_handle && rte_intr_fd_get(intr_handle) &&
1323d61138d4SHarman Kalra 	    dev->data->dev_conf.intr_conf.lsc != 0) {
1324c5acbb5eSHemant Agrawal 		/*disable dpni irqs */
1325c5acbb5eSHemant Agrawal 		dpaa2_eth_setup_irqs(dev, 0);
1326c5acbb5eSHemant Agrawal 
1327c5acbb5eSHemant Agrawal 		/* disable vfio intr before callback unregister */
1328c5acbb5eSHemant Agrawal 		rte_dpaa2_intr_disable(intr_handle, DPNI_IRQ_INDEX);
1329c5acbb5eSHemant Agrawal 
1330c5acbb5eSHemant Agrawal 		/* Unregistering LSC interrupt handler */
1331c5acbb5eSHemant Agrawal 		rte_intr_callback_unregister(intr_handle,
1332c5acbb5eSHemant Agrawal 					     dpaa2_interrupt_handler,
1333c5acbb5eSHemant Agrawal 					     (void *)dev);
1334c5acbb5eSHemant Agrawal 	}
1335c5acbb5eSHemant Agrawal 
1336a1f3a12cSHemant Agrawal 	dpaa2_dev_set_link_down(dev);
1337a1f3a12cSHemant Agrawal 
13383e5a335dSHemant Agrawal 	ret = dpni_disable(dpni, CMD_PRI_LOW, priv->token);
13393e5a335dSHemant Agrawal 	if (ret) {
1340a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Failure (ret %d) in disabling dpni %d dev",
13413e5a335dSHemant Agrawal 			      ret, priv->hw_id);
134262024eb8SIvan Ilchenko 		return ret;
13433e5a335dSHemant Agrawal 	}
1344c56c86ffSHemant Agrawal 
1345c56c86ffSHemant Agrawal 	/* clear the recorded link status */
1346c56c86ffSHemant Agrawal 	memset(&link, 0, sizeof(link));
13477e2eb5f0SStephen Hemminger 	rte_eth_linkstatus_set(dev, &link);
134862024eb8SIvan Ilchenko 
1349f4909c42SJie Hai 	for (i = 0; i < dev->data->nb_rx_queues; i++)
1350f4909c42SJie Hai 		dev->data->rx_queue_state[i] = RTE_ETH_QUEUE_STATE_STOPPED;
1351f4909c42SJie Hai 	for (i = 0; i < dev->data->nb_tx_queues; i++)
1352f4909c42SJie Hai 		dev->data->tx_queue_state[i] = RTE_ETH_QUEUE_STATE_STOPPED;
1353f4909c42SJie Hai 
135462024eb8SIvan Ilchenko 	return 0;
13553e5a335dSHemant Agrawal }
13563e5a335dSHemant Agrawal 
1357b142387bSThomas Monjalon static int
13583e5a335dSHemant Agrawal dpaa2_dev_close(struct rte_eth_dev *dev)
13593e5a335dSHemant Agrawal {
13603e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1361*25d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
13625964d36aSSachin Saxena 	int i, ret;
1363a1f3a12cSHemant Agrawal 	struct rte_eth_link link;
13643e5a335dSHemant Agrawal 
13653e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
13663e5a335dSHemant Agrawal 
13675964d36aSSachin Saxena 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
13685964d36aSSachin Saxena 		return 0;
13696a556bd6SHemant Agrawal 
13705964d36aSSachin Saxena 	if (!dpni) {
13715964d36aSSachin Saxena 		DPAA2_PMD_WARN("Already closed or not started");
1372*25d0ae62SJun Yang 		return -EINVAL;
13735964d36aSSachin Saxena 	}
13745964d36aSSachin Saxena 
1375ac624068SGagandeep Singh 	dpaa2_tm_deinit(dev);
13765964d36aSSachin Saxena 	dpaa2_flow_clean(dev);
13773e5a335dSHemant Agrawal 	/* Clean the device first */
13783e5a335dSHemant Agrawal 	ret = dpni_reset(dpni, CMD_PRI_LOW, priv->token);
13793e5a335dSHemant Agrawal 	if (ret) {
1380a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Failure cleaning dpni device: err=%d", ret);
1381*25d0ae62SJun Yang 		return ret;
13823e5a335dSHemant Agrawal 	}
1383a1f3a12cSHemant Agrawal 
1384a1f3a12cSHemant Agrawal 	memset(&link, 0, sizeof(link));
13857e2eb5f0SStephen Hemminger 	rte_eth_linkstatus_set(dev, &link);
1386b142387bSThomas Monjalon 
13875964d36aSSachin Saxena 	/* Free private queues memory */
13885964d36aSSachin Saxena 	dpaa2_free_rx_tx_queues(dev);
13895964d36aSSachin Saxena 	/* Close the device at underlying layer*/
13905964d36aSSachin Saxena 	ret = dpni_close(dpni, CMD_PRI_LOW, priv->token);
13915964d36aSSachin Saxena 	if (ret) {
13925964d36aSSachin Saxena 		DPAA2_PMD_ERR("Failure closing dpni device with err code %d",
13935964d36aSSachin Saxena 			ret);
13945964d36aSSachin Saxena 	}
13955964d36aSSachin Saxena 
13965964d36aSSachin Saxena 	/* Free the allocated memory for ethernet private data and dpni*/
13975964d36aSSachin Saxena 	priv->hw = NULL;
13985964d36aSSachin Saxena 	dev->process_private = NULL;
13995964d36aSSachin Saxena 	rte_free(dpni);
14005964d36aSSachin Saxena 
14015964d36aSSachin Saxena 	for (i = 0; i < MAX_TCS; i++)
1402*25d0ae62SJun Yang 		rte_free(priv->extract.tc_extract_param[i]);
14035964d36aSSachin Saxena 
14045964d36aSSachin Saxena 	if (priv->extract.qos_extract_param)
1405*25d0ae62SJun Yang 		rte_free(priv->extract.qos_extract_param);
14065964d36aSSachin Saxena 
14075964d36aSSachin Saxena 	DPAA2_PMD_INFO("%s: netdev deleted", dev->data->name);
1408b142387bSThomas Monjalon 	return 0;
14093e5a335dSHemant Agrawal }
14103e5a335dSHemant Agrawal 
14119039c812SAndrew Rybchenko static int
1412*25d0ae62SJun Yang dpaa2_dev_promiscuous_enable(struct rte_eth_dev *dev)
1413c0e5c69aSHemant Agrawal {
1414c0e5c69aSHemant Agrawal 	int ret;
1415c0e5c69aSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
141681c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
1417c0e5c69aSHemant Agrawal 
1418c0e5c69aSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1419c0e5c69aSHemant Agrawal 
1420c0e5c69aSHemant Agrawal 	if (dpni == NULL) {
1421a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
14229039c812SAndrew Rybchenko 		return -ENODEV;
1423c0e5c69aSHemant Agrawal 	}
1424c0e5c69aSHemant Agrawal 
1425c0e5c69aSHemant Agrawal 	ret = dpni_set_unicast_promisc(dpni, CMD_PRI_LOW, priv->token, true);
1426c0e5c69aSHemant Agrawal 	if (ret < 0)
1427a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Unable to enable U promisc mode %d", ret);
14285d5aeeedSHemant Agrawal 
14295d5aeeedSHemant Agrawal 	ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, true);
14305d5aeeedSHemant Agrawal 	if (ret < 0)
1431a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Unable to enable M promisc mode %d", ret);
14329039c812SAndrew Rybchenko 
14339039c812SAndrew Rybchenko 	return ret;
1434c0e5c69aSHemant Agrawal }
1435c0e5c69aSHemant Agrawal 
14369039c812SAndrew Rybchenko static int
1437c0e5c69aSHemant Agrawal dpaa2_dev_promiscuous_disable(
1438c0e5c69aSHemant Agrawal 		struct rte_eth_dev *dev)
1439c0e5c69aSHemant Agrawal {
1440c0e5c69aSHemant Agrawal 	int ret;
1441c0e5c69aSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
144281c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
1443c0e5c69aSHemant Agrawal 
1444c0e5c69aSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1445c0e5c69aSHemant Agrawal 
1446c0e5c69aSHemant Agrawal 	if (dpni == NULL) {
1447a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
14489039c812SAndrew Rybchenko 		return -ENODEV;
1449c0e5c69aSHemant Agrawal 	}
1450c0e5c69aSHemant Agrawal 
1451c0e5c69aSHemant Agrawal 	ret = dpni_set_unicast_promisc(dpni, CMD_PRI_LOW, priv->token, false);
1452c0e5c69aSHemant Agrawal 	if (ret < 0)
1453a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Unable to disable U promisc mode %d", ret);
14545d5aeeedSHemant Agrawal 
14555d5aeeedSHemant Agrawal 	if (dev->data->all_multicast == 0) {
14565d5aeeedSHemant Agrawal 		ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW,
14575d5aeeedSHemant Agrawal 						 priv->token, false);
14585d5aeeedSHemant Agrawal 		if (ret < 0)
1459a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("Unable to disable M promisc mode %d",
14605d5aeeedSHemant Agrawal 				      ret);
14615d5aeeedSHemant Agrawal 	}
14629039c812SAndrew Rybchenko 
14639039c812SAndrew Rybchenko 	return ret;
14645d5aeeedSHemant Agrawal }
14655d5aeeedSHemant Agrawal 
1466ca041cd4SIvan Ilchenko static int
14675d5aeeedSHemant Agrawal dpaa2_dev_allmulticast_enable(
14685d5aeeedSHemant Agrawal 		struct rte_eth_dev *dev)
14695d5aeeedSHemant Agrawal {
14705d5aeeedSHemant Agrawal 	int ret;
14715d5aeeedSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
147281c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
14735d5aeeedSHemant Agrawal 
14745d5aeeedSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
14755d5aeeedSHemant Agrawal 
14765d5aeeedSHemant Agrawal 	if (dpni == NULL) {
1477a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1478ca041cd4SIvan Ilchenko 		return -ENODEV;
14795d5aeeedSHemant Agrawal 	}
14805d5aeeedSHemant Agrawal 
14815d5aeeedSHemant Agrawal 	ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, true);
14825d5aeeedSHemant Agrawal 	if (ret < 0)
1483a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Unable to enable multicast mode %d", ret);
1484ca041cd4SIvan Ilchenko 
1485ca041cd4SIvan Ilchenko 	return ret;
14865d5aeeedSHemant Agrawal }
14875d5aeeedSHemant Agrawal 
1488ca041cd4SIvan Ilchenko static int
14895d5aeeedSHemant Agrawal dpaa2_dev_allmulticast_disable(struct rte_eth_dev *dev)
14905d5aeeedSHemant Agrawal {
14915d5aeeedSHemant Agrawal 	int ret;
14925d5aeeedSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1493*25d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
14945d5aeeedSHemant Agrawal 
14955d5aeeedSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
14965d5aeeedSHemant Agrawal 
14975d5aeeedSHemant Agrawal 	if (dpni == NULL) {
1498a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1499ca041cd4SIvan Ilchenko 		return -ENODEV;
15005d5aeeedSHemant Agrawal 	}
15015d5aeeedSHemant Agrawal 
15025d5aeeedSHemant Agrawal 	/* must remain on for all promiscuous */
15035d5aeeedSHemant Agrawal 	if (dev->data->promiscuous == 1)
1504ca041cd4SIvan Ilchenko 		return 0;
15055d5aeeedSHemant Agrawal 
15065d5aeeedSHemant Agrawal 	ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, false);
15075d5aeeedSHemant Agrawal 	if (ret < 0)
1508a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Unable to disable multicast mode %d", ret);
1509ca041cd4SIvan Ilchenko 
1510ca041cd4SIvan Ilchenko 	return ret;
1511c0e5c69aSHemant Agrawal }
1512e31d4d21SHemant Agrawal 
1513e31d4d21SHemant Agrawal static int
1514e31d4d21SHemant Agrawal dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
1515e31d4d21SHemant Agrawal {
1516e31d4d21SHemant Agrawal 	int ret;
1517e31d4d21SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1518*25d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
151935b2d13fSOlivier Matz 	uint32_t frame_size = mtu + RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN
152044ea7355SAshish Jain 				+ VLAN_TAG_SIZE;
1521e31d4d21SHemant Agrawal 
1522e31d4d21SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1523e31d4d21SHemant Agrawal 
1524*25d0ae62SJun Yang 	if (!dpni) {
1525a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1526e31d4d21SHemant Agrawal 		return -EINVAL;
1527e31d4d21SHemant Agrawal 	}
1528e31d4d21SHemant Agrawal 
1529e31d4d21SHemant Agrawal 	/* Set the Max Rx frame length as 'mtu' +
1530e31d4d21SHemant Agrawal 	 * Maximum Ethernet header length
1531e31d4d21SHemant Agrawal 	 */
1532e31d4d21SHemant Agrawal 	ret = dpni_set_max_frame_length(dpni, CMD_PRI_LOW, priv->token,
15336f8be0fbSHemant Agrawal 					frame_size - RTE_ETHER_CRC_LEN);
1534e31d4d21SHemant Agrawal 	if (ret) {
1535a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Setting the max frame length failed");
1536*25d0ae62SJun Yang 		return ret;
1537e31d4d21SHemant Agrawal 	}
1538de08b474SApeksha Gupta 	dev->data->mtu = mtu;
1539a10a988aSShreyansh Jain 	DPAA2_PMD_INFO("MTU configured for the device: %d", mtu);
1540e31d4d21SHemant Agrawal 	return 0;
1541e31d4d21SHemant Agrawal }
1542e31d4d21SHemant Agrawal 
1543b4d97b7dSHemant Agrawal static int
1544b4d97b7dSHemant Agrawal dpaa2_dev_add_mac_addr(struct rte_eth_dev *dev,
15456d13ea8eSOlivier Matz 	struct rte_ether_addr *addr,
1546b4d97b7dSHemant Agrawal 	__rte_unused uint32_t index,
1547b4d97b7dSHemant Agrawal 	__rte_unused uint32_t pool)
1548b4d97b7dSHemant Agrawal {
1549b4d97b7dSHemant Agrawal 	int ret;
1550b4d97b7dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1551*25d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
1552b4d97b7dSHemant Agrawal 
1553b4d97b7dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1554b4d97b7dSHemant Agrawal 
1555b4d97b7dSHemant Agrawal 	if (dpni == NULL) {
1556a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1557*25d0ae62SJun Yang 		return -EINVAL;
1558b4d97b7dSHemant Agrawal 	}
1559b4d97b7dSHemant Agrawal 
156096f7bfe8SSachin Saxena 	ret = dpni_add_mac_addr(dpni, CMD_PRI_LOW, priv->token,
156196f7bfe8SSachin Saxena 				addr->addr_bytes, 0, 0, 0);
1562b4d97b7dSHemant Agrawal 	if (ret)
1563*25d0ae62SJun Yang 		DPAA2_PMD_ERR("ERR(%d) Adding the MAC ADDR failed", ret);
1564*25d0ae62SJun Yang 	return ret;
1565b4d97b7dSHemant Agrawal }
1566b4d97b7dSHemant Agrawal 
1567b4d97b7dSHemant Agrawal static void
1568b4d97b7dSHemant Agrawal dpaa2_dev_remove_mac_addr(struct rte_eth_dev *dev,
1569b4d97b7dSHemant Agrawal 	uint32_t index)
1570b4d97b7dSHemant Agrawal {
1571b4d97b7dSHemant Agrawal 	int ret;
1572b4d97b7dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1573*25d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
1574b4d97b7dSHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
15756d13ea8eSOlivier Matz 	struct rte_ether_addr *macaddr;
1576b4d97b7dSHemant Agrawal 
1577b4d97b7dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1578b4d97b7dSHemant Agrawal 
1579b4d97b7dSHemant Agrawal 	macaddr = &data->mac_addrs[index];
1580b4d97b7dSHemant Agrawal 
1581*25d0ae62SJun Yang 	if (!dpni) {
1582a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1583b4d97b7dSHemant Agrawal 		return;
1584b4d97b7dSHemant Agrawal 	}
1585b4d97b7dSHemant Agrawal 
1586b4d97b7dSHemant Agrawal 	ret = dpni_remove_mac_addr(dpni, CMD_PRI_LOW,
1587b4d97b7dSHemant Agrawal 				   priv->token, macaddr->addr_bytes);
1588b4d97b7dSHemant Agrawal 	if (ret)
1589a10a988aSShreyansh Jain 		DPAA2_PMD_ERR(
1590a10a988aSShreyansh Jain 			"error: Removing the MAC ADDR failed: err = %d", ret);
1591b4d97b7dSHemant Agrawal }
1592b4d97b7dSHemant Agrawal 
1593caccf8b3SOlivier Matz static int
1594b4d97b7dSHemant Agrawal dpaa2_dev_set_mac_addr(struct rte_eth_dev *dev,
15956d13ea8eSOlivier Matz 	struct rte_ether_addr *addr)
1596b4d97b7dSHemant Agrawal {
1597b4d97b7dSHemant Agrawal 	int ret;
1598b4d97b7dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1599*25d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
1600b4d97b7dSHemant Agrawal 
1601b4d97b7dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1602b4d97b7dSHemant Agrawal 
1603*25d0ae62SJun Yang 	if (!dpni) {
1604a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1605caccf8b3SOlivier Matz 		return -EINVAL;
1606b4d97b7dSHemant Agrawal 	}
1607b4d97b7dSHemant Agrawal 
1608b4d97b7dSHemant Agrawal 	ret = dpni_set_primary_mac_addr(dpni, CMD_PRI_LOW,
1609b4d97b7dSHemant Agrawal 					priv->token, addr->addr_bytes);
1610b4d97b7dSHemant Agrawal 
1611b4d97b7dSHemant Agrawal 	if (ret)
1612*25d0ae62SJun Yang 		DPAA2_PMD_ERR("ERR(%d) Setting the MAC ADDR failed", ret);
1613caccf8b3SOlivier Matz 
1614caccf8b3SOlivier Matz 	return ret;
1615b4d97b7dSHemant Agrawal }
1616a10a988aSShreyansh Jain 
1617*25d0ae62SJun Yang static int
1618*25d0ae62SJun Yang dpaa2_dev_stats_get(struct rte_eth_dev *dev,
1619b0aa5459SHemant Agrawal 	struct rte_eth_stats *stats)
1620b0aa5459SHemant Agrawal {
1621b0aa5459SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1622*25d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
1623b0aa5459SHemant Agrawal 	int32_t retcode;
1624b0aa5459SHemant Agrawal 	uint8_t page0 = 0, page1 = 1, page2 = 2;
1625b0aa5459SHemant Agrawal 	union dpni_statistics value;
1626e43f2521SShreyansh Jain 	int i;
1627e43f2521SShreyansh Jain 	struct dpaa2_queue *dpaa2_rxq, *dpaa2_txq;
1628b0aa5459SHemant Agrawal 
1629b0aa5459SHemant Agrawal 	memset(&value, 0, sizeof(union dpni_statistics));
1630b0aa5459SHemant Agrawal 
1631b0aa5459SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1632b0aa5459SHemant Agrawal 
1633b0aa5459SHemant Agrawal 	if (!dpni) {
1634a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1635d5b0924bSMatan Azrad 		return -EINVAL;
1636b0aa5459SHemant Agrawal 	}
1637b0aa5459SHemant Agrawal 
1638b0aa5459SHemant Agrawal 	if (!stats) {
1639a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("stats is NULL");
1640d5b0924bSMatan Azrad 		return -EINVAL;
1641b0aa5459SHemant Agrawal 	}
1642b0aa5459SHemant Agrawal 
1643b0aa5459SHemant Agrawal 	/*Get Counters from page_0*/
1644b0aa5459SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
164516bbc98aSShreyansh Jain 				      page0, 0, &value);
1646b0aa5459SHemant Agrawal 	if (retcode)
1647b0aa5459SHemant Agrawal 		goto err;
1648b0aa5459SHemant Agrawal 
1649b0aa5459SHemant Agrawal 	stats->ipackets = value.page_0.ingress_all_frames;
1650b0aa5459SHemant Agrawal 	stats->ibytes = value.page_0.ingress_all_bytes;
1651b0aa5459SHemant Agrawal 
1652b0aa5459SHemant Agrawal 	/*Get Counters from page_1*/
1653b0aa5459SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
165416bbc98aSShreyansh Jain 				      page1, 0, &value);
1655b0aa5459SHemant Agrawal 	if (retcode)
1656b0aa5459SHemant Agrawal 		goto err;
1657b0aa5459SHemant Agrawal 
1658b0aa5459SHemant Agrawal 	stats->opackets = value.page_1.egress_all_frames;
1659b0aa5459SHemant Agrawal 	stats->obytes = value.page_1.egress_all_bytes;
1660b0aa5459SHemant Agrawal 
1661b0aa5459SHemant Agrawal 	/*Get Counters from page_2*/
1662b0aa5459SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
166316bbc98aSShreyansh Jain 				      page2, 0, &value);
1664b0aa5459SHemant Agrawal 	if (retcode)
1665b0aa5459SHemant Agrawal 		goto err;
1666b0aa5459SHemant Agrawal 
1667b4d97b7dSHemant Agrawal 	/* Ingress drop frame count due to configured rules */
1668b4d97b7dSHemant Agrawal 	stats->ierrors = value.page_2.ingress_filtered_frames;
1669b4d97b7dSHemant Agrawal 	/* Ingress drop frame count due to error */
1670b4d97b7dSHemant Agrawal 	stats->ierrors += value.page_2.ingress_discarded_frames;
1671b4d97b7dSHemant Agrawal 
1672b0aa5459SHemant Agrawal 	stats->oerrors = value.page_2.egress_discarded_frames;
1673b0aa5459SHemant Agrawal 	stats->imissed = value.page_2.ingress_nobuffer_discards;
1674b0aa5459SHemant Agrawal 
1675e43f2521SShreyansh Jain 	/* Fill in per queue stats */
1676e43f2521SShreyansh Jain 	for (i = 0; (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) &&
1677e43f2521SShreyansh Jain 		(i < priv->nb_rx_queues || i < priv->nb_tx_queues); ++i) {
1678*25d0ae62SJun Yang 		dpaa2_rxq = priv->rx_vq[i];
1679*25d0ae62SJun Yang 		dpaa2_txq = priv->tx_vq[i];
1680e43f2521SShreyansh Jain 		if (dpaa2_rxq)
1681e43f2521SShreyansh Jain 			stats->q_ipackets[i] = dpaa2_rxq->rx_pkts;
1682e43f2521SShreyansh Jain 		if (dpaa2_txq)
1683e43f2521SShreyansh Jain 			stats->q_opackets[i] = dpaa2_txq->tx_pkts;
1684e43f2521SShreyansh Jain 
1685e43f2521SShreyansh Jain 		/* Byte counting is not implemented */
1686e43f2521SShreyansh Jain 		stats->q_ibytes[i]   = 0;
1687e43f2521SShreyansh Jain 		stats->q_obytes[i]   = 0;
1688e43f2521SShreyansh Jain 	}
1689e43f2521SShreyansh Jain 
1690d5b0924bSMatan Azrad 	return 0;
1691b0aa5459SHemant Agrawal 
1692b0aa5459SHemant Agrawal err:
1693a10a988aSShreyansh Jain 	DPAA2_PMD_ERR("Operation not completed:Error Code = %d", retcode);
1694d5b0924bSMatan Azrad 	return retcode;
1695b0aa5459SHemant Agrawal };
1696b0aa5459SHemant Agrawal 
16971d6329b2SHemant Agrawal static int
1698*25d0ae62SJun Yang dpaa2_dev_xstats_get(struct rte_eth_dev *dev,
1699*25d0ae62SJun Yang 	struct rte_eth_xstat *xstats, unsigned int n)
17001d6329b2SHemant Agrawal {
17011d6329b2SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
170281c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
17031d6329b2SHemant Agrawal 	int32_t retcode;
1704c720c5f6SHemant Agrawal 	union dpni_statistics value[5] = {};
17051d6329b2SHemant Agrawal 	unsigned int i = 0, num = RTE_DIM(dpaa2_xstats_strings);
1706*25d0ae62SJun Yang 	uint8_t page_id, stats_id;
17071d6329b2SHemant Agrawal 
17081d6329b2SHemant Agrawal 	if (n < num)
17091d6329b2SHemant Agrawal 		return num;
17101d6329b2SHemant Agrawal 
1711*25d0ae62SJun Yang 	if (!xstats)
1712876b2c90SHemant Agrawal 		return 0;
1713876b2c90SHemant Agrawal 
17141d6329b2SHemant Agrawal 	/* Get Counters from page_0*/
17151d6329b2SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
17161d6329b2SHemant Agrawal 				      0, 0, &value[0]);
17171d6329b2SHemant Agrawal 	if (retcode)
17181d6329b2SHemant Agrawal 		goto err;
17191d6329b2SHemant Agrawal 
17201d6329b2SHemant Agrawal 	/* Get Counters from page_1*/
17211d6329b2SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
17221d6329b2SHemant Agrawal 				      1, 0, &value[1]);
17231d6329b2SHemant Agrawal 	if (retcode)
17241d6329b2SHemant Agrawal 		goto err;
17251d6329b2SHemant Agrawal 
17261d6329b2SHemant Agrawal 	/* Get Counters from page_2*/
17271d6329b2SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
17281d6329b2SHemant Agrawal 				      2, 0, &value[2]);
17291d6329b2SHemant Agrawal 	if (retcode)
17301d6329b2SHemant Agrawal 		goto err;
17311d6329b2SHemant Agrawal 
1732c720c5f6SHemant Agrawal 	for (i = 0; i < priv->max_cgs; i++) {
1733c720c5f6SHemant Agrawal 		if (!priv->cgid_in_use[i]) {
1734c720c5f6SHemant Agrawal 			/* Get Counters from page_4*/
1735c720c5f6SHemant Agrawal 			retcode = dpni_get_statistics(dpni, CMD_PRI_LOW,
1736c720c5f6SHemant Agrawal 						      priv->token,
1737c720c5f6SHemant Agrawal 						      4, 0, &value[4]);
1738c720c5f6SHemant Agrawal 			if (retcode)
1739c720c5f6SHemant Agrawal 				goto err;
1740c720c5f6SHemant Agrawal 			break;
1741c720c5f6SHemant Agrawal 		}
1742c720c5f6SHemant Agrawal 	}
1743c720c5f6SHemant Agrawal 
17441d6329b2SHemant Agrawal 	for (i = 0; i < num; i++) {
17451d6329b2SHemant Agrawal 		xstats[i].id = i;
1746*25d0ae62SJun Yang 		page_id = dpaa2_xstats_strings[i].page_id;
1747*25d0ae62SJun Yang 		stats_id = dpaa2_xstats_strings[i].stats_id;
1748*25d0ae62SJun Yang 		xstats[i].value = value[page_id].raw.counter[stats_id];
17491d6329b2SHemant Agrawal 	}
17501d6329b2SHemant Agrawal 	return i;
17511d6329b2SHemant Agrawal err:
1752a10a988aSShreyansh Jain 	DPAA2_PMD_ERR("Error in obtaining extended stats (%d)", retcode);
17531d6329b2SHemant Agrawal 	return retcode;
17541d6329b2SHemant Agrawal }
17551d6329b2SHemant Agrawal 
17561d6329b2SHemant Agrawal static int
17571d6329b2SHemant Agrawal dpaa2_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
17581d6329b2SHemant Agrawal 	struct rte_eth_xstat_name *xstats_names,
1759876b2c90SHemant Agrawal 	unsigned int limit)
17601d6329b2SHemant Agrawal {
17611d6329b2SHemant Agrawal 	unsigned int i, stat_cnt = RTE_DIM(dpaa2_xstats_strings);
17621d6329b2SHemant Agrawal 
1763876b2c90SHemant Agrawal 	if (limit < stat_cnt)
1764876b2c90SHemant Agrawal 		return stat_cnt;
1765876b2c90SHemant Agrawal 
17661d6329b2SHemant Agrawal 	if (xstats_names != NULL)
17671d6329b2SHemant Agrawal 		for (i = 0; i < stat_cnt; i++)
1768f9acaf84SBruce Richardson 			strlcpy(xstats_names[i].name,
1769f9acaf84SBruce Richardson 				dpaa2_xstats_strings[i].name,
1770f9acaf84SBruce Richardson 				sizeof(xstats_names[i].name));
17711d6329b2SHemant Agrawal 
17721d6329b2SHemant Agrawal 	return stat_cnt;
17731d6329b2SHemant Agrawal }
17741d6329b2SHemant Agrawal 
17751d6329b2SHemant Agrawal static int
17761d6329b2SHemant Agrawal dpaa2_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
17771d6329b2SHemant Agrawal 	uint64_t *values, unsigned int n)
17781d6329b2SHemant Agrawal {
17791d6329b2SHemant Agrawal 	unsigned int i, stat_cnt = RTE_DIM(dpaa2_xstats_strings);
17801d6329b2SHemant Agrawal 	uint64_t values_copy[stat_cnt];
1781*25d0ae62SJun Yang 	uint8_t page_id, stats_id;
17821d6329b2SHemant Agrawal 
17831d6329b2SHemant Agrawal 	if (!ids) {
17841d6329b2SHemant Agrawal 		struct dpaa2_dev_priv *priv = dev->data->dev_private;
1785*25d0ae62SJun Yang 		struct fsl_mc_io *dpni = dev->process_private;
17861d6329b2SHemant Agrawal 		int32_t retcode;
1787c720c5f6SHemant Agrawal 		union dpni_statistics value[5] = {};
17881d6329b2SHemant Agrawal 
17891d6329b2SHemant Agrawal 		if (n < stat_cnt)
17901d6329b2SHemant Agrawal 			return stat_cnt;
17911d6329b2SHemant Agrawal 
17921d6329b2SHemant Agrawal 		if (!values)
17931d6329b2SHemant Agrawal 			return 0;
17941d6329b2SHemant Agrawal 
17951d6329b2SHemant Agrawal 		/* Get Counters from page_0*/
17961d6329b2SHemant Agrawal 		retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
17971d6329b2SHemant Agrawal 					      0, 0, &value[0]);
17981d6329b2SHemant Agrawal 		if (retcode)
17991d6329b2SHemant Agrawal 			return 0;
18001d6329b2SHemant Agrawal 
18011d6329b2SHemant Agrawal 		/* Get Counters from page_1*/
18021d6329b2SHemant Agrawal 		retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
18031d6329b2SHemant Agrawal 					      1, 0, &value[1]);
18041d6329b2SHemant Agrawal 		if (retcode)
18051d6329b2SHemant Agrawal 			return 0;
18061d6329b2SHemant Agrawal 
18071d6329b2SHemant Agrawal 		/* Get Counters from page_2*/
18081d6329b2SHemant Agrawal 		retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
18091d6329b2SHemant Agrawal 					      2, 0, &value[2]);
18101d6329b2SHemant Agrawal 		if (retcode)
18111d6329b2SHemant Agrawal 			return 0;
18121d6329b2SHemant Agrawal 
1813c720c5f6SHemant Agrawal 		/* Get Counters from page_4*/
1814c720c5f6SHemant Agrawal 		retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
1815c720c5f6SHemant Agrawal 					      4, 0, &value[4]);
1816c720c5f6SHemant Agrawal 		if (retcode)
1817c720c5f6SHemant Agrawal 			return 0;
1818c720c5f6SHemant Agrawal 
18191d6329b2SHemant Agrawal 		for (i = 0; i < stat_cnt; i++) {
1820*25d0ae62SJun Yang 			page_id = dpaa2_xstats_strings[i].page_id;
1821*25d0ae62SJun Yang 			stats_id = dpaa2_xstats_strings[i].stats_id;
1822*25d0ae62SJun Yang 			values[i] = value[page_id].raw.counter[stats_id];
18231d6329b2SHemant Agrawal 		}
18241d6329b2SHemant Agrawal 		return stat_cnt;
18251d6329b2SHemant Agrawal 	}
18261d6329b2SHemant Agrawal 
18271d6329b2SHemant Agrawal 	dpaa2_xstats_get_by_id(dev, NULL, values_copy, stat_cnt);
18281d6329b2SHemant Agrawal 
18291d6329b2SHemant Agrawal 	for (i = 0; i < n; i++) {
18301d6329b2SHemant Agrawal 		if (ids[i] >= stat_cnt) {
1831a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("xstats id value isn't valid");
1832*25d0ae62SJun Yang 			return -EINVAL;
18331d6329b2SHemant Agrawal 		}
18341d6329b2SHemant Agrawal 		values[i] = values_copy[ids[i]];
18351d6329b2SHemant Agrawal 	}
18361d6329b2SHemant Agrawal 	return n;
18371d6329b2SHemant Agrawal }
18381d6329b2SHemant Agrawal 
18391d6329b2SHemant Agrawal static int
1840*25d0ae62SJun Yang dpaa2_xstats_get_names_by_id(struct rte_eth_dev *dev,
18411d6329b2SHemant Agrawal 	const uint64_t *ids,
18428c9f976fSAndrew Rybchenko 	struct rte_eth_xstat_name *xstats_names,
18431d6329b2SHemant Agrawal 	unsigned int limit)
18441d6329b2SHemant Agrawal {
18451d6329b2SHemant Agrawal 	unsigned int i, stat_cnt = RTE_DIM(dpaa2_xstats_strings);
18461d6329b2SHemant Agrawal 	struct rte_eth_xstat_name xstats_names_copy[stat_cnt];
18471d6329b2SHemant Agrawal 
18481d6329b2SHemant Agrawal 	if (!ids)
18491d6329b2SHemant Agrawal 		return dpaa2_xstats_get_names(dev, xstats_names, limit);
18501d6329b2SHemant Agrawal 
18511d6329b2SHemant Agrawal 	dpaa2_xstats_get_names(dev, xstats_names_copy, limit);
18521d6329b2SHemant Agrawal 
18531d6329b2SHemant Agrawal 	for (i = 0; i < limit; i++) {
18541d6329b2SHemant Agrawal 		if (ids[i] >= stat_cnt) {
1855a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("xstats id value isn't valid");
18561d6329b2SHemant Agrawal 			return -1;
18571d6329b2SHemant Agrawal 		}
18581d6329b2SHemant Agrawal 		strcpy(xstats_names[i].name, xstats_names_copy[ids[i]].name);
18591d6329b2SHemant Agrawal 	}
18601d6329b2SHemant Agrawal 	return limit;
18611d6329b2SHemant Agrawal }
18621d6329b2SHemant Agrawal 
18639970a9adSIgor Romanov static int
18641d6329b2SHemant Agrawal dpaa2_dev_stats_reset(struct rte_eth_dev *dev)
1865b0aa5459SHemant Agrawal {
1866b0aa5459SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1867*25d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
18689970a9adSIgor Romanov 	int retcode;
1869e43f2521SShreyansh Jain 	int i;
1870e43f2521SShreyansh Jain 	struct dpaa2_queue *dpaa2_q;
1871b0aa5459SHemant Agrawal 
1872b0aa5459SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1873b0aa5459SHemant Agrawal 
1874*25d0ae62SJun Yang 	if (!dpni) {
1875a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
18769970a9adSIgor Romanov 		return -EINVAL;
1877b0aa5459SHemant Agrawal 	}
1878b0aa5459SHemant Agrawal 
1879b0aa5459SHemant Agrawal 	retcode =  dpni_reset_statistics(dpni, CMD_PRI_LOW, priv->token);
1880b0aa5459SHemant Agrawal 	if (retcode)
1881b0aa5459SHemant Agrawal 		goto error;
1882b0aa5459SHemant Agrawal 
1883e43f2521SShreyansh Jain 	/* Reset the per queue stats in dpaa2_queue structure */
1884e43f2521SShreyansh Jain 	for (i = 0; i < priv->nb_rx_queues; i++) {
1885*25d0ae62SJun Yang 		dpaa2_q = priv->rx_vq[i];
1886e43f2521SShreyansh Jain 		if (dpaa2_q)
1887e43f2521SShreyansh Jain 			dpaa2_q->rx_pkts = 0;
1888e43f2521SShreyansh Jain 	}
1889e43f2521SShreyansh Jain 
1890e43f2521SShreyansh Jain 	for (i = 0; i < priv->nb_tx_queues; i++) {
1891*25d0ae62SJun Yang 		dpaa2_q = priv->tx_vq[i];
1892e43f2521SShreyansh Jain 		if (dpaa2_q)
1893e43f2521SShreyansh Jain 			dpaa2_q->tx_pkts = 0;
1894e43f2521SShreyansh Jain 	}
1895e43f2521SShreyansh Jain 
18969970a9adSIgor Romanov 	return 0;
1897b0aa5459SHemant Agrawal 
1898b0aa5459SHemant Agrawal error:
1899a10a988aSShreyansh Jain 	DPAA2_PMD_ERR("Operation not completed:Error Code = %d", retcode);
19009970a9adSIgor Romanov 	return retcode;
1901b0aa5459SHemant Agrawal };
1902b0aa5459SHemant Agrawal 
1903c56c86ffSHemant Agrawal /* return 0 means link status changed, -1 means not changed */
1904c56c86ffSHemant Agrawal static int
1905c56c86ffSHemant Agrawal dpaa2_dev_link_update(struct rte_eth_dev *dev,
1906eadcfd95SRohit Raj 		      int wait_to_complete)
1907c56c86ffSHemant Agrawal {
1908c56c86ffSHemant Agrawal 	int ret;
1909c56c86ffSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1910*25d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
19117e2eb5f0SStephen Hemminger 	struct rte_eth_link link;
1912c56c86ffSHemant Agrawal 	struct dpni_link_state state = {0};
1913eadcfd95SRohit Raj 	uint8_t count;
1914c56c86ffSHemant Agrawal 
1915*25d0ae62SJun Yang 	if (!dpni) {
1916a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1917c56c86ffSHemant Agrawal 		return 0;
1918c56c86ffSHemant Agrawal 	}
1919c56c86ffSHemant Agrawal 
1920eadcfd95SRohit Raj 	for (count = 0; count <= MAX_REPEAT_TIME; count++) {
1921eadcfd95SRohit Raj 		ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token,
1922eadcfd95SRohit Raj 					  &state);
1923c56c86ffSHemant Agrawal 		if (ret < 0) {
192444e87c27SShreyansh Jain 			DPAA2_PMD_DEBUG("error: dpni_get_link_state %d", ret);
1925*25d0ae62SJun Yang 			return ret;
1926c56c86ffSHemant Agrawal 		}
1927295968d1SFerruh Yigit 		if (state.up == RTE_ETH_LINK_DOWN &&
1928eadcfd95SRohit Raj 		    wait_to_complete)
1929eadcfd95SRohit Raj 			rte_delay_ms(CHECK_INTERVAL);
1930eadcfd95SRohit Raj 		else
1931eadcfd95SRohit Raj 			break;
1932eadcfd95SRohit Raj 	}
1933c56c86ffSHemant Agrawal 
1934c56c86ffSHemant Agrawal 	memset(&link, 0, sizeof(struct rte_eth_link));
1935c56c86ffSHemant Agrawal 	link.link_status = state.up;
1936c56c86ffSHemant Agrawal 	link.link_speed = state.rate;
1937c56c86ffSHemant Agrawal 
1938c56c86ffSHemant Agrawal 	if (state.options & DPNI_LINK_OPT_HALF_DUPLEX)
1939295968d1SFerruh Yigit 		link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
1940c56c86ffSHemant Agrawal 	else
1941295968d1SFerruh Yigit 		link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
1942c56c86ffSHemant Agrawal 
19437e2eb5f0SStephen Hemminger 	ret = rte_eth_linkstatus_set(dev, &link);
1944*25d0ae62SJun Yang 	if (ret < 0)
1945a10a988aSShreyansh Jain 		DPAA2_PMD_DEBUG("No change in status");
1946c56c86ffSHemant Agrawal 	else
1947f665790aSDavid Marchand 		DPAA2_PMD_INFO("Port %d Link is %s", dev->data->port_id,
19487e2eb5f0SStephen Hemminger 			       link.link_status ? "Up" : "Down");
19497e2eb5f0SStephen Hemminger 
19507e2eb5f0SStephen Hemminger 	return ret;
1951c56c86ffSHemant Agrawal }
1952c56c86ffSHemant Agrawal 
1953a1f3a12cSHemant Agrawal /**
1954a1f3a12cSHemant Agrawal  * Toggle the DPNI to enable, if not already enabled.
1955a1f3a12cSHemant Agrawal  * This is not strictly PHY up/down - it is more of logical toggling.
1956a1f3a12cSHemant Agrawal  */
1957a1f3a12cSHemant Agrawal static int
1958a1f3a12cSHemant Agrawal dpaa2_dev_set_link_up(struct rte_eth_dev *dev)
1959a1f3a12cSHemant Agrawal {
1960a1f3a12cSHemant Agrawal 	int ret = -EINVAL;
1961a1f3a12cSHemant Agrawal 	struct dpaa2_dev_priv *priv;
1962a1f3a12cSHemant Agrawal 	struct fsl_mc_io *dpni;
1963a1f3a12cSHemant Agrawal 	int en = 0;
1964aa8c595aSHemant Agrawal 	struct dpni_link_state state = {0};
1965a1f3a12cSHemant Agrawal 
1966a1f3a12cSHemant Agrawal 	priv = dev->data->dev_private;
1967*25d0ae62SJun Yang 	dpni = dev->process_private;
1968a1f3a12cSHemant Agrawal 
1969*25d0ae62SJun Yang 	if (!dpni) {
1970a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1971a1f3a12cSHemant Agrawal 		return ret;
1972a1f3a12cSHemant Agrawal 	}
1973a1f3a12cSHemant Agrawal 
1974a1f3a12cSHemant Agrawal 	/* Check if DPNI is currently enabled */
1975a1f3a12cSHemant Agrawal 	ret = dpni_is_enabled(dpni, CMD_PRI_LOW, priv->token, &en);
1976a1f3a12cSHemant Agrawal 	if (ret) {
1977a1f3a12cSHemant Agrawal 		/* Unable to obtain dpni status; Not continuing */
1978a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Interface Link UP failed (%d)", ret);
197925dd1fd0SRohit Raj 		return ret;
1980a1f3a12cSHemant Agrawal 	}
1981a1f3a12cSHemant Agrawal 
1982a1f3a12cSHemant Agrawal 	/* Enable link if not already enabled */
1983a1f3a12cSHemant Agrawal 	if (!en) {
1984a1f3a12cSHemant Agrawal 		ret = dpni_enable(dpni, CMD_PRI_LOW, priv->token);
1985a1f3a12cSHemant Agrawal 		if (ret) {
1986a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("Interface Link UP failed (%d)", ret);
198725dd1fd0SRohit Raj 			return ret;
1988a1f3a12cSHemant Agrawal 		}
1989a1f3a12cSHemant Agrawal 	}
1990aa8c595aSHemant Agrawal 	ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state);
1991aa8c595aSHemant Agrawal 	if (ret < 0) {
199244e87c27SShreyansh Jain 		DPAA2_PMD_DEBUG("Unable to get link state (%d)", ret);
199325dd1fd0SRohit Raj 		return ret;
1994aa8c595aSHemant Agrawal 	}
1995aa8c595aSHemant Agrawal 
1996a1f3a12cSHemant Agrawal 	/* changing tx burst function to start enqueues */
1997a1f3a12cSHemant Agrawal 	dev->tx_pkt_burst = dpaa2_dev_tx;
1998aa8c595aSHemant Agrawal 	dev->data->dev_link.link_status = state.up;
19997e6ecac2SRohit Raj 	dev->data->dev_link.link_speed = state.rate;
2000a1f3a12cSHemant Agrawal 
200125dd1fd0SRohit Raj 	if (state.options & DPNI_LINK_OPT_HALF_DUPLEX)
200225dd1fd0SRohit Raj 		dev->data->dev_link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
2003aa8c595aSHemant Agrawal 	else
200425dd1fd0SRohit Raj 		dev->data->dev_link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
200525dd1fd0SRohit Raj 
200625dd1fd0SRohit Raj 	if (state.up)
200725dd1fd0SRohit Raj 		DPAA2_PMD_DEBUG("Port %d Link is Up", dev->data->port_id);
200825dd1fd0SRohit Raj 	else
200925dd1fd0SRohit Raj 		DPAA2_PMD_DEBUG("Port %d Link is Down", dev->data->port_id);
2010a1f3a12cSHemant Agrawal 	return ret;
2011a1f3a12cSHemant Agrawal }
2012a1f3a12cSHemant Agrawal 
2013a1f3a12cSHemant Agrawal /**
2014a1f3a12cSHemant Agrawal  * Toggle the DPNI to disable, if not already disabled.
2015a1f3a12cSHemant Agrawal  * This is not strictly PHY up/down - it is more of logical toggling.
2016a1f3a12cSHemant Agrawal  */
2017a1f3a12cSHemant Agrawal static int
2018a1f3a12cSHemant Agrawal dpaa2_dev_set_link_down(struct rte_eth_dev *dev)
2019a1f3a12cSHemant Agrawal {
2020a1f3a12cSHemant Agrawal 	int ret = -EINVAL;
2021a1f3a12cSHemant Agrawal 	struct dpaa2_dev_priv *priv;
2022a1f3a12cSHemant Agrawal 	struct fsl_mc_io *dpni;
2023a1f3a12cSHemant Agrawal 	int dpni_enabled = 0;
2024a1f3a12cSHemant Agrawal 	int retries = 10;
2025a1f3a12cSHemant Agrawal 
2026a1f3a12cSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
2027a1f3a12cSHemant Agrawal 
2028a1f3a12cSHemant Agrawal 	priv = dev->data->dev_private;
2029*25d0ae62SJun Yang 	dpni = dev->process_private;
2030a1f3a12cSHemant Agrawal 
2031*25d0ae62SJun Yang 	if (!dpni) {
2032a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Device has not yet been configured");
2033a1f3a12cSHemant Agrawal 		return ret;
2034a1f3a12cSHemant Agrawal 	}
2035a1f3a12cSHemant Agrawal 
2036a1f3a12cSHemant Agrawal 	/*changing  tx burst function to avoid any more enqueues */
2037a41f593fSFerruh Yigit 	dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
2038a1f3a12cSHemant Agrawal 
2039a1f3a12cSHemant Agrawal 	/* Loop while dpni_disable() attempts to drain the egress FQs
2040a1f3a12cSHemant Agrawal 	 * and confirm them back to us.
2041a1f3a12cSHemant Agrawal 	 */
2042a1f3a12cSHemant Agrawal 	do {
2043a1f3a12cSHemant Agrawal 		ret = dpni_disable(dpni, 0, priv->token);
2044a1f3a12cSHemant Agrawal 		if (ret) {
2045a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("dpni disable failed (%d)", ret);
2046a1f3a12cSHemant Agrawal 			return ret;
2047a1f3a12cSHemant Agrawal 		}
2048a1f3a12cSHemant Agrawal 		ret = dpni_is_enabled(dpni, 0, priv->token, &dpni_enabled);
2049a1f3a12cSHemant Agrawal 		if (ret) {
2050a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("dpni enable check failed (%d)", ret);
2051a1f3a12cSHemant Agrawal 			return ret;
2052a1f3a12cSHemant Agrawal 		}
2053a1f3a12cSHemant Agrawal 		if (dpni_enabled)
2054a1f3a12cSHemant Agrawal 			/* Allow the MC some slack */
2055a1f3a12cSHemant Agrawal 			rte_delay_us(100 * 1000);
2056a1f3a12cSHemant Agrawal 	} while (dpni_enabled && --retries);
2057a1f3a12cSHemant Agrawal 
2058a1f3a12cSHemant Agrawal 	if (!retries) {
2059a10a988aSShreyansh Jain 		DPAA2_PMD_WARN("Retry count exceeded disabling dpni");
2060a1f3a12cSHemant Agrawal 		/* todo- we may have to manually cleanup queues.
2061a1f3a12cSHemant Agrawal 		 */
2062a1f3a12cSHemant Agrawal 	} else {
2063a10a988aSShreyansh Jain 		DPAA2_PMD_INFO("Port %d Link DOWN successful",
2064a1f3a12cSHemant Agrawal 			       dev->data->port_id);
2065a1f3a12cSHemant Agrawal 	}
2066a1f3a12cSHemant Agrawal 
2067a1f3a12cSHemant Agrawal 	dev->data->dev_link.link_status = 0;
2068a1f3a12cSHemant Agrawal 
2069a1f3a12cSHemant Agrawal 	return ret;
2070a1f3a12cSHemant Agrawal }
2071a1f3a12cSHemant Agrawal 
2072977d0006SHemant Agrawal static int
2073977d0006SHemant Agrawal dpaa2_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
2074977d0006SHemant Agrawal {
2075977d0006SHemant Agrawal 	int ret = -EINVAL;
2076977d0006SHemant Agrawal 	struct dpaa2_dev_priv *priv;
2077977d0006SHemant Agrawal 	struct fsl_mc_io *dpni;
2078263377beSBrick Yang 	struct dpni_link_cfg cfg = {0};
2079977d0006SHemant Agrawal 
2080977d0006SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
2081977d0006SHemant Agrawal 
2082977d0006SHemant Agrawal 	priv = dev->data->dev_private;
2083*25d0ae62SJun Yang 	dpni = dev->process_private;
2084977d0006SHemant Agrawal 
2085*25d0ae62SJun Yang 	if (!dpni || !fc_conf) {
2086a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("device not configured");
2087977d0006SHemant Agrawal 		return ret;
2088977d0006SHemant Agrawal 	}
2089977d0006SHemant Agrawal 
2090263377beSBrick Yang 	ret = dpni_get_link_cfg(dpni, CMD_PRI_LOW, priv->token, &cfg);
2091977d0006SHemant Agrawal 	if (ret) {
2092263377beSBrick Yang 		DPAA2_PMD_ERR("error: dpni_get_link_cfg %d", ret);
2093977d0006SHemant Agrawal 		return ret;
2094977d0006SHemant Agrawal 	}
2095977d0006SHemant Agrawal 
2096977d0006SHemant Agrawal 	memset(fc_conf, 0, sizeof(struct rte_eth_fc_conf));
2097263377beSBrick Yang 	if (cfg.options & DPNI_LINK_OPT_PAUSE) {
2098977d0006SHemant Agrawal 		/* DPNI_LINK_OPT_PAUSE set
2099977d0006SHemant Agrawal 		 *  if ASYM_PAUSE not set,
2100977d0006SHemant Agrawal 		 *	RX Side flow control (handle received Pause frame)
2101977d0006SHemant Agrawal 		 *	TX side flow control (send Pause frame)
2102977d0006SHemant Agrawal 		 *  if ASYM_PAUSE set,
2103977d0006SHemant Agrawal 		 *	RX Side flow control (handle received Pause frame)
2104977d0006SHemant Agrawal 		 *	No TX side flow control (send Pause frame disabled)
2105977d0006SHemant Agrawal 		 */
2106263377beSBrick Yang 		if (!(cfg.options & DPNI_LINK_OPT_ASYM_PAUSE))
2107295968d1SFerruh Yigit 			fc_conf->mode = RTE_ETH_FC_FULL;
2108977d0006SHemant Agrawal 		else
2109295968d1SFerruh Yigit 			fc_conf->mode = RTE_ETH_FC_RX_PAUSE;
2110977d0006SHemant Agrawal 	} else {
2111977d0006SHemant Agrawal 		/* DPNI_LINK_OPT_PAUSE not set
2112977d0006SHemant Agrawal 		 *  if ASYM_PAUSE set,
2113977d0006SHemant Agrawal 		 *	TX side flow control (send Pause frame)
2114977d0006SHemant Agrawal 		 *	No RX side flow control (No action on pause frame rx)
2115977d0006SHemant Agrawal 		 *  if ASYM_PAUSE not set,
2116977d0006SHemant Agrawal 		 *	Flow control disabled
2117977d0006SHemant Agrawal 		 */
2118263377beSBrick Yang 		if (cfg.options & DPNI_LINK_OPT_ASYM_PAUSE)
2119295968d1SFerruh Yigit 			fc_conf->mode = RTE_ETH_FC_TX_PAUSE;
2120977d0006SHemant Agrawal 		else
2121295968d1SFerruh Yigit 			fc_conf->mode = RTE_ETH_FC_NONE;
2122977d0006SHemant Agrawal 	}
2123977d0006SHemant Agrawal 
2124977d0006SHemant Agrawal 	return ret;
2125977d0006SHemant Agrawal }
2126977d0006SHemant Agrawal 
2127977d0006SHemant Agrawal static int
2128977d0006SHemant Agrawal dpaa2_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
2129977d0006SHemant Agrawal {
2130977d0006SHemant Agrawal 	int ret = -EINVAL;
2131977d0006SHemant Agrawal 	struct dpaa2_dev_priv *priv;
2132977d0006SHemant Agrawal 	struct fsl_mc_io *dpni;
2133977d0006SHemant Agrawal 	struct dpni_link_cfg cfg = {0};
2134977d0006SHemant Agrawal 
2135977d0006SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
2136977d0006SHemant Agrawal 
2137977d0006SHemant Agrawal 	priv = dev->data->dev_private;
2138*25d0ae62SJun Yang 	dpni = dev->process_private;
2139977d0006SHemant Agrawal 
2140*25d0ae62SJun Yang 	if (!dpni) {
2141a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
2142977d0006SHemant Agrawal 		return ret;
2143977d0006SHemant Agrawal 	}
2144977d0006SHemant Agrawal 
2145263377beSBrick Yang 	/* It is necessary to obtain the current cfg before setting fc_conf
2146977d0006SHemant Agrawal 	 * as MC would return error in case rate, autoneg or duplex values are
2147977d0006SHemant Agrawal 	 * different.
2148977d0006SHemant Agrawal 	 */
2149263377beSBrick Yang 	ret = dpni_get_link_cfg(dpni, CMD_PRI_LOW, priv->token, &cfg);
2150977d0006SHemant Agrawal 	if (ret) {
2151263377beSBrick Yang 		DPAA2_PMD_ERR("Unable to get link cfg (err=%d)", ret);
215272cd5a48SJun Yang 		return ret;
2153977d0006SHemant Agrawal 	}
2154977d0006SHemant Agrawal 
2155977d0006SHemant Agrawal 	/* Disable link before setting configuration */
2156977d0006SHemant Agrawal 	dpaa2_dev_set_link_down(dev);
2157977d0006SHemant Agrawal 
2158977d0006SHemant Agrawal 	/* update cfg with fc_conf */
2159977d0006SHemant Agrawal 	switch (fc_conf->mode) {
2160295968d1SFerruh Yigit 	case RTE_ETH_FC_FULL:
2161977d0006SHemant Agrawal 		/* Full flow control;
2162977d0006SHemant Agrawal 		 * OPT_PAUSE set, ASYM_PAUSE not set
2163977d0006SHemant Agrawal 		 */
2164977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_PAUSE;
2165977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_ASYM_PAUSE;
2166f090a4c3SHemant Agrawal 		break;
2167295968d1SFerruh Yigit 	case RTE_ETH_FC_TX_PAUSE:
2168977d0006SHemant Agrawal 		/* Enable RX flow control
2169977d0006SHemant Agrawal 		 * OPT_PAUSE not set;
2170977d0006SHemant Agrawal 		 * ASYM_PAUSE set;
2171977d0006SHemant Agrawal 		 */
2172977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_ASYM_PAUSE;
2173977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_PAUSE;
2174977d0006SHemant Agrawal 		break;
2175295968d1SFerruh Yigit 	case RTE_ETH_FC_RX_PAUSE:
2176977d0006SHemant Agrawal 		/* Enable TX Flow control
2177977d0006SHemant Agrawal 		 * OPT_PAUSE set
2178977d0006SHemant Agrawal 		 * ASYM_PAUSE set
2179977d0006SHemant Agrawal 		 */
2180977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_PAUSE;
2181977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_ASYM_PAUSE;
2182977d0006SHemant Agrawal 		break;
2183295968d1SFerruh Yigit 	case RTE_ETH_FC_NONE:
2184977d0006SHemant Agrawal 		/* Disable Flow control
2185977d0006SHemant Agrawal 		 * OPT_PAUSE not set
2186977d0006SHemant Agrawal 		 * ASYM_PAUSE not set
2187977d0006SHemant Agrawal 		 */
2188977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_PAUSE;
2189977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_ASYM_PAUSE;
2190977d0006SHemant Agrawal 		break;
2191977d0006SHemant Agrawal 	default:
2192a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Incorrect Flow control flag (%d)",
2193977d0006SHemant Agrawal 			      fc_conf->mode);
219472cd5a48SJun Yang 		return -EINVAL;
2195977d0006SHemant Agrawal 	}
2196977d0006SHemant Agrawal 
2197977d0006SHemant Agrawal 	ret = dpni_set_link_cfg(dpni, CMD_PRI_LOW, priv->token, &cfg);
2198977d0006SHemant Agrawal 	if (ret)
2199a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Unable to set Link configuration (err=%d)",
2200977d0006SHemant Agrawal 			      ret);
2201977d0006SHemant Agrawal 
2202977d0006SHemant Agrawal 	/* Enable link */
2203977d0006SHemant Agrawal 	dpaa2_dev_set_link_up(dev);
2204977d0006SHemant Agrawal 
2205977d0006SHemant Agrawal 	return ret;
2206977d0006SHemant Agrawal }
2207977d0006SHemant Agrawal 
220863d5c3b0SHemant Agrawal static int
220963d5c3b0SHemant Agrawal dpaa2_dev_rss_hash_update(struct rte_eth_dev *dev,
221063d5c3b0SHemant Agrawal 			  struct rte_eth_rss_conf *rss_conf)
221163d5c3b0SHemant Agrawal {
221263d5c3b0SHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
2213271f5aeeSJun Yang 	struct dpaa2_dev_priv *priv = data->dev_private;
221463d5c3b0SHemant Agrawal 	struct rte_eth_conf *eth_conf = &data->dev_conf;
2215271f5aeeSJun Yang 	int ret, tc_index;
221663d5c3b0SHemant Agrawal 
221763d5c3b0SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
221863d5c3b0SHemant Agrawal 
221963d5c3b0SHemant Agrawal 	if (rss_conf->rss_hf) {
2220271f5aeeSJun Yang 		for (tc_index = 0; tc_index < priv->num_rx_tc; tc_index++) {
2221271f5aeeSJun Yang 			ret = dpaa2_setup_flow_dist(dev, rss_conf->rss_hf,
2222271f5aeeSJun Yang 				tc_index);
222363d5c3b0SHemant Agrawal 			if (ret) {
2224271f5aeeSJun Yang 				DPAA2_PMD_ERR("Unable to set flow dist on tc%d",
2225271f5aeeSJun Yang 					tc_index);
222663d5c3b0SHemant Agrawal 				return ret;
222763d5c3b0SHemant Agrawal 			}
2228271f5aeeSJun Yang 		}
222963d5c3b0SHemant Agrawal 	} else {
2230271f5aeeSJun Yang 		for (tc_index = 0; tc_index < priv->num_rx_tc; tc_index++) {
2231271f5aeeSJun Yang 			ret = dpaa2_remove_flow_dist(dev, tc_index);
223263d5c3b0SHemant Agrawal 			if (ret) {
2233271f5aeeSJun Yang 				DPAA2_PMD_ERR(
2234271f5aeeSJun Yang 					"Unable to remove flow dist on tc%d",
2235271f5aeeSJun Yang 					tc_index);
223663d5c3b0SHemant Agrawal 				return ret;
223763d5c3b0SHemant Agrawal 			}
223863d5c3b0SHemant Agrawal 		}
2239271f5aeeSJun Yang 	}
224063d5c3b0SHemant Agrawal 	eth_conf->rx_adv_conf.rss_conf.rss_hf = rss_conf->rss_hf;
224163d5c3b0SHemant Agrawal 	return 0;
224263d5c3b0SHemant Agrawal }
224363d5c3b0SHemant Agrawal 
224463d5c3b0SHemant Agrawal static int
224563d5c3b0SHemant Agrawal dpaa2_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
224663d5c3b0SHemant Agrawal 			    struct rte_eth_rss_conf *rss_conf)
224763d5c3b0SHemant Agrawal {
224863d5c3b0SHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
224963d5c3b0SHemant Agrawal 	struct rte_eth_conf *eth_conf = &data->dev_conf;
225063d5c3b0SHemant Agrawal 
225163d5c3b0SHemant Agrawal 	/* dpaa2 does not support rss_key, so length should be 0*/
225263d5c3b0SHemant Agrawal 	rss_conf->rss_key_len = 0;
225363d5c3b0SHemant Agrawal 	rss_conf->rss_hf = eth_conf->rx_adv_conf.rss_conf.rss_hf;
225463d5c3b0SHemant Agrawal 	return 0;
225563d5c3b0SHemant Agrawal }
225663d5c3b0SHemant Agrawal 
2257b677d4c6SNipun Gupta int dpaa2_eth_eventq_attach(const struct rte_eth_dev *dev,
2258b677d4c6SNipun Gupta 		int eth_rx_queue_id,
22593835cc22SNipun Gupta 		struct dpaa2_dpcon_dev *dpcon,
2260b677d4c6SNipun Gupta 		const struct rte_event_eth_rx_adapter_queue_conf *queue_conf)
2261b677d4c6SNipun Gupta {
2262b677d4c6SNipun Gupta 	struct dpaa2_dev_priv *eth_priv = dev->data->dev_private;
226381c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
2264b677d4c6SNipun Gupta 	struct dpaa2_queue *dpaa2_ethq = eth_priv->rx_vq[eth_rx_queue_id];
2265b677d4c6SNipun Gupta 	uint8_t flow_id = dpaa2_ethq->flow_id;
2266b677d4c6SNipun Gupta 	struct dpni_queue cfg;
22673835cc22SNipun Gupta 	uint8_t options, priority;
2268b677d4c6SNipun Gupta 	int ret;
2269b677d4c6SNipun Gupta 
2270b677d4c6SNipun Gupta 	if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_PARALLEL)
2271b677d4c6SNipun Gupta 		dpaa2_ethq->cb = dpaa2_dev_process_parallel_event;
22722d378863SNipun Gupta 	else if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_ATOMIC)
22732d378863SNipun Gupta 		dpaa2_ethq->cb = dpaa2_dev_process_atomic_event;
227416c4a3c4SNipun Gupta 	else if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_ORDERED)
227516c4a3c4SNipun Gupta 		dpaa2_ethq->cb = dpaa2_dev_process_ordered_event;
2276b677d4c6SNipun Gupta 	else
2277b677d4c6SNipun Gupta 		return -EINVAL;
2278b677d4c6SNipun Gupta 
22793835cc22SNipun Gupta 	priority = (RTE_EVENT_DEV_PRIORITY_LOWEST / queue_conf->ev.priority) *
22803835cc22SNipun Gupta 		   (dpcon->num_priorities - 1);
22813835cc22SNipun Gupta 
2282b677d4c6SNipun Gupta 	memset(&cfg, 0, sizeof(struct dpni_queue));
2283b677d4c6SNipun Gupta 	options = DPNI_QUEUE_OPT_DEST;
2284b677d4c6SNipun Gupta 	cfg.destination.type = DPNI_DEST_DPCON;
22853835cc22SNipun Gupta 	cfg.destination.id = dpcon->dpcon_id;
22863835cc22SNipun Gupta 	cfg.destination.priority = priority;
2287b677d4c6SNipun Gupta 
22882d378863SNipun Gupta 	if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
22892d378863SNipun Gupta 		options |= DPNI_QUEUE_OPT_HOLD_ACTIVE;
22902d378863SNipun Gupta 		cfg.destination.hold_active = 1;
22912d378863SNipun Gupta 	}
22922d378863SNipun Gupta 
229316c4a3c4SNipun Gupta 	if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_ORDERED &&
229416c4a3c4SNipun Gupta 			!eth_priv->en_ordered) {
229516c4a3c4SNipun Gupta 		struct opr_cfg ocfg;
229616c4a3c4SNipun Gupta 
229716c4a3c4SNipun Gupta 		/* Restoration window size = 256 frames */
229816c4a3c4SNipun Gupta 		ocfg.oprrws = 3;
229916c4a3c4SNipun Gupta 		/* Restoration window size = 512 frames for LX2 */
230016c4a3c4SNipun Gupta 		if (dpaa2_svr_family == SVR_LX2160A)
230116c4a3c4SNipun Gupta 			ocfg.oprrws = 4;
230216c4a3c4SNipun Gupta 		/* Auto advance NESN window enabled */
230316c4a3c4SNipun Gupta 		ocfg.oa = 1;
230416c4a3c4SNipun Gupta 		/* Late arrival window size disabled */
230516c4a3c4SNipun Gupta 		ocfg.olws = 0;
23067be78d02SJosh Soref 		/* ORL resource exhaustion advance NESN disabled */
230716c4a3c4SNipun Gupta 		ocfg.oeane = 0;
230816c4a3c4SNipun Gupta 		/* Loose ordering enabled */
230916c4a3c4SNipun Gupta 		ocfg.oloe = 1;
231016c4a3c4SNipun Gupta 		eth_priv->en_loose_ordered = 1;
231116c4a3c4SNipun Gupta 		/* Strict ordering enabled if explicitly set */
231216c4a3c4SNipun Gupta 		if (getenv("DPAA2_STRICT_ORDERING_ENABLE")) {
231316c4a3c4SNipun Gupta 			ocfg.oloe = 0;
231416c4a3c4SNipun Gupta 			eth_priv->en_loose_ordered = 0;
231516c4a3c4SNipun Gupta 		}
231616c4a3c4SNipun Gupta 
231716c4a3c4SNipun Gupta 		ret = dpni_set_opr(dpni, CMD_PRI_LOW, eth_priv->token,
231816c4a3c4SNipun Gupta 				   dpaa2_ethq->tc_index, flow_id,
23192cb2abf3SHemant Agrawal 				   OPR_OPT_CREATE, &ocfg, 0);
232016c4a3c4SNipun Gupta 		if (ret) {
2321f665790aSDavid Marchand 			DPAA2_PMD_ERR("Error setting opr: ret: %d", ret);
232216c4a3c4SNipun Gupta 			return ret;
232316c4a3c4SNipun Gupta 		}
232416c4a3c4SNipun Gupta 
232516c4a3c4SNipun Gupta 		eth_priv->en_ordered = 1;
232616c4a3c4SNipun Gupta 	}
232716c4a3c4SNipun Gupta 
2328b677d4c6SNipun Gupta 	options |= DPNI_QUEUE_OPT_USER_CTX;
23295ae1edffSHemant Agrawal 	cfg.user_context = (size_t)(dpaa2_ethq);
2330b677d4c6SNipun Gupta 
2331b677d4c6SNipun Gupta 	ret = dpni_set_queue(dpni, CMD_PRI_LOW, eth_priv->token, DPNI_QUEUE_RX,
2332b677d4c6SNipun Gupta 			     dpaa2_ethq->tc_index, flow_id, options, &cfg);
2333b677d4c6SNipun Gupta 	if (ret) {
2334a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error in dpni_set_queue: ret: %d", ret);
2335b677d4c6SNipun Gupta 		return ret;
2336b677d4c6SNipun Gupta 	}
2337b677d4c6SNipun Gupta 
2338b677d4c6SNipun Gupta 	memcpy(&dpaa2_ethq->ev, &queue_conf->ev, sizeof(struct rte_event));
2339b677d4c6SNipun Gupta 
2340b677d4c6SNipun Gupta 	return 0;
2341b677d4c6SNipun Gupta }
2342b677d4c6SNipun Gupta 
2343b677d4c6SNipun Gupta int dpaa2_eth_eventq_detach(const struct rte_eth_dev *dev,
2344b677d4c6SNipun Gupta 		int eth_rx_queue_id)
2345b677d4c6SNipun Gupta {
2346b677d4c6SNipun Gupta 	struct dpaa2_dev_priv *eth_priv = dev->data->dev_private;
234781c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
2348b677d4c6SNipun Gupta 	struct dpaa2_queue *dpaa2_ethq = eth_priv->rx_vq[eth_rx_queue_id];
2349b677d4c6SNipun Gupta 	uint8_t flow_id = dpaa2_ethq->flow_id;
2350b677d4c6SNipun Gupta 	struct dpni_queue cfg;
2351b677d4c6SNipun Gupta 	uint8_t options;
2352b677d4c6SNipun Gupta 	int ret;
2353b677d4c6SNipun Gupta 
2354b677d4c6SNipun Gupta 	memset(&cfg, 0, sizeof(struct dpni_queue));
2355b677d4c6SNipun Gupta 	options = DPNI_QUEUE_OPT_DEST;
2356b677d4c6SNipun Gupta 	cfg.destination.type = DPNI_DEST_NONE;
2357b677d4c6SNipun Gupta 
2358b677d4c6SNipun Gupta 	ret = dpni_set_queue(dpni, CMD_PRI_LOW, eth_priv->token, DPNI_QUEUE_RX,
2359b677d4c6SNipun Gupta 			     dpaa2_ethq->tc_index, flow_id, options, &cfg);
2360b677d4c6SNipun Gupta 	if (ret)
2361a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error in dpni_set_queue: ret: %d", ret);
2362b677d4c6SNipun Gupta 
2363b677d4c6SNipun Gupta 	return ret;
2364b677d4c6SNipun Gupta }
2365b677d4c6SNipun Gupta 
2366fe2b986aSSunil Kumar Kori static int
2367fb7ad441SThomas Monjalon dpaa2_dev_flow_ops_get(struct rte_eth_dev *dev,
2368fb7ad441SThomas Monjalon 		       const struct rte_flow_ops **ops)
2369fe2b986aSSunil Kumar Kori {
2370fe2b986aSSunil Kumar Kori 	if (!dev)
2371fe2b986aSSunil Kumar Kori 		return -ENODEV;
2372fe2b986aSSunil Kumar Kori 
2373fb7ad441SThomas Monjalon 	*ops = &dpaa2_flow_ops;
2374fb7ad441SThomas Monjalon 	return 0;
2375fe2b986aSSunil Kumar Kori }
2376fe2b986aSSunil Kumar Kori 
2377de1d70f0SHemant Agrawal static void
2378de1d70f0SHemant Agrawal dpaa2_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
2379de1d70f0SHemant Agrawal 	struct rte_eth_rxq_info *qinfo)
2380de1d70f0SHemant Agrawal {
2381de1d70f0SHemant Agrawal 	struct dpaa2_queue *rxq;
2382731fa400SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
2383*25d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
2384731fa400SHemant Agrawal 	uint16_t max_frame_length;
2385de1d70f0SHemant Agrawal 
2386*25d0ae62SJun Yang 	rxq = dev->data->rx_queues[queue_id];
2387de1d70f0SHemant Agrawal 
2388de1d70f0SHemant Agrawal 	qinfo->mp = rxq->mb_pool;
2389de1d70f0SHemant Agrawal 	qinfo->scattered_rx = dev->data->scattered_rx;
2390de1d70f0SHemant Agrawal 	qinfo->nb_desc = rxq->nb_desc;
2391731fa400SHemant Agrawal 	if (dpni_get_max_frame_length(dpni, CMD_PRI_LOW, priv->token,
2392731fa400SHemant Agrawal 				&max_frame_length) == 0)
2393731fa400SHemant Agrawal 		qinfo->rx_buf_size = max_frame_length;
2394de1d70f0SHemant Agrawal 
2395de1d70f0SHemant Agrawal 	qinfo->conf.rx_free_thresh = 1;
2396de1d70f0SHemant Agrawal 	qinfo->conf.rx_drop_en = 1;
2397de1d70f0SHemant Agrawal 	qinfo->conf.rx_deferred_start = 0;
2398de1d70f0SHemant Agrawal 	qinfo->conf.offloads = rxq->offloads;
2399de1d70f0SHemant Agrawal }
2400de1d70f0SHemant Agrawal 
2401de1d70f0SHemant Agrawal static void
2402de1d70f0SHemant Agrawal dpaa2_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
2403de1d70f0SHemant Agrawal 	struct rte_eth_txq_info *qinfo)
2404de1d70f0SHemant Agrawal {
2405de1d70f0SHemant Agrawal 	struct dpaa2_queue *txq;
2406de1d70f0SHemant Agrawal 
2407de1d70f0SHemant Agrawal 	txq = dev->data->tx_queues[queue_id];
2408de1d70f0SHemant Agrawal 
2409de1d70f0SHemant Agrawal 	qinfo->nb_desc = txq->nb_desc;
2410de1d70f0SHemant Agrawal 	qinfo->conf.tx_thresh.pthresh = 0;
2411de1d70f0SHemant Agrawal 	qinfo->conf.tx_thresh.hthresh = 0;
2412de1d70f0SHemant Agrawal 	qinfo->conf.tx_thresh.wthresh = 0;
2413de1d70f0SHemant Agrawal 
2414de1d70f0SHemant Agrawal 	qinfo->conf.tx_free_thresh = 0;
2415de1d70f0SHemant Agrawal 	qinfo->conf.tx_rs_thresh = 0;
2416de1d70f0SHemant Agrawal 	qinfo->conf.offloads = txq->offloads;
2417de1d70f0SHemant Agrawal 	qinfo->conf.tx_deferred_start = 0;
2418de1d70f0SHemant Agrawal }
2419de1d70f0SHemant Agrawal 
2420ac624068SGagandeep Singh static int
2421ac624068SGagandeep Singh dpaa2_tm_ops_get(struct rte_eth_dev *dev __rte_unused, void *ops)
2422ac624068SGagandeep Singh {
2423ac624068SGagandeep Singh 	*(const void **)ops = &dpaa2_tm_ops;
2424ac624068SGagandeep Singh 
2425ac624068SGagandeep Singh 	return 0;
2426ac624068SGagandeep Singh }
2427ac624068SGagandeep Singh 
2428a5b375edSNipun Gupta void
2429a5b375edSNipun Gupta rte_pmd_dpaa2_thread_init(void)
2430a5b375edSNipun Gupta {
2431a5b375edSNipun Gupta 	int ret;
2432a5b375edSNipun Gupta 
2433a5b375edSNipun Gupta 	if (unlikely(!DPAA2_PER_LCORE_DPIO)) {
2434a5b375edSNipun Gupta 		ret = dpaa2_affine_qbman_swp();
2435a5b375edSNipun Gupta 		if (ret) {
2436a5b375edSNipun Gupta 			DPAA2_PMD_ERR(
2437f665790aSDavid Marchand 				"Failed to allocate IO portal, tid: %d",
2438a5b375edSNipun Gupta 				rte_gettid());
2439a5b375edSNipun Gupta 			return;
2440a5b375edSNipun Gupta 		}
2441a5b375edSNipun Gupta 	}
2442a5b375edSNipun Gupta }
2443a5b375edSNipun Gupta 
24443e5a335dSHemant Agrawal static struct eth_dev_ops dpaa2_ethdev_ops = {
24453e5a335dSHemant Agrawal 	.dev_configure	  = dpaa2_eth_dev_configure,
24463e5a335dSHemant Agrawal 	.dev_start	      = dpaa2_dev_start,
24473e5a335dSHemant Agrawal 	.dev_stop	      = dpaa2_dev_stop,
24483e5a335dSHemant Agrawal 	.dev_close	      = dpaa2_dev_close,
2449c0e5c69aSHemant Agrawal 	.promiscuous_enable   = dpaa2_dev_promiscuous_enable,
2450c0e5c69aSHemant Agrawal 	.promiscuous_disable  = dpaa2_dev_promiscuous_disable,
24515d5aeeedSHemant Agrawal 	.allmulticast_enable  = dpaa2_dev_allmulticast_enable,
24525d5aeeedSHemant Agrawal 	.allmulticast_disable = dpaa2_dev_allmulticast_disable,
2453a1f3a12cSHemant Agrawal 	.dev_set_link_up      = dpaa2_dev_set_link_up,
2454a1f3a12cSHemant Agrawal 	.dev_set_link_down    = dpaa2_dev_set_link_down,
2455c56c86ffSHemant Agrawal 	.link_update	   = dpaa2_dev_link_update,
2456b0aa5459SHemant Agrawal 	.stats_get	       = dpaa2_dev_stats_get,
24571d6329b2SHemant Agrawal 	.xstats_get	       = dpaa2_dev_xstats_get,
24581d6329b2SHemant Agrawal 	.xstats_get_by_id     = dpaa2_xstats_get_by_id,
24591d6329b2SHemant Agrawal 	.xstats_get_names_by_id = dpaa2_xstats_get_names_by_id,
24601d6329b2SHemant Agrawal 	.xstats_get_names      = dpaa2_xstats_get_names,
2461b0aa5459SHemant Agrawal 	.stats_reset	   = dpaa2_dev_stats_reset,
24621d6329b2SHemant Agrawal 	.xstats_reset	      = dpaa2_dev_stats_reset,
2463748eccb9SHemant Agrawal 	.fw_version_get	   = dpaa2_fw_version_get,
24643e5a335dSHemant Agrawal 	.dev_infos_get	   = dpaa2_dev_info_get,
2465a5fc38d4SHemant Agrawal 	.dev_supported_ptypes_get = dpaa2_supported_ptypes_get,
2466e31d4d21SHemant Agrawal 	.mtu_set           = dpaa2_dev_mtu_set,
24673ce294f2SHemant Agrawal 	.vlan_filter_set      = dpaa2_vlan_filter_set,
24683ce294f2SHemant Agrawal 	.vlan_offload_set     = dpaa2_vlan_offload_set,
2469e59b75ffSHemant Agrawal 	.vlan_tpid_set	      = dpaa2_vlan_tpid_set,
24703e5a335dSHemant Agrawal 	.rx_queue_setup    = dpaa2_dev_rx_queue_setup,
24713e5a335dSHemant Agrawal 	.rx_queue_release  = dpaa2_dev_rx_queue_release,
24723e5a335dSHemant Agrawal 	.tx_queue_setup    = dpaa2_dev_tx_queue_setup,
2473ddbc2b66SApeksha Gupta 	.rx_burst_mode_get = dpaa2_dev_rx_burst_mode_get,
2474ddbc2b66SApeksha Gupta 	.tx_burst_mode_get = dpaa2_dev_tx_burst_mode_get,
2475977d0006SHemant Agrawal 	.flow_ctrl_get	      = dpaa2_flow_ctrl_get,
2476977d0006SHemant Agrawal 	.flow_ctrl_set	      = dpaa2_flow_ctrl_set,
2477b4d97b7dSHemant Agrawal 	.mac_addr_add         = dpaa2_dev_add_mac_addr,
2478b4d97b7dSHemant Agrawal 	.mac_addr_remove      = dpaa2_dev_remove_mac_addr,
2479b4d97b7dSHemant Agrawal 	.mac_addr_set         = dpaa2_dev_set_mac_addr,
248063d5c3b0SHemant Agrawal 	.rss_hash_update      = dpaa2_dev_rss_hash_update,
248163d5c3b0SHemant Agrawal 	.rss_hash_conf_get    = dpaa2_dev_rss_hash_conf_get,
2482fb7ad441SThomas Monjalon 	.flow_ops_get         = dpaa2_dev_flow_ops_get,
2483de1d70f0SHemant Agrawal 	.rxq_info_get	      = dpaa2_rxq_info_get,
2484de1d70f0SHemant Agrawal 	.txq_info_get	      = dpaa2_txq_info_get,
2485ac624068SGagandeep Singh 	.tm_ops_get	      = dpaa2_tm_ops_get,
2486bc767866SPriyanka Jain #if defined(RTE_LIBRTE_IEEE1588)
2487bc767866SPriyanka Jain 	.timesync_enable      = dpaa2_timesync_enable,
2488bc767866SPriyanka Jain 	.timesync_disable     = dpaa2_timesync_disable,
2489bc767866SPriyanka Jain 	.timesync_read_time   = dpaa2_timesync_read_time,
2490bc767866SPriyanka Jain 	.timesync_write_time  = dpaa2_timesync_write_time,
2491bc767866SPriyanka Jain 	.timesync_adjust_time = dpaa2_timesync_adjust_time,
2492bc767866SPriyanka Jain 	.timesync_read_rx_timestamp = dpaa2_timesync_read_rx_timestamp,
2493bc767866SPriyanka Jain 	.timesync_read_tx_timestamp = dpaa2_timesync_read_tx_timestamp,
2494bc767866SPriyanka Jain #endif
24953e5a335dSHemant Agrawal };
24963e5a335dSHemant Agrawal 
2497c3e0a706SShreyansh Jain /* Populate the mac address from physically available (u-boot/firmware) and/or
2498c3e0a706SShreyansh Jain  * one set by higher layers like MC (restool) etc.
2499c3e0a706SShreyansh Jain  * Returns the table of MAC entries (multiple entries)
2500c3e0a706SShreyansh Jain  */
2501c3e0a706SShreyansh Jain static int
2502*25d0ae62SJun Yang populate_mac_addr(struct fsl_mc_io *dpni_dev,
2503*25d0ae62SJun Yang 	struct dpaa2_dev_priv *priv, struct rte_ether_addr *mac_entry)
2504c3e0a706SShreyansh Jain {
2505*25d0ae62SJun Yang 	int ret = 0;
25066d13ea8eSOlivier Matz 	struct rte_ether_addr phy_mac, prime_mac;
250741c24ea2SShreyansh Jain 
25086d13ea8eSOlivier Matz 	memset(&phy_mac, 0, sizeof(struct rte_ether_addr));
25096d13ea8eSOlivier Matz 	memset(&prime_mac, 0, sizeof(struct rte_ether_addr));
2510c3e0a706SShreyansh Jain 
2511c3e0a706SShreyansh Jain 	/* Get the physical device MAC address */
2512c3e0a706SShreyansh Jain 	ret = dpni_get_port_mac_addr(dpni_dev, CMD_PRI_LOW, priv->token,
2513c3e0a706SShreyansh Jain 				     phy_mac.addr_bytes);
2514c3e0a706SShreyansh Jain 	if (ret) {
2515c3e0a706SShreyansh Jain 		DPAA2_PMD_ERR("DPNI get physical port MAC failed: %d", ret);
2516c3e0a706SShreyansh Jain 		goto cleanup;
2517c3e0a706SShreyansh Jain 	}
2518c3e0a706SShreyansh Jain 
2519c3e0a706SShreyansh Jain 	ret = dpni_get_primary_mac_addr(dpni_dev, CMD_PRI_LOW, priv->token,
2520c3e0a706SShreyansh Jain 					prime_mac.addr_bytes);
2521c3e0a706SShreyansh Jain 	if (ret) {
2522c3e0a706SShreyansh Jain 		DPAA2_PMD_ERR("DPNI get Prime port MAC failed: %d", ret);
2523c3e0a706SShreyansh Jain 		goto cleanup;
2524c3e0a706SShreyansh Jain 	}
2525c3e0a706SShreyansh Jain 
2526c3e0a706SShreyansh Jain 	/* Now that both MAC have been obtained, do:
2527c3e0a706SShreyansh Jain 	 *  if not_empty_mac(phy) && phy != Prime, overwrite prime with Phy
2528c3e0a706SShreyansh Jain 	 *     and return phy
2529c3e0a706SShreyansh Jain 	 *  If empty_mac(phy), return prime.
2530c3e0a706SShreyansh Jain 	 *  if both are empty, create random MAC, set as prime and return
2531c3e0a706SShreyansh Jain 	 */
2532538da7a1SOlivier Matz 	if (!rte_is_zero_ether_addr(&phy_mac)) {
2533c3e0a706SShreyansh Jain 		/* If the addresses are not same, overwrite prime */
2534538da7a1SOlivier Matz 		if (!rte_is_same_ether_addr(&phy_mac, &prime_mac)) {
2535c3e0a706SShreyansh Jain 			ret = dpni_set_primary_mac_addr(dpni_dev, CMD_PRI_LOW,
2536c3e0a706SShreyansh Jain 							priv->token,
2537c3e0a706SShreyansh Jain 							phy_mac.addr_bytes);
2538c3e0a706SShreyansh Jain 			if (ret) {
2539c3e0a706SShreyansh Jain 				DPAA2_PMD_ERR("Unable to set MAC Address: %d",
2540c3e0a706SShreyansh Jain 					      ret);
2541c3e0a706SShreyansh Jain 				goto cleanup;
2542c3e0a706SShreyansh Jain 			}
25436d13ea8eSOlivier Matz 			memcpy(&prime_mac, &phy_mac,
25446d13ea8eSOlivier Matz 				sizeof(struct rte_ether_addr));
2545c3e0a706SShreyansh Jain 		}
2546538da7a1SOlivier Matz 	} else if (rte_is_zero_ether_addr(&prime_mac)) {
2547c3e0a706SShreyansh Jain 		/* In case phys and prime, both are zero, create random MAC */
2548538da7a1SOlivier Matz 		rte_eth_random_addr(prime_mac.addr_bytes);
2549c3e0a706SShreyansh Jain 		ret = dpni_set_primary_mac_addr(dpni_dev, CMD_PRI_LOW,
2550c3e0a706SShreyansh Jain 						priv->token,
2551c3e0a706SShreyansh Jain 						prime_mac.addr_bytes);
2552c3e0a706SShreyansh Jain 		if (ret) {
2553c3e0a706SShreyansh Jain 			DPAA2_PMD_ERR("Unable to set MAC Address: %d", ret);
2554c3e0a706SShreyansh Jain 			goto cleanup;
2555c3e0a706SShreyansh Jain 		}
2556c3e0a706SShreyansh Jain 	}
2557c3e0a706SShreyansh Jain 
2558c3e0a706SShreyansh Jain 	/* prime_mac the final MAC address */
25596d13ea8eSOlivier Matz 	memcpy(mac_entry, &prime_mac, sizeof(struct rte_ether_addr));
2560c3e0a706SShreyansh Jain 	return 0;
2561c3e0a706SShreyansh Jain 
2562c3e0a706SShreyansh Jain cleanup:
2563*25d0ae62SJun Yang 	return ret;
2564c3e0a706SShreyansh Jain }
2565c3e0a706SShreyansh Jain 
2566c147eae0SHemant Agrawal static int
2567a3a997f0SHemant Agrawal check_devargs_handler(__rte_unused const char *key, const char *value,
2568a3a997f0SHemant Agrawal 		      __rte_unused void *opaque)
2569a3a997f0SHemant Agrawal {
2570a3a997f0SHemant Agrawal 	if (strcmp(value, "1"))
2571a3a997f0SHemant Agrawal 		return -1;
2572a3a997f0SHemant Agrawal 
2573a3a997f0SHemant Agrawal 	return 0;
2574a3a997f0SHemant Agrawal }
2575a3a997f0SHemant Agrawal 
2576a3a997f0SHemant Agrawal static int
2577a3a997f0SHemant Agrawal dpaa2_get_devargs(struct rte_devargs *devargs, const char *key)
2578a3a997f0SHemant Agrawal {
2579a3a997f0SHemant Agrawal 	struct rte_kvargs *kvlist;
2580a3a997f0SHemant Agrawal 
2581a3a997f0SHemant Agrawal 	if (!devargs)
2582a3a997f0SHemant Agrawal 		return 0;
2583a3a997f0SHemant Agrawal 
2584a3a997f0SHemant Agrawal 	kvlist = rte_kvargs_parse(devargs->args, NULL);
2585a3a997f0SHemant Agrawal 	if (!kvlist)
2586a3a997f0SHemant Agrawal 		return 0;
2587a3a997f0SHemant Agrawal 
2588a3a997f0SHemant Agrawal 	if (!rte_kvargs_count(kvlist, key)) {
2589a3a997f0SHemant Agrawal 		rte_kvargs_free(kvlist);
2590a3a997f0SHemant Agrawal 		return 0;
2591a3a997f0SHemant Agrawal 	}
2592a3a997f0SHemant Agrawal 
2593a3a997f0SHemant Agrawal 	if (rte_kvargs_process(kvlist, key,
2594a3a997f0SHemant Agrawal 			       check_devargs_handler, NULL) < 0) {
2595a3a997f0SHemant Agrawal 		rte_kvargs_free(kvlist);
2596a3a997f0SHemant Agrawal 		return 0;
2597a3a997f0SHemant Agrawal 	}
2598a3a997f0SHemant Agrawal 	rte_kvargs_free(kvlist);
2599a3a997f0SHemant Agrawal 
2600a3a997f0SHemant Agrawal 	return 1;
2601a3a997f0SHemant Agrawal }
2602a3a997f0SHemant Agrawal 
2603a3a997f0SHemant Agrawal static int
2604c147eae0SHemant Agrawal dpaa2_dev_init(struct rte_eth_dev *eth_dev)
2605c147eae0SHemant Agrawal {
26063e5a335dSHemant Agrawal 	struct rte_device *dev = eth_dev->device;
26073e5a335dSHemant Agrawal 	struct rte_dpaa2_device *dpaa2_dev;
26083e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni_dev;
26093e5a335dSHemant Agrawal 	struct dpni_attr attr;
26103e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = eth_dev->data->dev_private;
2611bee61d86SHemant Agrawal 	struct dpni_buffer_layout layout;
2612fe2b986aSSunil Kumar Kori 	int ret, hw_id, i;
26133e5a335dSHemant Agrawal 
2614d401ead1SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
2615d401ead1SHemant Agrawal 
261681c42c84SShreyansh Jain 	dpni_dev = rte_malloc(NULL, sizeof(struct fsl_mc_io), 0);
261781c42c84SShreyansh Jain 	if (!dpni_dev) {
261881c42c84SShreyansh Jain 		DPAA2_PMD_ERR("Memory allocation failed for dpni device");
261981c42c84SShreyansh Jain 		return -1;
262081c42c84SShreyansh Jain 	}
2621a6a5f4b4SHemant Agrawal 	dpni_dev->regs = dpaa2_get_mcp_ptr(MC_PORTAL_INDEX);
2622*25d0ae62SJun Yang 	eth_dev->process_private = dpni_dev;
262381c42c84SShreyansh Jain 
2624c147eae0SHemant Agrawal 	/* For secondary processes, the primary has done all the work */
2625e7b187dbSShreyansh Jain 	if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
2626e7b187dbSShreyansh Jain 		/* In case of secondary, only burst and ops API need to be
2627e7b187dbSShreyansh Jain 		 * plugged.
2628e7b187dbSShreyansh Jain 		 */
2629e7b187dbSShreyansh Jain 		eth_dev->dev_ops = &dpaa2_ethdev_ops;
2630cbfc6111SFerruh Yigit 		eth_dev->rx_queue_count = dpaa2_dev_rx_queue_count;
2631a3a997f0SHemant Agrawal 		if (dpaa2_get_devargs(dev->devargs, DRIVER_LOOPBACK_MODE))
2632a3a997f0SHemant Agrawal 			eth_dev->rx_pkt_burst = dpaa2_dev_loopback_rx;
263320191ab3SNipun Gupta 		else if (dpaa2_get_devargs(dev->devargs,
263420191ab3SNipun Gupta 					DRIVER_NO_PREFETCH_MODE))
263520191ab3SNipun Gupta 			eth_dev->rx_pkt_burst = dpaa2_dev_rx;
2636a3a997f0SHemant Agrawal 		else
2637e7b187dbSShreyansh Jain 			eth_dev->rx_pkt_burst = dpaa2_dev_prefetch_rx;
2638e7b187dbSShreyansh Jain 		eth_dev->tx_pkt_burst = dpaa2_dev_tx;
2639c147eae0SHemant Agrawal 		return 0;
2640e7b187dbSShreyansh Jain 	}
2641c147eae0SHemant Agrawal 
26423e5a335dSHemant Agrawal 	dpaa2_dev = container_of(dev, struct rte_dpaa2_device, device);
26433e5a335dSHemant Agrawal 
26443e5a335dSHemant Agrawal 	hw_id = dpaa2_dev->object_id;
26453e5a335dSHemant Agrawal 	ret = dpni_open(dpni_dev, CMD_PRI_LOW, hw_id, &priv->token);
26463e5a335dSHemant Agrawal 	if (ret) {
2647a10a988aSShreyansh Jain 		DPAA2_PMD_ERR(
2648a10a988aSShreyansh Jain 			     "Failure in opening dpni@%d with err code %d",
2649d4984046SHemant Agrawal 			     hw_id, ret);
2650d4984046SHemant Agrawal 		rte_free(dpni_dev);
2651*25d0ae62SJun Yang 		return ret;
26523e5a335dSHemant Agrawal 	}
26533e5a335dSHemant Agrawal 
2654f023d059SJun Yang 	if (eth_dev->data->dev_conf.lpbk_mode)
2655f023d059SJun Yang 		dpaa2_dev_recycle_deconfig(eth_dev);
2656f023d059SJun Yang 
26573e5a335dSHemant Agrawal 	/* Clean the device first */
26583e5a335dSHemant Agrawal 	ret = dpni_reset(dpni_dev, CMD_PRI_LOW, priv->token);
26593e5a335dSHemant Agrawal 	if (ret) {
2660a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Failure cleaning dpni@%d with err code %d",
2661d4984046SHemant Agrawal 			      hw_id, ret);
2662d4984046SHemant Agrawal 		goto init_err;
26633e5a335dSHemant Agrawal 	}
26643e5a335dSHemant Agrawal 
26653e5a335dSHemant Agrawal 	ret = dpni_get_attributes(dpni_dev, CMD_PRI_LOW, priv->token, &attr);
26663e5a335dSHemant Agrawal 	if (ret) {
2667a10a988aSShreyansh Jain 		DPAA2_PMD_ERR(
2668a10a988aSShreyansh Jain 			     "Failure in get dpni@%d attribute, err code %d",
2669d4984046SHemant Agrawal 			     hw_id, ret);
2670d4984046SHemant Agrawal 		goto init_err;
26713e5a335dSHemant Agrawal 	}
26723e5a335dSHemant Agrawal 
267316bbc98aSShreyansh Jain 	priv->num_rx_tc = attr.num_rx_tcs;
267472100f0dSGagandeep Singh 	priv->num_tx_tc = attr.num_tx_tcs;
26754ce58f8aSJun Yang 	priv->qos_entries = attr.qos_entries;
26764ce58f8aSJun Yang 	priv->fs_entries = attr.fs_entries;
26774ce58f8aSJun Yang 	priv->dist_queues = attr.num_queues;
267872100f0dSGagandeep Singh 	priv->num_channels = attr.num_channels;
267972100f0dSGagandeep Singh 	priv->channel_inuse = 0;
2680f023d059SJun Yang 	rte_spinlock_init(&priv->lpbk_qp_lock);
26814ce58f8aSJun Yang 
268213b856acSHemant Agrawal 	/* only if the custom CG is enabled */
268313b856acSHemant Agrawal 	if (attr.options & DPNI_OPT_CUSTOM_CG)
268413b856acSHemant Agrawal 		priv->max_cgs = attr.num_cgs;
268513b856acSHemant Agrawal 	else
268613b856acSHemant Agrawal 		priv->max_cgs = 0;
268713b856acSHemant Agrawal 
268813b856acSHemant Agrawal 	for (i = 0; i < priv->max_cgs; i++)
268913b856acSHemant Agrawal 		priv->cgid_in_use[i] = 0;
269089c2ea8fSHemant Agrawal 
2691fe2b986aSSunil Kumar Kori 	for (i = 0; i < attr.num_rx_tcs; i++)
2692fe2b986aSSunil Kumar Kori 		priv->nb_rx_queues += attr.num_queues;
269389c2ea8fSHemant Agrawal 
269472100f0dSGagandeep Singh 	priv->nb_tx_queues = attr.num_tx_tcs * attr.num_channels;
2695ef18dafeSHemant Agrawal 
269613b856acSHemant Agrawal 	DPAA2_PMD_DEBUG("RX-TC= %d, rx_queues= %d, tx_queues=%d, max_cgs=%d",
2697a10a988aSShreyansh Jain 			priv->num_rx_tc, priv->nb_rx_queues,
269813b856acSHemant Agrawal 			priv->nb_tx_queues, priv->max_cgs);
26993e5a335dSHemant Agrawal 
27003e5a335dSHemant Agrawal 	priv->hw = dpni_dev;
27013e5a335dSHemant Agrawal 	priv->hw_id = hw_id;
270233fad432SHemant Agrawal 	priv->options = attr.options;
270333fad432SHemant Agrawal 	priv->max_mac_filters = attr.mac_filter_entries;
270433fad432SHemant Agrawal 	priv->max_vlan_filters = attr.vlan_filter_entries;
27053e5a335dSHemant Agrawal 	priv->flags = 0;
2706e806bf87SPriyanka Jain #if defined(RTE_LIBRTE_IEEE1588)
27070fcdbde0SHemant Agrawal 	DPAA2_PMD_INFO("DPDK IEEE1588 is enabled");
27088d21c563SHemant Agrawal 	priv->flags |= DPAA2_TX_CONF_ENABLE;
2709e806bf87SPriyanka Jain #endif
27108d21c563SHemant Agrawal 	/* Used with ``fslmc:dpni.1,drv_tx_conf=1`` */
27118d21c563SHemant Agrawal 	if (dpaa2_get_devargs(dev->devargs, DRIVER_TX_CONF)) {
27128d21c563SHemant Agrawal 		priv->flags |= DPAA2_TX_CONF_ENABLE;
27138d21c563SHemant Agrawal 		DPAA2_PMD_INFO("TX_CONF Enabled");
27148d21c563SHemant Agrawal 	}
27153e5a335dSHemant Agrawal 
27164690a611SNipun Gupta 	if (dpaa2_get_devargs(dev->devargs, DRIVER_ERROR_QUEUE)) {
27174690a611SNipun Gupta 		dpaa2_enable_err_queue = 1;
2718a63c6426SJun Yang 		DPAA2_PMD_INFO("Enable DMA error checks");
27194690a611SNipun Gupta 	}
27204690a611SNipun Gupta 
272193e41cb3SJun Yang 	if (getenv("DPAA2_PRINT_RX_PARSER_RESULT"))
272293e41cb3SJun Yang 		dpaa2_print_parser_result = 1;
272393e41cb3SJun Yang 
27243e5a335dSHemant Agrawal 	/* Allocate memory for hardware structure for queues */
27253e5a335dSHemant Agrawal 	ret = dpaa2_alloc_rx_tx_queues(eth_dev);
27263e5a335dSHemant Agrawal 	if (ret) {
2727a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Queue allocation Failed");
2728d4984046SHemant Agrawal 		goto init_err;
27293e5a335dSHemant Agrawal 	}
27303e5a335dSHemant Agrawal 
2731c3e0a706SShreyansh Jain 	/* Allocate memory for storing MAC addresses.
2732c3e0a706SShreyansh Jain 	 * Table of mac_filter_entries size is allocated so that RTE ether lib
2733c3e0a706SShreyansh Jain 	 * can add MAC entries when rte_eth_dev_mac_addr_add is called.
2734c3e0a706SShreyansh Jain 	 */
273533fad432SHemant Agrawal 	eth_dev->data->mac_addrs = rte_zmalloc("dpni",
273635b2d13fSOlivier Matz 		RTE_ETHER_ADDR_LEN * attr.mac_filter_entries, 0);
273733fad432SHemant Agrawal 	if (eth_dev->data->mac_addrs == NULL) {
2738a10a988aSShreyansh Jain 		DPAA2_PMD_ERR(
2739d4984046SHemant Agrawal 		   "Failed to allocate %d bytes needed to store MAC addresses",
274035b2d13fSOlivier Matz 		   RTE_ETHER_ADDR_LEN * attr.mac_filter_entries);
2741d4984046SHemant Agrawal 		ret = -ENOMEM;
2742d4984046SHemant Agrawal 		goto init_err;
274333fad432SHemant Agrawal 	}
274433fad432SHemant Agrawal 
2745c3e0a706SShreyansh Jain 	ret = populate_mac_addr(dpni_dev, priv, &eth_dev->data->mac_addrs[0]);
274633fad432SHemant Agrawal 	if (ret) {
2747c3e0a706SShreyansh Jain 		DPAA2_PMD_ERR("Unable to fetch MAC Address for device");
2748c3e0a706SShreyansh Jain 		rte_free(eth_dev->data->mac_addrs);
2749c3e0a706SShreyansh Jain 		eth_dev->data->mac_addrs = NULL;
2750d4984046SHemant Agrawal 		goto init_err;
275133fad432SHemant Agrawal 	}
275233fad432SHemant Agrawal 
2753bee61d86SHemant Agrawal 	/* ... tx buffer layout ... */
2754bee61d86SHemant Agrawal 	memset(&layout, 0, sizeof(struct dpni_buffer_layout));
27558d21c563SHemant Agrawal 	if (priv->flags & DPAA2_TX_CONF_ENABLE) {
27569ceacab7SPriyanka Jain 		layout.options = DPNI_BUF_LAYOUT_OPT_FRAME_STATUS |
27579ceacab7SPriyanka Jain 				 DPNI_BUF_LAYOUT_OPT_TIMESTAMP;
27589ceacab7SPriyanka Jain 		layout.pass_timestamp = true;
27599ceacab7SPriyanka Jain 	} else {
2760bee61d86SHemant Agrawal 		layout.options = DPNI_BUF_LAYOUT_OPT_FRAME_STATUS;
27619ceacab7SPriyanka Jain 	}
2762bee61d86SHemant Agrawal 	layout.pass_frame_status = 1;
2763bee61d86SHemant Agrawal 	ret = dpni_set_buffer_layout(dpni_dev, CMD_PRI_LOW, priv->token,
2764bee61d86SHemant Agrawal 				     DPNI_QUEUE_TX, &layout);
2765bee61d86SHemant Agrawal 	if (ret) {
2766a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error (%d) in setting tx buffer layout", ret);
2767d4984046SHemant Agrawal 		goto init_err;
2768bee61d86SHemant Agrawal 	}
2769bee61d86SHemant Agrawal 
2770bee61d86SHemant Agrawal 	/* ... tx-conf and error buffer layout ... */
2771bee61d86SHemant Agrawal 	memset(&layout, 0, sizeof(struct dpni_buffer_layout));
27728d21c563SHemant Agrawal 	if (priv->flags & DPAA2_TX_CONF_ENABLE) {
27738d21c563SHemant Agrawal 		layout.options = DPNI_BUF_LAYOUT_OPT_TIMESTAMP;
27749ceacab7SPriyanka Jain 		layout.pass_timestamp = true;
27759ceacab7SPriyanka Jain 	}
27768d21c563SHemant Agrawal 	layout.options |= DPNI_BUF_LAYOUT_OPT_FRAME_STATUS;
2777bee61d86SHemant Agrawal 	layout.pass_frame_status = 1;
2778bee61d86SHemant Agrawal 	ret = dpni_set_buffer_layout(dpni_dev, CMD_PRI_LOW, priv->token,
2779bee61d86SHemant Agrawal 				     DPNI_QUEUE_TX_CONFIRM, &layout);
2780bee61d86SHemant Agrawal 	if (ret) {
2781a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error (%d) in setting tx-conf buffer layout",
2782d4984046SHemant Agrawal 			     ret);
2783d4984046SHemant Agrawal 		goto init_err;
2784bee61d86SHemant Agrawal 	}
2785bee61d86SHemant Agrawal 
27863e5a335dSHemant Agrawal 	eth_dev->dev_ops = &dpaa2_ethdev_ops;
2787c147eae0SHemant Agrawal 
2788a3a997f0SHemant Agrawal 	if (dpaa2_get_devargs(dev->devargs, DRIVER_LOOPBACK_MODE)) {
2789a3a997f0SHemant Agrawal 		eth_dev->rx_pkt_burst = dpaa2_dev_loopback_rx;
2790a3a997f0SHemant Agrawal 		DPAA2_PMD_INFO("Loopback mode");
279120191ab3SNipun Gupta 	} else if (dpaa2_get_devargs(dev->devargs, DRIVER_NO_PREFETCH_MODE)) {
279220191ab3SNipun Gupta 		eth_dev->rx_pkt_burst = dpaa2_dev_rx;
279320191ab3SNipun Gupta 		DPAA2_PMD_INFO("No Prefetch mode");
2794a3a997f0SHemant Agrawal 	} else {
27955c6942fdSHemant Agrawal 		eth_dev->rx_pkt_burst = dpaa2_dev_prefetch_rx;
2796a3a997f0SHemant Agrawal 	}
2797cd9935ceSHemant Agrawal 	eth_dev->tx_pkt_burst = dpaa2_dev_tx;
27981261cd68SHemant Agrawal 
27997be78d02SJosh Soref 	/* Init fields w.r.t. classification */
28005f176728SJun Yang 	memset(&priv->extract.qos_key_extract, 0,
28015f176728SJun Yang 		sizeof(struct dpaa2_key_extract));
2802*25d0ae62SJun Yang 	priv->extract.qos_extract_param = rte_malloc(NULL,
2803*25d0ae62SJun Yang 		DPAA2_EXTRACT_PARAM_MAX_SIZE,
2804*25d0ae62SJun Yang 		RTE_CACHE_LINE_SIZE);
2805fe2b986aSSunil Kumar Kori 	if (!priv->extract.qos_extract_param) {
280656c1817dSJun Yang 		DPAA2_PMD_ERR("Memory alloc failed");
2807fe2b986aSSunil Kumar Kori 		goto init_err;
2808fe2b986aSSunil Kumar Kori 	}
28095f176728SJun Yang 
2810fe2b986aSSunil Kumar Kori 	for (i = 0; i < MAX_TCS; i++) {
28115f176728SJun Yang 		memset(&priv->extract.tc_key_extract[i], 0,
28125f176728SJun Yang 			sizeof(struct dpaa2_key_extract));
2813*25d0ae62SJun Yang 		priv->extract.tc_extract_param[i] = rte_malloc(NULL,
2814*25d0ae62SJun Yang 			DPAA2_EXTRACT_PARAM_MAX_SIZE,
2815*25d0ae62SJun Yang 			RTE_CACHE_LINE_SIZE);
28165f176728SJun Yang 		if (!priv->extract.tc_extract_param[i]) {
281756c1817dSJun Yang 			DPAA2_PMD_ERR("Memory alloc failed");
2818fe2b986aSSunil Kumar Kori 			goto init_err;
2819fe2b986aSSunil Kumar Kori 		}
2820fe2b986aSSunil Kumar Kori 	}
2821fe2b986aSSunil Kumar Kori 
28226f8be0fbSHemant Agrawal 	ret = dpni_set_max_frame_length(dpni_dev, CMD_PRI_LOW, priv->token,
28236f8be0fbSHemant Agrawal 					RTE_ETHER_MAX_LEN - RTE_ETHER_CRC_LEN
28246f8be0fbSHemant Agrawal 					+ VLAN_TAG_SIZE);
28256f8be0fbSHemant Agrawal 	if (ret) {
28266f8be0fbSHemant Agrawal 		DPAA2_PMD_ERR("Unable to set mtu. check config");
28276f8be0fbSHemant Agrawal 		goto init_err;
28286f8be0fbSHemant Agrawal 	}
2829de08b474SApeksha Gupta 	eth_dev->data->mtu = RTE_ETHER_MTU;
28306f8be0fbSHemant Agrawal 
283172ec7a67SSunil Kumar Kori 	/*TODO To enable soft parser support DPAA2 driver needs to integrate
283272ec7a67SSunil Kumar Kori 	 * with external entity to receive byte code for software sequence
283372ec7a67SSunil Kumar Kori 	 * and same will be offload to the H/W using MC interface.
283472ec7a67SSunil Kumar Kori 	 * Currently it is assumed that DPAA2 driver has byte code by some
283572ec7a67SSunil Kumar Kori 	 * mean and same if offloaded to H/W.
283672ec7a67SSunil Kumar Kori 	 */
283772ec7a67SSunil Kumar Kori 	if (getenv("DPAA2_ENABLE_SOFT_PARSER")) {
283872ec7a67SSunil Kumar Kori 		WRIOP_SS_INITIALIZER(priv);
283972ec7a67SSunil Kumar Kori 		ret = dpaa2_eth_load_wriop_soft_parser(priv, DPNI_SS_INGRESS);
284072ec7a67SSunil Kumar Kori 		if (ret < 0) {
2841f665790aSDavid Marchand 			DPAA2_PMD_ERR(" Error(%d) in loading softparser",
284272ec7a67SSunil Kumar Kori 				      ret);
284372ec7a67SSunil Kumar Kori 			return ret;
284472ec7a67SSunil Kumar Kori 		}
284572ec7a67SSunil Kumar Kori 
284672ec7a67SSunil Kumar Kori 		ret = dpaa2_eth_enable_wriop_soft_parser(priv,
284772ec7a67SSunil Kumar Kori 							 DPNI_SS_INGRESS);
284872ec7a67SSunil Kumar Kori 		if (ret < 0) {
2849f665790aSDavid Marchand 			DPAA2_PMD_ERR(" Error(%d) in enabling softparser",
285072ec7a67SSunil Kumar Kori 				      ret);
285172ec7a67SSunil Kumar Kori 			return ret;
285272ec7a67SSunil Kumar Kori 		}
285372ec7a67SSunil Kumar Kori 	}
285499400780SJun Yang 
285599400780SJun Yang 	ret = dpaa2_soft_parser_loaded();
285699400780SJun Yang 	if (ret > 0)
285799400780SJun Yang 		DPAA2_PMD_INFO("soft parser is loaded");
2858a247fcd9SStephen Hemminger 	DPAA2_PMD_INFO("%s: netdev created, connected to %s",
2859f023d059SJun Yang 		eth_dev->data->name, dpaa2_dev->ep_name);
2860f023d059SJun Yang 
2861c147eae0SHemant Agrawal 	return 0;
2862d4984046SHemant Agrawal init_err:
28633e5a335dSHemant Agrawal 	dpaa2_dev_close(eth_dev);
28643e5a335dSHemant Agrawal 
28655964d36aSSachin Saxena 	return ret;
2866c147eae0SHemant Agrawal }
2867c147eae0SHemant Agrawal 
286872cd5a48SJun Yang int
286972cd5a48SJun Yang rte_pmd_dpaa2_dev_is_dpaa2(uint32_t eth_id)
2870028d1dfdSJun Yang {
287172cd5a48SJun Yang 	struct rte_eth_dev *dev;
287272cd5a48SJun Yang 
287372cd5a48SJun Yang 	if (eth_id >= RTE_MAX_ETHPORTS)
287472cd5a48SJun Yang 		return false;
287572cd5a48SJun Yang 
287672cd5a48SJun Yang 	dev = &rte_eth_devices[eth_id];
287772cd5a48SJun Yang 	if (!dev->device)
287872cd5a48SJun Yang 		return false;
287972cd5a48SJun Yang 
2880028d1dfdSJun Yang 	return dev->device->driver == &rte_dpaa2_pmd.driver;
2881028d1dfdSJun Yang }
2882028d1dfdSJun Yang 
28832013e308SVanshika Shukla #if defined(RTE_LIBRTE_IEEE1588)
28842013e308SVanshika Shukla int
28852013e308SVanshika Shukla rte_pmd_dpaa2_get_one_step_ts(uint16_t port_id, bool mc_query)
28862013e308SVanshika Shukla {
28872013e308SVanshika Shukla 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
28882013e308SVanshika Shukla 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
28892013e308SVanshika Shukla 	struct fsl_mc_io *dpni = priv->eth_dev->process_private;
28902013e308SVanshika Shukla 	struct dpni_single_step_cfg ptp_cfg;
28912013e308SVanshika Shukla 	int err;
28922013e308SVanshika Shukla 
28932013e308SVanshika Shukla 	if (!mc_query)
28942013e308SVanshika Shukla 		return priv->ptp_correction_offset;
28952013e308SVanshika Shukla 
28962013e308SVanshika Shukla 	err = dpni_get_single_step_cfg(dpni, CMD_PRI_LOW, priv->token, &ptp_cfg);
28972013e308SVanshika Shukla 	if (err) {
28982013e308SVanshika Shukla 		DPAA2_PMD_ERR("Failed to retrieve onestep configuration");
28992013e308SVanshika Shukla 		return err;
29002013e308SVanshika Shukla 	}
29012013e308SVanshika Shukla 
29022013e308SVanshika Shukla 	if (!ptp_cfg.ptp_onestep_reg_base) {
29032013e308SVanshika Shukla 		DPAA2_PMD_ERR("1588 onestep reg not available");
29042013e308SVanshika Shukla 		return -1;
29052013e308SVanshika Shukla 	}
29062013e308SVanshika Shukla 
29072013e308SVanshika Shukla 	priv->ptp_correction_offset = ptp_cfg.offset;
29082013e308SVanshika Shukla 
29092013e308SVanshika Shukla 	return priv->ptp_correction_offset;
29102013e308SVanshika Shukla }
29112013e308SVanshika Shukla 
29122013e308SVanshika Shukla int
29132013e308SVanshika Shukla rte_pmd_dpaa2_set_one_step_ts(uint16_t port_id, uint16_t offset, uint8_t ch_update)
29142013e308SVanshika Shukla {
29152013e308SVanshika Shukla 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
29162013e308SVanshika Shukla 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
29172013e308SVanshika Shukla 	struct fsl_mc_io *dpni = dev->process_private;
29182013e308SVanshika Shukla 	struct dpni_single_step_cfg cfg;
29192013e308SVanshika Shukla 	int err;
29202013e308SVanshika Shukla 
29212013e308SVanshika Shukla 	cfg.en = 1;
29222013e308SVanshika Shukla 	cfg.ch_update = ch_update;
29232013e308SVanshika Shukla 	cfg.offset = offset;
29242013e308SVanshika Shukla 	cfg.peer_delay = 0;
29252013e308SVanshika Shukla 
29262013e308SVanshika Shukla 	err = dpni_set_single_step_cfg(dpni, CMD_PRI_LOW, priv->token, &cfg);
29272013e308SVanshika Shukla 	if (err)
29282013e308SVanshika Shukla 		return err;
29292013e308SVanshika Shukla 
29302013e308SVanshika Shukla 	priv->ptp_correction_offset = offset;
29312013e308SVanshika Shukla 
29322013e308SVanshika Shukla 	return 0;
29332013e308SVanshika Shukla }
29342013e308SVanshika Shukla #endif
29352013e308SVanshika Shukla 
2936748b9980SJun Yang static int dpaa2_tx_sg_pool_init(void)
2937748b9980SJun Yang {
2938748b9980SJun Yang 	char name[RTE_MEMZONE_NAMESIZE];
2939748b9980SJun Yang 
2940748b9980SJun Yang 	if (dpaa2_tx_sg_pool)
2941748b9980SJun Yang 		return 0;
2942748b9980SJun Yang 
2943748b9980SJun Yang 	sprintf(name, "dpaa2_mbuf_tx_sg_pool");
2944748b9980SJun Yang 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
2945748b9980SJun Yang 		dpaa2_tx_sg_pool = rte_pktmbuf_pool_create(name,
2946748b9980SJun Yang 			DPAA2_POOL_SIZE,
2947748b9980SJun Yang 			DPAA2_POOL_CACHE_SIZE, 0,
2948748b9980SJun Yang 			DPAA2_MAX_SGS * sizeof(struct qbman_sge),
2949748b9980SJun Yang 			rte_socket_id());
2950748b9980SJun Yang 		if (!dpaa2_tx_sg_pool) {
2951748b9980SJun Yang 			DPAA2_PMD_ERR("SG pool creation failed");
2952748b9980SJun Yang 			return -ENOMEM;
2953748b9980SJun Yang 		}
2954748b9980SJun Yang 	} else {
2955748b9980SJun Yang 		dpaa2_tx_sg_pool = rte_mempool_lookup(name);
2956748b9980SJun Yang 		if (!dpaa2_tx_sg_pool) {
2957748b9980SJun Yang 			DPAA2_PMD_ERR("SG pool lookup failed");
2958748b9980SJun Yang 			return -ENOMEM;
2959748b9980SJun Yang 		}
2960748b9980SJun Yang 	}
2961748b9980SJun Yang 
2962748b9980SJun Yang 	return 0;
2963748b9980SJun Yang }
2964748b9980SJun Yang 
2965c147eae0SHemant Agrawal static int
296655fd2703SHemant Agrawal rte_dpaa2_probe(struct rte_dpaa2_driver *dpaa2_drv,
2967c147eae0SHemant Agrawal 		struct rte_dpaa2_device *dpaa2_dev)
2968c147eae0SHemant Agrawal {
2969c147eae0SHemant Agrawal 	struct rte_eth_dev *eth_dev;
297081c42c84SShreyansh Jain 	struct dpaa2_dev_priv *dev_priv;
2971c147eae0SHemant Agrawal 	int diag;
2972c147eae0SHemant Agrawal 
2973f4435e38SHemant Agrawal 	if ((DPAA2_MBUF_HW_ANNOTATION + DPAA2_FD_PTA_SIZE) >
2974f4435e38SHemant Agrawal 		RTE_PKTMBUF_HEADROOM) {
2975*25d0ae62SJun Yang 		DPAA2_PMD_ERR("RTE_PKTMBUF_HEADROOM(%d) < DPAA2 Annotation(%d)",
2976f4435e38SHemant Agrawal 			RTE_PKTMBUF_HEADROOM,
2977f4435e38SHemant Agrawal 			DPAA2_MBUF_HW_ANNOTATION + DPAA2_FD_PTA_SIZE);
2978f4435e38SHemant Agrawal 
2979*25d0ae62SJun Yang 		return -EINVAL;
2980f4435e38SHemant Agrawal 	}
2981f4435e38SHemant Agrawal 
2982c147eae0SHemant Agrawal 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
2983e729ec76SHemant Agrawal 		eth_dev = rte_eth_dev_allocate(dpaa2_dev->device.name);
2984e729ec76SHemant Agrawal 		if (!eth_dev)
2985e729ec76SHemant Agrawal 			return -ENODEV;
298681c42c84SShreyansh Jain 		dev_priv = rte_zmalloc("ethdev private structure",
2987c147eae0SHemant Agrawal 				       sizeof(struct dpaa2_dev_priv),
2988c147eae0SHemant Agrawal 				       RTE_CACHE_LINE_SIZE);
298981c42c84SShreyansh Jain 		if (dev_priv == NULL) {
2990a10a988aSShreyansh Jain 			DPAA2_PMD_CRIT(
2991a10a988aSShreyansh Jain 				"Unable to allocate memory for private data");
2992c147eae0SHemant Agrawal 			rte_eth_dev_release_port(eth_dev);
2993c147eae0SHemant Agrawal 			return -ENOMEM;
2994c147eae0SHemant Agrawal 		}
299581c42c84SShreyansh Jain 		eth_dev->data->dev_private = (void *)dev_priv;
299681c42c84SShreyansh Jain 		/* Store a pointer to eth_dev in dev_private */
299781c42c84SShreyansh Jain 		dev_priv->eth_dev = eth_dev;
2998e729ec76SHemant Agrawal 	} else {
2999e729ec76SHemant Agrawal 		eth_dev = rte_eth_dev_attach_secondary(dpaa2_dev->device.name);
300081c42c84SShreyansh Jain 		if (!eth_dev) {
300181c42c84SShreyansh Jain 			DPAA2_PMD_DEBUG("returning enodev");
3002e729ec76SHemant Agrawal 			return -ENODEV;
3003c147eae0SHemant Agrawal 		}
300481c42c84SShreyansh Jain 	}
3005e729ec76SHemant Agrawal 
3006c147eae0SHemant Agrawal 	eth_dev->device = &dpaa2_dev->device;
300755fd2703SHemant Agrawal 
3008c147eae0SHemant Agrawal 	dpaa2_dev->eth_dev = eth_dev;
3009c147eae0SHemant Agrawal 	eth_dev->data->rx_mbuf_alloc_failed = 0;
3010c147eae0SHemant Agrawal 
301192b7e33eSHemant Agrawal 	if (dpaa2_drv->drv_flags & RTE_DPAA2_DRV_INTR_LSC)
301292b7e33eSHemant Agrawal 		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
301392b7e33eSHemant Agrawal 
3014f30e69b4SFerruh Yigit 	eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
3015f30e69b4SFerruh Yigit 
3016c147eae0SHemant Agrawal 	/* Invoke PMD device initialization function */
3017c147eae0SHemant Agrawal 	diag = dpaa2_dev_init(eth_dev);
3018748b9980SJun Yang 	if (!diag) {
3019748b9980SJun Yang 		diag = dpaa2_tx_sg_pool_init();
3020748b9980SJun Yang 		if (diag)
3021748b9980SJun Yang 			return diag;
3022fbe90cddSThomas Monjalon 		rte_eth_dev_probing_finish(eth_dev);
302375e2a1d4SGagandeep Singh 		dpaa2_valid_dev++;
3024c147eae0SHemant Agrawal 		return 0;
3025fbe90cddSThomas Monjalon 	}
3026c147eae0SHemant Agrawal 
3027c147eae0SHemant Agrawal 	rte_eth_dev_release_port(eth_dev);
3028c147eae0SHemant Agrawal 	return diag;
3029c147eae0SHemant Agrawal }
3030c147eae0SHemant Agrawal 
3031c147eae0SHemant Agrawal static int
3032c147eae0SHemant Agrawal rte_dpaa2_remove(struct rte_dpaa2_device *dpaa2_dev)
3033c147eae0SHemant Agrawal {
3034c147eae0SHemant Agrawal 	struct rte_eth_dev *eth_dev;
30355964d36aSSachin Saxena 	int ret;
3036c147eae0SHemant Agrawal 
3037c147eae0SHemant Agrawal 	eth_dev = dpaa2_dev->eth_dev;
30385964d36aSSachin Saxena 	dpaa2_dev_close(eth_dev);
303975e2a1d4SGagandeep Singh 	dpaa2_valid_dev--;
304075e2a1d4SGagandeep Singh 	if (!dpaa2_valid_dev)
304175e2a1d4SGagandeep Singh 		rte_mempool_free(dpaa2_tx_sg_pool);
30425964d36aSSachin Saxena 	ret = rte_eth_dev_release_port(eth_dev);
3043c147eae0SHemant Agrawal 
30445964d36aSSachin Saxena 	return ret;
3045c147eae0SHemant Agrawal }
3046c147eae0SHemant Agrawal 
3047c147eae0SHemant Agrawal static struct rte_dpaa2_driver rte_dpaa2_pmd = {
304892b7e33eSHemant Agrawal 	.drv_flags = RTE_DPAA2_DRV_INTR_LSC | RTE_DPAA2_DRV_IOVA_AS_VA,
3049bad555dfSShreyansh Jain 	.drv_type = DPAA2_ETH,
3050c147eae0SHemant Agrawal 	.probe = rte_dpaa2_probe,
3051c147eae0SHemant Agrawal 	.remove = rte_dpaa2_remove,
3052c147eae0SHemant Agrawal };
3053c147eae0SHemant Agrawal 
30544ed8a733SVanshika Shukla RTE_PMD_REGISTER_DPAA2(NET_DPAA2_PMD_DRIVER_NAME, rte_dpaa2_pmd);
30554ed8a733SVanshika Shukla RTE_PMD_REGISTER_PARAM_STRING(NET_DPAA2_PMD_DRIVER_NAME,
305620191ab3SNipun Gupta 		DRIVER_LOOPBACK_MODE "=<int> "
30578d21c563SHemant Agrawal 		DRIVER_NO_PREFETCH_MODE "=<int>"
30584690a611SNipun Gupta 		DRIVER_TX_CONF "=<int>"
30594690a611SNipun Gupta 		DRIVER_ERROR_QUEUE "=<int>");
3060eeded204SDavid Marchand RTE_LOG_REGISTER_DEFAULT(dpaa2_logtype_pmd, NOTICE);
3061