Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
hda_eld.c
Go to the documentation of this file.
1 /*
2  * Generic routines and proc interface for ELD(EDID Like Data) information
3  *
4  * Copyright(c) 2008 Intel Corporation.
5  *
6  * Authors:
7  * Wu Fengguang <[email protected]>
8  *
9  * This driver is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This driver is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22  */
23 
24 #include <linux/init.h>
25 #include <linux/slab.h>
26 #include <sound/core.h>
27 #include <asm/unaligned.h>
28 #include "hda_codec.h"
29 #include "hda_local.h"
30 
34 };
35 
42 };
43 
44 static char *cea_speaker_allocation_names[] = {
45  /* 0 */ "FL/FR",
46  /* 1 */ "LFE",
47  /* 2 */ "FC",
48  /* 3 */ "RL/RR",
49  /* 4 */ "RC",
50  /* 5 */ "FLC/FRC",
51  /* 6 */ "RLC/RRC",
52  /* 7 */ "FLW/FRW",
53  /* 8 */ "FLH/FRH",
54  /* 9 */ "TC",
55  /* 10 */ "FCH",
56 };
57 
58 static char *eld_connection_type_names[4] = {
59  "HDMI",
60  "DisplayPort",
61  "2-reserved",
62  "3-reserved"
63 };
64 
82  /* also include valid xtypes below */
86 };
87 
94 };
95 
96 static char *cea_audio_coding_type_names[] = {
97  /* 0 */ "undefined",
98  /* 1 */ "LPCM",
99  /* 2 */ "AC-3",
100  /* 3 */ "MPEG1",
101  /* 4 */ "MP3",
102  /* 5 */ "MPEG2",
103  /* 6 */ "AAC-LC",
104  /* 7 */ "DTS",
105  /* 8 */ "ATRAC",
106  /* 9 */ "DSD (One Bit Audio)",
107  /* 10 */ "E-AC-3/DD+ (Dolby Digital Plus)",
108  /* 11 */ "DTS-HD",
109  /* 12 */ "MLP (Dolby TrueHD)",
110  /* 13 */ "DST",
111  /* 14 */ "WMAPro",
112  /* 15 */ "HE-AAC",
113  /* 16 */ "HE-AACv2",
114  /* 17 */ "MPEG Surround",
115 };
116 
117 /*
118  * The following two lists are shared between
119  * - HDMI audio InfoFrame (source to sink)
120  * - CEA E-EDID Extension (sink to source)
121  */
122 
123 /*
124  * SS1:SS0 index => sample size
125  */
126 static int cea_sample_sizes[4] = {
127  0, /* 0: Refer to Stream Header */
128  AC_SUPPCM_BITS_16, /* 1: 16 bits */
129  AC_SUPPCM_BITS_20, /* 2: 20 bits */
130  AC_SUPPCM_BITS_24, /* 3: 24 bits */
131 };
132 
133 /*
134  * SF2:SF1:SF0 index => sampling frequency
135  */
136 static int cea_sampling_frequencies[8] = {
137  0, /* 0: Refer to Stream Header */
138  SNDRV_PCM_RATE_32000, /* 1: 32000Hz */
139  SNDRV_PCM_RATE_44100, /* 2: 44100Hz */
140  SNDRV_PCM_RATE_48000, /* 3: 48000Hz */
141  SNDRV_PCM_RATE_88200, /* 4: 88200Hz */
142  SNDRV_PCM_RATE_96000, /* 5: 96000Hz */
143  SNDRV_PCM_RATE_176400, /* 6: 176400Hz */
144  SNDRV_PCM_RATE_192000, /* 7: 192000Hz */
145 };
146 
147 static unsigned int hdmi_get_eld_data(struct hda_codec *codec, hda_nid_t nid,
148  int byte_index)
149 {
150  unsigned int val;
151 
152  val = snd_hda_codec_read(codec, nid, 0,
153  AC_VERB_GET_HDMI_ELDD, byte_index);
154 #ifdef BE_PARANOID
155  printk(KERN_INFO "HDMI: ELD data byte %d: 0x%x\n", byte_index, val);
156 #endif
157  return val;
158 }
159 
160 #define GRAB_BITS(buf, byte, lowbit, bits) \
161 ({ \
162  BUILD_BUG_ON(lowbit > 7); \
163  BUILD_BUG_ON(bits > 8); \
164  BUILD_BUG_ON(bits <= 0); \
165  \
166  (buf[byte] >> (lowbit)) & ((1 << (bits)) - 1); \
167 })
168 
169 static void hdmi_update_short_audio_desc(struct cea_sad *a,
170  const unsigned char *buf)
171 {
172  int i;
173  int val;
174 
175  val = GRAB_BITS(buf, 1, 0, 7);
176  a->rates = 0;
177  for (i = 0; i < 7; i++)
178  if (val & (1 << i))
179  a->rates |= cea_sampling_frequencies[i + 1];
180 
181  a->channels = GRAB_BITS(buf, 0, 0, 3);
182  a->channels++;
183 
184  a->sample_bits = 0;
185  a->max_bitrate = 0;
186 
187  a->format = GRAB_BITS(buf, 0, 3, 4);
188  switch (a->format) {
191  "HDMI: audio coding type 0 not expected\n");
192  break;
193 
195  val = GRAB_BITS(buf, 2, 0, 3);
196  for (i = 0; i < 3; i++)
197  if (val & (1 << i))
198  a->sample_bits |= cea_sample_sizes[i + 1];
199  break;
200 
208  a->max_bitrate = GRAB_BITS(buf, 2, 0, 8);
209  a->max_bitrate *= 8000;
210  break;
211 
213  break;
214 
216  break;
217 
219  break;
220 
222  break;
223 
225  break;
226 
228  a->profile = GRAB_BITS(buf, 2, 0, 3);
229  break;
230 
232  a->format = GRAB_BITS(buf, 2, 3, 5);
236  "HDMI: audio coding xtype %d not expected\n",
237  a->format);
238  a->format = 0;
239  } else
242  break;
243  }
244 }
245 
246 /*
247  * Be careful, ELD buf could be totally rubbish!
248  */
249 static int hdmi_update_eld(struct hdmi_eld *e,
250  const unsigned char *buf, int size)
251 {
252  int mnl;
253  int i;
254 
255  e->eld_ver = GRAB_BITS(buf, 0, 3, 5);
256  if (e->eld_ver != ELD_VER_CEA_861D &&
257  e->eld_ver != ELD_VER_PARTIAL) {
258  snd_printd(KERN_INFO "HDMI: Unknown ELD version %d\n",
259  e->eld_ver);
260  goto out_fail;
261  }
262 
263  e->eld_size = size;
264  e->baseline_len = GRAB_BITS(buf, 2, 0, 8);
265  mnl = GRAB_BITS(buf, 4, 0, 5);
266  e->cea_edid_ver = GRAB_BITS(buf, 4, 5, 3);
267 
268  e->support_hdcp = GRAB_BITS(buf, 5, 0, 1);
269  e->support_ai = GRAB_BITS(buf, 5, 1, 1);
270  e->conn_type = GRAB_BITS(buf, 5, 2, 2);
271  e->sad_count = GRAB_BITS(buf, 5, 4, 4);
272 
273  e->aud_synch_delay = GRAB_BITS(buf, 6, 0, 8) * 2;
274  e->spk_alloc = GRAB_BITS(buf, 7, 0, 7);
275 
276  e->port_id = get_unaligned_le64(buf + 8);
277 
278  /* not specified, but the spec's tendency is little endian */
279  e->manufacture_id = get_unaligned_le16(buf + 16);
280  e->product_id = get_unaligned_le16(buf + 18);
281 
282  if (mnl > ELD_MAX_MNL) {
283  snd_printd(KERN_INFO "HDMI: MNL is reserved value %d\n", mnl);
284  goto out_fail;
285  } else if (ELD_FIXED_BYTES + mnl > size) {
286  snd_printd(KERN_INFO "HDMI: out of range MNL %d\n", mnl);
287  goto out_fail;
288  } else
289  strlcpy(e->monitor_name, buf + ELD_FIXED_BYTES, mnl + 1);
290 
291  for (i = 0; i < e->sad_count; i++) {
292  if (ELD_FIXED_BYTES + mnl + 3 * (i + 1) > size) {
293  snd_printd(KERN_INFO "HDMI: out of range SAD %d\n", i);
294  goto out_fail;
295  }
296  hdmi_update_short_audio_desc(e->sad + i,
297  buf + ELD_FIXED_BYTES + mnl + 3 * i);
298  }
299 
300  /*
301  * HDMI sink's ELD info cannot always be retrieved for now, e.g.
302  * in console or for audio devices. Assume the highest speakers
303  * configuration, to _not_ prohibit multi-channel audio playback.
304  */
305  if (!e->spk_alloc)
306  e->spk_alloc = 0xffff;
307 
308  e->eld_valid = true;
309  return 0;
310 
311 out_fail:
312  return -EINVAL;
313 }
314 
316 {
317  return snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_HDMI_DIP_SIZE,
319 }
320 
321 int snd_hdmi_get_eld(struct hdmi_eld *eld,
322  struct hda_codec *codec, hda_nid_t nid)
323 {
324  int i;
325  int ret;
326  int size;
327  unsigned char *buf;
328 
329  /*
330  * ELD size is initialized to zero in caller function. If no errors and
331  * ELD is valid, actual eld_size is assigned in hdmi_update_eld()
332  */
333 
334  size = snd_hdmi_get_eld_size(codec, nid);
335  if (size == 0) {
336  /* wfg: workaround for ASUS P5E-VM HDMI board */
337  snd_printd(KERN_INFO "HDMI: ELD buf size is 0, force 128\n");
338  size = 128;
339  }
340  if (size < ELD_FIXED_BYTES || size > ELD_MAX_SIZE) {
341  snd_printd(KERN_INFO "HDMI: invalid ELD buf size %d\n", size);
342  return -ERANGE;
343  }
344 
345  /* set ELD buffer */
346  buf = eld->eld_buffer;
347 
348  for (i = 0; i < size; i++) {
349  unsigned int val = hdmi_get_eld_data(codec, nid, i);
350  /*
351  * Graphics driver might be writing to ELD buffer right now.
352  * Just abort. The caller will repoll after a while.
353  */
354  if (!(val & AC_ELDD_ELD_VALID)) {
356  "HDMI: invalid ELD data byte %d\n", i);
357  ret = -EINVAL;
358  goto error;
359  }
360  val &= AC_ELDD_ELD_DATA;
361  /*
362  * The first byte cannot be zero. This can happen on some DVI
363  * connections. Some Intel chips may also need some 250ms delay
364  * to return non-zero ELD data, even when the graphics driver
365  * correctly writes ELD content before setting ELD_valid bit.
366  */
367  if (!val && !i) {
368  snd_printdd(KERN_INFO "HDMI: 0 ELD data\n");
369  ret = -EINVAL;
370  goto error;
371  }
372  buf[i] = val;
373  }
374 
375  ret = hdmi_update_eld(eld, buf, size);
376 
377 error:
378  return ret;
379 }
380 
385 static void hdmi_print_pcm_rates(int pcm, char *buf, int buflen)
386 {
387  static unsigned int alsa_rates[] = {
388  5512, 8000, 11025, 16000, 22050, 32000, 44100, 48000, 64000,
389  88200, 96000, 176400, 192000, 384000
390  };
391  int i, j;
392 
393  for (i = 0, j = 0; i < ARRAY_SIZE(alsa_rates); i++)
394  if (pcm & (1 << i))
395  j += snprintf(buf + j, buflen - j, " %d",
396  alsa_rates[i]);
397 
398  buf[j] = '\0'; /* necessary when j == 0 */
399 }
400 
401 #define SND_PRINT_RATES_ADVISED_BUFSIZE 80
402 
403 static void hdmi_show_short_audio_desc(struct cea_sad *a)
404 {
406  char buf2[8 + SND_PRINT_BITS_ADVISED_BUFSIZE] = ", bits =";
407 
408  if (!a->format)
409  return;
410 
411  hdmi_print_pcm_rates(a->rates, buf, sizeof(buf));
412 
413  if (a->format == AUDIO_CODING_TYPE_LPCM)
414  snd_print_pcm_bits(a->sample_bits, buf2 + 8, sizeof(buf2) - 8);
415  else if (a->max_bitrate)
416  snprintf(buf2, sizeof(buf2),
417  ", max bitrate = %d", a->max_bitrate);
418  else
419  buf2[0] = '\0';
420 
421  _snd_printd(SND_PR_VERBOSE, "HDMI: supports coding type %s:"
422  " channels = %d, rates =%s%s\n",
423  cea_audio_coding_type_names[a->format],
424  a->channels,
425  buf,
426  buf2);
427 }
428 
429 void snd_print_channel_allocation(int spk_alloc, char *buf, int buflen)
430 {
431  int i, j;
432 
433  for (i = 0, j = 0; i < ARRAY_SIZE(cea_speaker_allocation_names); i++) {
434  if (spk_alloc & (1 << i))
435  j += snprintf(buf + j, buflen - j, " %s",
436  cea_speaker_allocation_names[i]);
437  }
438  buf[j] = '\0'; /* necessary when j == 0 */
439 }
440 
442 {
443  int i;
444 
445  _snd_printd(SND_PR_VERBOSE, "HDMI: detected monitor %s at connection type %s\n",
446  e->monitor_name,
447  eld_connection_type_names[e->conn_type]);
448 
449  if (e->spk_alloc) {
451  snd_print_channel_allocation(e->spk_alloc, buf, sizeof(buf));
452  _snd_printd(SND_PR_VERBOSE, "HDMI: available speakers:%s\n", buf);
453  }
454 
455  for (i = 0; i < e->sad_count; i++)
456  hdmi_show_short_audio_desc(e->sad + i);
457 }
458 
459 #ifdef CONFIG_PROC_FS
460 
461 static void hdmi_print_sad_info(int i, struct cea_sad *a,
462  struct snd_info_buffer *buffer)
463 {
465 
466  snd_iprintf(buffer, "sad%d_coding_type\t[0x%x] %s\n",
467  i, a->format, cea_audio_coding_type_names[a->format]);
468  snd_iprintf(buffer, "sad%d_channels\t\t%d\n", i, a->channels);
469 
470  hdmi_print_pcm_rates(a->rates, buf, sizeof(buf));
471  snd_iprintf(buffer, "sad%d_rates\t\t[0x%x]%s\n", i, a->rates, buf);
472 
473  if (a->format == AUDIO_CODING_TYPE_LPCM) {
474  snd_print_pcm_bits(a->sample_bits, buf, sizeof(buf));
475  snd_iprintf(buffer, "sad%d_bits\t\t[0x%x]%s\n",
476  i, a->sample_bits, buf);
477  }
478 
479  if (a->max_bitrate)
480  snd_iprintf(buffer, "sad%d_max_bitrate\t%d\n",
481  i, a->max_bitrate);
482 
483  if (a->profile)
484  snd_iprintf(buffer, "sad%d_profile\t\t%d\n", i, a->profile);
485 }
486 
487 static void hdmi_print_eld_info(struct snd_info_entry *entry,
488  struct snd_info_buffer *buffer)
489 {
490  struct hdmi_eld *e = entry->private_data;
492  int i;
493  static char *eld_versoin_names[32] = {
494  "reserved",
495  "reserved",
496  "CEA-861D or below",
497  [3 ... 30] = "reserved",
498  [31] = "partial"
499  };
500  static char *cea_edid_version_names[8] = {
501  "no CEA EDID Timing Extension block present",
502  "CEA-861",
503  "CEA-861-A",
504  "CEA-861-B, C or D",
505  [4 ... 7] = "reserved"
506  };
507 
508  snd_iprintf(buffer, "monitor_present\t\t%d\n", e->monitor_present);
509  snd_iprintf(buffer, "eld_valid\t\t%d\n", e->eld_valid);
510  if (!e->eld_valid)
511  return;
512  snd_iprintf(buffer, "monitor_name\t\t%s\n", e->monitor_name);
513  snd_iprintf(buffer, "connection_type\t\t%s\n",
514  eld_connection_type_names[e->conn_type]);
515  snd_iprintf(buffer, "eld_version\t\t[0x%x] %s\n", e->eld_ver,
516  eld_versoin_names[e->eld_ver]);
517  snd_iprintf(buffer, "edid_version\t\t[0x%x] %s\n", e->cea_edid_ver,
518  cea_edid_version_names[e->cea_edid_ver]);
519  snd_iprintf(buffer, "manufacture_id\t\t0x%x\n", e->manufacture_id);
520  snd_iprintf(buffer, "product_id\t\t0x%x\n", e->product_id);
521  snd_iprintf(buffer, "port_id\t\t\t0x%llx\n", (long long)e->port_id);
522  snd_iprintf(buffer, "support_hdcp\t\t%d\n", e->support_hdcp);
523  snd_iprintf(buffer, "support_ai\t\t%d\n", e->support_ai);
524  snd_iprintf(buffer, "audio_sync_delay\t%d\n", e->aud_synch_delay);
525 
526  snd_print_channel_allocation(e->spk_alloc, buf, sizeof(buf));
527  snd_iprintf(buffer, "speakers\t\t[0x%x]%s\n", e->spk_alloc, buf);
528 
529  snd_iprintf(buffer, "sad_count\t\t%d\n", e->sad_count);
530 
531  for (i = 0; i < e->sad_count; i++)
532  hdmi_print_sad_info(i, e->sad + i, buffer);
533 }
534 
535 static void hdmi_write_eld_info(struct snd_info_entry *entry,
536  struct snd_info_buffer *buffer)
537 {
538  struct hdmi_eld *e = entry->private_data;
539  char line[64];
540  char name[64];
541  char *sname;
542  long long val;
543  unsigned int n;
544 
545  while (!snd_info_get_line(buffer, line, sizeof(line))) {
546  if (sscanf(line, "%s %llx", name, &val) != 2)
547  continue;
548  /*
549  * We don't allow modification to these fields:
550  * monitor_name manufacture_id product_id
551  * eld_version edid_version
552  */
553  if (!strcmp(name, "monitor_present"))
554  e->monitor_present = val;
555  else if (!strcmp(name, "eld_valid"))
556  e->eld_valid = val;
557  else if (!strcmp(name, "connection_type"))
558  e->conn_type = val;
559  else if (!strcmp(name, "port_id"))
560  e->port_id = val;
561  else if (!strcmp(name, "support_hdcp"))
562  e->support_hdcp = val;
563  else if (!strcmp(name, "support_ai"))
564  e->support_ai = val;
565  else if (!strcmp(name, "audio_sync_delay"))
566  e->aud_synch_delay = val;
567  else if (!strcmp(name, "speakers"))
568  e->spk_alloc = val;
569  else if (!strcmp(name, "sad_count"))
570  e->sad_count = val;
571  else if (!strncmp(name, "sad", 3)) {
572  sname = name + 4;
573  n = name[3] - '0';
574  if (name[4] >= '0' && name[4] <= '9') {
575  sname++;
576  n = 10 * n + name[4] - '0';
577  }
578  if (n >= ELD_MAX_SAD)
579  continue;
580  if (!strcmp(sname, "_coding_type"))
581  e->sad[n].format = val;
582  else if (!strcmp(sname, "_channels"))
583  e->sad[n].channels = val;
584  else if (!strcmp(sname, "_rates"))
585  e->sad[n].rates = val;
586  else if (!strcmp(sname, "_bits"))
587  e->sad[n].sample_bits = val;
588  else if (!strcmp(sname, "_max_bitrate"))
589  e->sad[n].max_bitrate = val;
590  else if (!strcmp(sname, "_profile"))
591  e->sad[n].profile = val;
592  if (n >= e->sad_count)
593  e->sad_count = n + 1;
594  }
595  }
596 }
597 
598 
599 int snd_hda_eld_proc_new(struct hda_codec *codec, struct hdmi_eld *eld,
600  int index)
601 {
602  char name[32];
603  struct snd_info_entry *entry;
604  int err;
605 
606  snprintf(name, sizeof(name), "eld#%d.%d", codec->addr, index);
607  err = snd_card_proc_new(codec->bus->card, name, &entry);
608  if (err < 0)
609  return err;
610 
611  snd_info_set_text_ops(entry, eld, hdmi_print_eld_info);
612  entry->c.text.write = hdmi_write_eld_info;
613  entry->mode |= S_IWUSR;
614  eld->proc_entry = entry;
615 
616  return 0;
617 }
618 
619 void snd_hda_eld_proc_free(struct hda_codec *codec, struct hdmi_eld *eld)
620 {
621  if (!codec->bus->shutdown && eld->proc_entry) {
622  snd_device_free(codec->bus->card, eld->proc_entry);
623  eld->proc_entry = NULL;
624  }
625 }
626 
627 #endif /* CONFIG_PROC_FS */
628 
629 /* update PCM info based on ELD */
631  struct hda_pcm_stream *hinfo)
632 {
633  u32 rates;
634  u64 formats;
635  unsigned int maxbps;
636  unsigned int channels_max;
637  int i;
638 
639  /* assume basic audio support (the basic audio flag is not in ELD;
640  * however, all audio capable sinks are required to support basic
641  * audio) */
644  formats = SNDRV_PCM_FMTBIT_S16_LE;
645  maxbps = 16;
646  channels_max = 2;
647  for (i = 0; i < eld->sad_count; i++) {
648  struct cea_sad *a = &eld->sad[i];
649  rates |= a->rates;
650  if (a->channels > channels_max)
651  channels_max = a->channels;
652  if (a->format == AUDIO_CODING_TYPE_LPCM) {
653  if (a->sample_bits & AC_SUPPCM_BITS_20) {
654  formats |= SNDRV_PCM_FMTBIT_S32_LE;
655  if (maxbps < 20)
656  maxbps = 20;
657  }
658  if (a->sample_bits & AC_SUPPCM_BITS_24) {
659  formats |= SNDRV_PCM_FMTBIT_S32_LE;
660  if (maxbps < 24)
661  maxbps = 24;
662  }
663  }
664  }
665 
666  /* restrict the parameters by the values the codec provides */
667  hinfo->rates &= rates;
668  hinfo->formats &= formats;
669  hinfo->maxbps = min(hinfo->maxbps, maxbps);
670  hinfo->channels_max = min(hinfo->channels_max, channels_max);
671 }