qemu/include/hw/virtio/virtio-scsi.h
<<
>>
Prefs
   1/*
   2 * Virtio SCSI HBA
   3 *
   4 * Copyright IBM, Corp. 2010
   5 *
   6 * Authors:
   7 *  Stefan Hajnoczi    <stefanha@linux.vnet.ibm.com>
   8 *
   9 * This work is licensed under the terms of the GNU GPL, version 2.  See
  10 * the COPYING file in the top-level directory.
  11 *
  12 */
  13
  14#ifndef QEMU_VIRTIO_SCSI_H
  15#define QEMU_VIRTIO_SCSI_H
  16
  17/* Override CDB/sense data size: they are dynamic (guest controlled) in QEMU */
  18#define VIRTIO_SCSI_CDB_SIZE 0
  19#define VIRTIO_SCSI_SENSE_SIZE 0
  20#include "standard-headers/linux/virtio_scsi.h"
  21#include "hw/virtio/virtio.h"
  22#include "hw/pci/pci.h"
  23#include "hw/scsi/scsi.h"
  24#include "sysemu/iothread.h"
  25
  26#define TYPE_VIRTIO_SCSI_COMMON "virtio-scsi-common"
  27#define VIRTIO_SCSI_COMMON(obj) \
  28        OBJECT_CHECK(VirtIOSCSICommon, (obj), TYPE_VIRTIO_SCSI_COMMON)
  29
  30#define TYPE_VIRTIO_SCSI "virtio-scsi-device"
  31#define VIRTIO_SCSI(obj) \
  32        OBJECT_CHECK(VirtIOSCSI, (obj), TYPE_VIRTIO_SCSI)
  33
  34#define VIRTIO_SCSI_VQ_SIZE     128
  35#define VIRTIO_SCSI_MAX_CHANNEL 0
  36#define VIRTIO_SCSI_MAX_TARGET  255
  37#define VIRTIO_SCSI_MAX_LUN     16383
  38
  39typedef struct virtio_scsi_cmd_req VirtIOSCSICmdReq;
  40typedef struct virtio_scsi_cmd_resp VirtIOSCSICmdResp;
  41typedef struct virtio_scsi_ctrl_tmf_req VirtIOSCSICtrlTMFReq;
  42typedef struct virtio_scsi_ctrl_tmf_resp VirtIOSCSICtrlTMFResp;
  43typedef struct virtio_scsi_ctrl_an_req VirtIOSCSICtrlANReq;
  44typedef struct virtio_scsi_ctrl_an_resp VirtIOSCSICtrlANResp;
  45typedef struct virtio_scsi_event VirtIOSCSIEvent;
  46typedef struct virtio_scsi_config VirtIOSCSIConfig;
  47
  48struct VirtIOSCSIConf {
  49    uint32_t num_queues;
  50    uint32_t max_sectors;
  51    uint32_t cmd_per_lun;
  52    char *vhostfd;
  53    char *wwpn;
  54    uint32_t boot_tpgt;
  55    IOThread *iothread;
  56};
  57
  58struct VirtIOSCSI;
  59
  60typedef struct VirtIOSCSICommon {
  61    VirtIODevice parent_obj;
  62    VirtIOSCSIConf conf;
  63
  64    uint32_t sense_size;
  65    uint32_t cdb_size;
  66    VirtQueue *ctrl_vq;
  67    VirtQueue *event_vq;
  68    VirtQueue **cmd_vqs;
  69} VirtIOSCSICommon;
  70
  71typedef struct VirtIOSCSI {
  72    VirtIOSCSICommon parent_obj;
  73
  74    SCSIBus bus;
  75    int resetting;
  76    bool events_dropped;
  77
  78    /* Fields for dataplane below */
  79    AioContext *ctx; /* one iothread per virtio-scsi-pci for now */
  80
  81    bool dataplane_started;
  82    bool dataplane_starting;
  83    bool dataplane_stopping;
  84    bool dataplane_fenced;
  85    uint32_t host_features;
  86} VirtIOSCSI;
  87
  88typedef struct VirtIOSCSIReq {
  89    /* Note:
  90     * - fields up to resp_iov are initialized by virtio_scsi_init_req;
  91     * - fields starting at vring are zeroed by virtio_scsi_init_req.
  92     * */
  93    VirtQueueElement elem;
  94
  95    VirtIOSCSI *dev;
  96    VirtQueue *vq;
  97    QEMUSGList qsgl;
  98    QEMUIOVector resp_iov;
  99
 100    union {
 101        /* Used for two-stage request submission */
 102        QTAILQ_ENTRY(VirtIOSCSIReq) next;
 103
 104        /* Used for cancellation of request during TMFs */
 105        int remaining;
 106    };
 107
 108    SCSIRequest *sreq;
 109    size_t resp_size;
 110    enum SCSIXferMode mode;
 111    union {
 112        VirtIOSCSICmdResp     cmd;
 113        VirtIOSCSICtrlTMFResp tmf;
 114        VirtIOSCSICtrlANResp  an;
 115        VirtIOSCSIEvent       event;
 116    } resp;
 117    union {
 118        VirtIOSCSICmdReq      cmd;
 119        VirtIOSCSICtrlTMFReq  tmf;
 120        VirtIOSCSICtrlANReq   an;
 121    } req;
 122} VirtIOSCSIReq;
 123
 124void virtio_scsi_common_realize(DeviceState *dev, Error **errp,
 125                                VirtIOHandleOutput ctrl, VirtIOHandleOutput evt,
 126                                VirtIOHandleOutput cmd);
 127
 128void virtio_scsi_common_unrealize(DeviceState *dev, Error **errp);
 129void virtio_scsi_handle_event_vq(VirtIOSCSI *s, VirtQueue *vq);
 130void virtio_scsi_handle_cmd_vq(VirtIOSCSI *s, VirtQueue *vq);
 131void virtio_scsi_handle_ctrl_vq(VirtIOSCSI *s, VirtQueue *vq);
 132void virtio_scsi_init_req(VirtIOSCSI *s, VirtQueue *vq, VirtIOSCSIReq *req);
 133void virtio_scsi_free_req(VirtIOSCSIReq *req);
 134void virtio_scsi_push_event(VirtIOSCSI *s, SCSIDevice *dev,
 135                            uint32_t event, uint32_t reason);
 136
 137void virtio_scsi_dataplane_setup(VirtIOSCSI *s, Error **errp);
 138int virtio_scsi_dataplane_start(VirtIODevice *s);
 139void virtio_scsi_dataplane_stop(VirtIODevice *s);
 140
 141#endif /* QEMU_VIRTIO_SCSI_H */
 142