[SLOF] [PATCH v1 04/27] virtio: introduce helper for initializing virt queue

Nikunj A Dadhania nikunj at linux.vnet.ibm.com
Wed Jan 13 22:16:51 AEDT 2016


Signed-off-by: Nikunj A Dadhania <nikunj at linux.vnet.ibm.com>
---
 lib/libvirtio/virtio-net.h | 12 ------------
 lib/libvirtio/virtio.c     | 21 +++++++++++++++++++++
 lib/libvirtio/virtio.h     | 10 ++++++++++
 3 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/lib/libvirtio/virtio-net.h b/lib/libvirtio/virtio-net.h
index bc7a189..2196f87 100644
--- a/lib/libvirtio/virtio-net.h
+++ b/lib/libvirtio/virtio-net.h
@@ -23,18 +23,6 @@ enum {
 	VQ_TX = 1,	/* Transmit Queue */
 };
 
-struct vqs {
-	uint64_t id;	/* Queue ID */
-	uint32_t size;
-	void *buf_mem;
-	struct vring_desc *desc;
-	struct vring_avail *avail;
-	struct vring_used *used;
-};
-
-/* Device is identified by RX queue ID: */
-#define DEVICE_ID  vq[0].id
-
 extern net_driver_t *virtionet_open(char *mac_addr, int len, struct virtio_device *dev);
 extern void virtionet_close(net_driver_t *driver);
 extern int virtionet_read(char *buf, int len);
diff --git a/lib/libvirtio/virtio.c b/lib/libvirtio/virtio.c
index 8094e3a..7e0d6a3 100644
--- a/lib/libvirtio/virtio.c
+++ b/lib/libvirtio/virtio.c
@@ -10,10 +10,15 @@
  *     IBM Corporation - initial implementation
  *****************************************************************************/
 
+#include <stdio.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
 #include <cpu.h>
 #include <cache.h>
 #include <byteorder.h>
 #include "virtio.h"
+#include "helpers.h"
 
 /* PCI virtio header offsets */
 #define VIRTIOHDR_DEVICE_FEATURES	0
@@ -156,6 +161,22 @@ void virtio_set_qaddr(struct virtio_device *dev, int queue, unsigned int qaddr)
         }
 }
 
+int virtio_queue_init_vq(struct virtio_device *dev, struct vqs *vq, unsigned int id)
+{
+	vq->size = virtio_get_qsize(dev, id);
+	vq->desc = SLOF_alloc_mem_aligned(virtio_vring_size(vq->size), 4096);
+	if (!vq->desc) {
+		printf("memory allocation failed!\n");
+		return false;
+	}
+	memset(vq->desc, 0, virtio_vring_size(vq->size));
+	virtio_set_qaddr(dev, id, (unsigned long)vq->desc);
+	vq->avail = virtio_get_vring_avail(dev, id);
+	vq->used = virtio_get_vring_used(dev, id);
+	vq->id = id;
+	return true;
+}
+
 /**
  * Set device status bits
  */
diff --git a/lib/libvirtio/virtio.h b/lib/libvirtio/virtio.h
index 9293d19..8d3f376 100644
--- a/lib/libvirtio/virtio.h
+++ b/lib/libvirtio/virtio.h
@@ -67,6 +67,15 @@ struct virtio_device {
 	int type;		/* VIRTIO_TYPE_PCI or VIRTIO_TYPE_VIO */
 };
 
+struct vqs {
+	uint64_t id;	/* Queue ID */
+	uint32_t size;
+	void *buf_mem;
+	struct vring_desc *desc;
+	struct vring_avail *avail;
+	struct vring_used *used;
+};
+
 /* Parts of the virtqueue are aligned on a 4096 byte page boundary */
 #define VQ_ALIGN(addr)	(((addr) + 0xfff) & ~0xfff)
 
@@ -78,6 +87,7 @@ extern struct vring_used *virtio_get_vring_used(struct virtio_device *dev, int q
 extern void virtio_fill_desc(struct vring_desc *desc,
                              uint64_t addr, uint32_t len,
                              uint16_t flags, uint16_t next);
+extern int virtio_queue_init_vq(struct virtio_device *dev, struct vqs *vq, unsigned int id);
 
 extern void virtio_reset_device(struct virtio_device *dev);
 extern void virtio_queue_notify(struct virtio_device *dev, int queue);
-- 
2.5.0



More information about the SLOF mailing list