Root/
Source at commit ec7cab4cbb721bff91ec924ec691efd8daf36579 created 12 years 8 months ago. By Maarten ter Huurne, MIPS: JZ4740: A320: Updated quickstart documentation. | |
---|---|
1 | #ifndef LINUX_VIRTIO_H |
2 | #define LINUX_VIRTIO_H |
3 | |
4 | #include <stdbool.h> |
5 | #include <stdlib.h> |
6 | #include <stddef.h> |
7 | #include <stdio.h> |
8 | #include <string.h> |
9 | #include <assert.h> |
10 | |
11 | #include <linux/types.h> |
12 | #include <errno.h> |
13 | |
14 | typedef unsigned long long dma_addr_t; |
15 | |
16 | struct scatterlist { |
17 | unsigned long page_link; |
18 | unsigned int offset; |
19 | unsigned int length; |
20 | dma_addr_t dma_address; |
21 | }; |
22 | |
23 | struct page { |
24 | unsigned long long dummy; |
25 | }; |
26 | |
27 | #define BUG_ON(__BUG_ON_cond) assert(!(__BUG_ON_cond)) |
28 | |
29 | /* Physical == Virtual */ |
30 | #define virt_to_phys(p) ((unsigned long)p) |
31 | #define phys_to_virt(a) ((void *)(unsigned long)(a)) |
32 | /* Page address: Virtual / 4K */ |
33 | #define virt_to_page(p) ((struct page*)((virt_to_phys(p) / 4096) * \ |
34 | sizeof(struct page))) |
35 | #define offset_in_page(p) (((unsigned long)p) % 4096) |
36 | #define sg_phys(sg) ((sg->page_link & ~0x3) / sizeof(struct page) * 4096 + \ |
37 | sg->offset) |
38 | static inline void sg_mark_end(struct scatterlist *sg) |
39 | { |
40 | /* |
41 | * Set termination bit, clear potential chain bit |
42 | */ |
43 | sg->page_link |= 0x02; |
44 | sg->page_link &= ~0x01; |
45 | } |
46 | static inline void sg_init_table(struct scatterlist *sgl, unsigned int nents) |
47 | { |
48 | memset(sgl, 0, sizeof(*sgl) * nents); |
49 | sg_mark_end(&sgl[nents - 1]); |
50 | } |
51 | static inline void sg_assign_page(struct scatterlist *sg, struct page *page) |
52 | { |
53 | unsigned long page_link = sg->page_link & 0x3; |
54 | |
55 | /* |
56 | * In order for the low bit stealing approach to work, pages |
57 | * must be aligned at a 32-bit boundary as a minimum. |
58 | */ |
59 | BUG_ON((unsigned long) page & 0x03); |
60 | sg->page_link = page_link | (unsigned long) page; |
61 | } |
62 | |
63 | static inline void sg_set_page(struct scatterlist *sg, struct page *page, |
64 | unsigned int len, unsigned int offset) |
65 | { |
66 | sg_assign_page(sg, page); |
67 | sg->offset = offset; |
68 | sg->length = len; |
69 | } |
70 | |
71 | static inline void sg_set_buf(struct scatterlist *sg, const void *buf, |
72 | unsigned int buflen) |
73 | { |
74 | sg_set_page(sg, virt_to_page(buf), buflen, offset_in_page(buf)); |
75 | } |
76 | |
77 | static inline void sg_init_one(struct scatterlist *sg, const void *buf, unsigned int buflen) |
78 | { |
79 | sg_init_table(sg, 1); |
80 | sg_set_buf(sg, buf, buflen); |
81 | } |
82 | |
83 | typedef __u16 u16; |
84 | |
85 | typedef enum { |
86 | GFP_KERNEL, |
87 | GFP_ATOMIC, |
88 | } gfp_t; |
89 | typedef enum { |
90 | IRQ_NONE, |
91 | IRQ_HANDLED |
92 | } irqreturn_t; |
93 | |
94 | static inline void *kmalloc(size_t s, gfp_t gfp) |
95 | { |
96 | return malloc(s); |
97 | } |
98 | |
99 | static inline void kfree(void *p) |
100 | { |
101 | free(p); |
102 | } |
103 | |
104 | #define container_of(ptr, type, member) ({ \ |
105 | const typeof( ((type *)0)->member ) *__mptr = (ptr); \ |
106 | (type *)( (char *)__mptr - offsetof(type,member) );}) |
107 | |
108 | #define uninitialized_var(x) x = x |
109 | |
110 | # ifndef likely |
111 | # define likely(x) (__builtin_expect(!!(x), 1)) |
112 | # endif |
113 | # ifndef unlikely |
114 | # define unlikely(x) (__builtin_expect(!!(x), 0)) |
115 | # endif |
116 | |
117 | #define pr_err(format, ...) fprintf (stderr, format, ## __VA_ARGS__) |
118 | #ifdef DEBUG |
119 | #define pr_debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__) |
120 | #else |
121 | #define pr_debug(format, ...) do {} while (0) |
122 | #endif |
123 | #define dev_err(dev, format, ...) fprintf (stderr, format, ## __VA_ARGS__) |
124 | #define dev_warn(dev, format, ...) fprintf (stderr, format, ## __VA_ARGS__) |
125 | |
126 | /* TODO: empty stubs for now. Broken but enough for virtio_ring.c */ |
127 | #define list_add_tail(a, b) do {} while (0) |
128 | #define list_del(a) do {} while (0) |
129 | |
130 | #define BIT_WORD(nr) ((nr) / BITS_PER_LONG) |
131 | #define BITS_PER_BYTE 8 |
132 | #define BITS_PER_LONG (sizeof(long) * BITS_PER_BYTE) |
133 | #define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) |
134 | /* TODO: Not atomic as it should be: |
135 | * we don't use this for anything important. */ |
136 | static inline void clear_bit(int nr, volatile unsigned long *addr) |
137 | { |
138 | unsigned long mask = BIT_MASK(nr); |
139 | unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); |
140 | |
141 | *p &= ~mask; |
142 | } |
143 | |
144 | static inline int test_bit(int nr, const volatile unsigned long *addr) |
145 | { |
146 | return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1))); |
147 | } |
148 | |
149 | /* The only feature we care to support */ |
150 | #define virtio_has_feature(dev, feature) \ |
151 | test_bit((feature), (dev)->features) |
152 | /* end of stubs */ |
153 | |
154 | struct virtio_device { |
155 | void *dev; |
156 | unsigned long features[1]; |
157 | }; |
158 | |
159 | struct virtqueue { |
160 | /* TODO: commented as list macros are empty stubs for now. |
161 | * Broken but enough for virtio_ring.c |
162 | * struct list_head list; */ |
163 | void (*callback)(struct virtqueue *vq); |
164 | const char *name; |
165 | struct virtio_device *vdev; |
166 | void *priv; |
167 | }; |
168 | |
169 | #define EXPORT_SYMBOL_GPL(__EXPORT_SYMBOL_GPL_name) \ |
170 | void __EXPORT_SYMBOL_GPL##__EXPORT_SYMBOL_GPL_name() { \ |
171 | } |
172 | #define MODULE_LICENSE(__MODULE_LICENSE_value) \ |
173 | const char *__MODULE_LICENSE_name = __MODULE_LICENSE_value |
174 | |
175 | #define CONFIG_SMP |
176 | |
177 | #if defined(__i386__) || defined(__x86_64__) |
178 | #define barrier() asm volatile("" ::: "memory") |
179 | #define mb() __sync_synchronize() |
180 | |
181 | #define smp_mb() mb() |
182 | # define smp_rmb() barrier() |
183 | # define smp_wmb() barrier() |
184 | #else |
185 | #error Please fill in barrier macros |
186 | #endif |
187 | |
188 | /* Interfaces exported by virtio_ring. */ |
189 | int virtqueue_add_buf_gfp(struct virtqueue *vq, |
190 | struct scatterlist sg[], |
191 | unsigned int out_num, |
192 | unsigned int in_num, |
193 | void *data, |
194 | gfp_t gfp); |
195 | |
196 | static inline int virtqueue_add_buf(struct virtqueue *vq, |
197 | struct scatterlist sg[], |
198 | unsigned int out_num, |
199 | unsigned int in_num, |
200 | void *data) |
201 | { |
202 | return virtqueue_add_buf_gfp(vq, sg, out_num, in_num, data, GFP_ATOMIC); |
203 | } |
204 | |
205 | void virtqueue_kick(struct virtqueue *vq); |
206 | |
207 | void *virtqueue_get_buf(struct virtqueue *vq, unsigned int *len); |
208 | |
209 | void virtqueue_disable_cb(struct virtqueue *vq); |
210 | |
211 | bool virtqueue_enable_cb(struct virtqueue *vq); |
212 | |
213 | void *virtqueue_detach_unused_buf(struct virtqueue *vq); |
214 | struct virtqueue *vring_new_virtqueue(unsigned int num, |
215 | unsigned int vring_align, |
216 | struct virtio_device *vdev, |
217 | void *pages, |
218 | void (*notify)(struct virtqueue *vq), |
219 | void (*callback)(struct virtqueue *vq), |
220 | const char *name); |
221 | void vring_del_virtqueue(struct virtqueue *vq); |
222 | |
223 | #endif |
224 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9