From: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: [Intel-gfx] [RFC 3/3] drm/i915/display: Add wrapper to Compute SAD
Date: Mon, 26 Jun 2023 22:08:19 +0530 [thread overview]
Message-ID: <20230626163819.2759500-4-mitulkumar.ajitkumar.golani@intel.com> (raw)
In-Reply-To: <20230626163819.2759500-1-mitulkumar.ajitkumar.golani@intel.com>
Compute SADs that takes into account the supported rate and channel
based on the capabilities of the audio source. This wrapper function
should encapsulate the logic for determining the supported rate and
channel and should return a set of SADs that are compatible with the
source.
--v1:
- call intel_audio_compute_eld in this commit as it is defined here
--v2:
- Handle case when max frequency is less than 32k.
- remove drm prefix.
- name change for parse_sad to eld_to_sad.
--v3:
- Use signed int wherever required.
- add debug trace when channel is limited.
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
drivers/gpu/drm/i915/display/intel_audio.c | 69 ++++++++++++++++++++++
drivers/gpu/drm/i915/display/intel_audio.h | 1 +
drivers/gpu/drm/i915/display/intel_hdmi.c | 2 +
3 files changed, 72 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_audio.c b/drivers/gpu/drm/i915/display/intel_audio.c
index e20ffc8e9654..1a1c773c1d41 100644
--- a/drivers/gpu/drm/i915/display/intel_audio.c
+++ b/drivers/gpu/drm/i915/display/intel_audio.c
@@ -794,6 +794,75 @@ bool intel_audio_compute_config(struct intel_encoder *encoder,
return true;
}
+static int sad_to_channels(const u8 *sad)
+{
+ return 1 + (sad[0] & 0x7);
+}
+
+static inline u8 *eld_to_sad(u8 *eld)
+{
+ int ver, mnl;
+
+ ver = (eld[DRM_ELD_VER] & DRM_ELD_VER_MASK) >> DRM_ELD_VER_SHIFT;
+ if (ver != 2 && ver != 31)
+ return NULL;
+
+ mnl = drm_eld_mnl(eld);
+ if (mnl > 16)
+ return NULL;
+
+ return eld + DRM_ELD_CEA_SAD(mnl, 0);
+}
+
+static int get_supported_freq_mask(struct intel_crtc_state *crtc_state)
+{
+ int audio_freq_hz[] = {32000, 44100, 48000, 88000, 96000, 176000, 192000, 0};
+ int mask = 0;
+
+ for (u8 index = 0; index < ARRAY_SIZE(audio_freq_hz); index++) {
+ mask |= 1 << index;
+ if (crtc_state->audio.max_frequency != audio_freq_hz[index])
+ continue;
+ else
+ break;
+ }
+
+ return mask;
+}
+
+void intel_audio_compute_eld(struct intel_crtc_state *crtc_state)
+{
+ struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
+ u8 *eld, *sad;
+ int index, mask = 0;
+
+ eld = crtc_state->eld;
+ if (!eld) {
+ drm_err(&i915->drm, "failed to locate eld\n");
+ return;
+ }
+
+ sad = (u8 *)eld_to_sad(eld);
+ if (sad) {
+ mask = get_supported_freq_mask(crtc_state);
+
+ for (index = 0; index < drm_eld_sad_count(eld); index++, sad += 3) {
+ /*
+ * Respect source restricitions. Limit capabilities to a subset that is
+ * supported both by the source and the sink.
+ */
+ if (sad_to_channels(sad) >= crtc_state->audio.max_channel) {
+ sad[0] &= ~0x7;
+ sad[0] |= crtc_state->audio.max_channel - 1;
+ drm_dbg_kms(&i915->drm, "Channel count is limited to %d\n",
+ crtc_state->audio.max_channel - 1);
+ }
+
+ sad[1] &= mask;
+ }
+ }
+}
+
/**
* intel_audio_codec_enable - Enable the audio codec for HD audio
* @encoder: encoder on which to enable audio
diff --git a/drivers/gpu/drm/i915/display/intel_audio.h b/drivers/gpu/drm/i915/display/intel_audio.h
index be3edf9c4982..a0162cdc7999 100644
--- a/drivers/gpu/drm/i915/display/intel_audio.h
+++ b/drivers/gpu/drm/i915/display/intel_audio.h
@@ -17,6 +17,7 @@ struct intel_encoder;
#define MAX_CHANNEL_COUNT 8
void intel_audio_hooks_init(struct drm_i915_private *dev_priv);
+void intel_audio_compute_eld(struct intel_crtc_state *crtc_state);
bool intel_audio_compute_config(struct intel_encoder *encoder,
struct intel_crtc_state *crtc_state,
struct drm_connector_state *conn_state);
diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
index 6a4d477e8a15..daaa08c0ee47 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
@@ -2402,6 +2402,8 @@ int intel_hdmi_compute_config(struct intel_encoder *encoder,
return -EINVAL;
}
+ intel_audio_compute_eld(pipe_config);
+
return 0;
}
--
2.25.1
next prev parent reply other threads:[~2023-06-26 16:37 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-26 16:38 [Intel-gfx] [RFC 0/3] Get optimal audio frequency and channels Mitul Golani
2023-06-26 16:38 ` [Intel-gfx] [RFC 1/3] drm/i915/hdmi: Optimize source audio parameter handling Mitul Golani
2023-06-26 16:45 ` Jani Nikula
2023-06-28 16:37 ` Golani, Mitulkumar Ajitkumar
2023-06-26 16:38 ` [Intel-gfx] [RFC 2/3] drm/i915/display: Configure and initialize HDMI audio capabilities Mitul Golani
2023-06-26 17:04 ` Jani Nikula
2023-06-26 16:38 ` Mitul Golani [this message]
2023-06-26 17:18 ` [Intel-gfx] [RFC 3/3] drm/i915/display: Add wrapper to Compute SAD Jani Nikula
2023-06-28 16:43 ` Golani, Mitulkumar Ajitkumar
-- strict thread matches above, loose matches on Subject: below --
2023-06-28 16:33 [Intel-gfx] [RFC 0/3] Get optimal audio frequency and channels Mitul Golani
2023-06-28 16:33 ` [Intel-gfx] [RFC 3/3] drm/i915/display: Add wrapper to Compute SAD Mitul Golani
2023-06-28 16:11 [Intel-gfx] [RFC 0/3] Get optimal audio frequency and channels Mitul Golani
2023-06-28 16:11 ` [Intel-gfx] [RFC 3/3] drm/i915/display: Add wrapper to Compute SAD Mitul Golani
2023-06-26 16:46 [Intel-gfx] [RFC 0/3] Get optimal audio frequency and channels Mitul Golani
2023-06-26 16:46 ` [Intel-gfx] [RFC 3/3] drm/i915/display: Add wrapper to Compute SAD Mitul Golani
2023-06-15 7:07 [Intel-gfx] [RFC 0/3] Get optimal audio frequency and channels Mitul Golani
2023-06-15 7:07 ` [Intel-gfx] [RFC 3/3] drm/i915/display: Add wrapper to Compute SAD Mitul Golani
2023-06-16 9:24 ` Borah, Chaitanya Kumar
2023-06-15 6:31 [Intel-gfx] [RFC 0/3] Get optimal audio frequency and channels Mitul Golani
2023-06-15 6:31 ` [Intel-gfx] [RFC 3/3] drm/i915/display: Add wrapper to Compute SAD Mitul Golani
2023-06-09 17:42 [Intel-gfx] [RFC 0/3] Get optimal audio frequency and channels Mitul Golani
2023-06-09 17:42 ` [Intel-gfx] [RFC 3/3] drm/i915/display: Add wrapper to Compute SAD Mitul Golani
2023-06-15 3:59 ` Borah, Chaitanya Kumar
2023-06-15 7:09 ` Golani, Mitulkumar Ajitkumar
2023-06-19 11:19 ` Kai Vehmanen
2023-06-26 16:05 ` 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=20230626163819.2759500-4-mitulkumar.ajitkumar.golani@intel.com \
--to=mitulkumar.ajitkumar.golani@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
/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