Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(c) 2025 Huawei Technologies Co., Ltd 3 : : */ 4 : : 5 : : #ifndef _HINIC3_RX_H_ 6 : : #define _HINIC3_RX_H_ 7 : : 8 : : #define RQ_CQE_OFFOLAD_TYPE_PKT_TYPE_SHIFT 0 9 : : #define RQ_CQE_OFFOLAD_TYPE_PKT_UMBCAST_SHIFT 19 10 : : #define RQ_CQE_OFFOLAD_TYPE_VLAN_EN_SHIFT 21 11 : : #define RQ_CQE_OFFOLAD_TYPE_RSS_TYPE_SHIFT 24 12 : : 13 : : #define RQ_CQE_OFFOLAD_TYPE_PKT_TYPE_MASK 0xFFFU 14 : : #define RQ_CQE_OFFOLAD_TYPE_PKT_UMBCAST_MASK 0x3U 15 : : #define RQ_CQE_OFFOLAD_TYPE_VLAN_EN_MASK 0x1U 16 : : #define RQ_CQE_OFFOLAD_TYPE_RSS_TYPE_MASK 0xFFU 17 : : 18 : : #define DPI_EXT_ACTION_FILED (1ULL << 32) 19 : : 20 : : #define RQ_CQE_OFFOLAD_TYPE_GET(val, member) \ 21 : : (((val) >> RQ_CQE_OFFOLAD_TYPE_##member##_SHIFT) & \ 22 : : RQ_CQE_OFFOLAD_TYPE_##member##_MASK) 23 : : 24 : : #define HINIC3_GET_RX_PKT_TYPE(offload_type) \ 25 : : RQ_CQE_OFFOLAD_TYPE_GET(offload_type, PKT_TYPE) 26 : : 27 : : #define HINIC3_GET_RX_PKT_UMBCAST(offload_type) \ 28 : : RQ_CQE_OFFOLAD_TYPE_GET(offload_type, PKT_UMBCAST) 29 : : 30 : : #define HINIC3_GET_RX_VLAN_OFFLOAD_EN(offload_type) \ 31 : : RQ_CQE_OFFOLAD_TYPE_GET(offload_type, VLAN_EN) 32 : : 33 : : #define HINIC3_GET_RSS_TYPES(offload_type) \ 34 : : RQ_CQE_OFFOLAD_TYPE_GET(offload_type, RSS_TYPE) 35 : : 36 : : #define RQ_CQE_SGE_VLAN_SHIFT 0 37 : : #define RQ_CQE_SGE_LEN_SHIFT 16 38 : : 39 : : #define RQ_CQE_SGE_VLAN_MASK 0xFFFFU 40 : : #define RQ_CQE_SGE_LEN_MASK 0xFFFFU 41 : : 42 : : #define RQ_CQE_SGE_GET(val, member) \ 43 : : (((val) >> RQ_CQE_SGE_##member##_SHIFT) & RQ_CQE_SGE_##member##_MASK) 44 : : 45 : : #define HINIC3_GET_RX_VLAN_TAG(vlan_len) RQ_CQE_SGE_GET(vlan_len, VLAN) 46 : : 47 : : #define HINIC3_GET_RX_PKT_LEN(vlan_len) RQ_CQE_SGE_GET(vlan_len, LEN) 48 : : 49 : : #define RQ_CQE_STATUS_CSUM_ERR_SHIFT 0 50 : : #define RQ_CQE_STATUS_NUM_LRO_SHIFT 16 51 : : #define RQ_CQE_STATUS_LRO_PUSH_SHIFT 25 52 : : #define RQ_CQE_STATUS_LRO_ENTER_SHIFT 26 53 : : #define RQ_CQE_STATUS_LRO_INTR_SHIFT 27 54 : : 55 : : #define RQ_CQE_STATUS_BP_EN_SHIFT 30 56 : : #define RQ_CQE_STATUS_RXDONE_SHIFT 31 57 : : #define RQ_CQE_STATUS_DECRY_PKT_SHIFT 29 58 : : #define RQ_CQE_STATUS_FLUSH_SHIFT 28 59 : : 60 : : #define RQ_CQE_STATUS_CSUM_ERR_MASK 0xFFFFU 61 : : #define RQ_CQE_STATUS_NUM_LRO_MASK 0xFFU 62 : : #define RQ_CQE_STATUS_LRO_PUSH_MASK 0X1U 63 : : #define RQ_CQE_STATUS_LRO_ENTER_MASK 0X1U 64 : : #define RQ_CQE_STATUS_LRO_INTR_MASK 0X1U 65 : : #define RQ_CQE_STATUS_BP_EN_MASK 0X1U 66 : : #define RQ_CQE_STATUS_RXDONE_MASK 0x1U 67 : : #define RQ_CQE_STATUS_FLUSH_MASK 0x1U 68 : : #define RQ_CQE_STATUS_DECRY_PKT_MASK 0x1U 69 : : 70 : : #define RQ_CQE_STATUS_GET(val, member) \ 71 : : (((val) >> RQ_CQE_STATUS_##member##_SHIFT) & \ 72 : : RQ_CQE_STATUS_##member##_MASK) 73 : : 74 : : #define HINIC3_GET_RX_CSUM_ERR(status) RQ_CQE_STATUS_GET(status, CSUM_ERR) 75 : : 76 : : #define HINIC3_GET_RX_DONE(status) RQ_CQE_STATUS_GET(status, RXDONE) 77 : : 78 : : #define HINIC3_GET_RX_FLUSH(status) RQ_CQE_STATUS_GET(status, FLUSH) 79 : : 80 : : #define HINIC3_GET_RX_BP_EN(status) RQ_CQE_STATUS_GET(status, BP_EN) 81 : : 82 : : #define HINIC3_GET_RX_NUM_LRO(status) RQ_CQE_STATUS_GET(status, NUM_LRO) 83 : : 84 : : #define HINIC3_RX_IS_DECRY_PKT(status) RQ_CQE_STATUS_GET(status, DECRY_PKT) 85 : : 86 : : #define RQ_CQE_SUPER_CQE_EN_SHIFT 0 87 : : #define RQ_CQE_PKT_NUM_SHIFT 1 88 : : #define RQ_CQE_PKT_LAST_LEN_SHIFT 6 89 : : #define RQ_CQE_PKT_FIRST_LEN_SHIFT 19 90 : : 91 : : #define RQ_CQE_SUPER_CQE_EN_MASK 0x1 92 : : #define RQ_CQE_PKT_NUM_MASK 0x1FU 93 : : #define RQ_CQE_PKT_FIRST_LEN_MASK 0x1FFFU 94 : : #define RQ_CQE_PKT_LAST_LEN_MASK 0x1FFFU 95 : : 96 : : #define RQ_CQE_PKT_NUM_GET(val, member) \ 97 : : (((val) >> RQ_CQE_PKT_##member##_SHIFT) & RQ_CQE_PKT_##member##_MASK) 98 : : #define HINIC3_GET_RQ_CQE_PKT_NUM(pkt_info) RQ_CQE_PKT_NUM_GET(pkt_info, NUM) 99 : : 100 : : #define RQ_CQE_SUPER_CQE_EN_GET(val, member) \ 101 : : (((val) >> RQ_CQE_##member##_SHIFT) & RQ_CQE_##member##_MASK) 102 : : 103 : : #define HINIC3_GET_SUPER_CQE_EN(pkt_info) \ 104 : : RQ_CQE_SUPER_CQE_EN_GET(pkt_info, SUPER_CQE_EN) 105 : : 106 : : #define RQ_CQE_PKT_LEN_GET(val, member) \ 107 : : (((val) >> RQ_CQE_PKT_##member##_SHIFT) & RQ_CQE_PKT_##member##_MASK) 108 : : 109 : : #define RQ_CQE_DECRY_INFO_DECRY_STATUS_SHIFT 8 110 : : #define RQ_CQE_DECRY_INFO_ESP_NEXT_HEAD_SHIFT 0 111 : : 112 : : #define RQ_CQE_DECRY_INFO_DECRY_STATUS_MASK 0xFFU 113 : : #define RQ_CQE_DECRY_INFO_ESP_NEXT_HEAD_MASK 0xFFU 114 : : 115 : : #define RQ_CQE_DECRY_INFO_GET(val, member) \ 116 : : (((val) >> RQ_CQE_DECRY_INFO_##member##_SHIFT) & \ 117 : : RQ_CQE_DECRY_INFO_##member##_MASK) 118 : : 119 : : #define HINIC3_GET_DECRYPT_STATUS(decry_info) \ 120 : : RQ_CQE_DECRY_INFO_GET(decry_info, DECRY_STATUS) 121 : : 122 : : #define HINIC3_GET_ESP_NEXT_HEAD(decry_info) \ 123 : : RQ_CQE_DECRY_INFO_GET(decry_info, ESP_NEXT_HEAD) 124 : : 125 : : /* Rx cqe checksum err */ 126 : : #define HINIC3_RX_CSUM_IP_CSUM_ERR RTE_BIT32(0) 127 : : #define HINIC3_RX_CSUM_TCP_CSUM_ERR RTE_BIT32(1) 128 : : #define HINIC3_RX_CSUM_UDP_CSUM_ERR RTE_BIT32(2) 129 : : #define HINIC3_RX_CSUM_IGMP_CSUM_ERR RTE_BIT32(3) 130 : : #define HINIC3_RX_CSUM_ICMP_V4_CSUM_ERR RTE_BIT32(4) 131 : : #define HINIC3_RX_CSUM_ICMP_V6_CSUM_ERR RTE_BIT32(5) 132 : : #define HINIC3_RX_CSUM_SCTP_CRC_ERR RTE_BIT32(6) 133 : : #define HINIC3_RX_CSUM_HW_CHECK_NONE RTE_BIT32(7) 134 : : #define HINIC3_RX_CSUM_IPSU_OTHER_ERR RTE_BIT32(8) 135 : : 136 : : #define HINIC3_DEFAULT_RX_CSUM_OFFLOAD 0xFFF 137 : : #define HINIC3_CQE_LEN 32 138 : : 139 : : #define HINIC3_RSS_OFFLOAD_ALL ( \ 140 : : RTE_ETH_RSS_IPV4 | \ 141 : : RTE_ETH_RSS_FRAG_IPV4 | \ 142 : : RTE_ETH_RSS_NONFRAG_IPV4_TCP | \ 143 : : RTE_ETH_RSS_NONFRAG_IPV4_UDP | \ 144 : : RTE_ETH_RSS_NONFRAG_IPV4_OTHER | \ 145 : : RTE_ETH_RSS_IPV6 | \ 146 : : RTE_ETH_RSS_FRAG_IPV6 | \ 147 : : RTE_ETH_RSS_NONFRAG_IPV6_TCP | \ 148 : : RTE_ETH_RSS_NONFRAG_IPV6_UDP | \ 149 : : RTE_ETH_RSS_NONFRAG_IPV6_OTHER | \ 150 : : RTE_ETH_RSS_IPV6_EX | \ 151 : : RTE_ETH_RSS_IPV6_TCP_EX | \ 152 : : RTE_ETH_RSS_IPV6_UDP_EX) 153 : : 154 : : struct hinic3_rxq_stats { 155 : : uint64_t packets; 156 : : uint64_t bytes; 157 : : uint64_t errors; 158 : : uint64_t csum_errors; 159 : : uint64_t other_errors; 160 : : uint64_t unlock_bp; 161 : : uint64_t dropped; 162 : : 163 : : uint64_t rx_nombuf; 164 : : uint64_t rx_discards; 165 : : uint64_t burst_pkts; 166 : : uint64_t empty; 167 : : uint64_t tsc; 168 : : #ifdef HINIC3_XSTAT_MBUF_USE 169 : : uint64_t rx_alloc_mbuf_bytes; 170 : : uint64_t rx_free_mbuf_bytes; 171 : : uint64_t rx_left_mbuf_bytes; 172 : : #endif 173 : : 174 : : #ifdef HINIC3_XSTAT_RXBUF_INFO 175 : : uint64_t rx_mbuf; 176 : : uint64_t rx_avail; 177 : : uint64_t rx_hole; 178 : : #endif 179 : : 180 : : #ifdef HINIC3_XSTAT_PROF_RX 181 : : uint64_t app_tsc; 182 : : uint64_t pmd_tsc; 183 : : #endif 184 : : }; 185 : : 186 : : struct __rte_cache_aligned hinic3_rq_cqe { 187 : : RTE_ATOMIC(uint32_t)status; 188 : : uint32_t vlan_len; 189 : : 190 : : uint32_t offload_type; 191 : : uint32_t hash_val; 192 : : uint32_t mark_id_0; 193 : : uint32_t mark_id_1; 194 : : uint32_t mark_id_2; 195 : : uint32_t pkt_info; 196 : : }; 197 : : 198 : : /** 199 : : * Attention: please do not add any member in hinic3_rx_info 200 : : * because rxq bulk rearm mode will write mbuf in rx_info. 201 : : */ 202 : : struct hinic3_rx_info { 203 : : struct rte_mbuf *mbuf; 204 : : }; 205 : : 206 : : struct hinic3_sge_sect { 207 : : struct hinic3_sge sge; 208 : : uint32_t rsvd; 209 : : }; 210 : : 211 : : struct hinic3_rq_extend_wqe { 212 : : struct hinic3_sge_sect buf_desc; 213 : : struct hinic3_sge_sect cqe_sect; 214 : : }; 215 : : 216 : : struct hinic3_rq_normal_wqe { 217 : : uint32_t buf_hi_addr; 218 : : uint32_t buf_lo_addr; 219 : : uint32_t cqe_hi_addr; 220 : : uint32_t cqe_lo_addr; 221 : : }; 222 : : 223 : : struct hinic3_rq_wqe { 224 : : union { 225 : : struct hinic3_rq_normal_wqe normal_wqe; 226 : : struct hinic3_rq_extend_wqe extend_wqe; 227 : : }; 228 : : }; 229 : : 230 : : struct __rte_cache_aligned hinic3_rxq { 231 : : struct hinic3_nic_dev *nic_dev; 232 : : 233 : : uint16_t q_id; 234 : : uint16_t q_depth; 235 : : uint16_t q_mask; 236 : : uint16_t buf_len; 237 : : 238 : : uint32_t rx_buff_shift; 239 : : 240 : : uint16_t rx_free_thresh; 241 : : uint16_t rxinfo_align_end; 242 : : uint16_t wqebb_shift; 243 : : uint16_t wqebb_size; 244 : : 245 : : uint16_t wqe_type; 246 : : uint16_t cons_idx; 247 : : uint16_t prod_idx; 248 : : uint16_t delta; 249 : : 250 : : uint16_t next_to_update; 251 : : uint16_t port_id; 252 : : 253 : : const struct rte_memzone *rq_mz; 254 : : void *queue_buf_vaddr; /**< rxq dma info */ 255 : : rte_iova_t queue_buf_paddr; 256 : : 257 : : const struct rte_memzone *pi_mz; 258 : : uint16_t *pi_virt_addr; 259 : : void *db_addr; 260 : : rte_iova_t pi_dma_addr; 261 : : 262 : : struct hinic3_rx_info *rx_info; 263 : : struct hinic3_rq_cqe *rx_cqe; 264 : : struct rte_mempool *mb_pool; 265 : : 266 : : const struct rte_memzone *cqe_mz; 267 : : rte_iova_t cqe_start_paddr; 268 : : void *cqe_start_vaddr; 269 : : uint8_t dp_intr_en; 270 : : uint16_t msix_entry_idx; 271 : : 272 : : bool rx_deferred_start; /* don't start this queue in dev start */ 273 : : unsigned long status; 274 : : uint64_t wait_time_cycle; 275 : : 276 : : struct hinic3_rxq_stats rxq_stats; 277 : : #ifdef HINIC3_XSTAT_PROF_RX 278 : : uint64_t prof_rx_end_tsc; /**< Performance profiling. */ 279 : : #endif 280 : : }; 281 : : 282 : : uint16_t hinic3_rx_fill_wqe(struct hinic3_rxq *rxq); 283 : : 284 : : uint16_t hinic3_rx_fill_buffers(struct hinic3_rxq *rxq); 285 : : 286 : : void hinic3_free_rxq_mbufs(struct hinic3_rxq *rxq); 287 : : 288 : : void hinic3_free_all_rxq_mbufs(struct hinic3_nic_dev *nic_dev); 289 : : 290 : : int hinic3_update_rss_config(struct rte_eth_dev *dev, 291 : : struct rte_eth_rss_conf *rss_conf); 292 : : 293 : : int hinic3_poll_rq_empty(struct hinic3_rxq *rxq); 294 : : 295 : : void hinic3_dump_cqe_status(struct hinic3_rxq *rxq, uint32_t *cqe_done_cnt, 296 : : uint32_t *cqe_hole_cnt, uint32_t *head_ci, uint32_t *head_done); 297 : : 298 : : int hinic3_stop_rq(struct rte_eth_dev *eth_dev, struct hinic3_rxq *rxq); 299 : : 300 : : int hinic3_start_rq(struct rte_eth_dev *eth_dev, struct hinic3_rxq *rxq); 301 : : 302 : : uint16_t hinic3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts); 303 : : 304 : : void hinic3_add_rq_to_rx_queue_list(struct hinic3_nic_dev *nic_dev, 305 : : uint16_t queue_id); 306 : : 307 : : int hinic3_refill_indir_rqid(struct hinic3_rxq *rxq); 308 : : 309 : : void hinic3_init_rx_queue_list(struct hinic3_nic_dev *nic_dev); 310 : : 311 : : void hinic3_remove_rq_from_rx_queue_list(struct hinic3_nic_dev *nic_dev, 312 : : uint16_t queue_id); 313 : : int hinic3_start_all_rqs(struct rte_eth_dev *eth_dev); 314 : : 315 : : #ifdef HINIC3_XSTAT_RXBUF_INFO 316 : : void hinic3_get_stats(struct hinic3_rxq *rxq); 317 : : #endif 318 : : 319 : : /** 320 : : * Get receive queue local ci. 321 : : * 322 : : * @param[in] rxq 323 : : * Pointer to receive queue structure. 324 : : * @return 325 : : * Receive queue local ci. 326 : : */ 327 : : static inline uint16_t 328 : : hinic3_get_rq_local_ci(struct hinic3_rxq *rxq) 329 : : { 330 [ # # ]: 0 : return MASKED_QUEUE_IDX(rxq, rxq->cons_idx); 331 : : } 332 : : 333 : : static inline uint16_t 334 : : hinic3_get_rq_free_wqebb(struct hinic3_rxq *rxq) 335 : : { 336 [ # # # # ]: 0 : return rxq->delta - 1; 337 : : } 338 : : 339 : : /** 340 : : * Update receive queue local ci. 341 : : * 342 : : * @param[in] rxq 343 : : * Pointer to receive queue structure. 344 : : * @param[out] wqe_cnt 345 : : * Wqebb counters. 346 : : */ 347 : : static inline void 348 : : hinic3_update_rq_local_ci(struct hinic3_rxq *rxq, uint16_t wqe_cnt) 349 : : { 350 : 0 : rxq->cons_idx += wqe_cnt; 351 [ # # ]: 0 : rxq->delta += wqe_cnt; 352 : 0 : } 353 : : 354 : : #endif /* _HINIC3_RX_H_ */