Bug 46713

Summary: HDMI audio played back at a wrong rate
Product: DRI Reporter: Tvrtko Ursulin <tvrtko.ursulin>
Component: DRM/RadeonAssignee: Default DRI bug account <dri-devel>
Status: NEW --- QA Contact:
Severity: normal    
Priority: medium CC: deathsimple, teg
Version: unspecified   
Hardware: x86-64 (AMD64)   
OS: Linux (All)   
Whiteboard:
i915 platform: i915 features:
Attachments:
Description Flags
"avivotool regs hdmi" output while audio was playing
none
drm/radeon/kms/audio: read correct regs on Evergreen
none
avivotool register dump while 44100 sample was playing
none
avivotool register dump under fglrx
none
avivotool register dump under fglrx with non-existant LVDS output turned off none

Description Tvrtko Ursulin 2012-02-28 03:13:42 UTC
I am experiencing audio being played back at roughly 28665Hz instead of expected 44100Hz. This rate is derived for timing for how long it takes to play sample of a known size. Pitch of audio being played is obviously comical.

Hardware:
AMD G-T56N (Radeon HD 6310) box connected to the monitor via native HDMI connector.

This is with kernel.org 3.3.0-rc4 kernel.

Only thing I see in kernel log with apparent relevance is this:
[   56.086500] HDMI hot plug event: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   56.086526] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   56.086545] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   56.086561] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   56.127063] HDMI hot plug event: Codec=0 Pin=3 Presence_Detect=0 ELD_Valid=1
[   56.127090] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   56.127109] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   56.127125] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   56.387045] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   56.387069] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   56.387086] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   56.699469] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   56.699494] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   56.699510] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   56.990752] HDMI hot plug event: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   56.990777] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   56.990795] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   56.990811] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   57.001054] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   57.001079] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   57.001095] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   57.302064] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   57.302092] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   57.302108] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   57.420102] HDMI hot plug event: Codec=0 Pin=3 Presence_Detect=0 ELD_Valid=1
[   57.420130] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   57.420149] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   57.420165] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   57.437447] HDMI hot plug event: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   57.437471] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   57.437489] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   57.437505] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   57.493091] HDMI hot plug event: Codec=0 Pin=3 Presence_Detect=0 ELD_Valid=1
[   57.493117] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   57.493136] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   57.493152] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   57.618528] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   57.618552] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   57.618568] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   57.919028] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   57.919059] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   57.919075] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   58.220081] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   58.220115] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   58.220131] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   58.521039] HDMI status: Codec=0 Pin=3 Presence_Detect=1 ELD_Valid=1
[   58.521071] ALSA sound/pci/hda/hda_eld.c:337 HDMI: ELD buf size is 0, force 128
[   58.521087] ALSA sound/pci/hda/hda_eld.c:356 HDMI: invalid ELD data byte 0
[   63.136948] hda-intel: IRQ timing workaround is activated for card #0. Suggest a bigger bdl_pos_adj.

While playing back hw_info looks fine:

aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: Generic [HD-Audio Generic], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: SB [HDA ATI SB], device 0: ALC883 Analog [ALC883 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: SB [HDA ATI SB], device 1: ALC883 Digital [ALC883 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

cat /proc/asound/card0/pcm3p/sub0/hw_params 
access: RW_INTERLEAVED
format: S16_LE
subformat: STD
channels: 2
rate: 44100 (44100/1)
period_size: 5504
buffer_size: 22016


Not sure what other info should I provide?
Comment 1 Rafał Miłecki 2012-02-28 03:41:41 UTC
Hi Tvrtko,

Can you install rateontool (avivotool) from git master, and provide output from it?

Installation:
git clone git://people.freedesktop.org/~airlied/radeontool
cd radeontool
./autogen.sh && make && sudo make install

Grabbing regs dump:
[start playing your audio over HDMI]
avivotool regs hdmi

You can easily save output to the file by using
avivotool regs hdmi > dump.txt

Please provide requested dump.
Comment 2 Tvrtko Ursulin 2012-02-28 04:16:05 UTC
Created attachment 57759 [details]
"avivotool regs hdmi" output while audio was playing
Comment 3 Tom Gundersen 2012-02-28 05:30:28 UTC
I have experienced a possibly similar issue, I could only reproduce it in the following scenario, so maybe this can be another data point:

A DVI output and a HDMI output are connected to the same graphics card. If their resolutions are different the pitch is wrong (the more different the resolutions the more wrong it is). However, if I unplug the DVI before booting the machine, or set the HDMI to the same resolution as the DVI the audio is fine.

I don't have the setup at the moment to verify that we are seeing the same bug, in which case I apologise for the noise.
Comment 4 Tvrtko Ursulin 2012-02-28 05:33:12 UTC
It's not that in my case since the motherboard I am using doesn't even have DVI. It has VGA and HDMI, with only HDMI connected.
Comment 5 Tvrtko Ursulin 2012-02-28 08:00:21 UTC
Monitor is Dell 2408WFP in case it matters.
Comment 6 Rafał Miłecki 2012-03-08 02:10:48 UTC
00007d04	02000000 (33554432)
This register is 0x7c30 + R600_HDMI_IEC60958_1. AFAWK value 0x02000000 means 48000 rate. I've to understand how driver handles rates.
Comment 7 Tvrtko Ursulin 2012-03-08 02:19:26 UTC
Just to clarify, it is possible I was playing back at 48kHz when collecting the register dump. I was trying both 44.1kHz and 48kHz, the latter just to make sure my monitor is not mishandling the former, but in both cases heard and observed playback rate was wrong.
Comment 8 Rafał Miłecki 2012-03-08 13:27:29 UTC
Created attachment 58209 [details] [review]
drm/radeon/kms/audio: read correct regs on Evergreen

I guess this patch can fix the issue.

My problem is that I still don't know how much Evergreen is different from older cards. I still can't take a decision if it's worth splitting HDMI/audio code into R600 vs. Evergreen or not...
Comment 9 Tvrtko Ursulin 2012-03-09 01:18:51 UTC
Created attachment 58223 [details]
avivotool register dump while 44100 sample was playing

Unfortunately playback rate is still wrong. I made another register dump while I was playing a 44100Hz wave file directly to the HDMI device. This file is 2m49s long, while playing it over HDMI takes 4m20s. Which gives us the same apparent 28665Hz playback rate as originally observed.
Comment 10 Rafał Miłecki 2012-03-09 01:27:16 UTC
Ahh, sorry, I didn't understand your first problem description you posted in this bug report. I though the playback speed is alright, just the sampling rate used is incorrect.

The problem most probably lays in audio clocks. Values used by radeon seem to be:
EVERGREEN_AUDIO_PLL1_MUL	00075300
EVERGREEN_AUDIO_PLL1_DIV	00177fa0
EVERGREEN_AUDIO_PLL1_UNK	00000071

Do you have fglrx installed? Is this possible for you to switch to the fglrx for a moment and do similar dump (using avivotool) while playing audio with it?
To make debugging quicker: can you also dump "avivotool regsrange 0x500 0x600" just in case fglrx uses some other registers?
Comment 11 Rafał Miłecki 2012-03-09 01:29:31 UTC
(In reply to comment #5)
> Monitor is Dell 2408WFP in case it matters.

Are you using 1900x1200 resolution? Can you try some smaller one? Does it help?
Comment 12 Tvrtko Ursulin 2012-03-09 01:50:36 UTC
(In reply to comment #11)
> (In reply to comment #5)
> > Monitor is Dell 2408WFP in case it matters.
> 
> Are you using 1900x1200 resolution? Can you try some smaller one? Does it help?

It changes the error:

1920x1200: 4m20s = 1.53x too slow
1280x1024: 3m2s = 1.07x too slow
1024x768: 1m49s = 1.55x too fast
800x600: 1m7s = 2.52x too fast

Sound also comes with various distortions in each test.

Is this enough of a hint on what is going wrong or you would still like me to test with fglrx? It may take some time to set it up since I have no experience with it.
Comment 13 Rafał Miłecki 2012-03-09 03:04:03 UTC
I'm afraid I can not do anything without dump from fglrx :( There are 4 clocks related registers we are aware of, but I don't know how else we can try to program them. There may be also some other clock registers. I'm afraid only dump from fglrx can give us some hints and I can't get that info from my card, since it's working pretty well.
Comment 14 Tvrtko Ursulin 2012-03-12 04:27:51 UTC
Created attachment 58306 [details]
avivotool register dump under fglrx

I've managed to get fglrx running and initially playback speed was fine but audio quite distorted (hard to describe). I've noticed in the output a mention of 1024x768 output resolution on the LVDS connector which was unexpected, since the motherboard in question only has HDMI and VGA outputs. I disabled LVDS with xranrd and then audio was perfect. I will attach that register dump as well.
Comment 15 Tvrtko Ursulin 2012-03-12 04:28:27 UTC
Created attachment 58307 [details]
avivotool register dump under fglrx with non-existant LVDS output turned off
Comment 16 Rafał Miłecki 2012-03-13 12:04:19 UTC
Tvrtko: thanks a lot for your effort and dumps coming from fglrx.

What I can say now: it seems fglrx is using the same registers (EVERGREEN_AUDIO_PLL1_MUL and EVERGREEN_AUDIO_PLL1_DIV) for your card.

However:
1) radeon uses 480'000 for MUL
2) fglrx uses 960'000 for MUL

On the other hand fglrx uses 0x72 instead of 0x71 for EVERGREEN_AUDIO_PLL1_UNK. Maybe that 0x2 is some DIV? Maybe it tells GPU to take 960'000 and divide it by 2?

I've to investigate meaning of the register, but you gave me a track to follow, thanks a lot for your effors! I'll take a look on that after my vacations (next week).
Comment 17 Rafał Miłecki 2012-03-13 12:05:38 UTC
If you wish, you can try switching to radeon and:
1) Start playback
2) Make sure speed is still wrong
3) Execute: "avivotool regset 0x05b0 0x000ea600"
4) Execute: "avivotool regset 0x05bc 0x00000072"

Does it help?
Comment 18 Christian König 2012-03-14 08:09:27 UTC
Ok, I will try to get you the documentation for the PLL regs, they are not DRM or IP related. So there is a slightly chance that we can release them.

Christian.
Comment 19 Tvrtko Ursulin 2012-03-20 08:57:42 UTC
(In reply to comment #17)
> If you wish, you can try switching to radeon and:
> 1) Start playback
> 2) Make sure speed is still wrong
> 3) Execute: "avivotool regset 0x05b0 0x000ea600"
> 4) Execute: "avivotool regset 0x05bc 0x00000072"
> 
> Does it help?

Unfortunately not. First line speeds it up (way to much) and the second one brings it down into too slow territory again.
Comment 20 Vincenzov 2012-03-23 10:36:52 UTC
Hi, i have same problem hdmi audio slow. Radeon 5450.
But dual screen hdmi+crt 1920 x 1080 audio works fine.
Comment 21 Vincenzov 2012-03-23 11:00:19 UTC
ok
1280x720 radeon 5450 works

avivotool regset 0x05b0 0x00138800

works good
Comment 22 Vincenzov 2012-03-23 11:24:09 UTC
vincenzo@AthlonII-260:~$ sudo avivotool regset 0x05b0 0x00138800
OLD: 0x05b0 (05b0)      0x00075300 (480000)
NEW: 0x05b0 (05b0)      0x00138800 (1280000)

work only 1280x720

slow with 1920 x 1080
Comment 23 Vincenzov 2012-03-23 11:50:50 UTC
sudo avivotool regset 0x05b0 0x00271000


works good whit 1920 x 1080
Comment 24 Alex Deucher 2012-04-04 08:50:44 UTC
Please see:
http://lists.freedesktop.org/archives/dri-devel/2012-March/020717.html
http://lists.freedesktop.org/archives/dri-devel/2012-March/020855.html
http://lists.freedesktop.org/archives/dri-devel/2012-March/020857.html
http://people.freedesktop.org/~agd5f/0001-WIP-port-of-hdmi-dp-audio-code-to-newer-kernel.patch

As per the comments in the last patch:

+	/* Express [24MHz / target pixel clock] as an exact rational
+	 * number (coefficient of two integer numbers.  DCCG_AUDIO_DTOx_PHASE
+	 * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator
+	 */
Comment 25 Vincenzov 2012-04-07 09:51:19 UTC
Hi
i can't patch a kernel 3.4.0-rc1
i can't patch a kernel 3.3.0
:-(
error radeon display
Comment 26 Vincenzov 2012-04-07 11:16:54 UTC
Error when compiling.
Comment 27 Vincenzov 2012-06-03 09:24:50 UTC
hi , i have compiled kernel 3.5-rc1 but radeon 5450 audio slow.
Comment 28 Vincenzov 2012-06-09 08:11:05 UTC
kernel 3.5.0-rc2 audio workgood.
i have 2 monitor hdmi, after I changed the initial resolution of the monitor works fine 2.
example

1 monitor 1920 x 1080 works
2 monitor 1920 x 1080 works.

after i turn off monitor 1, audio monitor 2 slow.
configure monitor 2 and after all audio works good 1 & 2.
Comment 29 Christian König 2012-06-09 08:33:50 UTC
Yeah, the audio rate is controlled by the last output changed.

We should switch to another output if the output driving the audio signal is turned off.

It's on the todo list.
Comment 30 Vincenzov 2012-06-09 08:38:39 UTC
thanks Christian König and Rafał Miłecki for this work.
Sorry my english is bad, i speak only italian :-).
Comment 31 Tvrtko Ursulin 2012-08-24 13:46:28 UTC
Just testing with 3.6.0-rc3+ from today's GIT and I can reproduce some sort of sound corruption depending on the video output resolution.

For example, 1360x768 and audio plays fine, while 1366x768 and it is bad.

avivotool register dump says this is the difference between good and bad setup:

-EVERGREEN_AUDIO_PLL1_DIV       000d0bd8
+EVERGREEN_AUDIO_PLL1_DIV       000d1ae2