aboutsummaryrefslogtreecommitdiff
path: root/hw/vfio
diff options
context:
space:
mode:
Diffstat (limited to 'hw/vfio')
-rw-r--r--hw/vfio/display.c11
-rw-r--r--hw/vfio/pci.c4
-rw-r--r--hw/vfio/pci.h1
3 files changed, 16 insertions, 0 deletions
diff --git a/hw/vfio/display.c b/hw/vfio/display.c
index 7d727ce910..59c0e5d1d7 100644
--- a/hw/vfio/display.c
+++ b/hw/vfio/display.c
@@ -198,6 +198,17 @@ static void vfio_display_dmabuf_exit(VFIODisplay *dpy)
}
/* ---------------------------------------------------------------------- */
+void vfio_display_reset(VFIOPCIDevice *vdev)
+{
+ if (!vdev || !vdev->dpy || !vdev->dpy->con ||
+ !vdev->dpy->dmabuf.primary) {
+ return;
+ }
+
+ dpy_gl_scanout_disable(vdev->dpy->con);
+ vfio_display_dmabuf_exit(vdev->dpy);
+ dpy_gfx_update_full(vdev->dpy->con);
+}
static void vfio_display_region_update(void *opaque)
{
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index b9bc6cd310..4947fe39a2 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -3103,6 +3103,10 @@ static void vfio_pci_reset(DeviceState *dev)
vfio_pci_pre_reset(vdev);
+ if (vdev->display != ON_OFF_AUTO_OFF) {
+ vfio_display_reset(vdev);
+ }
+
if (vdev->resetfn && !vdev->resetfn(vdev)) {
goto post_reset;
}
diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
index 629c875701..59ab7757a3 100644
--- a/hw/vfio/pci.h
+++ b/hw/vfio/pci.h
@@ -176,6 +176,7 @@ int vfio_pci_igd_opregion_init(VFIOPCIDevice *vdev,
struct vfio_region_info *info,
Error **errp);
+void vfio_display_reset(VFIOPCIDevice *vdev);
int vfio_display_probe(VFIOPCIDevice *vdev, Error **errp);
void vfio_display_finalize(VFIOPCIDevice *vdev);