[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v2 4/5] plat/drivers: Add 9P transport for virtio 9P
From: Cristian Banu <cristb@xxxxxxxxx> This patch adds the 9P transport driver skeleton for virtio 9P devices, by providing the required connect, disconnect and request callbacks. The request callback is left as a stub to be implemented in the following patches. Signed-off-by: Cristian Banu <cristb@xxxxxxxxx> --- plat/drivers/virtio/virtio_9p.c | 86 +++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 3 deletions(-) diff --git a/plat/drivers/virtio/virtio_9p.c b/plat/drivers/virtio/virtio_9p.c index ab3a1b16..8094ec70 100644 --- a/plat/drivers/virtio/virtio_9p.c +++ b/plat/drivers/virtio/virtio_9p.c @@ -35,6 +35,7 @@ #include <inttypes.h> #include <uk/alloc.h> #include <uk/essentials.h> +#include <uk/9pdev_trans.h> #include <virtio/virtio_bus.h> #include <virtio/virtio_9p.h> #include <uk/plat/spinlock.h> @@ -58,6 +59,83 @@ struct virtio_9p_device { struct virtqueue *vq; /* Hw queue identifier. */ uint16_t hwvq_id; + /* libuk9p associated device (NULL if the device is not in use). */ + struct uk_9pdev *p9dev; +}; + +static int virtio_9p_connect(struct uk_9pdev *p9dev, + const char *device_identifier, + const char *mount_args __unused) +{ + struct virtio_9p_device *dev = NULL; + int rc = 0; + int found = 0; + + ukarch_spin_lock(&virtio_9p_device_list_lock); + uk_list_for_each_entry(dev, &virtio_9p_device_list, _list) { + if (!strcmp(dev->tag, device_identifier)) { + if (dev->p9dev != NULL) { + rc = -EBUSY; + goto out; + } + found = 1; + break; + } + } + + if (!found) { + rc = -EINVAL; + goto out; + } + + /* + * The maximum message size is given by the number of segments. + * + * For read requests, the reply will be able to make use of the large + * msize, and the request will not exceed one segment. + * Similarly for write requests, but in reverse. Other requests should + * not exceed one page for both recv and xmit fcalls. + */ + p9dev->max_msize = (NUM_SEGMENTS - 1) * __PAGE_SIZE; + + dev->p9dev = p9dev; + p9dev->priv = dev; + +out: + ukarch_spin_unlock(&virtio_9p_device_list_lock); + return rc; +} + +static int virtio_9p_disconnect(struct uk_9pdev *p9dev) +{ + struct virtio_9p_device *dev; + + UK_ASSERT(p9dev); + dev = p9dev->priv; + + ukarch_spin_lock(&virtio_9p_device_list_lock); + dev->p9dev = NULL; + ukarch_spin_unlock(&virtio_9p_device_list_lock); + + return 0; +} + +static int virtio_9p_request(struct uk_9pdev *p9dev __unused, + struct uk_9preq *req __unused) +{ + return -EOPNOTSUPP; +} + +static const struct uk_9pdev_trans_ops v9p_trans_ops = { + .connect = virtio_9p_connect, + .disconnect = virtio_9p_disconnect, + .request = virtio_9p_request +}; + +static struct uk_9pdev_trans v9p_trans = { + .name = "virtio", + .ops = &v9p_trans_ops, + .a = NULL /* Set by the driver initialization. */ }; static int virtio_9p_recv(struct virtqueue *vq __unused, void *priv __unused) @@ -185,7 +263,6 @@ static int virtio_9p_start(struct virtio_9p_device *d) static int virtio_9p_add_dev(struct virtio_dev *vdev) { struct virtio_9p_device *d; - unsigned long flags; int rc = 0; UK_ASSERT(vdev != NULL); @@ -204,9 +281,9 @@ static int virtio_9p_add_dev(struct virtio_dev *vdev) if (rc) goto out_free; - ukplat_spin_lock_irqsave(&virtio_9p_device_list_lock, flags); + ukarch_spin_lock(&virtio_9p_device_list_lock); uk_list_add(&d->_list, &virtio_9p_device_list); - ukplat_spin_unlock_irqrestore(&virtio_9p_device_list_lock, flags); + ukarch_spin_unlock(&virtio_9p_device_list_lock); out: return rc; out_free: @@ -224,6 +301,9 @@ static int virtio_9p_drv_init(struct uk_alloc *drv_allocator) } a = drv_allocator; + v9p_trans.a = a; + + rc = uk_9pdev_trans_register(&v9p_trans); out: return rc; } -- 2.20.1 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |