[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