From: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: intel-xe@lists.freedesktop.org, uma.shankar@intel.com,
shawn.c.lee@intel.com, kai.vehmanen@intel.com,
ankit.k.nautiyal@intel.com, chaitanya.kumar.borah@intel.com
Subject: [PATCH v1] drm/i915/audio: treat UHBR SST like MST for cpu_transcoder signalling
Date: Mon, 6 Jul 2026 18:55:27 +0530 [thread overview]
Message-ID: <20260706132527.1687075-1-mitulkumar.ajitkumar.golani@intel.com> (raw)
UHBR SST uses the same 128b/132b transport as DP MST, so its audio also
lives on a meaningful cpu_transcoder (>= 0), not the -1 used for legacy
SST. Treating it as Non-MST made pin_eld_notify() signal -1 and made
find_audio_state() skip the per-transcoder entry, so after suspend/resume
or replug the ELD lookup failed and audio went silent.
Detect UHBR SST alongside DP MST when deciding how to address audio
state, in both the pin_eld_notify() signalling and the find_audio_state()
lookup paths.
Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
drivers/gpu/drm/i915/display/intel_audio.c | 67 ++++++++++++++++++----
1 file changed, 55 insertions(+), 12 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_audio.c b/drivers/gpu/drm/i915/display/intel_audio.c
index 9729f1837d2c..4586bf981255 100644
--- a/drivers/gpu/drm/i915/display/intel_audio.c
+++ b/drivers/gpu/drm/i915/display/intel_audio.c
@@ -37,6 +37,7 @@
#include "intel_crtc.h"
#include "intel_de.h"
#include "intel_display_types.h"
+#include "intel_dp.h"
#include "intel_display_wa.h"
#include "intel_lpe_audio.h"
@@ -696,6 +697,42 @@ static void ibx_audio_codec_enable(struct intel_encoder *encoder,
mutex_unlock(&display->audio.mutex);
}
+/*
+ * 128b/132b transport is used for both DP MST and UHBR SST. As far as audio
+ * is concerned the hardware behaves identically in both cases: the port can
+ * carry multiple streams and the cpu_transcoder is a meaningful (>= 0,
+ * possibly > 0) identifier of the audio stream on that port. Legacy 8b/10b
+ * SST instead carries a single stream per port, for which the audio drivers
+ * expect the cpu_transcoder to be signalled as -1.
+ */
+static bool intel_audio_has_mst_transcoder(const struct intel_crtc_state *crtc_state)
+{
+ return intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST) ||
+ intel_dp_is_uhbr(crtc_state);
+}
+
+/*
+ * Same as intel_audio_has_mst_transcoder(), but derived from a stored encoder
+ * for which only the (legacy) crtc pointer is available. DP MST is detected
+ * from the encoder type without dereferencing the crtc, so that the MST path
+ * keeps working exactly as before; UHBR SST is detected from the active crtc
+ * state of the port encoder.
+ */
+static bool intel_audio_encoder_has_mst_transcoder(struct intel_encoder *encoder)
+{
+ struct intel_crtc *crtc;
+
+ if (encoder->type == INTEL_OUTPUT_DP_MST)
+ return true;
+
+ if (!encoder->base.crtc)
+ return false;
+
+ crtc = to_intel_crtc(encoder->base.crtc);
+
+ return intel_dp_is_uhbr(crtc->config);
+}
+
bool intel_audio_compute_config(struct intel_encoder *encoder,
struct intel_crtc_state *crtc_state,
struct drm_connector_state *conn_state)
@@ -769,8 +806,8 @@ void intel_audio_codec_enable(struct intel_encoder *encoder,
if (acomp && acomp->base.audio_ops &&
acomp->base.audio_ops->pin_eld_notify) {
- /* audio drivers expect cpu_transcoder = -1 to indicate Non-MST cases */
- if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST))
+ /* audio drivers expect cpu_transcoder = -1 to indicate Non-MST/HBR cases */
+ if (!intel_audio_has_mst_transcoder(crtc_state))
cpu_transcoder = -1;
acomp->base.audio_ops->pin_eld_notify(acomp->base.audio_ops->audio_ptr,
(int)port, (int)cpu_transcoder);
@@ -825,8 +862,8 @@ void intel_audio_codec_disable(struct intel_encoder *encoder,
if (acomp && acomp->base.audio_ops &&
acomp->base.audio_ops->pin_eld_notify) {
- /* audio drivers expect cpu_transcoder = -1 to indicate Non-MST cases */
- if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST))
+ /* audio drivers expect cpu_transcoder = -1 to indicate Non-MST/HBR cases */
+ if (!intel_audio_has_mst_transcoder(old_crtc_state))
cpu_transcoder = -1;
acomp->base.audio_ops->pin_eld_notify(acomp->base.audio_ops->audio_ptr,
(int)port, (int)cpu_transcoder);
@@ -1119,17 +1156,23 @@ static int intel_audio_component_get_cdclk_freq(struct device *kdev)
/*
* get the intel audio state according to the parameter port and cpu_transcoder
- * MST & (cpu_transcoder >= 0): return the audio.state[cpu_transcoder].encoder],
+ *
+ * A "MST transcoder" below means 128b/132b transport, i.e. either DP MST or
+ * UHBR SST, both of which use a meaningful (>= 0) cpu_transcoder to identify
+ * the audio stream on a port (see intel_audio_has_mst_transcoder()):
+ *
+ * MST transcoder & (cpu_transcoder >= 0): return the audio.state[cpu_transcoder],
* when port is matched
- * MST & (cpu_transcoder < 0): this is invalid
- * Non-MST & (cpu_transcoder >= 0): only cpu_transcoder = 0 (the first device entry)
- * will get the right intel_encoder with port matched
- * Non-MST & (cpu_transcoder < 0): get the right intel_encoder with port matched
+ * MST transcoder & (cpu_transcoder < 0): this is invalid
+ * Non-MST transcoder & (cpu_transcoder >= 0): only cpu_transcoder = 0 (the first
+ * device entry) will get the right intel_encoder with port matched
+ * Non-MST transcoder & (cpu_transcoder < 0): get the right intel_encoder with
+ * port matched
*/
static struct intel_audio_state *find_audio_state(struct intel_display *display,
int port, int cpu_transcoder)
{
- /* MST */
+ /* MST or UHBR SST */
if (cpu_transcoder >= 0) {
struct intel_audio_state *audio_state;
struct intel_encoder *encoder;
@@ -1142,7 +1185,7 @@ static struct intel_audio_state *find_audio_state(struct intel_display *display,
encoder = audio_state->encoder;
if (encoder && encoder->port == port &&
- encoder->type == INTEL_OUTPUT_DP_MST)
+ intel_audio_encoder_has_mst_transcoder(encoder))
return audio_state;
}
@@ -1158,7 +1201,7 @@ static struct intel_audio_state *find_audio_state(struct intel_display *display,
encoder = audio_state->encoder;
if (encoder && encoder->port == port &&
- encoder->type != INTEL_OUTPUT_DP_MST)
+ !intel_audio_encoder_has_mst_transcoder(encoder))
return audio_state;
}
--
2.48.1
next reply other threads:[~2026-07-06 13:35 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-06 13:25 Mitul Golani [this message]
2026-07-06 14:07 ` ✓ CI.KUnit: success for drm/i915/audio: treat UHBR SST like MST for cpu_transcoder signalling Patchwork
2026-07-06 14:51 ` ✓ Xe.CI.BAT: " Patchwork
2026-07-06 16:53 ` ✓ Xe.CI.FULL: " Patchwork
2026-07-07 6:24 ` [PATCH v1] " Kandpal, Suraj
2026-07-08 8:33 ` Golani, Mitulkumar Ajitkumar
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=20260706132527.1687075-1-mitulkumar.ajitkumar.golani@intel.com \
--to=mitulkumar.ajitkumar.golani@intel.com \
--cc=ankit.k.nautiyal@intel.com \
--cc=chaitanya.kumar.borah@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=kai.vehmanen@intel.com \
--cc=shawn.c.lee@intel.com \
--cc=uma.shankar@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox