u-boot.lists.denx.de archive mirror
 help / color / mirror / Atom feed
From: "Ying-Chun Liu (PaulLiu)" <paul.liu@linaro.org>
To: u-boot@lists.denx.de
Cc: Will Deacon <willdeacon@google.com>,
	Ying-Chun Liu <paul.liu@linaro.org>,
	Bin Meng <bmeng.cn@gmail.com>
Subject: [PATCH 5/6] virtio: Allocate bounce buffers for devices with VIRTIO_F_IOMMU_PLATFORM
Date: Wed, 29 Mar 2023 22:24:59 +0800	[thread overview]
Message-ID: <20230329142500.682922-6-paul.liu@linaro.org> (raw)
In-Reply-To: <20230329142500.682922-1-paul.liu@linaro.org>

From: Will Deacon <willdeacon@google.com>

In preparation for bouncing virtio data for devices advertising the
VIRTIO_F_IOMMU_PLATFORM feature, allocate an array of bounce buffer
structures in the vring, one per descriptor.

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/+/3e052749e7c50c4c1a6014e645ae3b9be3710c07
---
 drivers/virtio/virtio_ring.c | 25 ++++++++++++++++++++-----
 include/virtio_ring.h        |  5 ++++-
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 1bd19add75..de75786ca7 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -6,6 +6,7 @@
  * virtio ring implementation
  */
 
+#include <bouncebuf.h>
 #include <common.h>
 #include <dm.h>
 #include <log.h>
@@ -292,6 +293,7 @@ struct virtqueue *vring_create_virtqueue(unsigned int index, unsigned int num,
 	struct udevice *vdev = uc_priv->vdev;
 	struct virtqueue *vq;
 	void *queue = NULL;
+	struct bounce_buffer *bbs = NULL;
 	struct vring vring;
 
 	/* We assume num is a power of 2 */
@@ -320,17 +322,29 @@ struct virtqueue *vring_create_virtqueue(unsigned int index, unsigned int num,
 		return NULL;
 
 	memset(queue, 0, vring_size(num, vring_align));
-	vring_init(&vring, num, queue, vring_align);
 
-	vq = __vring_new_virtqueue(index, vring, udev);
-	if (!vq) {
-		virtio_free_pages(vdev, queue, DIV_ROUND_UP(vring.size, PAGE_SIZE));
-		return NULL;
+	if (virtio_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM)) {
+		bbs = calloc(num, sizeof(*bbs));
+		if (!bbs)
+			goto err_free_queue;
 	}
+
+	vring_init(&vring, num, queue, vring_align, bbs);
+
+	vq = __vring_new_virtqueue(index, vring, udev);
+	if (!vq)
+		goto err_free_bbs;
+
 	debug("(%s): created vring @ %p for vq @ %p with num %u\n", udev->name,
 	      queue, vq, num);
 
 	return vq;
+
+err_free_bbs:
+	free(bbs);
+err_free_queue:
+	virtio_free_pages(vdev, queue, DIV_ROUND_UP(vring.size, PAGE_SIZE));
+	return NULL;
 }
 
 void vring_del_virtqueue(struct virtqueue *vq)
@@ -339,6 +353,7 @@ void vring_del_virtqueue(struct virtqueue *vq)
 			  DIV_ROUND_UP(vq->vring.size, PAGE_SIZE));
 	free(vq->vring_desc_shadow);
 	list_del(&vq->list);
+	free(vq->vring.bouncebufs);
 	free(vq);
 }
 
diff --git a/include/virtio_ring.h b/include/virtio_ring.h
index 8f8a55c7bd..e8e91044a2 100644
--- a/include/virtio_ring.h
+++ b/include/virtio_ring.h
@@ -87,6 +87,7 @@ struct vring_used {
 struct vring {
 	unsigned int num;
 	size_t size;
+	struct bounce_buffer *bouncebufs;
 	struct vring_desc *desc;
 	struct vring_avail *avail;
 	struct vring_used *used;
@@ -146,10 +147,12 @@ static inline unsigned int vring_size(unsigned int num, unsigned long align)
 }
 
 static inline void vring_init(struct vring *vr, unsigned int num, void *p,
-			      unsigned long align)
+			      unsigned long align,
+			      struct bounce_buffer *bouncebufs)
 {
 	vr->num = num;
 	vr->size = vring_size(num, align);
+	vr->bouncebufs = bouncebufs;
 	vr->desc = p;
 	vr->avail = p + num * sizeof(struct vring_desc);
 	vr->used = (void *)(((uintptr_t)&vr->avail->ring[num] +
-- 
2.39.2


  parent reply	other threads:[~2023-03-29 14:27 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-29 14:24 [PATCH 0/6] virtio: Use bounce buffers when VIRTIO_F_IOMMU_PLATFORM set Ying-Chun Liu (PaulLiu)
2023-03-29 14:24 ` [PATCH 1/6] virtio: Expose VIRTIO_F_IOMMU_PLATFORM in device features Ying-Chun Liu (PaulLiu)
2023-04-01  6:31   ` Simon Glass
2023-03-29 14:24 ` [PATCH 2/6] virtio: pci: Tear down VQs in virtio_pci_reset() Ying-Chun Liu (PaulLiu)
2023-04-01  6:31   ` Simon Glass
2023-03-29 14:24 ` [PATCH 3/6] virtio: Allocate virtqueue in page-size units Ying-Chun Liu (PaulLiu)
2023-04-01  6:31   ` Simon Glass
2023-03-29 14:24 ` [PATCH 4/6] virtio: Add helper functions to attach/detach vring descriptors Ying-Chun Liu (PaulLiu)
2023-04-01  6:32   ` Simon Glass
2023-03-29 14:24 ` Ying-Chun Liu (PaulLiu) [this message]
2023-04-01  6:32   ` [PATCH 5/6] virtio: Allocate bounce buffers for devices with VIRTIO_F_IOMMU_PLATFORM Simon Glass
2023-03-29 14:25 ` [PATCH 6/6] virtio: Use bounce buffers when VIRTIO_F_IOMMU_PLATFORM is set Ying-Chun Liu (PaulLiu)
2023-04-01  6:32   ` Simon Glass
2023-04-25 18:31 ` [PATCH 0/6] virtio: Use bounce buffers when VIRTIO_F_IOMMU_PLATFORM set Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230329142500.682922-6-paul.liu@linaro.org \
    --to=paul.liu@linaro.org \
    --cc=bmeng.cn@gmail.com \
    --cc=u-boot@lists.denx.de \
    --cc=willdeacon@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).