From: Andy Yan <[email protected]> The different Video Ports support different maximum resolutions. Reject resolutions that are not supported by a specific VP.
Only the output width is checked because the hardware itself does not have a hard output height limit. Filter the mode that can't output by the VP/crtc. Signed-off-by: Andy Yan <[email protected]> --- Changes in v2: - Add more detailed commit message drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 498df0ce4680..74fba29bfff3 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -1439,6 +1439,17 @@ static void vop2_crtc_disable_vblank(struct drm_crtc *crtc) vop2_crtc_disable_irq(vp, VP_INT_FS_FIELD); } +static enum drm_mode_status vop2_crtc_mode_valid(struct drm_crtc *crtc, + const struct drm_display_mode *mode) +{ + struct vop2_video_port *vp = to_vop2_video_port(crtc); + + if (mode->hdisplay > vp->data->max_output.width) + return MODE_BAD_HVALUE; + + return MODE_OK; +} + static bool vop2_crtc_mode_fixup(struct drm_crtc *crtc, const struct drm_display_mode *mode, struct drm_display_mode *adj_mode) @@ -1884,6 +1895,7 @@ static void vop2_crtc_atomic_flush(struct drm_crtc *crtc, static const struct drm_crtc_helper_funcs vop2_crtc_helper_funcs = { .mode_fixup = vop2_crtc_mode_fixup, + .mode_valid = vop2_crtc_mode_valid, .atomic_check = vop2_crtc_atomic_check, .atomic_begin = vop2_crtc_atomic_begin, .atomic_flush = vop2_crtc_atomic_flush, -- 2.43.0 base-commit: 1613a67b5360d6ff78f62143a1cf123414a1b4d9 branch: rk3576-dp-upstream
