Commit b5da40af authored by Mateusz Kwiatkowski's avatar Mateusz Kwiatkowski Committed by Maxime Ripard

drm/vc4: vec: Check for VEC output constraints

The VEC can accept pretty much any relatively reasonable mode, but still
has a bunch of constraints to meet.

Let's create an atomic_check() implementation that will make sure we
don't end up accepting a non-functional mode.
Acked-by: default avatarNoralf Trønnes <noralf@tronnes.org>
Signed-off-by: default avatarMateusz Kwiatkowski <kfyatek+publicgit@gmail.com>
Tested-by: default avatarMateusz Kwiatkowski <kfyatek+publicgit@gmail.com>
Acked-in-principle-or-something-like-that-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://lore.kernel.org/r/20220728-rpi-analog-tv-properties-v10-16-256dad125326@cerno.techSigned-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
parent c104b231
...@@ -453,6 +453,7 @@ static int vc4_vec_encoder_atomic_check(struct drm_encoder *encoder, ...@@ -453,6 +453,7 @@ static int vc4_vec_encoder_atomic_check(struct drm_encoder *encoder,
struct drm_crtc_state *crtc_state, struct drm_crtc_state *crtc_state,
struct drm_connector_state *conn_state) struct drm_connector_state *conn_state)
{ {
const struct drm_display_mode *mode = &crtc_state->adjusted_mode;
const struct vc4_vec_tv_mode *vec_mode; const struct vc4_vec_tv_mode *vec_mode;
vec_mode = &vc4_vec_tv_modes[conn_state->tv.legacy_mode]; vec_mode = &vc4_vec_tv_modes[conn_state->tv.legacy_mode];
...@@ -461,6 +462,55 @@ static int vc4_vec_encoder_atomic_check(struct drm_encoder *encoder, ...@@ -461,6 +462,55 @@ static int vc4_vec_encoder_atomic_check(struct drm_encoder *encoder,
!drm_mode_equal(vec_mode->mode, &crtc_state->adjusted_mode)) !drm_mode_equal(vec_mode->mode, &crtc_state->adjusted_mode))
return -EINVAL; return -EINVAL;
if (mode->crtc_hdisplay % 4)
return -EINVAL;
if (!(mode->crtc_hsync_end - mode->crtc_hsync_start))
return -EINVAL;
switch (mode->htotal) {
/* NTSC */
case 858:
if (mode->crtc_vtotal > 262)
return -EINVAL;
if (mode->crtc_vdisplay < 1 || mode->crtc_vdisplay > 253)
return -EINVAL;
if (!(mode->crtc_vsync_start - mode->crtc_vdisplay))
return -EINVAL;
if ((mode->crtc_vsync_end - mode->crtc_vsync_start) != 3)
return -EINVAL;
if ((mode->crtc_vtotal - mode->crtc_vsync_end) < 4)
return -EINVAL;
break;
/* PAL/SECAM */
case 864:
if (mode->crtc_vtotal > 312)
return -EINVAL;
if (mode->crtc_vdisplay < 1 || mode->crtc_vdisplay > 305)
return -EINVAL;
if (!(mode->crtc_vsync_start - mode->crtc_vdisplay))
return -EINVAL;
if ((mode->crtc_vsync_end - mode->crtc_vsync_start) != 3)
return -EINVAL;
if ((mode->crtc_vtotal - mode->crtc_vsync_end) < 2)
return -EINVAL;
break;
default:
return -EINVAL;
}
return 0; return 0;
} }
......
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