[virtio] Add legacy driver for KVM virtio-net
[people/dverkamp/gpxe.git] / src / drivers / net / virtio-ring.h
1 #ifndef _VIRTIO_RING_H_
2 # define _VIRTIO_RING_H_
3 #define PAGE_SHIFT (12)
4 #define PAGE_SIZE  (1<<PAGE_SHIFT)
5 #define PAGE_MASK  (PAGE_SIZE-1)
6
7 /* Status byte for guest to report progress, and synchronize features. */
8 /* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */
9 #define VIRTIO_CONFIG_S_ACKNOWLEDGE     1
10 /* We have found a driver for the device. */
11 #define VIRTIO_CONFIG_S_DRIVER          2
12 /* Driver has used its parts of the config, and is happy */
13 #define VIRTIO_CONFIG_S_DRIVER_OK       4
14 /* We've given up on this device. */
15 #define VIRTIO_CONFIG_S_FAILED          0x80
16
17 #define MAX_QUEUE_NUM      (512)
18
19 #define VRING_DESC_F_NEXT  1
20 #define VRING_DESC_F_WRITE 2
21
22 #define VRING_AVAIL_F_NO_INTERRUPT 1
23
24 #define VRING_USED_F_NO_NOTIFY     1
25
26 struct vring_desc
27 {
28    u64 addr;
29    u32 len;
30    u16 flags;
31    u16 next;
32 };
33
34 struct vring_avail
35 {
36    u16 flags;
37    u16 idx;
38    u16 ring[0];
39 };
40
41 struct vring_used_elem
42 {
43    u32 id;
44    u32 len;
45 };
46
47 struct vring_used
48 {
49    u16 flags;
50    u16 idx;
51    struct vring_used_elem ring[];
52 };
53
54 struct vring {
55    unsigned int num;
56    struct vring_desc *desc;
57    struct vring_avail *avail;
58    struct vring_used *used;
59 };
60
61 static inline void vring_init(struct vring *vr,
62                          unsigned int num, unsigned char *queue)
63 {
64    unsigned int i;
65    unsigned long pa;
66
67         vr->num = num;
68
69    /* physical address of desc must be page aligned */
70
71    pa = virt_to_phys(queue);
72    pa = (pa + PAGE_MASK) & ~PAGE_MASK;
73    vr->desc = phys_to_virt(pa);
74
75         vr->avail = (struct vring_avail *)&vr->desc[num];
76
77    /* physical address of used must be page aligned */
78
79    pa = virt_to_phys(&vr->avail->ring[num]);
80    pa = (pa + PAGE_MASK) & ~PAGE_MASK;
81         vr->used = phys_to_virt(pa);
82
83    for (i = 0; i < num - 1; i++)
84            vr->desc[i].next = i + 1;
85    vr->desc[i].next = 0;
86 }
87
88 #define vring_size(num) \
89    (((((sizeof(struct vring_desc) * num) + \
90       (sizeof(struct vring_avail) + sizeof(u16) * num)) \
91          + PAGE_MASK) & ~PAGE_MASK) + \
92          (sizeof(struct vring_used) + sizeof(struct vring_used_elem) * num))
93 #endif /* _VIRTIO_RING_H_ */