/* * Copyright (C) 2019 The Android Open Source Project * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies * of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #pragma once #include #include /* * VirtIO Console Feature Flags */ #define VIRTIO_CONSOLE_F_SIZE (1U << 0) #define VIRTIO_CONSOLE_F_MULTIPORT (1U << 1) #define VIRTIO_CONSOLE_F_EMERG_WRITE (1U << 2) /** * enum virtio_console_event - Message types for VirtIO console control events. * @VIRTIO_CONSOLE_DEVICE_READY: Guest->Host Acknowledge driver is ready to * speak control protocol * @VIRTIO_CONSOLE_DEVICE_ADD: Host->Guest Sent when the host connects a * port * @VIRTIO_CONSOLE_DEVICE_REMOVE: Host->Guest Sent when the host disconnects a * port * @VIRTIO_CONSOLE_PORT_READY: Guest->Host Acknowledge a DEVICE_ADD has been * processed by the driver * @VIRTIO_CONSOLE_CONSOLE_PORT: Host->Guest label a port as being the primary * console (as opposed to a serial port) * @VIRTIO_CONSOLE_RESIZE: Host->Guest one of the consoles has resized * @VIRTIO_CONSOLE_PORT_OPEN: Bidirectional, whether the port is available * in "software". In theory, this is application * defined, but QEMU requires that we open the * port to begin receiving messages on it. * @VIRTIO_CONSOLE_PORT_NAME: Host->Guest to indicate the name of a port. * The name is contained in the rest of the * virtio buffer after the event header. */ enum virtio_console_event { VIRTIO_CONSOLE_DEVICE_READY = 0, VIRTIO_CONSOLE_DEVICE_ADD = 1, VIRTIO_CONSOLE_DEVICE_REMOVE = 2, VIRTIO_CONSOLE_PORT_READY = 3, VIRTIO_CONSOLE_CONSOLE_PORT = 4, VIRTIO_CONSOLE_RESIZE = 5, VIRTIO_CONSOLE_PORT_OPEN = 6, VIRTIO_CONSOLE_PORT_NAME = 7, }; /* Queue IDs for the control queues */ #define VIRTIO_CONSOLE_CTRL_RX 2 #define VIRTIO_CONSOLE_CTRL_TX 3 /* Offset from the base of a port for the RX/TX queues */ #define VIRTIO_CONSOLE_RX_OFFSET 0 #define VIRTIO_CONSOLE_TX_OFFSET 1 /* Maximum number of ports we support in multiport */ #define MAX_PORTS 16 /* Maximum name size we support for a port */ #define MAX_PORT_NAME_SIZE 64 /** * struct port - Bookkeeping for port state * @host_connected: Whether the host enabled this port * @guest_connected: Whether we enabled this port * @name: Port name (provided by host), optional. Will be an empty * string if unspecified. */ struct port { bool host_connected; bool guest_connected; char name[MAX_PORT_NAME_SIZE]; }; /** * struct virtio_console - A virtio serial/console bus * @vio: VirtIO device being used * @ports: Current port state */ struct virtio_console { struct virtio_config* vio; struct port ports[MAX_PORTS]; }; /** * init_virtio_console() - Initializes a single VirtIO console device * Returns: The initialized console, or NULL in the event of a failure. * * We currently support a single legacy VirtIO console, in multiport * configuration. Any additional consoles will be ignored. * * Note that at VirtIO console device in multiport configuration may have * multiple attached serial ports, some of which are consoles. * We support driving any number of these, but they must stem from the same * VirtIO console. */ struct virtio_console* init_virtio_console(void); /** * virtio_console_connect_port() - Hook up queues to a specific port. * @console: The console bus to hook up to. * @port_id: Which port to hook up to. * @vq_in: Host->Guest virtq * @vq_out: Guest->Host virtq */ void virtio_console_connect_port(struct virtio_console* console, size_t port_id, struct virtq* vq_in, struct virtq* vq_out);