drm/nouveau/gr/gp100-: use correct registers for zbc colour/depth 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)
These were missed the first time around due to the driver version I traced
using the older registers still.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
20 files changed:
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf108.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf110.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf117.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf119.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk110b.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk208.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm107.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm200.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gm20b.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp102.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp107.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gp10b.c

index 084a5d1dcf9c2687059d86995c92504b8c1667d1..0cffafb0130f579c3c94ef633b846ee60fe4740a 100644 (file)
@@ -92,7 +92,7 @@ gf100_gr_zbc_color_get(struct gf100_gr *gr, int format,
        memcpy(gr->zbc_color[zbc].l2, l2, sizeof(gr->zbc_color[zbc].l2));
        gr->zbc_color[zbc].format = format;
        nvkm_ltc_zbc_color_get(ltc, zbc, l2);
-       gf100_gr_zbc_clear_color(gr, zbc);
+       gr->func->zbc->clear_color(gr, zbc);
        return zbc;
 }
 
@@ -137,10 +137,16 @@ gf100_gr_zbc_depth_get(struct gf100_gr *gr, int format,
        gr->zbc_depth[zbc].ds = ds;
        gr->zbc_depth[zbc].l2 = l2;
        nvkm_ltc_zbc_depth_get(ltc, zbc, l2);
-       gf100_gr_zbc_clear_depth(gr, zbc);
+       gr->func->zbc->clear_depth(gr, zbc);
        return zbc;
 }
 
+const struct gf100_gr_func_zbc
+gf100_gr_zbc = {
+       .clear_color = gf100_gr_zbc_clear_color,
+       .clear_depth = gf100_gr_zbc_clear_depth,
+};
+
 /*******************************************************************************
  * Graphics object classes
  ******************************************************************************/
@@ -744,21 +750,21 @@ gf100_gr_zbc_init(struct gf100_gr *gr)
        const u32 f32_1[] = { 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000,
                              0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000 };
        struct nvkm_ltc *ltc = gr->base.engine.subdev.device->ltc;
-       int index;
+       int index, c = ltc->zbc_min, d = ltc->zbc_min;
 
        if (!gr->zbc_color[0].format) {
-               gf100_gr_zbc_color_get(gr, 1,  & zero[0],   &zero[4]);
-               gf100_gr_zbc_color_get(gr, 2,  &  one[0],    &one[4]);
-               gf100_gr_zbc_color_get(gr, 4,  &f32_0[0],  &f32_0[4]);
-               gf100_gr_zbc_color_get(gr, 4,  &f32_1[0],  &f32_1[4]);
-               gf100_gr_zbc_depth_get(gr, 1, 0x00000000, 0x00000000);
-               gf100_gr_zbc_depth_get(gr, 1, 0x3f800000, 0x3f800000);
-       }
-
-       for (index = ltc->zbc_min; index <= ltc->zbc_max; index++)
-               gf100_gr_zbc_clear_color(gr, index);
-       for (index = ltc->zbc_min; index <= ltc->zbc_max; index++)
-               gf100_gr_zbc_clear_depth(gr, index);
+               gf100_gr_zbc_color_get(gr, 1,  & zero[0],   &zero[4]); c++;
+               gf100_gr_zbc_color_get(gr, 2,  &  one[0],    &one[4]); c++;
+               gf100_gr_zbc_color_get(gr, 4,  &f32_0[0],  &f32_0[4]); c++;
+               gf100_gr_zbc_color_get(gr, 4,  &f32_1[0],  &f32_1[4]); c++;
+               gf100_gr_zbc_depth_get(gr, 1, 0x00000000, 0x00000000); d++;
+               gf100_gr_zbc_depth_get(gr, 1, 0x3f800000, 0x3f800000); d++;
+       }
+
+       for (index = c; index <= ltc->zbc_max; index++)
+               gr->func->zbc->clear_color(gr, index);
+       for (index = d; index <= ltc->zbc_max; index++)
+               gr->func->zbc->clear_depth(gr, index);
 }
 
 /**
@@ -2242,6 +2248,7 @@ gf100_gr = {
        .gpccs.ucode = &gf100_gr_gpccs_ucode,
        .rops = gf100_gr_rops,
        .grctx = &gf100_grctx,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, FERMI_MEMORY_TO_MEMORY_FORMAT_A },
index 390bcc16f91f60ca5d5bd5d956bbd14dc8838c6e..d82951ab5ef1b91369d2ba7ee7d82fcb1428bb3e 100644 (file)
@@ -129,6 +129,11 @@ int gf100_gr_new_(const struct gf100_gr_func *, struct nvkm_device *,
                  int, struct nvkm_gr **);
 void *gf100_gr_dtor(struct nvkm_gr *);
 
+struct gf100_gr_func_zbc {
+       void (*clear_color)(struct gf100_gr *, int zbc);
+       void (*clear_depth)(struct gf100_gr *, int zbc);
+};
+
 struct gf100_gr_func {
        void (*dtor)(struct gf100_gr *);
        void (*oneinit_tiles)(struct gf100_gr *);
@@ -170,6 +175,7 @@ struct gf100_gr_func {
        int ppc_nr;
        const struct gf100_grctx_func *grctx;
        const struct nvkm_therm_clkgate_pack *clkgate_pack;
+       const struct gf100_gr_func_zbc *zbc;
        struct nvkm_sclass sclass[];
 };
 
@@ -187,6 +193,7 @@ void gf100_gr_init_419eb4(struct gf100_gr *);
 void gf100_gr_init_tex_hww_esr(struct gf100_gr *, int, int);
 void gf100_gr_init_shader_exceptions(struct gf100_gr *, int, int);
 void gf100_gr_init_400054(struct gf100_gr *);
+extern const struct gf100_gr_func_zbc gf100_gr_zbc;
 
 void gf117_gr_init_zcull(struct gf100_gr *);
 
@@ -212,6 +219,9 @@ void gm200_gr_init_ds_hww_esr_2(struct gf100_gr *);
 void gp100_gr_init_rop_active_fbps(struct gf100_gr *);
 void gp100_gr_init_fecs_exceptions(struct gf100_gr *);
 void gp100_gr_init_shader_exceptions(struct gf100_gr *, int, int);
+extern const struct gf100_gr_func_zbc gp100_gr_zbc;
+void gp100_gr_zbc_clear_color(struct gf100_gr *, int);
+void gp100_gr_zbc_clear_depth(struct gf100_gr *, int);
 
 void gp102_gr_init_swdx_pes_mask(struct gf100_gr *);
 
index 1d8e16a571360dee7e3b5005f26957802ac663f4..42c2fd9fc04e67230ea94ed1a2b65f16f496e531 100644 (file)
@@ -134,6 +134,7 @@ gf104_gr = {
        .gpccs.ucode = &gf100_gr_gpccs_ucode,
        .rops = gf100_gr_rops,
        .grctx = &gf104_grctx,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, FERMI_MEMORY_TO_MEMORY_FORMAT_A },
index a5a74df4edffd42b1e7bb2b495e641e3bc0416cb..4731a460adc7b29645c1b7a14ececc0c864e3ee3 100644 (file)
@@ -132,6 +132,7 @@ gf108_gr = {
        .gpccs.ucode = &gf100_gr_gpccs_ucode,
        .rops = gf100_gr_rops,
        .grctx = &gf108_grctx,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, FERMI_MEMORY_TO_MEMORY_FORMAT_A },
index 45fada09900983bedc037f7b5853fc4bdada9f06..cdf759c8cd7fbf46595fab2e0c5d8a01e5ec4029 100644 (file)
@@ -106,6 +106,7 @@ gf110_gr = {
        .gpccs.ucode = &gf100_gr_gpccs_ucode,
        .rops = gf100_gr_rops,
        .grctx = &gf110_grctx,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, FERMI_MEMORY_TO_MEMORY_FORMAT_A },
index 5ee167d0f5aa991e84d3a9d22c3bdd26a8ff1bee..a4158f84c64998e4435a0c4dea9dbc7f73963623 100644 (file)
@@ -171,6 +171,7 @@ gf117_gr = {
        .rops = gf100_gr_rops,
        .ppc_nr = 1,
        .grctx = &gf117_grctx,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, FERMI_MEMORY_TO_MEMORY_FORMAT_A },
index 2096552fc537c346ae43c454dacc4b2e272dc417..4197844870b3761aff488e9ebe77ecdb88dc539b 100644 (file)
@@ -197,6 +197,7 @@ gf119_gr = {
        .gpccs.ucode = &gf100_gr_gpccs_ucode,
        .rops = gf100_gr_rops,
        .grctx = &gf119_grctx,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, FERMI_MEMORY_TO_MEMORY_FORMAT_A },
index 9abacb218361822bb7521b278d24379d3af03f36..477fee3e37153c87d7e2275ff233759406714ad3 100644 (file)
@@ -479,6 +479,7 @@ gk104_gr = {
        .ppc_nr = 1,
        .grctx = &gk104_grctx,
        .clkgate_pack = gk104_clkgate_pack,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, KEPLER_INLINE_TO_MEMORY_A },
index dba70d50bb8e641e1b08f8b92dc61d512d87d6c6..7cd628c84e075fb81cf4ca5dfca369848623eb1b 100644 (file)
@@ -375,6 +375,7 @@ gk110_gr = {
        .ppc_nr = 2,
        .grctx = &gk110_grctx,
        .clkgate_pack = gk110_clkgate_pack,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, KEPLER_INLINE_TO_MEMORY_B },
index 48bc8d85dbb84e7a690f91e888c58837a03f6088..a38faa2156352fe5a2a262c44322ef85ef18cc0d 100644 (file)
@@ -126,6 +126,7 @@ gk110b_gr = {
        .rops = gf100_gr_rops,
        .ppc_nr = 2,
        .grctx = &gk110b_grctx,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, KEPLER_INLINE_TO_MEMORY_B },
index 7f45b122dcb0f06386e39a76563783c57ac38c23..58456660e603d820f6060d2df29879722dd145f0 100644 (file)
@@ -184,6 +184,7 @@ gk208_gr = {
        .rops = gf100_gr_rops,
        .ppc_nr = 1,
        .grctx = &gk208_grctx,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, KEPLER_INLINE_TO_MEMORY_B },
index 11a32fa01586cfcd47f7e98b13a20f3d57536936..500cb08dd608011005f178b4b469987d336242ca 100644 (file)
@@ -292,6 +292,7 @@ gk20a_gr = {
        .rops = gf100_gr_rops,
        .ppc_nr = 1,
        .grctx = &gk20a_grctx,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, KEPLER_INLINE_TO_MEMORY_A },
index f5411aff0e44f66300a72e957d0b2e7c20e0ef22..92e31d397207561e844cd15f37dd01082ab886c5 100644 (file)
@@ -419,6 +419,7 @@ gm107_gr = {
        .rops = gf100_gr_rops,
        .ppc_nr = 2,
        .grctx = &gm107_grctx,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, KEPLER_INLINE_TO_MEMORY_B },
index 8966d2a7235caadd70aada3ee5c237d29a1e471d..eff30662b9841300f473621c138f7d04a599add7 100644 (file)
@@ -187,6 +187,7 @@ gm200_gr = {
        .tpc_nr = 4,
        .ppc_nr = 2,
        .grctx = &gm200_grctx,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, KEPLER_INLINE_TO_MEMORY_B },
index afa1c6e3223077f69456c77571ae2222b80fdf4d..a667770ce3cbe379640805946674a23cd169bb85 100644 (file)
@@ -75,6 +75,7 @@ gm20b_gr = {
        .rops = gm200_gr_rops,
        .ppc_nr = 1,
        .grctx = &gm20b_grctx,
+       .zbc = &gf100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, KEPLER_INLINE_TO_MEMORY_B },
index 1d9d8760e13e08b0fb1a5ca154231c370dd11040..ef16fee61327828a7461891f56c5e18e6ebdbc32 100644 (file)
 /*******************************************************************************
  * PGRAPH engine/subdev functions
  ******************************************************************************/
+void
+gp100_gr_zbc_clear_color(struct gf100_gr *gr, int zbc)
+{
+       struct nvkm_device *device = gr->base.engine.subdev.device;
+       const int znum =  zbc - 1;
+       const u32 zoff = znum * 4;
+
+       if (gr->zbc_color[zbc].format) {
+               nvkm_wr32(device, 0x418010 + zoff, gr->zbc_color[zbc].ds[0]);
+               nvkm_wr32(device, 0x41804c + zoff, gr->zbc_color[zbc].ds[1]);
+               nvkm_wr32(device, 0x418088 + zoff, gr->zbc_color[zbc].ds[2]);
+               nvkm_wr32(device, 0x4180c4 + zoff, gr->zbc_color[zbc].ds[3]);
+       }
+
+       nvkm_mask(device, 0x418100 + ((znum / 4) * 4),
+                         0x0000007f << ((znum % 4) * 7),
+                         gr->zbc_color[zbc].format << ((znum % 4) * 7));
+}
+
+void
+gp100_gr_zbc_clear_depth(struct gf100_gr *gr, int zbc)
+{
+       struct nvkm_device *device = gr->base.engine.subdev.device;
+       const int znum =  zbc - 1;
+       const u32 zoff = znum * 4;
+
+       if (gr->zbc_depth[zbc].format)
+               nvkm_wr32(device, 0x418110 + zoff, gr->zbc_depth[zbc].ds);
+       nvkm_mask(device, 0x41814c + ((znum / 4) * 4),
+                         0x0000007f << ((znum % 4) * 7),
+                         gr->zbc_depth[zbc].format << ((znum % 4) * 7));
+}
+
+const struct gf100_gr_func_zbc
+gp100_gr_zbc = {
+       .clear_color = gp100_gr_zbc_clear_color,
+       .clear_depth = gp100_gr_zbc_clear_depth,
+};
 
 void
 gp100_gr_init_shader_exceptions(struct gf100_gr *gr, int gpc, int tpc)
@@ -87,6 +125,7 @@ gp100_gr = {
        .tpc_nr = 5,
        .ppc_nr = 2,
        .grctx = &gp100_grctx,
+       .zbc = &gp100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, KEPLER_INLINE_TO_MEMORY_B },
index 2d9a2c3ec261310408824a33bd56ccbd3127c4e2..8fc95a015e13bbe79491d40ef5112d617999af49 100644 (file)
@@ -65,6 +65,7 @@ gp102_gr = {
        .tpc_nr = 5,
        .ppc_nr = 3,
        .grctx = &gp102_grctx,
+       .zbc = &gp100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, KEPLER_INLINE_TO_MEMORY_B },
index e466ae460d3ceea883103ef73fd6c276c74ecb37..56f92c72350498fdf481710e166b74696e6768a6 100644 (file)
@@ -49,6 +49,7 @@ gp104_gr = {
        .tpc_nr = 5,
        .ppc_nr = 3,
        .grctx = &gp104_grctx,
+       .zbc = &gp100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, KEPLER_INLINE_TO_MEMORY_B },
index 2fa046a1da608910de0347100efadd2055d965c1..4bb0340e3fdacfc968f52dd723d096b027f3ad0d 100644 (file)
@@ -51,6 +51,7 @@ gp107_gr = {
        .tpc_nr = 3,
        .ppc_nr = 1,
        .grctx = &gp107_grctx,
+       .zbc = &gp100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, KEPLER_INLINE_TO_MEMORY_B },
index 0a01a306da2a6076ac1a729d4fab7b62ece3ffa3..b2a39ad2fa44552203286affb823026f892e1700 100644 (file)
@@ -49,6 +49,7 @@ gp10b_gr = {
        .tpc_nr = 2,
        .ppc_nr = 1,
        .grctx = &gp102_grctx,
+       .zbc = &gp100_gr_zbc,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
                { -1, -1, KEPLER_INLINE_TO_MEMORY_B },