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 Jacobvirtio_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