xref: /dpdk/drivers/net/dpaa2/dpaa2_ethdev.c (revision e6bf3256b95c77ee4d0b2874e1896d01c41c2d7c)
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 
12625d0ae62SJun Yang 	if (!dpni) {
127a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
12825d0ae62SJun 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,
21525d0ae62SJun 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
24725d0ae62SJun Yang dpaa2_dev_info_get(struct rte_eth_dev *dev,
24825d0ae62SJun 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");
38525d0ae62SJun 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);
40125d0ae62SJun Yang 		if (!priv->rx_err_vq) {
40225d0ae62SJun Yang 			ret = -ENOBUFS;
40329e5519dSWeiguo Li 			goto fail;
40425d0ae62SJun 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;
41525d0ae62SJun 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);
42025d0ae62SJun Yang 		if (!dpaa2_q->cscn) {
42125d0ae62SJun Yang 			ret = -ENOBUFS;
4227ae777d0SHemant Agrawal 			goto fail_tx;
4233e5a335dSHemant Agrawal 		}
42425d0ae62SJun 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);
48125d0ae62SJun 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;
70925d0ae62SJun 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) {
73125d0ae62SJun Yang 		DPAA2_PMD_ERR("%s:Rx deferred start not supported",
73225d0ae62SJun 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 	}
74825d0ae62SJun 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 {
77425d0ae62SJun 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);
80125d0ae62SJun 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 		 */
81425d0ae62SJun 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);
84125d0ae62SJun 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;
84825d0ae62SJun 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);
86125d0ae62SJun 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;
87725d0ae62SJun Yang 	struct dpaa2_queue *dpaa2_q = priv->tx_vq[tx_queue_id];
87825d0ae62SJun 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;
88825d0ae62SJun 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) {
89425d0ae62SJun Yang 		DPAA2_PMD_ERR("%s:Tx deferred start not supported",
89525d0ae62SJun 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 */
90325d0ae62SJun 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);
94525d0ae62SJun 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);
95725d0ae62SJun 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;
97325d0ae62SJun Yang 
97425d0ae62SJun Yang 		iova = DPAA2_VADDR_TO_IOVA_AND_CHECK(dpaa2_q->cscn,
97525d0ae62SJun Yang 			sizeof(struct qbman_result));
97625d0ae62SJun Yang 		if (iova == RTE_BAD_IOVA) {
97725d0ae62SJun Yang 			DPAA2_PMD_ERR("No IOMMU map for cscn(%p)(size=%x)",
97825d0ae62SJun Yang 				dpaa2_q->cscn, (uint32_t)sizeof(struct qbman_result));
97925d0ae62SJun Yang 
98025d0ae62SJun Yang 			return -ENOBUFS;
98125d0ae62SJun Yang 		}
98225d0ae62SJun Yang 
98325d0ae62SJun 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 
99125d0ae62SJun Yang 		ret = dpni_set_congestion_notification(dpni,
99225d0ae62SJun Yang 				CMD_PRI_LOW, priv->token, DPNI_QUEUE_TX,
99325d0ae62SJun Yang 				((channel_id << 8) | tc_id), &cong_notif_cfg);
9947ae777d0SHemant Agrawal 		if (ret) {
99525d0ae62SJun Yang 			DPAA2_PMD_ERR("Set TX congestion notification err=%d",
99625d0ae62SJun Yang 			   ret);
99725d0ae62SJun 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,
100825d0ae62SJun Yang 				DPNI_QUEUE_TX_CONFIRM,
100925d0ae62SJun Yang 				((channel_id << 8) | dpaa2_tx_conf_q->tc_index),
101025d0ae62SJun Yang 				dpaa2_tx_conf_q->flow_id,
101125d0ae62SJun Yang 				options, &tx_conf_cfg);
10129ceacab7SPriyanka Jain 		if (ret) {
101325d0ae62SJun 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);
101625d0ae62SJun Yang 			return ret;
10179ceacab7SPriyanka Jain 		}
10189ceacab7SPriyanka Jain 
10199ceacab7SPriyanka Jain 		ret = dpni_get_queue(dpni, CMD_PRI_LOW, priv->token,
102025d0ae62SJun Yang 				DPNI_QUEUE_TX_CONFIRM,
102125d0ae62SJun 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);
102525d0ae62SJun 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;
103725d0ae62SJun 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 
104725d0ae62SJun 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;
105925d0ae62SJun 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++) {
122325d0ae62SJun 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 		}
124325d0ae62SJun 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;
130825d0ae62SJun 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;
136125d0ae62SJun 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");
137225d0ae62SJun 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);
138125d0ae62SJun 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++)
140225d0ae62SJun Yang 		rte_free(priv->extract.tc_extract_param[i]);
14035964d36aSSachin Saxena 
140425d0ae62SJun Yang 	rte_free(priv->extract.qos_extract_param);
14055964d36aSSachin Saxena 
14065964d36aSSachin Saxena 	DPAA2_PMD_INFO("%s: netdev deleted", dev->data->name);
1407b142387bSThomas Monjalon 	return 0;
14083e5a335dSHemant Agrawal }
14093e5a335dSHemant Agrawal 
14109039c812SAndrew Rybchenko static int
141125d0ae62SJun Yang dpaa2_dev_promiscuous_enable(struct rte_eth_dev *dev)
1412c0e5c69aSHemant Agrawal {
1413c0e5c69aSHemant Agrawal 	int ret;
1414c0e5c69aSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
141581c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
1416c0e5c69aSHemant Agrawal 
1417c0e5c69aSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1418c0e5c69aSHemant Agrawal 
1419c0e5c69aSHemant Agrawal 	if (dpni == NULL) {
1420a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
14219039c812SAndrew Rybchenko 		return -ENODEV;
1422c0e5c69aSHemant Agrawal 	}
1423c0e5c69aSHemant Agrawal 
1424c0e5c69aSHemant Agrawal 	ret = dpni_set_unicast_promisc(dpni, CMD_PRI_LOW, priv->token, true);
1425c0e5c69aSHemant Agrawal 	if (ret < 0)
1426a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Unable to enable U promisc mode %d", ret);
14275d5aeeedSHemant Agrawal 
14285d5aeeedSHemant Agrawal 	ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, true);
14295d5aeeedSHemant Agrawal 	if (ret < 0)
1430a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Unable to enable M promisc mode %d", ret);
14319039c812SAndrew Rybchenko 
14329039c812SAndrew Rybchenko 	return ret;
1433c0e5c69aSHemant Agrawal }
1434c0e5c69aSHemant Agrawal 
14359039c812SAndrew Rybchenko static int
1436c0e5c69aSHemant Agrawal dpaa2_dev_promiscuous_disable(
1437c0e5c69aSHemant Agrawal 		struct rte_eth_dev *dev)
1438c0e5c69aSHemant Agrawal {
1439c0e5c69aSHemant Agrawal 	int ret;
1440c0e5c69aSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
144181c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
1442c0e5c69aSHemant Agrawal 
1443c0e5c69aSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1444c0e5c69aSHemant Agrawal 
1445c0e5c69aSHemant Agrawal 	if (dpni == NULL) {
1446a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
14479039c812SAndrew Rybchenko 		return -ENODEV;
1448c0e5c69aSHemant Agrawal 	}
1449c0e5c69aSHemant Agrawal 
1450c0e5c69aSHemant Agrawal 	ret = dpni_set_unicast_promisc(dpni, CMD_PRI_LOW, priv->token, false);
1451c0e5c69aSHemant Agrawal 	if (ret < 0)
1452a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Unable to disable U promisc mode %d", ret);
14535d5aeeedSHemant Agrawal 
14545d5aeeedSHemant Agrawal 	if (dev->data->all_multicast == 0) {
14555d5aeeedSHemant Agrawal 		ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW,
14565d5aeeedSHemant Agrawal 						 priv->token, false);
14575d5aeeedSHemant Agrawal 		if (ret < 0)
1458a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("Unable to disable M promisc mode %d",
14595d5aeeedSHemant Agrawal 				      ret);
14605d5aeeedSHemant Agrawal 	}
14619039c812SAndrew Rybchenko 
14629039c812SAndrew Rybchenko 	return ret;
14635d5aeeedSHemant Agrawal }
14645d5aeeedSHemant Agrawal 
1465ca041cd4SIvan Ilchenko static int
14665d5aeeedSHemant Agrawal dpaa2_dev_allmulticast_enable(
14675d5aeeedSHemant Agrawal 		struct rte_eth_dev *dev)
14685d5aeeedSHemant Agrawal {
14695d5aeeedSHemant Agrawal 	int ret;
14705d5aeeedSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
147181c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
14725d5aeeedSHemant Agrawal 
14735d5aeeedSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
14745d5aeeedSHemant Agrawal 
14755d5aeeedSHemant Agrawal 	if (dpni == NULL) {
1476a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1477ca041cd4SIvan Ilchenko 		return -ENODEV;
14785d5aeeedSHemant Agrawal 	}
14795d5aeeedSHemant Agrawal 
14805d5aeeedSHemant Agrawal 	ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, true);
14815d5aeeedSHemant Agrawal 	if (ret < 0)
1482a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Unable to enable multicast mode %d", ret);
1483ca041cd4SIvan Ilchenko 
1484ca041cd4SIvan Ilchenko 	return ret;
14855d5aeeedSHemant Agrawal }
14865d5aeeedSHemant Agrawal 
1487ca041cd4SIvan Ilchenko static int
14885d5aeeedSHemant Agrawal dpaa2_dev_allmulticast_disable(struct rte_eth_dev *dev)
14895d5aeeedSHemant Agrawal {
14905d5aeeedSHemant Agrawal 	int ret;
14915d5aeeedSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
149225d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
14935d5aeeedSHemant Agrawal 
14945d5aeeedSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
14955d5aeeedSHemant Agrawal 
14965d5aeeedSHemant Agrawal 	if (dpni == NULL) {
1497a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1498ca041cd4SIvan Ilchenko 		return -ENODEV;
14995d5aeeedSHemant Agrawal 	}
15005d5aeeedSHemant Agrawal 
15015d5aeeedSHemant Agrawal 	/* must remain on for all promiscuous */
15025d5aeeedSHemant Agrawal 	if (dev->data->promiscuous == 1)
1503ca041cd4SIvan Ilchenko 		return 0;
15045d5aeeedSHemant Agrawal 
15055d5aeeedSHemant Agrawal 	ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, false);
15065d5aeeedSHemant Agrawal 	if (ret < 0)
1507a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Unable to disable multicast mode %d", ret);
1508ca041cd4SIvan Ilchenko 
1509ca041cd4SIvan Ilchenko 	return ret;
1510c0e5c69aSHemant Agrawal }
1511e31d4d21SHemant Agrawal 
1512e31d4d21SHemant Agrawal static int
1513e31d4d21SHemant Agrawal dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
1514e31d4d21SHemant Agrawal {
1515e31d4d21SHemant Agrawal 	int ret;
1516e31d4d21SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
151725d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
151835b2d13fSOlivier Matz 	uint32_t frame_size = mtu + RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN
151944ea7355SAshish Jain 				+ VLAN_TAG_SIZE;
1520e31d4d21SHemant Agrawal 
1521e31d4d21SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1522e31d4d21SHemant Agrawal 
152325d0ae62SJun Yang 	if (!dpni) {
1524a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1525e31d4d21SHemant Agrawal 		return -EINVAL;
1526e31d4d21SHemant Agrawal 	}
1527e31d4d21SHemant Agrawal 
1528e31d4d21SHemant Agrawal 	/* Set the Max Rx frame length as 'mtu' +
1529e31d4d21SHemant Agrawal 	 * Maximum Ethernet header length
1530e31d4d21SHemant Agrawal 	 */
1531e31d4d21SHemant Agrawal 	ret = dpni_set_max_frame_length(dpni, CMD_PRI_LOW, priv->token,
15326f8be0fbSHemant Agrawal 					frame_size - RTE_ETHER_CRC_LEN);
1533e31d4d21SHemant Agrawal 	if (ret) {
1534a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Setting the max frame length failed");
153525d0ae62SJun Yang 		return ret;
1536e31d4d21SHemant Agrawal 	}
1537de08b474SApeksha Gupta 	dev->data->mtu = mtu;
1538a10a988aSShreyansh Jain 	DPAA2_PMD_INFO("MTU configured for the device: %d", mtu);
1539e31d4d21SHemant Agrawal 	return 0;
1540e31d4d21SHemant Agrawal }
1541e31d4d21SHemant Agrawal 
1542b4d97b7dSHemant Agrawal static int
1543b4d97b7dSHemant Agrawal dpaa2_dev_add_mac_addr(struct rte_eth_dev *dev,
15446d13ea8eSOlivier Matz 	struct rte_ether_addr *addr,
1545b4d97b7dSHemant Agrawal 	__rte_unused uint32_t index,
1546b4d97b7dSHemant Agrawal 	__rte_unused uint32_t pool)
1547b4d97b7dSHemant Agrawal {
1548b4d97b7dSHemant Agrawal 	int ret;
1549b4d97b7dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
155025d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
1551b4d97b7dSHemant Agrawal 
1552b4d97b7dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1553b4d97b7dSHemant Agrawal 
1554b4d97b7dSHemant Agrawal 	if (dpni == NULL) {
1555a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
155625d0ae62SJun Yang 		return -EINVAL;
1557b4d97b7dSHemant Agrawal 	}
1558b4d97b7dSHemant Agrawal 
155996f7bfe8SSachin Saxena 	ret = dpni_add_mac_addr(dpni, CMD_PRI_LOW, priv->token,
156096f7bfe8SSachin Saxena 				addr->addr_bytes, 0, 0, 0);
1561b4d97b7dSHemant Agrawal 	if (ret)
156225d0ae62SJun Yang 		DPAA2_PMD_ERR("ERR(%d) Adding the MAC ADDR failed", ret);
156325d0ae62SJun Yang 	return ret;
1564b4d97b7dSHemant Agrawal }
1565b4d97b7dSHemant Agrawal 
1566b4d97b7dSHemant Agrawal static void
1567b4d97b7dSHemant Agrawal dpaa2_dev_remove_mac_addr(struct rte_eth_dev *dev,
1568b4d97b7dSHemant Agrawal 	uint32_t index)
1569b4d97b7dSHemant Agrawal {
1570b4d97b7dSHemant Agrawal 	int ret;
1571b4d97b7dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
157225d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
1573b4d97b7dSHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
15746d13ea8eSOlivier Matz 	struct rte_ether_addr *macaddr;
1575b4d97b7dSHemant Agrawal 
1576b4d97b7dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1577b4d97b7dSHemant Agrawal 
1578b4d97b7dSHemant Agrawal 	macaddr = &data->mac_addrs[index];
1579b4d97b7dSHemant Agrawal 
158025d0ae62SJun Yang 	if (!dpni) {
1581a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1582b4d97b7dSHemant Agrawal 		return;
1583b4d97b7dSHemant Agrawal 	}
1584b4d97b7dSHemant Agrawal 
1585b4d97b7dSHemant Agrawal 	ret = dpni_remove_mac_addr(dpni, CMD_PRI_LOW,
1586b4d97b7dSHemant Agrawal 				   priv->token, macaddr->addr_bytes);
1587b4d97b7dSHemant Agrawal 	if (ret)
1588a10a988aSShreyansh Jain 		DPAA2_PMD_ERR(
1589a10a988aSShreyansh Jain 			"error: Removing the MAC ADDR failed: err = %d", ret);
1590b4d97b7dSHemant Agrawal }
1591b4d97b7dSHemant Agrawal 
1592caccf8b3SOlivier Matz static int
1593b4d97b7dSHemant Agrawal dpaa2_dev_set_mac_addr(struct rte_eth_dev *dev,
15946d13ea8eSOlivier Matz 	struct rte_ether_addr *addr)
1595b4d97b7dSHemant Agrawal {
1596b4d97b7dSHemant Agrawal 	int ret;
1597b4d97b7dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
159825d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
1599b4d97b7dSHemant Agrawal 
1600b4d97b7dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1601b4d97b7dSHemant Agrawal 
160225d0ae62SJun Yang 	if (!dpni) {
1603a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1604caccf8b3SOlivier Matz 		return -EINVAL;
1605b4d97b7dSHemant Agrawal 	}
1606b4d97b7dSHemant Agrawal 
1607b4d97b7dSHemant Agrawal 	ret = dpni_set_primary_mac_addr(dpni, CMD_PRI_LOW,
1608b4d97b7dSHemant Agrawal 					priv->token, addr->addr_bytes);
1609b4d97b7dSHemant Agrawal 
1610b4d97b7dSHemant Agrawal 	if (ret)
161125d0ae62SJun Yang 		DPAA2_PMD_ERR("ERR(%d) Setting the MAC ADDR failed", ret);
1612caccf8b3SOlivier Matz 
1613caccf8b3SOlivier Matz 	return ret;
1614b4d97b7dSHemant Agrawal }
1615a10a988aSShreyansh Jain 
161625d0ae62SJun Yang static int
161725d0ae62SJun Yang dpaa2_dev_stats_get(struct rte_eth_dev *dev,
1618b0aa5459SHemant Agrawal 	struct rte_eth_stats *stats)
1619b0aa5459SHemant Agrawal {
1620b0aa5459SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
162125d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
1622b0aa5459SHemant Agrawal 	int32_t retcode;
1623b0aa5459SHemant Agrawal 	uint8_t page0 = 0, page1 = 1, page2 = 2;
1624b0aa5459SHemant Agrawal 	union dpni_statistics value;
1625e43f2521SShreyansh Jain 	int i;
1626e43f2521SShreyansh Jain 	struct dpaa2_queue *dpaa2_rxq, *dpaa2_txq;
1627b0aa5459SHemant Agrawal 
1628b0aa5459SHemant Agrawal 	memset(&value, 0, sizeof(union dpni_statistics));
1629b0aa5459SHemant Agrawal 
1630b0aa5459SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1631b0aa5459SHemant Agrawal 
1632b0aa5459SHemant Agrawal 	if (!dpni) {
1633a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1634d5b0924bSMatan Azrad 		return -EINVAL;
1635b0aa5459SHemant Agrawal 	}
1636b0aa5459SHemant Agrawal 
1637b0aa5459SHemant Agrawal 	if (!stats) {
1638a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("stats is NULL");
1639d5b0924bSMatan Azrad 		return -EINVAL;
1640b0aa5459SHemant Agrawal 	}
1641b0aa5459SHemant Agrawal 
1642b0aa5459SHemant Agrawal 	/*Get Counters from page_0*/
1643b0aa5459SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
164416bbc98aSShreyansh Jain 				      page0, 0, &value);
1645b0aa5459SHemant Agrawal 	if (retcode)
1646b0aa5459SHemant Agrawal 		goto err;
1647b0aa5459SHemant Agrawal 
1648b0aa5459SHemant Agrawal 	stats->ipackets = value.page_0.ingress_all_frames;
1649b0aa5459SHemant Agrawal 	stats->ibytes = value.page_0.ingress_all_bytes;
1650b0aa5459SHemant Agrawal 
1651b0aa5459SHemant Agrawal 	/*Get Counters from page_1*/
1652b0aa5459SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
165316bbc98aSShreyansh Jain 				      page1, 0, &value);
1654b0aa5459SHemant Agrawal 	if (retcode)
1655b0aa5459SHemant Agrawal 		goto err;
1656b0aa5459SHemant Agrawal 
1657b0aa5459SHemant Agrawal 	stats->opackets = value.page_1.egress_all_frames;
1658b0aa5459SHemant Agrawal 	stats->obytes = value.page_1.egress_all_bytes;
1659b0aa5459SHemant Agrawal 
1660b0aa5459SHemant Agrawal 	/*Get Counters from page_2*/
1661b0aa5459SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
166216bbc98aSShreyansh Jain 				      page2, 0, &value);
1663b0aa5459SHemant Agrawal 	if (retcode)
1664b0aa5459SHemant Agrawal 		goto err;
1665b0aa5459SHemant Agrawal 
1666b4d97b7dSHemant Agrawal 	/* Ingress drop frame count due to configured rules */
1667b4d97b7dSHemant Agrawal 	stats->ierrors = value.page_2.ingress_filtered_frames;
1668b4d97b7dSHemant Agrawal 	/* Ingress drop frame count due to error */
1669b4d97b7dSHemant Agrawal 	stats->ierrors += value.page_2.ingress_discarded_frames;
1670b4d97b7dSHemant Agrawal 
1671b0aa5459SHemant Agrawal 	stats->oerrors = value.page_2.egress_discarded_frames;
1672b0aa5459SHemant Agrawal 	stats->imissed = value.page_2.ingress_nobuffer_discards;
1673b0aa5459SHemant Agrawal 
1674e43f2521SShreyansh Jain 	/* Fill in per queue stats */
1675e43f2521SShreyansh Jain 	for (i = 0; (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) &&
1676e43f2521SShreyansh Jain 		(i < priv->nb_rx_queues || i < priv->nb_tx_queues); ++i) {
167725d0ae62SJun Yang 		dpaa2_rxq = priv->rx_vq[i];
167825d0ae62SJun Yang 		dpaa2_txq = priv->tx_vq[i];
1679e43f2521SShreyansh Jain 		if (dpaa2_rxq)
1680e43f2521SShreyansh Jain 			stats->q_ipackets[i] = dpaa2_rxq->rx_pkts;
1681e43f2521SShreyansh Jain 		if (dpaa2_txq)
1682e43f2521SShreyansh Jain 			stats->q_opackets[i] = dpaa2_txq->tx_pkts;
1683e43f2521SShreyansh Jain 
1684e43f2521SShreyansh Jain 		/* Byte counting is not implemented */
1685e43f2521SShreyansh Jain 		stats->q_ibytes[i]   = 0;
1686e43f2521SShreyansh Jain 		stats->q_obytes[i]   = 0;
1687e43f2521SShreyansh Jain 	}
1688e43f2521SShreyansh Jain 
1689d5b0924bSMatan Azrad 	return 0;
1690b0aa5459SHemant Agrawal 
1691b0aa5459SHemant Agrawal err:
1692a10a988aSShreyansh Jain 	DPAA2_PMD_ERR("Operation not completed:Error Code = %d", retcode);
1693d5b0924bSMatan Azrad 	return retcode;
1694b0aa5459SHemant Agrawal };
1695b0aa5459SHemant Agrawal 
16961d6329b2SHemant Agrawal static int
169725d0ae62SJun Yang dpaa2_dev_xstats_get(struct rte_eth_dev *dev,
169825d0ae62SJun Yang 	struct rte_eth_xstat *xstats, unsigned int n)
16991d6329b2SHemant Agrawal {
17001d6329b2SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
170181c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
17021d6329b2SHemant Agrawal 	int32_t retcode;
1703c720c5f6SHemant Agrawal 	union dpni_statistics value[5] = {};
17041d6329b2SHemant Agrawal 	unsigned int i = 0, num = RTE_DIM(dpaa2_xstats_strings);
170525d0ae62SJun Yang 	uint8_t page_id, stats_id;
17061d6329b2SHemant Agrawal 
17071d6329b2SHemant Agrawal 	if (n < num)
17081d6329b2SHemant Agrawal 		return num;
17091d6329b2SHemant Agrawal 
171025d0ae62SJun Yang 	if (!xstats)
1711876b2c90SHemant Agrawal 		return 0;
1712876b2c90SHemant Agrawal 
17131d6329b2SHemant Agrawal 	/* Get Counters from page_0*/
17141d6329b2SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
17151d6329b2SHemant Agrawal 				      0, 0, &value[0]);
17161d6329b2SHemant Agrawal 	if (retcode)
17171d6329b2SHemant Agrawal 		goto err;
17181d6329b2SHemant Agrawal 
17191d6329b2SHemant Agrawal 	/* Get Counters from page_1*/
17201d6329b2SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
17211d6329b2SHemant Agrawal 				      1, 0, &value[1]);
17221d6329b2SHemant Agrawal 	if (retcode)
17231d6329b2SHemant Agrawal 		goto err;
17241d6329b2SHemant Agrawal 
17251d6329b2SHemant Agrawal 	/* Get Counters from page_2*/
17261d6329b2SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
17271d6329b2SHemant Agrawal 				      2, 0, &value[2]);
17281d6329b2SHemant Agrawal 	if (retcode)
17291d6329b2SHemant Agrawal 		goto err;
17301d6329b2SHemant Agrawal 
1731c720c5f6SHemant Agrawal 	for (i = 0; i < priv->max_cgs; i++) {
1732c720c5f6SHemant Agrawal 		if (!priv->cgid_in_use[i]) {
1733c720c5f6SHemant Agrawal 			/* Get Counters from page_4*/
1734c720c5f6SHemant Agrawal 			retcode = dpni_get_statistics(dpni, CMD_PRI_LOW,
1735c720c5f6SHemant Agrawal 						      priv->token,
1736c720c5f6SHemant Agrawal 						      4, 0, &value[4]);
1737c720c5f6SHemant Agrawal 			if (retcode)
1738c720c5f6SHemant Agrawal 				goto err;
1739c720c5f6SHemant Agrawal 			break;
1740c720c5f6SHemant Agrawal 		}
1741c720c5f6SHemant Agrawal 	}
1742c720c5f6SHemant Agrawal 
17431d6329b2SHemant Agrawal 	for (i = 0; i < num; i++) {
17441d6329b2SHemant Agrawal 		xstats[i].id = i;
174525d0ae62SJun Yang 		page_id = dpaa2_xstats_strings[i].page_id;
174625d0ae62SJun Yang 		stats_id = dpaa2_xstats_strings[i].stats_id;
174725d0ae62SJun Yang 		xstats[i].value = value[page_id].raw.counter[stats_id];
17481d6329b2SHemant Agrawal 	}
17491d6329b2SHemant Agrawal 	return i;
17501d6329b2SHemant Agrawal err:
1751a10a988aSShreyansh Jain 	DPAA2_PMD_ERR("Error in obtaining extended stats (%d)", retcode);
17521d6329b2SHemant Agrawal 	return retcode;
17531d6329b2SHemant Agrawal }
17541d6329b2SHemant Agrawal 
17551d6329b2SHemant Agrawal static int
17561d6329b2SHemant Agrawal dpaa2_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
17571d6329b2SHemant Agrawal 	struct rte_eth_xstat_name *xstats_names,
1758876b2c90SHemant Agrawal 	unsigned int limit)
17591d6329b2SHemant Agrawal {
17601d6329b2SHemant Agrawal 	unsigned int i, stat_cnt = RTE_DIM(dpaa2_xstats_strings);
17611d6329b2SHemant Agrawal 
1762876b2c90SHemant Agrawal 	if (limit < stat_cnt)
1763876b2c90SHemant Agrawal 		return stat_cnt;
1764876b2c90SHemant Agrawal 
17651d6329b2SHemant Agrawal 	if (xstats_names != NULL)
17661d6329b2SHemant Agrawal 		for (i = 0; i < stat_cnt; i++)
1767f9acaf84SBruce Richardson 			strlcpy(xstats_names[i].name,
1768f9acaf84SBruce Richardson 				dpaa2_xstats_strings[i].name,
1769f9acaf84SBruce Richardson 				sizeof(xstats_names[i].name));
17701d6329b2SHemant Agrawal 
17711d6329b2SHemant Agrawal 	return stat_cnt;
17721d6329b2SHemant Agrawal }
17731d6329b2SHemant Agrawal 
17741d6329b2SHemant Agrawal static int
17751d6329b2SHemant Agrawal dpaa2_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
17761d6329b2SHemant Agrawal 	uint64_t *values, unsigned int n)
17771d6329b2SHemant Agrawal {
17781d6329b2SHemant Agrawal 	unsigned int i, stat_cnt = RTE_DIM(dpaa2_xstats_strings);
17791d6329b2SHemant Agrawal 	uint64_t values_copy[stat_cnt];
178025d0ae62SJun Yang 	uint8_t page_id, stats_id;
17811d6329b2SHemant Agrawal 
17821d6329b2SHemant Agrawal 	if (!ids) {
17831d6329b2SHemant Agrawal 		struct dpaa2_dev_priv *priv = dev->data->dev_private;
178425d0ae62SJun Yang 		struct fsl_mc_io *dpni = dev->process_private;
17851d6329b2SHemant Agrawal 		int32_t retcode;
1786c720c5f6SHemant Agrawal 		union dpni_statistics value[5] = {};
17871d6329b2SHemant Agrawal 
17881d6329b2SHemant Agrawal 		if (n < stat_cnt)
17891d6329b2SHemant Agrawal 			return stat_cnt;
17901d6329b2SHemant Agrawal 
17911d6329b2SHemant Agrawal 		if (!values)
17921d6329b2SHemant Agrawal 			return 0;
17931d6329b2SHemant Agrawal 
17941d6329b2SHemant Agrawal 		/* Get Counters from page_0*/
17951d6329b2SHemant Agrawal 		retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
17961d6329b2SHemant Agrawal 					      0, 0, &value[0]);
17971d6329b2SHemant Agrawal 		if (retcode)
17981d6329b2SHemant Agrawal 			return 0;
17991d6329b2SHemant Agrawal 
18001d6329b2SHemant Agrawal 		/* Get Counters from page_1*/
18011d6329b2SHemant Agrawal 		retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
18021d6329b2SHemant Agrawal 					      1, 0, &value[1]);
18031d6329b2SHemant Agrawal 		if (retcode)
18041d6329b2SHemant Agrawal 			return 0;
18051d6329b2SHemant Agrawal 
18061d6329b2SHemant Agrawal 		/* Get Counters from page_2*/
18071d6329b2SHemant Agrawal 		retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
18081d6329b2SHemant Agrawal 					      2, 0, &value[2]);
18091d6329b2SHemant Agrawal 		if (retcode)
18101d6329b2SHemant Agrawal 			return 0;
18111d6329b2SHemant Agrawal 
1812c720c5f6SHemant Agrawal 		/* Get Counters from page_4*/
1813c720c5f6SHemant Agrawal 		retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
1814c720c5f6SHemant Agrawal 					      4, 0, &value[4]);
1815c720c5f6SHemant Agrawal 		if (retcode)
1816c720c5f6SHemant Agrawal 			return 0;
1817c720c5f6SHemant Agrawal 
18181d6329b2SHemant Agrawal 		for (i = 0; i < stat_cnt; i++) {
181925d0ae62SJun Yang 			page_id = dpaa2_xstats_strings[i].page_id;
182025d0ae62SJun Yang 			stats_id = dpaa2_xstats_strings[i].stats_id;
182125d0ae62SJun Yang 			values[i] = value[page_id].raw.counter[stats_id];
18221d6329b2SHemant Agrawal 		}
18231d6329b2SHemant Agrawal 		return stat_cnt;
18241d6329b2SHemant Agrawal 	}
18251d6329b2SHemant Agrawal 
18261d6329b2SHemant Agrawal 	dpaa2_xstats_get_by_id(dev, NULL, values_copy, stat_cnt);
18271d6329b2SHemant Agrawal 
18281d6329b2SHemant Agrawal 	for (i = 0; i < n; i++) {
18291d6329b2SHemant Agrawal 		if (ids[i] >= stat_cnt) {
1830a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("xstats id value isn't valid");
183125d0ae62SJun Yang 			return -EINVAL;
18321d6329b2SHemant Agrawal 		}
18331d6329b2SHemant Agrawal 		values[i] = values_copy[ids[i]];
18341d6329b2SHemant Agrawal 	}
18351d6329b2SHemant Agrawal 	return n;
18361d6329b2SHemant Agrawal }
18371d6329b2SHemant Agrawal 
18381d6329b2SHemant Agrawal static int
183925d0ae62SJun Yang dpaa2_xstats_get_names_by_id(struct rte_eth_dev *dev,
18401d6329b2SHemant Agrawal 	const uint64_t *ids,
18418c9f976fSAndrew Rybchenko 	struct rte_eth_xstat_name *xstats_names,
18421d6329b2SHemant Agrawal 	unsigned int limit)
18431d6329b2SHemant Agrawal {
18441d6329b2SHemant Agrawal 	unsigned int i, stat_cnt = RTE_DIM(dpaa2_xstats_strings);
18451d6329b2SHemant Agrawal 	struct rte_eth_xstat_name xstats_names_copy[stat_cnt];
18461d6329b2SHemant Agrawal 
18471d6329b2SHemant Agrawal 	if (!ids)
18481d6329b2SHemant Agrawal 		return dpaa2_xstats_get_names(dev, xstats_names, limit);
18491d6329b2SHemant Agrawal 
18501d6329b2SHemant Agrawal 	dpaa2_xstats_get_names(dev, xstats_names_copy, limit);
18511d6329b2SHemant Agrawal 
18521d6329b2SHemant Agrawal 	for (i = 0; i < limit; i++) {
18531d6329b2SHemant Agrawal 		if (ids[i] >= stat_cnt) {
1854a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("xstats id value isn't valid");
18551d6329b2SHemant Agrawal 			return -1;
18561d6329b2SHemant Agrawal 		}
18571d6329b2SHemant Agrawal 		strcpy(xstats_names[i].name, xstats_names_copy[ids[i]].name);
18581d6329b2SHemant Agrawal 	}
18591d6329b2SHemant Agrawal 	return limit;
18601d6329b2SHemant Agrawal }
18611d6329b2SHemant Agrawal 
18629970a9adSIgor Romanov static int
18631d6329b2SHemant Agrawal dpaa2_dev_stats_reset(struct rte_eth_dev *dev)
1864b0aa5459SHemant Agrawal {
1865b0aa5459SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
186625d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
18679970a9adSIgor Romanov 	int retcode;
1868e43f2521SShreyansh Jain 	int i;
1869e43f2521SShreyansh Jain 	struct dpaa2_queue *dpaa2_q;
1870b0aa5459SHemant Agrawal 
1871b0aa5459SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1872b0aa5459SHemant Agrawal 
187325d0ae62SJun Yang 	if (!dpni) {
1874a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
18759970a9adSIgor Romanov 		return -EINVAL;
1876b0aa5459SHemant Agrawal 	}
1877b0aa5459SHemant Agrawal 
1878b0aa5459SHemant Agrawal 	retcode =  dpni_reset_statistics(dpni, CMD_PRI_LOW, priv->token);
1879b0aa5459SHemant Agrawal 	if (retcode)
1880b0aa5459SHemant Agrawal 		goto error;
1881b0aa5459SHemant Agrawal 
1882e43f2521SShreyansh Jain 	/* Reset the per queue stats in dpaa2_queue structure */
1883e43f2521SShreyansh Jain 	for (i = 0; i < priv->nb_rx_queues; i++) {
188425d0ae62SJun Yang 		dpaa2_q = priv->rx_vq[i];
1885e43f2521SShreyansh Jain 		if (dpaa2_q)
1886e43f2521SShreyansh Jain 			dpaa2_q->rx_pkts = 0;
1887e43f2521SShreyansh Jain 	}
1888e43f2521SShreyansh Jain 
1889e43f2521SShreyansh Jain 	for (i = 0; i < priv->nb_tx_queues; i++) {
189025d0ae62SJun Yang 		dpaa2_q = priv->tx_vq[i];
1891e43f2521SShreyansh Jain 		if (dpaa2_q)
1892e43f2521SShreyansh Jain 			dpaa2_q->tx_pkts = 0;
1893e43f2521SShreyansh Jain 	}
1894e43f2521SShreyansh Jain 
18959970a9adSIgor Romanov 	return 0;
1896b0aa5459SHemant Agrawal 
1897b0aa5459SHemant Agrawal error:
1898a10a988aSShreyansh Jain 	DPAA2_PMD_ERR("Operation not completed:Error Code = %d", retcode);
18999970a9adSIgor Romanov 	return retcode;
1900b0aa5459SHemant Agrawal };
1901b0aa5459SHemant Agrawal 
1902c56c86ffSHemant Agrawal /* return 0 means link status changed, -1 means not changed */
1903c56c86ffSHemant Agrawal static int
1904c56c86ffSHemant Agrawal dpaa2_dev_link_update(struct rte_eth_dev *dev,
1905eadcfd95SRohit Raj 		      int wait_to_complete)
1906c56c86ffSHemant Agrawal {
1907c56c86ffSHemant Agrawal 	int ret;
1908c56c86ffSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
190925d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
19107e2eb5f0SStephen Hemminger 	struct rte_eth_link link;
1911c56c86ffSHemant Agrawal 	struct dpni_link_state state = {0};
1912eadcfd95SRohit Raj 	uint8_t count;
1913c56c86ffSHemant Agrawal 
191425d0ae62SJun Yang 	if (!dpni) {
1915a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1916c56c86ffSHemant Agrawal 		return 0;
1917c56c86ffSHemant Agrawal 	}
1918c56c86ffSHemant Agrawal 
1919eadcfd95SRohit Raj 	for (count = 0; count <= MAX_REPEAT_TIME; count++) {
1920eadcfd95SRohit Raj 		ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token,
1921eadcfd95SRohit Raj 					  &state);
1922c56c86ffSHemant Agrawal 		if (ret < 0) {
192344e87c27SShreyansh Jain 			DPAA2_PMD_DEBUG("error: dpni_get_link_state %d", ret);
192425d0ae62SJun Yang 			return ret;
1925c56c86ffSHemant Agrawal 		}
1926295968d1SFerruh Yigit 		if (state.up == RTE_ETH_LINK_DOWN &&
1927eadcfd95SRohit Raj 		    wait_to_complete)
1928eadcfd95SRohit Raj 			rte_delay_ms(CHECK_INTERVAL);
1929eadcfd95SRohit Raj 		else
1930eadcfd95SRohit Raj 			break;
1931eadcfd95SRohit Raj 	}
1932c56c86ffSHemant Agrawal 
1933c56c86ffSHemant Agrawal 	memset(&link, 0, sizeof(struct rte_eth_link));
1934c56c86ffSHemant Agrawal 	link.link_status = state.up;
1935c56c86ffSHemant Agrawal 	link.link_speed = state.rate;
1936c56c86ffSHemant Agrawal 
1937c56c86ffSHemant Agrawal 	if (state.options & DPNI_LINK_OPT_HALF_DUPLEX)
1938295968d1SFerruh Yigit 		link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
1939c56c86ffSHemant Agrawal 	else
1940295968d1SFerruh Yigit 		link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
1941c56c86ffSHemant Agrawal 
19427e2eb5f0SStephen Hemminger 	ret = rte_eth_linkstatus_set(dev, &link);
194325d0ae62SJun Yang 	if (ret < 0)
1944a10a988aSShreyansh Jain 		DPAA2_PMD_DEBUG("No change in status");
1945c56c86ffSHemant Agrawal 	else
1946f665790aSDavid Marchand 		DPAA2_PMD_INFO("Port %d Link is %s", dev->data->port_id,
19477e2eb5f0SStephen Hemminger 			       link.link_status ? "Up" : "Down");
19487e2eb5f0SStephen Hemminger 
19497e2eb5f0SStephen Hemminger 	return ret;
1950c56c86ffSHemant Agrawal }
1951c56c86ffSHemant Agrawal 
1952a1f3a12cSHemant Agrawal /**
1953a1f3a12cSHemant Agrawal  * Toggle the DPNI to enable, if not already enabled.
1954a1f3a12cSHemant Agrawal  * This is not strictly PHY up/down - it is more of logical toggling.
1955a1f3a12cSHemant Agrawal  */
1956a1f3a12cSHemant Agrawal static int
1957a1f3a12cSHemant Agrawal dpaa2_dev_set_link_up(struct rte_eth_dev *dev)
1958a1f3a12cSHemant Agrawal {
1959a1f3a12cSHemant Agrawal 	int ret = -EINVAL;
1960a1f3a12cSHemant Agrawal 	struct dpaa2_dev_priv *priv;
1961a1f3a12cSHemant Agrawal 	struct fsl_mc_io *dpni;
1962a1f3a12cSHemant Agrawal 	int en = 0;
1963aa8c595aSHemant Agrawal 	struct dpni_link_state state = {0};
1964a1f3a12cSHemant Agrawal 
1965a1f3a12cSHemant Agrawal 	priv = dev->data->dev_private;
196625d0ae62SJun Yang 	dpni = dev->process_private;
1967a1f3a12cSHemant Agrawal 
196825d0ae62SJun Yang 	if (!dpni) {
1969a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
1970a1f3a12cSHemant Agrawal 		return ret;
1971a1f3a12cSHemant Agrawal 	}
1972a1f3a12cSHemant Agrawal 
1973a1f3a12cSHemant Agrawal 	/* Check if DPNI is currently enabled */
1974a1f3a12cSHemant Agrawal 	ret = dpni_is_enabled(dpni, CMD_PRI_LOW, priv->token, &en);
1975a1f3a12cSHemant Agrawal 	if (ret) {
1976a1f3a12cSHemant Agrawal 		/* Unable to obtain dpni status; Not continuing */
1977a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Interface Link UP failed (%d)", ret);
197825dd1fd0SRohit Raj 		return ret;
1979a1f3a12cSHemant Agrawal 	}
1980a1f3a12cSHemant Agrawal 
1981a1f3a12cSHemant Agrawal 	/* Enable link if not already enabled */
1982a1f3a12cSHemant Agrawal 	if (!en) {
1983a1f3a12cSHemant Agrawal 		ret = dpni_enable(dpni, CMD_PRI_LOW, priv->token);
1984a1f3a12cSHemant Agrawal 		if (ret) {
1985a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("Interface Link UP failed (%d)", ret);
198625dd1fd0SRohit Raj 			return ret;
1987a1f3a12cSHemant Agrawal 		}
1988a1f3a12cSHemant Agrawal 	}
1989aa8c595aSHemant Agrawal 	ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state);
1990aa8c595aSHemant Agrawal 	if (ret < 0) {
199144e87c27SShreyansh Jain 		DPAA2_PMD_DEBUG("Unable to get link state (%d)", ret);
199225dd1fd0SRohit Raj 		return ret;
1993aa8c595aSHemant Agrawal 	}
1994aa8c595aSHemant Agrawal 
1995a1f3a12cSHemant Agrawal 	/* changing tx burst function to start enqueues */
1996a1f3a12cSHemant Agrawal 	dev->tx_pkt_burst = dpaa2_dev_tx;
1997aa8c595aSHemant Agrawal 	dev->data->dev_link.link_status = state.up;
19987e6ecac2SRohit Raj 	dev->data->dev_link.link_speed = state.rate;
1999a1f3a12cSHemant Agrawal 
200025dd1fd0SRohit Raj 	if (state.options & DPNI_LINK_OPT_HALF_DUPLEX)
200125dd1fd0SRohit Raj 		dev->data->dev_link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
2002aa8c595aSHemant Agrawal 	else
200325dd1fd0SRohit Raj 		dev->data->dev_link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
200425dd1fd0SRohit Raj 
200525dd1fd0SRohit Raj 	if (state.up)
200625dd1fd0SRohit Raj 		DPAA2_PMD_DEBUG("Port %d Link is Up", dev->data->port_id);
200725dd1fd0SRohit Raj 	else
200825dd1fd0SRohit Raj 		DPAA2_PMD_DEBUG("Port %d Link is Down", dev->data->port_id);
2009a1f3a12cSHemant Agrawal 	return ret;
2010a1f3a12cSHemant Agrawal }
2011a1f3a12cSHemant Agrawal 
2012a1f3a12cSHemant Agrawal /**
2013a1f3a12cSHemant Agrawal  * Toggle the DPNI to disable, if not already disabled.
2014a1f3a12cSHemant Agrawal  * This is not strictly PHY up/down - it is more of logical toggling.
2015a1f3a12cSHemant Agrawal  */
2016a1f3a12cSHemant Agrawal static int
2017a1f3a12cSHemant Agrawal dpaa2_dev_set_link_down(struct rte_eth_dev *dev)
2018a1f3a12cSHemant Agrawal {
2019a1f3a12cSHemant Agrawal 	int ret = -EINVAL;
2020a1f3a12cSHemant Agrawal 	struct dpaa2_dev_priv *priv;
2021a1f3a12cSHemant Agrawal 	struct fsl_mc_io *dpni;
2022a1f3a12cSHemant Agrawal 	int dpni_enabled = 0;
2023a1f3a12cSHemant Agrawal 	int retries = 10;
2024a1f3a12cSHemant Agrawal 
2025a1f3a12cSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
2026a1f3a12cSHemant Agrawal 
2027a1f3a12cSHemant Agrawal 	priv = dev->data->dev_private;
202825d0ae62SJun Yang 	dpni = dev->process_private;
2029a1f3a12cSHemant Agrawal 
203025d0ae62SJun Yang 	if (!dpni) {
2031a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Device has not yet been configured");
2032a1f3a12cSHemant Agrawal 		return ret;
2033a1f3a12cSHemant Agrawal 	}
2034a1f3a12cSHemant Agrawal 
2035a1f3a12cSHemant Agrawal 	/*changing  tx burst function to avoid any more enqueues */
2036a41f593fSFerruh Yigit 	dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
2037a1f3a12cSHemant Agrawal 
2038a1f3a12cSHemant Agrawal 	/* Loop while dpni_disable() attempts to drain the egress FQs
2039a1f3a12cSHemant Agrawal 	 * and confirm them back to us.
2040a1f3a12cSHemant Agrawal 	 */
2041a1f3a12cSHemant Agrawal 	do {
2042a1f3a12cSHemant Agrawal 		ret = dpni_disable(dpni, 0, priv->token);
2043a1f3a12cSHemant Agrawal 		if (ret) {
2044a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("dpni disable failed (%d)", ret);
2045a1f3a12cSHemant Agrawal 			return ret;
2046a1f3a12cSHemant Agrawal 		}
2047a1f3a12cSHemant Agrawal 		ret = dpni_is_enabled(dpni, 0, priv->token, &dpni_enabled);
2048a1f3a12cSHemant Agrawal 		if (ret) {
2049a10a988aSShreyansh Jain 			DPAA2_PMD_ERR("dpni enable check failed (%d)", ret);
2050a1f3a12cSHemant Agrawal 			return ret;
2051a1f3a12cSHemant Agrawal 		}
2052a1f3a12cSHemant Agrawal 		if (dpni_enabled)
2053a1f3a12cSHemant Agrawal 			/* Allow the MC some slack */
2054a1f3a12cSHemant Agrawal 			rte_delay_us(100 * 1000);
2055a1f3a12cSHemant Agrawal 	} while (dpni_enabled && --retries);
2056a1f3a12cSHemant Agrawal 
2057a1f3a12cSHemant Agrawal 	if (!retries) {
2058a10a988aSShreyansh Jain 		DPAA2_PMD_WARN("Retry count exceeded disabling dpni");
2059a1f3a12cSHemant Agrawal 		/* todo- we may have to manually cleanup queues.
2060a1f3a12cSHemant Agrawal 		 */
2061a1f3a12cSHemant Agrawal 	} else {
2062a10a988aSShreyansh Jain 		DPAA2_PMD_INFO("Port %d Link DOWN successful",
2063a1f3a12cSHemant Agrawal 			       dev->data->port_id);
2064a1f3a12cSHemant Agrawal 	}
2065a1f3a12cSHemant Agrawal 
2066a1f3a12cSHemant Agrawal 	dev->data->dev_link.link_status = 0;
2067a1f3a12cSHemant Agrawal 
2068a1f3a12cSHemant Agrawal 	return ret;
2069a1f3a12cSHemant Agrawal }
2070a1f3a12cSHemant Agrawal 
2071977d0006SHemant Agrawal static int
2072977d0006SHemant Agrawal dpaa2_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
2073977d0006SHemant Agrawal {
2074977d0006SHemant Agrawal 	int ret = -EINVAL;
2075977d0006SHemant Agrawal 	struct dpaa2_dev_priv *priv;
2076977d0006SHemant Agrawal 	struct fsl_mc_io *dpni;
2077263377beSBrick Yang 	struct dpni_link_cfg cfg = {0};
2078977d0006SHemant Agrawal 
2079977d0006SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
2080977d0006SHemant Agrawal 
2081977d0006SHemant Agrawal 	priv = dev->data->dev_private;
208225d0ae62SJun Yang 	dpni = dev->process_private;
2083977d0006SHemant Agrawal 
208425d0ae62SJun Yang 	if (!dpni || !fc_conf) {
2085a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("device not configured");
2086977d0006SHemant Agrawal 		return ret;
2087977d0006SHemant Agrawal 	}
2088977d0006SHemant Agrawal 
2089263377beSBrick Yang 	ret = dpni_get_link_cfg(dpni, CMD_PRI_LOW, priv->token, &cfg);
2090977d0006SHemant Agrawal 	if (ret) {
2091263377beSBrick Yang 		DPAA2_PMD_ERR("error: dpni_get_link_cfg %d", ret);
2092977d0006SHemant Agrawal 		return ret;
2093977d0006SHemant Agrawal 	}
2094977d0006SHemant Agrawal 
2095977d0006SHemant Agrawal 	memset(fc_conf, 0, sizeof(struct rte_eth_fc_conf));
2096263377beSBrick Yang 	if (cfg.options & DPNI_LINK_OPT_PAUSE) {
2097977d0006SHemant Agrawal 		/* DPNI_LINK_OPT_PAUSE set
2098977d0006SHemant Agrawal 		 *  if ASYM_PAUSE not set,
2099977d0006SHemant Agrawal 		 *	RX Side flow control (handle received Pause frame)
2100977d0006SHemant Agrawal 		 *	TX side flow control (send Pause frame)
2101977d0006SHemant Agrawal 		 *  if ASYM_PAUSE set,
2102977d0006SHemant Agrawal 		 *	RX Side flow control (handle received Pause frame)
2103977d0006SHemant Agrawal 		 *	No TX side flow control (send Pause frame disabled)
2104977d0006SHemant Agrawal 		 */
2105263377beSBrick Yang 		if (!(cfg.options & DPNI_LINK_OPT_ASYM_PAUSE))
2106295968d1SFerruh Yigit 			fc_conf->mode = RTE_ETH_FC_FULL;
2107977d0006SHemant Agrawal 		else
2108295968d1SFerruh Yigit 			fc_conf->mode = RTE_ETH_FC_RX_PAUSE;
2109977d0006SHemant Agrawal 	} else {
2110977d0006SHemant Agrawal 		/* DPNI_LINK_OPT_PAUSE not set
2111977d0006SHemant Agrawal 		 *  if ASYM_PAUSE set,
2112977d0006SHemant Agrawal 		 *	TX side flow control (send Pause frame)
2113977d0006SHemant Agrawal 		 *	No RX side flow control (No action on pause frame rx)
2114977d0006SHemant Agrawal 		 *  if ASYM_PAUSE not set,
2115977d0006SHemant Agrawal 		 *	Flow control disabled
2116977d0006SHemant Agrawal 		 */
2117263377beSBrick Yang 		if (cfg.options & DPNI_LINK_OPT_ASYM_PAUSE)
2118295968d1SFerruh Yigit 			fc_conf->mode = RTE_ETH_FC_TX_PAUSE;
2119977d0006SHemant Agrawal 		else
2120295968d1SFerruh Yigit 			fc_conf->mode = RTE_ETH_FC_NONE;
2121977d0006SHemant Agrawal 	}
2122977d0006SHemant Agrawal 
2123977d0006SHemant Agrawal 	return ret;
2124977d0006SHemant Agrawal }
2125977d0006SHemant Agrawal 
2126977d0006SHemant Agrawal static int
2127977d0006SHemant Agrawal dpaa2_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
2128977d0006SHemant Agrawal {
2129977d0006SHemant Agrawal 	int ret = -EINVAL;
2130977d0006SHemant Agrawal 	struct dpaa2_dev_priv *priv;
2131977d0006SHemant Agrawal 	struct fsl_mc_io *dpni;
2132977d0006SHemant Agrawal 	struct dpni_link_cfg cfg = {0};
2133977d0006SHemant Agrawal 
2134977d0006SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
2135977d0006SHemant Agrawal 
2136977d0006SHemant Agrawal 	priv = dev->data->dev_private;
213725d0ae62SJun Yang 	dpni = dev->process_private;
2138977d0006SHemant Agrawal 
213925d0ae62SJun Yang 	if (!dpni) {
2140a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("dpni is NULL");
2141977d0006SHemant Agrawal 		return ret;
2142977d0006SHemant Agrawal 	}
2143977d0006SHemant Agrawal 
2144263377beSBrick Yang 	/* It is necessary to obtain the current cfg before setting fc_conf
2145977d0006SHemant Agrawal 	 * as MC would return error in case rate, autoneg or duplex values are
2146977d0006SHemant Agrawal 	 * different.
2147977d0006SHemant Agrawal 	 */
2148263377beSBrick Yang 	ret = dpni_get_link_cfg(dpni, CMD_PRI_LOW, priv->token, &cfg);
2149977d0006SHemant Agrawal 	if (ret) {
2150263377beSBrick Yang 		DPAA2_PMD_ERR("Unable to get link cfg (err=%d)", ret);
215172cd5a48SJun Yang 		return ret;
2152977d0006SHemant Agrawal 	}
2153977d0006SHemant Agrawal 
2154977d0006SHemant Agrawal 	/* Disable link before setting configuration */
2155977d0006SHemant Agrawal 	dpaa2_dev_set_link_down(dev);
2156977d0006SHemant Agrawal 
2157977d0006SHemant Agrawal 	/* update cfg with fc_conf */
2158977d0006SHemant Agrawal 	switch (fc_conf->mode) {
2159295968d1SFerruh Yigit 	case RTE_ETH_FC_FULL:
2160977d0006SHemant Agrawal 		/* Full flow control;
2161977d0006SHemant Agrawal 		 * OPT_PAUSE set, ASYM_PAUSE not set
2162977d0006SHemant Agrawal 		 */
2163977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_PAUSE;
2164977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_ASYM_PAUSE;
2165f090a4c3SHemant Agrawal 		break;
2166295968d1SFerruh Yigit 	case RTE_ETH_FC_TX_PAUSE:
2167977d0006SHemant Agrawal 		/* Enable RX flow control
2168977d0006SHemant Agrawal 		 * OPT_PAUSE not set;
2169977d0006SHemant Agrawal 		 * ASYM_PAUSE set;
2170977d0006SHemant Agrawal 		 */
2171977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_ASYM_PAUSE;
2172977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_PAUSE;
2173977d0006SHemant Agrawal 		break;
2174295968d1SFerruh Yigit 	case RTE_ETH_FC_RX_PAUSE:
2175977d0006SHemant Agrawal 		/* Enable TX Flow control
2176977d0006SHemant Agrawal 		 * OPT_PAUSE set
2177977d0006SHemant Agrawal 		 * ASYM_PAUSE set
2178977d0006SHemant Agrawal 		 */
2179977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_PAUSE;
2180977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_ASYM_PAUSE;
2181977d0006SHemant Agrawal 		break;
2182295968d1SFerruh Yigit 	case RTE_ETH_FC_NONE:
2183977d0006SHemant Agrawal 		/* Disable Flow control
2184977d0006SHemant Agrawal 		 * OPT_PAUSE not set
2185977d0006SHemant Agrawal 		 * ASYM_PAUSE not set
2186977d0006SHemant Agrawal 		 */
2187977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_PAUSE;
2188977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_ASYM_PAUSE;
2189977d0006SHemant Agrawal 		break;
2190977d0006SHemant Agrawal 	default:
2191a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Incorrect Flow control flag (%d)",
2192977d0006SHemant Agrawal 			      fc_conf->mode);
219372cd5a48SJun Yang 		return -EINVAL;
2194977d0006SHemant Agrawal 	}
2195977d0006SHemant Agrawal 
2196977d0006SHemant Agrawal 	ret = dpni_set_link_cfg(dpni, CMD_PRI_LOW, priv->token, &cfg);
2197977d0006SHemant Agrawal 	if (ret)
2198a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Unable to set Link configuration (err=%d)",
2199977d0006SHemant Agrawal 			      ret);
2200977d0006SHemant Agrawal 
2201977d0006SHemant Agrawal 	/* Enable link */
2202977d0006SHemant Agrawal 	dpaa2_dev_set_link_up(dev);
2203977d0006SHemant Agrawal 
2204977d0006SHemant Agrawal 	return ret;
2205977d0006SHemant Agrawal }
2206977d0006SHemant Agrawal 
220763d5c3b0SHemant Agrawal static int
220863d5c3b0SHemant Agrawal dpaa2_dev_rss_hash_update(struct rte_eth_dev *dev,
220963d5c3b0SHemant Agrawal 			  struct rte_eth_rss_conf *rss_conf)
221063d5c3b0SHemant Agrawal {
221163d5c3b0SHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
2212271f5aeeSJun Yang 	struct dpaa2_dev_priv *priv = data->dev_private;
221363d5c3b0SHemant Agrawal 	struct rte_eth_conf *eth_conf = &data->dev_conf;
2214271f5aeeSJun Yang 	int ret, tc_index;
221563d5c3b0SHemant Agrawal 
221663d5c3b0SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
221763d5c3b0SHemant Agrawal 
221863d5c3b0SHemant Agrawal 	if (rss_conf->rss_hf) {
2219271f5aeeSJun Yang 		for (tc_index = 0; tc_index < priv->num_rx_tc; tc_index++) {
2220271f5aeeSJun Yang 			ret = dpaa2_setup_flow_dist(dev, rss_conf->rss_hf,
2221271f5aeeSJun Yang 				tc_index);
222263d5c3b0SHemant Agrawal 			if (ret) {
2223271f5aeeSJun Yang 				DPAA2_PMD_ERR("Unable to set flow dist on tc%d",
2224271f5aeeSJun Yang 					tc_index);
222563d5c3b0SHemant Agrawal 				return ret;
222663d5c3b0SHemant Agrawal 			}
2227271f5aeeSJun Yang 		}
222863d5c3b0SHemant Agrawal 	} else {
2229271f5aeeSJun Yang 		for (tc_index = 0; tc_index < priv->num_rx_tc; tc_index++) {
2230271f5aeeSJun Yang 			ret = dpaa2_remove_flow_dist(dev, tc_index);
223163d5c3b0SHemant Agrawal 			if (ret) {
2232271f5aeeSJun Yang 				DPAA2_PMD_ERR(
2233271f5aeeSJun Yang 					"Unable to remove flow dist on tc%d",
2234271f5aeeSJun Yang 					tc_index);
223563d5c3b0SHemant Agrawal 				return ret;
223663d5c3b0SHemant Agrawal 			}
223763d5c3b0SHemant Agrawal 		}
2238271f5aeeSJun Yang 	}
223963d5c3b0SHemant Agrawal 	eth_conf->rx_adv_conf.rss_conf.rss_hf = rss_conf->rss_hf;
224063d5c3b0SHemant Agrawal 	return 0;
224163d5c3b0SHemant Agrawal }
224263d5c3b0SHemant Agrawal 
224363d5c3b0SHemant Agrawal static int
224463d5c3b0SHemant Agrawal dpaa2_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
224563d5c3b0SHemant Agrawal 			    struct rte_eth_rss_conf *rss_conf)
224663d5c3b0SHemant Agrawal {
224763d5c3b0SHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
224863d5c3b0SHemant Agrawal 	struct rte_eth_conf *eth_conf = &data->dev_conf;
224963d5c3b0SHemant Agrawal 
225063d5c3b0SHemant Agrawal 	/* dpaa2 does not support rss_key, so length should be 0*/
225163d5c3b0SHemant Agrawal 	rss_conf->rss_key_len = 0;
225263d5c3b0SHemant Agrawal 	rss_conf->rss_hf = eth_conf->rx_adv_conf.rss_conf.rss_hf;
225363d5c3b0SHemant Agrawal 	return 0;
225463d5c3b0SHemant Agrawal }
225563d5c3b0SHemant Agrawal 
2256b677d4c6SNipun Gupta int dpaa2_eth_eventq_attach(const struct rte_eth_dev *dev,
2257b677d4c6SNipun Gupta 		int eth_rx_queue_id,
22583835cc22SNipun Gupta 		struct dpaa2_dpcon_dev *dpcon,
2259b677d4c6SNipun Gupta 		const struct rte_event_eth_rx_adapter_queue_conf *queue_conf)
2260b677d4c6SNipun Gupta {
2261b677d4c6SNipun Gupta 	struct dpaa2_dev_priv *eth_priv = dev->data->dev_private;
226281c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
2263b677d4c6SNipun Gupta 	struct dpaa2_queue *dpaa2_ethq = eth_priv->rx_vq[eth_rx_queue_id];
2264b677d4c6SNipun Gupta 	uint8_t flow_id = dpaa2_ethq->flow_id;
2265b677d4c6SNipun Gupta 	struct dpni_queue cfg;
22663835cc22SNipun Gupta 	uint8_t options, priority;
2267b677d4c6SNipun Gupta 	int ret;
2268b677d4c6SNipun Gupta 
2269b677d4c6SNipun Gupta 	if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_PARALLEL)
2270b677d4c6SNipun Gupta 		dpaa2_ethq->cb = dpaa2_dev_process_parallel_event;
22712d378863SNipun Gupta 	else if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_ATOMIC)
22722d378863SNipun Gupta 		dpaa2_ethq->cb = dpaa2_dev_process_atomic_event;
227316c4a3c4SNipun Gupta 	else if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_ORDERED)
227416c4a3c4SNipun Gupta 		dpaa2_ethq->cb = dpaa2_dev_process_ordered_event;
2275b677d4c6SNipun Gupta 	else
2276b677d4c6SNipun Gupta 		return -EINVAL;
2277b677d4c6SNipun Gupta 
22783835cc22SNipun Gupta 	priority = (RTE_EVENT_DEV_PRIORITY_LOWEST / queue_conf->ev.priority) *
22793835cc22SNipun Gupta 		   (dpcon->num_priorities - 1);
22803835cc22SNipun Gupta 
2281b677d4c6SNipun Gupta 	memset(&cfg, 0, sizeof(struct dpni_queue));
2282b677d4c6SNipun Gupta 	options = DPNI_QUEUE_OPT_DEST;
2283b677d4c6SNipun Gupta 	cfg.destination.type = DPNI_DEST_DPCON;
22843835cc22SNipun Gupta 	cfg.destination.id = dpcon->dpcon_id;
22853835cc22SNipun Gupta 	cfg.destination.priority = priority;
2286b677d4c6SNipun Gupta 
22872d378863SNipun Gupta 	if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
22882d378863SNipun Gupta 		options |= DPNI_QUEUE_OPT_HOLD_ACTIVE;
22892d378863SNipun Gupta 		cfg.destination.hold_active = 1;
22902d378863SNipun Gupta 	}
22912d378863SNipun Gupta 
229216c4a3c4SNipun Gupta 	if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_ORDERED &&
229316c4a3c4SNipun Gupta 			!eth_priv->en_ordered) {
229416c4a3c4SNipun Gupta 		struct opr_cfg ocfg;
229516c4a3c4SNipun Gupta 
229616c4a3c4SNipun Gupta 		/* Restoration window size = 256 frames */
229716c4a3c4SNipun Gupta 		ocfg.oprrws = 3;
229816c4a3c4SNipun Gupta 		/* Restoration window size = 512 frames for LX2 */
229916c4a3c4SNipun Gupta 		if (dpaa2_svr_family == SVR_LX2160A)
230016c4a3c4SNipun Gupta 			ocfg.oprrws = 4;
230116c4a3c4SNipun Gupta 		/* Auto advance NESN window enabled */
230216c4a3c4SNipun Gupta 		ocfg.oa = 1;
230316c4a3c4SNipun Gupta 		/* Late arrival window size disabled */
230416c4a3c4SNipun Gupta 		ocfg.olws = 0;
23057be78d02SJosh Soref 		/* ORL resource exhaustion advance NESN disabled */
230616c4a3c4SNipun Gupta 		ocfg.oeane = 0;
230716c4a3c4SNipun Gupta 		/* Loose ordering enabled */
230816c4a3c4SNipun Gupta 		ocfg.oloe = 1;
230916c4a3c4SNipun Gupta 		eth_priv->en_loose_ordered = 1;
231016c4a3c4SNipun Gupta 		/* Strict ordering enabled if explicitly set */
231116c4a3c4SNipun Gupta 		if (getenv("DPAA2_STRICT_ORDERING_ENABLE")) {
231216c4a3c4SNipun Gupta 			ocfg.oloe = 0;
231316c4a3c4SNipun Gupta 			eth_priv->en_loose_ordered = 0;
231416c4a3c4SNipun Gupta 		}
231516c4a3c4SNipun Gupta 
231616c4a3c4SNipun Gupta 		ret = dpni_set_opr(dpni, CMD_PRI_LOW, eth_priv->token,
231716c4a3c4SNipun Gupta 				   dpaa2_ethq->tc_index, flow_id,
23182cb2abf3SHemant Agrawal 				   OPR_OPT_CREATE, &ocfg, 0);
231916c4a3c4SNipun Gupta 		if (ret) {
2320f665790aSDavid Marchand 			DPAA2_PMD_ERR("Error setting opr: ret: %d", ret);
232116c4a3c4SNipun Gupta 			return ret;
232216c4a3c4SNipun Gupta 		}
232316c4a3c4SNipun Gupta 
232416c4a3c4SNipun Gupta 		eth_priv->en_ordered = 1;
232516c4a3c4SNipun Gupta 	}
232616c4a3c4SNipun Gupta 
2327b677d4c6SNipun Gupta 	options |= DPNI_QUEUE_OPT_USER_CTX;
23285ae1edffSHemant Agrawal 	cfg.user_context = (size_t)(dpaa2_ethq);
2329b677d4c6SNipun Gupta 
2330b677d4c6SNipun Gupta 	ret = dpni_set_queue(dpni, CMD_PRI_LOW, eth_priv->token, DPNI_QUEUE_RX,
2331b677d4c6SNipun Gupta 			     dpaa2_ethq->tc_index, flow_id, options, &cfg);
2332b677d4c6SNipun Gupta 	if (ret) {
2333a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error in dpni_set_queue: ret: %d", ret);
2334b677d4c6SNipun Gupta 		return ret;
2335b677d4c6SNipun Gupta 	}
2336b677d4c6SNipun Gupta 
2337b677d4c6SNipun Gupta 	memcpy(&dpaa2_ethq->ev, &queue_conf->ev, sizeof(struct rte_event));
2338b677d4c6SNipun Gupta 
2339b677d4c6SNipun Gupta 	return 0;
2340b677d4c6SNipun Gupta }
2341b677d4c6SNipun Gupta 
2342b677d4c6SNipun Gupta int dpaa2_eth_eventq_detach(const struct rte_eth_dev *dev,
2343b677d4c6SNipun Gupta 		int eth_rx_queue_id)
2344b677d4c6SNipun Gupta {
2345b677d4c6SNipun Gupta 	struct dpaa2_dev_priv *eth_priv = dev->data->dev_private;
234681c42c84SShreyansh Jain 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
2347b677d4c6SNipun Gupta 	struct dpaa2_queue *dpaa2_ethq = eth_priv->rx_vq[eth_rx_queue_id];
2348b677d4c6SNipun Gupta 	uint8_t flow_id = dpaa2_ethq->flow_id;
2349b677d4c6SNipun Gupta 	struct dpni_queue cfg;
2350b677d4c6SNipun Gupta 	uint8_t options;
2351b677d4c6SNipun Gupta 	int ret;
2352b677d4c6SNipun Gupta 
2353b677d4c6SNipun Gupta 	memset(&cfg, 0, sizeof(struct dpni_queue));
2354b677d4c6SNipun Gupta 	options = DPNI_QUEUE_OPT_DEST;
2355b677d4c6SNipun Gupta 	cfg.destination.type = DPNI_DEST_NONE;
2356b677d4c6SNipun Gupta 
2357b677d4c6SNipun Gupta 	ret = dpni_set_queue(dpni, CMD_PRI_LOW, eth_priv->token, DPNI_QUEUE_RX,
2358b677d4c6SNipun Gupta 			     dpaa2_ethq->tc_index, flow_id, options, &cfg);
2359b677d4c6SNipun Gupta 	if (ret)
2360a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error in dpni_set_queue: ret: %d", ret);
2361b677d4c6SNipun Gupta 
2362b677d4c6SNipun Gupta 	return ret;
2363b677d4c6SNipun Gupta }
2364b677d4c6SNipun Gupta 
2365fe2b986aSSunil Kumar Kori static int
2366fb7ad441SThomas Monjalon dpaa2_dev_flow_ops_get(struct rte_eth_dev *dev,
2367fb7ad441SThomas Monjalon 		       const struct rte_flow_ops **ops)
2368fe2b986aSSunil Kumar Kori {
2369fe2b986aSSunil Kumar Kori 	if (!dev)
2370fe2b986aSSunil Kumar Kori 		return -ENODEV;
2371fe2b986aSSunil Kumar Kori 
2372fb7ad441SThomas Monjalon 	*ops = &dpaa2_flow_ops;
2373fb7ad441SThomas Monjalon 	return 0;
2374fe2b986aSSunil Kumar Kori }
2375fe2b986aSSunil Kumar Kori 
2376de1d70f0SHemant Agrawal static void
2377de1d70f0SHemant Agrawal dpaa2_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
2378de1d70f0SHemant Agrawal 	struct rte_eth_rxq_info *qinfo)
2379de1d70f0SHemant Agrawal {
2380de1d70f0SHemant Agrawal 	struct dpaa2_queue *rxq;
2381731fa400SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
238225d0ae62SJun Yang 	struct fsl_mc_io *dpni = dev->process_private;
2383731fa400SHemant Agrawal 	uint16_t max_frame_length;
2384de1d70f0SHemant Agrawal 
238525d0ae62SJun Yang 	rxq = dev->data->rx_queues[queue_id];
2386de1d70f0SHemant Agrawal 
2387de1d70f0SHemant Agrawal 	qinfo->mp = rxq->mb_pool;
2388de1d70f0SHemant Agrawal 	qinfo->scattered_rx = dev->data->scattered_rx;
2389de1d70f0SHemant Agrawal 	qinfo->nb_desc = rxq->nb_desc;
2390731fa400SHemant Agrawal 	if (dpni_get_max_frame_length(dpni, CMD_PRI_LOW, priv->token,
2391731fa400SHemant Agrawal 				&max_frame_length) == 0)
2392731fa400SHemant Agrawal 		qinfo->rx_buf_size = max_frame_length;
2393de1d70f0SHemant Agrawal 
2394de1d70f0SHemant Agrawal 	qinfo->conf.rx_free_thresh = 1;
2395de1d70f0SHemant Agrawal 	qinfo->conf.rx_drop_en = 1;
2396de1d70f0SHemant Agrawal 	qinfo->conf.rx_deferred_start = 0;
2397de1d70f0SHemant Agrawal 	qinfo->conf.offloads = rxq->offloads;
2398de1d70f0SHemant Agrawal }
2399de1d70f0SHemant Agrawal 
2400de1d70f0SHemant Agrawal static void
2401de1d70f0SHemant Agrawal dpaa2_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
2402de1d70f0SHemant Agrawal 	struct rte_eth_txq_info *qinfo)
2403de1d70f0SHemant Agrawal {
2404de1d70f0SHemant Agrawal 	struct dpaa2_queue *txq;
2405de1d70f0SHemant Agrawal 
2406de1d70f0SHemant Agrawal 	txq = dev->data->tx_queues[queue_id];
2407de1d70f0SHemant Agrawal 
2408de1d70f0SHemant Agrawal 	qinfo->nb_desc = txq->nb_desc;
2409de1d70f0SHemant Agrawal 	qinfo->conf.tx_thresh.pthresh = 0;
2410de1d70f0SHemant Agrawal 	qinfo->conf.tx_thresh.hthresh = 0;
2411de1d70f0SHemant Agrawal 	qinfo->conf.tx_thresh.wthresh = 0;
2412de1d70f0SHemant Agrawal 
2413de1d70f0SHemant Agrawal 	qinfo->conf.tx_free_thresh = 0;
2414de1d70f0SHemant Agrawal 	qinfo->conf.tx_rs_thresh = 0;
2415de1d70f0SHemant Agrawal 	qinfo->conf.offloads = txq->offloads;
2416de1d70f0SHemant Agrawal 	qinfo->conf.tx_deferred_start = 0;
2417de1d70f0SHemant Agrawal }
2418de1d70f0SHemant Agrawal 
2419ac624068SGagandeep Singh static int
2420ac624068SGagandeep Singh dpaa2_tm_ops_get(struct rte_eth_dev *dev __rte_unused, void *ops)
2421ac624068SGagandeep Singh {
2422ac624068SGagandeep Singh 	*(const void **)ops = &dpaa2_tm_ops;
2423ac624068SGagandeep Singh 
2424ac624068SGagandeep Singh 	return 0;
2425ac624068SGagandeep Singh }
2426ac624068SGagandeep Singh 
2427a5b375edSNipun Gupta void
2428a5b375edSNipun Gupta rte_pmd_dpaa2_thread_init(void)
2429a5b375edSNipun Gupta {
2430a5b375edSNipun Gupta 	int ret;
2431a5b375edSNipun Gupta 
2432a5b375edSNipun Gupta 	if (unlikely(!DPAA2_PER_LCORE_DPIO)) {
2433a5b375edSNipun Gupta 		ret = dpaa2_affine_qbman_swp();
2434a5b375edSNipun Gupta 		if (ret) {
2435a5b375edSNipun Gupta 			DPAA2_PMD_ERR(
2436f665790aSDavid Marchand 				"Failed to allocate IO portal, tid: %d",
2437a5b375edSNipun Gupta 				rte_gettid());
2438a5b375edSNipun Gupta 			return;
2439a5b375edSNipun Gupta 		}
2440a5b375edSNipun Gupta 	}
2441a5b375edSNipun Gupta }
2442a5b375edSNipun Gupta 
24433e5a335dSHemant Agrawal static struct eth_dev_ops dpaa2_ethdev_ops = {
24443e5a335dSHemant Agrawal 	.dev_configure	  = dpaa2_eth_dev_configure,
24453e5a335dSHemant Agrawal 	.dev_start	      = dpaa2_dev_start,
24463e5a335dSHemant Agrawal 	.dev_stop	      = dpaa2_dev_stop,
24473e5a335dSHemant Agrawal 	.dev_close	      = dpaa2_dev_close,
2448c0e5c69aSHemant Agrawal 	.promiscuous_enable   = dpaa2_dev_promiscuous_enable,
2449c0e5c69aSHemant Agrawal 	.promiscuous_disable  = dpaa2_dev_promiscuous_disable,
24505d5aeeedSHemant Agrawal 	.allmulticast_enable  = dpaa2_dev_allmulticast_enable,
24515d5aeeedSHemant Agrawal 	.allmulticast_disable = dpaa2_dev_allmulticast_disable,
2452a1f3a12cSHemant Agrawal 	.dev_set_link_up      = dpaa2_dev_set_link_up,
2453a1f3a12cSHemant Agrawal 	.dev_set_link_down    = dpaa2_dev_set_link_down,
2454c56c86ffSHemant Agrawal 	.link_update	   = dpaa2_dev_link_update,
2455b0aa5459SHemant Agrawal 	.stats_get	       = dpaa2_dev_stats_get,
24561d6329b2SHemant Agrawal 	.xstats_get	       = dpaa2_dev_xstats_get,
24571d6329b2SHemant Agrawal 	.xstats_get_by_id     = dpaa2_xstats_get_by_id,
24581d6329b2SHemant Agrawal 	.xstats_get_names_by_id = dpaa2_xstats_get_names_by_id,
24591d6329b2SHemant Agrawal 	.xstats_get_names      = dpaa2_xstats_get_names,
2460b0aa5459SHemant Agrawal 	.stats_reset	   = dpaa2_dev_stats_reset,
24611d6329b2SHemant Agrawal 	.xstats_reset	      = dpaa2_dev_stats_reset,
2462748eccb9SHemant Agrawal 	.fw_version_get	   = dpaa2_fw_version_get,
24633e5a335dSHemant Agrawal 	.dev_infos_get	   = dpaa2_dev_info_get,
2464a5fc38d4SHemant Agrawal 	.dev_supported_ptypes_get = dpaa2_supported_ptypes_get,
2465e31d4d21SHemant Agrawal 	.mtu_set           = dpaa2_dev_mtu_set,
24663ce294f2SHemant Agrawal 	.vlan_filter_set      = dpaa2_vlan_filter_set,
24673ce294f2SHemant Agrawal 	.vlan_offload_set     = dpaa2_vlan_offload_set,
2468e59b75ffSHemant Agrawal 	.vlan_tpid_set	      = dpaa2_vlan_tpid_set,
24693e5a335dSHemant Agrawal 	.rx_queue_setup    = dpaa2_dev_rx_queue_setup,
24703e5a335dSHemant Agrawal 	.rx_queue_release  = dpaa2_dev_rx_queue_release,
24713e5a335dSHemant Agrawal 	.tx_queue_setup    = dpaa2_dev_tx_queue_setup,
2472ddbc2b66SApeksha Gupta 	.rx_burst_mode_get = dpaa2_dev_rx_burst_mode_get,
2473ddbc2b66SApeksha Gupta 	.tx_burst_mode_get = dpaa2_dev_tx_burst_mode_get,
2474977d0006SHemant Agrawal 	.flow_ctrl_get	      = dpaa2_flow_ctrl_get,
2475977d0006SHemant Agrawal 	.flow_ctrl_set	      = dpaa2_flow_ctrl_set,
2476b4d97b7dSHemant Agrawal 	.mac_addr_add         = dpaa2_dev_add_mac_addr,
2477b4d97b7dSHemant Agrawal 	.mac_addr_remove      = dpaa2_dev_remove_mac_addr,
2478b4d97b7dSHemant Agrawal 	.mac_addr_set         = dpaa2_dev_set_mac_addr,
247963d5c3b0SHemant Agrawal 	.rss_hash_update      = dpaa2_dev_rss_hash_update,
248063d5c3b0SHemant Agrawal 	.rss_hash_conf_get    = dpaa2_dev_rss_hash_conf_get,
2481fb7ad441SThomas Monjalon 	.flow_ops_get         = dpaa2_dev_flow_ops_get,
2482de1d70f0SHemant Agrawal 	.rxq_info_get	      = dpaa2_rxq_info_get,
2483de1d70f0SHemant Agrawal 	.txq_info_get	      = dpaa2_txq_info_get,
2484ac624068SGagandeep Singh 	.tm_ops_get	      = dpaa2_tm_ops_get,
2485bc767866SPriyanka Jain #if defined(RTE_LIBRTE_IEEE1588)
2486bc767866SPriyanka Jain 	.timesync_enable      = dpaa2_timesync_enable,
2487bc767866SPriyanka Jain 	.timesync_disable     = dpaa2_timesync_disable,
2488bc767866SPriyanka Jain 	.timesync_read_time   = dpaa2_timesync_read_time,
2489bc767866SPriyanka Jain 	.timesync_write_time  = dpaa2_timesync_write_time,
2490bc767866SPriyanka Jain 	.timesync_adjust_time = dpaa2_timesync_adjust_time,
2491bc767866SPriyanka Jain 	.timesync_read_rx_timestamp = dpaa2_timesync_read_rx_timestamp,
2492bc767866SPriyanka Jain 	.timesync_read_tx_timestamp = dpaa2_timesync_read_tx_timestamp,
2493bc767866SPriyanka Jain #endif
24943e5a335dSHemant Agrawal };
24953e5a335dSHemant Agrawal 
2496c3e0a706SShreyansh Jain /* Populate the mac address from physically available (u-boot/firmware) and/or
2497c3e0a706SShreyansh Jain  * one set by higher layers like MC (restool) etc.
2498c3e0a706SShreyansh Jain  * Returns the table of MAC entries (multiple entries)
2499c3e0a706SShreyansh Jain  */
2500c3e0a706SShreyansh Jain static int
250125d0ae62SJun Yang populate_mac_addr(struct fsl_mc_io *dpni_dev,
250225d0ae62SJun Yang 	struct dpaa2_dev_priv *priv, struct rte_ether_addr *mac_entry)
2503c3e0a706SShreyansh Jain {
250425d0ae62SJun Yang 	int ret = 0;
25056d13ea8eSOlivier Matz 	struct rte_ether_addr phy_mac, prime_mac;
250641c24ea2SShreyansh Jain 
25076d13ea8eSOlivier Matz 	memset(&phy_mac, 0, sizeof(struct rte_ether_addr));
25086d13ea8eSOlivier Matz 	memset(&prime_mac, 0, sizeof(struct rte_ether_addr));
2509c3e0a706SShreyansh Jain 
2510c3e0a706SShreyansh Jain 	/* Get the physical device MAC address */
2511c3e0a706SShreyansh Jain 	ret = dpni_get_port_mac_addr(dpni_dev, CMD_PRI_LOW, priv->token,
2512c3e0a706SShreyansh Jain 				     phy_mac.addr_bytes);
2513c3e0a706SShreyansh Jain 	if (ret) {
2514c3e0a706SShreyansh Jain 		DPAA2_PMD_ERR("DPNI get physical port MAC failed: %d", ret);
2515c3e0a706SShreyansh Jain 		goto cleanup;
2516c3e0a706SShreyansh Jain 	}
2517c3e0a706SShreyansh Jain 
2518c3e0a706SShreyansh Jain 	ret = dpni_get_primary_mac_addr(dpni_dev, CMD_PRI_LOW, priv->token,
2519c3e0a706SShreyansh Jain 					prime_mac.addr_bytes);
2520c3e0a706SShreyansh Jain 	if (ret) {
2521c3e0a706SShreyansh Jain 		DPAA2_PMD_ERR("DPNI get Prime port MAC failed: %d", ret);
2522c3e0a706SShreyansh Jain 		goto cleanup;
2523c3e0a706SShreyansh Jain 	}
2524c3e0a706SShreyansh Jain 
2525c3e0a706SShreyansh Jain 	/* Now that both MAC have been obtained, do:
2526c3e0a706SShreyansh Jain 	 *  if not_empty_mac(phy) && phy != Prime, overwrite prime with Phy
2527c3e0a706SShreyansh Jain 	 *     and return phy
2528c3e0a706SShreyansh Jain 	 *  If empty_mac(phy), return prime.
2529c3e0a706SShreyansh Jain 	 *  if both are empty, create random MAC, set as prime and return
2530c3e0a706SShreyansh Jain 	 */
2531538da7a1SOlivier Matz 	if (!rte_is_zero_ether_addr(&phy_mac)) {
2532c3e0a706SShreyansh Jain 		/* If the addresses are not same, overwrite prime */
2533538da7a1SOlivier Matz 		if (!rte_is_same_ether_addr(&phy_mac, &prime_mac)) {
2534c3e0a706SShreyansh Jain 			ret = dpni_set_primary_mac_addr(dpni_dev, CMD_PRI_LOW,
2535c3e0a706SShreyansh Jain 							priv->token,
2536c3e0a706SShreyansh Jain 							phy_mac.addr_bytes);
2537c3e0a706SShreyansh Jain 			if (ret) {
2538c3e0a706SShreyansh Jain 				DPAA2_PMD_ERR("Unable to set MAC Address: %d",
2539c3e0a706SShreyansh Jain 					      ret);
2540c3e0a706SShreyansh Jain 				goto cleanup;
2541c3e0a706SShreyansh Jain 			}
25426d13ea8eSOlivier Matz 			memcpy(&prime_mac, &phy_mac,
25436d13ea8eSOlivier Matz 				sizeof(struct rte_ether_addr));
2544c3e0a706SShreyansh Jain 		}
2545538da7a1SOlivier Matz 	} else if (rte_is_zero_ether_addr(&prime_mac)) {
2546c3e0a706SShreyansh Jain 		/* In case phys and prime, both are zero, create random MAC */
2547538da7a1SOlivier Matz 		rte_eth_random_addr(prime_mac.addr_bytes);
2548c3e0a706SShreyansh Jain 		ret = dpni_set_primary_mac_addr(dpni_dev, CMD_PRI_LOW,
2549c3e0a706SShreyansh Jain 						priv->token,
2550c3e0a706SShreyansh Jain 						prime_mac.addr_bytes);
2551c3e0a706SShreyansh Jain 		if (ret) {
2552c3e0a706SShreyansh Jain 			DPAA2_PMD_ERR("Unable to set MAC Address: %d", ret);
2553c3e0a706SShreyansh Jain 			goto cleanup;
2554c3e0a706SShreyansh Jain 		}
2555c3e0a706SShreyansh Jain 	}
2556c3e0a706SShreyansh Jain 
2557c3e0a706SShreyansh Jain 	/* prime_mac the final MAC address */
25586d13ea8eSOlivier Matz 	memcpy(mac_entry, &prime_mac, sizeof(struct rte_ether_addr));
2559c3e0a706SShreyansh Jain 	return 0;
2560c3e0a706SShreyansh Jain 
2561c3e0a706SShreyansh Jain cleanup:
256225d0ae62SJun Yang 	return ret;
2563c3e0a706SShreyansh Jain }
2564c3e0a706SShreyansh Jain 
2565c147eae0SHemant Agrawal static int
2566a3a997f0SHemant Agrawal check_devargs_handler(__rte_unused const char *key, const char *value,
2567a3a997f0SHemant Agrawal 		      __rte_unused void *opaque)
2568a3a997f0SHemant Agrawal {
2569a3a997f0SHemant Agrawal 	if (strcmp(value, "1"))
2570a3a997f0SHemant Agrawal 		return -1;
2571a3a997f0SHemant Agrawal 
2572a3a997f0SHemant Agrawal 	return 0;
2573a3a997f0SHemant Agrawal }
2574a3a997f0SHemant Agrawal 
2575a3a997f0SHemant Agrawal static int
2576a3a997f0SHemant Agrawal dpaa2_get_devargs(struct rte_devargs *devargs, const char *key)
2577a3a997f0SHemant Agrawal {
2578a3a997f0SHemant Agrawal 	struct rte_kvargs *kvlist;
2579a3a997f0SHemant Agrawal 
2580a3a997f0SHemant Agrawal 	if (!devargs)
2581a3a997f0SHemant Agrawal 		return 0;
2582a3a997f0SHemant Agrawal 
2583a3a997f0SHemant Agrawal 	kvlist = rte_kvargs_parse(devargs->args, NULL);
2584a3a997f0SHemant Agrawal 	if (!kvlist)
2585a3a997f0SHemant Agrawal 		return 0;
2586a3a997f0SHemant Agrawal 
2587a3a997f0SHemant Agrawal 	if (!rte_kvargs_count(kvlist, key)) {
2588a3a997f0SHemant Agrawal 		rte_kvargs_free(kvlist);
2589a3a997f0SHemant Agrawal 		return 0;
2590a3a997f0SHemant Agrawal 	}
2591a3a997f0SHemant Agrawal 
2592a3a997f0SHemant Agrawal 	if (rte_kvargs_process(kvlist, key,
2593a3a997f0SHemant Agrawal 			       check_devargs_handler, NULL) < 0) {
2594a3a997f0SHemant Agrawal 		rte_kvargs_free(kvlist);
2595a3a997f0SHemant Agrawal 		return 0;
2596a3a997f0SHemant Agrawal 	}
2597a3a997f0SHemant Agrawal 	rte_kvargs_free(kvlist);
2598a3a997f0SHemant Agrawal 
2599a3a997f0SHemant Agrawal 	return 1;
2600a3a997f0SHemant Agrawal }
2601a3a997f0SHemant Agrawal 
2602a3a997f0SHemant Agrawal static int
2603c147eae0SHemant Agrawal dpaa2_dev_init(struct rte_eth_dev *eth_dev)
2604c147eae0SHemant Agrawal {
26053e5a335dSHemant Agrawal 	struct rte_device *dev = eth_dev->device;
26063e5a335dSHemant Agrawal 	struct rte_dpaa2_device *dpaa2_dev;
26073e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni_dev;
26083e5a335dSHemant Agrawal 	struct dpni_attr attr;
26093e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = eth_dev->data->dev_private;
2610bee61d86SHemant Agrawal 	struct dpni_buffer_layout layout;
2611fe2b986aSSunil Kumar Kori 	int ret, hw_id, i;
26123e5a335dSHemant Agrawal 
2613d401ead1SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
2614d401ead1SHemant Agrawal 
261581c42c84SShreyansh Jain 	dpni_dev = rte_malloc(NULL, sizeof(struct fsl_mc_io), 0);
261681c42c84SShreyansh Jain 	if (!dpni_dev) {
261781c42c84SShreyansh Jain 		DPAA2_PMD_ERR("Memory allocation failed for dpni device");
261881c42c84SShreyansh Jain 		return -1;
261981c42c84SShreyansh Jain 	}
2620a6a5f4b4SHemant Agrawal 	dpni_dev->regs = dpaa2_get_mcp_ptr(MC_PORTAL_INDEX);
262125d0ae62SJun Yang 	eth_dev->process_private = dpni_dev;
262281c42c84SShreyansh Jain 
2623c147eae0SHemant Agrawal 	/* For secondary processes, the primary has done all the work */
2624e7b187dbSShreyansh Jain 	if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
2625e7b187dbSShreyansh Jain 		/* In case of secondary, only burst and ops API need to be
2626e7b187dbSShreyansh Jain 		 * plugged.
2627e7b187dbSShreyansh Jain 		 */
2628e7b187dbSShreyansh Jain 		eth_dev->dev_ops = &dpaa2_ethdev_ops;
2629cbfc6111SFerruh Yigit 		eth_dev->rx_queue_count = dpaa2_dev_rx_queue_count;
2630a3a997f0SHemant Agrawal 		if (dpaa2_get_devargs(dev->devargs, DRIVER_LOOPBACK_MODE))
2631a3a997f0SHemant Agrawal 			eth_dev->rx_pkt_burst = dpaa2_dev_loopback_rx;
263220191ab3SNipun Gupta 		else if (dpaa2_get_devargs(dev->devargs,
263320191ab3SNipun Gupta 					DRIVER_NO_PREFETCH_MODE))
263420191ab3SNipun Gupta 			eth_dev->rx_pkt_burst = dpaa2_dev_rx;
2635a3a997f0SHemant Agrawal 		else
2636e7b187dbSShreyansh Jain 			eth_dev->rx_pkt_burst = dpaa2_dev_prefetch_rx;
2637e7b187dbSShreyansh Jain 		eth_dev->tx_pkt_burst = dpaa2_dev_tx;
2638c147eae0SHemant Agrawal 		return 0;
2639e7b187dbSShreyansh Jain 	}
2640c147eae0SHemant Agrawal 
26413e5a335dSHemant Agrawal 	dpaa2_dev = container_of(dev, struct rte_dpaa2_device, device);
26423e5a335dSHemant Agrawal 
26433e5a335dSHemant Agrawal 	hw_id = dpaa2_dev->object_id;
26443e5a335dSHemant Agrawal 	ret = dpni_open(dpni_dev, CMD_PRI_LOW, hw_id, &priv->token);
26453e5a335dSHemant Agrawal 	if (ret) {
2646a10a988aSShreyansh Jain 		DPAA2_PMD_ERR(
2647a10a988aSShreyansh Jain 			     "Failure in opening dpni@%d with err code %d",
2648d4984046SHemant Agrawal 			     hw_id, ret);
2649d4984046SHemant Agrawal 		rte_free(dpni_dev);
265025d0ae62SJun Yang 		return ret;
26513e5a335dSHemant Agrawal 	}
26523e5a335dSHemant Agrawal 
2653f023d059SJun Yang 	if (eth_dev->data->dev_conf.lpbk_mode)
2654f023d059SJun Yang 		dpaa2_dev_recycle_deconfig(eth_dev);
2655f023d059SJun Yang 
26563e5a335dSHemant Agrawal 	/* Clean the device first */
26573e5a335dSHemant Agrawal 	ret = dpni_reset(dpni_dev, CMD_PRI_LOW, priv->token);
26583e5a335dSHemant Agrawal 	if (ret) {
2659a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Failure cleaning dpni@%d with err code %d",
2660d4984046SHemant Agrawal 			      hw_id, ret);
2661d4984046SHemant Agrawal 		goto init_err;
26623e5a335dSHemant Agrawal 	}
26633e5a335dSHemant Agrawal 
26643e5a335dSHemant Agrawal 	ret = dpni_get_attributes(dpni_dev, CMD_PRI_LOW, priv->token, &attr);
26653e5a335dSHemant Agrawal 	if (ret) {
2666a10a988aSShreyansh Jain 		DPAA2_PMD_ERR(
2667a10a988aSShreyansh Jain 			     "Failure in get dpni@%d attribute, err code %d",
2668d4984046SHemant Agrawal 			     hw_id, ret);
2669d4984046SHemant Agrawal 		goto init_err;
26703e5a335dSHemant Agrawal 	}
26713e5a335dSHemant Agrawal 
267216bbc98aSShreyansh Jain 	priv->num_rx_tc = attr.num_rx_tcs;
267372100f0dSGagandeep Singh 	priv->num_tx_tc = attr.num_tx_tcs;
26744ce58f8aSJun Yang 	priv->qos_entries = attr.qos_entries;
26754ce58f8aSJun Yang 	priv->fs_entries = attr.fs_entries;
26764ce58f8aSJun Yang 	priv->dist_queues = attr.num_queues;
267772100f0dSGagandeep Singh 	priv->num_channels = attr.num_channels;
267872100f0dSGagandeep Singh 	priv->channel_inuse = 0;
2679f023d059SJun Yang 	rte_spinlock_init(&priv->lpbk_qp_lock);
26804ce58f8aSJun Yang 
268113b856acSHemant Agrawal 	/* only if the custom CG is enabled */
268213b856acSHemant Agrawal 	if (attr.options & DPNI_OPT_CUSTOM_CG)
268313b856acSHemant Agrawal 		priv->max_cgs = attr.num_cgs;
268413b856acSHemant Agrawal 	else
268513b856acSHemant Agrawal 		priv->max_cgs = 0;
268613b856acSHemant Agrawal 
268713b856acSHemant Agrawal 	for (i = 0; i < priv->max_cgs; i++)
268813b856acSHemant Agrawal 		priv->cgid_in_use[i] = 0;
268989c2ea8fSHemant Agrawal 
2690fe2b986aSSunil Kumar Kori 	for (i = 0; i < attr.num_rx_tcs; i++)
2691fe2b986aSSunil Kumar Kori 		priv->nb_rx_queues += attr.num_queues;
269289c2ea8fSHemant Agrawal 
269372100f0dSGagandeep Singh 	priv->nb_tx_queues = attr.num_tx_tcs * attr.num_channels;
2694ef18dafeSHemant Agrawal 
269513b856acSHemant Agrawal 	DPAA2_PMD_DEBUG("RX-TC= %d, rx_queues= %d, tx_queues=%d, max_cgs=%d",
2696a10a988aSShreyansh Jain 			priv->num_rx_tc, priv->nb_rx_queues,
269713b856acSHemant Agrawal 			priv->nb_tx_queues, priv->max_cgs);
26983e5a335dSHemant Agrawal 
26993e5a335dSHemant Agrawal 	priv->hw = dpni_dev;
27003e5a335dSHemant Agrawal 	priv->hw_id = hw_id;
270133fad432SHemant Agrawal 	priv->options = attr.options;
270233fad432SHemant Agrawal 	priv->max_mac_filters = attr.mac_filter_entries;
270333fad432SHemant Agrawal 	priv->max_vlan_filters = attr.vlan_filter_entries;
27043e5a335dSHemant Agrawal 	priv->flags = 0;
2705e806bf87SPriyanka Jain #if defined(RTE_LIBRTE_IEEE1588)
27060fcdbde0SHemant Agrawal 	DPAA2_PMD_INFO("DPDK IEEE1588 is enabled");
27078d21c563SHemant Agrawal 	priv->flags |= DPAA2_TX_CONF_ENABLE;
2708e806bf87SPriyanka Jain #endif
27098d21c563SHemant Agrawal 	/* Used with ``fslmc:dpni.1,drv_tx_conf=1`` */
27108d21c563SHemant Agrawal 	if (dpaa2_get_devargs(dev->devargs, DRIVER_TX_CONF)) {
27118d21c563SHemant Agrawal 		priv->flags |= DPAA2_TX_CONF_ENABLE;
27128d21c563SHemant Agrawal 		DPAA2_PMD_INFO("TX_CONF Enabled");
27138d21c563SHemant Agrawal 	}
27143e5a335dSHemant Agrawal 
27154690a611SNipun Gupta 	if (dpaa2_get_devargs(dev->devargs, DRIVER_ERROR_QUEUE)) {
27164690a611SNipun Gupta 		dpaa2_enable_err_queue = 1;
2717a63c6426SJun Yang 		DPAA2_PMD_INFO("Enable DMA error checks");
27184690a611SNipun Gupta 	}
27194690a611SNipun Gupta 
272093e41cb3SJun Yang 	if (getenv("DPAA2_PRINT_RX_PARSER_RESULT"))
272193e41cb3SJun Yang 		dpaa2_print_parser_result = 1;
272293e41cb3SJun Yang 
27233e5a335dSHemant Agrawal 	/* Allocate memory for hardware structure for queues */
27243e5a335dSHemant Agrawal 	ret = dpaa2_alloc_rx_tx_queues(eth_dev);
27253e5a335dSHemant Agrawal 	if (ret) {
2726a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Queue allocation Failed");
2727d4984046SHemant Agrawal 		goto init_err;
27283e5a335dSHemant Agrawal 	}
27293e5a335dSHemant Agrawal 
2730c3e0a706SShreyansh Jain 	/* Allocate memory for storing MAC addresses.
2731c3e0a706SShreyansh Jain 	 * Table of mac_filter_entries size is allocated so that RTE ether lib
2732c3e0a706SShreyansh Jain 	 * can add MAC entries when rte_eth_dev_mac_addr_add is called.
2733c3e0a706SShreyansh Jain 	 */
273433fad432SHemant Agrawal 	eth_dev->data->mac_addrs = rte_zmalloc("dpni",
273535b2d13fSOlivier Matz 		RTE_ETHER_ADDR_LEN * attr.mac_filter_entries, 0);
273633fad432SHemant Agrawal 	if (eth_dev->data->mac_addrs == NULL) {
2737a10a988aSShreyansh Jain 		DPAA2_PMD_ERR(
2738d4984046SHemant Agrawal 		   "Failed to allocate %d bytes needed to store MAC addresses",
273935b2d13fSOlivier Matz 		   RTE_ETHER_ADDR_LEN * attr.mac_filter_entries);
2740d4984046SHemant Agrawal 		ret = -ENOMEM;
2741d4984046SHemant Agrawal 		goto init_err;
274233fad432SHemant Agrawal 	}
274333fad432SHemant Agrawal 
2744c3e0a706SShreyansh Jain 	ret = populate_mac_addr(dpni_dev, priv, &eth_dev->data->mac_addrs[0]);
274533fad432SHemant Agrawal 	if (ret) {
2746c3e0a706SShreyansh Jain 		DPAA2_PMD_ERR("Unable to fetch MAC Address for device");
2747c3e0a706SShreyansh Jain 		rte_free(eth_dev->data->mac_addrs);
2748c3e0a706SShreyansh Jain 		eth_dev->data->mac_addrs = NULL;
2749d4984046SHemant Agrawal 		goto init_err;
275033fad432SHemant Agrawal 	}
275133fad432SHemant Agrawal 
2752bee61d86SHemant Agrawal 	/* ... tx buffer layout ... */
2753bee61d86SHemant Agrawal 	memset(&layout, 0, sizeof(struct dpni_buffer_layout));
27548d21c563SHemant Agrawal 	if (priv->flags & DPAA2_TX_CONF_ENABLE) {
27559ceacab7SPriyanka Jain 		layout.options = DPNI_BUF_LAYOUT_OPT_FRAME_STATUS |
27569ceacab7SPriyanka Jain 				 DPNI_BUF_LAYOUT_OPT_TIMESTAMP;
27579ceacab7SPriyanka Jain 		layout.pass_timestamp = true;
27589ceacab7SPriyanka Jain 	} else {
2759bee61d86SHemant Agrawal 		layout.options = DPNI_BUF_LAYOUT_OPT_FRAME_STATUS;
27609ceacab7SPriyanka Jain 	}
2761bee61d86SHemant Agrawal 	layout.pass_frame_status = 1;
2762bee61d86SHemant Agrawal 	ret = dpni_set_buffer_layout(dpni_dev, CMD_PRI_LOW, priv->token,
2763bee61d86SHemant Agrawal 				     DPNI_QUEUE_TX, &layout);
2764bee61d86SHemant Agrawal 	if (ret) {
2765a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error (%d) in setting tx buffer layout", ret);
2766d4984046SHemant Agrawal 		goto init_err;
2767bee61d86SHemant Agrawal 	}
2768bee61d86SHemant Agrawal 
2769bee61d86SHemant Agrawal 	/* ... tx-conf and error buffer layout ... */
2770bee61d86SHemant Agrawal 	memset(&layout, 0, sizeof(struct dpni_buffer_layout));
27718d21c563SHemant Agrawal 	if (priv->flags & DPAA2_TX_CONF_ENABLE) {
27728d21c563SHemant Agrawal 		layout.options = DPNI_BUF_LAYOUT_OPT_TIMESTAMP;
27739ceacab7SPriyanka Jain 		layout.pass_timestamp = true;
27749ceacab7SPriyanka Jain 	}
27758d21c563SHemant Agrawal 	layout.options |= DPNI_BUF_LAYOUT_OPT_FRAME_STATUS;
2776bee61d86SHemant Agrawal 	layout.pass_frame_status = 1;
2777bee61d86SHemant Agrawal 	ret = dpni_set_buffer_layout(dpni_dev, CMD_PRI_LOW, priv->token,
2778bee61d86SHemant Agrawal 				     DPNI_QUEUE_TX_CONFIRM, &layout);
2779bee61d86SHemant Agrawal 	if (ret) {
2780a10a988aSShreyansh Jain 		DPAA2_PMD_ERR("Error (%d) in setting tx-conf buffer layout",
2781d4984046SHemant Agrawal 			     ret);
2782d4984046SHemant Agrawal 		goto init_err;
2783bee61d86SHemant Agrawal 	}
2784bee61d86SHemant Agrawal 
27853e5a335dSHemant Agrawal 	eth_dev->dev_ops = &dpaa2_ethdev_ops;
2786c147eae0SHemant Agrawal 
2787a3a997f0SHemant Agrawal 	if (dpaa2_get_devargs(dev->devargs, DRIVER_LOOPBACK_MODE)) {
2788a3a997f0SHemant Agrawal 		eth_dev->rx_pkt_burst = dpaa2_dev_loopback_rx;
2789a3a997f0SHemant Agrawal 		DPAA2_PMD_INFO("Loopback mode");
279020191ab3SNipun Gupta 	} else if (dpaa2_get_devargs(dev->devargs, DRIVER_NO_PREFETCH_MODE)) {
279120191ab3SNipun Gupta 		eth_dev->rx_pkt_burst = dpaa2_dev_rx;
279220191ab3SNipun Gupta 		DPAA2_PMD_INFO("No Prefetch mode");
2793a3a997f0SHemant Agrawal 	} else {
27945c6942fdSHemant Agrawal 		eth_dev->rx_pkt_burst = dpaa2_dev_prefetch_rx;
2795a3a997f0SHemant Agrawal 	}
2796cd9935ceSHemant Agrawal 	eth_dev->tx_pkt_burst = dpaa2_dev_tx;
27971261cd68SHemant Agrawal 
27987be78d02SJosh Soref 	/* Init fields w.r.t. classification */
27995f176728SJun Yang 	memset(&priv->extract.qos_key_extract, 0,
28005f176728SJun Yang 		sizeof(struct dpaa2_key_extract));
280125d0ae62SJun Yang 	priv->extract.qos_extract_param = rte_malloc(NULL,
280225d0ae62SJun Yang 		DPAA2_EXTRACT_PARAM_MAX_SIZE,
280325d0ae62SJun Yang 		RTE_CACHE_LINE_SIZE);
2804fe2b986aSSunil Kumar Kori 	if (!priv->extract.qos_extract_param) {
280556c1817dSJun Yang 		DPAA2_PMD_ERR("Memory alloc failed");
2806fe2b986aSSunil Kumar Kori 		goto init_err;
2807fe2b986aSSunil Kumar Kori 	}
28085f176728SJun Yang 
2809fe2b986aSSunil Kumar Kori 	for (i = 0; i < MAX_TCS; i++) {
28105f176728SJun Yang 		memset(&priv->extract.tc_key_extract[i], 0,
28115f176728SJun Yang 			sizeof(struct dpaa2_key_extract));
281225d0ae62SJun Yang 		priv->extract.tc_extract_param[i] = rte_malloc(NULL,
281325d0ae62SJun Yang 			DPAA2_EXTRACT_PARAM_MAX_SIZE,
281425d0ae62SJun Yang 			RTE_CACHE_LINE_SIZE);
28155f176728SJun Yang 		if (!priv->extract.tc_extract_param[i]) {
281656c1817dSJun Yang 			DPAA2_PMD_ERR("Memory alloc failed");
2817fe2b986aSSunil Kumar Kori 			goto init_err;
2818fe2b986aSSunil Kumar Kori 		}
2819fe2b986aSSunil Kumar Kori 	}
2820fe2b986aSSunil Kumar Kori 
28216f8be0fbSHemant Agrawal 	ret = dpni_set_max_frame_length(dpni_dev, CMD_PRI_LOW, priv->token,
28226f8be0fbSHemant Agrawal 					RTE_ETHER_MAX_LEN - RTE_ETHER_CRC_LEN
28236f8be0fbSHemant Agrawal 					+ VLAN_TAG_SIZE);
28246f8be0fbSHemant Agrawal 	if (ret) {
28256f8be0fbSHemant Agrawal 		DPAA2_PMD_ERR("Unable to set mtu. check config");
28266f8be0fbSHemant Agrawal 		goto init_err;
28276f8be0fbSHemant Agrawal 	}
2828de08b474SApeksha Gupta 	eth_dev->data->mtu = RTE_ETHER_MTU;
28296f8be0fbSHemant Agrawal 
283072ec7a67SSunil Kumar Kori 	/*TODO To enable soft parser support DPAA2 driver needs to integrate
283172ec7a67SSunil Kumar Kori 	 * with external entity to receive byte code for software sequence
283272ec7a67SSunil Kumar Kori 	 * and same will be offload to the H/W using MC interface.
283372ec7a67SSunil Kumar Kori 	 * Currently it is assumed that DPAA2 driver has byte code by some
283472ec7a67SSunil Kumar Kori 	 * mean and same if offloaded to H/W.
283572ec7a67SSunil Kumar Kori 	 */
283672ec7a67SSunil Kumar Kori 	if (getenv("DPAA2_ENABLE_SOFT_PARSER")) {
283772ec7a67SSunil Kumar Kori 		WRIOP_SS_INITIALIZER(priv);
283872ec7a67SSunil Kumar Kori 		ret = dpaa2_eth_load_wriop_soft_parser(priv, DPNI_SS_INGRESS);
283972ec7a67SSunil Kumar Kori 		if (ret < 0) {
2840f665790aSDavid Marchand 			DPAA2_PMD_ERR(" Error(%d) in loading softparser",
284172ec7a67SSunil Kumar Kori 				      ret);
284272ec7a67SSunil Kumar Kori 			return ret;
284372ec7a67SSunil Kumar Kori 		}
284472ec7a67SSunil Kumar Kori 
284572ec7a67SSunil Kumar Kori 		ret = dpaa2_eth_enable_wriop_soft_parser(priv,
284672ec7a67SSunil Kumar Kori 							 DPNI_SS_INGRESS);
284772ec7a67SSunil Kumar Kori 		if (ret < 0) {
2848f665790aSDavid Marchand 			DPAA2_PMD_ERR(" Error(%d) in enabling softparser",
284972ec7a67SSunil Kumar Kori 				      ret);
285072ec7a67SSunil Kumar Kori 			return ret;
285172ec7a67SSunil Kumar Kori 		}
285272ec7a67SSunil Kumar Kori 	}
285399400780SJun Yang 
285499400780SJun Yang 	ret = dpaa2_soft_parser_loaded();
285599400780SJun Yang 	if (ret > 0)
285699400780SJun Yang 		DPAA2_PMD_INFO("soft parser is loaded");
2857a247fcd9SStephen Hemminger 	DPAA2_PMD_INFO("%s: netdev created, connected to %s",
2858f023d059SJun Yang 		eth_dev->data->name, dpaa2_dev->ep_name);
2859f023d059SJun Yang 
2860c147eae0SHemant Agrawal 	return 0;
2861d4984046SHemant Agrawal init_err:
28623e5a335dSHemant Agrawal 	dpaa2_dev_close(eth_dev);
28633e5a335dSHemant Agrawal 
28645964d36aSSachin Saxena 	return ret;
2865c147eae0SHemant Agrawal }
2866c147eae0SHemant Agrawal 
286772cd5a48SJun Yang int
286872cd5a48SJun Yang rte_pmd_dpaa2_dev_is_dpaa2(uint32_t eth_id)
2869028d1dfdSJun Yang {
287072cd5a48SJun Yang 	struct rte_eth_dev *dev;
287172cd5a48SJun Yang 
287272cd5a48SJun Yang 	if (eth_id >= RTE_MAX_ETHPORTS)
287372cd5a48SJun Yang 		return false;
287472cd5a48SJun Yang 
287572cd5a48SJun Yang 	dev = &rte_eth_devices[eth_id];
287672cd5a48SJun Yang 	if (!dev->device)
287772cd5a48SJun Yang 		return false;
287872cd5a48SJun Yang 
2879028d1dfdSJun Yang 	return dev->device->driver == &rte_dpaa2_pmd.driver;
2880028d1dfdSJun Yang }
2881028d1dfdSJun Yang 
2882*a0f8ddc4SJun Yang const char *
2883*a0f8ddc4SJun Yang rte_pmd_dpaa2_ep_name(uint32_t eth_id)
2884*a0f8ddc4SJun Yang {
2885*a0f8ddc4SJun Yang 	struct rte_eth_dev *dev;
2886*a0f8ddc4SJun Yang 	struct dpaa2_dev_priv *priv;
2887*a0f8ddc4SJun Yang 
2888*a0f8ddc4SJun Yang 	if (eth_id >= RTE_MAX_ETHPORTS)
2889*a0f8ddc4SJun Yang 		return NULL;
2890*a0f8ddc4SJun Yang 
2891*a0f8ddc4SJun Yang 	if (!rte_pmd_dpaa2_dev_is_dpaa2(eth_id))
2892*a0f8ddc4SJun Yang 		return NULL;
2893*a0f8ddc4SJun Yang 
2894*a0f8ddc4SJun Yang 	dev = &rte_eth_devices[eth_id];
2895*a0f8ddc4SJun Yang 	if (!dev->data)
2896*a0f8ddc4SJun Yang 		return NULL;
2897*a0f8ddc4SJun Yang 
2898*a0f8ddc4SJun Yang 	if (!dev->data->dev_private)
2899*a0f8ddc4SJun Yang 		return NULL;
2900*a0f8ddc4SJun Yang 
2901*a0f8ddc4SJun Yang 	priv = dev->data->dev_private;
2902*a0f8ddc4SJun Yang 
2903*a0f8ddc4SJun Yang 	return priv->ep_name;
2904*a0f8ddc4SJun Yang }
2905*a0f8ddc4SJun Yang 
29062013e308SVanshika Shukla #if defined(RTE_LIBRTE_IEEE1588)
29072013e308SVanshika Shukla int
29082013e308SVanshika Shukla rte_pmd_dpaa2_get_one_step_ts(uint16_t port_id, bool mc_query)
29092013e308SVanshika Shukla {
29102013e308SVanshika Shukla 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
29112013e308SVanshika Shukla 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
29122013e308SVanshika Shukla 	struct fsl_mc_io *dpni = priv->eth_dev->process_private;
29132013e308SVanshika Shukla 	struct dpni_single_step_cfg ptp_cfg;
29142013e308SVanshika Shukla 	int err;
29152013e308SVanshika Shukla 
29162013e308SVanshika Shukla 	if (!mc_query)
29172013e308SVanshika Shukla 		return priv->ptp_correction_offset;
29182013e308SVanshika Shukla 
29192013e308SVanshika Shukla 	err = dpni_get_single_step_cfg(dpni, CMD_PRI_LOW, priv->token, &ptp_cfg);
29202013e308SVanshika Shukla 	if (err) {
29212013e308SVanshika Shukla 		DPAA2_PMD_ERR("Failed to retrieve onestep configuration");
29222013e308SVanshika Shukla 		return err;
29232013e308SVanshika Shukla 	}
29242013e308SVanshika Shukla 
29252013e308SVanshika Shukla 	if (!ptp_cfg.ptp_onestep_reg_base) {
29262013e308SVanshika Shukla 		DPAA2_PMD_ERR("1588 onestep reg not available");
29272013e308SVanshika Shukla 		return -1;
29282013e308SVanshika Shukla 	}
29292013e308SVanshika Shukla 
29302013e308SVanshika Shukla 	priv->ptp_correction_offset = ptp_cfg.offset;
29312013e308SVanshika Shukla 
29322013e308SVanshika Shukla 	return priv->ptp_correction_offset;
29332013e308SVanshika Shukla }
29342013e308SVanshika Shukla 
29352013e308SVanshika Shukla int
29362013e308SVanshika Shukla rte_pmd_dpaa2_set_one_step_ts(uint16_t port_id, uint16_t offset, uint8_t ch_update)
29372013e308SVanshika Shukla {
29382013e308SVanshika Shukla 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
29392013e308SVanshika Shukla 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
29402013e308SVanshika Shukla 	struct fsl_mc_io *dpni = dev->process_private;
29412013e308SVanshika Shukla 	struct dpni_single_step_cfg cfg;
29422013e308SVanshika Shukla 	int err;
29432013e308SVanshika Shukla 
29442013e308SVanshika Shukla 	cfg.en = 1;
29452013e308SVanshika Shukla 	cfg.ch_update = ch_update;
29462013e308SVanshika Shukla 	cfg.offset = offset;
29472013e308SVanshika Shukla 	cfg.peer_delay = 0;
29482013e308SVanshika Shukla 
29492013e308SVanshika Shukla 	err = dpni_set_single_step_cfg(dpni, CMD_PRI_LOW, priv->token, &cfg);
29502013e308SVanshika Shukla 	if (err)
29512013e308SVanshika Shukla 		return err;
29522013e308SVanshika Shukla 
29532013e308SVanshika Shukla 	priv->ptp_correction_offset = offset;
29542013e308SVanshika Shukla 
29552013e308SVanshika Shukla 	return 0;
29562013e308SVanshika Shukla }
29572013e308SVanshika Shukla #endif
29582013e308SVanshika Shukla 
2959748b9980SJun Yang static int dpaa2_tx_sg_pool_init(void)
2960748b9980SJun Yang {
2961748b9980SJun Yang 	char name[RTE_MEMZONE_NAMESIZE];
2962748b9980SJun Yang 
2963748b9980SJun Yang 	if (dpaa2_tx_sg_pool)
2964748b9980SJun Yang 		return 0;
2965748b9980SJun Yang 
2966748b9980SJun Yang 	sprintf(name, "dpaa2_mbuf_tx_sg_pool");
2967748b9980SJun Yang 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
2968748b9980SJun Yang 		dpaa2_tx_sg_pool = rte_pktmbuf_pool_create(name,
2969748b9980SJun Yang 			DPAA2_POOL_SIZE,
2970748b9980SJun Yang 			DPAA2_POOL_CACHE_SIZE, 0,
2971748b9980SJun Yang 			DPAA2_MAX_SGS * sizeof(struct qbman_sge),
2972748b9980SJun Yang 			rte_socket_id());
2973748b9980SJun Yang 		if (!dpaa2_tx_sg_pool) {
2974748b9980SJun Yang 			DPAA2_PMD_ERR("SG pool creation failed");
2975748b9980SJun Yang 			return -ENOMEM;
2976748b9980SJun Yang 		}
2977748b9980SJun Yang 	} else {
2978748b9980SJun Yang 		dpaa2_tx_sg_pool = rte_mempool_lookup(name);
2979748b9980SJun Yang 		if (!dpaa2_tx_sg_pool) {
2980748b9980SJun Yang 			DPAA2_PMD_ERR("SG pool lookup failed");
2981748b9980SJun Yang 			return -ENOMEM;
2982748b9980SJun Yang 		}
2983748b9980SJun Yang 	}
2984748b9980SJun Yang 
2985748b9980SJun Yang 	return 0;
2986748b9980SJun Yang }
2987748b9980SJun Yang 
2988c147eae0SHemant Agrawal static int
298955fd2703SHemant Agrawal rte_dpaa2_probe(struct rte_dpaa2_driver *dpaa2_drv,
2990c147eae0SHemant Agrawal 		struct rte_dpaa2_device *dpaa2_dev)
2991c147eae0SHemant Agrawal {
2992c147eae0SHemant Agrawal 	struct rte_eth_dev *eth_dev;
299381c42c84SShreyansh Jain 	struct dpaa2_dev_priv *dev_priv;
2994c147eae0SHemant Agrawal 	int diag;
2995c147eae0SHemant Agrawal 
2996f4435e38SHemant Agrawal 	if ((DPAA2_MBUF_HW_ANNOTATION + DPAA2_FD_PTA_SIZE) >
2997f4435e38SHemant Agrawal 		RTE_PKTMBUF_HEADROOM) {
299825d0ae62SJun Yang 		DPAA2_PMD_ERR("RTE_PKTMBUF_HEADROOM(%d) < DPAA2 Annotation(%d)",
2999f4435e38SHemant Agrawal 			RTE_PKTMBUF_HEADROOM,
3000f4435e38SHemant Agrawal 			DPAA2_MBUF_HW_ANNOTATION + DPAA2_FD_PTA_SIZE);
3001f4435e38SHemant Agrawal 
300225d0ae62SJun Yang 		return -EINVAL;
3003f4435e38SHemant Agrawal 	}
3004f4435e38SHemant Agrawal 
3005c147eae0SHemant Agrawal 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
3006e729ec76SHemant Agrawal 		eth_dev = rte_eth_dev_allocate(dpaa2_dev->device.name);
3007e729ec76SHemant Agrawal 		if (!eth_dev)
3008e729ec76SHemant Agrawal 			return -ENODEV;
300981c42c84SShreyansh Jain 		dev_priv = rte_zmalloc("ethdev private structure",
3010c147eae0SHemant Agrawal 				       sizeof(struct dpaa2_dev_priv),
3011c147eae0SHemant Agrawal 				       RTE_CACHE_LINE_SIZE);
301281c42c84SShreyansh Jain 		if (dev_priv == NULL) {
3013a10a988aSShreyansh Jain 			DPAA2_PMD_CRIT(
3014a10a988aSShreyansh Jain 				"Unable to allocate memory for private data");
3015c147eae0SHemant Agrawal 			rte_eth_dev_release_port(eth_dev);
3016c147eae0SHemant Agrawal 			return -ENOMEM;
3017c147eae0SHemant Agrawal 		}
301881c42c84SShreyansh Jain 		eth_dev->data->dev_private = (void *)dev_priv;
301981c42c84SShreyansh Jain 		/* Store a pointer to eth_dev in dev_private */
302081c42c84SShreyansh Jain 		dev_priv->eth_dev = eth_dev;
3021e729ec76SHemant Agrawal 	} else {
3022e729ec76SHemant Agrawal 		eth_dev = rte_eth_dev_attach_secondary(dpaa2_dev->device.name);
302381c42c84SShreyansh Jain 		if (!eth_dev) {
302481c42c84SShreyansh Jain 			DPAA2_PMD_DEBUG("returning enodev");
3025e729ec76SHemant Agrawal 			return -ENODEV;
3026c147eae0SHemant Agrawal 		}
302781c42c84SShreyansh Jain 	}
3028e729ec76SHemant Agrawal 
3029c147eae0SHemant Agrawal 	eth_dev->device = &dpaa2_dev->device;
303055fd2703SHemant Agrawal 
3031c147eae0SHemant Agrawal 	dpaa2_dev->eth_dev = eth_dev;
3032c147eae0SHemant Agrawal 	eth_dev->data->rx_mbuf_alloc_failed = 0;
3033c147eae0SHemant Agrawal 
303492b7e33eSHemant Agrawal 	if (dpaa2_drv->drv_flags & RTE_DPAA2_DRV_INTR_LSC)
303592b7e33eSHemant Agrawal 		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
303692b7e33eSHemant Agrawal 
3037f30e69b4SFerruh Yigit 	eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
3038f30e69b4SFerruh Yigit 
3039c147eae0SHemant Agrawal 	/* Invoke PMD device initialization function */
3040c147eae0SHemant Agrawal 	diag = dpaa2_dev_init(eth_dev);
3041748b9980SJun Yang 	if (!diag) {
3042748b9980SJun Yang 		diag = dpaa2_tx_sg_pool_init();
3043748b9980SJun Yang 		if (diag)
3044748b9980SJun Yang 			return diag;
3045fbe90cddSThomas Monjalon 		rte_eth_dev_probing_finish(eth_dev);
304675e2a1d4SGagandeep Singh 		dpaa2_valid_dev++;
3047c147eae0SHemant Agrawal 		return 0;
3048fbe90cddSThomas Monjalon 	}
3049c147eae0SHemant Agrawal 
3050c147eae0SHemant Agrawal 	rte_eth_dev_release_port(eth_dev);
3051c147eae0SHemant Agrawal 	return diag;
3052c147eae0SHemant Agrawal }
3053c147eae0SHemant Agrawal 
3054c147eae0SHemant Agrawal static int
3055c147eae0SHemant Agrawal rte_dpaa2_remove(struct rte_dpaa2_device *dpaa2_dev)
3056c147eae0SHemant Agrawal {
3057c147eae0SHemant Agrawal 	struct rte_eth_dev *eth_dev;
30585964d36aSSachin Saxena 	int ret;
3059c147eae0SHemant Agrawal 
3060c147eae0SHemant Agrawal 	eth_dev = dpaa2_dev->eth_dev;
30615964d36aSSachin Saxena 	dpaa2_dev_close(eth_dev);
306275e2a1d4SGagandeep Singh 	dpaa2_valid_dev--;
306375e2a1d4SGagandeep Singh 	if (!dpaa2_valid_dev)
306475e2a1d4SGagandeep Singh 		rte_mempool_free(dpaa2_tx_sg_pool);
30655964d36aSSachin Saxena 	ret = rte_eth_dev_release_port(eth_dev);
3066c147eae0SHemant Agrawal 
30675964d36aSSachin Saxena 	return ret;
3068c147eae0SHemant Agrawal }
3069c147eae0SHemant Agrawal 
3070c147eae0SHemant Agrawal static struct rte_dpaa2_driver rte_dpaa2_pmd = {
307192b7e33eSHemant Agrawal 	.drv_flags = RTE_DPAA2_DRV_INTR_LSC | RTE_DPAA2_DRV_IOVA_AS_VA,
3072bad555dfSShreyansh Jain 	.drv_type = DPAA2_ETH,
3073c147eae0SHemant Agrawal 	.probe = rte_dpaa2_probe,
3074c147eae0SHemant Agrawal 	.remove = rte_dpaa2_remove,
3075c147eae0SHemant Agrawal };
3076c147eae0SHemant Agrawal 
30774ed8a733SVanshika Shukla RTE_PMD_REGISTER_DPAA2(NET_DPAA2_PMD_DRIVER_NAME, rte_dpaa2_pmd);
30784ed8a733SVanshika Shukla RTE_PMD_REGISTER_PARAM_STRING(NET_DPAA2_PMD_DRIVER_NAME,
307920191ab3SNipun Gupta 		DRIVER_LOOPBACK_MODE "=<int> "
30808d21c563SHemant Agrawal 		DRIVER_NO_PREFETCH_MODE "=<int>"
30814690a611SNipun Gupta 		DRIVER_TX_CONF "=<int>"
30824690a611SNipun Gupta 		DRIVER_ERROR_QUEUE "=<int>");
3083eeded204SDavid Marchand RTE_LOG_REGISTER_DEFAULT(dpaa2_logtype_pmd, NOTICE);
3084