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