[Nouveau] [PATCH v2] drm/nouveau/gr: enable memory loads on helper invocation on all channels

Dave Airlie airlied at gmail.com
Thu Aug 3 02:14:57 UTC 2023


On Fri, 23 Jun 2023 at 01:20, Karol Herbst <kherbst at redhat.com> wrote:
>
> We have a lurking bug where Fragment Shader Helper Invocations can't load
> from memory. But this is actually required in OpenGL and is causing random
> hangs or failures in random shaders.
>
> It is unknown how widespread this issue is, but shaders hitting this can
> end up with infinite loops.
>
> We enable those only on all Kepler and newer GPUs where we use our own
> Firmware.
>
> Nvidia's firmware provides a way to set a kernelspace controlled list of
> mmio registers in the gr space from push buffers via MME macros.

seems sane,

Reviewed-by: Dave Airlie <airlied at redhat.com>
>
> v2: drop code for gm200 and newer.
>
> Cc: Ben Skeggs <bskeggs at redhat.com>
> Cc: David Airlie <airlied at gmail.com>
> Cc: nouveau at lists.freedesktop.org
> Cc: stable at vger.kernel.org
> Signed-off-by: Karol Herbst <kherbst at redhat.com>
> ---
>  drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h  |  1 +
>  drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c  |  4 +++-
>  drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110.c  | 10 ++++++++++
>  drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110b.c |  1 +
>  drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk208.c  |  1 +
>  drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm107.c  |  1 +
>  6 files changed, 17 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h b/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h
> index 00dbeda7e346..de161e7a04aa 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h
> +++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h
> @@ -117,6 +117,7 @@ void gk104_grctx_generate_r418800(struct gf100_gr *);
>
>  extern const struct gf100_grctx_func gk110_grctx;
>  void gk110_grctx_generate_r419eb0(struct gf100_gr *);
> +void gk110_grctx_generate_r419f78(struct gf100_gr *);
>
>  extern const struct gf100_grctx_func gk110b_grctx;
>  extern const struct gf100_grctx_func gk208_grctx;
> diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c
> index 94233d0119df..52a234b1ef01 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c
> +++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c
> @@ -906,7 +906,9 @@ static void
>  gk104_grctx_generate_r419f78(struct gf100_gr *gr)
>  {
>         struct nvkm_device *device = gr->base.engine.subdev.device;
> -       nvkm_mask(device, 0x419f78, 0x00000001, 0x00000000);
> +
> +       /* bit 3 set disables loads in fp helper invocations, we need it enabled */
> +       nvkm_mask(device, 0x419f78, 0x00000009, 0x00000000);
>  }
>
>  void
> diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110.c
> index 4391458e1fb2..3acdd9eeb74a 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110.c
> +++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110.c
> @@ -820,6 +820,15 @@ gk110_grctx_generate_r419eb0(struct gf100_gr *gr)
>         nvkm_mask(device, 0x419eb0, 0x00001000, 0x00001000);
>  }
>
> +void
> +gk110_grctx_generate_r419f78(struct gf100_gr *gr)
> +{
> +       struct nvkm_device *device = gr->base.engine.subdev.device;
> +
> +       /* bit 3 set disables loads in fp helper invocations, we need it enabled */
> +       nvkm_mask(device, 0x419f78, 0x00000008, 0x00000000);
> +}
> +
>  const struct gf100_grctx_func
>  gk110_grctx = {
>         .main  = gf100_grctx_generate_main,
> @@ -854,4 +863,5 @@ gk110_grctx = {
>         .gpc_tpc_nr = gk104_grctx_generate_gpc_tpc_nr,
>         .r418800 = gk104_grctx_generate_r418800,
>         .r419eb0 = gk110_grctx_generate_r419eb0,
> +       .r419f78 = gk110_grctx_generate_r419f78,
>  };
> diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110b.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110b.c
> index 7b9a34f9ec3c..5597e87624ac 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110b.c
> +++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110b.c
> @@ -103,4 +103,5 @@ gk110b_grctx = {
>         .gpc_tpc_nr = gk104_grctx_generate_gpc_tpc_nr,
>         .r418800 = gk104_grctx_generate_r418800,
>         .r419eb0 = gk110_grctx_generate_r419eb0,
> +       .r419f78 = gk110_grctx_generate_r419f78,
>  };
> diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk208.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk208.c
> index c78d07a8bb7d..612656496541 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk208.c
> +++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk208.c
> @@ -568,4 +568,5 @@ gk208_grctx = {
>         .dist_skip_table = gf117_grctx_generate_dist_skip_table,
>         .gpc_tpc_nr = gk104_grctx_generate_gpc_tpc_nr,
>         .r418800 = gk104_grctx_generate_r418800,
> +       .r419f78 = gk110_grctx_generate_r419f78,
>  };
> diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm107.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm107.c
> index beac66eb2a80..9906974ac3f0 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm107.c
> +++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm107.c
> @@ -988,4 +988,5 @@ gm107_grctx = {
>         .r406500 = gm107_grctx_generate_r406500,
>         .gpc_tpc_nr = gk104_grctx_generate_gpc_tpc_nr,
>         .r419e00 = gm107_grctx_generate_r419e00,
> +       .r419f78 = gk110_grctx_generate_r419f78,
>  };
> --
> 2.41.0
>


More information about the Nouveau mailing list