[PATCH] drm/vmwgfx: Don't destroy Screen Target when CRTC is enabled but inactive
Martin Krastev
martin.krastev at broadcom.com
Mon Jun 3 13:02:40 UTC 2024
On Fri, May 31, 2024 at 11:34 PM Ian Forbes <ian.forbes at broadcom.com> wrote:
>
> drm_crtc_helper_funcs::atomic_disable can be called even when the CRTC is
> still enabled. This can occur when the mode changes or the CRTC is set as
> inactive.
>
> In the case where the CRTC is being set as inactive we only want to
> blank the screen. The Screen Target should remain intact as long as the
> mode has not changed and CRTC is enabled.
>
> This fixes a bug with GDM where locking the screen results in a permanent
> black screen because the Screen Target is no longer defined.
>
> Fixes: 7b0062036c3b ("drm/vmwgfx: Implement virtual crc generation")
> Signed-off-by: Ian Forbes <ian.forbes at broadcom.com>
> ---
> drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> index 2041c4d48daa..d2f523191314 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
> @@ -414,6 +414,7 @@ static void vmw_stdu_crtc_atomic_disable(struct drm_crtc *crtc,
> {
> struct vmw_private *dev_priv;
> struct vmw_screen_target_display_unit *stdu;
> + struct drm_crtc_state *new_crtc_state;
> int ret;
>
> if (!crtc) {
> @@ -423,6 +424,7 @@ static void vmw_stdu_crtc_atomic_disable(struct drm_crtc *crtc,
>
> stdu = vmw_crtc_to_stdu(crtc);
> dev_priv = vmw_priv(crtc->dev);
> + new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
>
> if (dev_priv->vkms_enabled)
> drm_crtc_vblank_off(crtc);
> @@ -434,6 +436,14 @@ static void vmw_stdu_crtc_atomic_disable(struct drm_crtc *crtc,
>
> (void) vmw_stdu_update_st(dev_priv, stdu);
>
> + /* Don't destroy the Screen Target if we are only setting the
> + * display as inactive
> + */
> + if (new_crtc_state->enable &&
> + !new_crtc_state->active &&
> + !new_crtc_state->mode_changed)
> + return;
> +
> ret = vmw_stdu_destroy_st(dev_priv, stdu);
> if (ret)
> DRM_ERROR("Failed to destroy Screen Target\n");
> --
> 2.34.1
>
LGTM!
Reviewed-by: Martin Krastev <martin.krastev at broadcom.com>
Regards,
Martin
More information about the dri-devel
mailing list