From bbaf772058b44a383b4ef81676eccd7a1b503c09 Mon Sep 17 00:00:00 2001 From: Bowen Wang Date: Wed, 20 Nov 2024 10:43:16 +0800 Subject: [PATCH 07/12] virtqueue: move virtqueue_nused and virtqueue_navail to public Use these two apis to judge whether there is buffers in the virtqueues to be processed. Signed-off-by: Bowen Wang --- lib/include/openamp/virtqueue.h | 18 ++++++++ lib/virtio/virtqueue.c | 80 ++++++++++++++++----------------- 2 files changed, 57 insertions(+), 41 deletions(-) diff --git a/lib/include/openamp/virtqueue.h open-amp/lib/include/openamp/virtqueue.h index 92a4a87f10..2d42219be5 100644 --- a/lib/include/openamp/virtqueue.h +++ open-amp/lib/include/openamp/virtqueue.h @@ -428,6 +428,24 @@ static inline int virtqueue_full(struct virtqueue *vq) return (vq->vq_free_cnt == 0); } +/** + * @brief Get number of used buffers in virtqueue + * + * @param vq Pointer to VirtIO queue control block + * + * @return Number of used buffers + */ +int virtqueue_nused(struct virtqueue *vq); + +/** + * @brief Get number of available buffers in virtqueue + * + * @param vq Pointer to VirtIO queue control block + * + * @return Number of available buffers + */ +int virtqueue_navail(struct virtqueue *vq); + #if defined __cplusplus } #endif diff --git a/lib/virtio/virtqueue.c open-amp/lib/virtio/virtqueue.c index d2738faaba..69e3572cd1 100644 --- a/lib/virtio/virtqueue.c +++ open-amp/lib/virtio/virtqueue.c @@ -21,8 +21,6 @@ static int vq_ring_enable_interrupt(struct virtqueue *, uint16_t); static void vq_ring_free_chain(struct virtqueue *, uint16_t); static int vq_ring_must_notify(struct virtqueue *vq); static void vq_ring_notify(struct virtqueue *vq); -static int virtqueue_nused(struct virtqueue *vq); -static int virtqueue_navail(struct virtqueue *vq); /* Default implementation of P2V based on libmetal */ static inline void *virtqueue_phys_to_virt(struct virtqueue *vq, @@ -397,6 +395,45 @@ uint32_t virtqueue_get_desc_size(struct virtqueue *vq) return len; } +/* + * + * virtqueue_nused + * + */ +int virtqueue_nused(struct virtqueue *vq) +{ + uint16_t used_idx, nused; + + /* Used is written by remote */ + VRING_INVALIDATE(&vq->vq_ring.used->idx, sizeof(vq->vq_ring.used->idx)); + used_idx = vq->vq_ring.used->idx; + + nused = (uint16_t)(used_idx - vq->vq_used_cons_idx); + VQASSERT(vq, nused <= vq->vq_nentries, "used more than available"); + + return nused; +} + +/* + * + * virtqueue_navail + * + */ +int virtqueue_navail(struct virtqueue *vq) +{ + uint16_t avail_idx, navail; + + /* Avail is written by driver */ + VRING_INVALIDATE(&vq->vq_ring.avail->idx, sizeof(vq->vq_ring.avail->idx)); + + avail_idx = vq->vq_ring.avail->idx; + + navail = (uint16_t)(avail_idx - vq->vq_available_idx); + VQASSERT(vq, navail <= vq->vq_nentries, "avail more than available"); + + return navail; +} + /************************************************************************** * Helper Functions * **************************************************************************/ @@ -685,42 +722,3 @@ static void vq_ring_notify(struct virtqueue *vq) if (vq->notify) vq->notify(vq); } - -/* - * - * virtqueue_nused - * - */ -static int virtqueue_nused(struct virtqueue *vq) -{ - uint16_t used_idx, nused; - - /* Used is written by remote */ - VRING_INVALIDATE(&vq->vq_ring.used->idx, sizeof(vq->vq_ring.used->idx)); - used_idx = vq->vq_ring.used->idx; - - nused = (uint16_t)(used_idx - vq->vq_used_cons_idx); - VQASSERT(vq, nused <= vq->vq_nentries, "used more than available"); - - return nused; -} - -/* - * - * virtqueue_navail - * - */ -static int virtqueue_navail(struct virtqueue *vq) -{ - uint16_t avail_idx, navail; - - /* Avail is written by driver */ - VRING_INVALIDATE(&vq->vq_ring.avail->idx, sizeof(vq->vq_ring.avail->idx)); - - avail_idx = vq->vq_ring.avail->idx; - - navail = (uint16_t)(avail_idx - vq->vq_available_idx); - VQASSERT(vq, navail <= vq->vq_nentries, "avail more than available"); - - return navail; -} -- 2.34.1