ALSA: hda - make HDMI messages more user friendly
[linux-2.6] / sound / pci / hda / hda_eld.c
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 <wfg@linux.intel.com>
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 <sound/core.h>
26 #include <asm/unaligned.h>
27 #include "hda_codec.h"
28 #include "hda_local.h"
29
30 enum eld_versions {
31         ELD_VER_CEA_861D        = 2,
32         ELD_VER_PARTIAL         = 31,
33 };
34
35 static char *eld_versoin_names[32] = {
36         "reserved",
37         "reserved",
38         "CEA-861D or below",
39         [3 ... 30] = "reserved",
40         [31] = "partial"
41 };
42
43 enum cea_edid_versions {
44         CEA_EDID_VER_NONE       = 0,
45         CEA_EDID_VER_CEA861     = 1,
46         CEA_EDID_VER_CEA861A    = 2,
47         CEA_EDID_VER_CEA861BCD  = 3,
48         CEA_EDID_VER_RESERVED   = 4,
49 };
50
51 static char *cea_edid_version_names[8] = {
52         "no CEA EDID Timing Extension block present",
53         "CEA-861",
54         "CEA-861-A",
55         "CEA-861-B, C or D",
56         [4 ... 7] = "reserved"
57 };
58
59 static char *cea_speaker_allocation_names[] = {
60         /*  0 */ "FL/FR",
61         /*  1 */ "LFE",
62         /*  2 */ "FC",
63         /*  3 */ "RL/RR",
64         /*  4 */ "RC",
65         /*  5 */ "FLC/FRC",
66         /*  6 */ "RLC/RRC",
67         /*  7 */ "FLW/FRW",
68         /*  8 */ "FLH/FRH",
69         /*  9 */ "TC",
70         /* 10 */ "FCH",
71 };
72
73 static char *eld_connection_type_names[4] = {
74         "HDMI",
75         "Display Port",
76         "2-reserved",
77         "3-reserved"
78 };
79
80 enum cea_audio_coding_types {
81         AUDIO_CODING_TYPE_REF_STREAM_HEADER     =  0,
82         AUDIO_CODING_TYPE_LPCM                  =  1,
83         AUDIO_CODING_TYPE_AC3                   =  2,
84         AUDIO_CODING_TYPE_MPEG1                 =  3,
85         AUDIO_CODING_TYPE_MP3                   =  4,
86         AUDIO_CODING_TYPE_MPEG2                 =  5,
87         AUDIO_CODING_TYPE_AACLC                 =  6,
88         AUDIO_CODING_TYPE_DTS                   =  7,
89         AUDIO_CODING_TYPE_ATRAC                 =  8,
90         AUDIO_CODING_TYPE_SACD                  =  9,
91         AUDIO_CODING_TYPE_EAC3                  = 10,
92         AUDIO_CODING_TYPE_DTS_HD                = 11,
93         AUDIO_CODING_TYPE_MLP                   = 12,
94         AUDIO_CODING_TYPE_DST                   = 13,
95         AUDIO_CODING_TYPE_WMAPRO                = 14,
96         AUDIO_CODING_TYPE_REF_CXT               = 15,
97         /* also include valid xtypes below */
98         AUDIO_CODING_TYPE_HE_AAC                = 15,
99         AUDIO_CODING_TYPE_HE_AAC2               = 16,
100         AUDIO_CODING_TYPE_MPEG_SURROUND         = 17,
101 };
102
103 enum cea_audio_coding_xtypes {
104         AUDIO_CODING_XTYPE_HE_REF_CT            = 0,
105         AUDIO_CODING_XTYPE_HE_AAC               = 1,
106         AUDIO_CODING_XTYPE_HE_AAC2              = 2,
107         AUDIO_CODING_XTYPE_MPEG_SURROUND        = 3,
108         AUDIO_CODING_XTYPE_FIRST_RESERVED       = 4,
109 };
110
111 static char *cea_audio_coding_type_names[] = {
112         /*  0 */ "undefined",
113         /*  1 */ "LPCM",
114         /*  2 */ "AC-3",
115         /*  3 */ "MPEG1",
116         /*  4 */ "MP3",
117         /*  5 */ "MPEG2",
118         /*  6 */ "AAC-LC",
119         /*  7 */ "DTS",
120         /*  8 */ "ATRAC",
121         /*  9 */ "DSD (One Bit Audio)",
122         /* 10 */ "E-AC-3/DD+ (Dolby Digital Plus)",
123         /* 11 */ "DTS-HD",
124         /* 12 */ "MLP (Dolby TrueHD)",
125         /* 13 */ "DST",
126         /* 14 */ "WMAPro",
127         /* 15 */ "HE-AAC",
128         /* 16 */ "HE-AACv2",
129         /* 17 */ "MPEG Surround",
130 };
131
132 /*
133  * The following two lists are shared between
134  *      - HDMI audio InfoFrame (source to sink)
135  *      - CEA E-EDID Extension (sink to source)
136  */
137
138 /*
139  * SS1:SS0 index => sample size
140  */
141 static int cea_sample_sizes[4] = {
142         0,                      /* 0: Refer to Stream Header */
143         AC_SUPPCM_BITS_16,      /* 1: 16 bits */
144         AC_SUPPCM_BITS_20,      /* 2: 20 bits */
145         AC_SUPPCM_BITS_24,      /* 3: 24 bits */
146 };
147
148 /*
149  * SF2:SF1:SF0 index => sampling frequency
150  */
151 static int cea_sampling_frequencies[8] = {
152         0,                      /* 0: Refer to Stream Header */
153         SNDRV_PCM_RATE_32000,   /* 1:  32000Hz */
154         SNDRV_PCM_RATE_44100,   /* 2:  44100Hz */
155         SNDRV_PCM_RATE_48000,   /* 3:  48000Hz */
156         SNDRV_PCM_RATE_88200,   /* 4:  88200Hz */
157         SNDRV_PCM_RATE_96000,   /* 5:  96000Hz */
158         SNDRV_PCM_RATE_176400,  /* 6: 176400Hz */
159         SNDRV_PCM_RATE_192000,  /* 7: 192000Hz */
160 };
161
162 static unsigned char hdmi_get_eld_byte(struct hda_codec *codec, hda_nid_t nid,
163                                         int byte_index)
164 {
165         unsigned int val;
166
167         val = snd_hda_codec_read(codec, nid, 0,
168                                         AC_VERB_GET_HDMI_ELDD, byte_index);
169
170 #ifdef BE_PARANOID
171         printk(KERN_INFO "HDMI: ELD data byte %d: 0x%x\n", byte_index, val);
172 #endif
173
174         if ((val & AC_ELDD_ELD_VALID) == 0) {
175                 snd_printd(KERN_INFO "HDMI: invalid ELD data byte %d\n",
176                                                                 byte_index);
177                 val = 0;
178         }
179
180         return val & AC_ELDD_ELD_DATA;
181 }
182
183 #define GRAB_BITS(buf, byte, lowbit, bits)              \
184 ({                                                      \
185         BUILD_BUG_ON(lowbit > 7);                       \
186         BUILD_BUG_ON(bits > 8);                         \
187         BUILD_BUG_ON(bits <= 0);                        \
188                                                         \
189         (buf[byte] >> (lowbit)) & ((1 << (bits)) - 1);  \
190 })
191
192 static void hdmi_update_short_audio_desc(struct cea_sad *a,
193                                          const unsigned char *buf)
194 {
195         int i;
196         int val;
197
198         val = GRAB_BITS(buf, 1, 0, 7);
199         a->rates = 0;
200         for (i = 0; i < 7; i++)
201                 if (val & (1 << i))
202                         a->rates |= cea_sampling_frequencies[i + 1];
203
204         a->channels = GRAB_BITS(buf, 0, 0, 3);
205         a->channels++;
206
207         a->format = GRAB_BITS(buf, 0, 3, 4);
208         switch (a->format) {
209         case AUDIO_CODING_TYPE_REF_STREAM_HEADER:
210                 snd_printd(KERN_INFO
211                                 "HDMI: audio coding type 0 not expected\n");
212                 break;
213
214         case AUDIO_CODING_TYPE_LPCM:
215                 val = GRAB_BITS(buf, 2, 0, 3);
216                 a->sample_bits = 0;
217                 for (i = 0; i < 3; i++)
218                         if (val & (1 << i))
219                                 a->sample_bits |= cea_sample_sizes[i + 1];
220                 break;
221
222         case AUDIO_CODING_TYPE_AC3:
223         case AUDIO_CODING_TYPE_MPEG1:
224         case AUDIO_CODING_TYPE_MP3:
225         case AUDIO_CODING_TYPE_MPEG2:
226         case AUDIO_CODING_TYPE_AACLC:
227         case AUDIO_CODING_TYPE_DTS:
228         case AUDIO_CODING_TYPE_ATRAC:
229                 a->max_bitrate = GRAB_BITS(buf, 2, 0, 8);
230                 a->max_bitrate *= 8000;
231                 break;
232
233         case AUDIO_CODING_TYPE_SACD:
234                 break;
235
236         case AUDIO_CODING_TYPE_EAC3:
237                 break;
238
239         case AUDIO_CODING_TYPE_DTS_HD:
240                 break;
241
242         case AUDIO_CODING_TYPE_MLP:
243                 break;
244
245         case AUDIO_CODING_TYPE_DST:
246                 break;
247
248         case AUDIO_CODING_TYPE_WMAPRO:
249                 a->profile = GRAB_BITS(buf, 2, 0, 3);
250                 break;
251
252         case AUDIO_CODING_TYPE_REF_CXT:
253                 a->format = GRAB_BITS(buf, 2, 3, 5);
254                 if (a->format == AUDIO_CODING_XTYPE_HE_REF_CT ||
255                     a->format >= AUDIO_CODING_XTYPE_FIRST_RESERVED) {
256                         snd_printd(KERN_INFO
257                                 "HDMI: audio coding xtype %d not expected\n",
258                                 a->format);
259                         a->format = 0;
260                 } else
261                         a->format += AUDIO_CODING_TYPE_HE_AAC -
262                                      AUDIO_CODING_XTYPE_HE_AAC;
263                 break;
264         }
265 }
266
267 /*
268  * Be careful, ELD buf could be totally rubbish!
269  */
270 static int hdmi_update_eld(struct hdmi_eld *e,
271                            const unsigned char *buf, int size)
272 {
273         int mnl;
274         int i;
275
276         e->eld_ver = GRAB_BITS(buf, 0, 3, 5);
277         if (e->eld_ver != ELD_VER_CEA_861D &&
278             e->eld_ver != ELD_VER_PARTIAL) {
279                 snd_printd(KERN_INFO "HDMI: Unknown ELD version %d\n",
280                                                                 e->eld_ver);
281                 goto out_fail;
282         }
283
284         e->eld_size = size;
285         e->baseline_len = GRAB_BITS(buf, 2, 0, 8);
286         mnl             = GRAB_BITS(buf, 4, 0, 5);
287         e->cea_edid_ver = GRAB_BITS(buf, 4, 5, 3);
288
289         e->support_hdcp = GRAB_BITS(buf, 5, 0, 1);
290         e->support_ai   = GRAB_BITS(buf, 5, 1, 1);
291         e->conn_type    = GRAB_BITS(buf, 5, 2, 2);
292         e->sad_count    = GRAB_BITS(buf, 5, 4, 4);
293
294         e->aud_synch_delay = GRAB_BITS(buf, 6, 0, 8) * 2;
295         e->spk_alloc    = GRAB_BITS(buf, 7, 0, 7);
296
297         e->port_id        = get_unaligned_le64(buf + 8);
298
299         /* not specified, but the spec's tendency is little endian */
300         e->manufacture_id = get_unaligned_le16(buf + 16);
301         e->product_id     = get_unaligned_le16(buf + 18);
302
303         if (mnl > ELD_MAX_MNL) {
304                 snd_printd(KERN_INFO "HDMI: MNL is reserved value %d\n", mnl);
305                 goto out_fail;
306         } else if (ELD_FIXED_BYTES + mnl > size) {
307                 snd_printd(KERN_INFO "HDMI: out of range MNL %d\n", mnl);
308                 goto out_fail;
309         } else
310                 strlcpy(e->monitor_name, buf + ELD_FIXED_BYTES, mnl);
311
312         for (i = 0; i < e->sad_count; i++) {
313                 if (ELD_FIXED_BYTES + mnl + 3 * (i + 1) > size) {
314                         snd_printd(KERN_INFO "HDMI: out of range SAD %d\n", i);
315                         goto out_fail;
316                 }
317                 hdmi_update_short_audio_desc(e->sad + i,
318                                         buf + ELD_FIXED_BYTES + mnl + 3 * i);
319         }
320
321         return 0;
322
323 out_fail:
324         e->eld_ver = 0;
325         return -EINVAL;
326 }
327
328 static int hdmi_present_sense(struct hda_codec *codec, hda_nid_t nid)
329 {
330         return snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0);
331 }
332
333 static int hdmi_eld_valid(struct hda_codec *codec, hda_nid_t nid)
334 {
335         int eldv;
336         int present;
337
338         present = hdmi_present_sense(codec, nid);
339         eldv    = (present & AC_PINSENSE_ELDV);
340         present = (present & AC_PINSENSE_PRESENCE);
341
342 #ifdef CONFIG_SND_DEBUG_VERBOSE
343         printk(KERN_INFO "HDMI: sink_present = %d, eld_valid = %d\n",
344                         !!present, !!eldv);
345 #endif
346
347         return eldv && present;
348 }
349
350 int snd_hdmi_get_eld_size(struct hda_codec *codec, hda_nid_t nid)
351 {
352         return snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_HDMI_DIP_SIZE,
353                                                  AC_DIPSIZE_ELD_BUF);
354 }
355
356 int snd_hdmi_get_eld(struct hdmi_eld *eld,
357                      struct hda_codec *codec, hda_nid_t nid)
358 {
359         int i;
360         int ret;
361         int size;
362         unsigned char *buf;
363
364         if (!hdmi_eld_valid(codec, nid))
365                 return -ENOENT;
366
367         size = snd_hdmi_get_eld_size(codec, nid);
368         if (size == 0) {
369                 /* wfg: workaround for ASUS P5E-VM HDMI board */
370                 snd_printd(KERN_INFO "HDMI: ELD buf size is 0, force 128\n");
371                 size = 128;
372         }
373         if (size < ELD_FIXED_BYTES || size > PAGE_SIZE) {
374                 snd_printd(KERN_INFO "HDMI: invalid ELD buf size %d\n", size);
375                 return -ERANGE;
376         }
377
378         buf = kmalloc(size, GFP_KERNEL);
379         if (!buf)
380                 return -ENOMEM;
381
382         for (i = 0; i < size; i++)
383                 buf[i] = hdmi_get_eld_byte(codec, nid, i);
384
385         ret = hdmi_update_eld(eld, buf, size);
386
387         kfree(buf);
388         return ret;
389 }
390
391 static void hdmi_show_short_audio_desc(struct cea_sad *a)
392 {
393         char buf[SND_PRINT_RATES_ADVISED_BUFSIZE];
394         char buf2[8 + SND_PRINT_BITS_ADVISED_BUFSIZE] = ", bits =";
395
396         if (!a->format)
397                 return;
398
399         snd_print_pcm_rates(a->rates, buf, sizeof(buf));
400
401         if (a->format == AUDIO_CODING_TYPE_LPCM)
402                 snd_print_pcm_bits(a->sample_bits, buf2 + 8, sizeof(buf2 - 8));
403         else if (a->max_bitrate)
404                 snprintf(buf2, sizeof(buf2),
405                                 ", max bitrate = %d", a->max_bitrate);
406         else
407                 buf2[0] = '\0';
408
409         printk(KERN_INFO "HDMI: supports coding type %s:"
410                         " channels = %d, rates =%s%s\n",
411                         cea_audio_coding_type_names[a->format],
412                         a->channels,
413                         buf,
414                         buf2);
415 }
416
417 void snd_print_channel_allocation(int spk_alloc, char *buf, int buflen)
418 {
419         int i, j;
420
421         for (i = 0, j = 0; i < ARRAY_SIZE(cea_speaker_allocation_names); i++) {
422                 if (spk_alloc & (1 << i))
423                         j += snprintf(buf + j, buflen - j,  " %s",
424                                         cea_speaker_allocation_names[i]);
425         }
426         buf[j] = '\0';  /* necessary when j == 0 */
427 }
428
429 void snd_hdmi_show_eld(struct hdmi_eld *e)
430 {
431         int i;
432
433         printk(KERN_INFO "HDMI: detected monitor %s at connection type %s\n",
434                         e->monitor_name,
435                         eld_connection_type_names[e->conn_type]);
436
437         if (e->spk_alloc) {
438                 char buf[SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE];
439                 snd_print_channel_allocation(e->spk_alloc, buf, sizeof(buf));
440                 printk(KERN_INFO "HDMI: available speakers:%s\n", buf);
441         }
442
443         for (i = 0; i < e->sad_count; i++)
444                 hdmi_show_short_audio_desc(e->sad + i);
445 }
446
447 #ifdef CONFIG_PROC_FS
448
449 static void hdmi_print_sad_info(int i, struct cea_sad *a,
450                                 struct snd_info_buffer *buffer)
451 {
452         char buf[SND_PRINT_RATES_ADVISED_BUFSIZE];
453
454         snd_iprintf(buffer, "sad%d_coding_type\t[0x%x] %s\n",
455                         i, a->format, cea_audio_coding_type_names[a->format]);
456         snd_iprintf(buffer, "sad%d_channels\t\t%d\n", i, a->channels);
457
458         snd_print_pcm_rates(a->rates, buf, sizeof(buf));
459         snd_iprintf(buffer, "sad%d_rates\t\t[0x%x]%s\n", i, a->rates, buf);
460
461         if (a->format == AUDIO_CODING_TYPE_LPCM) {
462                 snd_print_pcm_bits(a->sample_bits, buf, sizeof(buf));
463                 snd_iprintf(buffer, "sad%d_bits\t\t[0x%x]%s\n",
464                                                         i, a->sample_bits, buf);
465         }
466
467         if (a->max_bitrate)
468                 snd_iprintf(buffer, "sad%d_max_bitrate\t%d\n",
469                                                         i, a->max_bitrate);
470
471         if (a->profile)
472                 snd_iprintf(buffer, "sad%d_profile\t\t%d\n", i, a->profile);
473 }
474
475 static void hdmi_print_eld_info(struct snd_info_entry *entry,
476                                 struct snd_info_buffer *buffer)
477 {
478         struct hdmi_eld *e = entry->private_data;
479         char buf[SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE];
480         int i;
481
482         snd_iprintf(buffer, "monitor_name\t\t%s\n", e->monitor_name);
483         snd_iprintf(buffer, "connection_type\t\t%s\n",
484                                 eld_connection_type_names[e->conn_type]);
485         snd_iprintf(buffer, "eld_version\t\t[0x%x] %s\n", e->eld_ver,
486                                         eld_versoin_names[e->eld_ver]);
487         snd_iprintf(buffer, "edid_version\t\t[0x%x] %s\n", e->cea_edid_ver,
488                                 cea_edid_version_names[e->cea_edid_ver]);
489         snd_iprintf(buffer, "manufacture_id\t\t0x%x\n", e->manufacture_id);
490         snd_iprintf(buffer, "product_id\t\t0x%x\n", e->product_id);
491         snd_iprintf(buffer, "port_id\t\t\t0x%llx\n", (long long)e->port_id);
492         snd_iprintf(buffer, "support_hdcp\t\t%d\n", e->support_hdcp);
493         snd_iprintf(buffer, "support_ai\t\t%d\n", e->support_ai);
494         snd_iprintf(buffer, "audio_sync_delay\t%d\n", e->aud_synch_delay);
495
496         snd_print_channel_allocation(e->spk_alloc, buf, sizeof(buf));
497         snd_iprintf(buffer, "speakers\t\t[0x%x]%s\n", e->spk_alloc, buf);
498
499         snd_iprintf(buffer, "sad_count\t\t%d\n", e->sad_count);
500
501         for (i = 0; i < e->sad_count; i++)
502                 hdmi_print_sad_info(i, e->sad + i, buffer);
503 }
504
505 static void hdmi_write_eld_item(struct snd_info_entry *entry,
506                                 struct snd_info_buffer *buffer)
507 {
508         struct hdmi_eld *e = entry->private_data;
509         char line[64];
510         char name[64];
511         char *sname;
512         long long val;
513         int n;
514
515         while (!snd_info_get_line(buffer, line, sizeof(line))) {
516                 if (sscanf(line, "%s %llx", name, &val) != 2)
517                         continue;
518                 if (!strcmp(name, "connection_type"))
519                         e->conn_type = val;
520                 else if (!strcmp(name, "port_id"))
521                         e->port_id = val;
522                 else if (!strcmp(name, "support_hdcp"))
523                         e->support_hdcp = val;
524                 else if (!strcmp(name, "support_ai"))
525                         e->support_ai = val;
526                 else if (!strcmp(name, "audio_sync_delay"))
527                         e->aud_synch_delay = val;
528                 else if (!strcmp(name, "speakers"))
529                         e->spk_alloc = val;
530                 else if (!strcmp(name, "sad_count"))
531                         e->sad_count = val;
532                 else if (!strncmp(name, "sad", 3)) {
533                         sname = name + 4;
534                         n = name[3] - '0';
535                         if (name[4] >= '0' && name[4] <= '9') {
536                                 sname++;
537                                 n = 10 * n + name[4] - '0';
538                         }
539                         if (n < 0 || n > 31) /* double the CEA limit */
540                                 continue;
541                         if (!strcmp(sname, "_coding_type"))
542                                 e->sad[n].format = val;
543                         else if (!strcmp(sname, "_channels"))
544                                 e->sad[n].channels = val;
545                         else if (!strcmp(sname, "_rates"))
546                                 e->sad[n].rates = val;
547                         else if (!strcmp(sname, "_bits"))
548                                 e->sad[n].sample_bits = val;
549                         else if (!strcmp(sname, "_max_bitrate"))
550                                 e->sad[n].max_bitrate = val;
551                         if (n >= e->sad_count)
552                                 e->sad_count = n + 1;
553                 }
554         }
555 }
556
557
558 int snd_hda_eld_proc_new(struct hda_codec *codec, struct hdmi_eld *eld)
559 {
560         char name[32];
561         struct snd_info_entry *entry;
562         int err;
563
564         snprintf(name, sizeof(name), "eld#%d", codec->addr);
565         err = snd_card_proc_new(codec->bus->card, name, &entry);
566         if (err < 0)
567                 return err;
568
569         snd_info_set_text_ops(entry, eld, hdmi_print_eld_info);
570         entry->c.text.write = hdmi_write_eld_item;
571         entry->mode |= S_IWUSR;
572         eld->proc_entry = entry;
573
574         return 0;
575 }
576
577 void snd_hda_eld_proc_free(struct hda_codec *codec, struct hdmi_eld *eld)
578 {
579         if (!codec->bus->shutdown && eld->proc_entry) {
580                 snd_device_free(codec->bus->card, eld->proc_entry);
581                 eld->proc_entry = NULL;
582         }
583 }
584
585 #endif /* CONFIG_PROC_FS */