Commit db3566cf authored by Hans de Goede's avatar Hans de Goede Committed by Greg Kroah-Hartman

staging: vboxvideo: Keep old mode when disable crtc

On DPMS off we get a call to vbx_crtc_atomic_disable, followed by
a call to vbox_primary_atomic_update, at which point crtc_state->enable
is 0 and crtc_state->mode has been zero-ed. On a 0 width/height
vbox_do_modeset() falls back to 640x480, so this causes the guest Window
(its "monitor") to resize to 640x480 (and become black).

This commit makes us not look at crtc_state->mode when crtc_state->enable
is not set, so that we keep the old mode and just make the window go black.
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ba2181d7
...@@ -190,7 +190,6 @@ static bool vbox_set_up_input_mapping(struct vbox_private *vbox) ...@@ -190,7 +190,6 @@ static bool vbox_set_up_input_mapping(struct vbox_private *vbox)
static void vbox_crtc_set_base_and_mode(struct drm_crtc *crtc, static void vbox_crtc_set_base_and_mode(struct drm_crtc *crtc,
struct drm_framebuffer *fb, struct drm_framebuffer *fb,
struct drm_display_mode *mode,
int x, int y) int x, int y)
{ {
struct vbox_bo *bo = gem_to_vbox_bo(to_vbox_framebuffer(fb)->obj); struct vbox_bo *bo = gem_to_vbox_bo(to_vbox_framebuffer(fb)->obj);
...@@ -200,8 +199,11 @@ static void vbox_crtc_set_base_and_mode(struct drm_crtc *crtc, ...@@ -200,8 +199,11 @@ static void vbox_crtc_set_base_and_mode(struct drm_crtc *crtc,
mutex_lock(&vbox->hw_mutex); mutex_lock(&vbox->hw_mutex);
vbox_crtc->width = mode->hdisplay; if (crtc->state->enable) {
vbox_crtc->height = mode->vdisplay; vbox_crtc->width = crtc->state->mode.hdisplay;
vbox_crtc->height = crtc->state->mode.vdisplay;
}
vbox_crtc->x = x; vbox_crtc->x = x;
vbox_crtc->y = y; vbox_crtc->y = y;
vbox_crtc->fb_offset = vbox_bo_gpu_offset(bo); vbox_crtc->fb_offset = vbox_bo_gpu_offset(bo);
...@@ -301,7 +303,7 @@ static void vbox_primary_atomic_update(struct drm_plane *plane, ...@@ -301,7 +303,7 @@ static void vbox_primary_atomic_update(struct drm_plane *plane,
struct drm_crtc *crtc = plane->state->crtc; struct drm_crtc *crtc = plane->state->crtc;
struct drm_framebuffer *fb = plane->state->fb; struct drm_framebuffer *fb = plane->state->fb;
vbox_crtc_set_base_and_mode(crtc, fb, &crtc->state->mode, vbox_crtc_set_base_and_mode(crtc, fb,
plane->state->src_x >> 16, plane->state->src_x >> 16,
plane->state->src_y >> 16); plane->state->src_y >> 16);
} }
...@@ -312,7 +314,7 @@ static void vbox_primary_atomic_disable(struct drm_plane *plane, ...@@ -312,7 +314,7 @@ static void vbox_primary_atomic_disable(struct drm_plane *plane,
struct drm_crtc *crtc = old_state->crtc; struct drm_crtc *crtc = old_state->crtc;
/* vbox_do_modeset checks plane->state->fb and will disable if NULL */ /* vbox_do_modeset checks plane->state->fb and will disable if NULL */
vbox_crtc_set_base_and_mode(crtc, old_state->fb, &crtc->state->mode, vbox_crtc_set_base_and_mode(crtc, old_state->fb,
old_state->src_x >> 16, old_state->src_x >> 16,
old_state->src_y >> 16); old_state->src_y >> 16);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment