1 /* SPDX-License-Identifier: BSD-3-Clause 2 * 3 * Copyright (c) 2016-2018 Solarflare Communications Inc. 4 * All rights reserved. 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 <rte_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 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 }; 119 120 struct sfc_rxq_info *sfc_rxq_info_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq); 121 122 int sfc_rx_configure(struct sfc_adapter *sa); 123 void sfc_rx_close(struct sfc_adapter *sa); 124 int sfc_rx_start(struct sfc_adapter *sa); 125 void sfc_rx_stop(struct sfc_adapter *sa); 126 127 int sfc_rx_qinit(struct sfc_adapter *sa, unsigned int rx_queue_id, 128 uint16_t nb_rx_desc, unsigned int socket_id, 129 const struct rte_eth_rxconf *rx_conf, 130 struct rte_mempool *mb_pool); 131 void sfc_rx_qfini(struct sfc_adapter *sa, unsigned int sw_index); 132 int sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index); 133 void sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index); 134 135 uint64_t sfc_rx_get_dev_offload_caps(struct sfc_adapter *sa); 136 uint64_t sfc_rx_get_queue_offload_caps(struct sfc_adapter *sa); 137 138 void sfc_rx_qflush_done(struct sfc_rxq_info *rxq_info); 139 void sfc_rx_qflush_failed(struct sfc_rxq_info *rxq_info); 140 141 int sfc_rx_hash_init(struct sfc_adapter *sa); 142 void sfc_rx_hash_fini(struct sfc_adapter *sa); 143 int sfc_rx_hf_rte_to_efx(struct sfc_adapter *sa, uint64_t rte, 144 efx_rx_hash_type_t *efx); 145 uint64_t sfc_rx_hf_efx_to_rte(struct sfc_rss *rss, efx_rx_hash_type_t efx); 146 boolean_t sfc_rx_check_scatter(size_t pdu, size_t rx_buf_size, 147 uint32_t rx_prefix_size, 148 boolean_t rx_scatter_enabled, 149 const char **error); 150 151 #ifdef __cplusplus 152 } 153 #endif 154 #endif /* _SFC_RX_H */ 155