pcm_drm_eld.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * PCM DRM helpers
  4. */
  5. #include <linux/bitfield.h>
  6. #include <linux/export.h>
  7. #include <linux/hdmi.h>
  8. #include <drm/drm_edid.h>
  9. #include <drm/drm_eld.h>
  10. #include <sound/pcm.h>
  11. #include <sound/pcm_drm_eld.h>
  12. #define SAD0_CHANNELS_MASK GENMASK(2, 0) /* max number of channels - 1 */
  13. #define SAD0_FORMAT_MASK GENMASK(6, 3) /* audio format */
  14. #define SAD1_RATE_MASK GENMASK(6, 0) /* bitfield of supported rates */
  15. #define SAD1_RATE_32000_MASK BIT(0)
  16. #define SAD1_RATE_44100_MASK BIT(1)
  17. #define SAD1_RATE_48000_MASK BIT(2)
  18. #define SAD1_RATE_88200_MASK BIT(3)
  19. #define SAD1_RATE_96000_MASK BIT(4)
  20. #define SAD1_RATE_176400_MASK BIT(5)
  21. #define SAD1_RATE_192000_MASK BIT(6)
  22. static const unsigned int eld_rates[] = {
  23. 32000,
  24. 44100,
  25. 48000,
  26. 88200,
  27. 96000,
  28. 176400,
  29. 192000,
  30. };
  31. static unsigned int map_rate_families(const u8 *sad,
  32. unsigned int mask_32000,
  33. unsigned int mask_44100,
  34. unsigned int mask_48000)
  35. {
  36. unsigned int rate_mask = 0;
  37. if (sad[1] & SAD1_RATE_32000_MASK)
  38. rate_mask |= mask_32000;
  39. if (sad[1] & (SAD1_RATE_44100_MASK | SAD1_RATE_88200_MASK | SAD1_RATE_176400_MASK))
  40. rate_mask |= mask_44100;
  41. if (sad[1] & (SAD1_RATE_48000_MASK | SAD1_RATE_96000_MASK | SAD1_RATE_192000_MASK))
  42. rate_mask |= mask_48000;
  43. return rate_mask;
  44. }
  45. static unsigned int sad_rate_mask(const u8 *sad)
  46. {
  47. switch (FIELD_GET(SAD0_FORMAT_MASK, sad[0])) {
  48. case HDMI_AUDIO_CODING_TYPE_PCM:
  49. return sad[1] & SAD1_RATE_MASK;
  50. case HDMI_AUDIO_CODING_TYPE_AC3:
  51. case HDMI_AUDIO_CODING_TYPE_DTS:
  52. return map_rate_families(sad,
  53. SAD1_RATE_32000_MASK,
  54. SAD1_RATE_44100_MASK,
  55. SAD1_RATE_48000_MASK);
  56. case HDMI_AUDIO_CODING_TYPE_EAC3:
  57. case HDMI_AUDIO_CODING_TYPE_DTS_HD:
  58. case HDMI_AUDIO_CODING_TYPE_MLP:
  59. return map_rate_families(sad,
  60. 0,
  61. SAD1_RATE_176400_MASK,
  62. SAD1_RATE_192000_MASK);
  63. default:
  64. /* TODO adjust for other compressed formats as well */
  65. return sad[1] & SAD1_RATE_MASK;
  66. }
  67. }
  68. static unsigned int sad_max_channels(const u8 *sad)
  69. {
  70. switch (FIELD_GET(SAD0_FORMAT_MASK, sad[0])) {
  71. case HDMI_AUDIO_CODING_TYPE_PCM:
  72. return 1 + FIELD_GET(SAD0_CHANNELS_MASK, sad[0]);
  73. case HDMI_AUDIO_CODING_TYPE_AC3:
  74. case HDMI_AUDIO_CODING_TYPE_DTS:
  75. case HDMI_AUDIO_CODING_TYPE_EAC3:
  76. return 2;
  77. case HDMI_AUDIO_CODING_TYPE_DTS_HD:
  78. case HDMI_AUDIO_CODING_TYPE_MLP:
  79. return 8;
  80. default:
  81. /* TODO adjust for other compressed formats as well */
  82. return 1 + FIELD_GET(SAD0_CHANNELS_MASK, sad[0]);
  83. }
  84. }
  85. static int eld_limit_rates(struct snd_pcm_hw_params *params,
  86. struct snd_pcm_hw_rule *rule)
  87. {
  88. struct snd_interval *r = hw_param_interval(params, rule->var);
  89. const struct snd_interval *c;
  90. unsigned int rate_mask = 7, i;
  91. const u8 *sad, *eld = rule->private;
  92. sad = drm_eld_sad(eld);
  93. if (sad) {
  94. c = hw_param_interval_c(params, SNDRV_PCM_HW_PARAM_CHANNELS);
  95. for (i = drm_eld_sad_count(eld); i > 0; i--, sad += 3) {
  96. unsigned max_channels = sad_max_channels(sad);
  97. /*
  98. * Exclude SADs which do not include the
  99. * requested number of channels.
  100. */
  101. if (c->min <= max_channels)
  102. rate_mask |= sad_rate_mask(sad);
  103. }
  104. }
  105. return snd_interval_list(r, ARRAY_SIZE(eld_rates), eld_rates,
  106. rate_mask);
  107. }
  108. static int eld_limit_channels(struct snd_pcm_hw_params *params,
  109. struct snd_pcm_hw_rule *rule)
  110. {
  111. struct snd_interval *c = hw_param_interval(params, rule->var);
  112. const struct snd_interval *r;
  113. struct snd_interval t = { .min = 1, .max = 2, .integer = 1, };
  114. unsigned int i;
  115. const u8 *sad, *eld = rule->private;
  116. sad = drm_eld_sad(eld);
  117. if (sad) {
  118. unsigned int rate_mask = 0;
  119. /* Convert the rate interval to a mask */
  120. r = hw_param_interval_c(params, SNDRV_PCM_HW_PARAM_RATE);
  121. for (i = 0; i < ARRAY_SIZE(eld_rates); i++)
  122. if (r->min <= eld_rates[i] && r->max >= eld_rates[i])
  123. rate_mask |= BIT(i);
  124. for (i = drm_eld_sad_count(eld); i > 0; i--, sad += 3)
  125. if (rate_mask & sad_rate_mask(sad))
  126. t.max = max(t.max, sad_max_channels(sad));
  127. }
  128. return snd_interval_refine(c, &t);
  129. }
  130. int snd_pcm_hw_constraint_eld(struct snd_pcm_runtime *runtime, void *eld)
  131. {
  132. int ret;
  133. ret = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
  134. eld_limit_rates, eld,
  135. SNDRV_PCM_HW_PARAM_CHANNELS, -1);
  136. if (ret < 0)
  137. return ret;
  138. ret = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
  139. eld_limit_channels, eld,
  140. SNDRV_PCM_HW_PARAM_RATE, -1);
  141. return ret;
  142. }
  143. EXPORT_SYMBOL_GPL(snd_pcm_hw_constraint_eld);