From 5cce173323cfe1bb22f7a10f9b73ac7796909cef Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 24 Jun 2015 11:59:16 +0200 Subject: [PATCH 1/2] virtio-input: add input routing support Add display and head properties for input routing to virtio-input devices, update multiseat documentation. Signed-off-by: Gerd Hoffmann --- docs/multiseat.txt | 17 +++++++++++++++-- hw/input/virtio-input-hid.c | 11 +++++++++++ include/hw/virtio/virtio-input.h | 2 ++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/docs/multiseat.txt b/docs/multiseat.txt index 814496e94c..d57d174a38 100644 --- a/docs/multiseat.txt +++ b/docs/multiseat.txt @@ -2,8 +2,8 @@ multiseat howto (with some multihead coverage) ============================================== -host side ---------- +host devices +------------ First you must compile qemu with a user interface supporting multihead/multiseat and input event routing. Right now this @@ -41,6 +41,19 @@ The "display=video2" sets up the input routing. Any input coming from the window which belongs to the video.2 display adapter will be routed to these input devices. +Starting with qemu 2.4 and linux kernel 4.1 you can also use virtio +for the input devices, using this ... + + -device pci-bridge,addr=12.0,chassis_nr=2,id=head.2 \ + -device secondary-vga,bus=head.2,addr=02.0,id=video.2 \ + -device virtio-keyboard-pci,bus=head.2,addr=03.0,display=video.2 \ + -device virtio-tablet-pci,bus=head.2,addr=03.0,display=video.2 + +... instead of xhci and usb hid devices. + +host ui +------- + The sdl2 ui will start up with two windows, one for each display device. The gtk ui will start with a single window and each display in a separate tab. You can either simply switch tabs to switch heads, diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c index 32cc94af0b..616a815ed4 100644 --- a/hw/input/virtio-input-hid.c +++ b/hw/input/virtio-input-hid.c @@ -252,7 +252,11 @@ static void virtio_input_handle_sync(DeviceState *dev) static void virtio_input_hid_realize(DeviceState *dev, Error **errp) { VirtIOInputHID *vhid = VIRTIO_INPUT_HID(dev); + vhid->hs = qemu_input_handler_register(dev, vhid->handler); + if (vhid->display && vhid->hs) { + qemu_input_handler_bind(vhid->hs, vhid->display, vhid->head, NULL); + } } static void virtio_input_hid_unrealize(DeviceState *dev, Error **errp) @@ -301,10 +305,17 @@ static void virtio_input_hid_handle_status(VirtIOInput *vinput, } } +static Property virtio_input_hid_properties[] = { + DEFINE_PROP_STRING("display", VirtIOInputHID, display), + DEFINE_PROP_UINT32("head", VirtIOInputHID, head, 0), +}; + static void virtio_input_hid_class_init(ObjectClass *klass, void *data) { + DeviceClass *dc = DEVICE_CLASS(klass); VirtIOInputClass *vic = VIRTIO_INPUT_CLASS(klass); + dc->props = virtio_input_hid_properties; vic->realize = virtio_input_hid_realize; vic->unrealize = virtio_input_hid_unrealize; vic->change_active = virtio_input_hid_change_active; diff --git a/include/hw/virtio/virtio-input.h b/include/hw/virtio/virtio-input.h index fd5417d1a3..af1c207ab1 100644 --- a/include/hw/virtio/virtio-input.h +++ b/include/hw/virtio/virtio-input.h @@ -95,6 +95,8 @@ struct VirtIOInputClass { struct VirtIOInputHID { VirtIOInput parent_obj; + char *display; + uint32_t head; QemuInputHandler *handler; QemuInputHandlerState *hs; int ledstate; From 496eacaa67653023540e090fb70b7caba429bbc0 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 1 Jul 2015 10:59:47 +0200 Subject: [PATCH 2/2] update pci-bridge-seat section in docs/multiseat.txt Signed-off-by: Gerd Hoffmann --- docs/multiseat.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/multiseat.txt b/docs/multiseat.txt index d57d174a38..ebf2446933 100644 --- a/docs/multiseat.txt +++ b/docs/multiseat.txt @@ -123,7 +123,7 @@ Background info is here: guest side with pci-bridge-seat ------------------------------- -Qemu version FIXME and newer has a new pci-bridge-seat device which +Qemu version 2.4 and newer has a new pci-bridge-seat device which can be used instead of pci-bridge. Just swap the device name in the qemu command line above. The only difference between the two devices is the pci id. We can match the pci id instead of the device path @@ -134,9 +134,10 @@ configuration: SUBSYSTEM=="pci", ATTR{vendor}=="0x1b36", ATTR{device}=="0x000a", \ TAG+="seat", ENV{ID_AUTOSEAT}="1" -Patch with this rule will be submitted to upstream udev/systemd, so -long-term, when systemd with this lands in distros, things will work -just fine without any manual guest configuration. +Patch with this rule has been submitted to upstream udev/systemd, was +accepted and and should be included in the next systemd release (222). +So, if your guest has this or a newer version, multiseat will work just +fine without any manual guest configuration. Enjoy!