Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 189639
b: refs/heads/master
c: b7a4130
h: refs/heads/master
i:
  189637: b45459f
  189635: 1c3fab0
  189631: 772f4b2
v: v3
  • Loading branch information
Michael S. Tsirkin authored and Rusty Russell committed Apr 8, 2010
1 parent f743cfd commit 072caa3
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 32 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9ff4cfab82d27e9fda72315f911bbaa9516e04bc
refs/heads/master: b7a413015d2986edf020fba765c906cc9cbcbfc9
49 changes: 41 additions & 8 deletions trunk/drivers/char/virtio_console.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,35 @@
#include <linux/workqueue.h>
#include "hvc_console.h"

/* Moved here from .h file in order to disable MULTIPORT. */
#define VIRTIO_CONSOLE_F_MULTIPORT 1 /* Does host provide multiple ports? */

struct virtio_console_multiport_conf {
struct virtio_console_config config;
/* max. number of ports this device can hold */
__u32 max_nr_ports;
/* number of ports added so far */
__u32 nr_ports;
} __attribute__((packed));

/*
* A message that's passed between the Host and the Guest for a
* particular port.
*/
struct virtio_console_control {
__u32 id; /* Port number */
__u16 event; /* The kind of control event (see below) */
__u16 value; /* Extra information for the key */
};

/* Some events for control messages */
#define VIRTIO_CONSOLE_PORT_READY 0
#define VIRTIO_CONSOLE_CONSOLE_PORT 1
#define VIRTIO_CONSOLE_RESIZE 2
#define VIRTIO_CONSOLE_PORT_OPEN 3
#define VIRTIO_CONSOLE_PORT_NAME 4
#define VIRTIO_CONSOLE_PORT_REMOVE 5

/*
* This is a global struct for storing common data for all the devices
* this driver handles.
Expand Down Expand Up @@ -121,7 +150,7 @@ struct ports_device {
spinlock_t cvq_lock;

/* The current config space is stored here */
struct virtio_console_config config;
struct virtio_console_multiport_conf config;

/* The virtio device we're associated with */
struct virtio_device *vdev;
Expand Down Expand Up @@ -1214,7 +1243,7 @@ static int add_port(struct ports_device *portdev, u32 id)
*/
static void config_work_handler(struct work_struct *work)
{
struct virtio_console_config virtconconf;
struct virtio_console_multiport_conf virtconconf;
struct ports_device *portdev;
struct virtio_device *vdev;
int err;
Expand All @@ -1223,7 +1252,8 @@ static void config_work_handler(struct work_struct *work)

vdev = portdev->vdev;
vdev->config->get(vdev,
offsetof(struct virtio_console_config, nr_ports),
offsetof(struct virtio_console_multiport_conf,
nr_ports),
&virtconconf.nr_ports,
sizeof(virtconconf.nr_ports));

Expand Down Expand Up @@ -1415,16 +1445,19 @@ static int __devinit virtcons_probe(struct virtio_device *vdev)
multiport = false;
portdev->config.nr_ports = 1;
portdev->config.max_nr_ports = 1;
#if 0 /* Multiport is not quite ready yet --RR */
if (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT)) {
multiport = true;
vdev->features[0] |= 1 << VIRTIO_CONSOLE_F_MULTIPORT;

vdev->config->get(vdev, offsetof(struct virtio_console_config,
nr_ports),
vdev->config->get(vdev,
offsetof(struct virtio_console_multiport_conf,
nr_ports),
&portdev->config.nr_ports,
sizeof(portdev->config.nr_ports));
vdev->config->get(vdev, offsetof(struct virtio_console_config,
max_nr_ports),
vdev->config->get(vdev,
offsetof(struct virtio_console_multiport_conf,
max_nr_ports),
&portdev->config.max_nr_ports,
sizeof(portdev->config.max_nr_ports));
if (portdev->config.nr_ports > portdev->config.max_nr_ports) {
Expand All @@ -1440,6 +1473,7 @@ static int __devinit virtcons_probe(struct virtio_device *vdev)

/* Let the Host know we support multiple ports.*/
vdev->config->finalize_features(vdev);
#endif

err = init_vqs(portdev);
if (err < 0) {
Expand Down Expand Up @@ -1522,7 +1556,6 @@ static struct virtio_device_id id_table[] = {

static unsigned int features[] = {
VIRTIO_CONSOLE_F_SIZE,
VIRTIO_CONSOLE_F_MULTIPORT,
};

static struct virtio_driver virtio_console = {
Expand Down
23 changes: 0 additions & 23 deletions trunk/include/linux/virtio_console.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,37 +12,14 @@

/* Feature bits */
#define VIRTIO_CONSOLE_F_SIZE 0 /* Does host provide console size? */
#define VIRTIO_CONSOLE_F_MULTIPORT 1 /* Does host provide multiple ports? */

struct virtio_console_config {
/* colums of the screens */
__u16 cols;
/* rows of the screens */
__u16 rows;
/* max. number of ports this device can hold */
__u32 max_nr_ports;
/* number of ports added so far */
__u32 nr_ports;
} __attribute__((packed));

/*
* A message that's passed between the Host and the Guest for a
* particular port.
*/
struct virtio_console_control {
__u32 id; /* Port number */
__u16 event; /* The kind of control event (see below) */
__u16 value; /* Extra information for the key */
};

/* Some events for control messages */
#define VIRTIO_CONSOLE_PORT_READY 0
#define VIRTIO_CONSOLE_CONSOLE_PORT 1
#define VIRTIO_CONSOLE_RESIZE 2
#define VIRTIO_CONSOLE_PORT_OPEN 3
#define VIRTIO_CONSOLE_PORT_NAME 4
#define VIRTIO_CONSOLE_PORT_REMOVE 5

#ifdef __KERNEL__
int __init virtio_cons_early_init(int (*put_chars)(u32, const char *, int));
#endif /* __KERNEL__ */
Expand Down

0 comments on commit 072caa3

Please sign in to comment.