[Intel-gfx] [RFC 2/3] drm/i915/display: Configure and initialize HDMI audio capabilities
Jani Nikula
jani.nikula at linux.intel.com
Mon Jun 19 15:32:54 UTC 2023
On Mon, 19 Jun 2023, Kai Vehmanen <kai.vehmanen at linux.intel.com> wrote:
> 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?
Personally, I'd always go for signed ints. Integer promotions are hard.
BR,
Jani.
> 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.
>
>> +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...
>
>> + 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
>
--
Jani Nikula, Intel Open Source Graphics Center
More information about the Intel-gfx
mailing list