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 450059996b95db1e22f13e911a17aa02a9b617aa..14e6bf07535ab3f32bda169d40019a01f9db59c4 100644 (file)
@@ -1079,28 +1079,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)
 {
@@ -1230,6 +1208,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)
 {
@@ -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 94612ca3704395a05d47eca92b60be5cdec45ffa..6fa9b629367b9681a7b18b6d2017872ff13b9eec 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 54fd74e9cca0b0dec87019b3287100b7c2d954a7..19cc84e7d7e6503bed26ef1c06f2845900778c35 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 82f71b10c06ec3ed84b92b333327f18a11a6222d..370373111a3972121ad3ec9aa63ad03ac4eb82fb 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 7df398b53f8f6f3d670f632ff628042bc5791efc..6d72ae035917457025d903bfc6e163605515bf22 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 19301d88577dc502c7b408a3c6346b163ab9226d..806102a54a0c4a2f3ead6c0f84ba7941ebda31aa 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 605185b078be915cfb5e0daf92843a6da96cc6dc..784ab94ba26712b556ab515d969fc70ac0202d8a 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 da019c4904ba0b770ca65bd65f2b4e4408cabec6..2be72fd58b1c568cd23487d2d863de156511c745 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 3ad98cd8d53144096b729e1bec5169dd139181ac..5013fc5c9399f534c5ea747252039f19be572531 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 47a4a071a7123bfe467725aac9f0adec87af3562..1dd574232c63a9c7b13dceabfa3b97d771c70e1e 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 ba04c86b54a25043af1bfc01f60f8e0ddd9309c2..214f4dad98d615abc18a51848b6b6477bd80c62d 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 da7c35a6a3d20dadc5766860197801c887541303..faa5f18a1da5c24aab0dfb68595888dfa6c97f2e 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 9b43d4ce3eaa30334daa45a1610361d181157b82..e5c0273e03740d5a18bf58ab88b20c7fe038a374 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 db209d33f48648e307be0d3c5fa3e6e156c62fbf..be5e25ab43611af173b468887d0c895ad4bcce13 100644 (file)
  * PGRAPH context implementation
  ******************************************************************************/
 
-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)
 {
@@ -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 e5702e3e0a5aa1f97c75576d77530085d55256b6..363d198dda60c6a780f626f2a489428d92cf644b 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 88ea322d956c4e5bc8c1fe98ff520a4838d6d667..ac8618f849a554f727054b5907b70b8ea34b6f80 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 7a66b4c2eb1880162260c3980d543a02426ffea1..a267abc2976b2dd9fb5018b78d8ac62cbaf8336d 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 8da91a0b3bd2d35bdc6480365b2f121bf9aea702..77345b202fbb50311a1ac7e0875b05a0f827da07 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 ac4c0d8478fa539ddad11e56c8d76a26fb99a0b7..b9519fa5bbcaff297ede5581bfbbac6aed789046 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 9ed51dc851dfe6c8bd7331ef78d8b3c326066b19..ad352ee8143c920212d7c83bf19cad8402600a05 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];