mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-22 15:02:32 +00:00
82 lines
2.8 KiB
Diff
82 lines
2.8 KiB
Diff
|
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;
|