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_PTYPE_OFFLOAD_SHIFT 0
9 : : #define RQ_CQE_OFFOLAD_TYPE_VLAN_EN_SHIFT 21
10 : : #define RQ_CQE_OFFOLAD_TYPE_RSS_TYPE_SHIFT 24
11 : :
12 : : #define RQ_CQE_OFFOLAD_TYPE_PTYPE_OFFLOAD_MASK 0xFFFU
13 : : #define RQ_CQE_OFFOLAD_TYPE_VLAN_EN_MASK 0x1U
14 : : #define RQ_CQE_OFFOLAD_TYPE_RSS_TYPE_MASK 0xFFU
15 : :
16 : : #define DPI_EXT_ACTION_FILED (1ULL << 32)
17 : :
18 : : #define RQ_CQE_OFFOLAD_TYPE_GET(val, member) \
19 : : (((val) >> RQ_CQE_OFFOLAD_TYPE_##member##_SHIFT) & \
20 : : RQ_CQE_OFFOLAD_TYPE_##member##_MASK)
21 : :
22 : : #define HINIC3_GET_RX_PTYPE_OFFLOAD(offload_type) \
23 : : RQ_CQE_OFFOLAD_TYPE_GET(offload_type, PTYPE_OFFLOAD)
24 : :
25 : : #define HINIC3_GET_RX_PKT_TYPE(offload_type) \
26 : : RQ_CQE_OFFOLAD_TYPE_GET(offload_type, PKT_TYPE)
27 : :
28 : : #define HINIC3_GET_RX_PKT_UMBCAST(offload_type) \
29 : : RQ_CQE_OFFOLAD_TYPE_GET(offload_type, PKT_UMBCAST)
30 : :
31 : : #define HINIC3_GET_RX_VLAN_OFFLOAD_EN(offload_type) \
32 : : RQ_CQE_OFFOLAD_TYPE_GET(offload_type, VLAN_EN)
33 : :
34 : : #define HINIC3_GET_RSS_TYPES(offload_type) \
35 : : RQ_CQE_OFFOLAD_TYPE_GET(offload_type, RSS_TYPE)
36 : :
37 : : #define RQ_CQE_SGE_VLAN_SHIFT 0
38 : : #define RQ_CQE_SGE_LEN_SHIFT 16
39 : :
40 : : #define RQ_CQE_SGE_VLAN_MASK 0xFFFFU
41 : : #define RQ_CQE_SGE_LEN_MASK 0xFFFFU
42 : :
43 : : #define RQ_CQE_SGE_GET(val, member) \
44 : : (((val) >> RQ_CQE_SGE_##member##_SHIFT) & RQ_CQE_SGE_##member##_MASK)
45 : :
46 : : #define HINIC3_GET_RX_VLAN_TAG(vlan_len) RQ_CQE_SGE_GET(vlan_len, VLAN)
47 : :
48 : : #define HINIC3_GET_RX_PKT_LEN(vlan_len) RQ_CQE_SGE_GET(vlan_len, LEN)
49 : :
50 : : #define RQ_CQE_STATUS_CSUM_ERR_SHIFT 0
51 : : #define RQ_CQE_STATUS_NUM_LRO_SHIFT 16
52 : : #define RQ_CQE_STATUS_LRO_PUSH_SHIFT 25
53 : : #define RQ_CQE_STATUS_LRO_ENTER_SHIFT 26
54 : : #define RQ_CQE_STATUS_LRO_INTR_SHIFT 27
55 : :
56 : : #define RQ_CQE_STATUS_BP_EN_SHIFT 30
57 : : #define RQ_CQE_STATUS_RXDONE_SHIFT 31
58 : : #define RQ_CQE_STATUS_DECRY_PKT_SHIFT 29
59 : : #define RQ_CQE_STATUS_FLUSH_SHIFT 28
60 : :
61 : : #define RQ_CQE_STATUS_CSUM_ERR_MASK 0xFFFFU
62 : : #define RQ_CQE_STATUS_NUM_LRO_MASK 0xFFU
63 : : #define RQ_CQE_STATUS_LRO_PUSH_MASK 0X1U
64 : : #define RQ_CQE_STATUS_LRO_ENTER_MASK 0X1U
65 : : #define RQ_CQE_STATUS_LRO_INTR_MASK 0X1U
66 : : #define RQ_CQE_STATUS_BP_EN_MASK 0X1U
67 : : #define RQ_CQE_STATUS_RXDONE_MASK 0x1U
68 : : #define RQ_CQE_STATUS_FLUSH_MASK 0x1U
69 : : #define RQ_CQE_STATUS_DECRY_PKT_MASK 0x1U
70 : :
71 : : #define RQ_CQE_STATUS_GET(val, member) \
72 : : (((val) >> RQ_CQE_STATUS_##member##_SHIFT) & \
73 : : RQ_CQE_STATUS_##member##_MASK)
74 : :
75 : : #define HINIC3_GET_RX_CSUM_ERR(status) RQ_CQE_STATUS_GET(status, CSUM_ERR)
76 : :
77 : : #define HINIC3_GET_RX_DONE(status) RQ_CQE_STATUS_GET(status, RXDONE)
78 : :
79 : : #define HINIC3_GET_RX_FLUSH(status) RQ_CQE_STATUS_GET(status, FLUSH)
80 : :
81 : : #define HINIC3_GET_RX_BP_EN(status) RQ_CQE_STATUS_GET(status, BP_EN)
82 : :
83 : : #define HINIC3_GET_RX_NUM_LRO(status) RQ_CQE_STATUS_GET(status, NUM_LRO)
84 : :
85 : : #define HINIC3_RX_IS_DECRY_PKT(status) RQ_CQE_STATUS_GET(status, DECRY_PKT)
86 : :
87 : : #define RQ_CQE_SUPER_CQE_EN_SHIFT 0
88 : : #define RQ_CQE_PKT_NUM_SHIFT 1
89 : : #define RQ_CQE_PKT_LAST_LEN_SHIFT 6
90 : : #define RQ_CQE_PKT_FIRST_LEN_SHIFT 19
91 : :
92 : : #define RQ_CQE_SUPER_CQE_EN_MASK 0x1
93 : : #define RQ_CQE_PKT_NUM_MASK 0x1FU
94 : : #define RQ_CQE_PKT_FIRST_LEN_MASK 0x1FFFU
95 : : #define RQ_CQE_PKT_LAST_LEN_MASK 0x1FFFU
96 : :
97 : : #define RQ_CQE_PKT_NUM_GET(val, member) \
98 : : (((val) >> RQ_CQE_PKT_##member##_SHIFT) & RQ_CQE_PKT_##member##_MASK)
99 : : #define HINIC3_GET_RQ_CQE_PKT_NUM(pkt_info) RQ_CQE_PKT_NUM_GET(pkt_info, NUM)
100 : :
101 : : #define RQ_CQE_SUPER_CQE_EN_GET(val, member) \
102 : : (((val) >> RQ_CQE_##member##_SHIFT) & RQ_CQE_##member##_MASK)
103 : :
104 : : #define HINIC3_GET_SUPER_CQE_EN(pkt_info) \
105 : : RQ_CQE_SUPER_CQE_EN_GET(pkt_info, SUPER_CQE_EN)
106 : :
107 : : #define RQ_CQE_PKT_LEN_GET(val, member) \
108 : : (((val) >> RQ_CQE_PKT_##member##_SHIFT) & RQ_CQE_PKT_##member##_MASK)
109 : :
110 : : #define RQ_CQE_DECRY_INFO_DECRY_STATUS_SHIFT 8
111 : : #define RQ_CQE_DECRY_INFO_ESP_NEXT_HEAD_SHIFT 0
112 : :
113 : : #define RQ_CQE_DECRY_INFO_DECRY_STATUS_MASK 0xFFU
114 : : #define RQ_CQE_DECRY_INFO_ESP_NEXT_HEAD_MASK 0xFFU
115 : :
116 : : #define RQ_CQE_DECRY_INFO_GET(val, member) \
117 : : (((val) >> RQ_CQE_DECRY_INFO_##member##_SHIFT) & \
118 : : RQ_CQE_DECRY_INFO_##member##_MASK)
119 : :
120 : : #define HINIC3_GET_DECRYPT_STATUS(decry_info) \
121 : : RQ_CQE_DECRY_INFO_GET(decry_info, DECRY_STATUS)
122 : :
123 : : #define HINIC3_GET_ESP_NEXT_HEAD(decry_info) \
124 : : RQ_CQE_DECRY_INFO_GET(decry_info, ESP_NEXT_HEAD)
125 : :
126 : : /* Compact CQE Field */
127 : : /* cqe dw0 */
128 : : #define RQ_COMPACT_CQE_STATUS_RXDONE_SHIFT 31
129 : : #define RQ_COMPACT_CQE_STATUS_CQE_TYPE_SHIFT 30
130 : : #define RQ_COMPACT_CQE_STATUS_TS_FLAG_SHIFT 29
131 : : #define RQ_COMPACT_CQE_STATUS_VLAN_EN_SHIFT 28
132 : : #define RQ_COMPACT_CQE_STATUS_PKT_FORMAT_SHIFT 25
133 : : #define RQ_COMPACT_CQE_STATUS_IP_TYPE_SHIFT 24
134 : : #define RQ_COMPACT_CQE_STATUS_CQE_LEN_SHIFT 23
135 : : #define RQ_COMPACT_CQE_STATUS_PKT_MC_SHIFT 21
136 : : #define RQ_COMPACT_CQE_STATUS_CSUM_ERR_SHIFT 19
137 : : #define RQ_COMPACT_CQE_STATUS_PKT_TYPE_SHIFT 16
138 : : #define RQ_COMPACT_CQE_STATUS_PTYPE_SHIFT 16
139 : : #define RQ_COMPACT_CQE_STATUS_PKT_LEN_SHIFT 0
140 : :
141 : : #define RQ_COMPACT_CQE_STATUS_RXDONE_MASK 0x1U
142 : : #define RQ_COMPACT_CQE_STATUS_CQE_TYPE_MASK 0x1U
143 : : #define RQ_COMPACT_CQE_STATUS_TS_FLAG_MASK 0x1U
144 : : #define RQ_COMPACT_CQE_STATUS_VLAN_EN_MASK 0x1U
145 : : #define RQ_COMPACT_CQE_STATUS_PKT_FORMAT_MASK 0x7U
146 : : #define RQ_COMPACT_CQE_STATUS_IP_TYPE_MASK 0x1U
147 : : #define RQ_COMPACT_CQE_STATUS_CQE_LEN_MASK 0x1U
148 : : #define RQ_COMPACT_CQE_STATUS_PKT_MC_MASK 0x1U
149 : : #define RQ_COMPACT_CQE_STATUS_CSUM_ERR_MASK 0x3U
150 : : #define RQ_COMPACT_CQE_STATUS_PKT_TYPE_MASK 0x7U
151 : : #define RQ_COMPACT_CQE_STATUS_PTYPE_MASK 0xFFFU
152 : : #define RQ_COMPACT_CQE_STATUS_PKT_LEN_MASK 0xFFFFU
153 : :
154 : : #define HINIC3_RQ_COMPACT_CQE_STATUS_GET(val, member) \
155 : : ((((val) >> RQ_COMPACT_CQE_STATUS_##member##_SHIFT) & \
156 : : RQ_COMPACT_CQE_STATUS_##member##_MASK))
157 : :
158 : : #define HINIC3_RQ_CQE_SEPARATE 0
159 : : #define HINIC3_RQ_CQE_INTEGRATE 1
160 : :
161 : : /* cqe dw2 */
162 : : #define RQ_COMPACT_CQE_OFFLOAD_NUM_LRO_SHIFT 24
163 : : #define RQ_COMPACT_CQE_OFFLOAD_VLAN_SHIFT 8
164 : :
165 : : #define RQ_COMPACT_CQE_OFFLOAD_NUM_LRO_MASK 0xFFU
166 : : #define RQ_COMPACT_CQE_OFFLOAD_VLAN_MASK 0xFFFFU
167 : :
168 : : #define HINIC3_RQ_COMPACT_CQE_OFFLOAD_GET(val, member) \
169 : : (((val) >> RQ_COMPACT_CQE_OFFLOAD_##member##_SHIFT) & \
170 : : RQ_COMPACT_CQE_OFFLOAD_##member##_MASK)
171 : :
172 : : #define HINIC3_RQ_COMPACT_CQE_16BYTE 0
173 : : #define HINIC3_RQ_COMPACT_CQE_8BYTE 1
174 : : /* Rx cqe checksum err */
175 : : #define HINIC3_RX_CSUM_IP_CSUM_ERR RTE_BIT32(0)
176 : : #define HINIC3_RX_CSUM_TCP_CSUM_ERR RTE_BIT32(1)
177 : : #define HINIC3_RX_CSUM_UDP_CSUM_ERR RTE_BIT32(2)
178 : : #define HINIC3_RX_CSUM_IGMP_CSUM_ERR RTE_BIT32(3)
179 : : #define HINIC3_RX_CSUM_ICMP_V4_CSUM_ERR RTE_BIT32(4)
180 : : #define HINIC3_RX_CSUM_ICMP_V6_CSUM_ERR RTE_BIT32(5)
181 : : #define HINIC3_RX_CSUM_SCTP_CRC_ERR RTE_BIT32(6)
182 : : #define HINIC3_RX_CSUM_HW_CHECK_NONE RTE_BIT32(7)
183 : : #define HINIC3_RX_CSUM_IPSU_OTHER_ERR RTE_BIT32(8)
184 : :
185 : : #define HINIC3_DEFAULT_RX_CSUM_OFFLOAD 0xFFF
186 : : #define HINIC3_CQE_LEN 32
187 : :
188 : : #define HINIC3_RSS_OFFLOAD_ALL ( \
189 : : RTE_ETH_RSS_IPV4 | \
190 : : RTE_ETH_RSS_FRAG_IPV4 | \
191 : : RTE_ETH_RSS_NONFRAG_IPV4_TCP | \
192 : : RTE_ETH_RSS_NONFRAG_IPV4_UDP | \
193 : : RTE_ETH_RSS_NONFRAG_IPV4_OTHER | \
194 : : RTE_ETH_RSS_IPV6 | \
195 : : RTE_ETH_RSS_FRAG_IPV6 | \
196 : : RTE_ETH_RSS_NONFRAG_IPV6_TCP | \
197 : : RTE_ETH_RSS_NONFRAG_IPV6_UDP | \
198 : : RTE_ETH_RSS_NONFRAG_IPV6_OTHER | \
199 : : RTE_ETH_RSS_IPV6_EX | \
200 : : RTE_ETH_RSS_IPV6_TCP_EX | \
201 : : RTE_ETH_RSS_IPV6_UDP_EX)
202 : :
203 : : struct hinic3_rxq_stats {
204 : : uint64_t packets;
205 : : uint64_t bytes;
206 : : uint64_t errors;
207 : : uint64_t csum_errors;
208 : : uint64_t other_errors;
209 : : uint64_t unlock_bp;
210 : : uint64_t dropped;
211 : :
212 : : uint64_t rx_nombuf;
213 : : uint64_t rx_discards;
214 : : uint64_t burst_pkts;
215 : : uint64_t empty;
216 : : uint64_t tsc;
217 : : #ifdef HINIC3_XSTAT_MBUF_USE
218 : : uint64_t rx_alloc_mbuf_bytes;
219 : : uint64_t rx_free_mbuf_bytes;
220 : : uint64_t rx_left_mbuf_bytes;
221 : : #endif
222 : :
223 : : #ifdef HINIC3_XSTAT_RXBUF_INFO
224 : : uint64_t rx_mbuf;
225 : : uint64_t rx_avail;
226 : : uint64_t rx_hole;
227 : : #endif
228 : :
229 : : #ifdef HINIC3_XSTAT_PROF_RX
230 : : uint64_t app_tsc;
231 : : uint64_t pmd_tsc;
232 : : #endif
233 : : };
234 : :
235 : : struct __rte_cache_aligned hinic3_rq_cqe {
236 : : RTE_ATOMIC(uint32_t)status;
237 : : uint32_t vlan_len;
238 : :
239 : : uint32_t offload_type;
240 : : uint32_t hash_val;
241 : : uint32_t mark_id_0;
242 : : uint32_t mark_id_1;
243 : : uint32_t mark_id_2;
244 : : uint32_t pkt_info;
245 : : };
246 : :
247 : : struct hinic3_cqe_info {
248 : : uint8_t data_offset;
249 : : uint8_t lro_num;
250 : : uint8_t vlan_offload;
251 : : uint8_t cqe_len;
252 : :
253 : : uint8_t cqe_type;
254 : : uint8_t ts_flag;
255 : : uint16_t csum_err;
256 : :
257 : : uint16_t vlan_tag;
258 : : uint16_t ptype;
259 : :
260 : : uint16_t pkt_len;
261 : : uint16_t rss_type;
262 : :
263 : : uint32_t rss_hash_value;
264 : : };
265 : :
266 : : /**
267 : : * Attention: please do not add any member in hinic3_rx_info
268 : : * because rxq bulk rearm mode will write mbuf in rx_info.
269 : : */
270 : : struct hinic3_rx_info {
271 : : struct rte_mbuf *mbuf;
272 : : };
273 : :
274 : : struct hinic3_sge_sect {
275 : : struct hinic3_sge sge;
276 : : uint32_t rsvd;
277 : : };
278 : :
279 : : struct hinic3_rq_extend_wqe {
280 : : struct hinic3_sge_sect buf_desc;
281 : : struct hinic3_sge_sect cqe_sect;
282 : : };
283 : :
284 : : struct hinic3_rq_normal_wqe {
285 : : uint32_t buf_hi_addr;
286 : : uint32_t buf_lo_addr;
287 : : uint32_t cqe_hi_addr;
288 : : uint32_t cqe_lo_addr;
289 : : };
290 : :
291 : : struct hinic3_rq_compact_wqe {
292 : : uint32_t buf_hi_addr;
293 : : uint32_t buf_lo_addr;
294 : : };
295 : :
296 : : struct hinic3_rq_wqe {
297 : : union {
298 : : struct hinic3_rq_compact_wqe compact_wqe;
299 : : struct hinic3_rq_normal_wqe normal_wqe;
300 : : struct hinic3_rq_extend_wqe extend_wqe;
301 : : };
302 : : };
303 : :
304 : : struct hinic3_rq_ci_wb {
305 : : union {
306 : : struct {
307 : : uint16_t cqe_num;
308 : : uint16_t hw_ci;
309 : : } bs;
310 : : RTE_ATOMIC(uint32_t) value;
311 : : } dw1;
312 : :
313 : : uint32_t rsvd[3];
314 : : };
315 : :
316 : :
317 : : struct __rte_cache_aligned hinic3_rxq {
318 : : struct hinic3_nic_dev *nic_dev;
319 : :
320 : : uint16_t q_id;
321 : : uint16_t q_depth;
322 : : uint16_t q_mask;
323 : : uint16_t buf_len;
324 : :
325 : : uint32_t rx_buff_shift;
326 : :
327 : : uint16_t rx_free_thresh;
328 : : uint16_t rxinfo_align_end;
329 : : uint16_t wqebb_shift;
330 : : uint16_t wqebb_size;
331 : :
332 : : uint16_t wqe_type;
333 : : uint16_t cons_idx;
334 : : uint16_t prod_idx;
335 : : uint16_t delta;
336 : :
337 : : uint16_t next_to_update;
338 : : uint16_t port_id;
339 : :
340 : : const struct rte_memzone *rq_mz;
341 : : void *queue_buf_vaddr; /**< rxq dma info */
342 : : rte_iova_t queue_buf_paddr;
343 : :
344 : : const struct rte_memzone *pi_mz;
345 : : uint16_t *pi_virt_addr;
346 : : void *db_addr;
347 : : rte_iova_t pi_dma_addr;
348 : :
349 : : struct hinic3_rx_info *rx_info;
350 : : struct hinic3_rq_cqe *rx_cqe;
351 : : struct rte_mempool *mb_pool;
352 : :
353 : : const struct rte_memzone *ci_mz;
354 : : struct hinic3_rq_ci_wb *rq_ci;
355 : : rte_iova_t rq_ci_paddr;
356 : :
357 : : const struct rte_memzone *cqe_mz;
358 : : rte_iova_t cqe_start_paddr;
359 : : void *cqe_start_vaddr;
360 : : uint8_t dp_intr_en;
361 : : uint16_t msix_entry_idx;
362 : :
363 : : bool rx_deferred_start; /* don't start this queue in dev start */
364 : : unsigned long status;
365 : : uint64_t wait_time_cycle;
366 : :
367 : : struct hinic3_rxq_stats rxq_stats;
368 : : #ifdef HINIC3_XSTAT_PROF_RX
369 : : uint64_t prof_rx_end_tsc; /**< Performance profiling. */
370 : : #endif
371 : : };
372 : :
373 : : /* Rx CQE info get callback function */
374 : : typedef void (*nic_rx_get_cqe_info_t)(struct hinic3_rxq *rxq,
375 : : volatile struct hinic3_rq_cqe *rx_cqe,
376 : : struct hinic3_cqe_info *cqe_info);
377 : :
378 : : /* Rx CQE check status callback function */
379 : : typedef bool (*nic_rx_cqe_done_t)(struct hinic3_rxq *rxq,
380 : : volatile struct hinic3_rq_cqe **rx_cqe);
381 : :
382 : : /* Rx CQE empty poll callback function */
383 : : typedef int (*nic_rx_poll_rq_empty_t)(struct hinic3_rxq *rxq);
384 : :
385 : : struct hinic3_nic_rx_ops {
386 : : nic_rx_get_cqe_info_t nic_rx_get_cqe_info;
387 : : nic_rx_cqe_done_t nic_rx_cqe_done;
388 : : nic_rx_poll_rq_empty_t nic_rx_poll_rq_empty;
389 : : };
390 : :
391 : : uint16_t hinic3_rx_fill_wqe(struct hinic3_rxq *rxq);
392 : :
393 : : uint16_t hinic3_rx_fill_buffers(struct hinic3_rxq *rxq);
394 : :
395 : : void hinic3_free_rxq_mbufs(struct hinic3_rxq *rxq);
396 : :
397 : : void hinic3_free_all_rxq_mbufs(struct hinic3_nic_dev *nic_dev);
398 : :
399 : : int hinic3_update_rss_config(struct rte_eth_dev *dev,
400 : : struct rte_eth_rss_conf *rss_conf);
401 : :
402 : : int hinic3_poll_integrated_cqe_rq_empty(struct hinic3_rxq *rxq);
403 : : int hinic3_poll_rq_empty(struct hinic3_rxq *rxq);
404 : :
405 : : void hinic3_dump_cqe_status(struct hinic3_rxq *rxq, uint32_t *cqe_done_cnt,
406 : : uint32_t *cqe_hole_cnt, uint32_t *head_ci, uint32_t *head_done);
407 : :
408 : : int hinic3_stop_rq(struct rte_eth_dev *eth_dev, struct hinic3_rxq *rxq);
409 : :
410 : : int hinic3_start_rq(struct rte_eth_dev *eth_dev, struct hinic3_rxq *rxq);
411 : :
412 : : uint16_t hinic3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts);
413 : :
414 : : void hinic3_add_rq_to_rx_queue_list(struct hinic3_nic_dev *nic_dev,
415 : : uint16_t queue_id);
416 : :
417 : : int hinic3_refill_indir_rqid(struct hinic3_rxq *rxq);
418 : :
419 : : void hinic3_init_rx_queue_list(struct hinic3_nic_dev *nic_dev);
420 : :
421 : : void hinic3_remove_rq_from_rx_queue_list(struct hinic3_nic_dev *nic_dev,
422 : : uint16_t queue_id);
423 : : int hinic3_start_all_rqs(struct rte_eth_dev *eth_dev);
424 : :
425 : : #ifdef HINIC3_XSTAT_RXBUF_INFO
426 : : void hinic3_get_stats(struct hinic3_rxq *rxq);
427 : : #endif
428 : :
429 : : /**
430 : : * Get receive queue local ci.
431 : : *
432 : : * @param[in] rxq
433 : : * Pointer to receive queue structure.
434 : : * @return
435 : : * Receive queue local ci.
436 : : */
437 : : static inline uint16_t
438 : : hinic3_get_rq_local_ci(struct hinic3_rxq *rxq)
439 : : {
440 [ # # # # : 0 : return MASKED_QUEUE_IDX(rxq, rxq->cons_idx);
# # ]
441 : : }
442 : :
443 : : static inline uint16_t
444 : : hinic3_get_rq_free_wqebb(struct hinic3_rxq *rxq)
445 : : {
446 [ # # # # ]: 0 : return rxq->delta - 1;
447 : : }
448 : :
449 : : /**
450 : : * Update receive queue local ci.
451 : : *
452 : : * @param[in] rxq
453 : : * Pointer to receive queue structure.
454 : : * @param[out] wqe_cnt
455 : : * Wqebb counters.
456 : : */
457 : : static inline void
458 : : hinic3_update_rq_local_ci(struct hinic3_rxq *rxq, uint16_t wqe_cnt)
459 : : {
460 : 0 : rxq->cons_idx += wqe_cnt;
461 [ # # ]: 0 : rxq->delta += wqe_cnt;
462 : 0 : }
463 : :
464 : : /**
465 : : * Get receive cqe information
466 : : *
467 : : * @param[in] rxq
468 : : * Receive queue
469 : : * @param[in] rx_cqe
470 : : * Receive cqe
471 : : * @param[in] cqe_info
472 : : * Packet information parsed from cqe
473 : : */
474 : : void
475 : : hinic3_rx_get_cqe_info(struct hinic3_rxq *rxq, volatile struct hinic3_rq_cqe *rx_cqe,
476 : : struct hinic3_cqe_info *cqe_info);
477 : :
478 : : /**
479 : : * Get receive compact cqe information
480 : : *
481 : : * @param[in] rx_queue
482 : : * Receive queue
483 : : * @param[in] rx_cqe
484 : : * Receive compact cqe
485 : : * @param[in] cqe_info
486 : : * Packet information parsed from cqe
487 : : */
488 : : void
489 : : hinic3_rx_get_compact_cqe_info(struct hinic3_rxq *rxq, volatile struct hinic3_rq_cqe *rx_cqe,
490 : : struct hinic3_cqe_info *cqe_info);
491 : :
492 : : /**
493 : : * Check whether pkt is received when CQE is separated
494 : : *
495 : : * @param[in] rxq
496 : : * Receive queue
497 : : * @param[in] rx_cqe
498 : : * The CQE written by hw
499 : : * @return
500 : : * True: Packet is received
501 : : * False: Packet is not received
502 : : */
503 : : bool
504 : : hinic3_rx_separate_cqe_done(struct hinic3_rxq *rxq, volatile struct hinic3_rq_cqe **rx_cqe);
505 : :
506 : : /**
507 : : * Check whether pkt is received when CQE is integrated
508 : : *
509 : : * @param[in] rxq
510 : : * Receive queue
511 : : * @param[in] rx_cqe
512 : : * The CQE written by hw
513 : : * @return
514 : : * True: Packet is received
515 : : * False: Packet is not received
516 : : */
517 : : bool
518 : : hinic3_rx_integrated_cqe_done(struct hinic3_rxq *rxq, volatile struct hinic3_rq_cqe **rx_cqe);
519 : :
520 : : #endif /* _HINIC3_RX_H_ */
|