gf100_grctx_patch_wr32(chan, 0x4064c4, ((alpha / 4) << 16) | max_batches);
 
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
-               for (ppc = 0; ppc < gr->ppc_nr[gpc]; ppc++) {
+               for (ppc = 0; ppc < gr->func->ppc_nr; ppc++) {
                        const u32 a = alpha * gr->ppc_tpc_nr[gpc][ppc];
                        const u32 b =  beta * gr->ppc_tpc_nr[gpc][ppc];
                        const u32 t = timeslice_mode;
 
        gf100_grctx_patch_wr32(chan, 0x4064c4, ((alpha / 4) << 16) | max_batches);
 
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
-               for (ppc = 0; ppc < gr->ppc_nr[gpc]; ppc++, n++) {
+               for (ppc = 0; ppc < gr->func->ppc_nr; ppc++, n++) {
                        const u32 as =  alpha * gr->ppc_tpc_nr[gpc][ppc];
                        const u32 bs = attrib * gr->ppc_tpc_nr[gpc][ppc];
                        const u32 u = 0x418ea0 + (n * 0x04);
 
        int gpc, ppc, i;
 
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
-               for (ppc = 0; ppc < gr->ppc_nr[gpc]; ppc++) {
+               for (ppc = 0; ppc < gr->func->ppc_nr; ppc++) {
                        u8 ppc_tpcs = gr->ppc_tpc_nr[gpc][ppc];
                        u8 ppc_tpcm = gr->ppc_tpc_mask[gpc][ppc];
                        while (ppc_tpcs-- > gr->ppc_tpc_min)
 
        gf100_grctx_patch_wr32(chan, 0x4064c4, ((alpha / 4) << 16) | max_batches);
 
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
-               for (ppc = 0; ppc < gr->ppc_nr[gpc]; ppc++, n++) {
+               for (ppc = 0; ppc < gr->func->ppc_nr; ppc++, n++) {
                        const u32 as =  alpha * gr->ppc_tpc_nr[gpc][ppc];
                        const u32 bs = attrib * gr->ppc_tpc_max;
                        const u32 u = 0x418ea0 + (n * 0x04);
 
        gf100_grctx_patch_wr32(chan, 0x4064c4, ((alpha / 4) << 16) | max_batches);
 
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
-               for (ppc = 0; ppc < gr->ppc_nr[gpc]; ppc++, n++) {
+               for (ppc = 0; ppc < gr->func->ppc_nr; ppc++, n++) {
                        const u32 as =  alpha * gr->ppc_tpc_nr[gpc][ppc];
                        const u32 bs = attrib * gr->ppc_tpc_max;
                        const u32 gs =   gfxp * gr->ppc_tpc_max;
 
        gf100_grctx_patch_wr32(chan, 0x40585c, alpha);
 
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
-               for (ppc = 0; ppc < gr->ppc_nr[gpc]; ppc++, n++) {
+               for (ppc = 0; ppc < gr->func->ppc_nr; ppc++, n++) {
                        const u32 as =  alpha * gr->ppc_tpc_nr[gpc][ppc];
                        const u32 bs = attrib * gr->ppc_tpc_max;
                        const u32 gs =   gfxp * gr->ppc_tpc_max;
 
                gr->tpc_nr[i]  = nvkm_rd32(device, GPC_UNIT(i, 0x2608));
                gr->tpc_max = max(gr->tpc_max, gr->tpc_nr[i]);
                gr->tpc_total += gr->tpc_nr[i];
-               gr->ppc_nr[i]  = gr->func->ppc_nr;
-               for (j = 0; j < gr->ppc_nr[i]; j++) {
+               for (j = 0; j < gr->func->ppc_nr; j++) {
                        gr->ppc_tpc_mask[i][j] =
                                nvkm_rd32(device, GPC_UNIT(i, 0x0c30 + (j * 4)));
                        if (gr->ppc_tpc_mask[i][j] == 0)
                                continue;
+
+                       gr->ppc_nr[i]++;
+
                        gr->ppc_mask[i] |= (1 << j);
                        gr->ppc_tpc_nr[i][j] = hweight8(gr->ppc_tpc_mask[i][j]);
                        if (gr->ppc_tpc_min == 0 ||
 
        int gpc, ppc;
 
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
-               for (ppc = 0; ppc < gr->ppc_nr[gpc]; ppc++) {
+               for (ppc = 0; ppc < gr->func->ppc_nr; ppc++) {
                        if (!(gr->ppc_mask[gpc] & (1 << ppc)))
                                continue;
                        nvkm_wr32(device, PPC_UNIT(gpc, ppc, 0x038), 0xc0000000);