[PATCH 2/7] nouveau/gsp: fix HDMI vendor infoframes on GB20x
Mohamed Ahmed <[email protected]>
| Newsgroups | org.freedesktop.lists.nouveau,org.freedesktop.lists.dri-devel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
The GSP path reuses the GV100 direct-MMIO infoframe writers on every chip. On GB20x that is only half right as while the legacy SF AVI unit is unchanged, the legacy VSI unit at 0x6f0100 was removed, so gv100_sor_hdmi_infoframe_vsi() writes into a reserved area and no vendor infoframe ever reaches the wire. This affects HDMI-VIC signalling which can impact some 4K modes for legacy HDMI 1.4 sinks. Select the SOR functions per GPU family in r535_sor_new(), keyed on the display root class from the RM GPU table and use the new generic-infoframe VSI writer on GB20x. Everything else stays on the r535 table. Signed-off-by: Mohamed Ahmed <[email protected]> --- .../nouveau/nvkm/subdev/gsp/rm/r535/disp.c | 29 ++++++++++++++++++- 1 file changed, 28 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 1155f079b0c3..96febd01da78 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 @@ -36,6 +36,8 @@ #include <rm/gpu.h> +#include <nvif/class.h> + #include <nvhw/drf.h> #include "nvrm/disp.h" @@ -587,6 +589,16 @@ r535_sor_hdmi = { .audio = r535_sor_hdmi_audio, }; +static const struct nvkm_ior_func_hdmi +gb202_sor_hdmi = { + .ctrl = r535_sor_hdmi_ctrl, + /* 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, + .frl_train = r535_sor_frl_train, +}; + static const struct nvkm_ior_func r535_sor = { .hdmi = &r535_sor_hdmi, @@ -595,10 +607,25 @@ r535_sor = { .bl = &r535_sor_bl, }; +static const struct nvkm_ior_func +gb202_sor = { + .hdmi = &gb202_sor_hdmi, + .dp = &r535_sor_dp, + .hda = &r535_sor_hda, + .bl = &r535_sor_bl, +}; + static int r535_sor_new(struct nvkm_disp *disp, int id) { - return nvkm_ior_new_(&r535_sor, disp, SOR, id, true/*XXX: hda cap*/); + const struct nvkm_rm_gpu *gpu = disp->engine.subdev.device->gsp->rm->gpu; + const struct nvkm_ior_func *func = &r535_sor; + + /* NVD5.0 (GB20x and later) reorganised the SF HDMI packet units. */ + if (gpu->disp.class.root >= GB202_DISP) + func = &gb202_sor; + + return nvkm_ior_new_(func, disp, SOR, id, true/*XXX: hda cap*/); } static int -- 2.55.0