drm/nouveau/gr/gf100-: virtualise sm_id/tpc_nr
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)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
20 files changed:
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/ctxgf104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf108.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf110.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf117.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf119.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk110b.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk208.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
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgp102.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgp107.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h

index 4500599..14e6bf0 100644 (file)
@@ -1080,28 +1080,6 @@ gf100_grctx_generate_unkn(struct gf100_gr *gr)
 }
 
 void
-gf100_grctx_generate_tpcid(struct gf100_gr *gr)
-{
-       struct nvkm_device *device = gr->base.engine.subdev.device;
-       int gpc, tpc, id;
-
-       for (tpc = 0, id = 0; tpc < 4; tpc++) {
-               for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
-                       if (tpc < gr->tpc_nr[gpc]) {
-                               nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x698), id);
-                               nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x4e8), id);
-                               nvkm_wr32(device, GPC_UNIT(gpc, 0x0c10 + tpc * 4), id);
-                               nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x088), id);
-                               id++;
-                       }
-
-                       nvkm_wr32(device, GPC_UNIT(gpc, 0x0c08), gr->tpc_nr[gpc]);
-                       nvkm_wr32(device, GPC_UNIT(gpc, 0x0c8c), gr->tpc_nr[gpc]);
-               }
-       }
-}
-
-void
 gf100_grctx_generate_r406028(struct gf100_gr *gr)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
@@ -1231,6 +1209,40 @@ gf100_grctx_generate_r406800(struct gf100_gr *gr)
 }
 
 void
+gf100_grctx_generate_tpc_nr(struct gf100_gr *gr, int gpc)
+{
+       struct nvkm_device *device = gr->base.engine.subdev.device;
+       nvkm_wr32(device, GPC_UNIT(gpc, 0x0c08), gr->tpc_nr[gpc]);
+       nvkm_wr32(device, GPC_UNIT(gpc, 0x0c8c), gr->tpc_nr[gpc]);
+}
+
+void
+gf100_grctx_generate_sm_id(struct gf100_gr *gr, int gpc, int tpc, int sm)
+{
+       struct nvkm_device *device = gr->base.engine.subdev.device;
+       nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x698), sm);
+       nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x4e8), sm);
+       nvkm_wr32(device, GPC_UNIT(gpc, 0x0c10 + tpc * 4), sm);
+       nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x088), sm);
+}
+
+void
+gf100_grctx_generate_floorsweep(struct gf100_gr *gr)
+{
+       const struct gf100_grctx_func *func = gr->func->grctx;
+       int tpc, gpc, sm;
+
+       for (tpc = 0, sm = 0; tpc < gr->tpc_max; tpc++) {
+               for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
+                       if (tpc < gr->tpc_nr[gpc])
+                               func->sm_id(gr, gpc, tpc, sm++);
+                       if (func->tpc_nr)
+                               func->tpc_nr(gr, gpc);
+               }
+       }
+}
+
+void
 gf100_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
@@ -1258,7 +1270,7 @@ gf100_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
                grctx->patch_ltc(info);
        grctx->unkn(gr);
 
-       gf100_grctx_generate_tpcid(gr);
+       gf100_grctx_generate_floorsweep(gr);
        gf100_grctx_generate_r406028(gr);
        gf100_grctx_generate_r4060a8(gr);
        gf100_grctx_generate_r418bb8(gr);
@@ -1410,4 +1422,6 @@ gf100_grctx = {
        .attrib = gf100_grctx_generate_attrib,
        .attrib_nr_max = 0x324,
        .attrib_nr = 0x218,
+       .sm_id = gf100_grctx_generate_sm_id,
+       .tpc_nr = gf100_grctx_generate_tpc_nr,
 };
index 94612ca..6fa9b62 100644 (file)
@@ -50,6 +50,9 @@ struct gf100_grctx_func {
        u32 alpha_nr;
        /* other patch buffer stuff */
        void (*patch_ltc)(struct gf100_grctx *);
+       /* floorsweeping */
+       void (*sm_id)(struct gf100_gr *, int gpc, int tpc, int sm);
+       void (*tpc_nr)(struct gf100_gr *, int gpc);
 };
 
 extern const struct gf100_grctx_func gf100_grctx;
@@ -59,11 +62,13 @@ void gf100_grctx_generate_bundle(struct gf100_grctx *);
 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_tpcid(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 *);
+void gf100_grctx_generate_sm_id(struct gf100_gr *, int, int, int);
+void gf100_grctx_generate_tpc_nr(struct gf100_gr *, int);
 
 extern const struct gf100_grctx_func gf108_grctx;
 void gf108_grctx_generate_attrib(struct gf100_grctx *);
@@ -89,6 +94,7 @@ void gk104_grctx_generate_r418bb8(struct gf100_gr *);
 void gm107_grctx_generate_bundle(struct gf100_grctx *);
 void gm107_grctx_generate_pagepool(struct gf100_grctx *);
 void gm107_grctx_generate_attrib(struct gf100_grctx *);
+void gm107_grctx_generate_sm_id(struct gf100_gr *, int, int, int);
 
 extern const struct gf100_grctx_func gk110_grctx;
 extern const struct gf100_grctx_func gk110b_grctx;
@@ -100,7 +106,6 @@ void gm107_grctx_generate_pagepool(struct gf100_grctx *);
 void gm107_grctx_generate_attrib(struct gf100_grctx *);
 
 extern const struct gf100_grctx_func gm200_grctx;
-void gm200_grctx_generate_tpcid(struct gf100_gr *);
 void gm200_grctx_generate_405b60(struct gf100_gr *);
 
 extern const struct gf100_grctx_func gm20b_grctx;
index 54fd74e..19cc84e 100644 (file)
@@ -96,4 +96,6 @@ gf104_grctx = {
        .attrib = gf100_grctx_generate_attrib,
        .attrib_nr_max = 0x324,
        .attrib_nr = 0x218,
+       .sm_id = gf100_grctx_generate_sm_id,
+       .tpc_nr = gf100_grctx_generate_tpc_nr,
 };
index 82f71b1..3703731 100644 (file)
@@ -794,4 +794,6 @@ gf108_grctx = {
        .attrib_nr = 0x218,
        .alpha_nr_max = 0x324,
        .alpha_nr = 0x218,
+       .sm_id = gf100_grctx_generate_sm_id,
+       .tpc_nr = gf100_grctx_generate_tpc_nr,
 };
index 7df398b..6d72ae0 100644 (file)
@@ -347,4 +347,6 @@ gf110_grctx = {
        .attrib = gf100_grctx_generate_attrib,
        .attrib_nr_max = 0x324,
        .attrib_nr = 0x218,
+       .sm_id = gf100_grctx_generate_sm_id,
+       .tpc_nr = gf100_grctx_generate_tpc_nr,
 };
index 19301d8..806102a 100644 (file)
@@ -240,7 +240,7 @@ gf117_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->attrib(info);
        grctx->unkn(gr);
 
-       gf100_grctx_generate_tpcid(gr);
+       gf100_grctx_generate_floorsweep(gr);
        gf100_grctx_generate_r406028(gr);
        gf100_grctx_generate_r4060a8(gr);
        gk104_grctx_generate_r418bb8(gr);
@@ -275,4 +275,6 @@ gf117_grctx = {
        .attrib_nr = 0x218,
        .alpha_nr_max = 0x7ff,
        .alpha_nr = 0x324,
+       .sm_id = gf100_grctx_generate_sm_id,
+       .tpc_nr = gf100_grctx_generate_tpc_nr,
 };
index 605185b..784ab94 100644 (file)
@@ -517,4 +517,6 @@ gf119_grctx = {
        .attrib_nr = 0x218,
        .alpha_nr_max = 0x324,
        .alpha_nr = 0x218,
+       .sm_id = gf100_grctx_generate_sm_id,
+       .tpc_nr = gf100_grctx_generate_tpc_nr,
 };
index da019c4..2be72fd 100644 (file)
@@ -974,7 +974,7 @@ gk104_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->attrib(info);
        grctx->unkn(gr);
 
-       gf100_grctx_generate_tpcid(gr);
+       gf100_grctx_generate_floorsweep(gr);
        gf100_grctx_generate_r406028(gr);
        gk104_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
@@ -1017,4 +1017,6 @@ gk104_grctx = {
        .alpha_nr_max = 0x7ff,
        .alpha_nr = 0x648,
        .patch_ltc = gk104_grctx_generate_patch_ltc,
+       .sm_id = gf100_grctx_generate_sm_id,
+       .tpc_nr = gf100_grctx_generate_tpc_nr,
 };
index 3ad98cd..5013fc5 100644 (file)
@@ -831,4 +831,6 @@ gk110_grctx = {
        .alpha_nr_max = 0x7ff,
        .alpha_nr = 0x648,
        .patch_ltc = gk104_grctx_generate_patch_ltc,
+       .sm_id = gf100_grctx_generate_sm_id,
+       .tpc_nr = gf100_grctx_generate_tpc_nr,
 };
index 47a4a07..1dd5742 100644 (file)
@@ -92,4 +92,6 @@ gk110b_grctx = {
        .alpha_nr_max = 0x7ff,
        .alpha_nr = 0x648,
        .patch_ltc = gk104_grctx_generate_patch_ltc,
+       .sm_id = gf100_grctx_generate_sm_id,
+       .tpc_nr = gf100_grctx_generate_tpc_nr,
 };
index ba04c86..214f4da 100644 (file)
@@ -553,4 +553,6 @@ gk208_grctx = {
        .alpha_nr_max = 0x7ff,
        .alpha_nr = 0x648,
        .patch_ltc = gk104_grctx_generate_patch_ltc,
+       .sm_id = gf100_grctx_generate_sm_id,
+       .tpc_nr = gf100_grctx_generate_tpc_nr,
 };
index da7c35a..faa5f18 100644 (file)
@@ -42,7 +42,7 @@ gk20a_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 
        grctx->unkn(gr);
 
-       gf100_grctx_generate_tpcid(gr);
+       gf100_grctx_generate_floorsweep(gr);
        gf100_grctx_generate_r406028(gr);
        gk104_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
@@ -82,4 +82,6 @@ gk20a_grctx = {
        .attrib_nr = 0x240,
        .alpha_nr_max = 0x648 + (0x648 / 2),
        .alpha_nr = 0x648,
+       .sm_id = gf100_grctx_generate_sm_id,
+       .tpc_nr = gf100_grctx_generate_tpc_nr,
 };
index 9b43d4c..e5c0273 100644 (file)
@@ -930,25 +930,13 @@ gm107_grctx_generate_attrib(struct gf100_grctx *info)
        }
 }
 
-static void
-gm107_grctx_generate_tpcid(struct gf100_gr *gr)
+void
+gm107_grctx_generate_sm_id(struct gf100_gr *gr, int gpc, int tpc, int sm)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
-       int gpc, tpc, id;
-
-       for (tpc = 0, id = 0; tpc < 4; tpc++) {
-               for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
-                       if (tpc < gr->tpc_nr[gpc]) {
-                               nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x698), id);
-                               nvkm_wr32(device, GPC_UNIT(gpc, 0x0c10 + tpc * 4), id);
-                               nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x088), id);
-                               id++;
-                       }
-
-                       nvkm_wr32(device, GPC_UNIT(gpc, 0x0c08), gr->tpc_nr[gpc]);
-                       nvkm_wr32(device, GPC_UNIT(gpc, 0x0c8c), gr->tpc_nr[gpc]);
-               }
-       }
+       nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x698), sm);
+       nvkm_wr32(device, GPC_UNIT(gpc, 0x0c10 + tpc * 4), sm);
+       nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x088), sm);
 }
 
 static void
@@ -972,7 +960,7 @@ gm107_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->attrib(info);
        grctx->unkn(gr);
 
-       gm107_grctx_generate_tpcid(gr);
+       gf100_grctx_generate_floorsweep(gr);
        gf100_grctx_generate_r406028(gr);
        gk104_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
@@ -1016,4 +1004,6 @@ gm107_grctx = {
        .attrib_nr = 0xaa0,
        .alpha_nr_max = 0x1800,
        .alpha_nr = 0x1000,
+       .sm_id = gm107_grctx_generate_sm_id,
+       .tpc_nr = gf100_grctx_generate_tpc_nr,
 };
index db209d3..be5e25a 100644 (file)
  ******************************************************************************/
 
 void
-gm200_grctx_generate_tpcid(struct gf100_gr *gr)
-{
-       struct nvkm_device *device = gr->base.engine.subdev.device;
-       int gpc, tpc, id;
-
-       for (tpc = 0, id = 0; tpc < TPC_MAX_PER_GPC; tpc++) {
-               for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
-                       if (tpc < gr->tpc_nr[gpc]) {
-                               nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x698), id);
-                               nvkm_wr32(device, GPC_UNIT(gpc, 0x0c10 + tpc * 4), id);
-                               nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x088), id);
-                               id++;
-                       }
-               }
-       }
-}
-
-void
 gm200_grctx_generate_405b60(struct gf100_gr *gr)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
@@ -94,7 +76,7 @@ gm200_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->attrib(info);
        grctx->unkn(gr);
 
-       gm200_grctx_generate_tpcid(gr);
+       gf100_grctx_generate_floorsweep(gr);
        gf100_grctx_generate_r406028(gr);
        gk104_grctx_generate_r418bb8(gr);
 
@@ -133,4 +115,5 @@ gm200_grctx = {
        .attrib_nr = 0x400,
        .alpha_nr_max = 0x1800,
        .alpha_nr = 0x1000,
+       .sm_id = gm107_grctx_generate_sm_id,
 };
index e5702e3..363d198 100644 (file)
@@ -53,7 +53,7 @@ gm20b_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 
        grctx->unkn(gr);
 
-       gm200_grctx_generate_tpcid(gr);
+       gf100_grctx_generate_floorsweep(gr);
        gm20b_grctx_generate_r406028(gr);
        gk104_grctx_generate_r418bb8(gr);
 
@@ -98,4 +98,5 @@ gm20b_grctx = {
        .attrib_nr = 0x400,
        .alpha_nr_max = 0xc00,
        .alpha_nr = 0x800,
+       .sm_id = gm107_grctx_generate_sm_id,
 };
index 88ea322..ac8618f 100644 (file)
@@ -138,7 +138,7 @@ gp100_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->attrib(info);
        grctx->unkn(gr);
 
-       gm200_grctx_generate_tpcid(gr);
+       gf100_grctx_generate_floorsweep(gr);
        gf100_grctx_generate_r406028(gr);
        gk104_grctx_generate_r418bb8(gr);
 
@@ -174,4 +174,5 @@ gp100_grctx = {
        .attrib_nr = 0x440,
        .alpha_nr_max = 0xc00,
        .alpha_nr = 0x800,
+       .sm_id = gm107_grctx_generate_sm_id,
 };
index 7a66b4c..a267abc 100644 (file)
@@ -94,4 +94,5 @@ gp102_grctx = {
        .attrib_nr = 0x320,
        .alpha_nr_max = 0xc00,
        .alpha_nr = 0x800,
+       .sm_id = gm107_grctx_generate_sm_id,
 };
index 8da91a0..77345b2 100644 (file)
@@ -44,4 +44,5 @@ gp107_grctx = {
        .attrib_nr = 0x540,
        .alpha_nr_max = 0xc00,
        .alpha_nr = 0x800,
+       .sm_id = gm107_grctx_generate_sm_id,
 };
index ac4c0d8..b9519fa 100644 (file)
@@ -1675,6 +1675,7 @@ gf100_gr_oneinit(struct nvkm_gr *base)
        gr->gpc_nr = nvkm_rd32(device, 0x409604) & 0x0000001f;
        for (i = 0; i < gr->gpc_nr; i++) {
                gr->tpc_nr[i]  = nvkm_rd32(device, GPC_UNIT(i, 0x2608));
+               gr->tpc_max = max(gr->tpc_max, gr->tpc_nr[i]);
                gr->tpc_total += gr->tpc_nr[i];
                gr->ppc_nr[i]  = gr->func->ppc_nr;
                for (j = 0; j < gr->ppc_nr[i]; j++) {
index 9ed51dc..ad352ee 100644 (file)
@@ -99,6 +99,7 @@ struct gf100_gr {
        u8 rop_nr;
        u8 gpc_nr;
        u8 tpc_nr[GPC_MAX];
+       u8 tpc_max;
        u8 tpc_total;
        u8 ppc_nr[GPC_MAX];
        u8 ppc_mask[GPC_MAX];