Re: [RFC 2/3] drm/i915/display: Configure and initialize HDMI audio capabilities

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi @Kai Vehmanen

> -----Original Message-----
> From: Kai Vehmanen <kai.vehmanen@xxxxxxxxxxxxxxx>
> Sent: 19 June 2023 17:56
> To: Golani, Mitulkumar Ajitkumar <mitulkumar.ajitkumar.golani@xxxxxxxxx>
> Cc: intel-gfx@xxxxxxxxxxxxxxxxxxxxx; jyri.sarha@xxxxxxxxxxxxxxx
> Subject: Re:  [RFC 2/3] drm/i915/display: Configure and initialize
> HDMI audio capabilities
> 
> Hey,
> 
> replying to 9th June version (my mistake), but I checked the 15th June patch
> version and comments applied to that one as well:
> 
> On Fri, 9 Jun 2023, Mitul Golani wrote:
> 
> > Initialize the source audio capabilities for HDMI in crtc_state
> > property by setting them to their maximum supported values, including
> > max_channel and max_frequency. This allows for the calculation of HDMI
> > audio source capabilities with respect to the available mode
> > bandwidth. These capabilities encompass parameters such as supported
> > frequency and channel configurations.
> [...]
> > @@ -1131,6 +1131,12 @@ struct intel_crtc_state {
> >
> >  	struct {
> >  		bool has_audio;
> > +
> > +		/* Audio rate in Hz */
> > +		int max_frequency;
> > +
> > +		/* Number of audio channels */
> > +		int max_channel;
> >  	} audio;
> 
> Comment on this below.
> 
> > --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
> > @@ -2277,6 +2277,40 @@ bool
> intel_hdmi_compute_has_hdmi_sink(struct intel_encoder *encoder,
> >  		!intel_hdmi_is_cloned(crtc_state);
> >  }
> >
> > +static unsigned int calc_audio_bw(int channel, int frequency) {
> > +	int bits_per_sample = 32;
> > +	unsigned int bandwidth = channel * frequency * bits_per_sample;
> 
> Maybe unsigned for bits_per_sample as well? And not sure how fixed this is,
> but having 32 as a define at start file with more descriptive name might be a
> good idea as well. I.e. this is the audio sample container size used in all
> calculations.
> 

Thanks. Will push the correction in next revision.

> > +void
> > +intel_hdmi_audio_compute_config(struct intel_crtc_state *pipe_config)
> > +{
> > +	struct drm_display_mode *adjusted_mode = &pipe_config-
> >hw.adjusted_mode;
> > +	int num_of_channel, aud_rates[7] = {192000, 176000, 96000, 88000,
> 48000, 44100, 32000};
> > +	unsigned int audio_req_bandwidth, available_blank_bandwidth,
> vblank,
> > +hblank;
> > +
> > +	hblank = adjusted_mode->htotal - adjusted_mode->hdisplay;
> > +	vblank = adjusted_mode->vtotal - adjusted_mode->vdisplay;
> > +	available_blank_bandwidth = hblank * vblank *
> > +				    drm_mode_vrefresh(adjusted_mode) *
> pipe_config->pipe_bpp;
> > +	for (num_of_channel = 8; num_of_channel > 0; num_of_channel--) {
> 
> The maximum channel count of 8 would deserve its own define. It's pretty
> much a constant coming from the specs, but still avoid magic numbers in
> code would be preferable. Or we remove this altoghter, see below...

Thanks. Will push the correction in next revision.

> 
> > +		for (int index = 0; index < 7; index++) {
> > +			audio_req_bandwidth =
> calc_audio_bw(num_of_channel,
> > +							    aud_rates[index]);
> > +			if (audio_req_bandwidth <
> available_blank_bandwidth) {
> 
> <= ?
> 
> > +				pipe_config->audio.max_frequency =
> aud_rates[index];
> > +				pipe_config->audio.max_channel =
> num_of_channel;
> > +				return;
> > +			}
> 
> This will hit a problem if we have a case where bandwidth is not enough for
> 5.1 at 192kHz, but it is enough for 2ch 192kHz audio. This approach forces us
> to give preference to either channel acount or sampling rate.
> 
> What if we just store the 'max audio samples per second' into pipe config:
> 
>  - have "int max_audio_samples_per_second;" in pipe_config
>  - pipe_config->audio.max_audio_samples_per_second =
> available_blank_bandwidth / 32;
> 
> Then when filtering SADs, the invidial channels+rate combination of each
> SAD is compared to the max_audio_samples_per_second and based on that,
> the SAD is either filter or passed on. What do you think?
> 
> Br, Kai

Yes, I understood the issue while validating this on one of the panels. Let's say, with the
obtained audio_req_bandwidth, if I encounter the following combination:
pipe_config->audio.max_channel = 8 and pipe_config->audio.max_frequency = "X" value.
Now, let's assume my sink supports only 7 channels. In this case, pruning will be bypassed,
and there is a possibility that the sink-supported channel multiplied by the sink-supported
rate exceeds the available blank bandwidth, and pruning doesn't occur.

For this situation, I am considering adding an "else" part in intel_audio_compute_eld.
This "else" part would check if (sad_to_channels(sad) < crtc_state->audio.max_channel),
for example, in the GLK case. In that case, the channel would be fixed.

So, if Channel * audio sample container size * (iterating from Max rate to Min rate)
is less than max_audio_samples_per_second, I believe we can eliminate the situation you
mentioned. If the sink's supported channel is lower than pipe_config->audio.max_channel,
we can get another chance to adjust the rate based on the sink's maximum capability.

Please give your opinion on this approach ?

Thanks
Mitul




[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux