From: Jani Nikula <jani.nikula@linux.intel.com>
To: Ville Syrjala <ville.syrjala@linux.intel.com>,
intel-gfx@lists.freedesktop.org
Cc: stable@vger.kernel.org
Subject: Re: [PATCH v2 1/2] drm/i915/dp: Reject HBR3 when sink doesn't support TPS4
Date: Thu, 27 Mar 2025 09:35:56 +0200 [thread overview]
Message-ID: <87h63f6i3n.fsf@intel.com> (raw)
In-Reply-To: <20250306210740.11886-1-ville.syrjala@linux.intel.com>
On Thu, 06 Mar 2025, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> According to the DP spec TPS4 is mandatory for HBR3. We have
> however seen some broken eDP sinks that violate this and
> declare support for HBR3 without TPS4 support.
>
> At least in the case of the icl Dell XPS 13 7390 this results
> in an unstable output.
>
> Reject HBR3 when TPS4 supports is unavailable on the sink.
>
> v2: Leave breadcrumbs in dmesg to avoid head scratching (Jani)
>
> Cc: stable@vger.kernel.org
> Cc: Jani Nikula <jani.nikula@linux.intel.com>
> Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5969
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_dp.c | 49 +++++++++++++++++++++----
> 1 file changed, 42 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 205ec315b413..70f5d1465f81 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -172,10 +172,28 @@ int intel_dp_link_symbol_clock(int rate)
>
> static int max_dprx_rate(struct intel_dp *intel_dp)
> {
> + struct intel_display *display = to_intel_display(intel_dp);
> + struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
> + int max_rate;
> +
> if (intel_dp_tunnel_bw_alloc_is_enabled(intel_dp))
> - return drm_dp_tunnel_max_dprx_rate(intel_dp->tunnel);
> + max_rate = drm_dp_tunnel_max_dprx_rate(intel_dp->tunnel);
> + else
> + max_rate = drm_dp_bw_code_to_link_rate(intel_dp->dpcd[DP_MAX_LINK_RATE]);
>
> - return drm_dp_bw_code_to_link_rate(intel_dp->dpcd[DP_MAX_LINK_RATE]);
> + /*
> + * Some broken eDP sinks illegally declare support for
> + * HBR3 without TPS4, and are unable to produce a stable
> + * output. Reject HBR3 when TPS4 is not available.
> + */
> + if (max_rate >= 810000 && !drm_dp_tps4_supported(intel_dp->dpcd)) {
> + drm_dbg_kms(display->drm,
> + "[ENCODER:%d:%s] Rejecting HBR3 due to missing TPS4 support\n",
> + encoder->base.base.id, encoder->base.name);
> + max_rate = 540000;
> + }
> +
> + return max_rate;
> }
>
> static int max_dprx_lane_count(struct intel_dp *intel_dp)
> @@ -4170,6 +4188,9 @@ static void intel_edp_mso_init(struct intel_dp *intel_dp)
> static void
> intel_edp_set_sink_rates(struct intel_dp *intel_dp)
> {
> + struct intel_display *display = to_intel_display(intel_dp);
> + struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
> +
> intel_dp->num_sink_rates = 0;
>
> if (intel_dp->edp_dpcd[0] >= DP_EDP_14) {
> @@ -4180,10 +4201,7 @@ intel_edp_set_sink_rates(struct intel_dp *intel_dp)
> sink_rates, sizeof(sink_rates));
>
> for (i = 0; i < ARRAY_SIZE(sink_rates); i++) {
> - int val = le16_to_cpu(sink_rates[i]);
> -
> - if (val == 0)
> - break;
> + int rate;
>
> /* Value read multiplied by 200kHz gives the per-lane
> * link rate in kHz. The source rates are, however,
> @@ -4191,7 +4209,24 @@ intel_edp_set_sink_rates(struct intel_dp *intel_dp)
> * back to symbols is
> * (val * 200kHz)*(8/10 ch. encoding)*(1/8 bit to Byte)
> */
> - intel_dp->sink_rates[i] = (val * 200) / 10;
> + rate = le16_to_cpu(sink_rates[i]) * 200 / 10;
> +
> + if (rate == 0)
> + break;
> +
> + /*
> + * Some broken eDP sinks illegally declare support for
> + * HBR3 without TPS4, and are unable to produce a stable
> + * output. Reject HBR3 when TPS4 is not available.
> + */
> + if (rate >= 810000 && !drm_dp_tps4_supported(intel_dp->dpcd)) {
> + drm_dbg_kms(display->drm,
> + "[ENCODER:%d:%s] Rejecting HBR3 due to missing TPS4 support\n",
> + encoder->base.base.id, encoder->base.name);
> + break;
> + }
> +
> + intel_dp->sink_rates[i] = rate;
> }
> intel_dp->num_sink_rates = i;
> }
--
Jani Nikula, Intel
next prev parent reply other threads:[~2025-03-27 7:36 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-03 12:39 [PATCH 1/2] drm/i915/dp: Reject HBR3 when sink doesn't support TPS4 Ville Syrjala
2025-03-03 12:39 ` [PATCH 2/2] drm/i915: Program CURSOR_PROGRAM and COEFF_POLARITY for icl+ combo PHYs Ville Syrjala
2025-03-07 5:51 ` Borah, Chaitanya Kumar
2025-03-03 15:14 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/2] drm/i915/dp: Reject HBR3 when sink doesn't support TPS4 Patchwork
2025-03-03 15:32 ` ✓ i915.CI.BAT: success " Patchwork
2025-03-03 17:53 ` ✓ i915.CI.Full: " Patchwork
2025-03-04 9:05 ` [PATCH 1/2] " Jani Nikula
2025-03-06 21:07 ` [PATCH v2 " Ville Syrjala
2025-03-27 7:35 ` Jani Nikula [this message]
2025-03-06 21:56 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [v2,1/2] drm/i915/dp: Reject HBR3 when sink doesn't support TPS4 (rev2) Patchwork
2025-03-06 22:16 ` ✓ i915.CI.BAT: success " Patchwork
2025-03-06 23:53 ` ✗ i915.CI.Full: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87h63f6i3n.fsf@intel.com \
--to=jani.nikula@linux.intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=stable@vger.kernel.org \
--cc=ville.syrjala@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.