summary refs log tree commit diff
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2012-08-05 11:29:10 +1000
committerBen Skeggs <bskeggs@redhat.com>2012-10-03 13:13:00 +1000
commitb10f20d590aa040e4028c04a70a27b9ad6650ba8 (patch)
treedadda877d9850bcf67a17057e4c7ac5b02e2db2a
parent5999933f4de7de7bcaae4be87667b0cff57d6e45 (diff)
downloadlinux-b10f20d590aa040e4028c04a70a27b9ad6650ba8.tar.gz
drm/nvc0-/gr: remove reset-after-grctx-construction hack
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.c27
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c8
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/graph/nve0.c8
3 files changed, 9 insertions, 34 deletions
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.c b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.c
index c12e7668dbfe..0b7951a85943 100644
--- a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.c
+++ b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.c
@@ -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)
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c b/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c
index db8aefc3cf3e..e2f1bea53540 100644
--- a/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c
+++ b/drivers/gpu/drm/nouveau/core/engine/graph/nvc0.c
@@ -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;
 }
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nve0.c b/drivers/gpu/drm/nouveau/core/engine/graph/nve0.c
index c79748a6fa2b..7ef692b92e83 100644
--- a/drivers/gpu/drm/nouveau/core/engine/graph/nve0.c
+++ b/drivers/gpu/drm/nouveau/core/engine/graph/nve0.c
@@ -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;
 }