16ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs/*
26ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * Copyright (C) 2007 Ben Skeggs.
36ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs *
46ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * All Rights Reserved.
56ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs *
66ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * Permission is hereby granted, free of charge, to any person obtaining
76ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * a copy of this software and associated documentation files (the
86ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * "Software"), to deal in the Software without restriction, including
96ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * without limitation the rights to use, copy, modify, merge, publish,
106ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * distribute, sublicense, and/or sell copies of the Software, and to
116ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * permit persons to whom the Software is furnished to do so, subject to
126ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * the following conditions:
136ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs *
146ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * The above copyright notice and this permission notice (including the
156ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * next paragraph) shall be included in all copies or substantial
166ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * portions of the Software.
176ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs *
186ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
196ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
206ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
216ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
226ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
236ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
246ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
256ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs *
266ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs */
276ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
286ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs#include "drmP.h"
296ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs#include "drm.h"
30a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs
316ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs#include "nouveau_drv.h"
32a11c3198c9ba38d81e25b65e3908d531feba1372Ben Skeggs#include "nouveau_vm.h"
336ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
34f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs#define BAR1_VM_BASE 0x0020000000ULL
35f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs#define BAR1_VM_SIZE pci_resource_len(dev->pdev, 1)
36f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs#define BAR3_VM_BASE 0x0000000000ULL
37f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs#define BAR3_VM_SIZE pci_resource_len(dev->pdev, 3)
38f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs
396ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggsstruct nv50_instmem_priv {
406ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	uint32_t save1700[5]; /* 0x1700->0x1710 */
416ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
42f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	struct nouveau_gpuobj *bar1_dmaobj;
43f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	struct nouveau_gpuobj *bar3_dmaobj;
446ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs};
456ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
46fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggsstatic void
47fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggsnv50_channel_del(struct nouveau_channel **pchan)
48fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs{
49fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	struct nouveau_channel *chan;
506ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
51fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	chan = *pchan;
52fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	*pchan = NULL;
53fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	if (!chan)
54fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		return;
55fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs
56fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	nouveau_gpuobj_ref(NULL, &chan->ramfc);
57f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	nouveau_vm_ref(NULL, &chan->vm, chan->vm_pd);
58fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	nouveau_gpuobj_ref(NULL, &chan->vm_pd);
5931a5b8ce8f3bf20799eb68da9602de2bee58fdd3Daniel Vetter	if (drm_mm_initialized(&chan->ramin_heap))
60fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		drm_mm_takedown(&chan->ramin_heap);
61fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	nouveau_gpuobj_ref(NULL, &chan->ramin);
62fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	kfree(chan);
63fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs}
64fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs
65fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggsstatic int
66f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggsnv50_channel_new(struct drm_device *dev, u32 size, struct nouveau_vm *vm,
67fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		 struct nouveau_channel **pchan)
68fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs{
69fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
70fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	u32 pgd = (dev_priv->chipset == 0x50) ? 0x1400 : 0x0200;
71fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	u32  fc = (dev_priv->chipset == 0x50) ? 0x0000 : 0x4200;
72fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	struct nouveau_channel *chan;
73f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	int ret, i;
74fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs
75fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	chan = kzalloc(sizeof(*chan), GFP_KERNEL);
76fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	if (!chan)
77fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		return -ENOMEM;
78fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	chan->dev = dev;
79fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs
80fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	ret = nouveau_gpuobj_new(dev, NULL, size, 0x1000, 0, &chan->ramin);
81fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	if (ret) {
82fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		nv50_channel_del(&chan);
83fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		return ret;
84fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	}
85fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs
86fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	ret = drm_mm_init(&chan->ramin_heap, 0x6000, chan->ramin->size);
87fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	if (ret) {
88fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		nv50_channel_del(&chan);
89fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		return ret;
90fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	}
91fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs
92fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	ret = nouveau_gpuobj_new_fake(dev, chan->ramin->pinst == ~0 ? ~0 :
93fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs				      chan->ramin->pinst + pgd,
94fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs				      chan->ramin->vinst + pgd,
95fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs				      0x4000, NVOBJ_FLAG_ZERO_ALLOC,
96fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs				      &chan->vm_pd);
97fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	if (ret) {
98fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		nv50_channel_del(&chan);
99fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		return ret;
100fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	}
101fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs
102f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	for (i = 0; i < 0x4000; i += 8) {
103f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		nv_wo32(chan->vm_pd, i + 0, 0x00000000);
104f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		nv_wo32(chan->vm_pd, i + 4, 0xdeadcafe);
105f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	}
106f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs
107f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	ret = nouveau_vm_ref(vm, &chan->vm, chan->vm_pd);
108f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	if (ret) {
109f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		nv50_channel_del(&chan);
110f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		return ret;
111f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	}
112f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs
113fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	ret = nouveau_gpuobj_new_fake(dev, chan->ramin->pinst == ~0 ? ~0 :
114fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs				      chan->ramin->pinst + fc,
115fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs				      chan->ramin->vinst + fc, 0x100,
116fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs				      NVOBJ_FLAG_ZERO_ALLOC, &chan->ramfc);
117fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	if (ret) {
118fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		nv50_channel_del(&chan);
119fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		return ret;
120fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	}
121fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs
122fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	*pchan = chan;
123fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	return 0;
124fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs}
1256ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
1266ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggsint
1276ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggsnv50_instmem_init(struct drm_device *dev)
1286ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs{
1296ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
1306ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	struct nv50_instmem_priv *priv;
131fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	struct nouveau_channel *chan;
132f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	struct nouveau_vm *vm;
1336ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	int ret, i;
134fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	u32 tmp;
1356ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
1366ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
1376ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	if (!priv)
1386ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs		return -ENOMEM;
1396ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	dev_priv->engine.instmem.priv = priv;
1406ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
1416ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	/* Save state, will restore at takedown. */
1426ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	for (i = 0x1700; i <= 0x1710; i += 4)
1436ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs		priv->save1700[(i-0x1700)/4] = nv_rd32(dev, i);
1446ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
145fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	/* Global PRAMIN heap */
146fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	ret = drm_mm_init(&dev_priv->ramin_heap, 0, dev_priv->ramin_size);
147fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	if (ret) {
148fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		NV_ERROR(dev, "Failed to init RAMIN heap\n");
149f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		goto error;
150fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	}
151615661f3948a066fd22a36fe8ea0c528b75ee373Marcin Slusarz
152f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	/* BAR3 */
153f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	ret = nouveau_vm_new(dev, BAR3_VM_BASE, BAR3_VM_SIZE, BAR3_VM_BASE,
1543ee0128140eed7d32b785a335099a2ec38258283Ben Skeggs			     &dev_priv->bar3_vm);
1556ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	if (ret)
156f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		goto error;
1576ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
158f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	ret = nouveau_gpuobj_new(dev, NULL, (BAR3_VM_SIZE >> 12) * 8,
159f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs				 0x1000, NVOBJ_FLAG_DONT_MAP |
160f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs				 NVOBJ_FLAG_ZERO_ALLOC,
1613ee0128140eed7d32b785a335099a2ec38258283Ben Skeggs				 &dev_priv->bar3_vm->pgt[0].obj[0]);
1626ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	if (ret)
163f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		goto error;
1643ee0128140eed7d32b785a335099a2ec38258283Ben Skeggs	dev_priv->bar3_vm->pgt[0].refcount[0] = 1;
1656ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
1663ee0128140eed7d32b785a335099a2ec38258283Ben Skeggs	nv50_instmem_map(dev_priv->bar3_vm->pgt[0].obj[0]);
1676ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
168f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	ret = nv50_channel_new(dev, 128 * 1024, dev_priv->bar3_vm, &chan);
1696ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	if (ret)
170f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		goto error;
171f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	dev_priv->channels.ptr[0] = dev_priv->channels.ptr[127] = chan;
172fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs
173f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	ret = nv50_gpuobj_dma_new(chan, 0x0000, BAR3_VM_BASE, BAR3_VM_SIZE,
174f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs				  NV_MEM_TARGET_VM, NV_MEM_ACCESS_VM,
175f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs				  NV_MEM_TYPE_VM, NV_MEM_COMP_VM,
176f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs				  &priv->bar3_dmaobj);
177f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	if (ret)
178f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		goto error;
1796ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
180fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	nv_wr32(dev, 0x001704, 0x00000000 | (chan->ramin->vinst >> 12));
181fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	nv_wr32(dev, 0x001704, 0x40000000 | (chan->ramin->vinst >> 12));
182f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	nv_wr32(dev, 0x00170c, 0x80000000 | (priv->bar3_dmaobj->cinst >> 4));
18376befb8c30cebe2af83fa346bdaf75b430893511Ben Skeggs
184c45aadabb961501b3e64bc92d0bf12fdce26d37dFrancisco Jerez	dev_priv->engine.instmem.flush(dev);
185c45aadabb961501b3e64bc92d0bf12fdce26d37dFrancisco Jerez	dev_priv->ramin_available = true;
186c45aadabb961501b3e64bc92d0bf12fdce26d37dFrancisco Jerez
187c45aadabb961501b3e64bc92d0bf12fdce26d37dFrancisco Jerez	tmp = nv_ro32(chan->ramin, 0);
188c45aadabb961501b3e64bc92d0bf12fdce26d37dFrancisco Jerez	nv_wo32(chan->ramin, 0, ~tmp);
189c45aadabb961501b3e64bc92d0bf12fdce26d37dFrancisco Jerez	if (nv_ro32(chan->ramin, 0) != ~tmp) {
190fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs		NV_ERROR(dev, "PRAMIN readback failed\n");
191f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		ret = -EIO;
192f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		goto error;
19376befb8c30cebe2af83fa346bdaf75b430893511Ben Skeggs	}
194c45aadabb961501b3e64bc92d0bf12fdce26d37dFrancisco Jerez	nv_wo32(chan->ramin, 0, tmp);
195fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs
196f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	/* BAR1 */
1973ee0128140eed7d32b785a335099a2ec38258283Ben Skeggs	ret = nouveau_vm_new(dev, BAR1_VM_BASE, BAR1_VM_SIZE, BAR1_VM_BASE, &vm);
198f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	if (ret)
199f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		goto error;
200f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs
201f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	ret = nouveau_vm_ref(vm, &dev_priv->bar1_vm, chan->vm_pd);
202f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	if (ret)
203f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		goto error;
204f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	nouveau_vm_ref(NULL, &vm, NULL);
205f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs
206f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	ret = nv50_gpuobj_dma_new(chan, 0x0000, BAR1_VM_BASE, BAR1_VM_SIZE,
207f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs				  NV_MEM_TARGET_VM, NV_MEM_ACCESS_VM,
208f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs				  NV_MEM_TYPE_VM, NV_MEM_COMP_VM,
209f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs				  &priv->bar1_dmaobj);
210f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	if (ret)
211f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		goto error;
212f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs
213f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	nv_wr32(dev, 0x001708, 0x80000000 | (priv->bar1_dmaobj->cinst >> 4));
214f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	for (i = 0; i < 8; i++)
215f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		nv_wr32(dev, 0x1900 + (i*4), 0);
216f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs
217b571fe21f5c24760368b3fb927af5a7384d7721bBen Skeggs	/* Create shared channel VM, space is reserved at the beginning
218b571fe21f5c24760368b3fb927af5a7384d7721bBen Skeggs	 * to catch "NULL pointer" references
2194c1361429841344ce4d164492ee7620cf3286eb7Ben Skeggs	 */
220b571fe21f5c24760368b3fb927af5a7384d7721bBen Skeggs	ret = nouveau_vm_new(dev, 0, (1ULL << 40), 0x0020000000ULL,
2213ee0128140eed7d32b785a335099a2ec38258283Ben Skeggs			     &dev_priv->chan_vm);
2224c1361429841344ce4d164492ee7620cf3286eb7Ben Skeggs	if (ret)
2234c1361429841344ce4d164492ee7620cf3286eb7Ben Skeggs		return ret;
2246ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
2256ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	return 0;
226f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs
227f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggserror:
228f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	nv50_instmem_takedown(dev);
229f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	return ret;
2306ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs}
2316ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
2326ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggsvoid
2336ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggsnv50_instmem_takedown(struct drm_device *dev)
2346ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs{
2356ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
2366ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	struct nv50_instmem_priv *priv = dev_priv->engine.instmem.priv;
237cff5c1332486ced8ff4180e957e04983cb72a39eBen Skeggs	struct nouveau_channel *chan = dev_priv->channels.ptr[0];
2386ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	int i;
2396ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
2406ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	NV_DEBUG(dev, "\n");
2416ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
2426ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	if (!priv)
2436ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs		return;
2446ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
245fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs	dev_priv->ramin_available = false;
246fbd2895e45aebdb3d3ea73a3a796cf3bb9c912daBen Skeggs
2474c1361429841344ce4d164492ee7620cf3286eb7Ben Skeggs	nouveau_vm_ref(NULL, &dev_priv->chan_vm, NULL);
248f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs
2496ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	for (i = 0x1700; i <= 0x1710; i += 4)
2506ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs		nv_wr32(dev, i, priv->save1700[(i - 0x1700) / 4]);
2516ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
252f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	nouveau_gpuobj_ref(NULL, &priv->bar3_dmaobj);
253f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	nouveau_gpuobj_ref(NULL, &priv->bar1_dmaobj);
2546ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
255f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	nouveau_vm_ref(NULL, &dev_priv->bar1_vm, chan->vm_pd);
256f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	dev_priv->channels.ptr[127] = 0;
257f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	nv50_channel_del(&dev_priv->channels.ptr[0]);
2586ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
2593ee0128140eed7d32b785a335099a2ec38258283Ben Skeggs	nouveau_gpuobj_ref(NULL, &dev_priv->bar3_vm->pgt[0].obj[0]);
260f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	nouveau_vm_ref(NULL, &dev_priv->bar3_vm, NULL);
261f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs
26231a5b8ce8f3bf20799eb68da9602de2bee58fdd3Daniel Vetter	if (drm_mm_initialized(&dev_priv->ramin_heap))
263f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		drm_mm_takedown(&dev_priv->ramin_heap);
2646ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
2656ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	dev_priv->engine.instmem.priv = NULL;
2666ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	kfree(priv);
2676ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs}
2686ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
2696ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggsint
2706ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggsnv50_instmem_suspend(struct drm_device *dev)
2716ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs{
2726ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
2736ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
274dc1e5c0dbff27c2b5147eaea16c578d2337870c3Ben Skeggs	dev_priv->ramin_available = false;
2756ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	return 0;
2766ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs}
2776ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
2786ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggsvoid
2796ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggsnv50_instmem_resume(struct drm_device *dev)
2806ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs{
2816ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
2826ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	struct nv50_instmem_priv *priv = dev_priv->engine.instmem.priv;
283cff5c1332486ced8ff4180e957e04983cb72a39eBen Skeggs	struct nouveau_channel *chan = dev_priv->channels.ptr[0];
2846ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	int i;
2856ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
2866ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	/* Poke the relevant regs, and pray it works :) */
287a8eaebc6c52bb0cd243b4cb421068f42d378be9cBen Skeggs	nv_wr32(dev, NV50_PUNK_BAR_CFG_BASE, (chan->ramin->vinst >> 12));
2886ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	nv_wr32(dev, NV50_PUNK_UNK1710, 0);
289a8eaebc6c52bb0cd243b4cb421068f42d378be9cBen Skeggs	nv_wr32(dev, NV50_PUNK_BAR_CFG_BASE, (chan->ramin->vinst >> 12) |
2906ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs					 NV50_PUNK_BAR_CFG_BASE_VALID);
291f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	nv_wr32(dev, NV50_PUNK_BAR1_CTXDMA, (priv->bar1_dmaobj->cinst >> 4) |
2926ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs					NV50_PUNK_BAR1_CTXDMA_VALID);
293f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	nv_wr32(dev, NV50_PUNK_BAR3_CTXDMA, (priv->bar3_dmaobj->cinst >> 4) |
2946ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs					NV50_PUNK_BAR3_CTXDMA_VALID);
2956ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
2966ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	for (i = 0; i < 8; i++)
2976ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs		nv_wr32(dev, 0x1900 + (i*4), 0);
298dc1e5c0dbff27c2b5147eaea16c578d2337870c3Ben Skeggs
299dc1e5c0dbff27c2b5147eaea16c578d2337870c3Ben Skeggs	dev_priv->ramin_available = true;
3006ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs}
3016ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
302e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggsstruct nv50_gpuobj_node {
303d5f423947a11103c43ad26ebb680d049c2d8edd6Ben Skeggs	struct nouveau_mem *vram;
30434cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs	struct nouveau_vma chan_vma;
305e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs	u32 align;
306e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs};
307e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs
3086ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggsint
3096e32fedc8b50d3571bdec4e9849e45659ac96599Ben Skeggsnv50_instmem_get(struct nouveau_gpuobj *gpuobj, struct nouveau_channel *chan,
3106e32fedc8b50d3571bdec4e9849e45659ac96599Ben Skeggs		 u32 size, u32 align)
3116ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs{
312e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs	struct drm_device *dev = gpuobj->dev;
31334cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
31460d2a88ae896ae51c76f8b15c2f4b762d5b00864Ben Skeggs	struct nouveau_vram_engine *vram = &dev_priv->engine.vram;
315e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs	struct nv50_gpuobj_node *node = NULL;
3166ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	int ret;
3176ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
318e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs	node = kzalloc(sizeof(*node), GFP_KERNEL);
319e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs	if (!node)
320e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs		return -ENOMEM;
321e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs	node->align = align;
3226ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
323f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	size  = (size + 4095) & ~4095;
324f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	align = max(align, (u32)4096);
3256ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
32660d2a88ae896ae51c76f8b15c2f4b762d5b00864Ben Skeggs	ret = vram->get(dev, size, align, 0, 0, &node->vram);
3276ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	if (ret) {
328f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		kfree(node);
3296ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs		return ret;
3306ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	}
3316ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
332f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	gpuobj->vinst = node->vram->offset;
33334cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs
33434cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs	if (gpuobj->flags & NVOBJ_FLAG_VM) {
335c906ca0fbf237b77ba2101a2fa9050317137fde8Ben Skeggs		u32 flags = NV_MEM_ACCESS_RW;
336c906ca0fbf237b77ba2101a2fa9050317137fde8Ben Skeggs		if (!(gpuobj->flags & NVOBJ_FLAG_VM_USER))
337c906ca0fbf237b77ba2101a2fa9050317137fde8Ben Skeggs			flags |= NV_MEM_ACCESS_SYS;
338c906ca0fbf237b77ba2101a2fa9050317137fde8Ben Skeggs
3396e32fedc8b50d3571bdec4e9849e45659ac96599Ben Skeggs		ret = nouveau_vm_get(chan->vm, size, 12, flags,
34034cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs				     &node->chan_vma);
34134cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs		if (ret) {
34260d2a88ae896ae51c76f8b15c2f4b762d5b00864Ben Skeggs			vram->put(dev, &node->vram);
34334cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs			kfree(node);
34434cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs			return ret;
34534cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs		}
34634cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs
34734cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs		nouveau_vm_map(&node->chan_vma, node->vram);
348f8522fc80f2e0392fc44b069f61721bd25907270Ben Skeggs		gpuobj->linst = node->chan_vma.offset;
34934cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs	}
35034cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs
35134cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs	gpuobj->size = size;
35234cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs	gpuobj->node = node;
3536ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	return 0;
3546ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs}
3556ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
3566ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggsvoid
357e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggsnv50_instmem_put(struct nouveau_gpuobj *gpuobj)
3586ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs{
359f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	struct drm_device *dev = gpuobj->dev;
36060d2a88ae896ae51c76f8b15c2f4b762d5b00864Ben Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
36160d2a88ae896ae51c76f8b15c2f4b762d5b00864Ben Skeggs	struct nouveau_vram_engine *vram = &dev_priv->engine.vram;
362e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs	struct nv50_gpuobj_node *node;
3636ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
364e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs	node = gpuobj->node;
365e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs	gpuobj->node = NULL;
366e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs
36734cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs	if (node->chan_vma.node) {
36834cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs		nouveau_vm_unmap(&node->chan_vma);
36934cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs		nouveau_vm_put(&node->chan_vma);
37034cf01bc4b8021cef62cbd79224577c13d01b106Ben Skeggs	}
37160d2a88ae896ae51c76f8b15c2f4b762d5b00864Ben Skeggs	vram->put(dev, &node->vram);
372e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs	kfree(node);
3736ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs}
3746ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
3756ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggsint
376e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggsnv50_instmem_map(struct nouveau_gpuobj *gpuobj)
3776ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs{
378e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs	struct drm_nouveau_private *dev_priv = gpuobj->dev->dev_private;
379e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs	struct nv50_gpuobj_node *node = gpuobj->node;
380f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	int ret;
3816ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
382f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	ret = nouveau_vm_get(dev_priv->bar3_vm, gpuobj->size, 12,
383f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs			     NV_MEM_ACCESS_RW, &node->vram->bar_vma);
384f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	if (ret)
385f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		return ret;
3866ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
387f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	nouveau_vm_map(&node->vram->bar_vma, node->vram);
388f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	gpuobj->pinst = node->vram->bar_vma.offset;
3896ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	return 0;
3906ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs}
3916ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
392e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggsvoid
393e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggsnv50_instmem_unmap(struct nouveau_gpuobj *gpuobj)
3946ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs{
395e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs	struct nv50_gpuobj_node *node = gpuobj->node;
3966ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
397f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs	if (node->vram->bar_vma.node) {
398f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		nouveau_vm_unmap(&node->vram->bar_vma);
399f869ef882382a4b6cb42d259e399aeec3781d4bbBen Skeggs		nouveau_vm_put(&node->vram->bar_vma);
4006ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs	}
4016ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs}
4026ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
4036ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggsvoid
404f56cb86f9abd229418f894a8ffedfb9ff465c181Ben Skeggsnv50_instmem_flush(struct drm_device *dev)
4056ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs{
4066f70a4c3d19e8e8e1047a4dbf0ca910fed39f619Ben Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
40704eb34a43ce5168e05e2748bd46a62a09289cddeBen Skeggs	unsigned long flags;
4086f70a4c3d19e8e8e1047a4dbf0ca910fed39f619Ben Skeggs
40904eb34a43ce5168e05e2748bd46a62a09289cddeBen Skeggs	spin_lock_irqsave(&dev_priv->vm_lock, flags);
410734ee8357ac2685a306acd598826d5eb8a3fca30Ben Skeggs	nv_wr32(dev, 0x00330c, 0x00000001);
4114b5c152a79d512803ea525b0878ccef627cd1629Francisco Jerez	if (!nv_wait(dev, 0x00330c, 0x00000002, 0x00000000))
412734ee8357ac2685a306acd598826d5eb8a3fca30Ben Skeggs		NV_ERROR(dev, "PRAMIN flush timeout\n");
41304eb34a43ce5168e05e2748bd46a62a09289cddeBen Skeggs	spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
414734ee8357ac2685a306acd598826d5eb8a3fca30Ben Skeggs}
415734ee8357ac2685a306acd598826d5eb8a3fca30Ben Skeggs
416734ee8357ac2685a306acd598826d5eb8a3fca30Ben Skeggsvoid
417734ee8357ac2685a306acd598826d5eb8a3fca30Ben Skeggsnv84_instmem_flush(struct drm_device *dev)
418734ee8357ac2685a306acd598826d5eb8a3fca30Ben Skeggs{
4196f70a4c3d19e8e8e1047a4dbf0ca910fed39f619Ben Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
42004eb34a43ce5168e05e2748bd46a62a09289cddeBen Skeggs	unsigned long flags;
4216f70a4c3d19e8e8e1047a4dbf0ca910fed39f619Ben Skeggs
42204eb34a43ce5168e05e2748bd46a62a09289cddeBen Skeggs	spin_lock_irqsave(&dev_priv->vm_lock, flags);
423f56cb86f9abd229418f894a8ffedfb9ff465c181Ben Skeggs	nv_wr32(dev, 0x070000, 0x00000001);
4244b5c152a79d512803ea525b0878ccef627cd1629Francisco Jerez	if (!nv_wait(dev, 0x070000, 0x00000002, 0x00000000))
425f56cb86f9abd229418f894a8ffedfb9ff465c181Ben Skeggs		NV_ERROR(dev, "PRAMIN flush timeout\n");
42604eb34a43ce5168e05e2748bd46a62a09289cddeBen Skeggs	spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
4276ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs}
4286ee738610f41b59733f63718f0bdbcba7d3a3f12Ben Skeggs
429