drm/nouveau/gr/gf100-: virtualise tpc_per_gpc
authorBen Skeggs <bskeggs@redhat.com>
Tue, 8 May 2018 10:39:46 +0000 (20:39 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 18 May 2018 05:01:24 +0000 (15:01 +1000)
GM20B now also shares the same code, as NVGPU shows it doesn't need
special treatment.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf117.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk20a.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm107.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm200.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm20b.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgp100.c

index 14e6bf07535ab3f32bda169d40019a01f9db59c4..a4865f7b9071f6183ace445422880fc947fd1a6b 100644 (file)
@@ -1079,19 +1079,6 @@ gf100_grctx_generate_unkn(struct gf100_gr *gr)
 {
 }
 
-void
-gf100_grctx_generate_r406028(struct gf100_gr *gr)
-{
-       struct nvkm_device *device = gr->base.engine.subdev.device;
-       u32 tmp[GPC_MAX / 8] = {}, i = 0;
-       for (i = 0; i < gr->gpc_nr; i++)
-               tmp[i / 8] |= gr->tpc_nr[i] << ((i % 8) * 4);
-       for (i = 0; i < 4; i++) {
-               nvkm_wr32(device, 0x406028 + (i * 4), tmp[i]);
-               nvkm_wr32(device, 0x405870 + (i * 4), tmp[i]);
-       }
-}
-
 void
 gf100_grctx_generate_r4060a8(struct gf100_gr *gr)
 {
@@ -1229,8 +1216,10 @@ gf100_grctx_generate_sm_id(struct gf100_gr *gr, int gpc, int tpc, int sm)
 void
 gf100_grctx_generate_floorsweep(struct gf100_gr *gr)
 {
+       struct nvkm_device *device = gr->base.engine.subdev.device;
        const struct gf100_grctx_func *func = gr->func->grctx;
-       int tpc, gpc, sm;
+       int tpc, gpc, sm, i, j;
+       u32 data;
 
        for (tpc = 0, sm = 0; tpc < gr->tpc_max; tpc++) {
                for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
@@ -1240,6 +1229,13 @@ gf100_grctx_generate_floorsweep(struct gf100_gr *gr)
                                func->tpc_nr(gr, gpc);
                }
        }
+
+       for (gpc = 0, i = 0; i < 4; i++) {
+               for (data = 0, j = 0; j < 8 && gpc < gr->gpc_nr; j++, gpc++)
+                       data |= gr->tpc_nr[gpc] << (j * 4);
+               nvkm_wr32(device, 0x406028 + (i * 4), data);
+               nvkm_wr32(device, 0x405870 + (i * 4), data);
+       }
 }
 
 void
@@ -1271,7 +1267,6 @@ gf100_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->unkn(gr);
 
        gf100_grctx_generate_floorsweep(gr);
-       gf100_grctx_generate_r406028(gr);
        gf100_grctx_generate_r4060a8(gr);
        gf100_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
index 6fa9b629367b9681a7b18b6d2017872ff13b9eec..b9e287985e67a5a0ece77f0c55636b139b9cfed3 100644 (file)
@@ -63,7 +63,6 @@ void gf100_grctx_generate_pagepool(struct gf100_grctx *);
 void gf100_grctx_generate_attrib(struct gf100_grctx *);
 void gf100_grctx_generate_unkn(struct gf100_gr *);
 void gf100_grctx_generate_floorsweep(struct gf100_gr *);
-void gf100_grctx_generate_r406028(struct gf100_gr *);
 void gf100_grctx_generate_r4060a8(struct gf100_gr *);
 void gf100_grctx_generate_r418bb8(struct gf100_gr *);
 void gf100_grctx_generate_r406800(struct gf100_gr *);
index 806102a54a0c4a2f3ead6c0f84ba7941ebda31aa..a091485426b08382e05009f42698b97588080d33 100644 (file)
@@ -241,7 +241,6 @@ gf117_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->unkn(gr);
 
        gf100_grctx_generate_floorsweep(gr);
-       gf100_grctx_generate_r406028(gr);
        gf100_grctx_generate_r4060a8(gr);
        gk104_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
index 2be72fd58b1c568cd23487d2d863de156511c745..cb6c15686adbee9f0c505cce8520bc9481f980a1 100644 (file)
@@ -975,7 +975,6 @@ gk104_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->unkn(gr);
 
        gf100_grctx_generate_floorsweep(gr);
-       gf100_grctx_generate_r406028(gr);
        gk104_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
 
index faa5f18a1da5c24aab0dfb68595888dfa6c97f2e..dda30511677233fd47069ef5626f0ab8f2231f80 100644 (file)
@@ -43,7 +43,6 @@ gk20a_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->unkn(gr);
 
        gf100_grctx_generate_floorsweep(gr);
-       gf100_grctx_generate_r406028(gr);
        gk104_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
 
index e5c0273e03740d5a18bf58ab88b20c7fe038a374..77cce9bffd799c380ec115dc1b26399b0cce4bc4 100644 (file)
@@ -961,7 +961,6 @@ gm107_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->unkn(gr);
 
        gf100_grctx_generate_floorsweep(gr);
-       gf100_grctx_generate_r406028(gr);
        gk104_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
 
index be5e25ab43611af173b468887d0c895ad4bcce13..ac6724b61e507e12ddccb1c7bd640e9ab9d39346 100644 (file)
@@ -77,7 +77,6 @@ gm200_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->unkn(gr);
 
        gf100_grctx_generate_floorsweep(gr);
-       gf100_grctx_generate_r406028(gr);
        gk104_grctx_generate_r418bb8(gr);
 
        for (i = 0; i < 8; i++)
index 363d198dda60c6a780f626f2a489428d92cf644b..6420d139157326e1b425e0351d47fd944d983452 100644 (file)
  */
 #include "ctxgf100.h"
 
-static void
-gm20b_grctx_generate_r406028(struct gf100_gr *gr)
-{
-       struct nvkm_device *device = gr->base.engine.subdev.device;
-       u32 tpc_per_gpc = 0;
-       int i;
-
-       for (i = 0; i < gr->gpc_nr; i++)
-               tpc_per_gpc |= gr->tpc_nr[i] << (4 * i);
-
-       nvkm_wr32(device, 0x406028, tpc_per_gpc);
-       nvkm_wr32(device, 0x405870, tpc_per_gpc);
-}
-
 static void
 gm20b_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 {
@@ -54,7 +40,6 @@ gm20b_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->unkn(gr);
 
        gf100_grctx_generate_floorsweep(gr);
-       gm20b_grctx_generate_r406028(gr);
        gk104_grctx_generate_r418bb8(gr);
 
        for (i = 0; i < 8; i++)
index ac8618f849a554f727054b5907b70b8ea34b6f80..701341d8b39ce4680851b25cb057b2d55ac4c044 100644 (file)
@@ -139,7 +139,6 @@ gp100_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->unkn(gr);
 
        gf100_grctx_generate_floorsweep(gr);
-       gf100_grctx_generate_r406028(gr);
        gk104_grctx_generate_r418bb8(gr);
 
        for (i = 0; i < 8; i++)