2022-05-16 21:40:32 +00:00
|
|
|
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
|
2022-05-18 14:32:03 +00:00
|
|
|
@@ -103,9 +103,17 @@
|
2022-05-16 21:40:32 +00:00
|
|
|
|
|
|
|
#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,
|
2022-05-18 14:32:03 +00:00
|
|
|
@@ -277,7 +285,7 @@ static int vc4_hdmi_connector_get_modes(
|
2022-05-16 21:40:32 +00:00
|
|
|
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.");
|
|
|
|
}
|
2022-05-18 14:32:03 +00:00
|
|
|
@@ -628,7 +636,7 @@ static void vc4_hdmi_enable_scrambling(s
|
2022-05-16 21:40:32 +00:00
|
|
|
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);
|
2023-03-12 14:16:50 +00:00
|
|
|
@@ -1246,6 +1254,7 @@ static void vc4_hdmi_encoder_atomic_mode
|
2022-05-16 21:40:32 +00:00
|
|
|
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;
|