aboutsummaryrefslogtreecommitdiff
path: root/hw/s390x/s390-virtio-bus.h
blob: ffd0df708b2dbe9b018646aa3d9d2ade0dee4708 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/*
 * QEMU S390x VirtIO BUS definitions
 *
 * Copyright (c) 2009 Alexander Graf <agraf@suse.de>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
 */
#ifndef HW_S390_VIRTIO_BUS_H
#define HW_S390_VIRTIO_BUS_H 1

#include "hw/virtio/virtio-blk.h"
#include "hw/virtio/virtio-net.h"
#include "hw/virtio/virtio-rng.h"
#include "hw/virtio/virtio-serial.h"
#include "hw/virtio/virtio-scsi.h"
#include "hw/virtio/virtio-bus.h"
#ifdef CONFIG_VHOST_SCSI
#include "hw/virtio/vhost-scsi.h"
#endif

#define VIRTIO_DEV_OFFS_TYPE		0	/* 8 bits */
#define VIRTIO_DEV_OFFS_NUM_VQ		1	/* 8 bits */
#define VIRTIO_DEV_OFFS_FEATURE_LEN	2	/* 8 bits */
#define VIRTIO_DEV_OFFS_CONFIG_LEN	3	/* 8 bits */
#define VIRTIO_DEV_OFFS_STATUS		4	/* 8 bits */
#define VIRTIO_DEV_OFFS_CONFIG		5	/* dynamic */

#define VIRTIO_VQCONFIG_OFFS_TOKEN	0	/* 64 bits */
#define VIRTIO_VQCONFIG_OFFS_ADDRESS	8	/* 64 bits */
#define VIRTIO_VQCONFIG_OFFS_NUM	16	/* 16 bits */
#define VIRTIO_VQCONFIG_LEN		24

#define VIRTIO_RING_LEN			(TARGET_PAGE_SIZE * 3)
#define VIRTIO_VRING_AVAIL_IDX_OFFS 2
#define VIRTIO_VRING_USED_IDX_OFFS 2
#define S390_DEVICE_PAGES		512

#define VIRTIO_PARAM_MASK               0xff
#define VIRTIO_PARAM_VRING_INTERRUPT    0x0
#define VIRTIO_PARAM_CONFIG_CHANGED     0x1
#define VIRTIO_PARAM_DEV_ADD            0x2

#define TYPE_VIRTIO_S390_DEVICE "virtio-s390-device"
#define VIRTIO_S390_DEVICE(obj) \
     OBJECT_CHECK(VirtIOS390Device, (obj), TYPE_VIRTIO_S390_DEVICE)
#define VIRTIO_S390_DEVICE_CLASS(klass) \
     OBJECT_CLASS_CHECK(VirtIOS390DeviceClass, (klass), TYPE_VIRTIO_S390_DEVICE)
#define VIRTIO_S390_DEVICE_GET_CLASS(obj) \
     OBJECT_GET_CLASS(VirtIOS390DeviceClass, (obj), TYPE_VIRTIO_S390_DEVICE)

#define TYPE_S390_VIRTIO_BUS "s390-virtio-bus"
#define S390_VIRTIO_BUS(obj) \
     OBJECT_CHECK(VirtIOS390Bus, (obj), TYPE_S390_VIRTIO_BUS)

/* virtio-s390-bus */

typedef struct VirtioBusState VirtioS390BusState;
typedef struct VirtioBusClass VirtioS390BusClass;

#define TYPE_VIRTIO_S390_BUS "virtio-s390-bus"
#define VIRTIO_S390_BUS(obj) \
        OBJECT_CHECK(VirtioS390BusState, (obj), TYPE_VIRTIO_S390_BUS)
#define VIRTIO_S390_BUS_GET_CLASS(obj) \
        OBJECT_GET_CLASS(VirtioS390BusClass, obj, TYPE_VIRTIO_S390_BUS)
#define VIRTIO_S390_BUS_CLASS(klass) \
        OBJECT_CLASS_CHECK(VirtioS390BusClass, klass, TYPE_VIRTIO_S390_BUS)


typedef struct VirtIOS390Device VirtIOS390Device;

typedef struct VirtIOS390DeviceClass {
    DeviceClass qdev;
    int (*init)(VirtIOS390Device *dev);
} VirtIOS390DeviceClass;

struct VirtIOS390Device {
    DeviceState qdev;
    ram_addr_t dev_offs;
    ram_addr_t feat_offs;
    uint8_t feat_len;
    VirtIODevice *vdev;
    uint32_t host_features;
    VirtioBusState bus;
};

typedef struct VirtIOS390Bus {
    BusState bus;

    VirtIOS390Device *console;
    ram_addr_t dev_page;
    ram_addr_t dev_offs;
    ram_addr_t next_ring;
} VirtIOS390Bus;


void s390_virtio_device_update_status(VirtIOS390Device *dev);

VirtIOS390Device *s390_virtio_bus_console(VirtIOS390Bus *bus);
VirtIOS390Bus *s390_virtio_bus_init(ram_addr_t *ram_size);

VirtIOS390Device *s390_virtio_bus_find_vring(VirtIOS390Bus *bus,
                                             ram_addr_t mem, int *vq_num);
VirtIOS390Device *s390_virtio_bus_find_mem(VirtIOS390Bus *bus, ram_addr_t mem);
void s390_virtio_device_sync(VirtIOS390Device *dev);
void s390_virtio_reset_idx(VirtIOS390Device *dev);

/* virtio-blk-s390 */

#define TYPE_VIRTIO_BLK_S390 "virtio-blk-s390"
#define VIRTIO_BLK_S390(obj) \
        OBJECT_CHECK(VirtIOBlkS390, (obj), TYPE_VIRTIO_BLK_S390)

typedef struct VirtIOBlkS390 {
    VirtIOS390Device parent_obj;
    VirtIOBlock vdev;
} VirtIOBlkS390;

/* virtio-scsi-s390 */

#define TYPE_VIRTIO_SCSI_S390 "virtio-scsi-s390"
#define VIRTIO_SCSI_S390(obj) \
        OBJECT_CHECK(VirtIOSCSIS390, (obj), TYPE_VIRTIO_SCSI_S390)

typedef struct VirtIOSCSIS390 {
    VirtIOS390Device parent_obj;
    VirtIOSCSI vdev;
} VirtIOSCSIS390;

/* virtio-serial-s390 */

#define TYPE_VIRTIO_SERIAL_S390 "virtio-serial-s390"
#define VIRTIO_SERIAL_S390(obj) \
        OBJECT_CHECK(VirtIOSerialS390, (obj), TYPE_VIRTIO_SERIAL_S390)

typedef struct VirtIOSerialS390 {
    VirtIOS390Device parent_obj;
    VirtIOSerial vdev;
} VirtIOSerialS390;

/* virtio-net-s390 */

#define TYPE_VIRTIO_NET_S390 "virtio-net-s390"
#define VIRTIO_NET_S390(obj) \
        OBJECT_CHECK(VirtIONetS390, (obj), TYPE_VIRTIO_NET_S390)

typedef struct VirtIONetS390 {
    VirtIOS390Device parent_obj;
    VirtIONet vdev;
} VirtIONetS390;

/* vhost-scsi-s390 */

#ifdef CONFIG_VHOST_SCSI
#define TYPE_VHOST_SCSI_S390 "vhost-scsi-s390"
#define VHOST_SCSI_S390(obj) \
        OBJECT_CHECK(VHostSCSIS390, (obj), TYPE_VHOST_SCSI_S390)

typedef struct VHostSCSIS390 {
    VirtIOS390Device parent_obj;
    VHostSCSI vdev;
} VHostSCSIS390;
#endif

/* virtio-rng-s390 */

#define TYPE_VIRTIO_RNG_S390 "virtio-rng-s390"
#define VIRTIO_RNG_S390(obj) \
        OBJECT_CHECK(VirtIORNGS390, (obj), TYPE_VIRTIO_RNG_S390)

typedef struct VirtIORNGS390 {
    VirtIOS390Device parent_obj;
    VirtIORNG vdev;
} VirtIORNGS390;

#endif