drm/gf100-/gr: unhardcode attribute cb config
authorBen Skeggs <bskeggs@redhat.com>
Sat, 9 Aug 2014 18:10:30 +0000 (04:10 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Sat, 9 Aug 2014 19:28:16 +0000 (05:28 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
13 files changed:
drivers/gpu/drm/nouveau/core/engine/graph/ctxgk110b.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxgk20a.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxgm107.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnv108.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.h
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc1.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc4.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc8.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvd7.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvd9.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnve4.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvf0.c

index 11bf8b3a45df298763b871e4e7ddc24bcb1a7287..6b903c9ee0fb170809f79564e21858e6ab2ac4d1 100644 (file)
@@ -82,7 +82,7 @@ gk110b_grctx_oclass = &(struct nvc0_grctx_oclass) {
                .wr32 = _nouveau_graph_context_wr32,
        },
        .main  = nve4_grctx_generate_main,
-       .mods  = nvf0_grctx_generate_mods,
+       .mods  = nve4_grctx_generate_mods,
        .unkn  = nve4_grctx_generate_unkn,
        .hub   = nvf0_grctx_pack_hub,
        .gpc   = nvf0_grctx_pack_gpc,
@@ -97,4 +97,9 @@ gk110b_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .bundle_token_limit = 0x600,
        .pagepool = nve4_grctx_generate_pagepool,
        .pagepool_size = 0x8000,
+       .attrib = nvd7_grctx_generate_attrib,
+       .attrib_nr_max = 0x324,
+       .attrib_nr = 0x218,
+       .alpha_nr_max = 0x7ff,
+       .alpha_nr = 0x648,
 }.base;
index c560f486dcfbd830848713e3f874ebd46fb93cd1..f336fe38a32a08291881919cdbc8f2df0865cd52 100644 (file)
@@ -56,4 +56,9 @@ gk20a_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .bundle_token_limit = 0x100,
        .pagepool = nve4_grctx_generate_pagepool,
        .pagepool_size = 0x8000,
+       .attrib = nvd7_grctx_generate_attrib,
+       .attrib_nr_max = 0x240,
+       .attrib_nr = 0x240,
+       .alpha_nr_max = 0x648 + (0x648 / 2),
+       .alpha_nr = 0x648,
 }.base;
index 5f4d60e0ea07559b849c455f84e2b1c7e1b7f431..dfd92fa5f3748e93f05396191c2a1af7d3c01838 100644 (file)
@@ -891,29 +891,47 @@ gm107_grctx_generate_pagepool(struct nvc0_grctx *info)
 }
 
 static void
+gm107_grctx_generate_attrib(struct nvc0_grctx *info)
+{
+       struct nvc0_graph_priv *priv = info->priv;
+       const struct nvc0_grctx_oclass *impl = (void *)nvc0_grctx_impl(priv);
+       const u32  alpha = impl->alpha_nr;
+       const u32 attrib = impl->attrib_nr;
+       const u32   size = 0x20 * (impl->attrib_nr_max + impl->alpha_nr_max);
+       const u32 access = NV_MEM_ACCESS_RW;
+       const int s = 12;
+       const int b = mmio_vram(info, size * priv->tpc_total, (1 << s), access);
+       const int max_batches = 0xffff;
+       u32 bo = 0;
+       u32 ao = bo + impl->attrib_nr_max * priv->tpc_total;
+       int gpc, ppc, n = 0;
+
+       mmio_refn(info, 0x418810, 0x80000000, s, b);
+       mmio_refn(info, 0x419848, 0x10000000, s, b);
+       mmio_refn(info, 0x419c2c, 0x10000000, s, b);
+       mmio_wr32(info, 0x405830, (attrib << 16) | alpha);
+       mmio_wr32(info, 0x4064c4, ((alpha / 4) << 16) | max_batches);
+
+       for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
+               for (ppc = 0; ppc < priv->ppc_nr[gpc]; ppc++, n++) {
+                       const u32 as =  alpha * priv->ppc_tpc_nr[gpc][ppc];
+                       const u32 bs = attrib * priv->ppc_tpc_nr[gpc][ppc];
+                       const u32 u = 0x418ea0 + (n * 0x04);
+                       const u32 o = PPC_UNIT(gpc, ppc, 0);
+                       mmio_wr32(info, o + 0xc0, bs);
+                       mmio_wr32(info, o + 0xf4, bo);
+                       bo += impl->attrib_nr_max * priv->ppc_tpc_nr[gpc][ppc];
+                       mmio_wr32(info, o + 0xe4, as);
+                       mmio_wr32(info, o + 0xf8, ao);
+                       ao += impl->alpha_nr_max * priv->ppc_tpc_nr[gpc][ppc];
+                       mmio_wr32(info, u, (0x715 /*XXX*/ << 16) | bs);
+               }
+       }
+}
+
+void
 gm107_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 {
-       mmio_data(0x200000, 0x1000, NV_MEM_ACCESS_RW);
-
-       mmio_list(0x418810, 0x80000000, 12, 2);
-       mmio_list(0x419848, 0x10000000, 12, 2);
-       mmio_list(0x419c2c, 0x10000000, 12, 2);
-
-       mmio_list(0x405830, 0x0aa01000,  0, 0);
-       mmio_list(0x4064c4, 0x0400ffff,  0, 0);
-
-       /*XXX*/
-       mmio_list(0x5030c0, 0x00001540,  0, 0);
-       mmio_list(0x5030f4, 0x00000000,  0, 0);
-       mmio_list(0x5030e4, 0x00002000,  0, 0);
-       mmio_list(0x5030f8, 0x00003fc0,  0, 0);
-       mmio_list(0x418ea0, 0x07151540,  0, 0);
-
-       mmio_list(0x5032c0, 0x00001540,  0, 0);
-       mmio_list(0x5032f4, 0x00001fe0,  0, 0);
-       mmio_list(0x5032e4, 0x00002000,  0, 0);
-       mmio_list(0x5032f8, 0x00006fc0,  0, 0);
-       mmio_list(0x418ea4, 0x07151540,  0, 0);
 }
 
 static void
@@ -952,6 +970,7 @@ gm107_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 
        oclass->bundle(info);
        oclass->pagepool(info);
+       oclass->attrib(info);
        oclass->mods(priv, info);
        oclass->unkn(priv);
 
@@ -1012,4 +1031,9 @@ gm107_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .bundle_token_limit = 0x2c0,
        .pagepool = gm107_grctx_generate_pagepool,
        .pagepool_size = 0x8000,
+       .attrib = gm107_grctx_generate_attrib,
+       .attrib_nr_max = 0xff0,
+       .attrib_nr = 0xaa0,
+       .alpha_nr_max = 0x1800,
+       .alpha_nr = 0x1000,
 }.base;
index c3487c42e5d6f6371fa850520e40422925d8b167..f32241800f8eaddac719a2702bc8b48d100bce72 100644 (file)
@@ -534,31 +534,6 @@ nv108_grctx_pack_ppc[] = {
 static void
 nv108_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 {
-       u32 magic[GPC_MAX][2];
-       u32 offset;
-       int gpc;
-
-       mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
-       mmio_list(0x418810, 0x80000000, 12, 2);
-       mmio_list(0x419848, 0x10000000, 12, 2);
-
-       mmio_list(0x405830, 0x02180648,  0, 0);
-       mmio_list(0x4064c4, 0x0192ffff,  0, 0);
-
-       for (gpc = 0, offset = 0; gpc < priv->gpc_nr; gpc++) {
-               u16 magic0 = 0x0218 * priv->tpc_nr[gpc];
-               u16 magic1 = 0x0648 * priv->tpc_nr[gpc];
-               magic[gpc][0]  = 0x10000000 | (magic0 << 16) | offset;
-               magic[gpc][1]  = 0x00000000 | (magic1 << 16);
-               offset += 0x0324 * priv->tpc_nr[gpc];
-       }
-
-       for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
-               mmio_list(GPC_UNIT(gpc, 0x30c0), magic[gpc][0], 0, 0);
-               mmio_list(GPC_UNIT(gpc, 0x30e4), magic[gpc][1] | offset, 0, 0);
-               offset += 0x07ff * priv->tpc_nr[gpc];
-       }
-
        mmio_list(0x17e91c, 0x0b040a0b, 0, 0);
        mmio_list(0x17e920, 0x00090d08, 0, 0);
 }
@@ -590,4 +565,9 @@ nv108_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .bundle_token_limit = 0x200,
        .pagepool = nve4_grctx_generate_pagepool,
        .pagepool_size = 0x8000,
+       .attrib = nvd7_grctx_generate_attrib,
+       .attrib_nr_max = 0x324,
+       .attrib_nr = 0x218,
+       .alpha_nr_max = 0x7ff,
+       .alpha_nr = 0x648,
 }.base;
index 8dd3a5b56cd3490c2b06a1ba4980e1bed1dc848d..46905a48f00a54322ea0e6427c504313c1902ec5 100644 (file)
@@ -1047,27 +1047,37 @@ nvc0_grctx_generate_pagepool(struct nvc0_grctx *info)
 }
 
 void
-nvc0_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
+nvc0_grctx_generate_attrib(struct nvc0_grctx *info)
 {
+       struct nvc0_graph_priv *priv = info->priv;
+       const struct nvc0_grctx_oclass *impl = nvc0_grctx_impl(priv);
+       const u32 attrib = impl->attrib_nr;
+       const u32   size = 0x20 * (impl->attrib_nr_max + impl->alpha_nr_max);
+       const u32 access = NV_MEM_ACCESS_RW;
+       const int s = 12;
+       const int b = mmio_vram(info, size * priv->tpc_total, (1 << s), access);
        int gpc, tpc;
-       u32 offset;
-
-       mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
+       u32 bo = 0;
 
-       mmio_list(0x418810, 0x80000000, 12, 2);
-       mmio_list(0x419848, 0x10000000, 12, 2);
+       mmio_refn(info, 0x418810, 0x80000000, s, b);
+       mmio_refn(info, 0x419848, 0x10000000, s, b);
+       mmio_wr32(info, 0x405830, (attrib << 16));
 
-       mmio_list(0x405830, 0x02180000, 0, 0);
-
-       for (gpc = 0, offset = 0; gpc < priv->gpc_nr; gpc++) {
+       for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
                for (tpc = 0; tpc < priv->tpc_nr[gpc]; tpc++) {
-                       u32 addr = TPC_UNIT(gpc, tpc, 0x0520);
-                       mmio_list(addr, 0x02180000 | offset, 0, 0);
-                       offset += 0x0324;
+                       const u32 o = TPC_UNIT(gpc, tpc, 0x0520);
+                       mmio_skip(info, o, (attrib << 16) | ++bo);
+                       mmio_wr32(info, o, (attrib << 16) | --bo);
+                       bo += impl->attrib_nr_max;
                }
        }
 }
 
+void
+nvc0_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
+{
+}
+
 void
 nvc0_grctx_generate_unkn(struct nvc0_graph_priv *priv)
 {
@@ -1236,6 +1246,7 @@ nvc0_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 
        oclass->bundle(info);
        oclass->pagepool(info);
+       oclass->attrib(info);
        oclass->mods(priv, info);
        oclass->unkn(priv);
 
@@ -1376,4 +1387,7 @@ nvc0_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .bundle_size = 0x1800,
        .pagepool = nvc0_grctx_generate_pagepool,
        .pagepool_size = 0x8000,
+       .attrib = nvc0_grctx_generate_attrib,
+       .attrib_nr_max = 0x324,
+       .attrib_nr = 0x218,
 }.base;
index 6387a160ac18878db86649f10caa74c04cbdc0c3..fe3fcb99c69ce3308d68ad729da6081090a0496a 100644 (file)
@@ -47,6 +47,12 @@ struct nvc0_grctx_oclass {
        /* pagepool */
        void (*pagepool)(struct nvc0_grctx *);
        u32 pagepool_size;
+       /* attribute(/alpha) circular buffer */
+       void (*attrib)(struct nvc0_grctx *);
+       u32 attrib_nr_max;
+       u32 attrib_nr;
+       u32 alpha_nr_max;
+       u32 alpha_nr;
 };
 
 static inline const struct nvc0_grctx_oclass *
@@ -60,6 +66,7 @@ int  nvc0_grctx_generate(struct nvc0_graph_priv *);
 void nvc0_grctx_generate_main(struct nvc0_graph_priv *, struct nvc0_grctx *);
 void nvc0_grctx_generate_bundle(struct nvc0_grctx *);
 void nvc0_grctx_generate_pagepool(struct nvc0_grctx *);
+void nvc0_grctx_generate_attrib(struct nvc0_grctx *);
 void nvc0_grctx_generate_mods(struct nvc0_graph_priv *, struct nvc0_grctx *);
 void nvc0_grctx_generate_unkn(struct nvc0_graph_priv *);
 void nvc0_grctx_generate_tpcid(struct nvc0_graph_priv *);
@@ -69,12 +76,16 @@ void nvc0_grctx_generate_r418bb8(struct nvc0_graph_priv *);
 void nvc0_grctx_generate_r406800(struct nvc0_graph_priv *);
 
 extern struct nouveau_oclass *nvc1_grctx_oclass;
+void nvc1_grctx_generate_attrib(struct nvc0_grctx *);
 void nvc1_grctx_generate_mods(struct nvc0_graph_priv *, struct nvc0_grctx *);
 void nvc1_grctx_generate_unkn(struct nvc0_graph_priv *);
 
 extern struct nouveau_oclass *nvc4_grctx_oclass;
 extern struct nouveau_oclass *nvc8_grctx_oclass;
+
 extern struct nouveau_oclass *nvd7_grctx_oclass;
+void nvd7_grctx_generate_attrib(struct nvc0_grctx *);
+
 extern struct nouveau_oclass *nvd9_grctx_oclass;
 
 extern struct nouveau_oclass *nve4_grctx_oclass;
@@ -86,8 +97,6 @@ void nve4_grctx_generate_mods(struct nvc0_graph_priv *, struct nvc0_grctx *);
 void nve4_grctx_generate_unkn(struct nvc0_graph_priv *);
 void nve4_grctx_generate_r418bb8(struct nvc0_graph_priv *);
 
-void nvf0_grctx_generate_mods(struct nvc0_graph_priv *, struct nvc0_grctx *);
-
 extern struct nouveau_oclass *nvf0_grctx_oclass;
 extern struct nouveau_oclass *gk110b_grctx_oclass;
 extern struct nouveau_oclass *nv108_grctx_oclass;
index f174204c18ab01c4cd19df016b921a1c8f3f452e..d9b8f981096f2ada30b6ddfe524156b8b97391e0 100644 (file)
@@ -727,32 +727,47 @@ nvc1_grctx_pack_tpc[] = {
  ******************************************************************************/
 
 void
-nvc1_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
+nvc1_grctx_generate_attrib(struct nvc0_grctx *info)
 {
+       struct nvc0_graph_priv *priv = info->priv;
+       const struct nvc0_grctx_oclass *impl = nvc0_grctx_impl(priv);
+       const u32  alpha = impl->alpha_nr;
+       const u32   beta = impl->attrib_nr;
+       const u32   size = 0x20 * (impl->attrib_nr_max + impl->alpha_nr_max);
+       const u32 access = NV_MEM_ACCESS_RW;
+       const int s = 12;
+       const int b = mmio_vram(info, size * priv->tpc_total, (1 << s), access);
+       const int timeslice_mode = 1;
+       const int max_batches = 0xffff;
+       u32 bo = 0;
+       u32 ao = bo + impl->attrib_nr_max * priv->tpc_total;
        int gpc, tpc;
-       u32 offset;
-
-       mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
-       mmio_list(0x418810, 0x80000000, 12, 2);
-       mmio_list(0x419848, 0x10000000, 12, 2);
 
-       mmio_list(0x405830, 0x02180218, 0, 0);
-       mmio_list(0x4064c4, 0x0086ffff, 0, 0);
+       mmio_refn(info, 0x418810, 0x80000000, s, b);
+       mmio_refn(info, 0x419848, 0x10000000, s, b);
+       mmio_wr32(info, 0x405830, (beta << 16) | alpha);
+       mmio_wr32(info, 0x4064c4, ((alpha / 4) << 16) | max_batches);
 
-       for (gpc = 0, offset = 0; gpc < priv->gpc_nr; gpc++) {
+       for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
                for (tpc = 0; tpc < priv->tpc_nr[gpc]; tpc++) {
-                       u32 addr = TPC_UNIT(gpc, tpc, 0x0520);
-                       mmio_list(addr, 0x12180000 | offset, 0, 0);
-                       offset += 0x0324;
-               }
-               for (tpc = 0; tpc < priv->tpc_nr[gpc]; tpc++) {
-                       u32 addr = TPC_UNIT(gpc, tpc, 0x0544);
-                       mmio_list(addr, 0x02180000 | offset, 0, 0);
-                       offset += 0x0324;
+                       const u32 a = alpha;
+                       const u32 b =  beta;
+                       const u32 t = timeslice_mode;
+                       const u32 o = TPC_UNIT(gpc, tpc, 0x500);
+                       mmio_skip(info, o + 0x20, (t << 28) | (b << 16) | ++bo);
+                       mmio_wr32(info, o + 0x20, (t << 28) | (b << 16) | --bo);
+                       bo += impl->attrib_nr_max;
+                       mmio_wr32(info, o + 0x44, (a << 16) | ao);
+                       ao += impl->alpha_nr_max;
                }
        }
 }
 
+void
+nvc1_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
+{
+}
+
 void
 nvc1_grctx_generate_unkn(struct nvc0_graph_priv *priv)
 {
@@ -788,4 +803,9 @@ nvc1_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .bundle_size = 0x1800,
        .pagepool = nvc0_grctx_generate_pagepool,
        .pagepool_size = 0x8000,
+       .attrib = nvc1_grctx_generate_attrib,
+       .attrib_nr_max = 0x324,
+       .attrib_nr = 0x218,
+       .alpha_nr_max = 0x324,
+       .alpha_nr = 0x218,
 }.base;
index ec7f32a6a0f9556ffa301382869658e897681157..8d84dff9fe1fbe92ef64b88d5a668152bfa5ec8b 100644 (file)
@@ -104,4 +104,7 @@ nvc4_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .bundle_size = 0x1800,
        .pagepool = nvc0_grctx_generate_pagepool,
        .pagepool_size = 0x8000,
+       .attrib = nvc0_grctx_generate_attrib,
+       .attrib_nr_max = 0x324,
+       .attrib_nr = 0x218,
 }.base;
index de0586829ce1647e96557b3b0f1942e9f38bb398..93f9b60ef87158f571336868111385bca6426d04 100644 (file)
@@ -355,4 +355,7 @@ nvc8_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .bundle_size = 0x1800,
        .pagepool = nvc0_grctx_generate_pagepool,
        .pagepool_size = 0x8000,
+       .attrib = nvc0_grctx_generate_attrib,
+       .attrib_nr_max = 0x324,
+       .attrib_nr = 0x218,
 }.base;
index ce016ac225a92def8e47fff3b909482d81aaf219..05b76538a06f7391c76270f8370f61c87d548a44 100644 (file)
@@ -177,33 +177,46 @@ nvd7_grctx_pack_ppc[] = {
  * PGRAPH context implementation
  ******************************************************************************/
 
-static void
-nvd7_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
+void
+nvd7_grctx_generate_attrib(struct nvc0_grctx *info)
 {
-       u32 magic[GPC_MAX][2];
-       u32 offset;
-       int gpc;
+       struct nvc0_graph_priv *priv = info->priv;
+       const struct nvc0_grctx_oclass *impl = nvc0_grctx_impl(priv);
+       const u32  alpha = impl->alpha_nr;
+       const u32   beta = impl->attrib_nr;
+       const u32   size = 0x20 * (impl->attrib_nr_max + impl->alpha_nr_max);
+       const u32 access = NV_MEM_ACCESS_RW;
+       const int s = 12;
+       const int b = mmio_vram(info, size * priv->tpc_total, (1 << s), access);
+       const int timeslice_mode = 1;
+       const int max_batches = 0xffff;
+       u32 bo = 0;
+       u32 ao = bo + impl->attrib_nr_max * priv->tpc_total;
+       int gpc, ppc;
 
-       mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
-       mmio_list(0x418810, 0x80000000, 12, 2);
-       mmio_list(0x419848, 0x10000000, 12, 2);
-
-       mmio_list(0x405830, 0x02180324,  0, 0);
-       mmio_list(0x4064c4, 0x00c9ffff,  0, 0);
-
-       for (gpc = 0, offset = 0; gpc < priv->gpc_nr; gpc++) {
-               u16 magic0 = 0x0218 * priv->tpc_nr[gpc];
-               u16 magic1 = 0x0324 * priv->tpc_nr[gpc];
-               magic[gpc][0]  = 0x10000000 | (magic0 << 16) | offset;
-               magic[gpc][1]  = 0x00000000 | (magic1 << 16);
-               offset += 0x0324 * priv->tpc_nr[gpc];
-       }
+       mmio_refn(info, 0x418810, 0x80000000, s, b);
+       mmio_refn(info, 0x419848, 0x10000000, s, b);
+       mmio_wr32(info, 0x405830, (beta << 16) | alpha);
+       mmio_wr32(info, 0x4064c4, ((alpha / 4) << 16) | max_batches);
 
        for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
-               mmio_list(GPC_UNIT(gpc, 0x30c0), magic[gpc][0], 0, 0);
-               mmio_list(GPC_UNIT(gpc, 0x30e4), magic[gpc][1] | offset, 0, 0);
-               offset += 0x07ff * priv->tpc_nr[gpc];
+               for (ppc = 0; ppc < priv->ppc_nr[gpc]; ppc++) {
+                       const u32 a = alpha * priv->ppc_tpc_nr[gpc][ppc];
+                       const u32 b =  beta * priv->ppc_tpc_nr[gpc][ppc];
+                       const u32 t = timeslice_mode;
+                       const u32 o = PPC_UNIT(gpc, ppc, 0);
+                       mmio_skip(info, o + 0xc0, (t << 28) | (b << 16) | ++bo);
+                       mmio_wr32(info, o + 0xc0, (t << 28) | (b << 16) | --bo);
+                       bo += impl->attrib_nr_max * priv->ppc_tpc_nr[gpc][ppc];
+                       mmio_wr32(info, o + 0xe4, (a << 16) | ao);
+                       ao += impl->alpha_nr_max * priv->ppc_tpc_nr[gpc][ppc];
+               }
        }
+}
+
+static void
+nvd7_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
+{
        mmio_list(0x17e91c, 0x03060609, 0, 0); /* different from kepler */
 }
 
@@ -225,6 +238,7 @@ nvd7_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 
        oclass->bundle(info);
        oclass->pagepool(info);
+       oclass->attrib(info);
        oclass->mods(priv, info);
        oclass->unkn(priv);
 
@@ -268,4 +282,9 @@ nvd7_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .bundle_size = 0x1800,
        .pagepool = nvc0_grctx_generate_pagepool,
        .pagepool_size = 0x8000,
+       .attrib = nvd7_grctx_generate_attrib,
+       .attrib_nr_max = 0x324,
+       .attrib_nr = 0x218,
+       .alpha_nr_max = 0x7ff,
+       .alpha_nr = 0x324,
 }.base;
index b2b0f7085ea7145e74d5728c332df9651eae7c04..e5808a82ba4d99713139b5b8add2b53735b32a62 100644 (file)
@@ -523,4 +523,9 @@ nvd9_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .bundle_size = 0x1800,
        .pagepool = nvc0_grctx_generate_pagepool,
        .pagepool_size = 0x8000,
+       .attrib = nvc1_grctx_generate_attrib,
+       .attrib_nr_max = 0x324,
+       .attrib_nr = 0x218,
+       .alpha_nr_max = 0x324,
+       .alpha_nr = 0x218,
 }.base;
index 9dfb60d8e5a8856f2b49e0402d2cd30c2ce80737..22de56b39a88c9ec0287bd10133726b656eb9c7e 100644 (file)
@@ -872,31 +872,6 @@ nve4_grctx_generate_pagepool(struct nvc0_grctx *info)
 void
 nve4_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 {
-       u32 magic[GPC_MAX][2];
-       u32 offset;
-       int gpc;
-
-       mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
-       mmio_list(0x418810, 0x80000000, 12, 2);
-       mmio_list(0x419848, 0x10000000, 12, 2);
-
-       mmio_list(0x405830, 0x02180648,  0, 0);
-       mmio_list(0x4064c4, 0x0192ffff,  0, 0);
-
-       for (gpc = 0, offset = 0; gpc < priv->gpc_nr; gpc++) {
-               u16 magic0 = 0x0218 * priv->tpc_nr[gpc];
-               u16 magic1 = 0x0648 * priv->tpc_nr[gpc];
-               magic[gpc][0]  = 0x10000000 | (magic0 << 16) | offset;
-               magic[gpc][1]  = 0x00000000 | (magic1 << 16);
-               offset += 0x0324 * priv->tpc_nr[gpc];
-       }
-
-       for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
-               mmio_list(GPC_UNIT(gpc, 0x30c0), magic[gpc][0], 0, 0);
-               mmio_list(GPC_UNIT(gpc, 0x30e4), magic[gpc][1] | offset, 0, 0);
-               offset += 0x07ff * priv->tpc_nr[gpc];
-       }
-
        mmio_list(0x17e91c, 0x06060609, 0, 0);
        mmio_list(0x17e920, 0x00090a05, 0, 0);
 }
@@ -988,6 +963,7 @@ nve4_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 
        oclass->bundle(info);
        oclass->pagepool(info);
+       oclass->attrib(info);
        oclass->mods(priv, info);
        oclass->unkn(priv);
 
@@ -1045,4 +1021,9 @@ nve4_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .bundle_token_limit = 0x600,
        .pagepool = nve4_grctx_generate_pagepool,
        .pagepool_size = 0x8000,
+       .attrib = nvd7_grctx_generate_attrib,
+       .attrib_nr_max = 0x324,
+       .attrib_nr = 0x218,
+       .alpha_nr_max = 0x7ff,
+       .alpha_nr = 0x648,
 }.base;
index e25ec47defa817a55b11fcba15279100edf54f91..4400b1dcd73ee8844d19869a1aeefa83eab6fff9 100644 (file)
@@ -809,46 +809,6 @@ nvf0_grctx_pack_ppc[] = {
  * PGRAPH context implementation
  ******************************************************************************/
 
-void
-nvf0_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
-{
-       u32 magic[GPC_MAX][4];
-       u32 offset;
-       int gpc;
-
-       mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
-       mmio_list(0x418810, 0x80000000, 12, 2);
-       mmio_list(0x419848, 0x10000000, 12, 2);
-
-       mmio_list(0x405830, 0x02180648,  0, 0);
-       mmio_list(0x4064c4, 0x0192ffff,  0, 0);
-
-       for (gpc = 0, offset = 0; gpc < priv->gpc_nr; gpc++) {
-               u16 magic0 = 0x0218 * (priv->tpc_nr[gpc] - 1);
-               u16 magic1 = 0x0648 * (priv->tpc_nr[gpc] - 1);
-               u16 magic2 = 0x0218;
-               u16 magic3 = 0x0648;
-               magic[gpc][0]  = 0x10000000 | (magic0 << 16) | offset;
-               magic[gpc][1]  = 0x00000000 | (magic1 << 16);
-               offset += 0x0324 * (priv->tpc_nr[gpc] - 1);
-               magic[gpc][2]  = 0x10000000 | (magic2 << 16) | offset;
-               magic[gpc][3]  = 0x00000000 | (magic3 << 16);
-               offset += 0x0324;
-       }
-
-       for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
-               mmio_list(GPC_UNIT(gpc, 0x30c0), magic[gpc][0], 0, 0);
-               mmio_list(GPC_UNIT(gpc, 0x30e4), magic[gpc][1] | offset, 0, 0);
-               offset += 0x07ff * (priv->tpc_nr[gpc] - 1);
-               mmio_list(GPC_UNIT(gpc, 0x32c0), magic[gpc][2], 0, 0);
-               mmio_list(GPC_UNIT(gpc, 0x32e4), magic[gpc][3] | offset, 0, 0);
-               offset += 0x07ff;
-       }
-
-       mmio_list(0x17e91c, 0x06060609, 0, 0);
-       mmio_list(0x17e920, 0x00090a05, 0, 0);
-}
-
 struct nouveau_oclass *
 nvf0_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .base.handle = NV_ENGCTX(GR, 0xf0),
@@ -861,7 +821,7 @@ nvf0_grctx_oclass = &(struct nvc0_grctx_oclass) {
                .wr32 = _nouveau_graph_context_wr32,
        },
        .main  = nve4_grctx_generate_main,
-       .mods  = nvf0_grctx_generate_mods,
+       .mods  = nve4_grctx_generate_mods,
        .unkn  = nve4_grctx_generate_unkn,
        .hub   = nvf0_grctx_pack_hub,
        .gpc   = nvf0_grctx_pack_gpc,
@@ -876,4 +836,9 @@ nvf0_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .bundle_token_limit = 0x7c0,
        .pagepool = nve4_grctx_generate_pagepool,
        .pagepool_size = 0x8000,
+       .attrib = nvd7_grctx_generate_attrib,
+       .attrib_nr_max = 0x324,
+       .attrib_nr = 0x218,
+       .alpha_nr_max = 0x7ff,
+       .alpha_nr = 0x648,
 }.base;