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