aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0633-drm-vc4-hdmi-Take-bpp-into-account-for-the-scrambler.patch
diff options
context:
space:
mode:
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.patch81
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;