[PATCHv2] drm/sun4i: validate modes for HDMI
Hans Verkuil
hverkuil at xs4all.nl
Fri Dec 8 15:48:47 UTC 2017
When I connected my cubieboard running 4.15-rc1 to my 4k display I got no picture. Some
digging found that there is no check against the upper pixelclock limit of the HDMI
output, so X selects a 4kp60 format at 594 MHz, which obviously won't work.
The patch below adds a check for the upper bound of what this hardware can do, and
it checks if the requested tmds clock can be obtained.
Signed-off-by: Hans Verkuil <hans.verkuil at cisco.com>
---
drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
index dda904ec0534..c10400a19b33 100644
--- a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
+++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
@@ -208,8 +208,27 @@ static int sun4i_hdmi_get_modes(struct drm_connector *connector)
return ret;
}
+static int sun4i_hdmi_mode_valid(struct drm_connector *connector,
+ struct drm_display_mode *mode)
+{
+ struct sun4i_hdmi *hdmi = drm_connector_to_sun4i_hdmi(connector);
+ unsigned long rate = mode->clock * 1000;
+ long rounded_rate;
+
+ /* 165 MHz is the typical max pixelclock frequency for HDMI <= 1.2 */
+ if (rate > 165000000)
+ return MODE_CLOCK_HIGH;
+ rounded_rate = clk_round_rate(hdmi->tmds_clk, rate);
+ if (rounded_rate < rate)
+ return MODE_CLOCK_LOW;
+ if (rounded_rate > rate)
+ return MODE_CLOCK_HIGH;
+ return MODE_OK;
+}
+
static const struct drm_connector_helper_funcs sun4i_hdmi_connector_helper_funcs = {
.get_modes = sun4i_hdmi_get_modes,
+ .mode_valid = sun4i_hdmi_mode_valid,
};
static enum drm_connector_status
--
2.14.1
More information about the dri-devel
mailing list