root / hw / virtio-serial.h @ 59df4c11
History | View | Annotate | Download (5.7 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 "qdev.h" |
19 | 98b19252 | Amit Shah | #include "virtio.h" |
20 | 98b19252 | Amit Shah | |
21 | 98b19252 | Amit Shah | /* == Interface shared between the guest kernel and qemu == */
|
22 | 98b19252 | Amit Shah | |
23 | 98b19252 | Amit Shah | /* The Virtio ID for virtio console / serial ports */
|
24 | 98b19252 | Amit Shah | #define VIRTIO_ID_CONSOLE 3 |
25 | 98b19252 | Amit Shah | |
26 | 98b19252 | Amit Shah | /* Features supported */
|
27 | 98b19252 | Amit Shah | #define VIRTIO_CONSOLE_F_MULTIPORT 1 |
28 | 98b19252 | Amit Shah | |
29 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_BAD_ID (~(uint32_t)0) |
30 | 055b889f | Amit Shah | |
31 | 98b19252 | Amit Shah | struct virtio_console_config {
|
32 | 98b19252 | Amit Shah | /*
|
33 | 98b19252 | Amit Shah | * These two fields are used by VIRTIO_CONSOLE_F_SIZE which
|
34 | 98b19252 | Amit Shah | * isn't implemented here yet
|
35 | 98b19252 | Amit Shah | */
|
36 | 98b19252 | Amit Shah | uint16_t cols; |
37 | 98b19252 | Amit Shah | uint16_t rows; |
38 | 98b19252 | Amit Shah | |
39 | 98b19252 | Amit Shah | uint32_t max_nr_ports; |
40 | 98b19252 | Amit Shah | } __attribute__((packed)); |
41 | 98b19252 | Amit Shah | |
42 | 98b19252 | Amit Shah | struct virtio_console_control {
|
43 | 98b19252 | Amit Shah | uint32_t id; /* Port number */
|
44 | 98b19252 | Amit Shah | uint16_t event; /* The kind of control event (see below) */
|
45 | 98b19252 | Amit Shah | uint16_t value; /* Extra information for the key */
|
46 | 98b19252 | Amit Shah | }; |
47 | 98b19252 | Amit Shah | |
48 | 6b331efb | Amit Shah | struct virtio_serial_conf {
|
49 | 6b331efb | Amit Shah | /* Max. number of ports we can have for a virtio-serial device */
|
50 | 6b331efb | Amit Shah | uint32_t max_virtserial_ports; |
51 | 6b331efb | Amit Shah | }; |
52 | 6b331efb | Amit Shah | |
53 | 98b19252 | Amit Shah | /* Some events for the internal messages (control packets) */
|
54 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_DEVICE_READY 0 |
55 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_PORT_ADD 1 |
56 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_PORT_REMOVE 2 |
57 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_PORT_READY 3 |
58 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_CONSOLE_PORT 4 |
59 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_RESIZE 5 |
60 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_PORT_OPEN 6 |
61 | 055b889f | Amit Shah | #define VIRTIO_CONSOLE_PORT_NAME 7 |
62 | 98b19252 | Amit Shah | |
63 | 98b19252 | Amit Shah | /* == In-qemu interface == */
|
64 | 98b19252 | Amit Shah | |
65 | 98b19252 | Amit Shah | typedef struct VirtIOSerial VirtIOSerial; |
66 | 98b19252 | Amit Shah | typedef struct VirtIOSerialBus VirtIOSerialBus; |
67 | 98b19252 | Amit Shah | typedef struct VirtIOSerialPort VirtIOSerialPort; |
68 | 98b19252 | Amit Shah | typedef struct VirtIOSerialPortInfo VirtIOSerialPortInfo; |
69 | 98b19252 | Amit Shah | |
70 | 98b19252 | Amit Shah | /*
|
71 | 98b19252 | Amit Shah | * This is the state that's shared between all the ports. Some of the
|
72 | 98b19252 | Amit Shah | * state is configurable via command-line options. Some of it can be
|
73 | 98b19252 | Amit Shah | * set by individual devices in their initfn routines. Some of the
|
74 | 98b19252 | Amit Shah | * state is set by the generic qdev device init routine.
|
75 | 98b19252 | Amit Shah | */
|
76 | 98b19252 | Amit Shah | struct VirtIOSerialPort {
|
77 | 98b19252 | Amit Shah | DeviceState dev; |
78 | 98b19252 | Amit Shah | VirtIOSerialPortInfo *info; |
79 | 98b19252 | Amit Shah | |
80 | 98b19252 | Amit Shah | QTAILQ_ENTRY(VirtIOSerialPort) next; |
81 | 98b19252 | Amit Shah | |
82 | 98b19252 | Amit Shah | /*
|
83 | 98b19252 | Amit Shah | * This field gives us the virtio device as well as the qdev bus
|
84 | 98b19252 | Amit Shah | * that we are associated with
|
85 | 98b19252 | Amit Shah | */
|
86 | 98b19252 | Amit Shah | VirtIOSerial *vser; |
87 | 98b19252 | Amit Shah | |
88 | 98b19252 | Amit Shah | VirtQueue *ivq, *ovq; |
89 | 98b19252 | Amit Shah | |
90 | 98b19252 | Amit Shah | /*
|
91 | 160600fd | Amit Shah | * This name is sent to the guest and exported via sysfs.
|
92 | 160600fd | Amit Shah | * The guest could create symlinks based on this information.
|
93 | 160600fd | Amit Shah | * The name is in the reverse fqdn format, like org.qemu.console.0
|
94 | 160600fd | Amit Shah | */
|
95 | 160600fd | Amit Shah | char *name;
|
96 | 160600fd | Amit Shah | |
97 | 160600fd | Amit Shah | /*
|
98 | 98b19252 | Amit Shah | * This id helps identify ports between the guest and the host.
|
99 | 98b19252 | Amit Shah | * The guest sends a "header" with this id with each data packet
|
100 | 98b19252 | Amit Shah | * that it sends and the host can then find out which associated
|
101 | 98b19252 | Amit Shah | * device to send out this data to
|
102 | 98b19252 | Amit Shah | */
|
103 | 98b19252 | Amit Shah | uint32_t id; |
104 | 98b19252 | Amit Shah | |
105 | f1925dff | Amit Shah | /*
|
106 | f1925dff | Amit Shah | * This is the elem that we pop from the virtqueue. A slow
|
107 | f1925dff | Amit Shah | * backend that consumes guest data (e.g. the file backend for
|
108 | f1925dff | Amit Shah | * qemu chardevs) can cause the guest to block till all the output
|
109 | f1925dff | Amit Shah | * is flushed. This isn't desired, so we keep a note of the last
|
110 | f1925dff | Amit Shah | * element popped and continue consuming it once the backend
|
111 | f1925dff | Amit Shah | * becomes writable again.
|
112 | f1925dff | Amit Shah | */
|
113 | f1925dff | Amit Shah | VirtQueueElement elem; |
114 | f1925dff | Amit Shah | |
115 | f1925dff | Amit Shah | /*
|
116 | f1925dff | Amit Shah | * The index and the offset into the iov buffer that was popped in
|
117 | f1925dff | Amit Shah | * elem above.
|
118 | f1925dff | Amit Shah | */
|
119 | f1925dff | Amit Shah | uint32_t iov_idx; |
120 | f1925dff | Amit Shah | uint64_t iov_offset; |
121 | f1925dff | Amit Shah | |
122 | 98b19252 | Amit Shah | /* Identify if this is a port that binds with hvc in the guest */
|
123 | 98b19252 | Amit Shah | uint8_t is_console; |
124 | 6663a195 | Amit Shah | |
125 | 6663a195 | Amit Shah | /* Is the corresponding guest device open? */
|
126 | 6663a195 | Amit Shah | bool guest_connected;
|
127 | 6663a195 | Amit Shah | /* Is this device open for IO on the host? */
|
128 | 6663a195 | Amit Shah | bool host_connected;
|
129 | 9ed7b059 | Amit Shah | /* Do apps not want to receive data? */
|
130 | 9ed7b059 | Amit Shah | bool throttled;
|
131 | 98b19252 | Amit Shah | }; |
132 | 98b19252 | Amit Shah | |
133 | 98b19252 | Amit Shah | struct VirtIOSerialPortInfo {
|
134 | 98b19252 | Amit Shah | DeviceInfo qdev; |
135 | 98b19252 | Amit Shah | /*
|
136 | 98b19252 | Amit Shah | * The per-port (or per-app) init function that's called when a
|
137 | 98b19252 | Amit Shah | * new device is found on the bus.
|
138 | 98b19252 | Amit Shah | */
|
139 | a43f9c90 | Gerd Hoffmann | int (*init)(VirtIOSerialPort *port);
|
140 | 98b19252 | Amit Shah | /*
|
141 | 98b19252 | Amit Shah | * Per-port exit function that's called when a port gets
|
142 | 98b19252 | Amit Shah | * hot-unplugged or removed.
|
143 | 98b19252 | Amit Shah | */
|
144 | a43f9c90 | Gerd Hoffmann | int (*exit)(VirtIOSerialPort *port);
|
145 | 98b19252 | Amit Shah | |
146 | 98b19252 | Amit Shah | /* Callbacks for guest events */
|
147 | 98b19252 | Amit Shah | /* Guest opened device. */
|
148 | 98b19252 | Amit Shah | void (*guest_open)(VirtIOSerialPort *port);
|
149 | 98b19252 | Amit Shah | /* Guest closed device. */
|
150 | 98b19252 | Amit Shah | void (*guest_close)(VirtIOSerialPort *port);
|
151 | 98b19252 | Amit Shah | |
152 | 98b19252 | Amit Shah | /* Guest is now ready to accept data (virtqueues set up). */
|
153 | 98b19252 | Amit Shah | void (*guest_ready)(VirtIOSerialPort *port);
|
154 | 98b19252 | Amit Shah | |
155 | 98b19252 | Amit Shah | /*
|
156 | 98b19252 | Amit Shah | * Guest wrote some data to the port. This data is handed over to
|
157 | e300ac27 | Amit Shah | * the app via this callback. The app can return a size less than
|
158 | e300ac27 | Amit Shah | * 'len'. In this case, throttling will be enabled for this port.
|
159 | 98b19252 | Amit Shah | */
|
160 | e300ac27 | Amit Shah | ssize_t (*have_data)(VirtIOSerialPort *port, const uint8_t *buf,
|
161 | e300ac27 | Amit Shah | size_t len); |
162 | 98b19252 | Amit Shah | }; |
163 | 98b19252 | Amit Shah | |
164 | 98b19252 | Amit Shah | /* Interface to the virtio-serial bus */
|
165 | 98b19252 | Amit Shah | |
166 | 98b19252 | Amit Shah | /*
|
167 | 98b19252 | Amit Shah | * Individual ports/apps should call this function to register the port
|
168 | 98b19252 | Amit Shah | * with the virtio-serial bus
|
169 | 98b19252 | Amit Shah | */
|
170 | 98b19252 | Amit Shah | void virtio_serial_port_qdev_register(VirtIOSerialPortInfo *info);
|
171 | 98b19252 | Amit Shah | |
172 | 98b19252 | Amit Shah | /*
|
173 | 98b19252 | Amit Shah | * Open a connection to the port
|
174 | 98b19252 | Amit Shah | * Returns 0 on success (always).
|
175 | 98b19252 | Amit Shah | */
|
176 | 98b19252 | Amit Shah | int virtio_serial_open(VirtIOSerialPort *port);
|
177 | 98b19252 | Amit Shah | |
178 | 98b19252 | Amit Shah | /*
|
179 | 98b19252 | Amit Shah | * Close the connection to the port
|
180 | 98b19252 | Amit Shah | * Returns 0 on success (always).
|
181 | 98b19252 | Amit Shah | */
|
182 | 98b19252 | Amit Shah | int virtio_serial_close(VirtIOSerialPort *port);
|
183 | 98b19252 | Amit Shah | |
184 | 98b19252 | Amit Shah | /*
|
185 | 98b19252 | Amit Shah | * Send data to Guest
|
186 | 98b19252 | Amit Shah | */
|
187 | 98b19252 | Amit Shah | ssize_t virtio_serial_write(VirtIOSerialPort *port, const uint8_t *buf,
|
188 | 98b19252 | Amit Shah | size_t size); |
189 | 98b19252 | Amit Shah | |
190 | 98b19252 | Amit Shah | /*
|
191 | 98b19252 | Amit Shah | * Query whether a guest is ready to receive data.
|
192 | 98b19252 | Amit Shah | */
|
193 | 98b19252 | Amit Shah | size_t virtio_serial_guest_ready(VirtIOSerialPort *port); |
194 | 98b19252 | Amit Shah | |
195 | 9ed7b059 | Amit Shah | /*
|
196 | 9ed7b059 | Amit Shah | * Flow control: Ports can signal to the virtio-serial core to stop
|
197 | 9ed7b059 | Amit Shah | * sending data or re-start sending data, depending on the 'throttle'
|
198 | 9ed7b059 | Amit Shah | * value here.
|
199 | 9ed7b059 | Amit Shah | */
|
200 | 9ed7b059 | Amit Shah | void virtio_serial_throttle_port(VirtIOSerialPort *port, bool throttle); |
201 | 9ed7b059 | Amit Shah | |
202 | 98b19252 | Amit Shah | #endif |