From b48f37e69a7101428b24900f8e1ba2c8a3561b32 Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Wed, 19 Nov 2008 17:28:29 +0100 Subject: [virtio] Split virtio-net.c into several files. Signed-off-by: Laurent Vivier --- src/include/gpxe/virtio-pci.h | 3 +++ src/include/gpxe/virtio-ring.h | 53 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 5 deletions(-) (limited to 'src/include') 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_ */ -- cgit v1.2.3-55-g7522