Farid BENAMROUCHE
2015-Feb-15 19:03 UTC
[Nouveau] Only stereo sound with gtx570 over hdmi (regression)
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. --- 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
Ben Skeggs
2015-Feb-16 23:47 UTC
[Nouveau] Only stereo sound with gtx570 over hdmi (regression)
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
Farid BENAMROUCHE
2015-Feb-17 13:41 UTC
[Nouveau] Only stereo sound with gtx570 over hdmi (regression)
Hello Ben, The working kernel code I based my investigation was a 1.3.17 + gentoo patch (so yes, pretty old) The new one below, not working is the vanilla 3.19 (from the gentoo repo, should be identical to the latest 3.19 stable) I've narrowed down the issue to the size of the eld. The new patch (that indeed uses drm_eld_size) (with this patch, I have a working 3.19 kernel): I will need to restart my computer with the non working kernel to check the eld output (by the way, what is the ELD?, is it the EDID?) Thanks --- drivers/gpu/drm/nouveau/nv50_display.c.orig 2015-02-15 20:04:10.583860698 +0100 +++ drivers/gpu/drm/nouveau/nv50_display.c 2015-02-15 20:46:43.518148777 +0100 @@ -1700,7 +1700,7 @@ memcpy(args.data, nv_connector->base.eld, sizeof(args.data)); nvif_mthd(disp->disp, 0, &args, - sizeof(args.base) + drm_eld_size(args.data)); + sizeof(args.base)); } static void -------------------------------------------- En date de : Mar 17.2.15, Ben Skeggs <skeggsb at gmail.com> a écrit : Objet: Re: [Nouveau] Only stereo sound with gtx570 over hdmi (regression) À: "Farid BENAMROUCHE" <fariouche at yahoo.fr> Cc: "nouveau at lists.freedesktop.org" <nouveau at lists.freedesktop.org> Date: Mardi 17 février 2015, 0h47 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
Seemingly Similar Threads
- Only stereo sound with gtx570 over hdmi (regression)
- Only stereo sound with gtx570 over hdmi (regression)
- [PATCH 2/2] drm/edid: fix Baseline_ELD_Len field in drm_edid_to_eld()
- [PATCH v2] disp/nvd0-: allow 540MHz data rate for nvd0+ devices
- [PATCH] drm/nouveau: Don't forget to label dp_aux devices