From nobody Fri Apr 19 12:00:27 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547199407997611.7983941646472; Fri, 11 Jan 2019 01:36:47 -0800 (PST) Received: from localhost ([127.0.0.1]:44616 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghtF9-0004DM-0X for importer@patchew.org; Fri, 11 Jan 2019 04:36:47 -0500 Received: from eggs.gnu.org ([209.51.188.92]:34590) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghtAQ-0000mq-Pt for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ghtAJ-0003Yk-HK for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:51 -0500 Received: from mx1.redhat.com ([209.132.183.28]:44426) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ghtAD-000354-0Z for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:41 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 48D71C78FA; Fri, 11 Jan 2019 09:31:23 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-117-186.ams2.redhat.com [10.36.117.186]) by smtp.corp.redhat.com (Postfix) with ESMTP id 212A05C689; Fri, 11 Jan 2019 09:31:17 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 592009AD3; Fri, 11 Jan 2019 10:31:16 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Fri, 11 Jan 2019 10:31:12 +0100 Message-Id: <20190111093116.17188-2-kraxel@redhat.com> In-Reply-To: <20190111093116.17188-1-kraxel@redhat.com> References: <20190111093116.17188-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 11 Jan 2019 09:31:23 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 1/5] vfio: update kernel headers. 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 , intel-gvt-dev@lists.freedesktop.org, Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Temporary, for testing convinience. Once qemu master is synced with the linux 5.0-rc1 headers this is not needed any more. Signed-off-by: Gerd Hoffmann --- linux-headers/linux/vfio.h | 50 ++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 50 insertions(+) diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h index ceb6453394..51662a7209 100644 --- a/linux-headers/linux/vfio.h +++ b/linux-headers/linux/vfio.h @@ -303,6 +303,56 @@ struct vfio_region_info_cap_type { #define VFIO_REGION_SUBTYPE_INTEL_IGD_HOST_CFG (2) #define VFIO_REGION_SUBTYPE_INTEL_IGD_LPC_CFG (3) =20 +#define VFIO_REGION_TYPE_GFX (1) +#define VFIO_REGION_SUBTYPE_GFX_EDID (1) + +/** + * struct vfio_region_gfx_edid - EDID region layout. + * + * Set display link state and EDID blob. + * + * The EDID blob has monitor information such as brand, name, serial + * number, physical size, supported video modes and more. + * + * This special region allows userspace (typically qemu) set a virtual + * EDID for the virtual monitor, which allows a flexible display + * configuration. + * + * For the edid blob spec look here: + * https://en.wikipedia.org/wiki/Extended_Display_Identification_Data + * + * On linux systems you can find the EDID blob in sysfs: + * /sys/class/drm/${card}/${connector}/edid + * + * You can use the edid-decode ulility (comes with xorg-x11-utils) to + * decode the EDID blob. + * + * @edid_offset: location of the edid blob, relative to the + * start of the region (readonly). + * @edid_max_size: max size of the edid blob (readonly). + * @edid_size: actual edid size (read/write). + * @link_state: display link state (read/write). + * VFIO_DEVICE_GFX_LINK_STATE_UP: Monitor is turned on. + * VFIO_DEVICE_GFX_LINK_STATE_DOWN: Monitor is turned off. + * @max_xres: max display width (0 =3D=3D no limitation, readonly). + * @max_yres: max display height (0 =3D=3D no limitation, readonly). + * + * EDID update protocol: + * (1) set link-state to down. + * (2) update edid blob and size. + * (3) set link-state to up. + */ +struct vfio_region_gfx_edid { + __u32 edid_offset; + __u32 edid_max_size; + __u32 edid_size; + __u32 max_xres; + __u32 max_yres; + __u32 link_state; +#define VFIO_DEVICE_GFX_LINK_STATE_UP 1 +#define VFIO_DEVICE_GFX_LINK_STATE_DOWN 2 +}; + /* * The MSIX mappable capability informs that MSIX data of a BAR can be mma= pped * which allows direct access to non-MSIX registers which happened to be w= ithin --=20 2.9.3 From nobody Fri Apr 19 12:00:27 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547199257846396.3884201478131; Fri, 11 Jan 2019 01:34:17 -0800 (PST) Received: from localhost ([127.0.0.1]:43949 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghtCg-0001tA-9J for importer@patchew.org; Fri, 11 Jan 2019 04:34:14 -0500 Received: from eggs.gnu.org ([209.51.188.92]:34560) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghtAH-0000iw-Kz for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ghtAB-0003GU-AK for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:41 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55356) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ghtA7-00035B-3r for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:37 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A6854C04F4DD; Fri, 11 Jan 2019 09:31:23 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-117-186.ams2.redhat.com [10.36.117.186]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1CC8E5D6A9; Fri, 11 Jan 2019 09:31:17 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 62EA99AD4; Fri, 11 Jan 2019 10:31:16 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Fri, 11 Jan 2019 10:31:13 +0100 Message-Id: <20190111093116.17188-3-kraxel@redhat.com> In-Reply-To: <20190111093116.17188-1-kraxel@redhat.com> References: <20190111093116.17188-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 11 Jan 2019 09:31:23 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 2/5] vfio/display: add edid support. 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 , intel-gvt-dev@lists.freedesktop.org, Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This patch adds EDID support to the vfio display (aka vgpu) code. When supported by the mdev driver qemu will generate a EDID blob and pass it on using the new vfio edid region. The EDID blob will be updated on UI changes (i.e. window resize), so the guest can adapt. Signed-off-by: Gerd Hoffmann --- include/hw/vfio/vfio-common.h | 3 ++ hw/vfio/display.c | 118 ++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 121 insertions(+) diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index 1b434d02f6..ff5c425048 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -148,6 +148,9 @@ typedef struct VFIODMABuf { typedef struct VFIODisplay { QemuConsole *con; RAMFBState *ramfb; + struct vfio_region_info *edid_info; + struct vfio_region_gfx_edid *edid_regs; + uint8_t *edid_blob; struct { VFIORegion buffer; DisplaySurface *surface; diff --git a/hw/vfio/display.c b/hw/vfio/display.c index dead30e626..0ef4d77e21 100644 --- a/hw/vfio/display.c +++ b/hw/vfio/display.c @@ -15,6 +15,7 @@ #include =20 #include "sysemu/sysemu.h" +#include "hw/display/edid.h" #include "ui/console.h" #include "qapi/error.h" #include "pci.h" @@ -24,6 +25,120 @@ # define DRM_PLANE_TYPE_CURSOR 2 #endif =20 +#define pread_field(_fd, _reg, _ptr, _fld) \ + if (sizeof(_ptr->_fld) !=3D \ + pread(_fd, &(_ptr->_fld), sizeof(_ptr->_fld), \ + _reg->offset + offsetof(typeof(*_ptr), _fld))) \ + goto err; +#define pwrite_field(_fd, _reg, _ptr, _fld) \ + if (sizeof(_ptr->_fld) !=3D \ + pwrite(_fd, &(_ptr->_fld), sizeof(_ptr->_fld), \ + _reg->offset + offsetof(typeof(*_ptr), _fld))) \ + goto err; + + +static void vfio_display_edid_update(VFIOPCIDevice *vdev, bool enabled, in= t prefx, int prefy) +{ + VFIODisplay *dpy =3D vdev->dpy; + qemu_edid_info edid =3D { + .maxx =3D dpy->edid_regs->max_xres, + .maxy =3D dpy->edid_regs->max_yres, + .prefx =3D prefx, + .prefy =3D prefy, + }; + + dpy->edid_regs->link_state =3D VFIO_DEVICE_GFX_LINK_STATE_DOWN; + pwrite_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, link_s= tate); + + if (!enabled) { + return; + } + + if (edid.maxx && edid.prefx > edid.maxx) { + edid.prefx =3D edid.maxx; + } + if (edid.maxy && edid.prefy > edid.maxy) { + edid.prefy =3D edid.maxy; + } + qemu_edid_generate(dpy->edid_blob, + dpy->edid_regs->edid_max_size, + &edid); + + dpy->edid_regs->edid_size =3D qemu_edid_size(dpy->edid_blob); + pwrite_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, edid_s= ize); + if (pwrite(vdev->vbasedev.fd, dpy->edid_blob, dpy->edid_regs->edid_siz= e, + dpy->edid_info->offset + dpy->edid_regs->edid_offset) + !=3D dpy->edid_regs->edid_size) { + goto err; + } + + dpy->edid_regs->link_state =3D VFIO_DEVICE_GFX_LINK_STATE_UP; + pwrite_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, link_s= tate); + return; + +err: + fprintf(stderr, "%s: Oops, pwrite error\n", __func__); + return; +} + +static int vfio_display_edid_ui_info(void *opaque, uint32_t idx, + QemuUIInfo *info) +{ + VFIOPCIDevice *vdev =3D opaque; + VFIODisplay *dpy =3D vdev->dpy; + + if (!dpy->edid_regs) { + return 0; + } + + if (info->width && info->height) { + vfio_display_edid_update(vdev, true, info->width, info->height); + } else { + vfio_display_edid_update(vdev, false, 0, 0); + } + + return 0; +} + +static void vfio_display_edid_init(VFIOPCIDevice *vdev) +{ + VFIODisplay *dpy =3D vdev->dpy; + int ret; + + ret =3D vfio_get_dev_region_info(&vdev->vbasedev, + VFIO_REGION_TYPE_GFX, + VFIO_REGION_SUBTYPE_GFX_EDID, + &dpy->edid_info); + if (ret) { + return; + } + + dpy->edid_regs =3D g_new0(struct vfio_region_gfx_edid, 1); + pread_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, edid_of= fset); + pread_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, edid_ma= x_size); + pread_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, max_xre= s); + pread_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, max_yre= s); + dpy->edid_blob =3D g_malloc0(dpy->edid_regs->edid_max_size); + + vfio_display_edid_update(vdev, true, 0, 0); + return; + +err: + fprintf(stderr, "%s: Oops, pread error\n", __func__); + g_free(dpy->edid_regs); + dpy->edid_regs =3D NULL; + return; +} + +static void vfio_display_edid_exit(VFIODisplay *dpy) +{ + if (!dpy->edid_regs) + return; + + g_free(dpy->edid_regs); + g_free(dpy->edid_blob); +} + static void vfio_display_update_cursor(VFIODMABuf *dmabuf, struct vfio_device_gfx_plane_info *= plane) { @@ -171,6 +286,7 @@ static void vfio_display_dmabuf_update(void *opaque) =20 static const GraphicHwOps vfio_display_dmabuf_ops =3D { .gfx_update =3D vfio_display_dmabuf_update, + .ui_info =3D vfio_display_edid_ui_info, }; =20 static int vfio_display_dmabuf_init(VFIOPCIDevice *vdev, Error **errp) @@ -187,6 +303,7 @@ static int vfio_display_dmabuf_init(VFIOPCIDevice *vdev= , Error **errp) if (vdev->enable_ramfb) { vdev->dpy->ramfb =3D ramfb_setup(errp); } + vfio_display_edid_init(vdev); return 0; } =20 @@ -366,5 +483,6 @@ void vfio_display_finalize(VFIOPCIDevice *vdev) graphic_console_close(vdev->dpy->con); vfio_display_dmabuf_exit(vdev->dpy); vfio_display_region_exit(vdev->dpy); + vfio_display_edid_exit(vdev->dpy); g_free(vdev->dpy); } --=20 2.9.3 From nobody Fri Apr 19 12:00:27 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547199257776930.3426027488644; Fri, 11 Jan 2019 01:34:17 -0800 (PST) Received: from localhost ([127.0.0.1]:43934 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghtCb-0001qv-LY for importer@patchew.org; Fri, 11 Jan 2019 04:34:09 -0500 Received: from eggs.gnu.org ([209.51.188.92]:34561) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghtAH-0000ix-Kk for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ghtAB-0003GM-AA for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:41 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40426) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ghtA7-00034x-4v for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:37 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 049CA356F3; Fri, 11 Jan 2019 09:31:23 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-117-186.ams2.redhat.com [10.36.117.186]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1FBE81F0; Fri, 11 Jan 2019 09:31:17 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 6D2299AD8; Fri, 11 Jan 2019 10:31:16 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Fri, 11 Jan 2019 10:31:14 +0100 Message-Id: <20190111093116.17188-4-kraxel@redhat.com> In-Reply-To: <20190111093116.17188-1-kraxel@redhat.com> References: <20190111093116.17188-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Fri, 11 Jan 2019 09:31:23 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 3/5] vfio/display: add xres + yres properties 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 , intel-gvt-dev@lists.freedesktop.org, Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This allows configure the display resolution which the vgpu should use. The information will be passed to the guest using EDID, so the mdev driver must support the vfio edid region for this to work. Signed-off-by: Gerd Hoffmann --- hw/vfio/pci.h | 2 ++ hw/vfio/display.c | 10 ++++++++-- hw/vfio/pci.c | 2 ++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h index b1ae4c0754..c11c3f1670 100644 --- a/hw/vfio/pci.h +++ b/hw/vfio/pci.h @@ -149,6 +149,8 @@ typedef struct VFIOPCIDevice { #define VFIO_FEATURE_ENABLE_IGD_OPREGION \ (1 << VFIO_FEATURE_ENABLE_IGD_OPREGION_BIT) OnOffAuto display; + uint32_t display_xres; + uint32_t display_yres; int32_t bootindex; uint32_t igd_gms; OffAutoPCIBAR msix_relo; diff --git a/hw/vfio/display.c b/hw/vfio/display.c index 0ef4d77e21..3a10072823 100644 --- a/hw/vfio/display.c +++ b/hw/vfio/display.c @@ -43,8 +43,8 @@ static void vfio_display_edid_update(VFIOPCIDevice *vdev,= bool enabled, int pref qemu_edid_info edid =3D { .maxx =3D dpy->edid_regs->max_xres, .maxy =3D dpy->edid_regs->max_yres, - .prefx =3D prefx, - .prefy =3D prefy, + .prefx =3D prefx ?: vdev->display_xres, + .prefy =3D prefy ?: vdev->display_yres, }; =20 dpy->edid_regs->link_state =3D VFIO_DEVICE_GFX_LINK_STATE_DOWN; @@ -120,6 +120,12 @@ static void vfio_display_edid_init(VFIOPCIDevice *vdev) pread_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, max_yre= s); dpy->edid_blob =3D g_malloc0(dpy->edid_regs->edid_max_size); =20 + /* if xres + yres properties are unset use the maximum resolution */ + if (!vdev->display_xres) + vdev->display_xres =3D dpy->edid_regs->max_xres; + if (!vdev->display_yres) + vdev->display_yres =3D dpy->edid_regs->max_yres; + vfio_display_edid_update(vdev, true, 0, 0); return; =20 diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index c0cb1ec289..6f9b6992fc 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -3182,6 +3182,8 @@ static Property vfio_pci_dev_properties[] =3D { DEFINE_PROP_STRING("sysfsdev", VFIOPCIDevice, vbasedev.sysfsdev), DEFINE_PROP_ON_OFF_AUTO("display", VFIOPCIDevice, display, ON_OFF_AUTO_OFF), + DEFINE_PROP_UINT32("xres", VFIOPCIDevice, display_xres, 0), + DEFINE_PROP_UINT32("yres", VFIOPCIDevice, display_yres, 0), DEFINE_PROP_UINT32("x-intx-mmap-timeout-ms", VFIOPCIDevice, intx.mmap_timeout, 1100), DEFINE_PROP_BIT("x-vga", VFIOPCIDevice, features, --=20 2.9.3 From nobody Fri Apr 19 12:00:27 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547199251642634.1229533982113; Fri, 11 Jan 2019 01:34:11 -0800 (PST) Received: from localhost ([127.0.0.1]:43896 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghtCR-0001kZ-9i for importer@patchew.org; Fri, 11 Jan 2019 04:33:59 -0500 Received: from eggs.gnu.org ([209.51.188.92]:34530) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghtAB-0000fa-IB for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ghtA7-0003EK-5o for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:39 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40430) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ghtA3-000357-Jf for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:33 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 60EF3A7893; Fri, 11 Jan 2019 09:31:23 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-117-186.ams2.redhat.com [10.36.117.186]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2596E1714B; Fri, 11 Jan 2019 09:31:17 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 763B09AD9; Fri, 11 Jan 2019 10:31:16 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Fri, 11 Jan 2019 10:31:15 +0100 Message-Id: <20190111093116.17188-5-kraxel@redhat.com> In-Reply-To: <20190111093116.17188-1-kraxel@redhat.com> References: <20190111093116.17188-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Fri, 11 Jan 2019 09:31:23 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 4/5] vfio/display: delay link up event 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 , intel-gvt-dev@lists.freedesktop.org, Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Kick the display link up event with a 0.1 sec delay, so the guest has a chance to notice the link down first. Signed-off-by: Gerd Hoffmann --- include/hw/vfio/vfio-common.h | 1 + hw/vfio/display.c | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index ff5c425048..9e29d5810e 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -151,6 +151,7 @@ typedef struct VFIODisplay { struct vfio_region_info *edid_info; struct vfio_region_gfx_edid *edid_regs; uint8_t *edid_blob; + QEMUTimer *edid_link_timer; struct { VFIORegion buffer; DisplaySurface *surface; diff --git a/hw/vfio/display.c b/hw/vfio/display.c index 3a10072823..a3a710b3ee 100644 --- a/hw/vfio/display.c +++ b/hw/vfio/display.c @@ -37,6 +37,19 @@ goto err; =20 =20 +static void vfio_display_edid_link_up(void *opaque) +{ + VFIOPCIDevice *vdev =3D opaque; + VFIODisplay *dpy =3D vdev->dpy; + + dpy->edid_regs->link_state =3D VFIO_DEVICE_GFX_LINK_STATE_UP; + pwrite_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, link_s= tate); + return; + +err: + fprintf(stderr, "%s: Oops, pwrite error\n", __func__); +} + static void vfio_display_edid_update(VFIOPCIDevice *vdev, bool enabled, in= t prefx, int prefy) { VFIODisplay *dpy =3D vdev->dpy; @@ -47,6 +60,7 @@ static void vfio_display_edid_update(VFIOPCIDevice *vdev,= bool enabled, int pref .prefy =3D prefy ?: vdev->display_yres, }; =20 + timer_del(dpy->edid_link_timer); dpy->edid_regs->link_state =3D VFIO_DEVICE_GFX_LINK_STATE_DOWN; pwrite_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, link_s= tate); =20 @@ -72,8 +86,7 @@ static void vfio_display_edid_update(VFIOPCIDevice *vdev,= bool enabled, int pref goto err; } =20 - dpy->edid_regs->link_state =3D VFIO_DEVICE_GFX_LINK_STATE_UP; - pwrite_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, link_s= tate); + timer_mod(dpy->edid_link_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME)= + 100); return; =20 err: @@ -126,6 +139,9 @@ static void vfio_display_edid_init(VFIOPCIDevice *vdev) if (!vdev->display_yres) vdev->display_yres =3D dpy->edid_regs->max_yres; =20 + dpy->edid_link_timer =3D timer_new_ms(QEMU_CLOCK_REALTIME, + vfio_display_edid_link_up, vdev); + vfio_display_edid_update(vdev, true, 0, 0); return; =20 @@ -143,6 +159,8 @@ static void vfio_display_edid_exit(VFIODisplay *dpy) =20 g_free(dpy->edid_regs); g_free(dpy->edid_blob); + timer_del(dpy->edid_link_timer); + timer_free(dpy->edid_link_timer); } =20 static void vfio_display_update_cursor(VFIODMABuf *dmabuf, --=20 2.9.3 From nobody Fri Apr 19 12:00:27 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 154719941269582.98184405636596; Fri, 11 Jan 2019 01:36:52 -0800 (PST) Received: from localhost ([127.0.0.1]:44640 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghtFD-0004H3-Nw for importer@patchew.org; Fri, 11 Jan 2019 04:36:51 -0500 Received: from eggs.gnu.org ([209.51.188.92]:34585) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghtAQ-0000mo-CB for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ghtAF-0003Uw-RC for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:47 -0500 Received: from mx1.redhat.com ([209.132.183.28]:43680) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ghtAB-000383-Ec for qemu-devel@nongnu.org; Fri, 11 Jan 2019 04:31:41 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E40687EBBA; Fri, 11 Jan 2019 09:31:27 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-117-186.ams2.redhat.com [10.36.117.186]) by smtp.corp.redhat.com (Postfix) with ESMTP id BDDA11019626; Fri, 11 Jan 2019 09:31:22 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 7DFCD9AB2; Fri, 11 Jan 2019 10:31:16 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Fri, 11 Jan 2019 10:31:16 +0100 Message-Id: <20190111093116.17188-6-kraxel@redhat.com> In-Reply-To: <20190111093116.17188-1-kraxel@redhat.com> References: <20190111093116.17188-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Fri, 11 Jan 2019 09:31:27 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 5/5] [debug] some logging 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 , intel-gvt-dev@lists.freedesktop.org, Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" --- hw/vfio/display.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/hw/vfio/display.c b/hw/vfio/display.c index a3a710b3ee..96b5474243 100644 --- a/hw/vfio/display.c +++ b/hw/vfio/display.c @@ -42,6 +42,8 @@ static void vfio_display_edid_link_up(void *opaque) VFIOPCIDevice *vdev =3D opaque; VFIODisplay *dpy =3D vdev->dpy; =20 + fprintf(stderr, "%s:\n", __func__); + dpy->edid_regs->link_state =3D VFIO_DEVICE_GFX_LINK_STATE_UP; pwrite_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, link_s= tate); return; @@ -60,6 +62,9 @@ static void vfio_display_edid_update(VFIOPCIDevice *vdev,= bool enabled, int pref .prefy =3D prefy ?: vdev->display_yres, }; =20 + fprintf(stderr, "%s: ui info: %dx%d, %s\n", __func__, + prefx, prefy, enabled ? "on" : "off"); + timer_del(dpy->edid_link_timer); dpy->edid_regs->link_state =3D VFIO_DEVICE_GFX_LINK_STATE_DOWN; pwrite_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, link_s= tate); @@ -74,6 +79,9 @@ static void vfio_display_edid_update(VFIOPCIDevice *vdev,= bool enabled, int pref if (edid.maxy && edid.prefy > edid.maxy) { edid.prefy =3D edid.maxy; } + fprintf(stderr, "%s: edid: %dx%d\n", __func__, + edid.prefx, edid.prefy); + qemu_edid_generate(dpy->edid_blob, dpy->edid_regs->edid_max_size, &edid); @@ -123,6 +131,8 @@ static void vfio_display_edid_init(VFIOPCIDevice *vdev) VFIO_REGION_SUBTYPE_GFX_EDID, &dpy->edid_info); if (ret) { + fprintf(stderr, "%s: no edid region (%s)\n", + __func__, strerror(errno)); return; } =20 @@ -132,6 +142,12 @@ static void vfio_display_edid_init(VFIOPCIDevice *vdev) pread_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, max_xre= s); pread_field(vdev->vbasedev.fd, dpy->edid_info, dpy->edid_regs, max_yre= s); dpy->edid_blob =3D g_malloc0(dpy->edid_regs->edid_max_size); + fprintf(stderr, "%s: edid region: offset %d, size %d, max-res %dx%d\n", + __func__, + dpy->edid_regs->edid_offset, + dpy->edid_regs->edid_max_size, + dpy->edid_regs->max_xres, + dpy->edid_regs->max_yres); =20 /* if xres + yres properties are unset use the maximum resolution */ if (!vdev->display_xres) --=20 2.9.3