aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/char/virtio_console.c49
-rw-r--r--include/linux/virtio_console.h23
2 files changed, 41 insertions, 31 deletions
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 86e9011325dc..196428c2287a 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -33,6 +33,35 @@
33#include <linux/workqueue.h> 33#include <linux/workqueue.h>
34#include "hvc_console.h" 34#include "hvc_console.h"
35 35
36/* Moved here from .h file in order to disable MULTIPORT. */
37#define VIRTIO_CONSOLE_F_MULTIPORT 1 /* Does host provide multiple ports? */
38
39struct virtio_console_multiport_conf {
40 struct virtio_console_config config;
41 /* max. number of ports this device can hold */
42 __u32 max_nr_ports;
43 /* number of ports added so far */
44 __u32 nr_ports;
45} __attribute__((packed));
46
47/*
48 * A message that's passed between the Host and the Guest for a
49 * particular port.
50 */
51struct virtio_console_control {
52 __u32 id; /* Port number */
53 __u16 event; /* The kind of control event (see below) */
54 __u16 value; /* Extra information for the key */
55};
56
57/* Some events for control messages */
58#define VIRTIO_CONSOLE_PORT_READY 0
59#define VIRTIO_CONSOLE_CONSOLE_PORT 1
60#define VIRTIO_CONSOLE_RESIZE 2
61#define VIRTIO_CONSOLE_PORT_OPEN 3
62#define VIRTIO_CONSOLE_PORT_NAME 4
63#define VIRTIO_CONSOLE_PORT_REMOVE 5
64
36/* 65/*
37 * This is a global struct for storing common data for all the devices 66 * This is a global struct for storing common data for all the devices
38 * this driver handles. 67 * this driver handles.
@@ -121,7 +150,7 @@ struct ports_device {
121 spinlock_t cvq_lock; 150 spinlock_t cvq_lock;
122 151
123 /* The current config space is stored here */ 152 /* The current config space is stored here */
124 struct virtio_console_config config; 153 struct virtio_console_multiport_conf config;
125 154
126 /* The virtio device we're associated with */ 155 /* The virtio device we're associated with */
127 struct virtio_device *vdev; 156 struct virtio_device *vdev;
@@ -1214,7 +1243,7 @@ fail:
1214 */ 1243 */
1215static void config_work_handler(struct work_struct *work) 1244static void config_work_handler(struct work_struct *work)
1216{ 1245{
1217 struct virtio_console_config virtconconf; 1246 struct virtio_console_multiport_conf virtconconf;
1218 struct ports_device *portdev; 1247 struct ports_device *portdev;
1219 struct virtio_device *vdev; 1248 struct virtio_device *vdev;
1220 int err; 1249 int err;
@@ -1223,7 +1252,8 @@ static void config_work_handler(struct work_struct *work)
1223 1252
1224 vdev = portdev->vdev; 1253 vdev = portdev->vdev;
1225 vdev->config->get(vdev, 1254 vdev->config->get(vdev,
1226 offsetof(struct virtio_console_config, nr_ports), 1255 offsetof(struct virtio_console_multiport_conf,
1256 nr_ports),
1227 &virtconconf.nr_ports, 1257 &virtconconf.nr_ports,
1228 sizeof(virtconconf.nr_ports)); 1258 sizeof(virtconconf.nr_ports));
1229 1259
@@ -1415,16 +1445,19 @@ static int __devinit virtcons_probe(struct virtio_device *vdev)
1415 multiport = false; 1445 multiport = false;
1416 portdev->config.nr_ports = 1; 1446 portdev->config.nr_ports = 1;
1417 portdev->config.max_nr_ports = 1; 1447 portdev->config.max_nr_ports = 1;
1448#if 0 /* Multiport is not quite ready yet --RR */
1418 if (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT)) { 1449 if (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT)) {
1419 multiport = true; 1450 multiport = true;
1420 vdev->features[0] |= 1 << VIRTIO_CONSOLE_F_MULTIPORT; 1451 vdev->features[0] |= 1 << VIRTIO_CONSOLE_F_MULTIPORT;
1421 1452
1422 vdev->config->get(vdev, offsetof(struct virtio_console_config, 1453 vdev->config->get(vdev,
1423 nr_ports), 1454 offsetof(struct virtio_console_multiport_conf,
1455 nr_ports),
1424 &portdev->config.nr_ports, 1456 &portdev->config.nr_ports,
1425 sizeof(portdev->config.nr_ports)); 1457 sizeof(portdev->config.nr_ports));
1426 vdev->config->get(vdev, offsetof(struct virtio_console_config, 1458 vdev->config->get(vdev,
1427 max_nr_ports), 1459 offsetof(struct virtio_console_multiport_conf,
1460 max_nr_ports),
1428 &portdev->config.max_nr_ports, 1461 &portdev->config.max_nr_ports,
1429 sizeof(portdev->config.max_nr_ports)); 1462 sizeof(portdev->config.max_nr_ports));
1430 if (portdev->config.nr_ports > portdev->config.max_nr_ports) { 1463 if (portdev->config.nr_ports > portdev->config.max_nr_ports) {
@@ -1440,6 +1473,7 @@ static int __devinit virtcons_probe(struct virtio_device *vdev)
1440 1473
1441 /* Let the Host know we support multiple ports.*/ 1474 /* Let the Host know we support multiple ports.*/
1442 vdev->config->finalize_features(vdev); 1475 vdev->config->finalize_features(vdev);
1476#endif
1443 1477
1444 err = init_vqs(portdev); 1478 err = init_vqs(portdev);
1445 if (err < 0) { 1479 if (err < 0) {
@@ -1522,7 +1556,6 @@ static struct virtio_device_id id_table[] = {
1522 1556
1523static unsigned int features[] = { 1557static unsigned int features[] = {
1524 VIRTIO_CONSOLE_F_SIZE, 1558 VIRTIO_CONSOLE_F_SIZE,
1525 VIRTIO_CONSOLE_F_MULTIPORT,
1526}; 1559};
1527 1560
1528static struct virtio_driver virtio_console = { 1561static struct virtio_driver virtio_console = {
diff --git a/include/linux/virtio_console.h b/include/linux/virtio_console.h
index ae4f039515b4..92228a8fbcbc 100644
--- a/include/linux/virtio_console.h
+++ b/include/linux/virtio_console.h
@@ -12,37 +12,14 @@
12 12
13/* Feature bits */ 13/* Feature bits */
14#define VIRTIO_CONSOLE_F_SIZE 0 /* Does host provide console size? */ 14#define VIRTIO_CONSOLE_F_SIZE 0 /* Does host provide console size? */
15#define VIRTIO_CONSOLE_F_MULTIPORT 1 /* Does host provide multiple ports? */
16 15
17struct virtio_console_config { 16struct virtio_console_config {
18 /* colums of the screens */ 17 /* colums of the screens */
19 __u16 cols; 18 __u16 cols;
20 /* rows of the screens */ 19 /* rows of the screens */
21 __u16 rows; 20 __u16 rows;
22 /* max. number of ports this device can hold */
23 __u32 max_nr_ports;
24 /* number of ports added so far */
25 __u32 nr_ports;
26} __attribute__((packed)); 21} __attribute__((packed));
27 22
28/*
29 * A message that's passed between the Host and the Guest for a
30 * particular port.
31 */
32struct virtio_console_control {
33 __u32 id; /* Port number */
34 __u16 event; /* The kind of control event (see below) */
35 __u16 value; /* Extra information for the key */
36};
37
38/* Some events for control messages */
39#define VIRTIO_CONSOLE_PORT_READY 0
40#define VIRTIO_CONSOLE_CONSOLE_PORT 1
41#define VIRTIO_CONSOLE_RESIZE 2
42#define VIRTIO_CONSOLE_PORT_OPEN 3
43#define VIRTIO_CONSOLE_PORT_NAME 4
44#define VIRTIO_CONSOLE_PORT_REMOVE 5
45
46#ifdef __KERNEL__ 23#ifdef __KERNEL__
47int __init virtio_cons_early_init(int (*put_chars)(u32, const char *, int)); 24int __init virtio_cons_early_init(int (*put_chars)(u32, const char *, int));
48#endif /* __KERNEL__ */ 25#endif /* __KERNEL__ */