1 /* 2 * Virtio driver bits 3 * 4 * Copyright (c) 2013 Alexander Graf <agraf@suse.de> 5 * 6 * This work is licensed under the terms of the GNU GPL, version 2 or (at 7 * your option) any later version. See the COPYING file in the top-level 8 * directory. 9 */ 10 11 #ifndef VIRTIO_H 12 #define VIRTIO_H 13 14 /* Status byte for guest to report progress, and synchronize features. */ 15 /* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */ 16 #define VIRTIO_CONFIG_S_ACKNOWLEDGE 1 17 /* We have found a driver for the device. */ 18 #define VIRTIO_CONFIG_S_DRIVER 2 19 /* Driver has used its parts of the config, and is happy */ 20 #define VIRTIO_CONFIG_S_DRIVER_OK 4 21 /* We've given up on this device. */ 22 #define VIRTIO_CONFIG_S_FAILED 0x80 23 24 enum VirtioDevType { 25 VIRTIO_ID_NET = 1, 26 VIRTIO_ID_BLOCK = 2, 27 VIRTIO_ID_CONSOLE = 3, 28 VIRTIO_ID_BALLOON = 5, 29 VIRTIO_ID_SCSI = 8, 30 }; 31 typedef enum VirtioDevType VirtioDevType; 32 33 struct VqInfo { 34 uint64_t queue; 35 uint32_t align; 36 uint16_t index; 37 uint16_t num; 38 } __attribute__((packed)); 39 typedef struct VqInfo VqInfo; 40 41 struct VqConfig { 42 uint16_t index; 43 uint16_t num; 44 } __attribute__((packed)); 45 typedef struct VqConfig VqConfig; 46 47 #define VIRTIO_RING_SIZE (PAGE_SIZE * 8) 48 #define VIRTIO_MAX_VQS 3 49 #define KVM_S390_VIRTIO_RING_ALIGN 4096 50 51 #define VRING_USED_F_NO_NOTIFY 1 52 53 /* This marks a buffer as continuing via the next field. */ 54 #define VRING_DESC_F_NEXT 1 55 /* This marks a buffer as write-only (otherwise read-only). */ 56 #define VRING_DESC_F_WRITE 2 57 /* This means the buffer contains a list of buffer descriptors. */ 58 #define VRING_DESC_F_INDIRECT 4 59 60 /* Internal flag to mark follow-up segments as such */ 61 #define VRING_HIDDEN_IS_CHAIN 256 62 63 /* Virtio ring descriptors: 16 bytes. These can chain together via "next". */ 64 struct VRingDesc { 65 /* Address (guest-physical). */ 66 uint64_t addr; 67 /* Length. */ 68 uint32_t len; 69 /* The flags as indicated above. */ 70 uint16_t flags; 71 /* We chain unused descriptors via this, too */ 72 uint16_t next; 73 } __attribute__((packed)); 74 typedef struct VRingDesc VRingDesc; 75 76 struct VRingAvail { 77 uint16_t flags; 78 uint16_t idx; 79 uint16_t ring[]; 80 } __attribute__((packed)); 81 typedef struct VRingAvail VRingAvail; 82 83 /* uint32_t is used here for ids for padding reasons. */ 84 struct VRingUsedElem { 85 /* Index of start of used descriptor chain. */ 86 uint32_t id; 87 /* Total length of the descriptor chain which was used (written to) */ 88 uint32_t len; 89 } __attribute__((packed)); 90 typedef struct VRingUsedElem VRingUsedElem; 91 92 struct VRingUsed { 93 uint16_t flags; 94 uint16_t idx; 95 VRingUsedElem ring[]; 96 } __attribute__((packed)); 97 typedef struct VRingUsed VRingUsed; 98 99 struct VRing { 100 unsigned int num; 101 int next_idx; 102 int used_idx; 103 VRingDesc *desc; 104 VRingAvail *avail; 105 VRingUsed *used; 106 SubChannelId schid; 107 long cookie; 108 int id; 109 }; 110 typedef struct VRing VRing; 111 112 113 /*********************************************** 114 * Virtio block * 115 ***********************************************/ 116 117 /* 118 * Command types 119 * 120 * Usage is a bit tricky as some bits are used as flags and some are not. 121 * 122 * Rules: 123 * VIRTIO_BLK_T_OUT may be combined with VIRTIO_BLK_T_SCSI_CMD or 124 * VIRTIO_BLK_T_BARRIER. VIRTIO_BLK_T_FLUSH is a command of its own 125 * and may not be combined with any of the other flags. 126 */ 127 128 /* These two define direction. */ 129 #define VIRTIO_BLK_T_IN 0 130 #define VIRTIO_BLK_T_OUT 1 131 132 /* This bit says it's a scsi command, not an actual read or write. */ 133 #define VIRTIO_BLK_T_SCSI_CMD 2 134 135 /* Cache flush command */ 136 #define VIRTIO_BLK_T_FLUSH 4 137 138 /* Barrier before this op. */ 139 #define VIRTIO_BLK_T_BARRIER 0x80000000 140 141 /* This is the first element of the read scatter-gather list. */ 142 struct VirtioBlkOuthdr { 143 /* VIRTIO_BLK_T* */ 144 uint32_t type; 145 /* io priority. */ 146 uint32_t ioprio; 147 /* Sector (ie. 512 byte offset) */ 148 uint64_t sector; 149 }; 150 typedef struct VirtioBlkOuthdr VirtioBlkOuthdr; 151 152 struct VirtioBlkConfig { 153 uint64_t capacity; /* in 512-byte sectors */ 154 uint32_t size_max; /* max segment size (if VIRTIO_BLK_F_SIZE_MAX) */ 155 uint32_t seg_max; /* max number of segments (if VIRTIO_BLK_F_SEG_MAX) */ 156 157 struct VirtioBlkGeometry { 158 uint16_t cylinders; 159 uint8_t heads; 160 uint8_t sectors; 161 } geometry; /* (if VIRTIO_BLK_F_GEOMETRY) */ 162 163 uint32_t blk_size; /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */ 164 165 /* the next 4 entries are guarded by VIRTIO_BLK_F_TOPOLOGY */ 166 uint8_t physical_block_exp; /* exponent for physical blk per logical blk */ 167 uint8_t alignment_offset; /* alignment offset in logical blocks */ 168 uint16_t min_io_size; /* min I/O size without performance penalty 169 in logical blocks */ 170 uint32_t opt_io_size; /* optimal sustained I/O size in logical blks */ 171 172 uint8_t wce; /* writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */ 173 } __attribute__((packed)); 174 typedef struct VirtioBlkConfig VirtioBlkConfig; 175 176 enum guessed_disk_nature_type { 177 VIRTIO_GDN_NONE = 0, 178 VIRTIO_GDN_DASD = 1, 179 VIRTIO_GDN_CDROM = 2, 180 VIRTIO_GDN_SCSI = 3, 181 }; 182 typedef enum guessed_disk_nature_type VirtioGDN; 183 184 VirtioGDN virtio_guessed_disk_nature(void); 185 void virtio_assume_eckd(void); 186 void virtio_assume_iso9660(void); 187 188 bool virtio_ipl_disk_is_valid(void); 189 int virtio_get_block_size(void); 190 uint8_t virtio_get_heads(void); 191 uint8_t virtio_get_sectors(void); 192 uint64_t virtio_get_blocks(void); 193 int virtio_read_many(unsigned long sector, void *load_addr, int sec_num); 194 195 #define VIRTIO_SECTOR_SIZE 512 196 #define VIRTIO_ISO_BLOCK_SIZE 2048 197 #define VIRTIO_SCSI_BLOCK_SIZE 512 198 #define VIRTIO_DASD_DEFAULT_BLOCK_SIZE 4096 199 200 static inline unsigned long virtio_sector_adjust(unsigned long sector) 201 { 202 return sector * (virtio_get_block_size() / VIRTIO_SECTOR_SIZE); 203 } 204 205 struct VirtioScsiConfig { 206 uint32_t num_queues; 207 uint32_t seg_max; 208 uint32_t max_sectors; 209 uint32_t cmd_per_lun; 210 uint32_t event_info_size; 211 uint32_t sense_size; 212 uint32_t cdb_size; 213 uint16_t max_channel; 214 uint16_t max_target; 215 uint32_t max_lun; 216 } __attribute__((packed)); 217 typedef struct VirtioScsiConfig VirtioScsiConfig; 218 219 struct ScsiDevice { 220 uint16_t channel; /* Always 0 in QEMU */ 221 uint16_t target; /* will be scanned over */ 222 uint32_t lun; /* will be reported */ 223 }; 224 typedef struct ScsiDevice ScsiDevice; 225 226 struct VirtioNetConfig { 227 uint8_t mac[6]; 228 /* uint16_t status; */ /* Only with VIRTIO_NET_F_STATUS */ 229 /* uint16_t max_virtqueue_pairs; */ /* Only with VIRTIO_NET_F_MQ */ 230 }; 231 typedef struct VirtioNetConfig VirtioNetConfig; 232 233 struct VDev { 234 int nr_vqs; 235 VRing *vrings; 236 int cmd_vr_idx; 237 void *ring_area; 238 long wait_reply_timeout; 239 VirtioGDN guessed_disk_nature; 240 SubChannelId schid; 241 SenseId senseid; 242 union { 243 VirtioBlkConfig blk; 244 VirtioScsiConfig scsi; 245 VirtioNetConfig net; 246 } config; 247 ScsiDevice *scsi_device; 248 bool is_cdrom; 249 int scsi_block_size; 250 int blk_factor; 251 uint64_t scsi_last_block; 252 uint32_t scsi_dev_cyls; 253 uint8_t scsi_dev_heads; 254 bool scsi_device_selected; 255 ScsiDevice selected_scsi_device; 256 uint64_t netboot_start_addr; 257 uint32_t max_transfer; 258 uint32_t guest_features[2]; 259 }; 260 typedef struct VDev VDev; 261 262 VDev *virtio_get_device(void); 263 VirtioDevType virtio_get_device_type(void); 264 265 struct VirtioCmd { 266 void *data; 267 int size; 268 int flags; 269 }; 270 typedef struct VirtioCmd VirtioCmd; 271 272 bool vring_notify(VRing *vr); 273 int drain_irqs(SubChannelId schid); 274 void vring_send_buf(VRing *vr, void *p, int len, int flags); 275 int vr_poll(VRing *vr); 276 int vring_wait_reply(void); 277 int virtio_run(VDev *vdev, int vqid, VirtioCmd *cmd); 278 void virtio_setup_ccw(VDev *vdev); 279 280 int virtio_net_init(void *mac_addr); 281 282 #endif /* VIRTIO_H */ 283