drm/nouveau/gr/gf100-: virtualise rop_mapping
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>
18 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

index aededb2b9ad3e59b8c0befc53cc7842449c9c1d5..d35711b24612d875a02c46c6715811e3b702b072 100644 (file)
@@ -1105,7 +1105,7 @@ gf100_grctx_generate_r4060a8(struct gf100_gr *gr)
 }
 
 void
-gf100_grctx_generate_r418bb8(struct gf100_gr *gr)
+gf100_grctx_generate_rop_mapping(struct gf100_gr *gr)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
        u32 data[6] = {}, data2[2] = {};
@@ -1241,6 +1241,8 @@ gf100_grctx_generate_floorsweep(struct gf100_gr *gr)
 
        if (func->r4060a8)
                func->r4060a8(gr);
+
+       func->rop_mapping(gr);
 }
 
 void
@@ -1272,7 +1274,6 @@ gf100_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->unkn(gr);
 
        gf100_grctx_generate_floorsweep(gr);
-       gf100_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
 
        gf100_gr_icmd(gr, grctx->icmd);
@@ -1424,4 +1425,5 @@ gf100_grctx = {
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
        .r4060a8 = gf100_grctx_generate_r4060a8,
+       .rop_mapping = gf100_grctx_generate_rop_mapping,
 };
index 8430d8229a2b85c1c22b1e95acaf6d1d1cc30202..0c0d2a55fd1184ca51195bb2b1724a16ba24745f 100644 (file)
@@ -54,6 +54,7 @@ struct gf100_grctx_func {
        void (*sm_id)(struct gf100_gr *, int gpc, int tpc, int sm);
        void (*tpc_nr)(struct gf100_gr *, int gpc);
        void (*r4060a8)(struct gf100_gr *);
+       void (*rop_mapping)(struct gf100_gr *);
 };
 
 extern const struct gf100_grctx_func gf100_grctx;
@@ -64,11 +65,11 @@ 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_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);
 void gf100_grctx_generate_r4060a8(struct gf100_gr *);
+void gf100_grctx_generate_rop_mapping(struct gf100_gr *);
 
 extern const struct gf100_grctx_func gf108_grctx;
 void gf108_grctx_generate_attrib(struct gf100_grctx *);
@@ -79,6 +80,7 @@ extern const struct gf100_grctx_func gf110_grctx;
 
 extern const struct gf100_grctx_func gf117_grctx;
 void gf117_grctx_generate_attrib(struct gf100_grctx *);
+void gf117_grctx_generate_rop_mapping(struct gf100_gr *);
 
 extern const struct gf100_grctx_func gf119_grctx;
 
@@ -89,7 +91,6 @@ void gk104_grctx_generate_bundle(struct gf100_grctx *);
 void gk104_grctx_generate_pagepool(struct gf100_grctx *);
 void gk104_grctx_generate_patch_ltc(struct gf100_grctx *);
 void gk104_grctx_generate_unkn(struct gf100_gr *);
-void gk104_grctx_generate_r418bb8(struct gf100_gr *);
 
 void gm107_grctx_generate_bundle(struct gf100_grctx *);
 void gm107_grctx_generate_pagepool(struct gf100_grctx *);
index 471fa9e83324776421740fe20253e011014dcd29..eb0d3778d3fed846e0ecd472b92cfde169c2ac83 100644 (file)
@@ -99,4 +99,5 @@ gf104_grctx = {
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
        .r4060a8 = gf100_grctx_generate_r4060a8,
+       .rop_mapping = gf100_grctx_generate_rop_mapping,
 };
index b472a3e8a589d3e9225a272213f902b7260ef116..f218d98a164511a87fc85f1f95cbc3a8473ab11f 100644 (file)
@@ -797,4 +797,5 @@ gf108_grctx = {
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
        .r4060a8 = gf100_grctx_generate_r4060a8,
+       .rop_mapping = gf100_grctx_generate_rop_mapping,
 };
index 12a98f67b5c52cf9bd60c8f3ce07df8a7170f14a..35c163851477f134160f6576078ed086561bd4a2 100644 (file)
@@ -350,4 +350,5 @@ gf110_grctx = {
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
        .r4060a8 = gf100_grctx_generate_r4060a8,
+       .rop_mapping = gf100_grctx_generate_rop_mapping,
 };
index 5c4d6d92a68461d4c787eb963bb7c1ed166c0218..7aaf8a26031fb2a7e45f6e61c83ca2b0084b4392 100644 (file)
@@ -179,6 +179,65 @@ gf117_grctx_pack_ppc[] = {
  * PGRAPH context implementation
  ******************************************************************************/
 
+void
+gf117_grctx_generate_rop_mapping(struct gf100_gr *gr)
+{
+       struct nvkm_device *device = gr->base.engine.subdev.device;
+       u32 data[6] = {}, data2[2] = {};
+       u8  tpcnr[GPC_MAX];
+       u8  shift, ntpcv;
+       int gpc, tpc, i;
+
+       /* calculate first set of magics */
+       memcpy(tpcnr, gr->tpc_nr, sizeof(gr->tpc_nr));
+
+       gpc = -1;
+       for (tpc = 0; tpc < gr->tpc_total; tpc++) {
+               do {
+                       gpc = (gpc + 1) % gr->gpc_nr;
+               } while (!tpcnr[gpc]);
+               tpcnr[gpc]--;
+
+               data[tpc / 6] |= gpc << ((tpc % 6) * 5);
+       }
+
+       for (; tpc < 32; tpc++)
+               data[tpc / 6] |= 7 << ((tpc % 6) * 5);
+
+       /* and the second... */
+       shift = 0;
+       ntpcv = gr->tpc_total;
+       while (!(ntpcv & (1 << 4))) {
+               ntpcv <<= 1;
+               shift++;
+       }
+
+       data2[0]  = (ntpcv << 16);
+       data2[0] |= (shift << 21);
+       data2[0] |= (((1 << (0 + 5)) % ntpcv) << 24);
+       for (i = 1; i < 7; i++)
+               data2[1] |= ((1 << (i + 5)) % ntpcv) << ((i - 1) * 5);
+
+       /* GPC_BROADCAST */
+       nvkm_wr32(device, 0x418bb8, (gr->tpc_total << 8) |
+                                    gr->screen_tile_row_offset);
+       for (i = 0; i < 6; i++)
+               nvkm_wr32(device, 0x418b08 + (i * 4), data[i]);
+
+       /* GPC_BROADCAST.TP_BROADCAST */
+       nvkm_wr32(device, 0x41bfd0, (gr->tpc_total << 8) |
+                                    gr->screen_tile_row_offset | data2[0]);
+       nvkm_wr32(device, 0x41bfe4, data2[1]);
+       for (i = 0; i < 6; i++)
+               nvkm_wr32(device, 0x41bf00 + (i * 4), data[i]);
+
+       /* UNK78xx */
+       nvkm_wr32(device, 0x4078bc, (gr->tpc_total << 8) |
+                                    gr->screen_tile_row_offset);
+       for (i = 0; i < 6; i++)
+               nvkm_wr32(device, 0x40780c + (i * 4), data[i]);
+}
+
 void
 gf117_grctx_generate_attrib(struct gf100_grctx *info)
 {
@@ -241,7 +300,6 @@ gf117_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->unkn(gr);
 
        gf100_grctx_generate_floorsweep(gr);
-       gk104_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
 
        for (i = 0; i < 8; i++)
@@ -276,4 +334,5 @@ gf117_grctx = {
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
        .r4060a8 = gf100_grctx_generate_r4060a8,
+       .rop_mapping = gf117_grctx_generate_rop_mapping,
 };
index cbf6c6a69403c2592f87822198dbd02d62ea06ca..4cd5d8615e0111fce86fcddc5b8b2ec61e3a8247 100644 (file)
@@ -520,4 +520,5 @@ gf119_grctx = {
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
        .r4060a8 = gf100_grctx_generate_r4060a8,
+       .rop_mapping = gf100_grctx_generate_rop_mapping,
 };
index cb6c15686adbee9f0c505cce8520bc9481f980a1..25a5209db5e83d949a144360db139a3656a314c4 100644 (file)
@@ -892,65 +892,6 @@ gk104_grctx_generate_unkn(struct gf100_gr *gr)
        nvkm_mask(device, 0x419c00, 0x00000008, 0x00000008);
 }
 
-void
-gk104_grctx_generate_r418bb8(struct gf100_gr *gr)
-{
-       struct nvkm_device *device = gr->base.engine.subdev.device;
-       u32 data[6] = {}, data2[2] = {};
-       u8  tpcnr[GPC_MAX];
-       u8  shift, ntpcv;
-       int gpc, tpc, i;
-
-       /* calculate first set of magics */
-       memcpy(tpcnr, gr->tpc_nr, sizeof(gr->tpc_nr));
-
-       gpc = -1;
-       for (tpc = 0; tpc < gr->tpc_total; tpc++) {
-               do {
-                       gpc = (gpc + 1) % gr->gpc_nr;
-               } while (!tpcnr[gpc]);
-               tpcnr[gpc]--;
-
-               data[tpc / 6] |= gpc << ((tpc % 6) * 5);
-       }
-
-       for (; tpc < 32; tpc++)
-               data[tpc / 6] |= 7 << ((tpc % 6) * 5);
-
-       /* and the second... */
-       shift = 0;
-       ntpcv = gr->tpc_total;
-       while (!(ntpcv & (1 << 4))) {
-               ntpcv <<= 1;
-               shift++;
-       }
-
-       data2[0]  = (ntpcv << 16);
-       data2[0] |= (shift << 21);
-       data2[0] |= (((1 << (0 + 5)) % ntpcv) << 24);
-       for (i = 1; i < 7; i++)
-               data2[1] |= ((1 << (i + 5)) % ntpcv) << ((i - 1) * 5);
-
-       /* GPC_BROADCAST */
-       nvkm_wr32(device, 0x418bb8, (gr->tpc_total << 8) |
-                                    gr->screen_tile_row_offset);
-       for (i = 0; i < 6; i++)
-               nvkm_wr32(device, 0x418b08 + (i * 4), data[i]);
-
-       /* GPC_BROADCAST.TP_BROADCAST */
-       nvkm_wr32(device, 0x41bfd0, (gr->tpc_total << 8) |
-                                    gr->screen_tile_row_offset | data2[0]);
-       nvkm_wr32(device, 0x41bfe4, data2[1]);
-       for (i = 0; i < 6; i++)
-               nvkm_wr32(device, 0x41bf00 + (i * 4), data[i]);
-
-       /* UNK78xx */
-       nvkm_wr32(device, 0x4078bc, (gr->tpc_total << 8) |
-                                    gr->screen_tile_row_offset);
-       for (i = 0; i < 6; i++)
-               nvkm_wr32(device, 0x40780c + (i * 4), data[i]);
-}
-
 void
 gk104_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 {
@@ -975,7 +916,6 @@ gk104_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->unkn(gr);
 
        gf100_grctx_generate_floorsweep(gr);
-       gk104_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
 
        for (i = 0; i < 8; i++)
@@ -1018,4 +958,5 @@ gk104_grctx = {
        .patch_ltc = gk104_grctx_generate_patch_ltc,
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
+       .rop_mapping = gf117_grctx_generate_rop_mapping,
 };
index 5013fc5c9399f534c5ea747252039f19be572531..038cc47602c6fdd2cf50d249d981d6266313f724 100644 (file)
@@ -833,4 +833,5 @@ gk110_grctx = {
        .patch_ltc = gk104_grctx_generate_patch_ltc,
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
+       .rop_mapping = gf117_grctx_generate_rop_mapping,
 };
index 1dd574232c63a9c7b13dceabfa3b97d771c70e1e..8b025e2c338fafdcd39e29a895044945cac1108c 100644 (file)
@@ -94,4 +94,5 @@ gk110b_grctx = {
        .patch_ltc = gk104_grctx_generate_patch_ltc,
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
+       .rop_mapping = gf117_grctx_generate_rop_mapping,
 };
index 214f4dad98d615abc18a51848b6b6477bd80c62d..9479b404334342b84fa55839e534a58d85afd48e 100644 (file)
@@ -555,4 +555,5 @@ gk208_grctx = {
        .patch_ltc = gk104_grctx_generate_patch_ltc,
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
+       .rop_mapping = gf117_grctx_generate_rop_mapping,
 };
index dda30511677233fd47069ef5626f0ab8f2231f80..23abbfad1bdb2df72ac01c6716353fba654eaf57 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);
-       gk104_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
 
        for (i = 0; i < 8; i++)
@@ -83,4 +82,5 @@ gk20a_grctx = {
        .alpha_nr = 0x648,
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
+       .rop_mapping = gf117_grctx_generate_rop_mapping,
 };
index 77cce9bffd799c380ec115dc1b26399b0cce4bc4..fef6652f471caf89a7b633fb8ddbdec472f2bf64 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);
-       gk104_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
 
        nvkm_wr32(device, 0x4064d0, 0x00000001);
@@ -1005,4 +1004,5 @@ gm107_grctx = {
        .alpha_nr = 0x1000,
        .sm_id = gm107_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
+       .rop_mapping = gf117_grctx_generate_rop_mapping,
 };
index ac6724b61e507e12ddccb1c7bd640e9ab9d39346..cfccd75dbc301bb493af41c4c017fb4322e2534d 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);
-       gk104_grctx_generate_r418bb8(gr);
 
        for (i = 0; i < 8; i++)
                nvkm_wr32(device, 0x4064d0 + (i * 0x04), 0x00000000);
@@ -115,4 +114,5 @@ gm200_grctx = {
        .alpha_nr_max = 0x1800,
        .alpha_nr = 0x1000,
        .sm_id = gm107_grctx_generate_sm_id,
+       .rop_mapping = gf117_grctx_generate_rop_mapping,
 };
index 6420d139157326e1b425e0351d47fd944d983452..3dd4e18d252503d0e1da6f7dacaaacd7a2ad6a63 100644 (file)
@@ -40,7 +40,6 @@ gm20b_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->unkn(gr);
 
        gf100_grctx_generate_floorsweep(gr);
-       gk104_grctx_generate_r418bb8(gr);
 
        for (i = 0; i < 8; i++)
                nvkm_wr32(device, 0x4064d0 + (i * 0x04), 0x00000000);
@@ -84,4 +83,5 @@ gm20b_grctx = {
        .alpha_nr_max = 0xc00,
        .alpha_nr = 0x800,
        .sm_id = gm107_grctx_generate_sm_id,
+       .rop_mapping = gf117_grctx_generate_rop_mapping,
 };
index 701341d8b39ce4680851b25cb057b2d55ac4c044..e09990785cb931108e53715fdf89fbf1ad17db42 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);
-       gk104_grctx_generate_r418bb8(gr);
 
        for (i = 0; i < 8; i++)
                nvkm_wr32(device, 0x4064d0 + (i * 0x04), 0x00000000);
@@ -174,4 +173,5 @@ gp100_grctx = {
        .alpha_nr_max = 0xc00,
        .alpha_nr = 0x800,
        .sm_id = gm107_grctx_generate_sm_id,
+       .rop_mapping = gf117_grctx_generate_rop_mapping,
 };
index a267abc2976b2dd9fb5018b78d8ac62cbaf8336d..553a609c4f98bafa7e74fde7c23a9865be0a0548 100644 (file)
@@ -95,4 +95,5 @@ gp102_grctx = {
        .alpha_nr_max = 0xc00,
        .alpha_nr = 0x800,
        .sm_id = gm107_grctx_generate_sm_id,
+       .rop_mapping = gf117_grctx_generate_rop_mapping,
 };
index 77345b202fbb50311a1ac7e0875b05a0f827da07..db3fff89bc2f17ed53561d1481111e7bfe115b6e 100644 (file)
@@ -45,4 +45,5 @@ gp107_grctx = {
        .alpha_nr_max = 0xc00,
        .alpha_nr = 0x800,
        .sm_id = gm107_grctx_generate_sm_id,
+       .rop_mapping = gf117_grctx_generate_rop_mapping,
 };