2009-12-05 14:44:27 +03:00
|
|
|
/*
|
|
|
|
* 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/>.
|
|
|
|
*/
|
|
|
|
|
2010-11-17 15:01:04 +03:00
|
|
|
#include "virtio-net.h"
|
2011-03-29 17:29:31 +04:00
|
|
|
#include "virtio-serial.h"
|
2010-11-17 15:01:04 +03:00
|
|
|
|
2009-12-05 14:44:27 +03:00
|
|
|
#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)
|
2011-04-13 12:55:11 +04:00
|
|
|
#define S390_DEVICE_PAGES 512
|
2009-12-05 14:44:27 +03:00
|
|
|
|
2010-08-23 20:58:34 +04:00
|
|
|
#define VIRTIO_PARAM_MASK 0xff
|
|
|
|
#define VIRTIO_PARAM_VRING_INTERRUPT 0x0
|
|
|
|
#define VIRTIO_PARAM_CONFIG_CHANGED 0x1
|
|
|
|
#define VIRTIO_PARAM_DEV_ADD 0x2
|
|
|
|
|
2011-12-08 07:34:16 +04:00
|
|
|
#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)
|
|
|
|
|
|
|
|
typedef struct VirtIOS390Device VirtIOS390Device;
|
|
|
|
|
|
|
|
typedef struct VirtIOS390DeviceClass {
|
|
|
|
DeviceClass qdev;
|
|
|
|
int (*init)(VirtIOS390Device *dev);
|
|
|
|
} VirtIOS390DeviceClass;
|
|
|
|
|
|
|
|
struct VirtIOS390Device {
|
2009-12-05 14:44:27 +03:00
|
|
|
DeviceState qdev;
|
|
|
|
ram_addr_t dev_offs;
|
|
|
|
ram_addr_t feat_offs;
|
|
|
|
uint8_t feat_len;
|
|
|
|
VirtIODevice *vdev;
|
block: add topology qdev properties
Add three new qdev properties to export block topology information to
the guest. This is needed to get optimal I/O alignment for RAID arrays
or SSDs.
The options are:
- physical_block_size to specify the physical block size of the device,
this is going to increase from 512 bytes to 4096 kilobytes for many
modern storage devices
- min_io_size to specify the minimal I/O size without performance impact,
this is typically set to the RAID chunk size for arrays.
- opt_io_size to specify the optimal sustained I/O size, this is
typically the RAID stripe width for arrays.
I decided to not auto-probe these values from blkid which might easily
be possible as I don't know how to deal with these issues on migration.
Note that we specificly only set the physical_block_size, and not the
logial one which is the unit all I/O is described in. The reason for
that is that IDE does not support increasing the logical block size and
at last for now I want to stick to one meachnisms in queue and allow
for easy switching of transports for a given backing image which would
not be possible if scsi and virtio use real 4k sectors, while ide only
uses the physical block exponent.
To make this more common for the different block drivers introduce a
new BlockConf structure holding all common block properties and a
DEFINE_BLOCK_PROPERTIES macro to add them all together, mirroring
what is done for network drivers. Also switch over all block drivers
to use it, except for the floppy driver which has weird driveA/driveB
properties and probably won't require any advanced block options ever.
Example usage for a virtio device with 4k physical block size and
8k optimal I/O size:
-drive file=scratch.img,media=disk,cache=none,id=scratch \
-device virtio-blk-pci,drive=scratch,physical_block_size=4096,opt_io_size=8192
aliguori: updated patch to take into account BLOCK events
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
2010-02-11 01:37:09 +03:00
|
|
|
BlockConf block;
|
2011-06-20 13:35:18 +04:00
|
|
|
char *block_serial;
|
2009-12-05 14:44:27 +03:00
|
|
|
NICConf nic;
|
2010-01-10 14:52:53 +03:00
|
|
|
uint32_t host_features;
|
2011-03-29 17:29:31 +04:00
|
|
|
virtio_serial_conf serial;
|
2010-09-02 19:00:50 +04:00
|
|
|
virtio_net_conf net;
|
2011-12-08 07:34:16 +04:00
|
|
|
};
|
2009-12-05 14:44:27 +03:00
|
|
|
|
|
|
|
typedef struct VirtIOS390Bus {
|
|
|
|
BusState bus;
|
|
|
|
|
|
|
|
VirtIOS390Device *console;
|
|
|
|
ram_addr_t dev_page;
|
|
|
|
ram_addr_t dev_offs;
|
|
|
|
ram_addr_t next_ring;
|
|
|
|
} VirtIOS390Bus;
|
|
|
|
|
|
|
|
|
2011-01-23 19:21:20 +03:00
|
|
|
void s390_virtio_device_update_status(VirtIOS390Device *dev);
|
2009-12-05 14:44:27 +03:00
|
|
|
|
2011-01-23 19:21:20 +03:00
|
|
|
VirtIOS390Device *s390_virtio_bus_console(VirtIOS390Bus *bus);
|
|
|
|
VirtIOS390Bus *s390_virtio_bus_init(ram_addr_t *ram_size);
|
2009-12-05 14:44:27 +03:00
|
|
|
|
2011-01-23 19:21:20 +03:00
|
|
|
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);
|