diff mbox series

[v2,4/6] drm/i915/display: iterate through channels if no feasible frequencies

Message ID 20241127120715.185348-5-vinod.govindapillai@intel.com (mailing list archive)
State New
Headers show
Series prunue audio frequencies based on bw limits for DP2 | expand

Commit Message

Vinod Govindapillai Nov. 27, 2024, 12:07 p.m. UTC
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.

v2: fix commit description (Kai)
    uninitialized variable "sad_freq" (kernel test robot)
    use intel_display instead of i915

Bspec: 67768
Signed-off-by: Vinod Govindapillai <vinod.govindapillai@intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_audio.c | 35 +++++++++++++++-------
 1 file changed, 25 insertions(+), 10 deletions(-)
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/display/intel_audio.c b/drivers/gpu/drm/i915/display/intel_audio.c
index b4eef6d60ca1..cf88728b8f80 100644
--- a/drivers/gpu/drm/i915/display/intel_audio.c
+++ b/drivers/gpu/drm/i915/display/intel_audio.c
@@ -765,16 +765,28 @@  static void intel_audio_compute_sad(struct intel_encoder *encoder,
 				    int avail_overhead, int req_overhead,
 				    struct cea_sad *sad)
 {
-	u8 sad_channels = sad->channels + 1;
-	u8 sad_freq;
+	u8 sad_freq = 0;
+	u8 channels;
 
-	sad_freq = intel_audio_get_pruned_audfreq(line_freq_khz,
-						  hblank_slots_lanes_bytes,
-						  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(line_freq_khz,
+							  hblank_slots_lanes_bytes,
+							  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 intel_encoder *encoder,
@@ -794,22 +806,25 @@  bool intel_audio_compute_eld_config(struct intel_encoder *encoder,
 	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(encoder, line_freq_khz,
 					hblank_slots_lanes_bytes,
 					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(display->drm,
-				    "[CONNECTOR:%d:%s] SAD updated. Freq: 0x%x(0x%x)\n",
+				    "[CONNECTOR:%d:%s] SAD updated. Freq: 0x%x(0x%x) Channels: %d(%d)\n",
 				    connector->base.base.id, connector->base.name,
-				    sad.freq, sad_freq);
+				    sad.freq, sad_freq, sad.channels,
+				    sad_channels);
 		}
 	}