diff options
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0633-drm-vc4-hdmi-Take-bpp-into-account-for-the-scrambler.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.15/950-0633-drm-vc4-hdmi-Take-bpp-into-account-for-the-scrambler.patch | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0633-drm-vc4-hdmi-Take-bpp-into-account-for-the-scrambler.patch b/target/linux/bcm27xx/patches-5.15/950-0633-drm-vc4-hdmi-Take-bpp-into-account-for-the-scrambler.patch new file mode 100644 index 0000000000..d44e161cf0 --- /dev/null +++ b/target/linux/bcm27xx/patches-5.15/950-0633-drm-vc4-hdmi-Take-bpp-into-account-for-the-scrambler.patch @@ -0,0 +1,81 @@ +From 8b7091e1795e50b559b7896b71c45df4fc83353b Mon Sep 17 00:00:00 2001 +From: Maxime Ripard <maxime@cerno.tech> +Date: Fri, 10 Dec 2021 15:00:04 +0100 +Subject: [PATCH] drm/vc4: hdmi: Take bpp into account for the + scrambler + +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> +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 17 +++++++++++++---- + drivers/gpu/drm/vc4/vc4_hdmi.h | 5 +++++ + 2 files changed, 18 insertions(+), 4 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -102,9 +102,17 @@ + + #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, +@@ -276,7 +284,7 @@ static int vc4_hdmi_connector_get_modes( + 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."); + } +@@ -627,7 +635,7 @@ static void vc4_hdmi_enable_scrambling(s + 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); +@@ -1244,6 +1252,7 @@ static void vc4_hdmi_encoder_atomic_mode + struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); + + mutex_lock(&vc4_hdmi->mutex); ++ vc4_hdmi->output_bpc = conn_state->max_bpc; + memcpy(&vc4_hdmi->saved_adjusted_mode, + &crtc_state->adjusted_mode, + sizeof(vc4_hdmi->saved_adjusted_mode)); +--- a/drivers/gpu/drm/vc4/vc4_hdmi.h ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.h +@@ -221,6 +221,11 @@ struct vc4_hdmi { + */ + bool scdc_enabled; + ++ /** ++ * @output_bpc: BPC currently being used. Protected by @mutex. ++ */ ++ unsigned int output_bpc; ++ + /* VC5 debugfs regset */ + struct debugfs_regset32 cec_regset; + struct debugfs_regset32 csc_regset; |