On Sat, 2026-08-15 at 03:57 +0400, Mohamed Ahmed wrote:
> 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,
> +};
> +
This is the right approach, but I think this might make more sense to
move into drivers/gpu/drm/nouveau/nvkm/subdev/gsp/gb202.c and then
reference it back here.
> 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.