drm/nouveau/gr/gp100-: fix attrib cb setup
authorBen Skeggs <bskeggs@redhat.com>
Tue, 8 May 2018 10:39:47 +0000 (20:39 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 18 May 2018 05:01:26 +0000 (15:01 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h
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/ctxgp104.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 1c06c675f09e9b1023fbd093854b6c3f7f928864..9ce3d0075573562bc64ff31ee97220a76afdbab4 100644 (file)
@@ -49,6 +49,7 @@ struct gf100_grctx_func {
        u32 attrib_nr;
        u32 alpha_nr_max;
        u32 alpha_nr;
+       u32 gfxp_nr;
        /* other patch buffer stuff */
        void (*patch_ltc)(struct gf100_grctx *);
        /* floorsweeping */
index c51e3a27af144b2ad0ad6abc6f7a72417396eee7..0b3326262e123fe4c54b9e79d9a1e61039207f30 100644 (file)
@@ -48,14 +48,17 @@ gp100_grctx_generate_attrib(struct gf100_grctx *info)
        const struct gf100_grctx_func *grctx = gr->func->grctx;
        const u32  alpha = grctx->alpha_nr;
        const u32 attrib = grctx->attrib_nr;
-       const u32 pertpc = 0x20 * (grctx->attrib_nr_max + grctx->alpha_nr_max);
-       const u32   size = roundup(gr->tpc_total * pertpc, 0x80);
        const int s = 12;
-       const int b = mmio_vram(info, size, (1 << s), false);
        const int max_batches = 0xffff;
+       u32 size = grctx->alpha_nr_max * gr->tpc_total;
        u32 ao = 0;
-       u32 bo = ao + grctx->alpha_nr_max * gr->tpc_total;
-       int gpc, ppc, n = 0;
+       u32 bo = ao + size;
+       int gpc, ppc, b, n = 0;
+
+       for (gpc = 0; gpc < gr->gpc_nr; gpc++)
+               size += grctx->attrib_nr_max * gr->ppc_nr[gpc] * gr->ppc_tpc_max;
+       size = ((size * 0x20) + 128) & ~127;
+       b = mmio_vram(info, size, (1 << s), false);
 
        mmio_refn(info, 0x418810, 0x80000000, s, b);
        mmio_refn(info, 0x419848, 0x10000000, s, b);
@@ -69,7 +72,7 @@ gp100_grctx_generate_attrib(struct gf100_grctx *info)
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
                for (ppc = 0; ppc < gr->ppc_nr[gpc]; ppc++, n++) {
                        const u32 as =  alpha * gr->ppc_tpc_nr[gpc][ppc];
-                       const u32 bs = attrib * gr->ppc_tpc_nr[gpc][ppc];
+                       const u32 bs = attrib * gr->ppc_tpc_max;
                        const u32 u = 0x418ea0 + (n * 0x04);
                        const u32 o = PPC_UNIT(gpc, ppc, 0);
                        if (!(gr->ppc_mask[gpc] & (1 << ppc)))
@@ -77,7 +80,7 @@ gp100_grctx_generate_attrib(struct gf100_grctx *info)
                        mmio_wr32(info, o + 0xc0, bs);
                        mmio_wr32(info, o + 0xf4, bo);
                        mmio_wr32(info, o + 0xf0, bs);
-                       bo += grctx->attrib_nr_max * gr->ppc_tpc_nr[gpc][ppc];
+                       bo += grctx->attrib_nr_max * gr->ppc_tpc_max;
                        mmio_wr32(info, o + 0xe4, as);
                        mmio_wr32(info, o + 0xf8, ao);
                        ao += grctx->alpha_nr_max * gr->ppc_tpc_nr[gpc][ppc];
index 8a438c2efc3e6ea5f2792dd5a24f06dd5aa36ebe..daee17bf7d0dfd7a3b2f44ed1f1bdb712b858846 100644 (file)
@@ -43,14 +43,18 @@ gp102_grctx_generate_attrib(struct gf100_grctx *info)
        const struct gf100_grctx_func *grctx = gr->func->grctx;
        const u32  alpha = grctx->alpha_nr;
        const u32 attrib = grctx->attrib_nr;
-       const u32 pertpc = 0x20 * (grctx->attrib_nr_max + grctx->alpha_nr_max);
-       const u32   size = roundup(gr->tpc_total * pertpc, 0x80);
+       const u32   gfxp = grctx->gfxp_nr;
        const int s = 12;
-       const int b = mmio_vram(info, size, (1 << s), false);
        const int max_batches = 0xffff;
+       u32 size = grctx->alpha_nr_max * gr->tpc_total;
        u32 ao = 0;
-       u32 bo = ao + grctx->alpha_nr_max * gr->tpc_total;
-       int gpc, ppc, n = 0;
+       u32 bo = ao + size;
+       int gpc, ppc, b, n = 0;
+
+       for (gpc = 0; gpc < gr->gpc_nr; gpc++)
+               size += grctx->gfxp_nr * gr->ppc_nr[gpc] * gr->ppc_tpc_max;
+       size = ((size * 0x20) + 128) & ~127;
+       b = mmio_vram(info, size, (1 << s), false);
 
        mmio_refn(info, 0x418810, 0x80000000, s, b);
        mmio_refn(info, 0x419848, 0x10000000, s, b);
@@ -64,17 +68,18 @@ gp102_grctx_generate_attrib(struct gf100_grctx *info)
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
                for (ppc = 0; ppc < gr->ppc_nr[gpc]; ppc++, n++) {
                        const u32 as =  alpha * gr->ppc_tpc_nr[gpc][ppc];
-                       const u32 bs = attrib * gr->ppc_tpc_nr[gpc][ppc];
+                       const u32 bs = attrib * gr->ppc_tpc_max;
+                       const u32 gs =   gfxp * gr->ppc_tpc_max;
                        const u32 u = 0x418ea0 + (n * 0x04);
                        const u32 o = PPC_UNIT(gpc, ppc, 0);
                        const u32 p = GPC_UNIT(gpc, 0xc44 + (ppc * 4));
                        if (!(gr->ppc_mask[gpc] & (1 << ppc)))
                                continue;
-                       mmio_wr32(info, o + 0xc0, bs);
+                       mmio_wr32(info, o + 0xc0, gs);
                        mmio_wr32(info, p, bs);
                        mmio_wr32(info, o + 0xf4, bo);
                        mmio_wr32(info, o + 0xf0, bs);
-                       bo += grctx->attrib_nr_max * gr->ppc_tpc_nr[gpc][ppc];
+                       bo += gs;
                        mmio_wr32(info, o + 0xe4, as);
                        mmio_wr32(info, o + 0xf8, ao);
                        ao += grctx->alpha_nr_max * gr->ppc_tpc_nr[gpc][ppc];
@@ -97,10 +102,11 @@ gp102_grctx = {
        .pagepool = gp100_grctx_generate_pagepool,
        .pagepool_size = 0x20000,
        .attrib = gp102_grctx_generate_attrib,
-       .attrib_nr_max = 0x5d4,
+       .attrib_nr_max = 0x4b0,
        .attrib_nr = 0x320,
        .alpha_nr_max = 0xc00,
        .alpha_nr = 0x800,
+       .gfxp_nr = 0xba8,
        .sm_id = gm107_grctx_generate_sm_id,
        .rop_mapping = gf117_grctx_generate_rop_mapping,
        .dist_skip_table = gm200_grctx_generate_dist_skip_table,
index 5f799c7369bbc24623134be8cd28e07c175ed947..3b85e3d326b2530cbf8f95deff4a9303b78a0a80 100644 (file)
@@ -32,10 +32,11 @@ gp104_grctx = {
        .pagepool = gp100_grctx_generate_pagepool,
        .pagepool_size = 0x20000,
        .attrib = gp102_grctx_generate_attrib,
-       .attrib_nr_max = 0x5d4,
+       .attrib_nr_max = 0x4b0,
        .attrib_nr = 0x320,
        .alpha_nr_max = 0xc00,
        .alpha_nr = 0x800,
+       .gfxp_nr = 0xba8,
        .sm_id = gm107_grctx_generate_sm_id,
        .rop_mapping = gf117_grctx_generate_rop_mapping,
        .dist_skip_table = gm200_grctx_generate_dist_skip_table,
index a69e824676c9dd1cf80fcceca0c940a7f61f0006..5060c5ee5ce0467aab67d77b5dd2f171c70d2f8b 100644 (file)
@@ -44,6 +44,7 @@ gp107_grctx = {
        .attrib_nr = 0x540,
        .alpha_nr_max = 0xc00,
        .alpha_nr = 0x800,
+       .gfxp_nr = 0xe94,
        .sm_id = gm107_grctx_generate_sm_id,
        .rop_mapping = gf117_grctx_generate_rop_mapping,
        .dist_skip_table = gm200_grctx_generate_dist_skip_table,
index 69418619dc79c1c996323a8f67242eb78395d68d..084a5d1dcf9c2687059d86995c92504b8c1667d1 100644 (file)
@@ -1780,6 +1780,8 @@ gf100_gr_oneinit(struct nvkm_gr *base)
                        if (gr->ppc_tpc_min == 0 ||
                            gr->ppc_tpc_min > gr->ppc_tpc_nr[i][j])
                                gr->ppc_tpc_min = gr->ppc_tpc_nr[i][j];
+                       if (gr->ppc_tpc_max < gr->ppc_tpc_nr[i][j])
+                               gr->ppc_tpc_max = gr->ppc_tpc_nr[i][j];
                }
        }
 
index 9e608dff28462fb22ff19144721a84a679c1f0df..390bcc16f91f60ca5d5bd5d956bbd14dc8838c6e 100644 (file)
@@ -106,6 +106,7 @@ struct gf100_gr {
        u8 ppc_tpc_mask[GPC_MAX][4];
        u8 ppc_tpc_nr[GPC_MAX][4];
        u8 ppc_tpc_min;
+       u8 ppc_tpc_max;
 
        u8 screen_tile_row_offset;
        u8 tile[TPC_MAX];