.mmio = gk110b_graph_pack_mmio,
        .fecs.ucode = &nvf0_graph_fecs_ucode,
        .gpccs.ucode = &nvf0_graph_gpccs_ucode,
+       .ppc_nr = 2,
 }.base;
 
        .cclass = &gk20a_grctx_oclass,
        .sclass = gk20a_graph_sclass,
        .mmio = nve4_graph_pack_mmio,
+       .ppc_nr = 1,
 }.base;
 
        .mmio = gm107_graph_pack_mmio,
        .fecs.ucode = 0 ? &gm107_graph_fecs_ucode : NULL,
        .gpccs.ucode = &gm107_graph_gpccs_ucode,
+       .ppc_nr = 2,
 }.base;
 
        .mmio = nv108_graph_pack_mmio,
        .fecs.ucode = &nv108_graph_fecs_ucode,
        .gpccs.ucode = &nv108_graph_gpccs_ucode,
+       .ppc_nr = 1,
 }.base;
 
        struct nouveau_device *device = nv_device(parent);
        struct nvc0_graph_priv *priv;
        bool use_ext_fw, enable;
-       int ret, i;
+       int ret, i, j;
 
        use_ext_fw = nouveau_boolopt(device->cfgopt, "NvGrUseFW",
                                     oclass->fecs.ucode == NULL);
        for (i = 0; i < priv->gpc_nr; i++) {
                priv->tpc_nr[i]  = nv_rd32(priv, GPC_UNIT(i, 0x2608));
                priv->tpc_total += priv->tpc_nr[i];
+               priv->ppc_nr[i]  = oclass->ppc_nr;
+               for (j = 0; j < priv->ppc_nr[i]; j++) {
+                       u8 mask = nv_rd32(priv, GPC_UNIT(i, 0x0c30 + (j * 4)));
+                       priv->ppc_tpc_nr[i][j] = hweight8(mask);
+               }
        }
 
        /*XXX: these need figuring out... though it might not even matter */
 
        u8 gpc_nr;
        u8 tpc_nr[GPC_MAX];
        u8 tpc_total;
+       u8 ppc_nr[GPC_MAX];
+       u8 ppc_tpc_nr[GPC_MAX][4];
 
        struct nouveau_gpuobj *unk4188b4;
        struct nouveau_gpuobj *unk4188b8;
        struct {
                struct nvc0_graph_ucode *ucode;
        } gpccs;
+       int ppc_nr;
 };
 
 void nvc0_graph_mmio(struct nvc0_graph_priv *, const struct nvc0_graph_pack *);
 
        .mmio = nvd7_graph_pack_mmio,
        .fecs.ucode = &nvd7_graph_fecs_ucode,
        .gpccs.ucode = &nvd7_graph_gpccs_ucode,
+       .ppc_nr = 1,
 }.base;
 
        .mmio = nve4_graph_pack_mmio,
        .fecs.ucode = &nve4_graph_fecs_ucode,
        .gpccs.ucode = &nve4_graph_gpccs_ucode,
+       .ppc_nr = 1,
 }.base;
 
        .mmio = nvf0_graph_pack_mmio,
        .fecs.ucode = &nvf0_graph_fecs_ucode,
        .gpccs.ucode = &nvf0_graph_gpccs_ucode,
+       .ppc_nr = 2,
 }.base;