1973abc7fSStefan Hajnoczi /* 2973abc7fSStefan Hajnoczi * Virtio SCSI HBA 3973abc7fSStefan Hajnoczi * 4973abc7fSStefan Hajnoczi * Copyright IBM, Corp. 2010 5973abc7fSStefan Hajnoczi * 6973abc7fSStefan Hajnoczi * Authors: 7973abc7fSStefan Hajnoczi * Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> 8973abc7fSStefan Hajnoczi * 9973abc7fSStefan Hajnoczi * This work is licensed under the terms of the GNU GPL, version 2. See 10973abc7fSStefan Hajnoczi * the COPYING file in the top-level directory. 11973abc7fSStefan Hajnoczi * 12973abc7fSStefan Hajnoczi */ 13973abc7fSStefan Hajnoczi 142a6a4076SMarkus Armbruster #ifndef QEMU_VIRTIO_SCSI_H 152a6a4076SMarkus Armbruster #define QEMU_VIRTIO_SCSI_H 16db1015e9SEduardo Habkost #include "qom/object.h" 17973abc7fSStefan Hajnoczi 1803325525SMichael S. Tsirkin /* Override CDB/sense data size: they are dynamic (guest controlled) in QEMU */ 1903325525SMichael S. Tsirkin #define VIRTIO_SCSI_CDB_SIZE 0 2003325525SMichael S. Tsirkin #define VIRTIO_SCSI_SENSE_SIZE 0 21019adbd3SMichael S. Tsirkin #include "standard-headers/linux/virtio_scsi.h" 220d09e41aSPaolo Bonzini #include "hw/virtio/virtio.h" 230d09e41aSPaolo Bonzini #include "hw/scsi/scsi.h" 24f12c1ebdSFelipe Franciosi #include "chardev/char-fe.h" 25*2e8e18c2SStefan Hajnoczi #include "qapi/qapi-types-virtio.h" 2632cad1ffSPhilippe Mathieu-Daudé #include "system/iothread.h" 27973abc7fSStefan Hajnoczi 28292c8e50SPaolo Bonzini #define TYPE_VIRTIO_SCSI_COMMON "virtio-scsi-common" 298063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VirtIOSCSICommon, VIRTIO_SCSI_COMMON) 30292c8e50SPaolo Bonzini 31f574fa8bSKONRAD Frederic #define TYPE_VIRTIO_SCSI "virtio-scsi-device" 328063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VirtIOSCSI, VIRTIO_SCSI) 333ab1dfddSKONRAD Frederic 34292c8e50SPaolo Bonzini #define VIRTIO_SCSI_MAX_CHANNEL 0 35292c8e50SPaolo Bonzini #define VIRTIO_SCSI_MAX_TARGET 255 36292c8e50SPaolo Bonzini #define VIRTIO_SCSI_MAX_LUN 16383 37292c8e50SPaolo Bonzini 384e5163bdSStefan Hajnoczi /* Number of virtqueues that are always present */ 394e5163bdSStefan Hajnoczi #define VIRTIO_SCSI_VQ_NUM_FIXED 2 404e5163bdSStefan Hajnoczi 416a558822SStefan Hajnoczi #define VIRTIO_SCSI_AUTO_NUM_QUEUES UINT32_MAX 426a558822SStefan Hajnoczi 43019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_cmd_req VirtIOSCSICmdReq; 44019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_cmd_resp VirtIOSCSICmdResp; 45019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_ctrl_tmf_req VirtIOSCSICtrlTMFReq; 46019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_ctrl_tmf_resp VirtIOSCSICtrlTMFResp; 47019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_ctrl_an_req VirtIOSCSICtrlANReq; 48019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_ctrl_an_resp VirtIOSCSICtrlANResp; 49019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_event VirtIOSCSIEvent; 50019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_config VirtIOSCSIConfig; 51292c8e50SPaolo Bonzini 52973abc7fSStefan Hajnoczi struct VirtIOSCSIConf { 53973abc7fSStefan Hajnoczi uint32_t num_queues; 545c0919d0SRichard W.M. Jones uint32_t virtqueue_size; 5551396556SMike Christie bool worker_per_virtqueue; 561bf8a989SDenis Plotnikov bool seg_max_adjust; 57973abc7fSStefan Hajnoczi uint32_t max_sectors; 58973abc7fSStefan Hajnoczi uint32_t cmd_per_lun; 595e9be92dSNicholas Bellinger char *vhostfd; 605e9be92dSNicholas Bellinger char *wwpn; 61f12c1ebdSFelipe Franciosi CharBackend chardev; 629143d5f0SGonglei uint32_t boot_tpgt; 6319d339f1SFam Zheng IOThread *iothread; 64*2e8e18c2SStefan Hajnoczi IOThreadVirtQueueMappingList *iothread_vq_mapping_list; 65973abc7fSStefan Hajnoczi }; 66973abc7fSStefan Hajnoczi 67244e2898SFam Zheng struct VirtIOSCSI; 68244e2898SFam Zheng 69db1015e9SEduardo Habkost struct VirtIOSCSICommon { 700ac8e139SKONRAD Frederic VirtIODevice parent_obj; 71394e2e4cSKONRAD Frederic VirtIOSCSIConf conf; 72f1b24e84SKONRAD Frederic 73f1b24e84SKONRAD Frederic uint32_t sense_size; 74f1b24e84SKONRAD Frederic uint32_t cdb_size; 75f1b24e84SKONRAD Frederic VirtQueue *ctrl_vq; 76f1b24e84SKONRAD Frederic VirtQueue *event_vq; 7722219527SKONRAD Frederic VirtQueue **cmd_vqs; 78db1015e9SEduardo Habkost }; 79292c8e50SPaolo Bonzini 80be2c42b9SStefan Hajnoczi struct VirtIOSCSIReq; 81be2c42b9SStefan Hajnoczi 82db1015e9SEduardo Habkost struct VirtIOSCSI { 83292c8e50SPaolo Bonzini VirtIOSCSICommon parent_obj; 84292c8e50SPaolo Bonzini 85292c8e50SPaolo Bonzini SCSIBus bus; 86be2c42b9SStefan Hajnoczi int resetting; /* written from main loop thread, read from any thread */ 877d8ab5b2SStefan Hajnoczi 887d8ab5b2SStefan Hajnoczi QemuMutex event_lock; /* protects event_vq and events_dropped */ 89292c8e50SPaolo Bonzini bool events_dropped; 9091cb1c9bSFam Zheng 91b348ca2eSStefan Hajnoczi QemuMutex ctrl_lock; /* protects ctrl_vq */ 92b348ca2eSStefan Hajnoczi 9391cb1c9bSFam Zheng /* Fields for dataplane below */ 94*2e8e18c2SStefan Hajnoczi AioContext **vq_aio_context; /* per-virtqueue AioContext pointer */ 9591cb1c9bSFam Zheng 9691cb1c9bSFam Zheng bool dataplane_started; 9791cb1c9bSFam Zheng bool dataplane_starting; 9891cb1c9bSFam Zheng bool dataplane_stopping; 994adea804SCornelia Huck bool dataplane_fenced; 100da2f84d1SShannon Zhao uint32_t host_features; 101db1015e9SEduardo Habkost }; 102f1b24e84SKONRAD Frederic 103bf46e67dSFam Zheng void virtio_scsi_common_realize(DeviceState *dev, 104bf46e67dSFam Zheng VirtIOHandleOutput ctrl, 105bf46e67dSFam Zheng VirtIOHandleOutput evt, 106bf46e67dSFam Zheng VirtIOHandleOutput cmd, 107bf46e67dSFam Zheng Error **errp); 10891d670fbSMing Lei 10912e1dc49SPaolo Bonzini void virtio_scsi_common_unrealize(DeviceState *dev); 110292c8e50SPaolo Bonzini 111ad07cd69SPaolo Bonzini void virtio_scsi_dataplane_setup(VirtIOSCSI *s, Error **errp); 112*2e8e18c2SStefan Hajnoczi void virtio_scsi_dataplane_cleanup(VirtIOSCSI *s); 113ad07cd69SPaolo Bonzini int virtio_scsi_dataplane_start(VirtIODevice *s); 114ad07cd69SPaolo Bonzini void virtio_scsi_dataplane_stop(VirtIODevice *s); 11591cb1c9bSFam Zheng 1162a6a4076SMarkus Armbruster #endif /* QEMU_VIRTIO_SCSI_H */ 117