[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250929043110.3631025-2-hy_fifty.lee@samsung.com>
Date: Mon, 29 Sep 2025 13:31:08 +0900
From: Hoyoung Lee <hy_fifty.lee@...sung.com>
To: Inki Dae <inki.dae@...sung.com>, Seung-Woo Kim <sw0312.kim@...sung.com>,
Kyungmin Park <kyungmin.park@...sung.com>, David Airlie <airlied@...il.com>,
Simona Vetter <simona@...ll.ch>, Krzysztof Kozlowski <krzk@...nel.org>, Alim
Akhtar <alim.akhtar@...sung.com>
Cc: Hoyoung Lee <hy_fifty.lee@...sung.com>, dri-devel@...ts.freedesktop.org,
linux-arm-kernel@...ts.infradead.org, linux-samsung-soc@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: [PATCH 1/3] drm/exynos: plane: Disable fully off-screen planes
instead of zero-sized update
Some configurations require additional actions when all windows are
disabled to keep DECON operating correctly. Programming a zero-sized window
in ->atomic_update() leaves the plane logically enabled and can bypass
those disable semantics.
Treat a fully off-screen plane as not visible and take the explicit disable
path.
Implementation details:
- exynos_plane_mode_set(): if computed actual_w/actual_h is zero, mark
state->visible = false and return early.
- exynos_plane_atomic_check(): if !visible, skip further checks and
return 0.
- exynos_plane_atomic_update(): if !visible, call ->disable_plane();
otherwise call ->update_plane().
No functional change for visible planes; off-screen planes are now cleanly
disabled, ensuring the disable hooks run consistently.
Signed-off-by: Hoyoung Lee <hy_fifty.lee@...sung.com>
---
drivers/gpu/drm/exynos/exynos_drm_plane.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c b/drivers/gpu/drm/exynos/exynos_drm_plane.c
index 7c3aa77186d3..842974154d79 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_plane.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c
@@ -91,6 +91,11 @@ static void exynos_plane_mode_set(struct exynos_drm_plane_state *exynos_state)
actual_w = exynos_plane_get_size(crtc_x, crtc_w, mode->hdisplay);
actual_h = exynos_plane_get_size(crtc_y, crtc_h, mode->vdisplay);
+ if (!actual_w || !actual_h) {
+ state->visible = false;
+ return;
+ }
+
if (crtc_x < 0) {
if (actual_w)
src_x += ((-crtc_x) * exynos_state->h_ratio) >> 16;
@@ -244,6 +249,9 @@ static int exynos_plane_atomic_check(struct drm_plane *plane,
/* translate state into exynos_state */
exynos_plane_mode_set(exynos_state);
+ if (!new_plane_state->visible)
+ return 0;
+
ret = exynos_drm_plane_check_format(exynos_plane->config, exynos_state);
if (ret)
return ret;
@@ -263,8 +271,10 @@ static void exynos_plane_atomic_update(struct drm_plane *plane,
if (!new_state->crtc)
return;
- if (exynos_crtc->ops->update_plane)
+ if (new_state->visible && exynos_crtc->ops->update_plane)
exynos_crtc->ops->update_plane(exynos_crtc, exynos_plane);
+ else if (exynos_crtc->ops->disable_plane)
+ exynos_crtc->ops->disable_plane(exynos_crtc, exynos_plane);
}
static void exynos_plane_atomic_disable(struct drm_plane *plane,
--
2.34.1
Powered by blists - more mailing lists