summaryrefslogtreecommitdiff
path: root/include/virtio_ring.h
diff options
context:
space:
mode:
authorWill Deacon <willdeacon@google.com>2023-03-29 22:24:57 +0800
committerTom Rini <trini@konsulko.com>2023-04-25 11:53:15 -0400
commit75582fc2e69ac18f03a144d78c6d136d5594c7f5 (patch)
tree306381c64b4a898eb4dc90c703c2bd6520e2fae2 /include/virtio_ring.h
parentda4e8bb09d6ea33618335106ea6a1fc515128123 (diff)
downloadu-boot-75582fc2e69ac18f03a144d78c6d136d5594c7f5.tar.gz
u-boot-75582fc2e69ac18f03a144d78c6d136d5594c7f5.tar.bz2
u-boot-75582fc2e69ac18f03a144d78c6d136d5594c7f5.zip
virtio: Allocate virtqueue in page-size units
In preparation for explicit bouncing of virtqueue pages for devices advertising the VIRTIO_F_IOMMU_PLATFORM feature, introduce a couple of wrappers around virtqueue allocation and freeing operations, ensuring that buffers are handled in terms of page-size units. Signed-off-by: Will Deacon <willdeacon@google.com> [ Paul: pick from the Android tree. Rebase to the upstream ] Signed-off-by: Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org> Cc: Bin Meng <bmeng.cn@gmail.com> Link: https://android.googlesource.com/platform/external/u-boot/+/b4bb5227d4cf4fdfcd8b4e1ff2692d3a54d1482a Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'include/virtio_ring.h')
-rw-r--r--include/virtio_ring.h16
1 files changed, 9 insertions, 7 deletions
diff --git a/include/virtio_ring.h b/include/virtio_ring.h
index c77c212cff..8f8a55c7bd 100644
--- a/include/virtio_ring.h
+++ b/include/virtio_ring.h
@@ -86,6 +86,7 @@ struct vring_used {
struct vring {
unsigned int num;
+ size_t size;
struct vring_desc *desc;
struct vring_avail *avail;
struct vring_used *used;
@@ -137,23 +138,24 @@ struct virtqueue {
#define vring_used_event(vr) ((vr)->avail->ring[(vr)->num])
#define vring_avail_event(vr) (*(__virtio16 *)&(vr)->used->ring[(vr)->num])
+static inline unsigned int vring_size(unsigned int num, unsigned long align)
+{
+ return ((sizeof(struct vring_desc) * num +
+ sizeof(__virtio16) * (3 + num) + align - 1) & ~(align - 1)) +
+ sizeof(__virtio16) * 3 + sizeof(struct vring_used_elem) * num;
+}
+
static inline void vring_init(struct vring *vr, unsigned int num, void *p,
unsigned long align)
{
vr->num = num;
+ vr->size = vring_size(num, align);
vr->desc = p;
vr->avail = p + num * sizeof(struct vring_desc);
vr->used = (void *)(((uintptr_t)&vr->avail->ring[num] +
sizeof(__virtio16) + align - 1) & ~(align - 1));
}
-static inline unsigned int vring_size(unsigned int num, unsigned long align)
-{
- return ((sizeof(struct vring_desc) * num +
- sizeof(__virtio16) * (3 + num) + align - 1) & ~(align - 1)) +
- sizeof(__virtio16) * 3 + sizeof(struct vring_used_elem) * num;
-}
-
/*
* The following is used with USED_EVENT_IDX and AVAIL_EVENT_IDX.
* Assuming a given event_idx value from the other side, if we have just