[PATCH 6/9] drm/i915/display: iterare through channels if no feasible frequencies

Vinod Govindapillai vinod.govindapillai at intel.com
Tue Oct 8 08:23:24 UTC 2024


For a pipe configuration, if no supported audio frequencies are
found, then start reducing the audio channels and try assess the
sad audio frequency list again.

Bspec: 67768
Signed-off-by: Vinod Govindapillai <vinod.govindapillai at intel.com>
---
 drivers/gpu/drm/i915/display/intel_audio.c | 32 ++++++++++++++++------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_audio.c b/drivers/gpu/drm/i915/display/intel_audio.c
index e84101ef9531..14fabbcbf5da 100644
--- a/drivers/gpu/drm/i915/display/intel_audio.c
+++ b/drivers/gpu/drm/i915/display/intel_audio.c
@@ -766,16 +766,28 @@ static void intel_audio_compute_sad(struct drm_i915_private *i915,
 				    int avail_overhead, int req_overhead,
 				    struct cea_sad *sad)
 {
-	u8 sad_channels = sad->channels + 1;
+	u8 channels;
 	u8 sad_freq;
 
-	sad_freq = intel_audio_get_pruned_audfreq(i915, line_freq_khz,
-						  hblank_slots_lanes,
-						  avail_overhead,
-						  req_overhead, sad_channels,
-						  sad->freq);
+	/*
+	 * If we don't find any supported audio frequencies for a channel,
+	 * reduce the channel and try
+	 */
+	for (channels = sad->channels + 1; channels >= 1; channels--) {
+		sad_freq = intel_audio_get_pruned_audfreq(i915, line_freq_khz,
+							  hblank_slots_lanes,
+							  avail_overhead,
+							  req_overhead,
+							  channels,
+							  sad->freq);
+
+		/* Supported frequencies exist! No need to proceed further */
+		if (sad_freq)
+			break;
+	}
 
 	sad->freq = sad_freq;
+	sad->channels = channels ? channels - 1 : 0;
 }
 
 bool intel_audio_compute_eld_config(struct drm_connector_state *conn_state,
@@ -793,19 +805,23 @@ bool intel_audio_compute_eld_config(struct drm_connector_state *conn_state,
 	for (int i = 0; i < drm_eld_sad_count(eld); i++) {
 		struct cea_sad sad;
 		u8 sad_freq;
+		u8 sad_channels;
 
 		if (drm_eld_sad_get(eld, i, &sad))
 			continue;
 
 		sad_freq = sad.freq;
+		sad_channels = sad.channels;
 		intel_audio_compute_sad(i915, line_freq_khz,
 					hblank_slots_lanes,
 					avail_overhead, req_overhead, &sad);
 
 		/* Update the eld with new sad data if any changes in the list */
-		if (sad_freq != sad.freq) {
+		if (sad_freq != sad.freq || sad_channels != sad.channels) {
 			drm_eld_sad_set(eld, i, &sad);
-			drm_dbg_kms(&i915->drm, "sad updated. Pruned freq list: 0x%x\n", sad.freq);
+			drm_dbg_kms(&i915->drm,
+				    "SAD updated. Freq: 0x%x(0x%x) Channels: %d(%d)\n",
+				    sad.freq, sad_freq, sad.channels, sad_channels);
 		}
 	}
 
-- 
2.34.1



More information about the Intel-gfx mailing list