| From 443da6a16d58831dec80c66e2069612f9cba6d31 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 22 Jun 2020 23:57:53 +0800 |
| Subject: drm/mediatek: Check plane visibility in atomic_update |
| |
| From: Hsin-Yi Wang <hsinyi@chromium.org> |
| |
| [ Upstream commit c0b8892e2461b5fa740e47efbb1269a487b04020 ] |
| |
| Disable the plane if it's not visible. Otherwise mtk_ovl_layer_config() |
| would proceed with invalid plane and we may see vblank timeout. |
| |
| Fixes: 119f5173628a ("drm/mediatek: Add DRM Driver for Mediatek SoC MT8173.") |
| Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> |
| Reviewed-by: Tomasz Figa <tfiga@chromium.org> |
| Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/mediatek/mtk_drm_plane.c | 25 ++++++++++++++---------- |
| 1 file changed, 15 insertions(+), 10 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c b/drivers/gpu/drm/mediatek/mtk_drm_plane.c |
| index 584a9ecadce62..b7592b16ea940 100644 |
| --- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c |
| +++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c |
| @@ -101,6 +101,16 @@ static int mtk_plane_atomic_check(struct drm_plane *plane, |
| true, true); |
| } |
| |
| +static void mtk_plane_atomic_disable(struct drm_plane *plane, |
| + struct drm_plane_state *old_state) |
| +{ |
| + struct mtk_plane_state *state = to_mtk_plane_state(plane->state); |
| + |
| + state->pending.enable = false; |
| + wmb(); /* Make sure the above parameter is set before update */ |
| + state->pending.dirty = true; |
| +} |
| + |
| static void mtk_plane_atomic_update(struct drm_plane *plane, |
| struct drm_plane_state *old_state) |
| { |
| @@ -115,6 +125,11 @@ static void mtk_plane_atomic_update(struct drm_plane *plane, |
| if (!crtc || WARN_ON(!fb)) |
| return; |
| |
| + if (!plane->state->visible) { |
| + mtk_plane_atomic_disable(plane, old_state); |
| + return; |
| + } |
| + |
| gem = fb->obj[0]; |
| mtk_gem = to_mtk_gem_obj(gem); |
| addr = mtk_gem->dma_addr; |
| @@ -136,16 +151,6 @@ static void mtk_plane_atomic_update(struct drm_plane *plane, |
| state->pending.dirty = true; |
| } |
| |
| -static void mtk_plane_atomic_disable(struct drm_plane *plane, |
| - struct drm_plane_state *old_state) |
| -{ |
| - struct mtk_plane_state *state = to_mtk_plane_state(plane->state); |
| - |
| - state->pending.enable = false; |
| - wmb(); /* Make sure the above parameter is set before update */ |
| - state->pending.dirty = true; |
| -} |
| - |
| static const struct drm_plane_helper_funcs mtk_plane_helper_funcs = { |
| .prepare_fb = drm_gem_fb_prepare_fb, |
| .atomic_check = mtk_plane_atomic_check, |
| -- |
| 2.25.1 |
| |