@@ -673,29 +673,33 @@ nv50_audio_component_fini(struct nouveau_drm *drm)
673673/******************************************************************************
674674 * Audio
675675 *****************************************************************************/
676+ static bool
677+ nv50_audio_supported (struct drm_encoder * encoder )
678+ {
679+ struct nv50_disp * disp = nv50_disp (encoder -> dev );
680+
681+ if (disp -> disp -> object .oclass <= GT200_DISP ||
682+ disp -> disp -> object .oclass == GT206_DISP )
683+ return false;
684+
685+ return true;
686+ }
687+
676688static void
677689nv50_audio_disable (struct drm_encoder * encoder , struct nouveau_crtc * nv_crtc )
678690{
679691 struct nouveau_drm * drm = nouveau_drm (encoder -> dev );
680692 struct nouveau_encoder * nv_encoder = nouveau_encoder (encoder );
681- struct nv50_disp * disp = nv50_disp (encoder -> dev );
682693 struct nvif_outp * outp = & nv_encoder -> outp ;
683- struct {
684- struct nv50_disp_mthd_v1 base ;
685- struct nv50_disp_sor_hda_eld_v0 eld ;
686- } args = {
687- .base .version = 1 ,
688- .base .method = NV50_DISP_MTHD_V1_SOR_HDA_ELD ,
689- .base .hasht = nv_encoder -> dcb -> hasht ,
690- .base .hashm = (0xf0ff & nv_encoder -> dcb -> hashm ) |
691- (0x0100 << nv_crtc -> index ),
692- };
694+
695+ if (!nv50_audio_supported (encoder ))
696+ return ;
693697
694698 mutex_lock (& drm -> audio .lock );
695699 if (nv_encoder -> audio .enabled ) {
696700 nv_encoder -> audio .enabled = false;
697701 nv_encoder -> audio .connector = NULL ;
698- nvif_mthd ( & disp -> disp -> object , 0 , & args , sizeof ( args ) );
702+ nvif_outp_hda_eld ( & nv_encoder -> outp , nv_crtc -> index , NULL , 0 );
699703 }
700704 mutex_unlock (& drm -> audio .lock );
701705
@@ -709,31 +713,15 @@ nv50_audio_enable(struct drm_encoder *encoder, struct nouveau_crtc *nv_crtc,
709713{
710714 struct nouveau_drm * drm = nouveau_drm (encoder -> dev );
711715 struct nouveau_encoder * nv_encoder = nouveau_encoder (encoder );
712- struct nv50_disp * disp = nv50_disp (encoder -> dev );
713716 struct nvif_outp * outp = & nv_encoder -> outp ;
714- struct __packed {
715- struct {
716- struct nv50_disp_mthd_v1 mthd ;
717- struct nv50_disp_sor_hda_eld_v0 eld ;
718- } base ;
719- u8 data [sizeof (nv_connector -> base .eld )];
720- } args = {
721- .base .mthd .version = 1 ,
722- .base .mthd .method = NV50_DISP_MTHD_V1_SOR_HDA_ELD ,
723- .base .mthd .hasht = nv_encoder -> dcb -> hasht ,
724- .base .mthd .hashm = (0xf0ff & nv_encoder -> dcb -> hashm ) |
725- (0x0100 << nv_crtc -> index ),
726- };
727717
728- if (!drm_detect_monitor_audio (nv_connector -> edid ))
718+ if (!nv50_audio_supported ( encoder ) || ! drm_detect_monitor_audio (nv_connector -> edid ))
729719 return ;
730720
731721 mutex_lock (& drm -> audio .lock );
732722
733- memcpy (args .data , nv_connector -> base .eld , sizeof (args .data ));
734-
735- nvif_mthd (& disp -> disp -> object , 0 , & args ,
736- sizeof (args .base ) + drm_eld_size (args .data ));
723+ nvif_outp_hda_eld (& nv_encoder -> outp , nv_crtc -> index , nv_connector -> base .eld ,
724+ drm_eld_size (nv_connector -> base .eld ));
737725 nv_encoder -> audio .enabled = true;
738726 nv_encoder -> audio .connector = & nv_connector -> base ;
739727
0 commit comments