virtio-ccw.h 7.1 KB
Newer Older
1 2 3
/*
 * virtio ccw target definitions
 *
P
Pierre Morel 已提交
4
 * Copyright 2012,2015 IBM Corp.
5
 * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
P
Pierre Morel 已提交
6
 *            Pierre Morel <pmorel@linux.vnet.ibm.com>
7 8 9 10 11 12 13 14 15
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or (at
 * your option) any later version. See the COPYING file in the top-level
 * directory.
 */

#ifndef HW_S390X_VIRTIO_CCW_H
#define HW_S390X_VIRTIO_CCW_H

16 17 18 19
#include "hw/virtio/virtio-blk.h"
#include "hw/virtio/virtio-net.h"
#include "hw/virtio/virtio-serial.h"
#include "hw/virtio/virtio-scsi.h"
20
#ifdef CONFIG_VHOST_SCSI
21
#include "hw/virtio/vhost-scsi.h"
22
#endif
23 24
#include "hw/virtio/virtio-balloon.h"
#include "hw/virtio/virtio-rng.h"
25
#include "hw/virtio/virtio-crypto.h"
26
#include "hw/virtio/virtio-bus.h"
27 28 29
#ifdef CONFIG_VHOST_VSOCK
#include "hw/virtio/vhost-vsock.h"
#endif /* CONFIG_VHOST_VSOCK */
30
#include "hw/virtio/virtio-gpu.h"
31
#include "hw/virtio/virtio-input.h"
32

33 34
#include "hw/s390x/s390_flic.h"
#include "hw/s390x/css.h"
35 36
#include "ccw-device.h"
#include "hw/s390x/css-bridge.h"
37 38 39 40 41 42 43 44 45 46 47 48 49 50

#define VIRTIO_CCW_CU_TYPE 0x3832
#define VIRTIO_CCW_CHPID_TYPE 0x32

#define CCW_CMD_SET_VQ       0x13
#define CCW_CMD_VDEV_RESET   0x33
#define CCW_CMD_READ_FEAT    0x12
#define CCW_CMD_WRITE_FEAT   0x11
#define CCW_CMD_READ_CONF    0x22
#define CCW_CMD_WRITE_CONF   0x21
#define CCW_CMD_WRITE_STATUS 0x31
#define CCW_CMD_SET_IND      0x43
#define CCW_CMD_SET_CONF_IND 0x53
#define CCW_CMD_READ_VQ_CONF 0x32
51
#define CCW_CMD_READ_STATUS  0x72
52
#define CCW_CMD_SET_IND_ADAPTER 0x73
53
#define CCW_CMD_SET_VIRTIO_REV 0x83
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

#define TYPE_VIRTIO_CCW_DEVICE "virtio-ccw-device"
#define VIRTIO_CCW_DEVICE(obj) \
     OBJECT_CHECK(VirtioCcwDevice, (obj), TYPE_VIRTIO_CCW_DEVICE)
#define VIRTIO_CCW_DEVICE_CLASS(klass) \
     OBJECT_CLASS_CHECK(VirtIOCCWDeviceClass, (klass), TYPE_VIRTIO_CCW_DEVICE)
#define VIRTIO_CCW_DEVICE_GET_CLASS(obj) \
     OBJECT_GET_CLASS(VirtIOCCWDeviceClass, (obj), TYPE_VIRTIO_CCW_DEVICE)

typedef struct VirtioBusState VirtioCcwBusState;
typedef struct VirtioBusClass VirtioCcwBusClass;

#define TYPE_VIRTIO_CCW_BUS "virtio-ccw-bus"
#define VIRTIO_CCW_BUS(obj) \
     OBJECT_CHECK(VirtioCcwBus, (obj), TYPE_VIRTIO_CCW_BUS)
#define VIRTIO_CCW_BUS_GET_CLASS(obj) \
    OBJECT_CHECK(VirtioCcwBusState, (obj), TYPE_VIRTIO_CCW_BUS)
#define VIRTIO_CCW_BUS_CLASS(klass) \
    OBJECT_CLASS_CHECK(VirtioCcwBusClass, klass, TYPE_VIRTIO_CCW_BUS)

typedef struct VirtioCcwDevice VirtioCcwDevice;

typedef struct VirtIOCCWDeviceClass {
77
    CCWDeviceClass parent_class;
78
    void (*realize)(VirtioCcwDevice *dev, Error **errp);
79 80 81
    int (*exit)(VirtioCcwDevice *dev);
} VirtIOCCWDeviceClass;

C
Cornelia Huck 已提交
82 83 84 85 86
/* Performance improves when virtqueue kick processing is decoupled from the
 * vcpu thread using ioeventfd for some devices. */
#define VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT 1
#define VIRTIO_CCW_FLAG_USE_IOEVENTFD   (1 << VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT)

87
struct VirtioCcwDevice {
88
    CcwDevice parent_obj;
89
    int revision;
C
Cornelia Huck 已提交
90
    uint32_t max_rev;
91
    VirtioBusState bus;
C
Cornelia Huck 已提交
92
    uint32_t flags;
93
    uint8_t thinint_isc;
94
    AdapterRoutes routes;
95
    /* Guest provided values: */
96 97 98
    IndAddr *indicators;
    IndAddr *indicators2;
    IndAddr *summary_indicator;
99
    uint64_t ind_bit;
100
    bool force_revision_1;
101 102
};

103
/* The maximum virtio revision we support. */
104
#define VIRTIO_CCW_MAX_REV 2
C
Cornelia Huck 已提交
105
static inline int virtio_ccw_rev_max(VirtioCcwDevice *dev)
106
{
C
Cornelia Huck 已提交
107
    return dev->max_rev;
108 109
}

110 111 112 113 114 115 116 117 118 119 120
/* virtio-scsi-ccw */

#define TYPE_VIRTIO_SCSI_CCW "virtio-scsi-ccw"
#define VIRTIO_SCSI_CCW(obj) \
        OBJECT_CHECK(VirtIOSCSICcw, (obj), TYPE_VIRTIO_SCSI_CCW)

typedef struct VirtIOSCSICcw {
    VirtioCcwDevice parent_obj;
    VirtIOSCSI vdev;
} VirtIOSCSICcw;

121
#ifdef CONFIG_VHOST_SCSI
122 123 124 125 126 127 128 129 130 131
/* vhost-scsi-ccw */

#define TYPE_VHOST_SCSI_CCW "vhost-scsi-ccw"
#define VHOST_SCSI_CCW(obj) \
        OBJECT_CHECK(VHostSCSICcw, (obj), TYPE_VHOST_SCSI_CCW)

typedef struct VHostSCSICcw {
    VirtioCcwDevice parent_obj;
    VHostSCSI vdev;
} VHostSCSICcw;
132
#endif
133

134 135 136 137 138 139 140 141 142 143 144
/* virtio-blk-ccw */

#define TYPE_VIRTIO_BLK_CCW "virtio-blk-ccw"
#define VIRTIO_BLK_CCW(obj) \
        OBJECT_CHECK(VirtIOBlkCcw, (obj), TYPE_VIRTIO_BLK_CCW)

typedef struct VirtIOBlkCcw {
    VirtioCcwDevice parent_obj;
    VirtIOBlock vdev;
} VirtIOBlkCcw;

145 146 147 148 149 150 151 152 153 154
/* virtio-balloon-ccw */

#define TYPE_VIRTIO_BALLOON_CCW "virtio-balloon-ccw"
#define VIRTIO_BALLOON_CCW(obj) \
        OBJECT_CHECK(VirtIOBalloonCcw, (obj), TYPE_VIRTIO_BALLOON_CCW)

typedef struct VirtIOBalloonCcw {
    VirtioCcwDevice parent_obj;
    VirtIOBalloon vdev;
} VirtIOBalloonCcw;
155

156 157 158 159 160 161 162 163 164 165 166
/* virtio-serial-ccw */

#define TYPE_VIRTIO_SERIAL_CCW "virtio-serial-ccw"
#define VIRTIO_SERIAL_CCW(obj) \
        OBJECT_CHECK(VirtioSerialCcw, (obj), TYPE_VIRTIO_SERIAL_CCW)

typedef struct VirtioSerialCcw {
    VirtioCcwDevice parent_obj;
    VirtIOSerial vdev;
} VirtioSerialCcw;

167 168 169 170 171 172 173 174 175 176 177
/* virtio-net-ccw */

#define TYPE_VIRTIO_NET_CCW "virtio-net-ccw"
#define VIRTIO_NET_CCW(obj) \
        OBJECT_CHECK(VirtIONetCcw, (obj), TYPE_VIRTIO_NET_CCW)

typedef struct VirtIONetCcw {
    VirtioCcwDevice parent_obj;
    VirtIONet vdev;
} VirtIONetCcw;

178 179 180 181 182 183 184 185 186 187 188
/* virtio-rng-ccw */

#define TYPE_VIRTIO_RNG_CCW "virtio-rng-ccw"
#define VIRTIO_RNG_CCW(obj) \
        OBJECT_CHECK(VirtIORNGCcw, (obj), TYPE_VIRTIO_RNG_CCW)

typedef struct VirtIORNGCcw {
    VirtioCcwDevice parent_obj;
    VirtIORNG vdev;
} VirtIORNGCcw;

189 190 191 192 193 194 195 196 197 198 199
/* virtio-crypto-ccw */

#define TYPE_VIRTIO_CRYPTO_CCW "virtio-crypto-ccw"
#define VIRTIO_CRYPTO_CCW(obj) \
        OBJECT_CHECK(VirtIOCryptoCcw, (obj), TYPE_VIRTIO_CRYPTO_CCW)

typedef struct VirtIOCryptoCcw {
    VirtioCcwDevice parent_obj;
    VirtIOCrypto vdev;
} VirtIOCryptoCcw;

200
VirtIODevice *virtio_ccw_get_vdev(SubchDev *sch);
P
Pierre Morel 已提交
201 202 203 204 205 206 207 208 209 210

#ifdef CONFIG_VIRTFS
#include "hw/9pfs/virtio-9p.h"

#define TYPE_VIRTIO_9P_CCW "virtio-9p-ccw"
#define VIRTIO_9P_CCW(obj) \
    OBJECT_CHECK(V9fsCCWState, (obj), TYPE_VIRTIO_9P_CCW)

typedef struct V9fsCCWState {
    VirtioCcwDevice parent_obj;
W
Wei Liu 已提交
211
    V9fsVirtioState vdev;
P
Pierre Morel 已提交
212 213 214 215
} V9fsCCWState;

#endif /* CONFIG_VIRTFS */

216 217 218 219 220 221 222 223 224 225 226 227
#ifdef CONFIG_VHOST_VSOCK
#define TYPE_VHOST_VSOCK_CCW "vhost-vsock-ccw"
#define VHOST_VSOCK_CCW(obj) \
    OBJECT_CHECK(VHostVSockCCWState, (obj), TYPE_VHOST_VSOCK_CCW)

typedef struct VHostVSockCCWState {
    VirtioCcwDevice parent_obj;
    VHostVSock vdev;
} VHostVSockCCWState;

#endif /* CONFIG_VHOST_VSOCK */

228 229 230 231 232 233 234 235 236
#define TYPE_VIRTIO_GPU_CCW "virtio-gpu-ccw"
#define VIRTIO_GPU_CCW(obj) \
        OBJECT_CHECK(VirtIOGPUCcw, (obj), TYPE_VIRTIO_GPU_CCW)

typedef struct VirtIOGPUCcw {
    VirtioCcwDevice parent_obj;
    VirtIOGPU vdev;
} VirtIOGPUCcw;

237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
#define TYPE_VIRTIO_INPUT_CCW "virtio-input-ccw"
#define VIRTIO_INPUT_CCW(obj) \
        OBJECT_CHECK(VirtIOInputCcw, (obj), TYPE_VIRTIO_INPUT_CCW)

typedef struct VirtIOInputCcw {
    VirtioCcwDevice parent_obj;
    VirtIOInput vdev;
} VirtIOInputCcw;

#define TYPE_VIRTIO_INPUT_HID_CCW "virtio-input-hid-ccw"
#define TYPE_VIRTIO_KEYBOARD_CCW "virtio-keyboard-ccw"
#define TYPE_VIRTIO_MOUSE_CCW "virtio-mouse-ccw"
#define TYPE_VIRTIO_TABLET_CCW "virtio-tablet-ccw"
#define VIRTIO_INPUT_HID_CCW(obj) \
        OBJECT_CHECK(VirtIOInputHIDCcw, (obj), TYPE_VIRTIO_INPUT_HID_CCW)

typedef struct VirtIOInputHIDCcw {
    VirtioCcwDevice parent_obj;
    VirtIOInputHID vdev;
} VirtIOInputHIDCcw;

258
#endif