198b19252SAmit Shah /* 298b19252SAmit Shah * Virtio Serial / Console Support 398b19252SAmit Shah * 498b19252SAmit Shah * Copyright IBM, Corp. 2008 571c092e9SAmit Shah * Copyright Red Hat, Inc. 2009, 2010 698b19252SAmit Shah * 798b19252SAmit Shah * Authors: 898b19252SAmit Shah * Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com> 998b19252SAmit Shah * Amit Shah <amit.shah@redhat.com> 1098b19252SAmit Shah * 1198b19252SAmit Shah * This work is licensed under the terms of the GNU GPL, version 2. See 1298b19252SAmit Shah * the COPYING file in the top-level directory. 1398b19252SAmit Shah * 1498b19252SAmit Shah */ 152a6a4076SMarkus Armbruster 162a6a4076SMarkus Armbruster #ifndef QEMU_VIRTIO_SERIAL_H 172a6a4076SMarkus Armbruster #define QEMU_VIRTIO_SERIAL_H 1898b19252SAmit Shah 199b70c179SMichael S. Tsirkin #include "standard-headers/linux/virtio_console.h" 200d09e41aSPaolo Bonzini #include "hw/virtio/virtio.h" 2198b19252SAmit Shah 226b331efbSAmit Shah struct virtio_serial_conf { 236b331efbSAmit Shah /* Max. number of ports we can have for a virtio-serial device */ 246b331efbSAmit Shah uint32_t max_virtserial_ports; 256b331efbSAmit Shah }; 266b331efbSAmit Shah 27f82e35e3SAnthony Liguori #define TYPE_VIRTIO_SERIAL_PORT "virtio-serial-port" 28f82e35e3SAnthony Liguori #define VIRTIO_SERIAL_PORT(obj) \ 29f82e35e3SAnthony Liguori OBJECT_CHECK(VirtIOSerialPort, (obj), TYPE_VIRTIO_SERIAL_PORT) 30f82e35e3SAnthony Liguori #define VIRTIO_SERIAL_PORT_CLASS(klass) \ 31f82e35e3SAnthony Liguori OBJECT_CLASS_CHECK(VirtIOSerialPortClass, (klass), TYPE_VIRTIO_SERIAL_PORT) 32f82e35e3SAnthony Liguori #define VIRTIO_SERIAL_PORT_GET_CLASS(obj) \ 33f82e35e3SAnthony Liguori OBJECT_GET_CLASS(VirtIOSerialPortClass, (obj), TYPE_VIRTIO_SERIAL_PORT) 34f82e35e3SAnthony Liguori 3598b19252SAmit Shah typedef struct VirtIOSerial VirtIOSerial; 36*b28b8037SEduardo Habkost 37*b28b8037SEduardo Habkost #define TYPE_VIRTIO_SERIAL_BUS "virtio-serial-bus" 3898b19252SAmit Shah typedef struct VirtIOSerialBus VirtIOSerialBus; 39*b28b8037SEduardo Habkost #define VIRTIO_SERIAL_BUS(obj) \ 40*b28b8037SEduardo Habkost OBJECT_CHECK(VirtIOSerialBus, (obj), TYPE_VIRTIO_SERIAL_BUS) 41*b28b8037SEduardo Habkost 4298b19252SAmit Shah typedef struct VirtIOSerialPort VirtIOSerialPort; 43f82e35e3SAnthony Liguori 44f82e35e3SAnthony Liguori typedef struct VirtIOSerialPortClass { 45f82e35e3SAnthony Liguori DeviceClass parent_class; 46f82e35e3SAnthony Liguori 47f82e35e3SAnthony Liguori /* Is this a device that binds with hvc in the guest? */ 48f82e35e3SAnthony Liguori bool is_console; 49f82e35e3SAnthony Liguori 50f82e35e3SAnthony Liguori /* 512ef66625SAndreas Färber * The per-port (or per-app) realize function that's called when a 52f82e35e3SAnthony Liguori * new device is found on the bus. 53f82e35e3SAnthony Liguori */ 542ef66625SAndreas Färber DeviceRealize realize; 55f82e35e3SAnthony Liguori /* 562ef66625SAndreas Färber * Per-port unrealize function that's called when a port gets 57f82e35e3SAnthony Liguori * hot-unplugged or removed. 58f82e35e3SAnthony Liguori */ 592ef66625SAndreas Färber DeviceUnrealize unrealize; 60f82e35e3SAnthony Liguori 61f82e35e3SAnthony Liguori /* Callbacks for guest events */ 62b2c1394aSHans de Goede /* Guest opened/closed device. */ 63b2c1394aSHans de Goede void (*set_guest_connected)(VirtIOSerialPort *port, int guest_connected); 64f82e35e3SAnthony Liguori 6555289fb0SPavel Butsykin /* Enable/disable backend for virtio serial port */ 6655289fb0SPavel Butsykin void (*enable_backend)(VirtIOSerialPort *port, bool enable); 6755289fb0SPavel Butsykin 68f82e35e3SAnthony Liguori /* Guest is now ready to accept data (virtqueues set up). */ 69f82e35e3SAnthony Liguori void (*guest_ready)(VirtIOSerialPort *port); 70f82e35e3SAnthony Liguori 71f82e35e3SAnthony Liguori /* 724add73aaSAmit Shah * Guest has enqueued a buffer for the host to write into. 734add73aaSAmit Shah * Called each time a buffer is enqueued by the guest; 744add73aaSAmit Shah * irrespective of whether there already were free buffers the 754add73aaSAmit Shah * host could have consumed. 764add73aaSAmit Shah * 774add73aaSAmit Shah * This is dependent on both the guest and host end being 784add73aaSAmit Shah * connected. 794add73aaSAmit Shah */ 804add73aaSAmit Shah void (*guest_writable)(VirtIOSerialPort *port); 814add73aaSAmit Shah 824add73aaSAmit Shah /* 83f82e35e3SAnthony Liguori * Guest wrote some data to the port. This data is handed over to 84f82e35e3SAnthony Liguori * the app via this callback. The app can return a size less than 85f82e35e3SAnthony Liguori * 'len'. In this case, throttling will be enabled for this port. 86f82e35e3SAnthony Liguori */ 87f82e35e3SAnthony Liguori ssize_t (*have_data)(VirtIOSerialPort *port, const uint8_t *buf, 88f9fb0532SHans de Goede ssize_t len); 89f82e35e3SAnthony Liguori } VirtIOSerialPortClass; 9098b19252SAmit Shah 9198b19252SAmit Shah /* 9298b19252SAmit Shah * This is the state that's shared between all the ports. Some of the 9398b19252SAmit Shah * state is configurable via command-line options. Some of it can be 9498b19252SAmit Shah * set by individual devices in their initfn routines. Some of the 9598b19252SAmit Shah * state is set by the generic qdev device init routine. 9698b19252SAmit Shah */ 9798b19252SAmit Shah struct VirtIOSerialPort { 9898b19252SAmit Shah DeviceState dev; 9998b19252SAmit Shah 10098b19252SAmit Shah QTAILQ_ENTRY(VirtIOSerialPort) next; 10198b19252SAmit Shah 10298b19252SAmit Shah /* 10398b19252SAmit Shah * This field gives us the virtio device as well as the qdev bus 10498b19252SAmit Shah * that we are associated with 10598b19252SAmit Shah */ 10698b19252SAmit Shah VirtIOSerial *vser; 10798b19252SAmit Shah 10898b19252SAmit Shah VirtQueue *ivq, *ovq; 10998b19252SAmit Shah 11098b19252SAmit Shah /* 111160600fdSAmit Shah * This name is sent to the guest and exported via sysfs. 112160600fdSAmit Shah * The guest could create symlinks based on this information. 113160600fdSAmit Shah * The name is in the reverse fqdn format, like org.qemu.console.0 114160600fdSAmit Shah */ 115160600fdSAmit Shah char *name; 116160600fdSAmit Shah 117160600fdSAmit Shah /* 11898b19252SAmit Shah * This id helps identify ports between the guest and the host. 11998b19252SAmit Shah * The guest sends a "header" with this id with each data packet 12098b19252SAmit Shah * that it sends and the host can then find out which associated 12198b19252SAmit Shah * device to send out this data to 12298b19252SAmit Shah */ 12398b19252SAmit Shah uint32_t id; 12498b19252SAmit Shah 125f1925dffSAmit Shah /* 126f1925dffSAmit Shah * This is the elem that we pop from the virtqueue. A slow 127f1925dffSAmit Shah * backend that consumes guest data (e.g. the file backend for 128f1925dffSAmit Shah * qemu chardevs) can cause the guest to block till all the output 129f1925dffSAmit Shah * is flushed. This isn't desired, so we keep a note of the last 130f1925dffSAmit Shah * element popped and continue consuming it once the backend 131f1925dffSAmit Shah * becomes writable again. 132f1925dffSAmit Shah */ 13351b19ebeSPaolo Bonzini VirtQueueElement *elem; 134f1925dffSAmit Shah 135f1925dffSAmit Shah /* 136f1925dffSAmit Shah * The index and the offset into the iov buffer that was popped in 137f1925dffSAmit Shah * elem above. 138f1925dffSAmit Shah */ 139f1925dffSAmit Shah uint32_t iov_idx; 140f1925dffSAmit Shah uint64_t iov_offset; 141f1925dffSAmit Shah 142199646d8SAlon Levy /* 143199646d8SAlon Levy * When unthrottling we use a bottom-half to call flush_queued_data. 144199646d8SAlon Levy */ 145199646d8SAlon Levy QEMUBH *bh; 146199646d8SAlon Levy 1476663a195SAmit Shah /* Is the corresponding guest device open? */ 1486663a195SAmit Shah bool guest_connected; 1496663a195SAmit Shah /* Is this device open for IO on the host? */ 1506663a195SAmit Shah bool host_connected; 1519ed7b059SAmit Shah /* Do apps not want to receive data? */ 1529ed7b059SAmit Shah bool throttled; 15398b19252SAmit Shah }; 15498b19252SAmit Shah 155f1b24e84SKONRAD Frederic /* The virtio-serial bus on top of which the ports will ride as devices */ 156f1b24e84SKONRAD Frederic struct VirtIOSerialBus { 157f1b24e84SKONRAD Frederic BusState qbus; 158f1b24e84SKONRAD Frederic 159f1b24e84SKONRAD Frederic /* This is the parent device that provides the bus for ports. */ 160f1b24e84SKONRAD Frederic VirtIOSerial *vser; 161f1b24e84SKONRAD Frederic 162f1b24e84SKONRAD Frederic /* The maximum number of ports that can ride on top of this bus */ 163f1b24e84SKONRAD Frederic uint32_t max_nr_ports; 164f1b24e84SKONRAD Frederic }; 165f1b24e84SKONRAD Frederic 166f1b24e84SKONRAD Frederic typedef struct VirtIOSerialPostLoad { 167f1b24e84SKONRAD Frederic QEMUTimer *timer; 168f1b24e84SKONRAD Frederic uint32_t nr_active_ports; 169f1b24e84SKONRAD Frederic struct { 170f1b24e84SKONRAD Frederic VirtIOSerialPort *port; 171f1b24e84SKONRAD Frederic uint8_t host_connected; 172f1b24e84SKONRAD Frederic } *connected; 173f1b24e84SKONRAD Frederic } VirtIOSerialPostLoad; 174f1b24e84SKONRAD Frederic 175f1b24e84SKONRAD Frederic struct VirtIOSerial { 17676017fd2SKONRAD Frederic VirtIODevice parent_obj; 177f1b24e84SKONRAD Frederic 178f1b24e84SKONRAD Frederic VirtQueue *c_ivq, *c_ovq; 179f1b24e84SKONRAD Frederic /* Arrays of ivqs and ovqs: one per port */ 180f1b24e84SKONRAD Frederic VirtQueue **ivqs, **ovqs; 181f1b24e84SKONRAD Frederic 182f1b24e84SKONRAD Frederic VirtIOSerialBus bus; 183f1b24e84SKONRAD Frederic 184f1b24e84SKONRAD Frederic QTAILQ_HEAD(, VirtIOSerialPort) ports; 185f1b24e84SKONRAD Frederic 186a1857ad1SAmit Shah QLIST_ENTRY(VirtIOSerial) next; 187a1857ad1SAmit Shah 188f1b24e84SKONRAD Frederic /* bitmap for identifying active ports */ 189f1b24e84SKONRAD Frederic uint32_t *ports_map; 190f1b24e84SKONRAD Frederic 191f1b24e84SKONRAD Frederic struct VirtIOSerialPostLoad *post_load; 1922cd2b016SKONRAD Frederic 1932cd2b016SKONRAD Frederic virtio_serial_conf serial; 194a06b1daeSSascha Silbe 195a06b1daeSSascha Silbe uint64_t host_features; 196f1b24e84SKONRAD Frederic }; 197f1b24e84SKONRAD Frederic 19898b19252SAmit Shah /* Interface to the virtio-serial bus */ 19998b19252SAmit Shah 20098b19252SAmit Shah /* 20198b19252SAmit Shah * Open a connection to the port 20298b19252SAmit Shah * Returns 0 on success (always). 20398b19252SAmit Shah */ 20498b19252SAmit Shah int virtio_serial_open(VirtIOSerialPort *port); 20598b19252SAmit Shah 20698b19252SAmit Shah /* 20798b19252SAmit Shah * Close the connection to the port 20898b19252SAmit Shah * Returns 0 on success (always). 20998b19252SAmit Shah */ 21098b19252SAmit Shah int virtio_serial_close(VirtIOSerialPort *port); 21198b19252SAmit Shah 21298b19252SAmit Shah /* 21398b19252SAmit Shah * Send data to Guest 21498b19252SAmit Shah */ 21598b19252SAmit Shah ssize_t virtio_serial_write(VirtIOSerialPort *port, const uint8_t *buf, 21698b19252SAmit Shah size_t size); 21798b19252SAmit Shah 21898b19252SAmit Shah /* 21998b19252SAmit Shah * Query whether a guest is ready to receive data. 22098b19252SAmit Shah */ 22198b19252SAmit Shah size_t virtio_serial_guest_ready(VirtIOSerialPort *port); 22298b19252SAmit Shah 2239ed7b059SAmit Shah /* 2249ed7b059SAmit Shah * Flow control: Ports can signal to the virtio-serial core to stop 2259ed7b059SAmit Shah * sending data or re-start sending data, depending on the 'throttle' 2269ed7b059SAmit Shah * value here. 2279ed7b059SAmit Shah */ 2289ed7b059SAmit Shah void virtio_serial_throttle_port(VirtIOSerialPort *port, bool throttle); 2299ed7b059SAmit Shah 2302cd2b016SKONRAD Frederic #define TYPE_VIRTIO_SERIAL "virtio-serial-device" 2312cd2b016SKONRAD Frederic #define VIRTIO_SERIAL(obj) \ 2322cd2b016SKONRAD Frederic OBJECT_CHECK(VirtIOSerial, (obj), TYPE_VIRTIO_SERIAL) 2332cd2b016SKONRAD Frederic 23498b19252SAmit Shah #endif 235