Skip to content

Commit

Permalink
drm/vc4: hdmi: Take bpp into account for the scrambler
Browse files Browse the repository at this point in the history
The current code only base its decision for whether the scrambler must be
enabled or not on the pixel clock of the mode, but doesn't take the bits
per color into account.

Let's leverage the new function to compute the clock rate in the
scrambler setup code.

Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Acked-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220222164042.403112-6-maxime@cerno.tech
  • Loading branch information
Maxime Ripard committed Mar 24, 2022
1 parent 15a8092 commit f785dcf
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 4 deletions.
16 changes: 12 additions & 4 deletions drivers/gpu/drm/vc4/vc4_hdmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,16 @@

#define HDMI_14_MAX_TMDS_CLK (340 * 1000 * 1000)

static bool vc4_hdmi_mode_needs_scrambling(const struct drm_display_mode *mode)
static unsigned long long
vc4_hdmi_encoder_compute_mode_clock(const struct drm_display_mode *mode,
unsigned int bpc);

static bool vc4_hdmi_mode_needs_scrambling(const struct drm_display_mode *mode,
unsigned int bpc)
{
return (mode->clock * 1000) > HDMI_14_MAX_TMDS_CLK;
unsigned long long clock = vc4_hdmi_encoder_compute_mode_clock(mode, bpc);

return clock > HDMI_14_MAX_TMDS_CLK;
}

static bool vc4_hdmi_is_full_range_rgb(struct vc4_hdmi *vc4_hdmi,
Expand Down Expand Up @@ -272,7 +279,7 @@ static int vc4_hdmi_connector_get_modes(struct drm_connector *connector)
struct drm_display_mode *mode;

list_for_each_entry(mode, &connector->probed_modes, head) {
if (vc4_hdmi_mode_needs_scrambling(mode)) {
if (vc4_hdmi_mode_needs_scrambling(mode, 8)) {
drm_warn_once(drm, "The core clock cannot reach frequencies high enough to support 4k @ 60Hz.");
drm_warn_once(drm, "Please change your config.txt file to add hdmi_enable_4kp60.");
}
Expand Down Expand Up @@ -613,7 +620,7 @@ static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder)
if (!vc4_hdmi_supports_scrambling(encoder, mode))
return;

if (!vc4_hdmi_mode_needs_scrambling(mode))
if (!vc4_hdmi_mode_needs_scrambling(mode, vc4_hdmi->output_bpc))
return;

drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, true);
Expand Down Expand Up @@ -1242,6 +1249,7 @@ static void vc4_hdmi_encoder_atomic_mode_set(struct drm_encoder *encoder,
mutex_lock(&vc4_hdmi->mutex);
drm_mode_copy(&vc4_hdmi->saved_adjusted_mode,
&crtc_state->adjusted_mode);
vc4_hdmi->output_bpc = conn_state->max_bpc;
mutex_unlock(&vc4_hdmi->mutex);
}

Expand Down
5 changes: 5 additions & 0 deletions drivers/gpu/drm/vc4/vc4_hdmi.h
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,11 @@ struct vc4_hdmi {
* the scrambler on? Protected by @mutex.
*/
bool scdc_enabled;

/**
* @output_bpc: BPC currently being used. Protected by @mutex.
*/
unsigned int output_bpc;
};

static inline struct vc4_hdmi *
Expand Down

0 comments on commit f785dcf

Please sign in to comment.