xref: /dpdk/drivers/net/virtio/virtio_rxtx_simple.h (revision d5284f0d593337f57bd21f890189ab306ff8c37d)
15566a3e3SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
25566a3e3SBruce Richardson  * Copyright(c) 2010-2016 Intel Corporation
3f412f14fSJerin Jacob  */
4f412f14fSJerin Jacob 
5f412f14fSJerin Jacob #ifndef _VIRTIO_RXTX_SIMPLE_H_
6f412f14fSJerin Jacob #define _VIRTIO_RXTX_SIMPLE_H_
7f412f14fSJerin Jacob 
8f412f14fSJerin Jacob #include <stdint.h>
9f412f14fSJerin Jacob 
10f412f14fSJerin Jacob #include "virtio_logs.h"
11f412f14fSJerin Jacob #include "virtio_ethdev.h"
12f412f14fSJerin Jacob #include "virtqueue.h"
13f412f14fSJerin Jacob #include "virtio_rxtx.h"
14f412f14fSJerin Jacob 
15f412f14fSJerin Jacob #define RTE_VIRTIO_VPMD_RX_BURST 32
16f412f14fSJerin Jacob #define RTE_VIRTIO_VPMD_RX_REARM_THRESH RTE_VIRTIO_VPMD_RX_BURST
17f412f14fSJerin Jacob 
18f412f14fSJerin Jacob static inline void
virtio_rxq_rearm_vec(struct virtnet_rx * rxvq)19f412f14fSJerin Jacob virtio_rxq_rearm_vec(struct virtnet_rx *rxvq)
20f412f14fSJerin Jacob {
21f412f14fSJerin Jacob 	int i;
22f412f14fSJerin Jacob 	uint16_t desc_idx;
23f412f14fSJerin Jacob 	struct rte_mbuf **sw_ring;
24f412f14fSJerin Jacob 	struct vring_desc *start_dp;
25f412f14fSJerin Jacob 	int ret;
263169550fSMaxime Coquelin 	struct virtqueue *vq = virtnet_rxq_to_vq(rxvq);
27f412f14fSJerin Jacob 
28f412f14fSJerin Jacob 	desc_idx = vq->vq_avail_idx & (vq->vq_nentries - 1);
29*d5284f0dSMaxime Coquelin 	sw_ring = &vq->rxq.sw_ring[desc_idx];
30dfd33aa4STiwei Bie 	start_dp = &vq->vq_split.ring.desc[desc_idx];
31f412f14fSJerin Jacob 
32f412f14fSJerin Jacob 	ret = rte_mempool_get_bulk(rxvq->mpool, (void **)sw_ring,
33f412f14fSJerin Jacob 		RTE_VIRTIO_VPMD_RX_REARM_THRESH);
34f412f14fSJerin Jacob 	if (unlikely(ret)) {
354e6bcde9SMaxime Coquelin 		struct rte_eth_dev *dev = &rte_eth_devices[vq->hw->port_id];
364e6bcde9SMaxime Coquelin 
374e6bcde9SMaxime Coquelin 		dev->data->rx_mbuf_alloc_failed += RTE_VIRTIO_VPMD_RX_REARM_THRESH;
38f412f14fSJerin Jacob 		return;
39f412f14fSJerin Jacob 	}
40f412f14fSJerin Jacob 
41f412f14fSJerin Jacob 	for (i = 0; i < RTE_VIRTIO_VPMD_RX_REARM_THRESH; i++) {
42f412f14fSJerin Jacob 		uintptr_t p;
43f412f14fSJerin Jacob 
44f412f14fSJerin Jacob 		p = (uintptr_t)&sw_ring[i]->rearm_data;
45f412f14fSJerin Jacob 		*(uint64_t *)p = rxvq->mbuf_initializer;
46f412f14fSJerin Jacob 
47ba55c94aSMaxime Coquelin 		start_dp[i].addr = VIRTIO_MBUF_ADDR(sw_ring[i], vq) +
48f412f14fSJerin Jacob 			RTE_PKTMBUF_HEADROOM - vq->hw->vtnet_hdr_size;
49f412f14fSJerin Jacob 		start_dp[i].len = sw_ring[i]->buf_len -
50f412f14fSJerin Jacob 			RTE_PKTMBUF_HEADROOM + vq->hw->vtnet_hdr_size;
51f412f14fSJerin Jacob 	}
52f412f14fSJerin Jacob 
53f412f14fSJerin Jacob 	vq->vq_avail_idx += RTE_VIRTIO_VPMD_RX_REARM_THRESH;
54f412f14fSJerin Jacob 	vq->vq_free_cnt -= RTE_VIRTIO_VPMD_RX_REARM_THRESH;
55f412f14fSJerin Jacob 	vq_update_avail_idx(vq);
56f412f14fSJerin Jacob }
57f412f14fSJerin Jacob 
58f412f14fSJerin Jacob #endif /* _VIRTIO_RXTX_SIMPLE_H_ */
59