Skip to content

Commit

Permalink
drm/omap: add sanity plane state check
Browse files Browse the repository at this point in the history
Call drm_atomic_helper_check_plane_state() from the plane
atomic_check() callback in order to add plane state sanity
checking.

It will permit filtering out totally bad scaling factors, even
if the real check are done later in the atomic commit.

Calling drm_atomic_helper_check_plane_state() also sets
plane_state->visible which will be useful when dynamically
assigning hw overlays to planes.

Signed-off-by: Benoit Parrot <bparrot@ti.com>
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211117141928.771082-2-narmstrong@baylibre.com
  • Loading branch information
Neil Armstrong authored and Tomi Valkeinen committed Dec 8, 2021
1 parent fe4d0b6 commit c21134b
Showing 1 changed file with 15 additions and 0 deletions.
15 changes: 15 additions & 0 deletions drivers/gpu/drm/omapdrm/omap_plane.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,12 +104,15 @@ static void omap_plane_atomic_disable(struct drm_plane *plane,
dispc_ovl_enable(priv->dispc, omap_plane->id, false);
}

#define FRAC_16_16(mult, div) (((mult) << 16) / (div))

static int omap_plane_atomic_check(struct drm_plane *plane,
struct drm_atomic_state *state)
{
struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state,
plane);
struct drm_crtc_state *crtc_state;
int ret;

if (!new_plane_state->fb)
return 0;
Expand All @@ -127,6 +130,18 @@ static int omap_plane_atomic_check(struct drm_plane *plane,
if (!crtc_state->enable)
return 0;

/*
* Note: these are just sanity checks to filter out totally bad scaling
* factors. The real limits must be calculated case by case, and
* unfortunately we currently do those checks only at the commit
* phase in dispc.
*/
ret = drm_atomic_helper_check_plane_state(new_plane_state, crtc_state,
FRAC_16_16(1, 8), FRAC_16_16(8, 1),
true, true);
if (ret)
return ret;

if (new_plane_state->crtc_x < 0 || new_plane_state->crtc_y < 0)
return -EINVAL;

Expand Down

0 comments on commit c21134b

Please sign in to comment.