Commit 0432a504 authored by Thomas Zimmermann's avatar Thomas Zimmermann

drm/ast: Call drm_atomic_helper_check_plane_state() unconditionally

Always call drm_atomic_helper_check_plane_state() in each plane's
atomic_check function. At the minimum, it needs to set or clear the
plane state's 'visible' field. Otherwise the plane-state handling
is bogus and would keep updating planes that have been disabled.

While at it, also warn if the primary plane has been enabled, but is
not visible. This cannot legally happen as the plane always covers
the entire screen.
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarJocelyn Falempe <jfalempe@redhat.com>
Tested-by: default avatarJocelyn Falempe <jfalempe@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221013112923.769-3-tzimmermann@suse.de
parent 1fe18215
...@@ -578,27 +578,28 @@ static const uint32_t ast_primary_plane_formats[] = { ...@@ -578,27 +578,28 @@ static const uint32_t ast_primary_plane_formats[] = {
static int ast_primary_plane_helper_atomic_check(struct drm_plane *plane, static int ast_primary_plane_helper_atomic_check(struct drm_plane *plane,
struct drm_atomic_state *state) struct drm_atomic_state *state)
{ {
struct drm_device *dev = plane->dev;
struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state, struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state,
plane); plane);
struct drm_crtc_state *crtc_state; struct drm_crtc_state *crtc_state = NULL;
struct ast_crtc_state *ast_crtc_state; struct ast_crtc_state *ast_crtc_state;
int ret; int ret;
if (!new_plane_state->crtc) if (new_plane_state->crtc)
return 0; crtc_state = drm_atomic_get_new_crtc_state(state, new_plane_state->crtc);
crtc_state = drm_atomic_get_new_crtc_state(state,
new_plane_state->crtc);
ret = drm_atomic_helper_check_plane_state(new_plane_state, crtc_state, ret = drm_atomic_helper_check_plane_state(new_plane_state, crtc_state,
DRM_PLANE_NO_SCALING, DRM_PLANE_NO_SCALING,
DRM_PLANE_NO_SCALING, DRM_PLANE_NO_SCALING,
false, true); false, true);
if (ret) if (ret) {
return ret; return ret;
} else if (!new_plane_state->visible) {
if (!new_plane_state->visible) if (drm_WARN_ON(dev, new_plane_state->crtc)) /* cannot legally happen */
return 0; return -EINVAL;
else
return 0;
}
ast_crtc_state = to_ast_crtc_state(crtc_state); ast_crtc_state = to_ast_crtc_state(crtc_state);
...@@ -805,25 +806,19 @@ static int ast_cursor_plane_helper_atomic_check(struct drm_plane *plane, ...@@ -805,25 +806,19 @@ static int ast_cursor_plane_helper_atomic_check(struct drm_plane *plane,
struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state, struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state,
plane); plane);
struct drm_framebuffer *fb = new_plane_state->fb; struct drm_framebuffer *fb = new_plane_state->fb;
struct drm_crtc_state *crtc_state; struct drm_crtc_state *crtc_state = NULL;
int ret; int ret;
if (!new_plane_state->crtc) if (new_plane_state->crtc)
return 0; crtc_state = drm_atomic_get_new_crtc_state(state, new_plane_state->crtc);
crtc_state = drm_atomic_get_new_crtc_state(state,
new_plane_state->crtc);
ret = drm_atomic_helper_check_plane_state(new_plane_state, crtc_state, ret = drm_atomic_helper_check_plane_state(new_plane_state, crtc_state,
DRM_PLANE_NO_SCALING, DRM_PLANE_NO_SCALING,
DRM_PLANE_NO_SCALING, DRM_PLANE_NO_SCALING,
true, true); true, true);
if (ret) if (ret || !new_plane_state->visible)
return ret; return ret;
if (!new_plane_state->visible)
return 0;
if (fb->width > AST_MAX_HWC_WIDTH || fb->height > AST_MAX_HWC_HEIGHT) if (fb->width > AST_MAX_HWC_WIDTH || fb->height > AST_MAX_HWC_HEIGHT)
return -EINVAL; return -EINVAL;
......
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