Commit 8781c701 authored by Gerd Hoffmann's avatar Gerd Hoffmann Committed by Alex Williamson
Browse files

vfio/display: delay link up event



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: default avatarGerd Hoffmann <kraxel@redhat.com>
Reviewed-by: default avatarLiam Merwick <liam.merwick@oracle.com>
[update for redefined macro]
Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent c62a0c7c
Loading
Loading
Loading
Loading
+25 −5
Original line number Diff line number Diff line
@@ -37,6 +37,23 @@
            _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)
{
@@ -49,6 +66,7 @@ static void vfio_display_edid_update(VFIOPCIDevice *vdev, bool enabled,
        .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;
@@ -80,11 +98,8 @@ static void vfio_display_edid_update(VFIOPCIDevice *vdev, bool enabled,
        goto err;
    }

    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();
    timer_mod(dpy->edid_link_timer,
              qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + 100);
    return;

err:
@@ -150,6 +165,9 @@ static void vfio_display_edid_init(VFIOPCIDevice *vdev)
        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;

@@ -168,6 +186,8 @@ static void vfio_display_edid_exit(VFIODisplay *dpy)

    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,
+1 −0
Original line number Diff line number Diff line
@@ -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;