[PATCH 3/7] nouveau/gsp: fix HDMI GCP AVMute register offsets on GB20x
Mohamed Ahmed <[email protected]>
| Newsgroups | org.freedesktop.lists.dri-devel,org.freedesktop.lists.nouveau,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
r535_sor_hdmi_audio() brackets audio enablement with a General Control Packet AVMute toggle written through the legacy GCP unit at 0x6f00c0/0x6f00cc. On GB20x the SF packet units were compacted and the old generic and audio-infoframe units are gone and the GCP unit moved from slot 3 to slot 1 (control 0x6f0040 and subpack 0x6f004c from NVIDIA's published clc971.h. The same offsets are also used by OpenRM's hdmiWriteGeneralCtrlPacketC871() on these chips). The old addresses are reserved on GB20x, so the AVMute writes were silent no-ops and mitigated only by the equivalent GCP this function already sends through the SET_OD_PACKET RM control. Add a GB20x variant of the audio function using the new offsets, keeping the direct MMIO path in sync with the hardware as on earlier chips. Signed-off-by: Mohamed Ahmed <[email protected]> --- .../drm/nouveau/nvkm/subdev/gsp/rm/r535/disp.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/disp.c b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/disp.c index 96febd01da78..f51ad7c754d8 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/disp.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/disp.c @@ -559,6 +559,21 @@ r535_sor_hdmi_audio(struct nvkm_ior *sor, int head, bool enable) nvkm_mask(device, 0x6f00c0 + hdmi, 0x00000001, 0x00000001); } +static void +gb202_sor_hdmi_audio(struct nvkm_ior *sor, int head, bool enable) +{ + struct nvkm_device *device = sor->disp->engine.subdev.device; + const u32 hdmi = head * 0x400; + + r535_sor_hdmi_ctrl_audio(sor->asy.outp, enable); + r535_sor_hdmi_ctrl_audio_mute(sor->asy.outp, !enable); + + /* General Control (GCP): the unit moved to slot 1 on NVD5.0. */ + nvkm_mask(device, 0x6f0040 + hdmi, 0x00000001, 0x00000000); + nvkm_wr32(device, 0x6f004c + hdmi, !enable ? 0x00000001 : 0x00000010); + nvkm_mask(device, 0x6f0040 + hdmi, 0x00000001, 0x00000001); +} + static void r535_sor_hdmi_ctrl(struct nvkm_ior *sor, int head, bool enable, u8 max_ac_packet, u8 rekey) { @@ -595,7 +610,7 @@ gb202_sor_hdmi = { /* The legacy AVI unit is unchanged on GB20x. */ .infoframe_avi = gv100_sor_hdmi_infoframe_avi, .infoframe_vsi = gb202_sor_hdmi_infoframe_vsi, - .audio = r535_sor_hdmi_audio, + .audio = gb202_sor_hdmi_audio, .frl_train = r535_sor_frl_train, }; -- 2.55.0