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*32cad1ffSPhilippe Mathieu-Daudé #include "system/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; 5451396556SMike Christie bool worker_per_virtqueue; 551bf8a989SDenis Plotnikov bool seg_max_adjust; 56973abc7fSStefan Hajnoczi uint32_t max_sectors; 57973abc7fSStefan Hajnoczi uint32_t cmd_per_lun; 585e9be92dSNicholas Bellinger char *vhostfd; 595e9be92dSNicholas Bellinger char *wwpn; 60f12c1ebdSFelipe Franciosi CharBackend chardev; 619143d5f0SGonglei uint32_t boot_tpgt; 6219d339f1SFam Zheng IOThread *iothread; 63973abc7fSStefan Hajnoczi }; 64973abc7fSStefan Hajnoczi 65244e2898SFam Zheng struct VirtIOSCSI; 66244e2898SFam Zheng 67db1015e9SEduardo Habkost struct VirtIOSCSICommon { 680ac8e139SKONRAD Frederic VirtIODevice parent_obj; 69394e2e4cSKONRAD Frederic VirtIOSCSIConf conf; 70f1b24e84SKONRAD Frederic 71f1b24e84SKONRAD Frederic uint32_t sense_size; 72f1b24e84SKONRAD Frederic uint32_t cdb_size; 73f1b24e84SKONRAD Frederic VirtQueue *ctrl_vq; 74f1b24e84SKONRAD Frederic VirtQueue *event_vq; 7522219527SKONRAD Frederic VirtQueue **cmd_vqs; 76db1015e9SEduardo Habkost }; 77292c8e50SPaolo Bonzini 78be2c42b9SStefan Hajnoczi struct VirtIOSCSIReq; 79be2c42b9SStefan Hajnoczi 80db1015e9SEduardo Habkost struct VirtIOSCSI { 81292c8e50SPaolo Bonzini VirtIOSCSICommon parent_obj; 82292c8e50SPaolo Bonzini 83292c8e50SPaolo Bonzini SCSIBus bus; 84be2c42b9SStefan Hajnoczi int resetting; /* written from main loop thread, read from any thread */ 85292c8e50SPaolo Bonzini bool events_dropped; 8691cb1c9bSFam Zheng 87be2c42b9SStefan Hajnoczi /* 88be2c42b9SStefan Hajnoczi * TMFs deferred to main loop BH. These fields are protected by 89ed18b1edSStefan Hajnoczi * tmf_bh_lock. 90be2c42b9SStefan Hajnoczi */ 91ed18b1edSStefan Hajnoczi QemuMutex tmf_bh_lock; 92be2c42b9SStefan Hajnoczi QEMUBH *tmf_bh; 93be2c42b9SStefan Hajnoczi QTAILQ_HEAD(, VirtIOSCSIReq) tmf_bh_list; 94be2c42b9SStefan Hajnoczi 9591cb1c9bSFam Zheng /* Fields for dataplane below */ 9691cb1c9bSFam Zheng AioContext *ctx; /* one iothread per virtio-scsi-pci for now */ 9791cb1c9bSFam Zheng 9891cb1c9bSFam Zheng bool dataplane_started; 9991cb1c9bSFam Zheng bool dataplane_starting; 10091cb1c9bSFam Zheng bool dataplane_stopping; 1014adea804SCornelia Huck bool dataplane_fenced; 102da2f84d1SShannon Zhao uint32_t host_features; 103db1015e9SEduardo Habkost }; 104f1b24e84SKONRAD Frederic 105bf46e67dSFam Zheng void virtio_scsi_common_realize(DeviceState *dev, 106bf46e67dSFam Zheng VirtIOHandleOutput ctrl, 107bf46e67dSFam Zheng VirtIOHandleOutput evt, 108bf46e67dSFam Zheng VirtIOHandleOutput cmd, 109bf46e67dSFam Zheng Error **errp); 11091d670fbSMing Lei 11112e1dc49SPaolo Bonzini void virtio_scsi_common_unrealize(DeviceState *dev); 112292c8e50SPaolo Bonzini 113ad07cd69SPaolo Bonzini void virtio_scsi_dataplane_setup(VirtIOSCSI *s, Error **errp); 114ad07cd69SPaolo Bonzini int virtio_scsi_dataplane_start(VirtIODevice *s); 115ad07cd69SPaolo Bonzini void virtio_scsi_dataplane_stop(VirtIODevice *s); 11691cb1c9bSFam Zheng 1172a6a4076SMarkus Armbruster #endif /* QEMU_VIRTIO_SCSI_H */ 118