1 #ifndef KVM__VIRTIO_MMIO_H 2 #define KVM__VIRTIO_MMIO_H 3 4 #include <linux/types.h> 5 #include <linux/virtio_mmio.h> 6 7 #include <kvm/kvm-cpu.h> 8 9 #define VIRTIO_MMIO_MAX_VQ 32 10 #define VIRTIO_MMIO_MAX_CONFIG 1 11 #define VIRTIO_MMIO_IO_SIZE 0x200 12 13 struct kvm; 14 15 struct virtio_mmio_ioevent_param { 16 struct virtio_device *vdev; 17 u32 vq; 18 }; 19 20 struct virtio_mmio_hdr { 21 char magic[4]; 22 u32 version; 23 u32 device_id; 24 u32 vendor_id; 25 u32 host_features; 26 u32 host_features_sel; 27 u32 reserved_1[2]; 28 u32 guest_features; 29 u32 guest_features_sel; 30 u32 guest_page_size; /* legacy */ 31 u32 reserved_2; 32 u32 queue_sel; 33 u32 queue_num_max; 34 u32 queue_num; 35 u32 queue_align; /* legacy */ 36 u32 queue_pfn; /* legacy */ 37 u32 queue_ready; /* modern */ 38 u32 reserved_3[2]; 39 u32 queue_notify; 40 u32 reserved_4[3]; 41 u32 interrupt_state; 42 u32 interrupt_ack; 43 u32 reserved_5[2]; 44 u32 status; 45 u32 reserved_7[3]; 46 u32 queue_desc_low; /* modern */ 47 u32 queue_desc_high; 48 u32 reserved_8[2]; 49 u32 queue_avail_low; 50 u32 queue_avail_high; 51 u32 reserved_9[2]; 52 u32 queue_used_low; 53 u32 queue_used_high; 54 } __attribute__((packed)); 55 56 struct virtio_mmio { 57 u32 addr; 58 void *dev; 59 struct kvm *kvm; 60 u8 irq; 61 struct virtio_mmio_hdr hdr; 62 struct device_header dev_hdr; 63 struct virtio_mmio_ioevent_param ioeventfds[VIRTIO_MMIO_MAX_VQ]; 64 }; 65 66 int virtio_mmio_signal_vq(struct kvm *kvm, struct virtio_device *vdev, u32 vq); 67 int virtio_mmio_signal_config(struct kvm *kvm, struct virtio_device *vdev); 68 int virtio_mmio_exit(struct kvm *kvm, struct virtio_device *vdev); 69 int virtio_mmio_reset(struct kvm *kvm, struct virtio_device *vdev); 70 int virtio_mmio_init(struct kvm *kvm, void *dev, struct virtio_device *vdev, 71 int device_id, int subsys_id, int class); 72 int virtio_mmio_init_ioeventfd(struct kvm *kvm, struct virtio_device *vdev, 73 u32 vq); 74 75 void virtio_mmio_legacy_callback(struct kvm_cpu *vcpu, u64 addr, u8 *data, 76 u32 len, u8 is_write, void *ptr); 77 void virtio_mmio_modern_callback(struct kvm_cpu *vcpu, u64 addr, u8 *data, 78 u32 len, u8 is_write, void *ptr); 79 int virtio_mmio_init_vq(struct kvm *kvm, struct virtio_device *vdev, int vq); 80 void virtio_mmio_exit_vq(struct kvm *kvm, struct virtio_device *vdev, int vq); 81 #endif 82