81 * // A ring of available descriptor heads with free-running index. |
81 * // A ring of available descriptor heads with free-running index. |
82 * __u16 avail_flags; |
82 * __u16 avail_flags; |
83 * __u16 avail_idx; |
83 * __u16 avail_idx; |
84 * __u16 available[num]; |
84 * __u16 available[num]; |
85 * |
85 * |
86 * // Padding to the next page boundary. |
86 * // Padding to the next align boundary. |
87 * char pad[]; |
87 * char pad[]; |
88 * |
88 * |
89 * // A ring of used descriptor heads with free-running index. |
89 * // A ring of used descriptor heads with free-running index. |
90 * __u16 used_flags; |
90 * __u16 used_flags; |
91 * __u16 used_idx; |
91 * __u16 used_idx; |
92 * struct vring_used_elem used[num]; |
92 * struct vring_used_elem used[num]; |
93 * }; |
93 * }; |
94 */ |
94 */ |
95 static inline void vring_init(struct vring *vr, unsigned int num, void *p, |
95 static inline void vring_init(struct vring *vr, unsigned int num, void *p, |
96 unsigned long pagesize) |
96 unsigned long align) |
97 { |
97 { |
98 vr->num = num; |
98 vr->num = num; |
99 vr->desc = p; |
99 vr->desc = p; |
100 vr->avail = p + num*sizeof(struct vring_desc); |
100 vr->avail = p + num*sizeof(struct vring_desc); |
101 vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + pagesize-1) |
101 vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + align-1) |
102 & ~(pagesize - 1)); |
102 & ~(align - 1)); |
103 } |
103 } |
104 |
104 |
105 static inline unsigned vring_size(unsigned int num, unsigned long pagesize) |
105 static inline unsigned vring_size(unsigned int num, unsigned long align) |
106 { |
106 { |
107 return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (2 + num) |
107 return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (2 + num) |
108 + pagesize - 1) & ~(pagesize - 1)) |
108 + align - 1) & ~(align - 1)) |
109 + sizeof(__u16) * 2 + sizeof(struct vring_used_elem) * num; |
109 + sizeof(__u16) * 2 + sizeof(struct vring_used_elem) * num; |
110 } |
110 } |
111 |
111 |
112 #ifdef __KERNEL__ |
112 #ifdef __KERNEL__ |
113 #include <linux/irqreturn.h> |
113 #include <linux/irqreturn.h> |
114 struct virtio_device; |
114 struct virtio_device; |
115 struct virtqueue; |
115 struct virtqueue; |
116 |
116 |
117 struct virtqueue *vring_new_virtqueue(unsigned int num, |
117 struct virtqueue *vring_new_virtqueue(unsigned int num, |
|
118 unsigned int vring_align, |
118 struct virtio_device *vdev, |
119 struct virtio_device *vdev, |
119 void *pages, |
120 void *pages, |
120 void (*notify)(struct virtqueue *vq), |
121 void (*notify)(struct virtqueue *vq), |
121 void (*callback)(struct virtqueue *vq)); |
122 void (*callback)(struct virtqueue *vq)); |
122 void vring_del_virtqueue(struct virtqueue *vq); |
123 void vring_del_virtqueue(struct virtqueue *vq); |