]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
drm/nvc0-/gr: remove reset-after-grctx-construction hack
authorBen Skeggs <bskeggs@redhat.com>
Sun, 5 Aug 2012 01:29:10 +0000 (11:29 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 3 Oct 2012 03:13:00 +0000 (13:13 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.c
drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c
drivers/gpu/drm/nouveau/core/engine/graph/nve0.c

index c12e7668dbfe5ecc12212b7a86cd10df61f3459a..0b7951a859434dc72f20bbc30b975ee58c22501c 100644 (file)
@@ -151,29 +151,16 @@ nvc0_grctx_fini(struct nvc0_grctx *info)
        struct nvc0_graph_priv *priv = info->priv;
        int i;
 
-       if (priv->firmware) {
-               nv_wr32(priv, 0x409840, 0x00000003);
-               nv_wr32(priv, 0x409500, 0x80000000 | info->chan->addr >> 12);
-               nv_wr32(priv, 0x409504, 0x00000009);
-               if (!nv_wait(priv, 0x409800, 0x00000001, 0x00000000)) {
-                       nv_error(priv, "unload_ctx timeout\n");
-                       return -EBUSY;
-               }
-
-               goto save;
-       }
-
-       /* HUB_FUC(CTX_SAVE) */
-       nv_wr32(priv, 0x409840, 0x80000000);
-       nv_wr32(priv, 0x409500, 0x80000000 | info->chan->addr >> 12);
-       nv_wr32(priv, 0x409504, 0x00000002);
-       if (!nv_wait(priv, 0x409800, 0x80000000, 0x80000000)) {
-               nv_error(priv, "HUB_CTX_SAVE timeout\n");
-               nvc0_graph_ctxctl_debug(priv);
+       /* trigger a context unload by unsetting the "next channel valid" bit
+        * and faking a context switch interrupt
+        */
+       nv_mask(priv, 0x409b04, 0x80000000, 0x00000000);
+       nv_wr32(priv, 0x409000, 0x00000100);
+       if (!nv_wait(priv, 0x409b00, 0x80000000, 0x00000000)) {
+               nv_error(priv, "grctx template channel unload timeout\n");
                return -EBUSY;
        }
 
-save:
        priv->data = kmalloc(priv->size, GFP_KERNEL);
        if (priv->data) {
                for (i = 0; i < priv->size; i += 4)
index db8aefc3cf3e413a106ea92085fc01496a6d1659..e2f1bea53540271ad885fc9f1253dd4470b38ba7 100644 (file)
@@ -707,8 +707,6 @@ nvc0_graph_init_ctxctl(struct nvc0_graph_priv *priv)
                        nv_error(priv, "failed to construct context\n");
                        return ret;
                }
-
-               return 1;
        }
 
        return 0;
@@ -720,7 +718,6 @@ nvc0_graph_init(struct nouveau_object *object)
        struct nvc0_graph_priv *priv = (void *)object;
        int ret;
 
-reset:
        ret = nouveau_graph_init(&priv->base);
        if (ret)
                return ret;
@@ -748,11 +745,8 @@ reset:
        nv_wr32(priv, 0x400054, 0x34ce3464);
 
        ret = nvc0_graph_init_ctxctl(priv);
-       if (ret) {
-               if (ret == 1)
-                       goto reset;
+       if (ret)
                return ret;
-       }
 
        return 0;
 }
index c79748a6fa2bd573829c9c621c164eabd247ac61..7ef692b92e83530af31351b26b50cf9c48c99217 100644 (file)
@@ -457,8 +457,6 @@ nve0_graph_init_ctxctl(struct nvc0_graph_priv *priv)
                        nv_error(priv, "failed to construct context\n");
                        return ret;
                }
-
-               return 1;
        }
 
        return 0;
@@ -470,7 +468,6 @@ nve0_graph_init(struct nouveau_object *object)
        struct nvc0_graph_priv *priv = (void *)object;
        int ret;
 
-reset:
        ret = nouveau_graph_init(&priv->base);
        if (ret)
                return ret;
@@ -496,11 +493,8 @@ reset:
        nv_wr32(priv, 0x400054, 0x34ce3464);
 
        ret = nve0_graph_init_ctxctl(priv);
-       if (ret) {
-               if (ret == 1)
-                       goto reset;
+       if (ret)
                return ret;
-       }
 
        return 0;
 }