drm/nouveau/gr/gf100-: virtualise r4060a8 + apply fixes from traces
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)
Also fixes some GPUs where we write too many registers.

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/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

index a4865f7b9071f6183ace445422880fc947fd1a6b..aededb2b9ad3e59b8c0befc53cc7842449c9c1d5 100644 (file)
@@ -1083,7 +1083,9 @@ void
 gf100_grctx_generate_r4060a8(struct gf100_gr *gr)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
-       u8  tpcnr[GPC_MAX], data[TPC_MAX];
+       const u8 gpcmax = nvkm_rd32(device, 0x022430);
+       const u8 tpcmax = nvkm_rd32(device, 0x022434) * gpcmax;
+       u8 tpcnr[GPC_MAX], data[TPC_MAX];
        int gpc, tpc, i;
 
        memcpy(tpcnr, gr->tpc_nr, sizeof(gr->tpc_nr));
@@ -1098,7 +1100,7 @@ gf100_grctx_generate_r4060a8(struct gf100_gr *gr)
                data[tpc] = gpc;
        }
 
-       for (i = 0; i < 4; i++)
+       for (i = 0; i < DIV_ROUND_UP(tpcmax, 4); i++)
                nvkm_wr32(device, 0x4060a8 + (i * 4), ((u32 *)data)[i]);
 }
 
@@ -1236,6 +1238,9 @@ gf100_grctx_generate_floorsweep(struct gf100_gr *gr)
                nvkm_wr32(device, 0x406028 + (i * 4), data);
                nvkm_wr32(device, 0x405870 + (i * 4), data);
        }
+
+       if (func->r4060a8)
+               func->r4060a8(gr);
 }
 
 void
@@ -1267,7 +1272,6 @@ gf100_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        grctx->unkn(gr);
 
        gf100_grctx_generate_floorsweep(gr);
-       gf100_grctx_generate_r4060a8(gr);
        gf100_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
 
@@ -1419,4 +1423,5 @@ gf100_grctx = {
        .attrib_nr = 0x218,
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
+       .r4060a8 = gf100_grctx_generate_r4060a8,
 };
index b9e287985e67a5a0ece77f0c55636b139b9cfed3..8430d8229a2b85c1c22b1e95acaf6d1d1cc30202 100644 (file)
@@ -53,6 +53,7 @@ struct gf100_grctx_func {
        /* floorsweeping */
        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 *);
 };
 
 extern const struct gf100_grctx_func gf100_grctx;
@@ -63,11 +64,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_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);
+void gf100_grctx_generate_r4060a8(struct gf100_gr *);
 
 extern const struct gf100_grctx_func gf108_grctx;
 void gf108_grctx_generate_attrib(struct gf100_grctx *);
index 19cc84e7d7e6503bed26ef1c06f2845900778c35..471fa9e83324776421740fe20253e011014dcd29 100644 (file)
@@ -98,4 +98,5 @@ gf104_grctx = {
        .attrib_nr = 0x218,
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
+       .r4060a8 = gf100_grctx_generate_r4060a8,
 };
index 370373111a3972121ad3ec9aa63ad03ac4eb82fb..b472a3e8a589d3e9225a272213f902b7260ef116 100644 (file)
@@ -796,4 +796,5 @@ gf108_grctx = {
        .alpha_nr = 0x218,
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
+       .r4060a8 = gf100_grctx_generate_r4060a8,
 };
index 6d72ae035917457025d903bfc6e163605515bf22..12a98f67b5c52cf9bd60c8f3ce07df8a7170f14a 100644 (file)
@@ -349,4 +349,5 @@ gf110_grctx = {
        .attrib_nr = 0x218,
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
+       .r4060a8 = gf100_grctx_generate_r4060a8,
 };
index a091485426b08382e05009f42698b97588080d33..5c4d6d92a68461d4c787eb963bb7c1ed166c0218 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_r4060a8(gr);
        gk104_grctx_generate_r418bb8(gr);
        gf100_grctx_generate_r406800(gr);
 
@@ -276,4 +275,5 @@ gf117_grctx = {
        .alpha_nr = 0x324,
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
+       .r4060a8 = gf100_grctx_generate_r4060a8,
 };
index 784ab94ba26712b556ab515d969fc70ac0202d8a..cbf6c6a69403c2592f87822198dbd02d62ea06ca 100644 (file)
@@ -519,4 +519,5 @@ gf119_grctx = {
        .alpha_nr = 0x218,
        .sm_id = gf100_grctx_generate_sm_id,
        .tpc_nr = gf100_grctx_generate_tpc_nr,
+       .r4060a8 = gf100_grctx_generate_r4060a8,
 };