blob: 8e136da2f0e44b4d93fb9d02a0219fd2a097eef7 [file]
From bbaf772058b44a383b4ef81676eccd7a1b503c09 Mon Sep 17 00:00:00 2001
From: Bowen Wang <wangbowen6@xiaomi.com>
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 <wangbowen6@xiaomi.com>
---
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