From nobody Mon Dec 15 21:26:21 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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1510920432525248.18645813560147; Fri, 17 Nov 2017 04:07:12 -0800 (PST) Received: from localhost ([::1]:45441 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eFfQF-0005LI-JK for importer@patchew.org; Fri, 17 Nov 2017 07:07:03 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51746) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eFfOR-0004A2-Qy for qemu-devel@nongnu.org; Fri, 17 Nov 2017 07:05:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eFfOL-0006bA-SG for qemu-devel@nongnu.org; Fri, 17 Nov 2017 07:05:11 -0500 Received: from mx1.redhat.com ([209.132.183.28]:45448) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eFfOL-0006a1-KD for qemu-devel@nongnu.org; Fri, 17 Nov 2017 07:05:05 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D0459C03BD6E for ; Fri, 17 Nov 2017 12:05:04 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-116-103.ams2.redhat.com [10.36.116.103]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7BFAF60C91; Fri, 17 Nov 2017 12:04:55 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id B37323F139; Fri, 17 Nov 2017 13:04:54 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Fri, 17 Nov 2017 13:04:53 +0100 Message-Id: <20171117120454.13507-4-kraxel@redhat.com> In-Reply-To: <20171117120454.13507-1-kraxel@redhat.com> References: <20171117120454.13507-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 17 Nov 2017 12:05:04 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 3/4] 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" --- 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 4e8ff48b55..646012478f 100644 --- a/hw/display/Makefile.objs +++ b/hw/display/Makefile.objs @@ -35,7 +35,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