From patchwork Thu Mar 28 13:25:26 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fred.konrad@greensocs.com X-Patchwork-Id: 232014 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 1D4702C00B7 for ; Fri, 29 Mar 2013 00:28:43 +1100 (EST) Received: from localhost ([::1]:49034 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ULCsi-0007fg-GW for incoming@patchwork.ozlabs.org; Thu, 28 Mar 2013 09:28:40 -0400 Received: from eggs.gnu.org ([208.118.235.92]:49700) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ULCqA-0003ad-Hc for qemu-devel@nongnu.org; Thu, 28 Mar 2013 09:26:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ULCq6-000851-4Q for qemu-devel@nongnu.org; Thu, 28 Mar 2013 09:26:02 -0400 Received: from greensocs.com ([87.106.252.221]:39679 helo=s15328186.onlinehome-server.info) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ULCq5-00084h-Q1 for qemu-devel@nongnu.org; Thu, 28 Mar 2013 09:25:58 -0400 Received: from localhost (unknown [127.0.0.1]) by s15328186.onlinehome-server.info (Postfix) with ESMTP id 417F543EE38; Thu, 28 Mar 2013 13:25:57 +0000 (UTC) Received: from s15328186.onlinehome-server.info ([127.0.0.1]) by localhost (s15328186.onlinehome-server.info [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id y68t+eQM8Toi; Thu, 28 Mar 2013 14:25:52 +0100 (CET) Received: by s15328186.onlinehome-server.info (Postfix, from userid 491) id 6D68843EE34; Thu, 28 Mar 2013 14:25:52 +0100 (CET) Received: from compaq.katmai.xl.cx.katmai.xl.cx (lan31-11-83-155-143-136.fbx.proxad.net [83.155.143.136]) by s15328186.onlinehome-server.info (Postfix) with ESMTPSA id 999F843EE34; Thu, 28 Mar 2013 14:25:51 +0100 (CET) From: fred.konrad@greensocs.com To: qemu-devel@nongnu.org, aliguori@us.ibm.com Date: Thu, 28 Mar 2013 14:25:26 +0100 Message-Id: <1364477132-17968-2-git-send-email-fred.konrad@greensocs.com> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1364477132-17968-1-git-send-email-fred.konrad@greensocs.com> References: <1364477132-17968-1-git-send-email-fred.konrad@greensocs.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 87.106.252.221 Cc: cornelia.huck@de.ibm.com, peter.maydell@linaro.org, mark.burton@greensocs.com, Amit Shah , fred.konrad@greensocs.com Subject: [Qemu-devel] [PATCH v3 1/7] virtio-serial: add the virtio-serial device. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: KONRAD Frederic Create virtio-serial which extends virtio-device, so it can be connected on virtio-bus. Signed-off-by: KONRAD Frederic --- hw/virtio-pci.c | 2 +- hw/virtio-serial-bus.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++---- hw/virtio-serial.h | 9 +++++ 3 files changed, 98 insertions(+), 8 deletions(-) diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index fb20722..6db67bf 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -1075,7 +1075,7 @@ static Property virtio_serial_properties[] = { DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2), DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0), DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features), - DEFINE_PROP_UINT32("max_ports", VirtIOPCIProxy, serial.max_virtserial_ports, 31), + DEFINE_VIRTIO_SERIAL_PROPERTIES(VirtIOPCIProxy, serial), DEFINE_PROP_END_OF_LIST(), }; diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c index a9cb114..9608039 100644 --- a/hw/virtio-serial-bus.c +++ b/hw/virtio-serial-bus.c @@ -887,10 +887,12 @@ static int virtser_port_qdev_exit(DeviceState *qdev) return 0; } -VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *conf) +static VirtIODevice *virtio_serial_common_init(DeviceState *dev, + virtio_serial_conf *conf, + VirtIODevice **pvdev) { VirtIOSerial *vser; - VirtIODevice *vdev; + VirtIODevice *vdev = *pvdev; uint32_t i, max_supported_ports; if (!conf->max_virtserial_ports) @@ -904,11 +906,22 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *conf) return NULL; } - vdev = virtio_common_init("virtio-serial", VIRTIO_ID_CONSOLE, - sizeof(struct virtio_console_config), - sizeof(VirtIOSerial)); - - vser = DO_UPCAST(VirtIOSerial, vdev, vdev); + /* + * We have two cases here: the old virtio-serial-pci device, and the + * refactored virtio-serial. + */ + if (vdev == NULL) { + /* virtio-serial-pci */ + vdev = virtio_common_init("virtio-serial", VIRTIO_ID_CONSOLE, + sizeof(struct virtio_console_config), + sizeof(VirtIOSerial)); + vser = DO_UPCAST(VirtIOSerial, vdev, vdev); + } else { + /* virtio-serial */ + virtio_init(vdev, "virtio-serial", VIRTIO_ID_CONSOLE, + sizeof(struct virtio_console_config)); + vser = VIRTIO_SERIAL(vdev); + } /* Spawn a new virtio-serial bus on which the ports will ride as devices */ qbus_create_inplace(&vser->bus.qbus, TYPE_VIRTIO_SERIAL_BUS, dev, NULL); @@ -972,6 +985,16 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *conf) return vdev; } +/* + * The two following functions will be cleaned up at the end. + */ + +VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *conf) +{ + VirtIODevice *vdev = NULL; + return virtio_serial_common_init(dev, conf, &vdev); +} + void virtio_serial_exit(VirtIODevice *vdev) { VirtIOSerial *vser = DO_UPCAST(VirtIOSerial, vdev, vdev); @@ -1009,10 +1032,68 @@ static const TypeInfo virtio_serial_port_type_info = { .class_init = virtio_serial_port_class_init, }; +static int virtio_serial_device_init(VirtIODevice *vdev) +{ + DeviceState *qdev = DEVICE(vdev); + VirtIOSerial *vser = VIRTIO_SERIAL(vdev); + virtio_serial_conf *conf = &(vser->serial); + if (virtio_serial_common_init(qdev, conf, &vdev) == NULL) { + return -1; + } + return 0; +} + +static int virtio_serial_device_exit(DeviceState *dev) +{ + VirtIOSerial *vser = VIRTIO_SERIAL(dev); + VirtIODevice *vdev = VIRTIO_DEVICE(dev); + + unregister_savevm(dev, "virtio-console", vser); + + g_free(vser->ivqs); + g_free(vser->ovqs); + g_free(vser->ports_map); + if (vser->post_load) { + g_free(vser->post_load->connected); + qemu_del_timer(vser->post_load->timer); + qemu_free_timer(vser->post_load->timer); + g_free(vser->post_load); + } + virtio_common_cleanup(vdev); + return 0; +} + +static Property virtio_serial_properties[] = { + DEFINE_VIRTIO_SERIAL_PROPERTIES(VirtIOSerial, serial), + DEFINE_PROP_END_OF_LIST(), +}; + +static void virtio_serial_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass); + dc->exit = virtio_serial_device_exit; + dc->props = virtio_serial_properties; + vdc->init = virtio_serial_device_init; + vdc->get_features = get_features; + vdc->get_config = get_config; + vdc->set_config = set_config; + vdc->set_status = set_status; + vdc->reset = vser_reset; +} + +static const TypeInfo virtio_device_info = { + .name = TYPE_VIRTIO_SERIAL, + .parent = TYPE_VIRTIO_DEVICE, + .instance_size = sizeof(VirtIOSerial), + .class_init = virtio_serial_class_init, +}; + static void virtio_serial_register_types(void) { type_register_static(&virtser_bus_info); type_register_static(&virtio_serial_port_type_info); + type_register_static(&virtio_device_info); } type_init(virtio_serial_register_types) diff --git a/hw/virtio-serial.h b/hw/virtio-serial.h index 516400f..05f1ae4 100644 --- a/hw/virtio-serial.h +++ b/hw/virtio-serial.h @@ -210,6 +210,8 @@ struct VirtIOSerial { struct virtio_console_config config; struct VirtIOSerialPostLoad *post_load; + + virtio_serial_conf serial; }; /* Interface to the virtio-serial bus */ @@ -244,4 +246,11 @@ size_t virtio_serial_guest_ready(VirtIOSerialPort *port); */ void virtio_serial_throttle_port(VirtIOSerialPort *port, bool throttle); +#define TYPE_VIRTIO_SERIAL "virtio-serial" +#define VIRTIO_SERIAL(obj) \ + OBJECT_CHECK(VirtIOSerial, (obj), TYPE_VIRTIO_SERIAL) + +#define DEFINE_VIRTIO_SERIAL_PROPERTIES(_state, _field) \ + DEFINE_PROP_UINT32("max_ports", _state, _field.max_virtserial_ports, 31) + #endif