xref: /dpdk/drivers/net/nfb/nfb_rx.c (revision 76da9834ebb6e43e005bd5895ff4568d0e7be78f)
16435f9a0SRastislav Cernay /* SPDX-License-Identifier: BSD-3-Clause
26435f9a0SRastislav Cernay  * Copyright(c) 2019 Cesnet
36435f9a0SRastislav Cernay  * Copyright(c) 2019 Netcope Technologies, a.s. <info@netcope.com>
46435f9a0SRastislav Cernay  * All rights reserved.
56435f9a0SRastislav Cernay  */
66435f9a0SRastislav Cernay 
79c7fd48fSRastislav Cernay #include <rte_kvargs.h>
89c7fd48fSRastislav Cernay 
96435f9a0SRastislav Cernay #include "nfb.h"
10ad616a80SStephen Hemminger #include "nfb_rx.h"
116435f9a0SRastislav Cernay 
12f6800febSThomas Monjalon uint64_t nfb_timestamp_rx_dynflag;
13f6800febSThomas Monjalon int nfb_timestamp_dynfield_offset = -1;
14f6800febSThomas Monjalon 
156435f9a0SRastislav Cernay int
166435f9a0SRastislav Cernay nfb_eth_rx_queue_start(struct rte_eth_dev *dev, uint16_t rxq_id)
176435f9a0SRastislav Cernay {
186435f9a0SRastislav Cernay 	struct ndp_rx_queue *rxq = dev->data->rx_queues[rxq_id];
196435f9a0SRastislav Cernay 	int ret;
206435f9a0SRastislav Cernay 
216435f9a0SRastislav Cernay 	if (rxq->queue == NULL) {
22ad616a80SStephen Hemminger 		NFB_LOG(ERR, "RX NDP queue is NULL");
236435f9a0SRastislav Cernay 		return -EINVAL;
246435f9a0SRastislav Cernay 	}
256435f9a0SRastislav Cernay 
266435f9a0SRastislav Cernay 	ret = ndp_queue_start(rxq->queue);
276435f9a0SRastislav Cernay 	if (ret != 0)
286435f9a0SRastislav Cernay 		goto err;
296435f9a0SRastislav Cernay 	dev->data->rx_queue_state[rxq_id] = RTE_ETH_QUEUE_STATE_STARTED;
306435f9a0SRastislav Cernay 	return 0;
316435f9a0SRastislav Cernay 
326435f9a0SRastislav Cernay err:
336435f9a0SRastislav Cernay 	return -EINVAL;
346435f9a0SRastislav Cernay }
356435f9a0SRastislav Cernay 
366435f9a0SRastislav Cernay int
376435f9a0SRastislav Cernay nfb_eth_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rxq_id)
386435f9a0SRastislav Cernay {
396435f9a0SRastislav Cernay 	struct ndp_rx_queue *rxq = dev->data->rx_queues[rxq_id];
406435f9a0SRastislav Cernay 	int ret;
416435f9a0SRastislav Cernay 
426435f9a0SRastislav Cernay 	if (rxq->queue == NULL) {
43ad616a80SStephen Hemminger 		NFB_LOG(ERR, "RX NDP queue is NULL");
446435f9a0SRastislav Cernay 		return -EINVAL;
456435f9a0SRastislav Cernay 	}
466435f9a0SRastislav Cernay 
476435f9a0SRastislav Cernay 	ret = ndp_queue_stop(rxq->queue);
486435f9a0SRastislav Cernay 	if (ret != 0)
496435f9a0SRastislav Cernay 		return -EINVAL;
506435f9a0SRastislav Cernay 
516435f9a0SRastislav Cernay 	dev->data->rx_queue_state[rxq_id] = RTE_ETH_QUEUE_STATE_STOPPED;
526435f9a0SRastislav Cernay 	return 0;
536435f9a0SRastislav Cernay }
546435f9a0SRastislav Cernay 
556435f9a0SRastislav Cernay int
566435f9a0SRastislav Cernay nfb_eth_rx_queue_setup(struct rte_eth_dev *dev,
576435f9a0SRastislav Cernay 		uint16_t rx_queue_id,
586435f9a0SRastislav Cernay 		uint16_t nb_rx_desc __rte_unused,
596435f9a0SRastislav Cernay 		unsigned int socket_id,
606435f9a0SRastislav Cernay 		const struct rte_eth_rxconf *rx_conf __rte_unused,
616435f9a0SRastislav Cernay 		struct rte_mempool *mb_pool)
626435f9a0SRastislav Cernay {
636435f9a0SRastislav Cernay 	struct pmd_internals *internals = dev->data->dev_private;
646435f9a0SRastislav Cernay 
656435f9a0SRastislav Cernay 	struct ndp_rx_queue *rxq;
666435f9a0SRastislav Cernay 	int ret;
676435f9a0SRastislav Cernay 
686435f9a0SRastislav Cernay 	rxq = rte_zmalloc_socket("ndp rx queue",
696435f9a0SRastislav Cernay 			sizeof(struct ndp_rx_queue),
706435f9a0SRastislav Cernay 			RTE_CACHE_LINE_SIZE, socket_id);
716435f9a0SRastislav Cernay 
726435f9a0SRastislav Cernay 	if (rxq == NULL) {
73ad616a80SStephen Hemminger 		NFB_LOG(ERR, "rte_zmalloc_socket() failed for rx queue id %" PRIu16,
74ad616a80SStephen Hemminger 			rx_queue_id);
756435f9a0SRastislav Cernay 		return -ENOMEM;
766435f9a0SRastislav Cernay 	}
776435f9a0SRastislav Cernay 
789c7fd48fSRastislav Cernay 	rxq->flags = 0;
799c7fd48fSRastislav Cernay 
806435f9a0SRastislav Cernay 	ret = nfb_eth_rx_queue_init(internals->nfb,
816435f9a0SRastislav Cernay 		rx_queue_id,
826435f9a0SRastislav Cernay 		dev->data->port_id,
836435f9a0SRastislav Cernay 		mb_pool,
846435f9a0SRastislav Cernay 		rxq);
856435f9a0SRastislav Cernay 
866435f9a0SRastislav Cernay 	if (ret == 0)
876435f9a0SRastislav Cernay 		dev->data->rx_queues[rx_queue_id] = rxq;
886435f9a0SRastislav Cernay 	else
896435f9a0SRastislav Cernay 		rte_free(rxq);
906435f9a0SRastislav Cernay 
916435f9a0SRastislav Cernay 	return ret;
926435f9a0SRastislav Cernay }
936435f9a0SRastislav Cernay 
946435f9a0SRastislav Cernay int
956435f9a0SRastislav Cernay nfb_eth_rx_queue_init(struct nfb_device *nfb,
966435f9a0SRastislav Cernay 		uint16_t rx_queue_id,
976435f9a0SRastislav Cernay 		uint16_t port_id,
986435f9a0SRastislav Cernay 		struct rte_mempool *mb_pool,
996435f9a0SRastislav Cernay 		struct ndp_rx_queue *rxq)
1006435f9a0SRastislav Cernay {
1016435f9a0SRastislav Cernay 	const struct rte_pktmbuf_pool_private *mbp_priv =
1026435f9a0SRastislav Cernay 		rte_mempool_get_priv(mb_pool);
1036435f9a0SRastislav Cernay 
1046435f9a0SRastislav Cernay 	if (nfb == NULL)
1056435f9a0SRastislav Cernay 		return -EINVAL;
1066435f9a0SRastislav Cernay 
1076435f9a0SRastislav Cernay 	rxq->queue = ndp_open_rx_queue(nfb, rx_queue_id);
1086435f9a0SRastislav Cernay 	if (rxq->queue == NULL)
1096435f9a0SRastislav Cernay 		return -EINVAL;
1106435f9a0SRastislav Cernay 
1116435f9a0SRastislav Cernay 	rxq->nfb = nfb;
1126435f9a0SRastislav Cernay 	rxq->rx_queue_id = rx_queue_id;
1136435f9a0SRastislav Cernay 	rxq->in_port = port_id;
1146435f9a0SRastislav Cernay 	rxq->mb_pool = mb_pool;
1156435f9a0SRastislav Cernay 	rxq->buf_size = (uint16_t)(mbp_priv->mbuf_data_room_size -
1166435f9a0SRastislav Cernay 		RTE_PKTMBUF_HEADROOM);
1176435f9a0SRastislav Cernay 
1186435f9a0SRastislav Cernay 	rxq->rx_pkts = 0;
1196435f9a0SRastislav Cernay 	rxq->rx_bytes = 0;
1206435f9a0SRastislav Cernay 	rxq->err_pkts = 0;
1216435f9a0SRastislav Cernay 
1226435f9a0SRastislav Cernay 	return 0;
1236435f9a0SRastislav Cernay }
1246435f9a0SRastislav Cernay 
1256435f9a0SRastislav Cernay void
1267483341aSXueming Li nfb_eth_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid)
1276435f9a0SRastislav Cernay {
1287483341aSXueming Li 	struct ndp_rx_queue *rxq = dev->data->rx_queues[qid];
1297483341aSXueming Li 
1306435f9a0SRastislav Cernay 	if (rxq->queue != NULL) {
1316435f9a0SRastislav Cernay 		ndp_close_rx_queue(rxq->queue);
1326435f9a0SRastislav Cernay 		rxq->queue = NULL;
133*76da9834SThomas Monjalon 		rte_free(rxq);
1346435f9a0SRastislav Cernay 	}
1356435f9a0SRastislav Cernay }
136