From 286b1fafa80c63f2a7a92082bb496827e720b4f0 Mon Sep 17 00:00:00 2001 From: Zhang Yubing Date: Mon, 7 Nov 2022 15:53:00 +0800 Subject: [PATCH] drm/rockchip: dw-dp: fixup the timing min limit Signed-off-by: Zhang Yubing Change-Id: I776ed1eaf38a7d91db3541bade02eac68908b977 --- drivers/gpu/drm/rockchip/dw-dp.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw-dp.c b/drivers/gpu/drm/rockchip/dw-dp.c index b0f2c05f4c83..1330a149cdee 100644 --- a/drivers/gpu/drm/rockchip/dw-dp.c +++ b/drivers/gpu/drm/rockchip/dw-dp.c @@ -1854,6 +1854,26 @@ static void dw_dp_encoder_disable(struct drm_encoder *encoder) s->output_if &= ~(dp->id ? VOP_OUTPUT_IF_DP1 : VOP_OUTPUT_IF_DP0); } +static void dw_dp_mode_fixup(struct dw_dp *dp, struct drm_display_mode *adjusted_mode) +{ + int min_hbp = 16; + int min_hsync = 9; + + if (dp->split_mode) { + min_hbp *= 2; + min_hsync *= 2; + } + + if (adjusted_mode->hsync_end - adjusted_mode->hsync_start < min_hsync) { + adjusted_mode->hsync_end = adjusted_mode->hsync_start + min_hsync; + dev_warn(dp->dev, "hsync is too narrow, fixup to min hsync:%d\n", min_hsync); + } + if (adjusted_mode->htotal - adjusted_mode->hsync_end < min_hbp) { + adjusted_mode->htotal = adjusted_mode->hsync_end + min_hbp; + dev_warn(dp->dev, "hbp is too narrow, fixup to min hbp:%d\n", min_hbp); + } +} + static int dw_dp_encoder_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) @@ -1892,6 +1912,8 @@ static int dw_dp_encoder_atomic_check(struct drm_encoder *encoder, s->eotf = HDMI_EOTF_TRADITIONAL_GAMMA_SDR; s->color_space = V4L2_COLORSPACE_DEFAULT; + dw_dp_mode_fixup(dp, &crtc_state->adjusted_mode); + return 0; } @@ -2032,9 +2054,6 @@ static int dw_dp_bridge_mode_valid(struct drm_bridge *bridge, if (dp->split_mode) drm_mode_convert_to_origin_mode(&m); - if (m.hsync_end - m.hsync_start <= 8) - return MODE_HSYNC_NARROW; - if (info->color_formats & DRM_COLOR_FORMAT_YCRCB420 && link->vsc_sdp_extension_for_colorimetry_supported && (drm_mode_is_420_only(info, &m) || drm_mode_is_420_also(info, &m)))