xref: /dpdk/drivers/net/hns3/hns3_rxtx_vec_neon.h (revision 43fd3624fdfe3a33904a9b64d94306dd3d4f2c13)
1e31f123dSWei Hu (Xavier) /* SPDX-License-Identifier: BSD-3-Clause
253e6f86cSMin Hu (Connor)  * Copyright(c) 2020-2021 HiSilicon Limited.
3e31f123dSWei Hu (Xavier)  */
4e31f123dSWei Hu (Xavier) 
52ad146efSChengwen Feng #ifndef HNS3_RXTX_VEC_NEON_H
62ad146efSChengwen Feng #define HNS3_RXTX_VEC_NEON_H
7e31f123dSWei Hu (Xavier) 
8191128d7SDavid Marchand #include <rte_bitops.h>
9191128d7SDavid Marchand 
10e31f123dSWei Hu (Xavier) #include <arm_neon.h>
11e31f123dSWei Hu (Xavier) 
12e31f123dSWei Hu (Xavier) static inline void
13e31f123dSWei Hu (Xavier) hns3_vec_tx(volatile struct hns3_desc *desc, struct rte_mbuf *pkt)
14e31f123dSWei Hu (Xavier) {
15e31f123dSWei Hu (Xavier) 	uint64x2_t val1 = {
1621b33542SChengwen Feng 		rte_pktmbuf_iova(pkt),
17e31f123dSWei Hu (Xavier) 		((uint64_t)pkt->data_len) << HNS3_TXD_SEND_SIZE_SHIFT
18e31f123dSWei Hu (Xavier) 	};
19e31f123dSWei Hu (Xavier) 	uint64x2_t val2 = {
20e31f123dSWei Hu (Xavier) 		0,
21e31f123dSWei Hu (Xavier) 		((uint64_t)HNS3_TXD_DEFAULT_VLD_FE_BDTYPE) << HNS3_UINT32_BIT
22e31f123dSWei Hu (Xavier) 	};
23*43fd3624SAndre Muezerie 	vst1q_u64(RTE_CAST_PTR(uint64_t *, &desc->addr), val1);
24*43fd3624SAndre Muezerie 	vst1q_u64(RTE_CAST_PTR(uint64_t *, &desc->tx.outer_vlan_tag), val2);
25e31f123dSWei Hu (Xavier) }
26e31f123dSWei Hu (Xavier) 
27e31f123dSWei Hu (Xavier) static uint16_t
28e31f123dSWei Hu (Xavier) hns3_xmit_fixed_burst_vec(void *__restrict tx_queue,
29e31f123dSWei Hu (Xavier) 			  struct rte_mbuf **__restrict tx_pkts,
30e31f123dSWei Hu (Xavier) 			  uint16_t nb_pkts)
31e31f123dSWei Hu (Xavier) {
32e31f123dSWei Hu (Xavier) 	struct hns3_tx_queue *txq = (struct hns3_tx_queue *)tx_queue;
33e31f123dSWei Hu (Xavier) 	volatile struct hns3_desc *tx_desc;
34e31f123dSWei Hu (Xavier) 	struct hns3_entry *tx_entry;
35e31f123dSWei Hu (Xavier) 	uint16_t next_to_use;
36e31f123dSWei Hu (Xavier) 	uint16_t nb_commit;
37e31f123dSWei Hu (Xavier) 	uint16_t nb_tx;
38e31f123dSWei Hu (Xavier) 	uint16_t n, i;
39e31f123dSWei Hu (Xavier) 
40e31f123dSWei Hu (Xavier) 	if (txq->tx_bd_ready < txq->tx_free_thresh)
41e31f123dSWei Hu (Xavier) 		hns3_tx_free_buffers(txq);
42e31f123dSWei Hu (Xavier) 
43e31f123dSWei Hu (Xavier) 	nb_commit = RTE_MIN(txq->tx_bd_ready, nb_pkts);
44e31f123dSWei Hu (Xavier) 	if (unlikely(nb_commit == 0)) {
459b77f1feSHuisong Li 		txq->dfx_stats.queue_full_cnt++;
46e31f123dSWei Hu (Xavier) 		return 0;
47e31f123dSWei Hu (Xavier) 	}
48e31f123dSWei Hu (Xavier) 	nb_tx = nb_commit;
49e31f123dSWei Hu (Xavier) 
50e31f123dSWei Hu (Xavier) 	next_to_use = txq->next_to_use;
51e31f123dSWei Hu (Xavier) 	tx_desc = &txq->tx_ring[next_to_use];
52e31f123dSWei Hu (Xavier) 	tx_entry = &txq->sw_ring[next_to_use];
53e31f123dSWei Hu (Xavier) 
54e31f123dSWei Hu (Xavier) 	/*
55e31f123dSWei Hu (Xavier) 	 * We need to deal with n descriptors first for better performance,
56e31f123dSWei Hu (Xavier) 	 * if nb_commit is greater than the difference between txq->nb_tx_desc
57e31f123dSWei Hu (Xavier) 	 * and next_to_use in sw_ring and tx_ring.
58e31f123dSWei Hu (Xavier) 	 */
59e31f123dSWei Hu (Xavier) 	n = txq->nb_tx_desc - next_to_use;
60e31f123dSWei Hu (Xavier) 	if (nb_commit >= n) {
61e31f123dSWei Hu (Xavier) 		for (i = 0; i < n; i++, tx_pkts++, tx_desc++) {
62e31f123dSWei Hu (Xavier) 			hns3_vec_tx(tx_desc, *tx_pkts);
63e31f123dSWei Hu (Xavier) 			tx_entry[i].mbuf = *tx_pkts;
64fdcd6a3eSMin Hu (Connor) 
65fdcd6a3eSMin Hu (Connor) 			/* Increment bytes counter */
66fdcd6a3eSMin Hu (Connor) 			txq->basic_stats.bytes += (*tx_pkts)->pkt_len;
67e31f123dSWei Hu (Xavier) 		}
68e31f123dSWei Hu (Xavier) 
69e31f123dSWei Hu (Xavier) 		nb_commit -= n;
70e31f123dSWei Hu (Xavier) 		next_to_use = 0;
71e31f123dSWei Hu (Xavier) 		tx_desc = &txq->tx_ring[next_to_use];
72e31f123dSWei Hu (Xavier) 		tx_entry = &txq->sw_ring[next_to_use];
73e31f123dSWei Hu (Xavier) 	}
74e31f123dSWei Hu (Xavier) 
75e31f123dSWei Hu (Xavier) 	for (i = 0; i < nb_commit; i++, tx_pkts++, tx_desc++) {
76e31f123dSWei Hu (Xavier) 		hns3_vec_tx(tx_desc, *tx_pkts);
77e31f123dSWei Hu (Xavier) 		tx_entry[i].mbuf = *tx_pkts;
78fdcd6a3eSMin Hu (Connor) 
79fdcd6a3eSMin Hu (Connor) 		/* Increment bytes counter */
80fdcd6a3eSMin Hu (Connor) 		txq->basic_stats.bytes += (*tx_pkts)->pkt_len;
81e31f123dSWei Hu (Xavier) 	}
82e31f123dSWei Hu (Xavier) 
83e31f123dSWei Hu (Xavier) 	next_to_use += nb_commit;
84e31f123dSWei Hu (Xavier) 	txq->next_to_use = next_to_use;
85e31f123dSWei Hu (Xavier) 	txq->tx_bd_ready -= nb_tx;
86e31f123dSWei Hu (Xavier) 
8723e317ddSChengwen Feng 	hns3_write_txq_tail_reg(txq, nb_tx);
88e31f123dSWei Hu (Xavier) 
89e31f123dSWei Hu (Xavier) 	return nb_tx;
90e31f123dSWei Hu (Xavier) }
91a3d4f4d2SWei Hu (Xavier) 
92a3d4f4d2SWei Hu (Xavier) static inline uint32_t
93a3d4f4d2SWei Hu (Xavier) hns3_desc_parse_field(struct hns3_rx_queue *rxq,
94a3d4f4d2SWei Hu (Xavier) 		      struct hns3_entry *sw_ring,
95a3d4f4d2SWei Hu (Xavier) 		      struct hns3_desc *rxdp,
96a3d4f4d2SWei Hu (Xavier) 		      uint32_t   bd_vld_num)
97a3d4f4d2SWei Hu (Xavier) {
98a3d4f4d2SWei Hu (Xavier) 	uint32_t l234_info, ol_info, bd_base_info;
99a3d4f4d2SWei Hu (Xavier) 	struct rte_mbuf *pkt;
100a3d4f4d2SWei Hu (Xavier) 	uint32_t retcode = 0;
10137f54f3cSHongbo Zheng 	uint32_t i;
10237f54f3cSHongbo Zheng 	int ret;
103a3d4f4d2SWei Hu (Xavier) 
10437f54f3cSHongbo Zheng 	for (i = 0; i < bd_vld_num; i++) {
105a3d4f4d2SWei Hu (Xavier) 		pkt = sw_ring[i].mbuf;
106a3d4f4d2SWei Hu (Xavier) 
107a3d4f4d2SWei Hu (Xavier) 		/* init rte_mbuf.rearm_data last 64-bit */
108daa02b5cSOlivier Matz 		pkt->ol_flags = RTE_MBUF_F_RX_RSS_HASH;
109a3d4f4d2SWei Hu (Xavier) 
110a3d4f4d2SWei Hu (Xavier) 		l234_info = rxdp[i].rx.l234_info;
111a3d4f4d2SWei Hu (Xavier) 		ol_info = rxdp[i].rx.ol_info;
112a3d4f4d2SWei Hu (Xavier) 		bd_base_info = rxdp[i].rx.bd_base_info;
113bd739929SChengwen Feng 		ret = hns3_handle_bdinfo(rxq, pkt, bd_base_info, l234_info);
114a3d4f4d2SWei Hu (Xavier) 		if (unlikely(ret)) {
115a3d4f4d2SWei Hu (Xavier) 			retcode |= 1u << i;
116a3d4f4d2SWei Hu (Xavier) 			continue;
117a3d4f4d2SWei Hu (Xavier) 		}
118a3d4f4d2SWei Hu (Xavier) 
119a3d4f4d2SWei Hu (Xavier) 		pkt->packet_type = hns3_rx_calc_ptype(rxq, l234_info, ol_info);
120fdcd6a3eSMin Hu (Connor) 
121fdcd6a3eSMin Hu (Connor) 		/* Increment bytes counter */
122fdcd6a3eSMin Hu (Connor) 		rxq->basic_stats.bytes += pkt->pkt_len;
123a3d4f4d2SWei Hu (Xavier) 	}
124a3d4f4d2SWei Hu (Xavier) 
125a3d4f4d2SWei Hu (Xavier) 	return retcode;
126a3d4f4d2SWei Hu (Xavier) }
127a3d4f4d2SWei Hu (Xavier) 
128a3d4f4d2SWei Hu (Xavier) static inline uint16_t
129a3d4f4d2SWei Hu (Xavier) hns3_recv_burst_vec(struct hns3_rx_queue *__restrict rxq,
130a3d4f4d2SWei Hu (Xavier) 		    struct rte_mbuf **__restrict rx_pkts,
131a3d4f4d2SWei Hu (Xavier) 		    uint16_t nb_pkts,
132a3d4f4d2SWei Hu (Xavier) 		    uint64_t *bd_err_mask)
133a3d4f4d2SWei Hu (Xavier) {
134a3d4f4d2SWei Hu (Xavier) 	uint16_t rx_id = rxq->next_to_use;
135a3d4f4d2SWei Hu (Xavier) 	struct hns3_entry *sw_ring = &rxq->sw_ring[rx_id];
136a3d4f4d2SWei Hu (Xavier) 	struct hns3_desc *rxdp = &rxq->rx_ring[rx_id];
137a3d4f4d2SWei Hu (Xavier) 	uint32_t bd_valid_num, parse_retcode;
138a3d4f4d2SWei Hu (Xavier) 	uint16_t nb_rx = 0;
13937f54f3cSHongbo Zheng 	uint32_t pos;
14037f54f3cSHongbo Zheng 	int offset;
141a3d4f4d2SWei Hu (Xavier) 
142a3d4f4d2SWei Hu (Xavier) 	/* mask to shuffle from desc to mbuf's rx_descriptor_fields1 */
143a3d4f4d2SWei Hu (Xavier) 	uint8x16_t shuf_desc_fields_msk = {
144a3d4f4d2SWei Hu (Xavier) 		0xff, 0xff, 0xff, 0xff,  /* packet type init zero */
1456bec7c50SHuisong Li 		20, 21, 0xff, 0xff,      /* rx.pkt_len to rte_mbuf.pkt_len */
1466bec7c50SHuisong Li 		22, 23,	                 /* size to rte_mbuf.data_len */
147a3d4f4d2SWei Hu (Xavier) 		0xff, 0xff,	         /* rte_mbuf.vlan_tci init zero */
148a3d4f4d2SWei Hu (Xavier) 		8, 9, 10, 11,	         /* rx.rss_hash to rte_mbuf.hash.rss */
149a3d4f4d2SWei Hu (Xavier) 	};
150a3d4f4d2SWei Hu (Xavier) 
151a3d4f4d2SWei Hu (Xavier) 	uint16x8_t crc_adjust = {
152a3d4f4d2SWei Hu (Xavier) 		0, 0,         /* ignore pkt_type field */
153a3d4f4d2SWei Hu (Xavier) 		rxq->crc_len, /* sub crc on pkt_len */
154a3d4f4d2SWei Hu (Xavier) 		0,            /* ignore high-16bits of pkt_len */
155a3d4f4d2SWei Hu (Xavier) 		rxq->crc_len, /* sub crc on data_len */
156a3d4f4d2SWei Hu (Xavier) 		0, 0, 0,      /* ignore non-length fields */
157a3d4f4d2SWei Hu (Xavier) 	};
158a3d4f4d2SWei Hu (Xavier) 
159cb12e988SChengwen Feng 	/* compile-time verifies the shuffle mask */
160cb12e988SChengwen Feng 	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pkt_len) !=
161cb12e988SChengwen Feng 			 offsetof(struct rte_mbuf, rx_descriptor_fields1) + 4);
162cb12e988SChengwen Feng 	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_len) !=
163cb12e988SChengwen Feng 			 offsetof(struct rte_mbuf, rx_descriptor_fields1) + 8);
164cb12e988SChengwen Feng 	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, hash.rss) !=
165cb12e988SChengwen Feng 			 offsetof(struct rte_mbuf, rx_descriptor_fields1) + 12);
166cb12e988SChengwen Feng 
167a3d4f4d2SWei Hu (Xavier) 	for (pos = 0; pos < nb_pkts; pos += HNS3_DEFAULT_DESCS_PER_LOOP,
168a3d4f4d2SWei Hu (Xavier) 				     rxdp += HNS3_DEFAULT_DESCS_PER_LOOP) {
169a3d4f4d2SWei Hu (Xavier) 		uint64x2x2_t descs[HNS3_DEFAULT_DESCS_PER_LOOP];
170a3d4f4d2SWei Hu (Xavier) 		uint8x16x2_t pkt_mbuf1, pkt_mbuf2, pkt_mbuf3, pkt_mbuf4;
171a3d4f4d2SWei Hu (Xavier) 		uint8x16_t pkt_mb1, pkt_mb2, pkt_mb3, pkt_mb4;
172a3d4f4d2SWei Hu (Xavier) 		uint64x2_t mbp1, mbp2;
173a3d4f4d2SWei Hu (Xavier) 		uint16x4_t bd_vld = {0};
174a3d4f4d2SWei Hu (Xavier) 		uint16x8_t tmp;
175a3d4f4d2SWei Hu (Xavier) 		uint64_t stat;
176a3d4f4d2SWei Hu (Xavier) 
177a3d4f4d2SWei Hu (Xavier) 		/* calc how many bd valid */
178a3d4f4d2SWei Hu (Xavier) 		bd_vld = vset_lane_u16(rxdp[0].rx.bdtype_vld_udp0, bd_vld, 0);
179a3d4f4d2SWei Hu (Xavier) 		bd_vld = vset_lane_u16(rxdp[1].rx.bdtype_vld_udp0, bd_vld, 1);
180a3d4f4d2SWei Hu (Xavier) 		bd_vld = vset_lane_u16(rxdp[2].rx.bdtype_vld_udp0, bd_vld, 2);
181a3d4f4d2SWei Hu (Xavier) 		bd_vld = vset_lane_u16(rxdp[3].rx.bdtype_vld_udp0, bd_vld, 3);
182a3d4f4d2SWei Hu (Xavier) 
183a3d4f4d2SWei Hu (Xavier) 		bd_vld = vshl_n_u16(bd_vld,
184a3d4f4d2SWei Hu (Xavier) 				    HNS3_UINT16_BIT - 1 - HNS3_RXD_VLD_B);
185a3d4f4d2SWei Hu (Xavier) 		bd_vld = vreinterpret_u16_s16(
186a3d4f4d2SWei Hu (Xavier) 				vshr_n_s16(vreinterpret_s16_u16(bd_vld),
187a3d4f4d2SWei Hu (Xavier) 					   HNS3_UINT16_BIT - 1));
188a3d4f4d2SWei Hu (Xavier) 		stat = ~vget_lane_u64(vreinterpret_u64_u16(bd_vld), 0);
189a3d4f4d2SWei Hu (Xavier) 		if (likely(stat == 0))
190a3d4f4d2SWei Hu (Xavier) 			bd_valid_num = HNS3_DEFAULT_DESCS_PER_LOOP;
191a3d4f4d2SWei Hu (Xavier) 		else
192191128d7SDavid Marchand 			bd_valid_num = rte_ctz64(stat) / HNS3_UINT16_BIT;
193a3d4f4d2SWei Hu (Xavier) 		if (bd_valid_num == 0)
194a3d4f4d2SWei Hu (Xavier) 			break;
195a3d4f4d2SWei Hu (Xavier) 
1967dd439edSHuisong Li 		/* load 4 mbuf pointer */
1977dd439edSHuisong Li 		mbp1 = vld1q_u64((uint64_t *)&sw_ring[pos]);
1987dd439edSHuisong Li 		mbp2 = vld1q_u64((uint64_t *)&sw_ring[pos + 2]);
1997dd439edSHuisong Li 
2007dd439edSHuisong Li 		/* store 4 mbuf pointer into rx_pkts */
2017dd439edSHuisong Li 		vst1q_u64((uint64_t *)&rx_pkts[pos], mbp1);
2027dd439edSHuisong Li 		vst1q_u64((uint64_t *)&rx_pkts[pos + 2], mbp2);
2037dd439edSHuisong Li 
204a3d4f4d2SWei Hu (Xavier) 		/* use offset to control below data load oper ordering */
205a3d4f4d2SWei Hu (Xavier) 		offset = rxq->offset_table[bd_valid_num];
206a3d4f4d2SWei Hu (Xavier) 
2077dd439edSHuisong Li 		/* read 4 descs */
208a3d4f4d2SWei Hu (Xavier) 		descs[0] = vld2q_u64((uint64_t *)(rxdp + offset));
209a3d4f4d2SWei Hu (Xavier) 		descs[1] = vld2q_u64((uint64_t *)(rxdp + offset + 1));
210a3d4f4d2SWei Hu (Xavier) 		descs[2] = vld2q_u64((uint64_t *)(rxdp + offset + 2));
211a3d4f4d2SWei Hu (Xavier) 		descs[3] = vld2q_u64((uint64_t *)(rxdp + offset + 3));
212a3d4f4d2SWei Hu (Xavier) 
213a3d4f4d2SWei Hu (Xavier) 		pkt_mbuf1.val[0] = vreinterpretq_u8_u64(descs[0].val[0]);
214a3d4f4d2SWei Hu (Xavier) 		pkt_mbuf1.val[1] = vreinterpretq_u8_u64(descs[0].val[1]);
215a3d4f4d2SWei Hu (Xavier) 		pkt_mbuf2.val[0] = vreinterpretq_u8_u64(descs[1].val[0]);
216a3d4f4d2SWei Hu (Xavier) 		pkt_mbuf2.val[1] = vreinterpretq_u8_u64(descs[1].val[1]);
217a3d4f4d2SWei Hu (Xavier) 		pkt_mbuf3.val[0] = vreinterpretq_u8_u64(descs[2].val[0]);
218a3d4f4d2SWei Hu (Xavier) 		pkt_mbuf3.val[1] = vreinterpretq_u8_u64(descs[2].val[1]);
219a3d4f4d2SWei Hu (Xavier) 		pkt_mbuf4.val[0] = vreinterpretq_u8_u64(descs[3].val[0]);
220a3d4f4d2SWei Hu (Xavier) 		pkt_mbuf4.val[1] = vreinterpretq_u8_u64(descs[3].val[1]);
221a3d4f4d2SWei Hu (Xavier) 
2227dd439edSHuisong Li 		/* 4 packets convert format from desc to pktmbuf */
2237dd439edSHuisong Li 		pkt_mb1 = vqtbl2q_u8(pkt_mbuf1, shuf_desc_fields_msk);
2247dd439edSHuisong Li 		pkt_mb2 = vqtbl2q_u8(pkt_mbuf2, shuf_desc_fields_msk);
225a3d4f4d2SWei Hu (Xavier) 		pkt_mb3 = vqtbl2q_u8(pkt_mbuf3, shuf_desc_fields_msk);
226a3d4f4d2SWei Hu (Xavier) 		pkt_mb4 = vqtbl2q_u8(pkt_mbuf4, shuf_desc_fields_msk);
227a3d4f4d2SWei Hu (Xavier) 
2287dd439edSHuisong Li 		/* 4 packets remove crc */
2297dd439edSHuisong Li 		tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb1), crc_adjust);
2307dd439edSHuisong Li 		pkt_mb1 = vreinterpretq_u8_u16(tmp);
2317dd439edSHuisong Li 		tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb2), crc_adjust);
2327dd439edSHuisong Li 		pkt_mb2 = vreinterpretq_u8_u16(tmp);
233a3d4f4d2SWei Hu (Xavier) 		tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb3), crc_adjust);
234a3d4f4d2SWei Hu (Xavier) 		pkt_mb3 = vreinterpretq_u8_u16(tmp);
235a3d4f4d2SWei Hu (Xavier) 		tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb4), crc_adjust);
236a3d4f4d2SWei Hu (Xavier) 		pkt_mb4 = vreinterpretq_u8_u16(tmp);
237a3d4f4d2SWei Hu (Xavier) 
2387dd439edSHuisong Li 		/* save packet info to rx_pkts mbuf */
2397dd439edSHuisong Li 		vst1q_u8((void *)&sw_ring[pos + 0].mbuf->rx_descriptor_fields1,
2407dd439edSHuisong Li 			 pkt_mb1);
2417dd439edSHuisong Li 		vst1q_u8((void *)&sw_ring[pos + 1].mbuf->rx_descriptor_fields1,
2427dd439edSHuisong Li 			 pkt_mb2);
243a3d4f4d2SWei Hu (Xavier) 		vst1q_u8((void *)&sw_ring[pos + 2].mbuf->rx_descriptor_fields1,
244a3d4f4d2SWei Hu (Xavier) 			 pkt_mb3);
245a3d4f4d2SWei Hu (Xavier) 		vst1q_u8((void *)&sw_ring[pos + 3].mbuf->rx_descriptor_fields1,
246a3d4f4d2SWei Hu (Xavier) 			 pkt_mb4);
247a3d4f4d2SWei Hu (Xavier) 
2487dd439edSHuisong Li 		/* store the first 8 bytes of packets mbuf's rearm_data */
2497dd439edSHuisong Li 		*(uint64_t *)&sw_ring[pos + 0].mbuf->rearm_data =
2507dd439edSHuisong Li 			rxq->mbuf_initializer;
2517dd439edSHuisong Li 		*(uint64_t *)&sw_ring[pos + 1].mbuf->rearm_data =
2527dd439edSHuisong Li 			rxq->mbuf_initializer;
2537dd439edSHuisong Li 		*(uint64_t *)&sw_ring[pos + 2].mbuf->rearm_data =
2547dd439edSHuisong Li 			rxq->mbuf_initializer;
2557dd439edSHuisong Li 		*(uint64_t *)&sw_ring[pos + 3].mbuf->rearm_data =
2567dd439edSHuisong Li 			rxq->mbuf_initializer;
2577dd439edSHuisong Li 
258a3d4f4d2SWei Hu (Xavier) 		rte_prefetch_non_temporal(rxdp + HNS3_DEFAULT_DESCS_PER_LOOP);
259a3d4f4d2SWei Hu (Xavier) 
260a3d4f4d2SWei Hu (Xavier) 		parse_retcode = hns3_desc_parse_field(rxq, &sw_ring[pos],
261a3d4f4d2SWei Hu (Xavier) 			&rxdp[offset], bd_valid_num);
262a3d4f4d2SWei Hu (Xavier) 		if (unlikely(parse_retcode))
263a3d4f4d2SWei Hu (Xavier) 			(*bd_err_mask) |= ((uint64_t)parse_retcode) << pos;
264a3d4f4d2SWei Hu (Xavier) 
265a3d4f4d2SWei Hu (Xavier) 		rte_prefetch0(sw_ring[pos +
266a3d4f4d2SWei Hu (Xavier) 				      HNS3_DEFAULT_DESCS_PER_LOOP + 0].mbuf);
267a3d4f4d2SWei Hu (Xavier) 		rte_prefetch0(sw_ring[pos +
268a3d4f4d2SWei Hu (Xavier) 				      HNS3_DEFAULT_DESCS_PER_LOOP + 1].mbuf);
269a3d4f4d2SWei Hu (Xavier) 		rte_prefetch0(sw_ring[pos +
270a3d4f4d2SWei Hu (Xavier) 				      HNS3_DEFAULT_DESCS_PER_LOOP + 2].mbuf);
271a3d4f4d2SWei Hu (Xavier) 		rte_prefetch0(sw_ring[pos +
272a3d4f4d2SWei Hu (Xavier) 				      HNS3_DEFAULT_DESCS_PER_LOOP + 3].mbuf);
273a3d4f4d2SWei Hu (Xavier) 
274a3d4f4d2SWei Hu (Xavier) 		nb_rx += bd_valid_num;
275a3d4f4d2SWei Hu (Xavier) 		if (bd_valid_num < HNS3_DEFAULT_DESCS_PER_LOOP)
276a3d4f4d2SWei Hu (Xavier) 			break;
277a3d4f4d2SWei Hu (Xavier) 	}
278a3d4f4d2SWei Hu (Xavier) 
279a3d4f4d2SWei Hu (Xavier) 	rxq->rx_rearm_nb += nb_rx;
280a3d4f4d2SWei Hu (Xavier) 	rxq->next_to_use += nb_rx;
281a3d4f4d2SWei Hu (Xavier) 	if (rxq->next_to_use >= rxq->nb_rx_desc)
282a3d4f4d2SWei Hu (Xavier) 		rxq->next_to_use = 0;
283a3d4f4d2SWei Hu (Xavier) 
284a3d4f4d2SWei Hu (Xavier) 	return nb_rx;
285a3d4f4d2SWei Hu (Xavier) }
2862ad146efSChengwen Feng #endif /* HNS3_RXTX_VEC_NEON_H */
287