virtio-ring.h File Reference

Go to the source code of this file.

Data Structures

struct  vring_desc
struct  vring_avail
struct  vring_used_elem
struct  vring_used
struct  vring
struct  vring_virtqueue
struct  vring_list

Defines

#define PAGE_SHIFT   (12)
#define PAGE_SIZE   (1<<PAGE_SHIFT)
#define PAGE_MASK   (PAGE_SIZE-1)
#define VIRTIO_CONFIG_S_ACKNOWLEDGE   1
#define VIRTIO_CONFIG_S_DRIVER   2
#define VIRTIO_CONFIG_S_DRIVER_OK   4
#define VIRTIO_CONFIG_S_FAILED   0x80
#define MAX_QUEUE_NUM   (512)
#define VRING_DESC_F_NEXT   1
#define VRING_DESC_F_WRITE   2
#define VRING_AVAIL_F_NO_INTERRUPT   1
#define VRING_USED_F_NO_NOTIFY   1
#define vring_size(num)

Typedefs

typedef unsigned char virtio_queue_t [PAGE_MASK+vring_size(MAX_QUEUE_NUM)]

Functions

static void vring_init (struct vring *vr, unsigned int num, unsigned char *queue)
static void vring_enable_cb (struct vring_virtqueue *vq)
static void vring_disable_cb (struct vring_virtqueue *vq)
static int vring_more_used (struct vring_virtqueue *vq)
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)


Define Documentation

#define PAGE_SHIFT   (12)

Definition at line 3 of file virtio-ring.h.

#define PAGE_SIZE   (1<<PAGE_SHIFT)

Definition at line 4 of file virtio-ring.h.

#define PAGE_MASK   (PAGE_SIZE-1)

Definition at line 5 of file virtio-ring.h.

#define VIRTIO_CONFIG_S_ACKNOWLEDGE   1

Definition at line 9 of file virtio-ring.h.

#define VIRTIO_CONFIG_S_DRIVER   2

Definition at line 11 of file virtio-ring.h.

Referenced by virtnet_probe().

#define VIRTIO_CONFIG_S_DRIVER_OK   4

Definition at line 13 of file virtio-ring.h.

Referenced by virtnet_probe().

#define VIRTIO_CONFIG_S_FAILED   0x80

Definition at line 15 of file virtio-ring.h.

#define MAX_QUEUE_NUM   (512)

Definition at line 17 of file virtio-ring.h.

Referenced by vp_find_vq().

#define VRING_DESC_F_NEXT   1

Definition at line 19 of file virtio-ring.h.

Referenced by vring_add_buf(), and vring_detach().

#define VRING_DESC_F_WRITE   2

Definition at line 20 of file virtio-ring.h.

Referenced by vring_add_buf().

#define VRING_AVAIL_F_NO_INTERRUPT   1

Definition at line 22 of file virtio-ring.h.

Referenced by vring_disable_cb(), and vring_enable_cb().

#define VRING_USED_F_NO_NOTIFY   1

Definition at line 24 of file virtio-ring.h.

Referenced by vring_kick().

#define vring_size ( num   ) 

Value:

(((((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))

Definition at line 61 of file virtio-ring.h.


Typedef Documentation

typedef unsigned char virtio_queue_t[PAGE_MASK+vring_size(MAX_QUEUE_NUM)]

Definition at line 67 of file virtio-ring.h.


Function Documentation

static void vring_init ( struct vring vr,
unsigned int  num,
unsigned char *  queue 
) [inline, static]

Definition at line 84 of file virtio-ring.h.

References vring::avail, vring::desc, vring_desc::next, vring::num, PAGE_MASK, phys_to_virt(), vring_avail::ring, vring::used, and virt_to_phys().

Referenced by vp_find_vq().

00086 {
00087    unsigned int i;
00088    unsigned long pa;
00089 
00090         vr->num = num;
00091 
00092    /* physical address of desc must be page aligned */
00093 
00094    pa = virt_to_phys(queue);
00095    pa = (pa + PAGE_MASK) & ~PAGE_MASK;
00096    vr->desc = phys_to_virt(pa);
00097 
00098         vr->avail = (struct vring_avail *)&vr->desc[num];
00099 
00100    /* physical address of used must be page aligned */
00101 
00102    pa = virt_to_phys(&vr->avail->ring[num]);
00103    pa = (pa + PAGE_MASK) & ~PAGE_MASK;
00104         vr->used = phys_to_virt(pa);
00105 
00106    for (i = 0; i < num - 1; i++)
00107            vr->desc[i].next = i + 1;
00108    vr->desc[i].next = 0;
00109 }

static void vring_enable_cb ( struct vring_virtqueue vq  )  [inline, static]

Definition at line 111 of file virtio-ring.h.

References vring::avail, vring_avail::flags, vring_virtqueue::vring, and VRING_AVAIL_F_NO_INTERRUPT.

Referenced by virtnet_irq().

00112 {
00113    vq->vring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT;
00114 }

static void vring_disable_cb ( struct vring_virtqueue vq  )  [inline, static]

Definition at line 116 of file virtio-ring.h.

References vring::avail, vring_avail::flags, vring_virtqueue::vring, and VRING_AVAIL_F_NO_INTERRUPT.

Referenced by virtnet_disable(), and virtnet_irq().

00117 {
00118    vq->vring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
00119 }

static int vring_more_used ( struct vring_virtqueue vq  )  [inline, static]

Definition at line 129 of file virtio-ring.h.

References vring_used::idx, vring_virtqueue::last_used_idx, vring::used, vring_virtqueue::vring, and wmb.

Referenced by virtnet_poll(), virtnet_transmit(), and vring_get_buf().

00130 {
00131    wmb();
00132    return vq->last_used_idx != vq->vring.used->idx;
00133 }

void vring_detach ( struct vring_virtqueue vq,
unsigned int  head 
)

Definition at line 35 of file virtio-ring.c.

References vring::desc, vring_desc::flags, vring_virtqueue::free_head, vring_desc::next, vring_virtqueue::vring, VRING_DESC_F_NEXT, and wmb.

Referenced by vring_get_buf().

00036 {
00037    struct vring *vr = &vq->vring;
00038    unsigned int i;
00039 
00040    /* find end of given descriptor */
00041 
00042    i = head;
00043    while (vr->desc[i].flags & VRING_DESC_F_NEXT)
00044            i = vr->desc[i].next;
00045 
00046    /* link it with free list and point to it */
00047 
00048    vr->desc[i].next = vq->free_head;
00049    wmb();
00050    vq->free_head = head;
00051 }

int vring_get_buf ( struct vring_virtqueue vq,
unsigned int *  len 
)

Definition at line 60 of file virtio-ring.c.

References BUG_ON, vring_used_elem::id, id, vring_virtqueue::last_used_idx, vring_used_elem::len, NULL, vring::num, vring_used::ring, u32, vring::used, vring_virtqueue::vdata, vring_virtqueue::vring, vring_detach(), vring_more_used(), and wmb.

Referenced by virtnet_poll(), and virtnet_transmit().

00061 {
00062    struct vring *vr = &vq->vring;
00063    struct vring_used_elem *elem;
00064    u32 id;
00065    int ret;
00066 
00067    BUG_ON(!vring_more_used(vq));
00068 
00069    elem = &vr->used->ring[vq->last_used_idx % vr->num];
00070    wmb();
00071    id = elem->id;
00072    if (len != NULL)
00073            *len = elem->len;
00074 
00075    ret = vq->vdata[id];
00076 
00077    vring_detach(vq, id);
00078 
00079    vq->last_used_idx++;
00080 
00081    return ret;
00082 }

void vring_add_buf ( struct vring_virtqueue vq,
struct vring_list  list[],
unsigned int  out,
unsigned int  in,
int  index,
int  num_added 
)

Definition at line 84 of file virtio-ring.c.

References vring_list::addr, vring_desc::addr, vring::avail, BUG_ON, vring::desc, vring_desc::flags, vring_virtqueue::free_head, vring_avail::idx, vring_desc::len, vring_list::length, vring_desc::next, vring::num, vring_avail::ring, vring_virtqueue::vdata, virt_to_phys(), vring_virtqueue::vring, VRING_DESC_F_NEXT, VRING_DESC_F_WRITE, and wmb.

Referenced by provide_buffers(), virtnet_poll(), and virtnet_transmit().

00088 {
00089    struct vring *vr = &vq->vring;
00090    int i, avail, head, prev;
00091 
00092    BUG_ON(out + in == 0);
00093 
00094    prev = 0;
00095    head = vq->free_head;
00096    for (i = head; out; i = vr->desc[i].next, out--) {
00097 
00098            vr->desc[i].flags = VRING_DESC_F_NEXT;
00099            vr->desc[i].addr = (u64)virt_to_phys(list->addr);
00100            vr->desc[i].len = list->length;
00101            prev = i;
00102            list++;
00103    }
00104    for ( ; in; i = vr->desc[i].next, in--) {
00105 
00106            vr->desc[i].flags = VRING_DESC_F_NEXT|VRING_DESC_F_WRITE;
00107            vr->desc[i].addr = (u64)virt_to_phys(list->addr);
00108            vr->desc[i].len = list->length;
00109            prev = i;
00110            list++;
00111    }
00112    vr->desc[prev].flags &= ~VRING_DESC_F_NEXT;
00113 
00114    vq->free_head = i;
00115 
00116    vq->vdata[head] = index;
00117 
00118    avail = (vr->avail->idx + num_added) % vr->num;
00119    vr->avail->ring[avail] = head;
00120    wmb();
00121 }

void vring_kick ( unsigned int  ioaddr,
struct vring_virtqueue vq,
int  num_added 
)

Definition at line 123 of file virtio-ring.c.

References vring::avail, vring_used::flags, vring_avail::idx, mb(), vring_virtqueue::queue_index, vring::used, vp_notify(), vring_virtqueue::vring, VRING_USED_F_NO_NOTIFY, and wmb.

Referenced by provide_buffers(), virtnet_poll(), and virtnet_transmit().

00124 {
00125    struct vring *vr = &vq->vring;
00126 
00127    wmb();
00128    vr->avail->idx += num_added;
00129 
00130    mb();
00131    if (!(vr->used->flags & VRING_USED_F_NO_NOTIFY))
00132            vp_notify(ioaddr, vq->queue_index);
00133 }


Generated on Tue Apr 6 20:01:53 2010 for gPXE by  doxygen 1.5.7.1