Create a virtio-queue in reversed direction if requested
by the virtio device. This is done by calling the function
vring_new_host_virtqueue().

Signed-off-by: Sjur Brændeland <sjur.brandel...@stericsson.com>
---
 drivers/remoteproc/remoteproc_virtio.c |   15 ++++++++++++---
 1 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/remoteproc/remoteproc_virtio.c 
b/drivers/remoteproc/remoteproc_virtio.c
index a825f67..5866b03 100644
--- a/drivers/remoteproc/remoteproc_virtio.c
+++ b/drivers/remoteproc/remoteproc_virtio.c
@@ -69,6 +69,7 @@ EXPORT_SYMBOL(rproc_vq_interrupt);
 
 static struct virtqueue *rp_find_vq(struct virtio_device *vdev,
                                    unsigned id,
+                                   bool revers,
                                    void (*callback)(struct virtqueue *vq),
                                    const char *name)
 {
@@ -106,8 +107,14 @@ static struct virtqueue *rp_find_vq(struct virtio_device 
*vdev,
         * Create the new vq, and tell virtio we're not interested in
         * the 'weak' smp barriers, since we're talking with a real device.
         */
-       vq = vring_new_virtqueue(id, len, rvring->align, vdev, false, addr,
-                                       rproc_virtio_notify, callback, name);
+       if (revers)
+               vq = vring_new_host_virtqueue(id, len, rvring->align, vdev,
+                                             false, addr, rproc_virtio_notify,
+                                             callback, name);
+       else
+               vq = vring_new_virtqueue(id, len, rvring->align, vdev, false,
+                                        addr, rproc_virtio_notify, callback,
+                                        name);
        if (!vq) {
                dev_err(dev, "vring_new_virtqueue %s failed\n", name);
                rproc_free_vring(rvring);
@@ -145,9 +152,11 @@ static int rproc_virtio_find_vqs(struct virtio_device 
*vdev, unsigned nvqs,
 {
        struct rproc *rproc = vdev_to_rproc(vdev);
        int i, ret;
+       bool revers;
 
        for (i = 0; i < nvqs; ++i) {
-               vqs[i] = rp_find_vq(vdev, i, callbacks[i], names[i]);
+               revers = reversed ? reversed[i] : false;
+               vqs[i] = rp_find_vq(vdev, i, revers, callbacks[i], names[i]);
                if (IS_ERR(vqs[i])) {
                        ret = PTR_ERR(vqs[i]);
                        goto error;
-- 
1.7.5.4

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to