drm/nv50/gr: enable ctxprog xfer only when we need it to save power
authorMartin Peres <martin.peres@ensi-bourges.fr>
Sat, 30 Jul 2011 21:08:45 +0000 (23:08 +0200)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 20 Sep 2011 06:11:28 +0000 (16:11 +1000)
This patch adds instructions to ctxprog and by doing, impacts context
switching performance.  My testcase showed a 1% performance cost using
glxgears that is a context-switch bound application.

Please test and report bugs/performance/power/other.

Many thanks to Maxim Levitsky for his dedicated work on lowering power
consumption with nouveau.

More patches are coming thanks to his work:

https://bugs.freedesktop.org/show_bug.cgi?id=37922

Signed-off-by: Martin Peres <martin.peres@ensi-bourges.fr>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nv50_grctx.c

index e04fb4483c5ee653c1bd1a7727890ba6b9558c89..d05c2c3b244491001dbcba21c2d3dc32fc3a7d59 100644 (file)
@@ -40,6 +40,9 @@
 #define CP_FLAG_UNK0B                 ((0 * 32) + 0xb)
 #define CP_FLAG_UNK0B_CLEAR           0
 #define CP_FLAG_UNK0B_SET             1
+#define CP_FLAG_XFER_SWITCH           ((0 * 32) + 0xe)
+#define CP_FLAG_XFER_SWITCH_DISABLE   0
+#define CP_FLAG_XFER_SWITCH_ENABLE    1
 #define CP_FLAG_STATE                 ((0 * 32) + 0x1c)
 #define CP_FLAG_STATE_STOPPED         0
 #define CP_FLAG_STATE_RUNNING         1
@@ -199,6 +202,7 @@ nv50_grctx_init(struct nouveau_grctx *ctx)
        }
 
        cp_set (ctx, STATE, RUNNING);
+       cp_set (ctx, XFER_SWITCH, ENABLE);
        /* decide whether we're loading/unloading the context */
        cp_bra (ctx, AUTO_SAVE, PENDING, cp_setup_save);
        cp_bra (ctx, USER_SAVE, PENDING, cp_setup_save);
@@ -265,6 +269,7 @@ nv50_grctx_init(struct nouveau_grctx *ctx)
        cp_name(ctx, cp_exit);
        cp_set (ctx, USER_SAVE, NOT_PENDING);
        cp_set (ctx, USER_LOAD, NOT_PENDING);
+       cp_set (ctx, XFER_SWITCH, DISABLE);
        cp_set (ctx, STATE, STOPPED);
        cp_out (ctx, CP_END);
        ctx->ctxvals_pos += 0x400; /* padding... no idea why you need it */