[Nouveau] Only stereo sound with gtx570 over hdmi (regression)
Ben Skeggs
skeggsb at gmail.com
Mon Feb 16 15:47:49 PST 2015
On Mon, Feb 16, 2015 at 5:03 AM, Farid BENAMROUCHE <fariouche at yahoo.fr> wrote:
> Hello all,
>
> I'm using gentoo, with kernel 3.17.0-p1-pf and at some point, a patch was included in this branch of the gentoo kernel that broke hdmi audio.
>
> I've checked with the latest 3.19 vanilla kernel, and I still have the same problem. I cannot output multichannel sound over hdmi.
>
> After some investigations, I've narrowed down the issue to the following lines in the file nv50_display.c:
>
> (the structure slightly changed and declared "packed". Reverting this change made the multichannel audio back)
> I still do not known exactly when this modification was introoduced. If you need more details, please let me know.
There were bugs in the implementation for a while that could've caused
this problem. However, those should be fixed already by 3.19. What
kernel version is your revert against? It's not the latest code,
because that uses drm_eld_size().
Testing on my TV at home (3.19.0-rc5), I see this in /proc/asound/card1/eld#0.0:
monitor_present 1
eld_valid 1
monitor_name SAMSUNG
connection_type HDMI
eld_version [0x2] CEA-861D or below
edid_version [0x3] CEA-861-B, C or D
manufacture_id 0x2d4c
product_id 0x69b
port_id 0x0
support_hdcp 0
support_ai 1
audio_sync_delay 0
speakers [0xf] FL/FR LFE FC RL/RR
sad_count 4
sad0_coding_type [0x1] LPCM
sad0_channels 2
sad0_rates [0x6e0] 32000 44100 48000 88200 96000
sad0_bits [0xe0000] 16 20 24
sad1_coding_type [0x1] LPCM
sad1_channels 6
sad1_rates [0x6e0] 32000 44100 48000 88200 96000
sad1_bits [0xe0000] 16 20 24
sad2_coding_type [0x2] AC-3
sad2_channels 6
sad2_rates [0xe0] 32000 44100 48000
sad2_max_bitrate 640000
sad3_coding_type [0x7] DTS
sad3_channels 6
sad3_rates [0xe0] 32000 44100 48000
sad3_max_bitrate 1536000
Which looks correct, and like the code you mention is doing the right thing.
Thanks,
Ben.
>
> --- working_kernel/drivers/gpu/drm/nouveau/nv50_display.c
> +++ not_working_kernel/drivers/gpu/drm/nouveau/nv50_display.c
> @@ -1653,15 +1653,17 @@
> struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
> struct nouveau_connector *nv_connector;
> struct nv50_disp *disp = nv50_disp(encoder->dev);
> - struct {
> - struct nv50_disp_mthd_v1 base;
> - struct nv50_disp_sor_hda_eld_v0 eld;
> + struct __packed {
> + struct {
> + struct nv50_disp_mthd_v1 mthd;
> + struct nv50_disp_sor_hda_eld_v0 eld;
> + } base;
> u8 data[sizeof(nv_connector->base.eld)];
> } args = {
> - .base.version = 1,
> - .base.method = NV50_DISP_MTHD_V1_SOR_HDA_ELD,
> - .base.hasht = nv_encoder->dcb->hasht,
> - .base.hashm = nv_encoder->dcb->hashm,
> + .base.mthd.version = 1,
> + .base.mthd.method = NV50_DISP_MTHD_V1_SOR_HDA_ELD,
> + .base.mthd.hasht = nv_encoder->dcb->hasht,
> + .base.mthd.hashm = nv_encoder->dcb->hashm,
> };
>
> nv_connector = nouveau_encoder_connector_get(nv_encoder);
> @@ -1671,7 +1673,7 @@
> drm_edid_to_eld(&nv_connector->base, nv_connector->edid);
> memcpy(args.data, nv_connector->base.eld, sizeof(args.data));
>
> - nvif_mthd(disp->disp, 0, &args, sizeof(args));
> + nvif_mthd(disp->disp, 0, &args, sizeof(args.base) + args.data[2] * 4);
> }
>
> static void
>
>
> _______________________________________________
> Nouveau mailing list
> Nouveau at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/nouveau
More information about the Nouveau
mailing list