Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(c) 2022 Intel Corporation 3 : : */ 4 : : 5 : : #ifndef _IDPF_RXTX_VEC_COMMON_H_ 6 : : #define _IDPF_RXTX_VEC_COMMON_H_ 7 : : #include <stdint.h> 8 : : #include <ethdev_driver.h> 9 : : #include <rte_malloc.h> 10 : : 11 : : #include "idpf_ethdev.h" 12 : : #include "idpf_rxtx.h" 13 : : 14 : : #ifndef __INTEL_COMPILER 15 : : #pragma GCC diagnostic ignored "-Wcast-qual" 16 : : #endif 17 : : 18 : : #define IDPF_SCALAR_PATH 0 19 : : #define IDPF_VECTOR_PATH 1 20 : : #define IDPF_RX_NO_VECTOR_FLAGS ( \ 21 : : RTE_ETH_RX_OFFLOAD_IPV4_CKSUM | \ 22 : : RTE_ETH_RX_OFFLOAD_UDP_CKSUM | \ 23 : : RTE_ETH_RX_OFFLOAD_TCP_CKSUM | \ 24 : : RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM | \ 25 : : RTE_ETH_RX_OFFLOAD_TIMESTAMP) 26 : : #define IDPF_TX_NO_VECTOR_FLAGS ( \ 27 : : RTE_ETH_TX_OFFLOAD_TCP_TSO | \ 28 : : RTE_ETH_TX_OFFLOAD_MULTI_SEGS | \ 29 : : RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | \ 30 : : RTE_ETH_TX_OFFLOAD_SCTP_CKSUM | \ 31 : : RTE_ETH_TX_OFFLOAD_UDP_CKSUM | \ 32 : : RTE_ETH_TX_OFFLOAD_TCP_CKSUM) 33 : : 34 : : static inline int 35 : 0 : idpf_rx_vec_queue_default(struct idpf_rx_queue *rxq) 36 : : { 37 [ # # ]: 0 : if (rxq == NULL) 38 : : return IDPF_SCALAR_PATH; 39 : : 40 [ # # ]: 0 : if (rte_is_power_of_2(rxq->nb_rx_desc) == 0) 41 : : return IDPF_SCALAR_PATH; 42 : : 43 [ # # ]: 0 : if (rxq->rx_free_thresh < IDPF_VPMD_RX_MAX_BURST) 44 : : return IDPF_SCALAR_PATH; 45 : : 46 [ # # ]: 0 : if ((rxq->nb_rx_desc % rxq->rx_free_thresh) != 0) 47 : : return IDPF_SCALAR_PATH; 48 : : 49 [ # # ]: 0 : if ((rxq->offloads & IDPF_RX_NO_VECTOR_FLAGS) != 0) 50 : 0 : return IDPF_SCALAR_PATH; 51 : : 52 : : return IDPF_VECTOR_PATH; 53 : : } 54 : : 55 : : static inline int 56 : : idpf_tx_vec_queue_default(struct idpf_tx_queue *txq) 57 : : { 58 : 0 : if (txq == NULL) 59 : : return IDPF_SCALAR_PATH; 60 : : 61 [ # # # # ]: 0 : if (txq->rs_thresh < IDPF_VPMD_TX_MAX_BURST || 62 : : (txq->rs_thresh & 3) != 0) 63 : : return IDPF_SCALAR_PATH; 64 : : 65 [ # # ]: 0 : if ((txq->offloads & IDPF_TX_NO_VECTOR_FLAGS) != 0) 66 : : return IDPF_SCALAR_PATH; 67 : : 68 : : return IDPF_VECTOR_PATH; 69 : : } 70 : : 71 : : static inline int 72 : : idpf_rx_splitq_vec_default(struct idpf_rx_queue *rxq) 73 : : { 74 [ # # ]: 0 : if (rxq->bufq2->rx_buf_len < rxq->max_pkt_len) 75 : 0 : return IDPF_SCALAR_PATH; 76 : : 77 : : return IDPF_VECTOR_PATH; 78 : : } 79 : : 80 : : static inline int 81 : 0 : idpf_rx_vec_dev_check_default(struct rte_eth_dev *dev) 82 : : { 83 : 0 : struct idpf_vport *vport = dev->data->dev_private; 84 : : struct idpf_rx_queue *rxq; 85 : : int i, default_ret, splitq_ret, ret = IDPF_SCALAR_PATH; 86 : : 87 [ # # ]: 0 : if (dev->data->scattered_rx) 88 : : return IDPF_SCALAR_PATH; 89 : : 90 [ # # ]: 0 : for (i = 0; i < dev->data->nb_rx_queues; i++) { 91 : 0 : rxq = dev->data->rx_queues[i]; 92 : 0 : default_ret = idpf_rx_vec_queue_default(rxq); 93 [ # # ]: 0 : if (vport->rxq_model == VIRTCHNL2_QUEUE_MODEL_SPLIT) { 94 : : splitq_ret = idpf_rx_splitq_vec_default(rxq); 95 : 0 : ret = splitq_ret && default_ret; 96 : : } else { 97 : : ret = default_ret; 98 : : } 99 [ # # ]: 0 : if (ret == IDPF_SCALAR_PATH) 100 : : return IDPF_SCALAR_PATH; 101 : : } 102 : : 103 : : return IDPF_VECTOR_PATH; 104 : : } 105 : : 106 : : static inline int 107 : 0 : idpf_tx_vec_dev_check_default(struct rte_eth_dev *dev) 108 : : { 109 : : int i; 110 : : struct idpf_tx_queue *txq; 111 : : int ret = 0; 112 : : 113 [ # # ]: 0 : for (i = 0; i < dev->data->nb_tx_queues; i++) { 114 [ # # ]: 0 : txq = dev->data->tx_queues[i]; 115 : : ret = idpf_tx_vec_queue_default(txq); 116 : : if (ret == IDPF_SCALAR_PATH) 117 : : return IDPF_SCALAR_PATH; 118 : : } 119 : : 120 : : return IDPF_VECTOR_PATH; 121 : : } 122 : : 123 : : #endif /*_IDPF_RXTX_VEC_COMMON_H_*/