1 #ifndef _LINUX_VIRTIO_H 2 #define _LINUX_VIRTIO_H 3 4 #include "virtio_ring.h" 5 6 #define scatterlist VirtIOBufferDescriptor 7 8 struct VirtIOBufferDescriptor { 9 PHYSICAL_ADDRESS physAddr; 10 ULONG length; 11 }; 12 13 typedef int (*proc_virtqueue_add_buf)( 14 struct virtqueue *vq, 15 struct scatterlist sg[], 16 unsigned int out_num, 17 unsigned int in_num, 18 void *opaque, 19 void *va_indirect, 20 ULONGLONG phys_indirect); 21 22 typedef bool(*proc_virtqueue_kick_prepare)(struct virtqueue *vq); 23 24 typedef void(*proc_virtqueue_kick_always)(struct virtqueue *vq); 25 26 typedef void * (*proc_virtqueue_get_buf)(struct virtqueue *vq, unsigned int *len); 27 28 typedef void(*proc_virtqueue_disable_cb)(struct virtqueue *vq); 29 30 typedef bool(*proc_virtqueue_enable_cb)(struct virtqueue *vq); 31 32 typedef bool(*proc_virtqueue_enable_cb_delayed)(struct virtqueue *vq); 33 34 typedef void * (*proc_virtqueue_detach_unused_buf)(struct virtqueue *vq); 35 36 typedef BOOLEAN(*proc_virtqueue_is_interrupt_enabled)(struct virtqueue *vq); 37 38 typedef BOOLEAN(*proc_virtqueue_has_buf)(struct virtqueue *vq); 39 40 typedef void(*proc_virtqueue_shutdown)(struct virtqueue *vq); 41 42 /* Represents one virtqueue; only data pointed to by the vring structure is exposed to the host */ 43 struct virtqueue { 44 VirtIODevice *vdev; 45 unsigned int index; 46 void (*notification_cb)(struct virtqueue *vq); 47 void *notification_addr; 48 void *avail_va; 49 void *used_va; 50 proc_virtqueue_add_buf add_buf; 51 proc_virtqueue_kick_prepare kick_prepare; 52 proc_virtqueue_kick_always kick_always; 53 proc_virtqueue_get_buf get_buf; 54 proc_virtqueue_disable_cb disable_cb; 55 proc_virtqueue_enable_cb enable_cb; 56 proc_virtqueue_enable_cb_delayed enable_cb_delayed; 57 proc_virtqueue_detach_unused_buf detach_unused_buf; 58 proc_virtqueue_is_interrupt_enabled is_interrupt_enabled; 59 proc_virtqueue_has_buf has_buf; 60 proc_virtqueue_shutdown shutdown; 61 }; 62 63 static inline int virtqueue_add_buf( 64 struct virtqueue *vq, 65 struct scatterlist sg[], 66 unsigned int out_num, 67 unsigned int in_num, 68 void *opaque, 69 void *va_indirect, 70 ULONGLONG phys_indirect) 71 { 72 return vq->add_buf(vq, sg, out_num, in_num, opaque, va_indirect, phys_indirect); 73 } 74 75 static inline bool virtqueue_kick_prepare(struct virtqueue *vq) 76 { 77 return vq->kick_prepare(vq); 78 } 79 80 static inline void virtqueue_kick_always(struct virtqueue *vq) 81 { 82 vq->kick_always(vq); 83 } 84 85 static inline void *virtqueue_get_buf(struct virtqueue *vq, unsigned int *len) 86 { 87 return vq->get_buf(vq, len); 88 } 89 90 static inline void virtqueue_disable_cb(struct virtqueue *vq) 91 { 92 vq->disable_cb(vq); 93 } 94 95 static inline bool virtqueue_enable_cb(struct virtqueue *vq) 96 { 97 return vq->enable_cb(vq); 98 } 99 100 static inline bool virtqueue_enable_cb_delayed(struct virtqueue *vq) 101 { 102 return vq->enable_cb_delayed(vq); 103 } 104 105 static inline void *virtqueue_detach_unused_buf(struct virtqueue *vq) 106 { 107 return vq->detach_unused_buf(vq); 108 } 109 110 static inline BOOLEAN virtqueue_is_interrupt_enabled(struct virtqueue *vq) 111 { 112 return vq->is_interrupt_enabled(vq); 113 } 114 115 static inline BOOLEAN virtqueue_has_buf(struct virtqueue *vq) 116 { 117 return vq->has_buf(vq); 118 } 119 120 static inline void virtqueue_shutdown(struct virtqueue *vq) 121 { 122 vq->shutdown(vq); 123 } 124 125 void virtqueue_notify(struct virtqueue *vq); 126 void virtqueue_kick(struct virtqueue *vq); 127 128 #endif /* _LINUX_VIRTIO_H */ 129