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/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#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 S390_DEVICE_PAGES 256
|
|
|
|
|
|
|
|
typedef struct VirtIOS390Device {
|
|
|
|
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;
|
2009-12-05 14:44:27 +03:00
|
|
|
NICConf nic;
|
2010-01-10 14:52:53 +03:00
|
|
|
uint32_t host_features;
|
virtio-console: qdev conversion, new virtio-serial-bus
This commit converts the virtio-console device to create a new
virtio-serial bus that can host console and generic serial ports. The
file hosting this code is now called virtio-serial-bus.c.
The virtio console is now a very simple qdev device that sits on the
virtio-serial-bus and communicates between the bus and qemu's chardevs.
This commit also includes a few changes to the virtio backing code for
pci and s390 to spawn the virtio-serial bus.
As a result of the qdev conversion, we get rid of a lot of legacy code.
The old-style way of instantiating a virtio console using
-virtioconsole ...
is maintained, but the new, preferred way is to use
-device virtio-serial -device virtconsole,chardev=...
With this commit, multiple devices as well as multiple ports with a
single device can be supported.
For multiple ports support, each port gets an IO vq pair. Since the
guest needs to know in advance how many vqs a particular device will
need, we have to set this number as a property of the virtio-serial
device and also as a config option.
In addition, we also spawn a pair of control IO vqs. This is an internal
channel meant for guest-host communication for things like port
open/close, sending port properties over to the guest, etc.
This commit is a part of a series of other commits to get the full
implementation of multiport support. Future commits will add other
support as well as ride on the savevm version that we bump up here.
Signed-off-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
2010-01-19 22:06:52 +03:00
|
|
|
/* Max. number of ports we can have for a the virtio-serial device */
|
|
|
|
uint32_t max_virtserial_ports;
|
2009-12-05 14:44:27 +03:00
|
|
|
} VirtIOS390Device;
|
|
|
|
|
|
|
|
typedef struct VirtIOS390Bus {
|
|
|
|
BusState bus;
|
|
|
|
|
|
|
|
VirtIOS390Device *console;
|
|
|
|
ram_addr_t dev_page;
|
|
|
|
ram_addr_t dev_offs;
|
|
|
|
ram_addr_t next_ring;
|
|
|
|
} VirtIOS390Bus;
|
|
|
|
|
|
|
|
|
|
|
|
extern void s390_virtio_device_update_status(VirtIOS390Device *dev);
|
|
|
|
|
|
|
|
extern VirtIOS390Device *s390_virtio_bus_console(VirtIOS390Bus *bus);
|
|
|
|
extern VirtIOS390Bus *s390_virtio_bus_init(ram_addr_t *ram_size);
|
|
|
|
|
|
|
|
extern VirtIOS390Device *s390_virtio_bus_find_vring(VirtIOS390Bus *bus,
|
|
|
|
ram_addr_t mem,
|
|
|
|
int *vq_num);
|
|
|
|
extern VirtIOS390Device *s390_virtio_bus_find_mem(VirtIOS390Bus *bus,
|
|
|
|
ram_addr_t mem);
|
2010-04-01 20:42:40 +04:00
|
|
|
extern void s390_virtio_device_sync(VirtIOS390Device *dev);
|