00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef _QEMU_VIRTIO_H
00015 #define _QEMU_VIRTIO_H
00016
00017 #include "hw.h"
00018 #include "pci.h"
00019
00020
00021
00022
00023
00024 #define VIRTIO_CONFIG_S_ACKNOWLEDGE 1
00025
00026 #define VIRTIO_CONFIG_S_DRIVER 2
00027
00028 #define VIRTIO_CONFIG_S_DRIVER_OK 4
00029
00030 #define VIRTIO_CONFIG_S_FAILED 0x80
00031
00032
00033
00034 #define VIRTIO_F_NOTIFY_ON_EMPTY 24
00035
00036 #define VIRTIO_F_BAD_FEATURE 30
00037
00038
00039
00040
00041 #define VRING_DESC_F_NEXT 1
00042
00043 #define VRING_DESC_F_WRITE 2
00044
00045
00046 #define VRING_USED_F_NO_NOTIFY 1
00047
00048 #define VRING_AVAIL_F_NO_INTERRUPT 1
00049
00050 struct VirtQueue;
00051
00052 static inline target_phys_addr_t vring_align(target_phys_addr_t addr,
00053 unsigned long align)
00054 {
00055 return (addr + align - 1) & ~(align - 1);
00056 }
00057
00058 typedef struct VirtQueue VirtQueue;
00059 typedef struct VirtIODevice VirtIODevice;
00060
00061 #define VIRTQUEUE_MAX_SIZE 1024
00062
00063 typedef struct VirtQueueElement
00064 {
00065 unsigned int index;
00066 unsigned int out_num;
00067 unsigned int in_num;
00068 target_phys_addr_t in_addr[VIRTQUEUE_MAX_SIZE];
00069 struct iovec in_sg[VIRTQUEUE_MAX_SIZE];
00070 struct iovec out_sg[VIRTQUEUE_MAX_SIZE];
00071 } VirtQueueElement;
00072
00073 #define VIRTIO_PCI_QUEUE_MAX 16
00074
00075 struct VirtIODevice
00076 {
00077 PCIDevice pci_dev;
00078 const char *name;
00079 uint32_t addr;
00080 uint8_t status;
00081 uint8_t isr;
00082 uint16_t queue_sel;
00083 uint32_t features;
00084 size_t config_len;
00085 void *config;
00086 uint32_t (*get_features)(VirtIODevice *vdev);
00087 uint32_t (*bad_features)(VirtIODevice *vdev);
00088 void (*set_features)(VirtIODevice *vdev, uint32_t val);
00089 void (*get_config)(VirtIODevice *vdev, uint8_t *config);
00090 void (*set_config)(VirtIODevice *vdev, const uint8_t *config);
00091 void (*reset)(VirtIODevice *vdev);
00092 VirtQueue *vq;
00093 };
00094
00095 VirtIODevice *virtio_init_pci(PCIBus *bus, const char *name,
00096 uint16_t vendor, uint16_t device,
00097 uint16_t subvendor, uint16_t subdevice,
00098 uint16_t class_code, uint8_t pif,
00099 size_t config_size, size_t struct_size);
00100
00101 VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
00102 void (*handle_output)(VirtIODevice *,
00103 VirtQueue *));
00104
00105 void virtqueue_push(VirtQueue *vq, const VirtQueueElement *elem,
00106 unsigned int len);
00107 void virtqueue_flush(VirtQueue *vq, unsigned int count);
00108 void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
00109 unsigned int len, unsigned int idx);
00110
00111 int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem);
00112 int virtqueue_avail_bytes(VirtQueue *vq, int in_bytes, int out_bytes);
00113
00114 void virtio_notify(VirtIODevice *vdev, VirtQueue *vq);
00115
00116 void virtio_save(VirtIODevice *vdev, QEMUFile *f);
00117
00118 void virtio_load(VirtIODevice *vdev, QEMUFile *f);
00119
00120 void virtio_cleanup(VirtIODevice *vdev);
00121
00122 void virtio_notify_config(VirtIODevice *vdev);
00123
00124 void virtio_queue_set_notification(VirtQueue *vq, int enable);
00125
00126 int virtio_queue_ready(VirtQueue *vq);
00127
00128 int virtio_queue_empty(VirtQueue *vq);
00129
00130 #endif