drm/gk104/gr: therm magic needed on some kepler boards
authorBen Skeggs <bskeggs@redhat.com>
Wed, 5 Mar 2014 04:46:48 +0000 (14:46 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 26 Mar 2014 04:08:16 +0000 (14:08 +1000)
Not needed everywhere, and potentially not safe to do depending on how
the rest of PTHERM is configured...

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/engine/graph/nve4.c

index 6e73b18..f7c0112 100644 (file)
@@ -189,6 +189,29 @@ nve4_graph_pack_mmio[] = {
  * PGRAPH engine/subdev functions
  ******************************************************************************/
 
+static int
+nve4_graph_fini(struct nouveau_object *object, bool suspend)
+{
+       struct nvc0_graph_priv *priv = (void *)object;
+
+       /*XXX: this is a nasty hack to power on gr on certain boards
+        *     where it's disabled by therm, somehow.  ideally it'd
+        *     be nice to know when we should be doing this, and why,
+        *     but, it's yet to be determined.  for now we test for
+        *     the particular mmio error that occurs in the situation,
+        *     and then bash therm in the way nvidia do.
+        */
+       nv_mask(priv, 0x000200, 0x08001000, 0x08001000);
+       nv_rd32(priv, 0x000200);
+       if (nv_rd32(priv, 0x400700) == 0xbadf1000) {
+               nv_mask(priv, 0x000200, 0x08001000, 0x00000000);
+               nv_rd32(priv, 0x000200);
+               nv_mask(priv, 0x020004, 0xc0000000, 0x40000000);
+       }
+
+       return nouveau_graph_fini(&priv->base, suspend);
+}
+
 int
 nve4_graph_init(struct nouveau_object *object)
 {
@@ -327,7 +350,7 @@ nve4_graph_oclass = &(struct nvc0_graph_oclass) {
                .ctor = nvc0_graph_ctor,
                .dtor = nvc0_graph_dtor,
                .init = nve4_graph_init,
-               .fini = _nouveau_graph_fini,
+               .fini = nve4_graph_fini,
        },
        .cclass = &nve4_grctx_oclass,
        .sclass = nve4_graph_sclass,