Hi Maxime! Dne sreda, 20. september 2023 ob 16:35:22 CEST je Maxime Ripard napisal(a): > A lot of HDMI drivers have some variation of the formula to calculate > the TMDS character rate from a mode, but few of them actually take all > parameters into account. > > Let's create a helper to provide that rate taking all parameters into > account. > > Signed-off-by: Maxime Ripard <mripard@xxxxxxxxxx> > --- > drivers/gpu/drm/drm_connector.c | 31 +++++++++++++++++++++++++++++++ > include/drm/drm_connector.h | 5 +++++ > 2 files changed, 36 insertions(+) > > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c > index b01cb4783ea6..4c1af97971bb 100644 > --- a/drivers/gpu/drm/drm_connector.c > +++ b/drivers/gpu/drm/drm_connector.c > @@ -2944,6 +2944,37 @@ void drm_connector_update_privacy_screen(const struct drm_connector_state *conne > } > EXPORT_SYMBOL(drm_connector_update_privacy_screen); > > +/** > + * drm_connector_hdmi_compute_mode_clock() - Computes the TMDS Character Rate > + * @mode: Display mode to compute the clock for > + * @bpc: Bits per character > + * @fmt: Output Pixel Format used > + * > + * Returns the TMDS Character Rate for a given mode, bpc count and output format. > + * > + * RETURNS: > + * The TMDS Character Rate, in Hertz > + */ > +unsigned long long > +drm_connector_hdmi_compute_mode_clock(const struct drm_display_mode *mode, > + unsigned int bpc, > + enum hdmi_colorspace fmt) > +{ > + unsigned long long clock = mode->clock * 1000ULL; > + > + if (mode->flags & DRM_MODE_FLAG_DBLCLK) > + clock = clock * 2; > + > + if (fmt == HDMI_COLORSPACE_YUV422) > + bpc = 8; I think you're missing YUV420 handling, which needs half of clock speed. But this is a thing of HDMI2. Best regards, Jernej > + > + clock = clock * bpc; > + do_div(clock, 8); > + > + return clock; > +} > +EXPORT_SYMBOL(drm_connector_hdmi_compute_mode_clock); > + > int drm_connector_set_obj_prop(struct drm_mode_object *obj, > struct drm_property *property, > uint64_t value) > diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h > index a66cb4e35d7b..d74e9c64ee88 100644 > --- a/include/drm/drm_connector.h > +++ b/include/drm/drm_connector.h > @@ -38,6 +38,7 @@ struct drm_connector_helper_funcs; > struct drm_modeset_acquire_ctx; > struct drm_device; > struct drm_crtc; > +struct drm_display_mode; > struct drm_encoder; > struct drm_panel; > struct drm_property; > @@ -2115,6 +2116,10 @@ void drm_connector_attach_privacy_screen_properties(struct drm_connector *conn); > void drm_connector_attach_privacy_screen_provider( > struct drm_connector *connector, struct drm_privacy_screen *priv); > void drm_connector_update_privacy_screen(const struct drm_connector_state *connector_state); > +unsigned long long > +drm_connector_hdmi_compute_mode_clock(const struct drm_display_mode *mode, > + unsigned int bpc, > + enum hdmi_colorspace fmt); > > /** > * struct drm_tile_group - Tile group metadata > >