.bundle_size = 0x3000,
        .bundle_min_gpm_fifo_depth = 0x180,
        .bundle_token_limit = 0x600,
+       .pagepool = nve4_grctx_generate_pagepool,
+       .pagepool_size = 0x8000,
 }.base;
 
        .bundle_size = 0x1800,
        .bundle_min_gpm_fifo_depth = 0x62,
        .bundle_token_limit = 0x100,
+       .pagepool = nve4_grctx_generate_pagepool,
+       .pagepool_size = 0x8000,
 }.base;
 
        mmio_wr32(info, 0x4064c8, (state_limit << 16) | token_limit);
 }
 
+static void
+gm107_grctx_generate_pagepool(struct nvc0_grctx *info)
+{
+       const struct nvc0_grctx_oclass *impl = nvc0_grctx_impl(info->priv);
+       const u32 access = NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS;
+       const int s = 8;
+       const int b = mmio_vram(info, impl->pagepool_size, (1 << s), access);
+       mmio_refn(info, 0x40800c, 0x00000000, s, b);
+       mmio_wr32(info, 0x408010, 0x80000000);
+       mmio_refn(info, 0x419004, 0x00000000, s, b);
+       mmio_wr32(info, 0x419008, 0x00000000);
+       mmio_wr32(info, 0x4064cc, 0x80000000);
+       mmio_wr32(info, 0x418e30, 0x80000000); /* guess at it being related */
+}
+
 static void
 gm107_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 {
-       mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x200000, 0x1000, NV_MEM_ACCESS_RW);
 
-       mmio_list(0x40800c, 0x00000000,  8, 1);
-       mmio_list(0x408010, 0x80000000,  0, 0);
-       mmio_list(0x419004, 0x00000000,  8, 1);
-       mmio_list(0x419008, 0x00000000,  0, 0);
-       mmio_list(0x4064cc, 0x80000000,  0, 0);
-       mmio_list(0x418e30, 0x80000000,  0, 0);
-
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
        mmio_list(0x419c2c, 0x10000000, 12, 2);
        nv_wr32(priv, 0x404154, 0x00000000);
 
        oclass->bundle(info);
+       oclass->pagepool(info);
        oclass->mods(priv, info);
        oclass->unkn(priv);
 
        .bundle_size = 0x3000,
        .bundle_min_gpm_fifo_depth = 0x180,
        .bundle_token_limit = 0x2c0,
+       .pagepool = gm107_grctx_generate_pagepool,
+       .pagepool_size = 0x8000,
 }.base;
 
        u32 offset;
        int gpc;
 
-       mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
-       mmio_list(0x40800c, 0x00000000,  8, 1);
-       mmio_list(0x408010, 0x80000000,  0, 0);
-       mmio_list(0x419004, 0x00000000,  8, 1);
-       mmio_list(0x419008, 0x00000000,  0, 0);
-       mmio_list(0x4064cc, 0x80000000,  0, 0);
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
 
        .bundle_size = 0x3000,
        .bundle_min_gpm_fifo_depth = 0xc2,
        .bundle_token_limit = 0x200,
+       .pagepool = nve4_grctx_generate_pagepool,
+       .pagepool_size = 0x8000,
 }.base;
 
        mmio_refn(info, 0x41880c, 0x80000000 | (impl->bundle_size >> s), 0, b);
 }
 
+void
+nvc0_grctx_generate_pagepool(struct nvc0_grctx *info)
+{
+       const struct nvc0_grctx_oclass *impl = nvc0_grctx_impl(info->priv);
+       const u32 access = NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS;
+       const int s = 8;
+       const int b = mmio_vram(info, impl->pagepool_size, (1 << s), access);
+       mmio_refn(info, 0x40800c, 0x00000000, s, b);
+       mmio_wr32(info, 0x408010, 0x80000000);
+       mmio_refn(info, 0x419004, 0x00000000, s, b);
+       mmio_wr32(info, 0x419008, 0x00000000);
+}
+
 void
 nvc0_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 {
        int gpc, tpc;
        u32 offset;
 
-       mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
 
-       mmio_list(0x40800c, 0x00000000,  8, 1);
-       mmio_list(0x408010, 0x80000000,  0, 0);
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
-       mmio_list(0x419004, 0x00000000,  8, 1);
-       mmio_list(0x419008, 0x00000000,  0, 0);
 
        mmio_list(0x405830, 0x02180000, 0, 0);
 
        nv_wr32(priv, 0x404154, 0x00000000);
 
        oclass->bundle(info);
+       oclass->pagepool(info);
        oclass->mods(priv, info);
        oclass->unkn(priv);
 
        .mthd  = nvc0_grctx_pack_mthd,
        .bundle = nvc0_grctx_generate_bundle,
        .bundle_size = 0x1800,
+       .pagepool = nvc0_grctx_generate_pagepool,
+       .pagepool_size = 0x8000,
 }.base;
 
        u32 bundle_size;
        u32 bundle_min_gpm_fifo_depth;
        u32 bundle_token_limit;
+       /* pagepool */
+       void (*pagepool)(struct nvc0_grctx *);
+       u32 pagepool_size;
 };
 
 static inline const struct nvc0_grctx_oclass *
 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_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 *);
 extern struct nouveau_oclass *gk20a_grctx_oclass;
 void nve4_grctx_generate_main(struct nvc0_graph_priv *, struct nvc0_grctx *);
 void nve4_grctx_generate_bundle(struct nvc0_grctx *);
+void nve4_grctx_generate_pagepool(struct nvc0_grctx *);
 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 *);
 
        int gpc, tpc;
        u32 offset;
 
-       mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
-       mmio_list(0x40800c, 0x00000000,  8, 1);
-       mmio_list(0x408010, 0x80000000,  0, 0);
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
-       mmio_list(0x419004, 0x00000000,  8, 1);
-       mmio_list(0x419008, 0x00000000,  0, 0);
 
        mmio_list(0x405830, 0x02180218, 0, 0);
        mmio_list(0x4064c4, 0x0086ffff, 0, 0);
        .mthd  = nvc1_grctx_pack_mthd,
        .bundle = nvc0_grctx_generate_bundle,
        .bundle_size = 0x1800,
+       .pagepool = nvc0_grctx_generate_pagepool,
+       .pagepool_size = 0x8000,
 }.base;
 
        .mthd  = nvc0_grctx_pack_mthd,
        .bundle = nvc0_grctx_generate_bundle,
        .bundle_size = 0x1800,
+       .pagepool = nvc0_grctx_generate_pagepool,
+       .pagepool_size = 0x8000,
 }.base;
 
        .mthd  = nvc8_grctx_pack_mthd,
        .bundle = nvc0_grctx_generate_bundle,
        .bundle_size = 0x1800,
+       .pagepool = nvc0_grctx_generate_pagepool,
+       .pagepool_size = 0x8000,
 }.base;
 
        u32 offset;
        int gpc;
 
-       mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
-       mmio_list(0x40800c, 0x00000000,  8, 1);
-       mmio_list(0x408010, 0x80000000,  0, 0);
-       mmio_list(0x419004, 0x00000000,  8, 1);
-       mmio_list(0x419008, 0x00000000,  0, 0);
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
 
        nv_wr32(priv, 0x404154, 0x00000000);
 
        oclass->bundle(info);
+       oclass->pagepool(info);
        oclass->mods(priv, info);
        oclass->unkn(priv);
 
        .mthd  = nvd9_grctx_pack_mthd,
        .bundle = nvc0_grctx_generate_bundle,
        .bundle_size = 0x1800,
+       .pagepool = nvc0_grctx_generate_pagepool,
+       .pagepool_size = 0x8000,
 }.base;
 
        .mthd  = nvd9_grctx_pack_mthd,
        .bundle = nvc0_grctx_generate_bundle,
        .bundle_size = 0x1800,
+       .pagepool = nvc0_grctx_generate_pagepool,
+       .pagepool_size = 0x8000,
 }.base;
 
        mmio_wr32(info, 0x4064c8, (state_limit << 16) | token_limit);
 }
 
+void
+nve4_grctx_generate_pagepool(struct nvc0_grctx *info)
+{
+       const struct nvc0_grctx_oclass *impl = nvc0_grctx_impl(info->priv);
+       const u32 access = NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS;
+       const int s = 8;
+       const int b = mmio_vram(info, impl->pagepool_size, (1 << s), access);
+       mmio_refn(info, 0x40800c, 0x00000000, s, b);
+       mmio_wr32(info, 0x408010, 0x80000000);
+       mmio_refn(info, 0x419004, 0x00000000, s, b);
+       mmio_wr32(info, 0x419008, 0x00000000);
+       mmio_wr32(info, 0x4064cc, 0x80000000);
+}
+
 void
 nve4_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 {
        u32 offset;
        int gpc;
 
-       mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
-       mmio_list(0x40800c, 0x00000000,  8, 1);
-       mmio_list(0x408010, 0x80000000,  0, 0);
-       mmio_list(0x419004, 0x00000000,  8, 1);
-       mmio_list(0x419008, 0x00000000,  0, 0);
-       mmio_list(0x4064cc, 0x80000000,  0, 0);
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
 
        nv_wr32(priv, 0x404154, 0x00000000);
 
        oclass->bundle(info);
+       oclass->pagepool(info);
        oclass->mods(priv, info);
        oclass->unkn(priv);
 
        .bundle_size = 0x3000,
        .bundle_min_gpm_fifo_depth = 0x180,
        .bundle_token_limit = 0x600,
+       .pagepool = nve4_grctx_generate_pagepool,
+       .pagepool_size = 0x8000,
 }.base;
 
        u32 offset;
        int gpc;
 
-       mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
-       mmio_list(0x40800c, 0x00000000,  8, 1);
-       mmio_list(0x408010, 0x80000000,  0, 0);
-       mmio_list(0x419004, 0x00000000,  8, 1);
-       mmio_list(0x419008, 0x00000000,  0, 0);
-       mmio_list(0x4064cc, 0x80000000,  0, 0);
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
 
        .bundle_size = 0x3000,
        .bundle_min_gpm_fifo_depth = 0x180,
        .bundle_token_limit = 0x7c0,
+       .pagepool = nve4_grctx_generate_pagepool,
+       .pagepool_size = 0x8000,
 }.base;