virtio.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. * Virtio Support
  3. *
  4. * Copyright IBM, Corp. 2007
  5. *
  6. * Authors:
  7. * Anthony Liguori <aliguori@us.ibm.com>
  8. *
  9. * This work is licensed under the terms of the GNU GPL, version 2. See
  10. * the COPYING file in the top-level directory.
  11. *
  12. */
  13. #ifndef _QEMU_VIRTIO_H
  14. #define _QEMU_VIRTIO_H
  15. #include "hw.h"
  16. #include "pci.h"
  17. /* from Linux's linux/virtio_config.h */
  18. /* Status byte for guest to report progress, and synchronize features. */
  19. /* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */
  20. #define VIRTIO_CONFIG_S_ACKNOWLEDGE 1
  21. /* We have found a driver for the device. */
  22. #define VIRTIO_CONFIG_S_DRIVER 2
  23. /* Driver has used its parts of the config, and is happy */
  24. #define VIRTIO_CONFIG_S_DRIVER_OK 4
  25. /* We've given up on this device. */
  26. #define VIRTIO_CONFIG_S_FAILED 0x80
  27. /* We notify when the ring is completely used, even if the guest is supressing
  28. * callbacks */
  29. #define VIRTIO_F_NOTIFY_ON_EMPTY 24
  30. /* A guest should never accept this. It implies negotiation is broken. */
  31. #define VIRTIO_F_BAD_FEATURE 30
  32. /* from Linux's linux/virtio_ring.h */
  33. /* This marks a buffer as continuing via the next field. */
  34. #define VRING_DESC_F_NEXT 1
  35. /* This marks a buffer as write-only (otherwise read-only). */
  36. #define VRING_DESC_F_WRITE 2
  37. /* This means don't notify other side when buffer added. */
  38. #define VRING_USED_F_NO_NOTIFY 1
  39. /* This means don't interrupt guest when buffer consumed. */
  40. #define VRING_AVAIL_F_NO_INTERRUPT 1
  41. struct VirtQueue;
  42. static inline target_phys_addr_t vring_align(target_phys_addr_t addr,
  43. unsigned long align)
  44. {
  45. return (addr + align - 1) & ~(align - 1);
  46. }
  47. typedef struct VirtQueue VirtQueue;
  48. typedef struct VirtIODevice VirtIODevice;
  49. #define VIRTQUEUE_MAX_SIZE 1024
  50. typedef struct VirtQueueElement
  51. {
  52. unsigned int index;
  53. unsigned int out_num;
  54. unsigned int in_num;
  55. target_phys_addr_t in_addr[VIRTQUEUE_MAX_SIZE];
  56. struct iovec in_sg[VIRTQUEUE_MAX_SIZE];
  57. struct iovec out_sg[VIRTQUEUE_MAX_SIZE];
  58. } VirtQueueElement;
  59. #define VIRTIO_PCI_QUEUE_MAX 16
  60. struct VirtIODevice
  61. {
  62. PCIDevice pci_dev;
  63. const char *name;
  64. uint32_t addr;
  65. uint8_t status;
  66. uint8_t isr;
  67. uint16_t queue_sel;
  68. uint32_t features;
  69. size_t config_len;
  70. void *config;
  71. uint32_t (*get_features)(VirtIODevice *vdev);
  72. uint32_t (*bad_features)(VirtIODevice *vdev);
  73. void (*set_features)(VirtIODevice *vdev, uint32_t val);
  74. void (*get_config)(VirtIODevice *vdev, uint8_t *config);
  75. void (*set_config)(VirtIODevice *vdev, const uint8_t *config);
  76. void (*reset)(VirtIODevice *vdev);
  77. VirtQueue *vq;
  78. };
  79. VirtIODevice *virtio_init_pci(PCIBus *bus, const char *name,
  80. uint16_t vendor, uint16_t device,
  81. uint16_t subvendor, uint16_t subdevice,
  82. uint16_t class_code, uint8_t pif,
  83. size_t config_size, size_t struct_size);
  84. VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
  85. void (*handle_output)(VirtIODevice *,
  86. VirtQueue *));
  87. void virtqueue_push(VirtQueue *vq, const VirtQueueElement *elem,
  88. unsigned int len);
  89. void virtqueue_flush(VirtQueue *vq, unsigned int count);
  90. void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
  91. unsigned int len, unsigned int idx);
  92. int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem);
  93. int virtqueue_avail_bytes(VirtQueue *vq, int in_bytes, int out_bytes);
  94. void virtio_notify(VirtIODevice *vdev, VirtQueue *vq);
  95. void virtio_save(VirtIODevice *vdev, QEMUFile *f);
  96. void virtio_load(VirtIODevice *vdev, QEMUFile *f);
  97. void virtio_cleanup(VirtIODevice *vdev);
  98. void virtio_notify_config(VirtIODevice *vdev);
  99. void virtio_queue_set_notification(VirtQueue *vq, int enable);
  100. int virtio_queue_ready(VirtQueue *vq);
  101. int virtio_queue_empty(VirtQueue *vq);
  102. #endif