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" 25244e2898SFam Zheng #include "sysemu/iothread.h" 26973abc7fSStefan Hajnoczi 27292c8e50SPaolo Bonzini #define TYPE_VIRTIO_SCSI_COMMON "virtio-scsi-common" 288063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VirtIOSCSICommon, VIRTIO_SCSI_COMMON) 29292c8e50SPaolo Bonzini 30f574fa8bSKONRAD Frederic #define TYPE_VIRTIO_SCSI "virtio-scsi-device" 318063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(VirtIOSCSI, VIRTIO_SCSI) 323ab1dfddSKONRAD Frederic 33292c8e50SPaolo Bonzini #define VIRTIO_SCSI_MAX_CHANNEL 0 34292c8e50SPaolo Bonzini #define VIRTIO_SCSI_MAX_TARGET 255 35292c8e50SPaolo Bonzini #define VIRTIO_SCSI_MAX_LUN 16383 36292c8e50SPaolo Bonzini 374e5163bdSStefan Hajnoczi /* Number of virtqueues that are always present */ 384e5163bdSStefan Hajnoczi #define VIRTIO_SCSI_VQ_NUM_FIXED 2 394e5163bdSStefan Hajnoczi 406a558822SStefan Hajnoczi #define VIRTIO_SCSI_AUTO_NUM_QUEUES UINT32_MAX 416a558822SStefan Hajnoczi 42019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_cmd_req VirtIOSCSICmdReq; 43019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_cmd_resp VirtIOSCSICmdResp; 44019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_ctrl_tmf_req VirtIOSCSICtrlTMFReq; 45019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_ctrl_tmf_resp VirtIOSCSICtrlTMFResp; 46019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_ctrl_an_req VirtIOSCSICtrlANReq; 47019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_ctrl_an_resp VirtIOSCSICtrlANResp; 48019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_event VirtIOSCSIEvent; 49019adbd3SMichael S. Tsirkin typedef struct virtio_scsi_config VirtIOSCSIConfig; 50292c8e50SPaolo Bonzini 51973abc7fSStefan Hajnoczi struct VirtIOSCSIConf { 52973abc7fSStefan Hajnoczi uint32_t num_queues; 535c0919d0SRichard W.M. Jones uint32_t virtqueue_size; 541bf8a989SDenis Plotnikov bool seg_max_adjust; 55973abc7fSStefan Hajnoczi uint32_t max_sectors; 56973abc7fSStefan Hajnoczi uint32_t cmd_per_lun; 575e9be92dSNicholas Bellinger char *vhostfd; 585e9be92dSNicholas Bellinger char *wwpn; 59f12c1ebdSFelipe Franciosi CharBackend chardev; 609143d5f0SGonglei uint32_t boot_tpgt; 6119d339f1SFam Zheng IOThread *iothread; 62973abc7fSStefan Hajnoczi }; 63973abc7fSStefan Hajnoczi 64244e2898SFam Zheng struct VirtIOSCSI; 65244e2898SFam Zheng 66db1015e9SEduardo Habkost struct VirtIOSCSICommon { 670ac8e139SKONRAD Frederic VirtIODevice parent_obj; 68394e2e4cSKONRAD Frederic VirtIOSCSIConf conf; 69f1b24e84SKONRAD Frederic 70f1b24e84SKONRAD Frederic uint32_t sense_size; 71f1b24e84SKONRAD Frederic uint32_t cdb_size; 72f1b24e84SKONRAD Frederic VirtQueue *ctrl_vq; 73f1b24e84SKONRAD Frederic VirtQueue *event_vq; 7422219527SKONRAD Frederic VirtQueue **cmd_vqs; 75db1015e9SEduardo Habkost }; 76292c8e50SPaolo Bonzini 77*be2c42b9SStefan Hajnoczi struct VirtIOSCSIReq; 78*be2c42b9SStefan Hajnoczi 79db1015e9SEduardo Habkost struct VirtIOSCSI { 80292c8e50SPaolo Bonzini VirtIOSCSICommon parent_obj; 81292c8e50SPaolo Bonzini 82292c8e50SPaolo Bonzini SCSIBus bus; 83*be2c42b9SStefan Hajnoczi int resetting; /* written from main loop thread, read from any thread */ 84292c8e50SPaolo Bonzini bool events_dropped; 8591cb1c9bSFam Zheng 86*be2c42b9SStefan Hajnoczi /* 87*be2c42b9SStefan Hajnoczi * TMFs deferred to main loop BH. These fields are protected by 88*be2c42b9SStefan Hajnoczi * virtio_scsi_acquire(). 89*be2c42b9SStefan Hajnoczi */ 90*be2c42b9SStefan Hajnoczi QEMUBH *tmf_bh; 91*be2c42b9SStefan Hajnoczi QTAILQ_HEAD(, VirtIOSCSIReq) tmf_bh_list; 92*be2c42b9SStefan Hajnoczi 9391cb1c9bSFam Zheng /* Fields for dataplane below */ 9491cb1c9bSFam Zheng AioContext *ctx; /* one iothread per virtio-scsi-pci for now */ 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 1033d69f821SFam Zheng static inline void virtio_scsi_acquire(VirtIOSCSI *s) 1043d69f821SFam Zheng { 1053d69f821SFam Zheng if (s->ctx) { 1063d69f821SFam Zheng aio_context_acquire(s->ctx); 1073d69f821SFam Zheng } 1083d69f821SFam Zheng } 1093d69f821SFam Zheng 1103d69f821SFam Zheng static inline void virtio_scsi_release(VirtIOSCSI *s) 1113d69f821SFam Zheng { 1123d69f821SFam Zheng if (s->ctx) { 1133d69f821SFam Zheng aio_context_release(s->ctx); 1143d69f821SFam Zheng } 1153d69f821SFam Zheng } 1163d69f821SFam Zheng 117bf46e67dSFam Zheng void virtio_scsi_common_realize(DeviceState *dev, 118bf46e67dSFam Zheng VirtIOHandleOutput ctrl, 119bf46e67dSFam Zheng VirtIOHandleOutput evt, 120bf46e67dSFam Zheng VirtIOHandleOutput cmd, 121bf46e67dSFam Zheng Error **errp); 12291d670fbSMing Lei 12312e1dc49SPaolo Bonzini void virtio_scsi_common_unrealize(DeviceState *dev); 124292c8e50SPaolo Bonzini 125ad07cd69SPaolo Bonzini void virtio_scsi_dataplane_setup(VirtIOSCSI *s, Error **errp); 126ad07cd69SPaolo Bonzini int virtio_scsi_dataplane_start(VirtIODevice *s); 127ad07cd69SPaolo Bonzini void virtio_scsi_dataplane_stop(VirtIODevice *s); 12891cb1c9bSFam Zheng 1292a6a4076SMarkus Armbruster #endif /* QEMU_VIRTIO_SCSI_H */ 130