virtio.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #ifndef LINUX_VIRTIO_H
  2. #define LINUX_VIRTIO_H
  3. #include <linux/scatterlist.h>
  4. #include <linux/kernel.h>
  5. /* TODO: empty stubs for now. Broken but enough for virtio_ring.c */
  6. #define list_add_tail(a, b) do {} while (0)
  7. #define list_del(a) do {} while (0)
  8. #define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
  9. #define BITS_PER_BYTE 8
  10. #define BITS_PER_LONG (sizeof(long) * BITS_PER_BYTE)
  11. #define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))
  12. /* TODO: Not atomic as it should be:
  13. * we don't use this for anything important. */
  14. static inline void clear_bit(int nr, volatile unsigned long *addr)
  15. {
  16. unsigned long mask = BIT_MASK(nr);
  17. unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
  18. *p &= ~mask;
  19. }
  20. static inline int test_bit(int nr, const volatile unsigned long *addr)
  21. {
  22. return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
  23. }
  24. /* end of stubs */
  25. struct virtio_device {
  26. void *dev;
  27. unsigned long features[1];
  28. };
  29. struct virtqueue {
  30. /* TODO: commented as list macros are empty stubs for now.
  31. * Broken but enough for virtio_ring.c
  32. * struct list_head list; */
  33. void (*callback)(struct virtqueue *vq);
  34. const char *name;
  35. struct virtio_device *vdev;
  36. unsigned int index;
  37. unsigned int num_free;
  38. void *priv;
  39. };
  40. /* Interfaces exported by virtio_ring. */
  41. int virtqueue_add_sgs(struct virtqueue *vq,
  42. struct scatterlist *sgs[],
  43. unsigned int out_sgs,
  44. unsigned int in_sgs,
  45. void *data,
  46. gfp_t gfp);
  47. int virtqueue_add_outbuf(struct virtqueue *vq,
  48. struct scatterlist sg[], unsigned int num,
  49. void *data,
  50. gfp_t gfp);
  51. int virtqueue_add_inbuf(struct virtqueue *vq,
  52. struct scatterlist sg[], unsigned int num,
  53. void *data,
  54. gfp_t gfp);
  55. void virtqueue_kick(struct virtqueue *vq);
  56. void *virtqueue_get_buf(struct virtqueue *vq, unsigned int *len);
  57. void virtqueue_disable_cb(struct virtqueue *vq);
  58. bool virtqueue_enable_cb(struct virtqueue *vq);
  59. bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
  60. void *virtqueue_detach_unused_buf(struct virtqueue *vq);
  61. struct virtqueue *vring_new_virtqueue(unsigned int index,
  62. unsigned int num,
  63. unsigned int vring_align,
  64. struct virtio_device *vdev,
  65. bool weak_barriers,
  66. void *pages,
  67. void (*notify)(struct virtqueue *vq),
  68. void (*callback)(struct virtqueue *vq),
  69. const char *name);
  70. void vring_del_virtqueue(struct virtqueue *vq);
  71. #endif