[alsa-devel] hda: sink info in case of AMD Radeon GPU card (no ELD?)

Rafał Miłecki zajec5 at gmail.com
Wed Apr 17 14:08:00 CEST 2013

2013/1/19 Rafał Miłecki <zajec5 at gmail.com>:
> Hello,
> I'm interested in polishing HDMI audio support for Radeon cards and I
> hope to get some help here. One of the current problems is that hda
> has no information about TV audio capabilities. It results in a well
> known:
> ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
> ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
> It's expected, as radeon (GPU driver) doesn't pass ELD struct anywhere
> to the GPU and it's not done automatically neither.
> Unfortunately it doesn't seem to be trivial to solve. You may be
> familiar with other GPUs like Nvidia or Intel, where it's done in a
> pretty simple way, for example:
>> for (i = 0; i < len; i++)
>>       I915_WRITE(hdmiw_hdmiedid, *((uint32_t *)eld + i));
> but it can't be handled that way on Radeon cards.
> If you take a look at evergreend.h [0] you can see we can't simply
> write ELD to the GPU buffer, but we have to fill specific registers
> which look more like SADs (Short Audio Descriptors).
> My question is how to handle this on the alsa side. We can't just read
> ELD, we probably have to read some registers from the audio card. Is
> something like that implemented anywhere else? Did anyone started
> working on it? Anyone interested in it?
> [0] http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=drivers/gpu/drm/radeon/evergreend.h;hb=HEAD

I tried hacking this sink info problem again. I've installed "fglrx"
on my AMD Radeon HD 6970M (BARTS == DCE5) and verified it sets SAD
5f84        7f077f07
5f88        00500705
5f8c        00000001
5f90        00000001
5f94        00000001
5f98        00000001
5f9c        00c01e05
5fa0        00000001
5fa4        00000001
5fa8        00000607
5fac        00017e07
5fb0        00007e07
5fb4        00000001
5fb8        00000001

Reading ELD of course doesn't work (that's why we get warning in
dmesg) and I did some manual confirmation with hda-verb (reading ELD
$ sudo ./hda-verb /dev/snd/hwC1D0 3 0xf2e 0x8
nid = 0x3, verb = 0xf2e, param = 0x8
value = 0x0

Plus (just for sure) reading first byte of ELD (in case length is
always zero, but data is available):
$ sudo ./hda-verb /dev/snd/hwC1D0 3 0xf2f 0 | grep val
value = 0x0
$ sudo ./hda-verb /dev/snd/hwC1D0 3 0xf2f 1 | grep val
value = 0x0
$ sudo ./hda-verb /dev/snd/hwC1D0 3 0xf2f 2 | grep val
value = 0x0

So it seems ELD is really not available in this configuration. I
thought about vendor specific verbs. Maybe values from the GPU
registers are just copied to the audio? I've tried reading every
possible vendor specific verb with the attached script (verbs.php).

Unfortunately any verb didn't return anything interesting :(
> grep value verbs.txt | sort | uniq -c
9336832 value = 0x0
  18432 value = 0x1
   6144 value = 0x40
   2048 value = 0x415f
  55296 value = 0x86
   2048 value = 0xa6
  16384 value = 0xb6

Does anyone have any idea how we can/should read that values from GPU
in the audio driver? :| I guess the must be copied somewhere, but
can't find the correct place.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: verbs.php
Type: application/x-httpd-php
Size: 252 bytes
Desc: not available
URL: <http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20130417/9862c11f/attachment.bin>

More information about the Alsa-devel mailing list