diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2011-01-03 21:41:37 -0500 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2011-01-06 23:03:58 -0500 |
commit | e457acaed4c56a6831b82365e17e8f42f1ee129c (patch) | |
tree | fe1d6ab6e926e118ad7dbdce56fa7a79671962c3 /drivers/gpu/drm/nouveau/nv40_graph.c | |
parent | eeb9cc015f91ff08453040dd5b2fde0dbaac90d3 (diff) |
drm/nouveau: create grctx on the fly on all chipsets
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nv40_graph.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nv40_graph.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nv40_graph.c b/drivers/gpu/drm/nouveau/nv40_graph.c index 0618846a97ce..19ef92a0375a 100644 --- a/drivers/gpu/drm/nouveau/nv40_graph.c +++ b/drivers/gpu/drm/nouveau/nv40_graph.c | |||
@@ -62,6 +62,7 @@ nv40_graph_create_context(struct nouveau_channel *chan) | |||
62 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 62 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
63 | struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph; | 63 | struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph; |
64 | struct nouveau_grctx ctx = {}; | 64 | struct nouveau_grctx ctx = {}; |
65 | unsigned long flags; | ||
65 | int ret; | 66 | int ret; |
66 | 67 | ||
67 | ret = nouveau_gpuobj_new(dev, chan, pgraph->grctx_size, 16, | 68 | ret = nouveau_gpuobj_new(dev, chan, pgraph->grctx_size, 16, |
@@ -76,6 +77,17 @@ nv40_graph_create_context(struct nouveau_channel *chan) | |||
76 | nv40_grctx_init(&ctx); | 77 | nv40_grctx_init(&ctx); |
77 | 78 | ||
78 | nv_wo32(chan->ramin_grctx, 0, chan->ramin_grctx->pinst); | 79 | nv_wo32(chan->ramin_grctx, 0, chan->ramin_grctx->pinst); |
80 | |||
81 | /* init grctx pointer in ramfc, and on PFIFO if channel is | ||
82 | * already active there | ||
83 | */ | ||
84 | spin_lock_irqsave(&dev_priv->context_switch_lock, flags); | ||
85 | nv_wo32(chan->ramfc, 0x38, chan->ramin_grctx->pinst >> 4); | ||
86 | nv_mask(dev, 0x002500, 0x00000001, 0x00000000); | ||
87 | if ((nv_rd32(dev, 0x003204) & 0x0000001f) == chan->id) | ||
88 | nv_wr32(dev, 0x0032e0, chan->ramin_grctx->pinst >> 4); | ||
89 | nv_mask(dev, 0x002500, 0x00000001, 0x00000001); | ||
90 | spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags); | ||
79 | return 0; | 91 | return 0; |
80 | } | 92 | } |
81 | 93 | ||