VFIO updates 2019-03-11
- Resolution support for mdev displays supporting EDID interface
    (Gerd Hoffmann)
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.14 (GNU/Linux)
 
 iQIcBAABAgAGBQJchrRTAAoJECObm247sIsiQwMQAIENkbd41VAcUFkoSLfloebP
 FppvUoCdWKkVLaOeEltlOGJyxh6Ixirv+iUTw3+5kNPyZyXdOaFp0pOr/SCD9p1x
 l2kYUazxCJM495py15o646X/ZKeUHKNU01X+7ZcQqQXwYqnNBVDVClAYw+kNJ2aL
 2QJ2KkaHu/JJJTQqWgOBcAVI10CeaBoTaZT65gmPELSUS3NsjSSjErJiQREzHoyP
 J0LsYuk1UVF80FP7ZNo2kS1UPmDEyQPISaDcgngvxjeR9KWE6TuHcsI9xJz4k4sm
 S/QxAlYWdXYX/I5pC0UlBEvaJxSsXSf4gr+AGYm4ebnptONT5/m82pc6YMitHr1C
 XDkbXkxv2n9q2NG9kbDvUdjlDt99W81XxTOpp/LkrGjrI7RkwowIHVSDNFYzmNFV
 Pma1Q93q1Zr6HiAm7817bEFltO9RjAMmiFCvgAyWWSwCwWI1I19BfCSJ/8aGhrwR
 GIIW+cTHZYXH70os354XrpYsW8sZNFbjtfhOUt5b5H4l341FR9+w6nmB/BJDz5U5
 ijm6ABWnT6UYx2n4lpwO0vuBtOMplL7tkxHI8+iiX4HeKGvhmaxLiNaeIFC5w65J
 MvdlTBMFKJgxXqfKDTlHkxkLoF7vjOUr7vflcSCny53RSUUztajpBy0ByRWIeTPH
 PvmnGbV+Y3EGhRSjpFwU
 =5V6/
 -----END PGP SIGNATURE-----
Merge remote-tracking branch 'remotes/awilliam/tags/vfio-updates-20190311.0' into staging
VFIO updates 2019-03-11
 - Resolution support for mdev displays supporting EDID interface
   (Gerd Hoffmann)
# gpg: Signature made Mon 11 Mar 2019 19:17:39 GMT
# gpg:                using RSA key 239B9B6E3BB08B22
# gpg: Good signature from "Alex Williamson <alex.williamson@redhat.com>" [full]
# gpg:                 aka "Alex Williamson <alex@shazbot.org>" [full]
# gpg:                 aka "Alex Williamson <alwillia@redhat.com>" [full]
# gpg:                 aka "Alex Williamson <alex.l.williamson@gmail.com>" [full]
# Primary key fingerprint: 42F6 C04E 540B D1A9 9E7B  8A90 239B 9B6E 3BB0 8B22
* remotes/awilliam/tags/vfio-updates-20190311.0:
  vfio/display: delay link up event
  vfio/display: add xres + yres properties
  vfio/display: add edid support.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
			
			
This commit is contained in:
		
						commit
						46316f1dff
					
				@ -15,15 +15,181 @@
 | 
				
			|||||||
#include <sys/ioctl.h>
 | 
					#include <sys/ioctl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "sysemu/sysemu.h"
 | 
					#include "sysemu/sysemu.h"
 | 
				
			||||||
 | 
					#include "hw/display/edid.h"
 | 
				
			||||||
#include "ui/console.h"
 | 
					#include "ui/console.h"
 | 
				
			||||||
#include "qapi/error.h"
 | 
					#include "qapi/error.h"
 | 
				
			||||||
#include "pci.h"
 | 
					#include "pci.h"
 | 
				
			||||||
 | 
					#include "trace.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef DRM_PLANE_TYPE_PRIMARY
 | 
					#ifndef DRM_PLANE_TYPE_PRIMARY
 | 
				
			||||||
# define DRM_PLANE_TYPE_PRIMARY 1
 | 
					# define DRM_PLANE_TYPE_PRIMARY 1
 | 
				
			||||||
# define DRM_PLANE_TYPE_CURSOR  2
 | 
					# define DRM_PLANE_TYPE_CURSOR  2
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define pread_field(_fd, _reg, _ptr, _fld)                              \
 | 
				
			||||||
 | 
					    (sizeof(_ptr->_fld) !=                                              \
 | 
				
			||||||
 | 
					     pread(_fd, &(_ptr->_fld), sizeof(_ptr->_fld),                      \
 | 
				
			||||||
 | 
					           _reg->offset + offsetof(typeof(*_ptr), _fld)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define pwrite_field(_fd, _reg, _ptr, _fld)                             \
 | 
				
			||||||
 | 
					    (sizeof(_ptr->_fld) !=                                              \
 | 
				
			||||||
 | 
					     pwrite(_fd, &(_ptr->_fld), sizeof(_ptr->_fld),                     \
 | 
				
			||||||
 | 
					            _reg->offset + offsetof(typeof(*_ptr), _fld)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void vfio_display_edid_link_up(void *opaque)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    VFIOPCIDevice *vdev = opaque;
 | 
				
			||||||
 | 
					    VFIODisplay *dpy = vdev->dpy;
 | 
				
			||||||
 | 
					    int fd = vdev->vbasedev.fd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dpy->edid_regs->link_state = VFIO_DEVICE_GFX_LINK_STATE_UP;
 | 
				
			||||||
 | 
					    if (pwrite_field(fd, dpy->edid_info, dpy->edid_regs, link_state)) {
 | 
				
			||||||
 | 
					        goto err;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    trace_vfio_display_edid_link_up();
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					err:
 | 
				
			||||||
 | 
					    trace_vfio_display_edid_write_error();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void vfio_display_edid_update(VFIOPCIDevice *vdev, bool enabled,
 | 
				
			||||||
 | 
					                                     int prefx, int prefy)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    VFIODisplay *dpy = vdev->dpy;
 | 
				
			||||||
 | 
					    int fd = vdev->vbasedev.fd;
 | 
				
			||||||
 | 
					    qemu_edid_info edid = {
 | 
				
			||||||
 | 
					        .maxx  = dpy->edid_regs->max_xres,
 | 
				
			||||||
 | 
					        .maxy  = dpy->edid_regs->max_yres,
 | 
				
			||||||
 | 
					        .prefx = prefx ?: vdev->display_xres,
 | 
				
			||||||
 | 
					        .prefy = prefy ?: vdev->display_yres,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    timer_del(dpy->edid_link_timer);
 | 
				
			||||||
 | 
					    dpy->edid_regs->link_state = VFIO_DEVICE_GFX_LINK_STATE_DOWN;
 | 
				
			||||||
 | 
					    if (pwrite_field(fd, dpy->edid_info, dpy->edid_regs, link_state)) {
 | 
				
			||||||
 | 
					        goto err;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    trace_vfio_display_edid_link_down();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!enabled) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (edid.maxx && edid.prefx > edid.maxx) {
 | 
				
			||||||
 | 
					        edid.prefx = edid.maxx;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (edid.maxy && edid.prefy > edid.maxy) {
 | 
				
			||||||
 | 
					        edid.prefy = edid.maxy;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    qemu_edid_generate(dpy->edid_blob,
 | 
				
			||||||
 | 
					                       dpy->edid_regs->edid_max_size,
 | 
				
			||||||
 | 
					                       &edid);
 | 
				
			||||||
 | 
					    trace_vfio_display_edid_update(edid.prefx, edid.prefy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dpy->edid_regs->edid_size = qemu_edid_size(dpy->edid_blob);
 | 
				
			||||||
 | 
					    if (pwrite_field(fd, dpy->edid_info, dpy->edid_regs, edid_size)) {
 | 
				
			||||||
 | 
					        goto err;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (pwrite(fd, dpy->edid_blob, dpy->edid_regs->edid_size,
 | 
				
			||||||
 | 
					               dpy->edid_info->offset + dpy->edid_regs->edid_offset)
 | 
				
			||||||
 | 
					        != dpy->edid_regs->edid_size) {
 | 
				
			||||||
 | 
					        goto err;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    timer_mod(dpy->edid_link_timer,
 | 
				
			||||||
 | 
					              qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + 100);
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					err:
 | 
				
			||||||
 | 
					    trace_vfio_display_edid_write_error();
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int vfio_display_edid_ui_info(void *opaque, uint32_t idx,
 | 
				
			||||||
 | 
					                                     QemuUIInfo *info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    VFIOPCIDevice *vdev = opaque;
 | 
				
			||||||
 | 
					    VFIODisplay *dpy = 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 = vdev->dpy;
 | 
				
			||||||
 | 
					    int fd = vdev->vbasedev.fd;
 | 
				
			||||||
 | 
					    int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = vfio_get_dev_region_info(&vdev->vbasedev,
 | 
				
			||||||
 | 
					                                   VFIO_REGION_TYPE_GFX,
 | 
				
			||||||
 | 
					                                   VFIO_REGION_SUBTYPE_GFX_EDID,
 | 
				
			||||||
 | 
					                                   &dpy->edid_info);
 | 
				
			||||||
 | 
					    if (ret) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    trace_vfio_display_edid_available();
 | 
				
			||||||
 | 
					    dpy->edid_regs = g_new0(struct vfio_region_gfx_edid, 1);
 | 
				
			||||||
 | 
					    if (pread_field(fd, dpy->edid_info, dpy->edid_regs, edid_offset)) {
 | 
				
			||||||
 | 
					        goto err;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (pread_field(fd, dpy->edid_info, dpy->edid_regs, edid_max_size)) {
 | 
				
			||||||
 | 
					        goto err;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (pread_field(fd, dpy->edid_info, dpy->edid_regs, max_xres)) {
 | 
				
			||||||
 | 
					        goto err;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (pread_field(fd, dpy->edid_info, dpy->edid_regs, max_yres)) {
 | 
				
			||||||
 | 
					        goto err;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dpy->edid_blob = g_malloc0(dpy->edid_regs->edid_max_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* if xres + yres properties are unset use the maximum resolution */
 | 
				
			||||||
 | 
					    if (!vdev->display_xres) {
 | 
				
			||||||
 | 
					        vdev->display_xres = dpy->edid_regs->max_xres;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!vdev->display_yres) {
 | 
				
			||||||
 | 
					        vdev->display_yres = dpy->edid_regs->max_yres;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dpy->edid_link_timer = timer_new_ms(QEMU_CLOCK_REALTIME,
 | 
				
			||||||
 | 
					                                        vfio_display_edid_link_up, vdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    vfio_display_edid_update(vdev, true, 0, 0);
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					err:
 | 
				
			||||||
 | 
					    trace_vfio_display_edid_write_error();
 | 
				
			||||||
 | 
					    g_free(dpy->edid_regs);
 | 
				
			||||||
 | 
					    dpy->edid_regs = 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);
 | 
				
			||||||
 | 
					    timer_del(dpy->edid_link_timer);
 | 
				
			||||||
 | 
					    timer_free(dpy->edid_link_timer);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void vfio_display_update_cursor(VFIODMABuf *dmabuf,
 | 
					static void vfio_display_update_cursor(VFIODMABuf *dmabuf,
 | 
				
			||||||
                                       struct vfio_device_gfx_plane_info *plane)
 | 
					                                       struct vfio_device_gfx_plane_info *plane)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -171,6 +337,7 @@ static void vfio_display_dmabuf_update(void *opaque)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static const GraphicHwOps vfio_display_dmabuf_ops = {
 | 
					static const GraphicHwOps vfio_display_dmabuf_ops = {
 | 
				
			||||||
    .gfx_update = vfio_display_dmabuf_update,
 | 
					    .gfx_update = vfio_display_dmabuf_update,
 | 
				
			||||||
 | 
					    .ui_info    = vfio_display_edid_ui_info,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int vfio_display_dmabuf_init(VFIOPCIDevice *vdev, Error **errp)
 | 
					static int vfio_display_dmabuf_init(VFIOPCIDevice *vdev, Error **errp)
 | 
				
			||||||
@ -187,6 +354,7 @@ static int vfio_display_dmabuf_init(VFIOPCIDevice *vdev, Error **errp)
 | 
				
			|||||||
    if (vdev->enable_ramfb) {
 | 
					    if (vdev->enable_ramfb) {
 | 
				
			||||||
        vdev->dpy->ramfb = ramfb_setup(errp);
 | 
					        vdev->dpy->ramfb = ramfb_setup(errp);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    vfio_display_edid_init(vdev);
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -366,5 +534,6 @@ void vfio_display_finalize(VFIOPCIDevice *vdev)
 | 
				
			|||||||
    graphic_console_close(vdev->dpy->con);
 | 
					    graphic_console_close(vdev->dpy->con);
 | 
				
			||||||
    vfio_display_dmabuf_exit(vdev->dpy);
 | 
					    vfio_display_dmabuf_exit(vdev->dpy);
 | 
				
			||||||
    vfio_display_region_exit(vdev->dpy);
 | 
					    vfio_display_region_exit(vdev->dpy);
 | 
				
			||||||
 | 
					    vfio_display_edid_exit(vdev->dpy);
 | 
				
			||||||
    g_free(vdev->dpy);
 | 
					    g_free(vdev->dpy);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -3068,6 +3068,16 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
 | 
				
			|||||||
        error_setg(errp, "ramfb=on requires display=on");
 | 
					        error_setg(errp, "ramfb=on requires display=on");
 | 
				
			||||||
        goto out_teardown;
 | 
					        goto out_teardown;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (vdev->display_xres || vdev->display_yres) {
 | 
				
			||||||
 | 
					        if (vdev->dpy == NULL) {
 | 
				
			||||||
 | 
					            error_setg(errp, "xres and yres properties require display=on");
 | 
				
			||||||
 | 
					            goto out_teardown;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (vdev->dpy->edid_regs == NULL) {
 | 
				
			||||||
 | 
					            error_setg(errp, "xres and yres properties need edid support");
 | 
				
			||||||
 | 
					            goto out_teardown;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    vfio_register_err_notifier(vdev);
 | 
					    vfio_register_err_notifier(vdev);
 | 
				
			||||||
    vfio_register_req_notifier(vdev);
 | 
					    vfio_register_req_notifier(vdev);
 | 
				
			||||||
@ -3182,6 +3192,8 @@ static Property vfio_pci_dev_properties[] = {
 | 
				
			|||||||
    DEFINE_PROP_STRING("sysfsdev", VFIOPCIDevice, vbasedev.sysfsdev),
 | 
					    DEFINE_PROP_STRING("sysfsdev", VFIOPCIDevice, vbasedev.sysfsdev),
 | 
				
			||||||
    DEFINE_PROP_ON_OFF_AUTO("display", VFIOPCIDevice,
 | 
					    DEFINE_PROP_ON_OFF_AUTO("display", VFIOPCIDevice,
 | 
				
			||||||
                            display, ON_OFF_AUTO_OFF),
 | 
					                            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,
 | 
					    DEFINE_PROP_UINT32("x-intx-mmap-timeout-ms", VFIOPCIDevice,
 | 
				
			||||||
                       intx.mmap_timeout, 1100),
 | 
					                       intx.mmap_timeout, 1100),
 | 
				
			||||||
    DEFINE_PROP_BIT("x-vga", VFIOPCIDevice, features,
 | 
					    DEFINE_PROP_BIT("x-vga", VFIOPCIDevice, features,
 | 
				
			||||||
 | 
				
			|||||||
@ -149,6 +149,8 @@ typedef struct VFIOPCIDevice {
 | 
				
			|||||||
#define VFIO_FEATURE_ENABLE_IGD_OPREGION \
 | 
					#define VFIO_FEATURE_ENABLE_IGD_OPREGION \
 | 
				
			||||||
                                (1 << VFIO_FEATURE_ENABLE_IGD_OPREGION_BIT)
 | 
					                                (1 << VFIO_FEATURE_ENABLE_IGD_OPREGION_BIT)
 | 
				
			||||||
    OnOffAuto display;
 | 
					    OnOffAuto display;
 | 
				
			||||||
 | 
					    uint32_t display_xres;
 | 
				
			||||||
 | 
					    uint32_t display_yres;
 | 
				
			||||||
    int32_t bootindex;
 | 
					    int32_t bootindex;
 | 
				
			||||||
    uint32_t igd_gms;
 | 
					    uint32_t igd_gms;
 | 
				
			||||||
    OffAutoPCIBAR msix_relo;
 | 
					    OffAutoPCIBAR msix_relo;
 | 
				
			||||||
 | 
				
			|||||||
@ -132,3 +132,10 @@ vfio_prereg_unregister(uint64_t va, uint64_t size, int ret) "va=0x%"PRIx64" size
 | 
				
			|||||||
vfio_spapr_create_window(int ps, unsigned int levels, uint64_t ws, uint64_t off) "pageshift=0x%x levels=%u winsize=0x%"PRIx64" offset=0x%"PRIx64
 | 
					vfio_spapr_create_window(int ps, unsigned int levels, uint64_t ws, uint64_t off) "pageshift=0x%x levels=%u winsize=0x%"PRIx64" offset=0x%"PRIx64
 | 
				
			||||||
vfio_spapr_remove_window(uint64_t off) "offset=0x%"PRIx64
 | 
					vfio_spapr_remove_window(uint64_t off) "offset=0x%"PRIx64
 | 
				
			||||||
vfio_spapr_group_attach(int groupfd, int tablefd) "Attached groupfd %d to liobn fd %d"
 | 
					vfio_spapr_group_attach(int groupfd, int tablefd) "Attached groupfd %d to liobn fd %d"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# hw/vfio/display.c
 | 
				
			||||||
 | 
					vfio_display_edid_available(void) ""
 | 
				
			||||||
 | 
					vfio_display_edid_link_up(void) ""
 | 
				
			||||||
 | 
					vfio_display_edid_link_down(void) ""
 | 
				
			||||||
 | 
					vfio_display_edid_update(uint32_t prefx, uint32_t prefy) "%ux%u"
 | 
				
			||||||
 | 
					vfio_display_edid_write_error(void) ""
 | 
				
			||||||
 | 
				
			|||||||
@ -148,6 +148,10 @@ typedef struct VFIODMABuf {
 | 
				
			|||||||
typedef struct VFIODisplay {
 | 
					typedef struct VFIODisplay {
 | 
				
			||||||
    QemuConsole *con;
 | 
					    QemuConsole *con;
 | 
				
			||||||
    RAMFBState *ramfb;
 | 
					    RAMFBState *ramfb;
 | 
				
			||||||
 | 
					    struct vfio_region_info *edid_info;
 | 
				
			||||||
 | 
					    struct vfio_region_gfx_edid *edid_regs;
 | 
				
			||||||
 | 
					    uint8_t *edid_blob;
 | 
				
			||||||
 | 
					    QEMUTimer *edid_link_timer;
 | 
				
			||||||
    struct {
 | 
					    struct {
 | 
				
			||||||
        VFIORegion buffer;
 | 
					        VFIORegion buffer;
 | 
				
			||||||
        DisplaySurface *surface;
 | 
					        DisplaySurface *surface;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user