summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorLaurent Vivier2008-11-19 17:28:29 +0100
committerMichael Brown2008-11-19 20:58:51 +0100
commitb48f37e69a7101428b24900f8e1ba2c8a3561b32 (patch)
treec77e771c6e884d3f562ae72a95e9a31ae58442cf /src/include
parent[virtio] Consolidate virtio-net static data into a struct vring_virtqueue (diff)
downloadipxe-b48f37e69a7101428b24900f8e1ba2c8a3561b32.tar.gz
ipxe-b48f37e69a7101428b24900f8e1ba2c8a3561b32.tar.xz
ipxe-b48f37e69a7101428b24900f8e1ba2c8a3561b32.zip
[virtio] Split virtio-net.c into several files.
Signed-off-by: Laurent Vivier <Laurent.Vivier@bull.net>
Diffstat (limited to 'src/include')
-rw-r--r--src/include/gpxe/virtio-pci.h3
-rw-r--r--src/include/gpxe/virtio-ring.h53
2 files changed, 51 insertions, 5 deletions
diff --git a/src/include/gpxe/virtio-pci.h b/src/include/gpxe/virtio-pci.h
index 3fe1a801..f0c17e8d 100644
--- a/src/include/gpxe/virtio-pci.h
+++ b/src/include/gpxe/virtio-pci.h
@@ -91,4 +91,7 @@ static inline void vp_del_vq(unsigned int ioaddr, int queue_index)
outl(0, ioaddr + VIRTIO_PCI_QUEUE_PFN);
}
+
+int vp_find_vq(unsigned int ioaddr, int queue_index,
+ struct vring_virtqueue *vq);
#endif /* _VIRTIO_PCI_H_ */
diff --git a/src/include/gpxe/virtio-ring.h b/src/include/gpxe/virtio-ring.h
index f23de23a..e96dd371 100644
--- a/src/include/gpxe/virtio-ring.h
+++ b/src/include/gpxe/virtio-ring.h
@@ -58,6 +58,24 @@ struct vring {
struct vring_used *used;
};
+#define vring_size(num) \
+ (((((sizeof(struct vring_desc) * num) + \
+ (sizeof(struct vring_avail) + sizeof(u16) * num)) \
+ + PAGE_MASK) & ~PAGE_MASK) + \
+ (sizeof(struct vring_used) + sizeof(struct vring_used_elem) * num))
+
+typedef unsigned char virtio_queue_t[PAGE_MASK + vring_size(MAX_QUEUE_NUM)];
+
+struct vring_virtqueue {
+ virtio_queue_t queue;
+ struct vring vring;
+ u16 free_head;
+ u16 last_used_idx;
+ u16 vdata[MAX_QUEUE_NUM];
+ /* PCI */
+ int queue_index;
+};
+
struct vring_list {
char *addr;
unsigned int length;
@@ -90,10 +108,35 @@ static inline void vring_init(struct vring *vr,
vr->desc[i].next = 0;
}
-#define vring_size(num) \
- (((((sizeof(struct vring_desc) * num) + \
- (sizeof(struct vring_avail) + sizeof(u16) * num)) \
- + PAGE_MASK) & ~PAGE_MASK) + \
- (sizeof(struct vring_used) + sizeof(struct vring_used_elem) * num))
+static inline void vring_enable_cb(struct vring_virtqueue *vq)
+{
+ vq->vring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT;
+}
+
+static inline void vring_disable_cb(struct vring_virtqueue *vq)
+{
+ vq->vring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
+}
+
+
+/*
+ * vring_more_used
+ *
+ * is there some used buffers ?
+ *
+ */
+
+static inline int vring_more_used(struct vring_virtqueue *vq)
+{
+ wmb();
+ return vq->last_used_idx != vq->vring.used->idx;
+}
+
+void vring_detach(struct vring_virtqueue *vq, unsigned int head);
+int vring_get_buf(struct vring_virtqueue *vq, unsigned int *len);
+void vring_add_buf(struct vring_virtqueue *vq, struct vring_list list[],
+ unsigned int out, unsigned int in,
+ int index, int num_added);
+void vring_kick(unsigned int ioaddr, struct vring_virtqueue *vq, int num_added);
#endif /* _VIRTIO_RING_H_ */