On Fri, 23 Jun 2023 at 01:20, Karol Herbst <kherbst@xxxxxxxxxx> 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@xxxxxxxxxx> > > v2: drop code for gm200 and newer. > > Cc: Ben Skeggs <bskeggs@xxxxxxxxxx> > Cc: David Airlie <airlied@xxxxxxxxx> > Cc: nouveau@xxxxxxxxxxxxxxxxxxxxx > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Karol Herbst <kherbst@xxxxxxxxxx> > --- > 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 >