Bugfixes Xeon Phi Driver startup - removed check for boot info - added initialization...
[barrelfish] / include / virtio / virtio.h
1 /*
2  * Copyright (c) 2014 ETH Zurich.
3  * All rights reserved.
4  *
5  * This file is distributed under the terms in the attached LICENSE file.
6  * If you do not find this file, copies can be found by writing to:
7  * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
8  */
9
10 #ifndef VIRTIO_H
11 #define VIRTIO_H
12
13 #include <barrelfish/barrelfish.h>
14
15
16 /// defines how we map the memory frames
17 #define VIRTIO_VREGION_FLAGS_DEVICE VREGION_FLAGS_READ_WRITE
18 #define VIRTIO_VREGION_FLAGS_RING VREGION_FLAGS_READ_WRITE
19
20
21 /*
22  * Generic Feature Bits
23  */
24
25 /// Generate interrupt if queue is completely used
26 #define VIRTIO_F_NOTIFY_ON_EMPTY (1 << 24)
27
28 /// guest should never set this feature. This indicates faulty drivers
29 #define VIRTIO_F_BAD_FEATURE (1 << 30)
30
31 /// range of the transport related feature bits
32 #define VIRTIO_TRANSPORT_F_START    28
33 #define VIRTIO_TRANSPORT_F_END      32
34
35
36
37 /**
38  * \brief initializes the library for host side operation
39  *
40  * \param guest_base    base address of the guest physical memory
41  * \param guest_size    size of the guest physical memory
42  */
43 errval_t virtio_host_init(lpaddr_t guest_base,
44                           lpaddr_t guest_size);
45
46
47 /**
48  * VirtIO Memory segment
49  */
50
51 struct virtio_buffer_allocator;
52
53 enum virtio_buffer_state {
54     VIRTIO_BUFFER_S_INVALID,
55     VIRTIO_BUFFER_S_FREE,
56     VIRTIO_BUFFER_S_ALLOCED,
57     VIRTIO_BUFFER_S_QUEUED
58 };
59
60 /**
61  * represents a VirtIO buffer to be used
62  */
63 struct virtio_buffer
64 {
65     struct virtio_buffer_allocator *a;
66     enum virtio_buffer_state state;     ///< state of this buffer
67     lpaddr_t paddr;                     ///< physical address of the buffer
68     void *buf;                          ///< mapped virtual address of the buffer
69     size_t   length;                    ///< size of this buffer
70     struct virtio_buffer_list *lhead;   ///< pointer to the buffer list head
71     struct virtio_buffer *next;         ///< pointer to the next buffer in the list
72 };
73
74 /**
75  * represents a list of buffers
76  */
77 struct virtio_buffer_list
78 {
79     struct virtio_buffer *head;
80     struct virtio_buffer *tail;
81     size_t length;
82 };
83
84
85
86 /**
87  * \brief   initializes the buffer allocator and allocates memory for the
88  *          buffers
89  *
90  * \param   alloc   the allocator struct to initialize
91  * \param   nbufs   number of buffers to allocate
92  * \param   bufsz   size of each buffer to allocate
93  *
94  * \return  SYS_ERR_OK on success
95  */
96 errval_t virtio_buffer_alloc_init(struct virtio_buffer_allocator **alloc,
97                                   size_t nbufs,
98                                   size_t bufsz);
99
100 /**
101  * \brief   destroys a buffer allocator by freeing up all the resources used
102  *          by the buffers
103  *
104  * \param   alloc   the allocator to destroy
105  *
106  * \returns SYS_ERR_OK on success
107  */
108 errval_t virtio_buffer_alloc_destroy(struct virtio_buffer_allocator *alloc);
109
110 /**
111  * \brief   allocated a new virti_buffer from the buffer allocator
112  */
113 struct virtio_buffer *virtio_buffer_alloc(struct virtio_buffer_allocator *alloc);
114
115 /**
116  * \brief   frees up a unused buffer by returning it to the allocator
117  *
118  * \param   buf     the buffer to be freed
119  */
120 errval_t virtio_buffer_free(struct virtio_buffer *buf);
121
122 /**
123  * \brief   returns the backing frame capability of a buffer allocator
124  */
125 errval_t virtio_buffer_alloc_get_cap(struct virtio_buffer_allocator *alloc,
126                                      struct capref *ret_cap);
127
128 /**
129  * \brief initializes a new VirtIO buffer list to be used for chaining buffers
130  *
131  * \param bl buffer list to initialize
132  *
133  * \return SYS_ERR_OK on success
134  */
135 errval_t virtio_blist_init(struct virtio_buffer_list *bl);
136
137 /**
138  * \brief frees up the buffer list by returning the buffers to the allocator
139  *
140  * \param bl buffer list to be freed
141  *
142  * \returns SYS_ERR_OK on success
143  */
144 errval_t virtio_blist_free(struct virtio_buffer_list *bl);
145
146 /**
147  * \brief appends a buffer to the tail of buffer list
148  *
149  * \param bl    the list to append the buffer to
150  * \param buf   the buffer to be appended
151  */
152 errval_t virtio_blist_append(struct virtio_buffer_list *bl,
153                              struct virtio_buffer *buf);
154
155 /**
156  * \brief returns and removes the head of the list
157  *
158  * \param bl buffer list
159  *
160  * \returns pointer to virtio_buffer on sucess
161  *          NULL on failuer
162  */
163 struct virtio_buffer *virtio_blist_get(struct virtio_buffer_list *bl);
164
165
166
167 #endif // VIRTIO_H