root / hw / virtio-serial.h @ 8449360c
History | View | Annotate | Download (5.1 kB)
1 | 98b19252 | Amit Shah | /*
|
---|---|---|---|
2 | 98b19252 | Amit Shah | * Virtio Serial / Console Support
|
3 | 98b19252 | Amit Shah | *
|
4 | 98b19252 | Amit Shah | * Copyright IBM, Corp. 2008
|
5 | 71c092e9 | Amit Shah | * Copyright Red Hat, Inc. 2009, 2010
|
6 | 98b19252 | Amit Shah | *
|
7 | 98b19252 | Amit Shah | * Authors:
|
8 | 98b19252 | Amit Shah | * Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
|
9 | 98b19252 | Amit Shah | * Amit Shah <amit.shah@redhat.com>
|
10 | 98b19252 | Amit Shah | *
|
11 | 98b19252 | Amit Shah | * This work is licensed under the terms of the GNU GPL, version 2. See
|
12 | 98b19252 | Amit Shah | * the COPYING file in the top-level directory.
|
13 | 98b19252 | Amit Shah | *
|
14 | 98b19252 | Amit Shah | */
|
15 | 98b19252 | Amit Shah | #ifndef _QEMU_VIRTIO_SERIAL_H
|
16 | 98b19252 | Amit Shah | #define _QEMU_VIRTIO_SERIAL_H
|
17 | 98b19252 | Amit Shah | |
18 | 98b19252 | Amit Shah | #include <stdbool.h> |
19 | 98b19252 | Amit Shah | #include "qdev.h" |
20 | 98b19252 | Amit Shah | #include "virtio.h" |
21 | 98b19252 | Amit Shah | |
22 | 98b19252 | Amit Shah | /* == Interface shared between the guest kernel and qemu == */
|
23 | 98b19252 | Amit Shah | |
24 | 98b19252 | Amit Shah | /* The Virtio ID for virtio console / serial ports */
|
25 | 98b19252 | Amit Shah | #define VIRTIO_ID_CONSOLE 3 |
26 | 98b19252 | Amit Shah | |
27 | 98b19252 | Amit Shah | /* Features supported */
|
28 | 98b19252 | Amit Shah | #define VIRTIO_CONSOLE_F_MULTIPORT 1 |
29 | 98b19252 | Amit Shah | |
30 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_BAD_ID (~(uint32_t)0) |
31 | 055b889f | Amit Shah | |
32 | 98b19252 | Amit Shah | struct virtio_console_config {
|
33 | 98b19252 | Amit Shah | /*
|
34 | 98b19252 | Amit Shah | * These two fields are used by VIRTIO_CONSOLE_F_SIZE which
|
35 | 98b19252 | Amit Shah | * isn't implemented here yet
|
36 | 98b19252 | Amit Shah | */
|
37 | 98b19252 | Amit Shah | uint16_t cols; |
38 | 98b19252 | Amit Shah | uint16_t rows; |
39 | 98b19252 | Amit Shah | |
40 | 98b19252 | Amit Shah | uint32_t max_nr_ports; |
41 | 98b19252 | Amit Shah | } __attribute__((packed)); |
42 | 98b19252 | Amit Shah | |
43 | 98b19252 | Amit Shah | struct virtio_console_control {
|
44 | 98b19252 | Amit Shah | uint32_t id; /* Port number */
|
45 | 98b19252 | Amit Shah | uint16_t event; /* The kind of control event (see below) */
|
46 | 98b19252 | Amit Shah | uint16_t value; /* Extra information for the key */
|
47 | 98b19252 | Amit Shah | }; |
48 | 98b19252 | Amit Shah | |
49 | 98b19252 | Amit Shah | /* Some events for the internal messages (control packets) */
|
50 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_DEVICE_READY 0 |
51 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_PORT_ADD 1 |
52 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_PORT_REMOVE 2 |
53 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_PORT_READY 3 |
54 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_CONSOLE_PORT 4 |
55 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_RESIZE 5 |
56 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_PORT_OPEN 6 |
57 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_PORT_NAME 7 |
58 | 98b19252 | Amit Shah | |
59 | 98b19252 | Amit Shah | /* == In-qemu interface == */
|
60 | 98b19252 | Amit Shah | |
61 | 98b19252 | Amit Shah | typedef struct VirtIOSerial VirtIOSerial; |
62 | 98b19252 | Amit Shah | typedef struct VirtIOSerialBus VirtIOSerialBus; |
63 | 98b19252 | Amit Shah | typedef struct VirtIOSerialPort VirtIOSerialPort; |
64 | 98b19252 | Amit Shah | typedef struct VirtIOSerialPortInfo VirtIOSerialPortInfo; |
65 | 98b19252 | Amit Shah | |
66 | 98b19252 | Amit Shah | typedef struct VirtIOSerialDevice { |
67 | 98b19252 | Amit Shah | DeviceState qdev; |
68 | 98b19252 | Amit Shah | VirtIOSerialPortInfo *info; |
69 | 98b19252 | Amit Shah | } VirtIOSerialDevice; |
70 | 98b19252 | Amit Shah | |
71 | 98b19252 | Amit Shah | /*
|
72 | 98b19252 | Amit Shah | * This is the state that's shared between all the ports. Some of the
|
73 | 98b19252 | Amit Shah | * state is configurable via command-line options. Some of it can be
|
74 | 98b19252 | Amit Shah | * set by individual devices in their initfn routines. Some of the
|
75 | 98b19252 | Amit Shah | * state is set by the generic qdev device init routine.
|
76 | 98b19252 | Amit Shah | */
|
77 | 98b19252 | Amit Shah | struct VirtIOSerialPort {
|
78 | 98b19252 | Amit Shah | DeviceState dev; |
79 | 98b19252 | Amit Shah | VirtIOSerialPortInfo *info; |
80 | 98b19252 | Amit Shah | |
81 | 98b19252 | Amit Shah | QTAILQ_ENTRY(VirtIOSerialPort) next; |
82 | 98b19252 | Amit Shah | |
83 | 98b19252 | Amit Shah | /*
|
84 | 98b19252 | Amit Shah | * This field gives us the virtio device as well as the qdev bus
|
85 | 98b19252 | Amit Shah | * that we are associated with
|
86 | 98b19252 | Amit Shah | */
|
87 | 98b19252 | Amit Shah | VirtIOSerial *vser; |
88 | 98b19252 | Amit Shah | |
89 | 98b19252 | Amit Shah | VirtQueue *ivq, *ovq; |
90 | 98b19252 | Amit Shah | |
91 | 98b19252 | Amit Shah | /*
|
92 | 160600fd | Amit Shah | * This name is sent to the guest and exported via sysfs.
|
93 | 160600fd | Amit Shah | * The guest could create symlinks based on this information.
|
94 | 160600fd | Amit Shah | * The name is in the reverse fqdn format, like org.qemu.console.0
|
95 | 160600fd | Amit Shah | */
|
96 | 160600fd | Amit Shah | char *name;
|
97 | 160600fd | Amit Shah | |
98 | 160600fd | Amit Shah | /*
|
99 | 98b19252 | Amit Shah | * This id helps identify ports between the guest and the host.
|
100 | 98b19252 | Amit Shah | * The guest sends a "header" with this id with each data packet
|
101 | 98b19252 | Amit Shah | * that it sends and the host can then find out which associated
|
102 | 98b19252 | Amit Shah | * device to send out this data to
|
103 | 98b19252 | Amit Shah | */
|
104 | 98b19252 | Amit Shah | uint32_t id; |
105 | 98b19252 | Amit Shah | |
106 | 98b19252 | Amit Shah | /* Identify if this is a port that binds with hvc in the guest */
|
107 | 98b19252 | Amit Shah | uint8_t is_console; |
108 | 6663a195 | Amit Shah | |
109 | 6663a195 | Amit Shah | /* Is the corresponding guest device open? */
|
110 | 6663a195 | Amit Shah | bool guest_connected;
|
111 | 6663a195 | Amit Shah | /* Is this device open for IO on the host? */
|
112 | 6663a195 | Amit Shah | bool host_connected;
|
113 | 9ed7b059 | Amit Shah | /* Do apps not want to receive data? */
|
114 | 9ed7b059 | Amit Shah | bool throttled;
|
115 | 98b19252 | Amit Shah | }; |
116 | 98b19252 | Amit Shah | |
117 | 98b19252 | Amit Shah | struct VirtIOSerialPortInfo {
|
118 | 98b19252 | Amit Shah | DeviceInfo qdev; |
119 | 98b19252 | Amit Shah | /*
|
120 | 98b19252 | Amit Shah | * The per-port (or per-app) init function that's called when a
|
121 | 98b19252 | Amit Shah | * new device is found on the bus.
|
122 | 98b19252 | Amit Shah | */
|
123 | 98b19252 | Amit Shah | int (*init)(VirtIOSerialDevice *dev);
|
124 | 98b19252 | Amit Shah | /*
|
125 | 98b19252 | Amit Shah | * Per-port exit function that's called when a port gets
|
126 | 98b19252 | Amit Shah | * hot-unplugged or removed.
|
127 | 98b19252 | Amit Shah | */
|
128 | 98b19252 | Amit Shah | int (*exit)(VirtIOSerialDevice *dev);
|
129 | 98b19252 | Amit Shah | |
130 | 98b19252 | Amit Shah | /* Callbacks for guest events */
|
131 | 98b19252 | Amit Shah | /* Guest opened device. */
|
132 | 98b19252 | Amit Shah | void (*guest_open)(VirtIOSerialPort *port);
|
133 | 98b19252 | Amit Shah | /* Guest closed device. */
|
134 | 98b19252 | Amit Shah | void (*guest_close)(VirtIOSerialPort *port);
|
135 | 98b19252 | Amit Shah | |
136 | 98b19252 | Amit Shah | /* Guest is now ready to accept data (virtqueues set up). */
|
137 | 98b19252 | Amit Shah | void (*guest_ready)(VirtIOSerialPort *port);
|
138 | 98b19252 | Amit Shah | |
139 | 98b19252 | Amit Shah | /*
|
140 | 98b19252 | Amit Shah | * Guest wrote some data to the port. This data is handed over to
|
141 | 1e4476aa | Amit Shah | * the app via this callback. The app is supposed to consume all
|
142 | 1e4476aa | Amit Shah | * the data that is presented to it.
|
143 | 98b19252 | Amit Shah | */
|
144 | 1e4476aa | Amit Shah | void (*have_data)(VirtIOSerialPort *port, const uint8_t *buf, size_t len); |
145 | 98b19252 | Amit Shah | }; |
146 | 98b19252 | Amit Shah | |
147 | 98b19252 | Amit Shah | /* Interface to the virtio-serial bus */
|
148 | 98b19252 | Amit Shah | |
149 | 98b19252 | Amit Shah | /*
|
150 | 98b19252 | Amit Shah | * Individual ports/apps should call this function to register the port
|
151 | 98b19252 | Amit Shah | * with the virtio-serial bus
|
152 | 98b19252 | Amit Shah | */
|
153 | 98b19252 | Amit Shah | void virtio_serial_port_qdev_register(VirtIOSerialPortInfo *info);
|
154 | 98b19252 | Amit Shah | |
155 | 98b19252 | Amit Shah | /*
|
156 | 98b19252 | Amit Shah | * Open a connection to the port
|
157 | 98b19252 | Amit Shah | * Returns 0 on success (always).
|
158 | 98b19252 | Amit Shah | */
|
159 | 98b19252 | Amit Shah | int virtio_serial_open(VirtIOSerialPort *port);
|
160 | 98b19252 | Amit Shah | |
161 | 98b19252 | Amit Shah | /*
|
162 | 98b19252 | Amit Shah | * Close the connection to the port
|
163 | 98b19252 | Amit Shah | * Returns 0 on success (always).
|
164 | 98b19252 | Amit Shah | */
|
165 | 98b19252 | Amit Shah | int virtio_serial_close(VirtIOSerialPort *port);
|
166 | 98b19252 | Amit Shah | |
167 | 98b19252 | Amit Shah | /*
|
168 | 98b19252 | Amit Shah | * Send data to Guest
|
169 | 98b19252 | Amit Shah | */
|
170 | 98b19252 | Amit Shah | ssize_t virtio_serial_write(VirtIOSerialPort *port, const uint8_t *buf,
|
171 | 98b19252 | Amit Shah | size_t size); |
172 | 98b19252 | Amit Shah | |
173 | 98b19252 | Amit Shah | /*
|
174 | 98b19252 | Amit Shah | * Query whether a guest is ready to receive data.
|
175 | 98b19252 | Amit Shah | */
|
176 | 98b19252 | Amit Shah | size_t virtio_serial_guest_ready(VirtIOSerialPort *port); |
177 | 98b19252 | Amit Shah | |
178 | 9ed7b059 | Amit Shah | /*
|
179 | 9ed7b059 | Amit Shah | * Flow control: Ports can signal to the virtio-serial core to stop
|
180 | 9ed7b059 | Amit Shah | * sending data or re-start sending data, depending on the 'throttle'
|
181 | 9ed7b059 | Amit Shah | * value here.
|
182 | 9ed7b059 | Amit Shah | */
|
183 | 9ed7b059 | Amit Shah | void virtio_serial_throttle_port(VirtIOSerialPort *port, bool throttle); |
184 | 9ed7b059 | Amit Shah | |
185 | 98b19252 | Amit Shah | #endif |