1 #ifndef _LINUX_VIRTIO_H
2 #define _LINUX_VIRTIO_H
4 #include "virtio_ring.h"
6 #define scatterlist VirtIOBufferDescriptor
8 struct VirtIOBufferDescriptor
{
9 PHYSICAL_ADDRESS physAddr
;
13 typedef int (*proc_virtqueue_add_buf
)(
15 struct scatterlist sg
[],
20 ULONGLONG phys_indirect
);
22 typedef bool(*proc_virtqueue_kick_prepare
)(struct virtqueue
*vq
);
24 typedef void(*proc_virtqueue_kick_always
)(struct virtqueue
*vq
);
26 typedef void * (*proc_virtqueue_get_buf
)(struct virtqueue
*vq
, unsigned int *len
);
28 typedef void(*proc_virtqueue_disable_cb
)(struct virtqueue
*vq
);
30 typedef bool(*proc_virtqueue_enable_cb
)(struct virtqueue
*vq
);
32 typedef bool(*proc_virtqueue_enable_cb_delayed
)(struct virtqueue
*vq
);
34 typedef void * (*proc_virtqueue_detach_unused_buf
)(struct virtqueue
*vq
);
36 typedef BOOLEAN(*proc_virtqueue_is_interrupt_enabled
)(struct virtqueue
*vq
);
38 typedef BOOLEAN(*proc_virtqueue_has_buf
)(struct virtqueue
*vq
);
40 typedef void(*proc_virtqueue_shutdown
)(struct virtqueue
*vq
);
42 /* Represents one virtqueue; only data pointed to by the vring structure is exposed to the host */
46 void (*notification_cb
)(struct virtqueue
*vq
);
47 void *notification_addr
;
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
;
63 static inline int virtqueue_add_buf(
65 struct scatterlist sg
[],
70 ULONGLONG phys_indirect
)
72 return vq
->add_buf(vq
, sg
, out_num
, in_num
, opaque
, va_indirect
, phys_indirect
);
75 static inline bool virtqueue_kick_prepare(struct virtqueue
*vq
)
77 return vq
->kick_prepare(vq
);
80 static inline void virtqueue_kick_always(struct virtqueue
*vq
)
85 static inline void *virtqueue_get_buf(struct virtqueue
*vq
, unsigned int *len
)
87 return vq
->get_buf(vq
, len
);
90 static inline void virtqueue_disable_cb(struct virtqueue
*vq
)
95 static inline bool virtqueue_enable_cb(struct virtqueue
*vq
)
97 return vq
->enable_cb(vq
);
100 static inline bool virtqueue_enable_cb_delayed(struct virtqueue
*vq
)
102 return vq
->enable_cb_delayed(vq
);
105 static inline void *virtqueue_detach_unused_buf(struct virtqueue
*vq
)
107 return vq
->detach_unused_buf(vq
);
110 static inline BOOLEAN
virtqueue_is_interrupt_enabled(struct virtqueue
*vq
)
112 return vq
->is_interrupt_enabled(vq
);
115 static inline BOOLEAN
virtqueue_has_buf(struct virtqueue
*vq
)
117 return vq
->has_buf(vq
);
120 static inline void virtqueue_shutdown(struct virtqueue
*vq
)
125 void virtqueue_notify(struct virtqueue
*vq
);
126 void virtqueue_kick(struct virtqueue
*vq
);
128 #endif /* _LINUX_VIRTIO_H */