Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * 3 : : * Copyright(c) 2019-2021 Xilinx, Inc. 4 : : * Copyright(c) 2016-2019 Solarflare Communications Inc. 5 : : * 6 : : * This software was jointly developed between OKTET Labs (under contract 7 : : * for Solarflare) and Solarflare Communications, Inc. 8 : : */ 9 : : 10 : : #ifndef _SFC_RX_H 11 : : #define _SFC_RX_H 12 : : 13 : : #include <rte_mbuf.h> 14 : : #include <rte_mempool.h> 15 : : #include <ethdev_driver.h> 16 : : 17 : : #include "efx.h" 18 : : 19 : : #include "sfc_dp_rx.h" 20 : : 21 : : #ifdef __cplusplus 22 : : extern "C" { 23 : : #endif 24 : : 25 : : struct sfc_adapter; 26 : : struct sfc_evq; 27 : : 28 : : /** 29 : : * Software Rx descriptor information associated with hardware Rx 30 : : * descriptor. 31 : : */ 32 : : struct sfc_efx_rx_sw_desc { 33 : : struct rte_mbuf *mbuf; 34 : : unsigned int flags; 35 : : unsigned int size; 36 : : }; 37 : : 38 : : /** Receive queue state bits */ 39 : : enum sfc_rxq_state_bit { 40 : : SFC_RXQ_INITIALIZED_BIT = 0, 41 : : #define SFC_RXQ_INITIALIZED (1 << SFC_RXQ_INITIALIZED_BIT) 42 : : SFC_RXQ_STARTED_BIT, 43 : : #define SFC_RXQ_STARTED (1 << SFC_RXQ_STARTED_BIT) 44 : : SFC_RXQ_FLUSHING_BIT, 45 : : #define SFC_RXQ_FLUSHING (1 << SFC_RXQ_FLUSHING_BIT) 46 : : SFC_RXQ_FLUSHED_BIT, 47 : : #define SFC_RXQ_FLUSHED (1 << SFC_RXQ_FLUSHED_BIT) 48 : : SFC_RXQ_FLUSH_FAILED_BIT, 49 : : #define SFC_RXQ_FLUSH_FAILED (1 << SFC_RXQ_FLUSH_FAILED_BIT) 50 : : }; 51 : : 52 : : /** 53 : : * Receive queue control primary process-only information. 54 : : */ 55 : : struct sfc_rxq { 56 : : struct sfc_evq *evq; 57 : : efx_rxq_t *common; 58 : : efsys_mem_t mem; 59 : : unsigned int hw_index; 60 : : uint16_t buf_size; 61 : : }; 62 : : 63 : : struct sfc_rxq *sfc_rxq_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq); 64 : : 65 : : /** 66 : : * Receive queue information used on libefx-based data path. 67 : : * Allocated on the socket specified on the queue setup. 68 : : */ 69 : : struct sfc_efx_rxq { 70 : : /* Used on data path */ 71 : : struct sfc_evq *evq; 72 : : unsigned int flags; 73 : : #define SFC_EFX_RXQ_FLAG_STARTED 0x1 74 : : #define SFC_EFX_RXQ_FLAG_RUNNING 0x2 75 : : #define SFC_EFX_RXQ_FLAG_RSS_HASH 0x4 76 : : #define SFC_EFX_RXQ_FLAG_INTR_EN 0x8 77 : : unsigned int ptr_mask; 78 : : unsigned int pending; 79 : : unsigned int completed; 80 : : uint16_t batch_max; 81 : : uint16_t prefix_size; 82 : : struct sfc_efx_rx_sw_desc *sw_desc; 83 : : 84 : : /* Used on refill */ 85 : : unsigned int added; 86 : : unsigned int pushed; 87 : : unsigned int max_fill_level; 88 : : unsigned int refill_threshold; 89 : : uint16_t buf_size; 90 : : struct rte_mempool *refill_mb_pool; 91 : : efx_rxq_t *common; 92 : : 93 : : /* Datapath receive queue anchor */ 94 : : struct sfc_dp_rxq dp; 95 : : }; 96 : : 97 : : static inline struct sfc_efx_rxq * 98 : : sfc_efx_rxq_by_dp_rxq(struct sfc_dp_rxq *dp_rxq) 99 : : { 100 [ # # # # : 0 : return container_of(dp_rxq, struct sfc_efx_rxq, dp); # # # # ] 101 : : } 102 : : 103 : : /** 104 : : * Receive queue information used during setup/release only. 105 : : * Allocated on the same socket as adapter data. 106 : : */ 107 : : struct sfc_rxq_info { 108 : : unsigned int state; 109 : : unsigned int max_entries; 110 : : unsigned int entries; 111 : : efx_rxq_type_t type; 112 : : unsigned int type_flags; 113 : : struct sfc_dp_rxq *dp; 114 : : boolean_t deferred_start; 115 : : boolean_t deferred_started; 116 : : unsigned int refill_threshold; 117 : : struct rte_mempool *refill_mb_pool; 118 : : unsigned int rxq_flags; 119 : : }; 120 : : 121 : : struct sfc_rxq_info *sfc_rxq_info_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq); 122 : : struct sfc_rxq_info *sfc_rxq_info_by_ethdev_qid(struct sfc_adapter_shared *sas, 123 : : sfc_ethdev_qid_t ethdev_qid); 124 : : struct sfc_rxq *sfc_rxq_ctrl_by_ethdev_qid(struct sfc_adapter *sa, 125 : : sfc_ethdev_qid_t ethdev_qid); 126 : : 127 : : int sfc_rx_configure(struct sfc_adapter *sa); 128 : : void sfc_rx_close(struct sfc_adapter *sa); 129 : : int sfc_rx_start(struct sfc_adapter *sa); 130 : : void sfc_rx_stop(struct sfc_adapter *sa); 131 : : 132 : : int sfc_rx_qinit_info(struct sfc_adapter *sa, sfc_sw_index_t sw_index, 133 : : unsigned int extra_efx_type_flags); 134 : : int sfc_rx_qinit(struct sfc_adapter *sa, unsigned int rx_queue_id, 135 : : uint16_t nb_rx_desc, unsigned int socket_id, 136 : : const struct rte_eth_rxconf *rx_conf, 137 : : struct rte_mempool *mb_pool); 138 : : void sfc_rx_qfini(struct sfc_adapter *sa, sfc_sw_index_t sw_index); 139 : : int sfc_rx_qstart(struct sfc_adapter *sa, sfc_sw_index_t sw_index); 140 : : void sfc_rx_qstop(struct sfc_adapter *sa, sfc_sw_index_t sw_index); 141 : : 142 : : uint64_t sfc_rx_get_dev_offload_caps(struct sfc_adapter *sa); 143 : : uint64_t sfc_rx_get_queue_offload_caps(struct sfc_adapter *sa); 144 : : 145 : : void sfc_rx_qflush_done(struct sfc_rxq_info *rxq_info); 146 : : void sfc_rx_qflush_failed(struct sfc_rxq_info *rxq_info); 147 : : 148 : : unsigned int sfc_rx_get_pushed(struct sfc_adapter *sa, 149 : : struct sfc_dp_rxq *dp_rxq); 150 : : 151 : : int sfc_rx_hash_init(struct sfc_adapter *sa); 152 : : void sfc_rx_hash_fini(struct sfc_adapter *sa); 153 : : int sfc_rx_hf_rte_to_efx(struct sfc_adapter *sa, uint64_t rte, 154 : : efx_rx_hash_type_t *efx); 155 : : uint64_t sfc_rx_hf_efx_to_rte(struct sfc_rss *rss, efx_rx_hash_type_t efx); 156 : : boolean_t sfc_rx_check_scatter(size_t pdu, size_t rx_buf_size, 157 : : uint32_t rx_prefix_size, 158 : : boolean_t rx_scatter_enabled, 159 : : uint32_t rx_scatter_max, 160 : : const char **error); 161 : : 162 : : #ifdef __cplusplus 163 : : } 164 : : #endif 165 : : #endif /* _SFC_RX_H */