From nobody Mon Oct 27 18:03:01 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1521808054912301.2654432244427; Fri, 23 Mar 2018 05:27:34 -0700 (PDT) Received: from localhost ([::1]:37764 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ezLnA-00072s-Q7 for importer@patchew.org; Fri, 23 Mar 2018 08:27:32 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33952) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ezLlK-0005ok-8a for qemu-devel@nongnu.org; Fri, 23 Mar 2018 08:25:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ezLlH-0002NH-M5 for qemu-devel@nongnu.org; Fri, 23 Mar 2018 08:25:38 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:60660 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ezLlH-0002Mg-HF for qemu-devel@nongnu.org; Fri, 23 Mar 2018 08:25:35 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2D85D722DC for ; Fri, 23 Mar 2018 12:25:35 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-116-39.ams2.redhat.com [10.36.116.39]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2C2D8D7E0D; Fri, 23 Mar 2018 12:25:28 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 3E1039B68B; Fri, 23 Mar 2018 13:25:21 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Fri, 23 Mar 2018 13:25:18 +0100 Message-Id: <20180323122520.11270-6-kraxel@redhat.com> In-Reply-To: <20180323122520.11270-1-kraxel@redhat.com> References: <20180323122520.11270-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Fri, 23 Mar 2018 12:25:35 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Fri, 23 Mar 2018 12:25:35 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'kraxel@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v2 5/7] hw/display: add virtio-ramfb X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Alex Williamson , =?UTF-8?q?L=C3=A1szl=C3=B3=20=C3=89rsek?= , Gerd Hoffmann , "Michael S. Tsirkin" Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Like virtio-vga, but using ramfb instead of legacy vga. Signed-off-by: Gerd Hoffmann --- hw/display/virtio-ramfb.c | 149 ++++++++++++++++++++++++++++++++++++++++++= ++++ hw/display/Makefile.objs | 2 +- 2 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 hw/display/virtio-ramfb.c diff --git a/hw/display/virtio-ramfb.c b/hw/display/virtio-ramfb.c new file mode 100644 index 0000000000..7611c16d39 --- /dev/null +++ b/hw/display/virtio-ramfb.c @@ -0,0 +1,149 @@ +#include "qemu/osdep.h" +#include "hw/hw.h" +#include "hw/pci/pci.h" +#include "ui/console.h" +#include "hw/virtio/virtio-pci.h" +#include "hw/display/ramfb.h" +#include "qapi/error.h" + +/* + * virtio-vga: This extends VirtioPCIProxy. + */ +#define TYPE_VIRTIO_RAMFB "virtio-ramfb" +#define VIRTIO_RAMFB(obj) \ + OBJECT_CHECK(VirtIORAMFB, (obj), TYPE_VIRTIO_RAMFB) + +typedef struct VirtIORAMFB { + VirtIOPCIProxy parent_obj; + VirtIOGPU vdev; + RAMFBState *ramfb; +} VirtIORAMFB; + +static void virtio_ramfb_invalidate_display(void *opaque) +{ + VirtIORAMFB *vramfb =3D opaque; + + if (vramfb->vdev.enable) { + virtio_gpu_ops.invalidate(&vramfb->vdev); + } +} + +static void virtio_ramfb_update_display(void *opaque) +{ + VirtIORAMFB *vramfb =3D opaque; + VirtIOGPU *g =3D &vramfb->vdev; + + if (vramfb->vdev.enable) { + virtio_gpu_ops.gfx_update(&vramfb->vdev); + } else { + ramfb_display_update(g->scanout[0].con, vramfb->ramfb); + } +} + +static int virtio_ramfb_ui_info(void *opaque, uint32_t idx, QemuUIInfo *in= fo) +{ + VirtIORAMFB *vramfb =3D opaque; + + if (virtio_gpu_ops.ui_info) { + return virtio_gpu_ops.ui_info(&vramfb->vdev, idx, info); + } + return -1; +} + +static void virtio_ramfb_gl_block(void *opaque, bool block) +{ + VirtIORAMFB *vramfb =3D opaque; + + if (virtio_gpu_ops.gl_block) { + virtio_gpu_ops.gl_block(&vramfb->vdev, block); + } +} + +static const GraphicHwOps virtio_ramfb_ops =3D { + .invalidate =3D virtio_ramfb_invalidate_display, + .gfx_update =3D virtio_ramfb_update_display, + .ui_info =3D virtio_ramfb_ui_info, + .gl_block =3D virtio_ramfb_gl_block, +}; + +static const VMStateDescription vmstate_virtio_ramfb =3D { + .name =3D "virtio-ramfb", + .version_id =3D 2, + .minimum_version_id =3D 2, + .fields =3D (VMStateField[]) { + /* no pci stuff here, saving the virtio device will handle that */ + /* FIXME */ + VMSTATE_END_OF_LIST() + } +}; + +/* RAMFB device wrapper around PCI device around virtio GPU */ +static void virtio_ramfb_realize(VirtIOPCIProxy *vpci_dev, Error **errp) +{ + VirtIORAMFB *vramfb =3D VIRTIO_RAMFB(vpci_dev); + VirtIOGPU *g =3D &vramfb->vdev; + Error *err =3D NULL; + int i; + + /* init virtio bits */ + qdev_set_parent_bus(DEVICE(g), BUS(&vpci_dev->bus)); + virtio_pci_force_virtio_1(vpci_dev); + object_property_set_bool(OBJECT(g), true, "realized", &err); + if (err) { + error_propagate(errp, err); + return; + } + + /* add stdramfb mmio regions */ + vramfb->ramfb =3D ramfb_setup(errp); + graphic_console_set_hwops(g->scanout[0].con, &virtio_ramfb_ops, vramfb= ); + + for (i =3D 0; i < g->conf.max_outputs; i++) { + object_property_set_link(OBJECT(g->scanout[i].con), + OBJECT(vpci_dev), + "device", errp); + } +} + +static Property virtio_ramfb_properties[] =3D { + DEFINE_VIRTIO_GPU_PCI_PROPERTIES(VirtIOPCIProxy), + DEFINE_PROP_END_OF_LIST(), +}; + +static void virtio_ramfb_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + VirtioPCIClass *k =3D VIRTIO_PCI_CLASS(klass); + PCIDeviceClass *pcidev_k =3D PCI_DEVICE_CLASS(klass); + + set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); + dc->props =3D virtio_ramfb_properties; + dc->vmsd =3D &vmstate_virtio_ramfb; + dc->hotpluggable =3D false; + + k->realize =3D virtio_ramfb_realize; + pcidev_k->class_id =3D PCI_CLASS_DISPLAY_OTHER; +} + +static void virtio_ramfb_inst_initfn(Object *obj) +{ + VirtIORAMFB *dev =3D VIRTIO_RAMFB(obj); + + virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), + TYPE_VIRTIO_GPU); +} + +static TypeInfo virtio_ramfb_info =3D { + .name =3D TYPE_VIRTIO_RAMFB, + .parent =3D TYPE_VIRTIO_PCI, + .instance_size =3D sizeof(struct VirtIORAMFB), + .instance_init =3D virtio_ramfb_inst_initfn, + .class_init =3D virtio_ramfb_class_init, +}; + +static void virtio_ramfb_register_types(void) +{ + type_register_static(&virtio_ramfb_info); +} + +type_init(virtio_ramfb_register_types) diff --git a/hw/display/Makefile.objs b/hw/display/Makefile.objs index 07d2f48782..e71d9d2ca6 100644 --- a/hw/display/Makefile.objs +++ b/hw/display/Makefile.objs @@ -37,7 +37,7 @@ obj-$(CONFIG_VGA) +=3D vga.o common-obj-$(CONFIG_QXL) +=3D qxl.o qxl-logger.o qxl-render.o =20 obj-$(CONFIG_VIRTIO) +=3D virtio-gpu.o virtio-gpu-3d.o -obj-$(CONFIG_VIRTIO_PCI) +=3D virtio-gpu-pci.o +obj-$(CONFIG_VIRTIO_PCI) +=3D virtio-gpu-pci.o virtio-ramfb.o obj-$(CONFIG_VIRTIO_VGA) +=3D virtio-vga.o virtio-gpu.o-cflags :=3D $(VIRGL_CFLAGS) virtio-gpu.o-libs +=3D $(VIRGL_LIBS) --=20 2.9.3