14b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs/*
24b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * Copyright 2010 Red Hat Inc.
34b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs *
44b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a
54b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * copy of this software and associated documentation files (the "Software"),
64b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * to deal in the Software without restriction, including without limitation
74b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
84b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the
94b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * Software is furnished to do so, subject to the following conditions:
104b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs *
114b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * The above copyright notice and this permission notice shall be included in
124b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * all copies or substantial portions of the Software.
134b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs *
144b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
154b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
164b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
174b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
184b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
194b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
204b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * OTHER DEALINGS IN THE SOFTWARE.
214b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs *
224b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs * Authors: Ben Skeggs
234b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs */
244b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs
254b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs#include "drmP.h"
264b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs
274b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs#include "nouveau_drv.h"
288984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs#include "nouveau_vm.h"
294b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs
308984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggsstruct nvc0_instmem_priv {
318984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct nouveau_gpuobj  *bar1_pgd;
328984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct nouveau_channel *bar1;
338984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct nouveau_gpuobj  *bar3_pgd;
348984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct nouveau_channel *bar3;
35e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs};
36e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs
374b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggsint
388984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggsnvc0_instmem_suspend(struct drm_device *dev)
394b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs{
408984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
4168b83a939cf8ed5466d11b7e9bfaa1dd22c11469Ben Skeggs
428984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	dev_priv->ramin_available = false;
434b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs	return 0;
444b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs}
454b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs
464b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggsvoid
478984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggsnvc0_instmem_resume(struct drm_device *dev)
484b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs{
498984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
508984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct nvc0_instmem_priv *priv = dev_priv->engine.instmem.priv;
51e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs
528984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nv_mask(dev, 0x100c80, 0x00000001, 0x00000000);
538984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nv_wr32(dev, 0x001704, 0x80000000 | priv->bar1->ramin->vinst >> 12);
548984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nv_wr32(dev, 0x001714, 0xc0000000 | priv->bar3->ramin->vinst >> 12);
558984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	dev_priv->ramin_available = true;
564b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs}
574b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs
588984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggsstatic void
598984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggsnvc0_channel_del(struct nouveau_channel **pchan)
604b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs{
618984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct nouveau_channel *chan;
6268b83a939cf8ed5466d11b7e9bfaa1dd22c11469Ben Skeggs
638984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	chan = *pchan;
648984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	*pchan = NULL;
658984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (!chan)
668984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		return;
6768b83a939cf8ed5466d11b7e9bfaa1dd22c11469Ben Skeggs
688984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nouveau_vm_ref(NULL, &chan->vm, NULL);
6931a5b8ce8f3bf20799eb68da9602de2bee58fdd3Daniel Vetter	if (drm_mm_initialized(&chan->ramin_heap))
708984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		drm_mm_takedown(&chan->ramin_heap);
718984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nouveau_gpuobj_ref(NULL, &chan->ramin);
728984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	kfree(chan);
734b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs}
744b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs
758984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggsstatic int
768984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggsnvc0_channel_new(struct drm_device *dev, u32 size, struct nouveau_vm *vm,
778984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		 struct nouveau_channel **pchan,
788984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		 struct nouveau_gpuobj *pgd, u64 vm_size)
794b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs{
808984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct nouveau_channel *chan;
818984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	int ret;
82e41115d0ad5c40a7ea4d85b1c77b4c02185a5581Ben Skeggs
838984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	chan = kzalloc(sizeof(*chan), GFP_KERNEL);
848984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (!chan)
858984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		return -ENOMEM;
868984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	chan->dev = dev;
8768b83a939cf8ed5466d11b7e9bfaa1dd22c11469Ben Skeggs
888984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	ret = nouveau_gpuobj_new(dev, NULL, size, 0x1000, 0, &chan->ramin);
898984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (ret) {
908984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		nvc0_channel_del(&chan);
918984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		return ret;
928984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	}
9368b83a939cf8ed5466d11b7e9bfaa1dd22c11469Ben Skeggs
948984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	ret = drm_mm_init(&chan->ramin_heap, 0x1000, size - 0x1000);
958984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (ret) {
968984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		nvc0_channel_del(&chan);
978984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		return ret;
9868b83a939cf8ed5466d11b7e9bfaa1dd22c11469Ben Skeggs	}
9968b83a939cf8ed5466d11b7e9bfaa1dd22c11469Ben Skeggs
1008984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	ret = nouveau_vm_ref(vm, &chan->vm, NULL);
1018984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (ret) {
1028984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		nvc0_channel_del(&chan);
1038984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		return ret;
1048984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	}
1054b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs
1068984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nv_wo32(chan->ramin, 0x0200, lower_32_bits(pgd->vinst));
1078984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nv_wo32(chan->ramin, 0x0204, upper_32_bits(pgd->vinst));
1088984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nv_wo32(chan->ramin, 0x0208, lower_32_bits(vm_size - 1));
1098984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nv_wo32(chan->ramin, 0x020c, upper_32_bits(vm_size - 1));
1108984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs
1118984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	*pchan = chan;
1128984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	return 0;
1134b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs}
1144b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs
1154b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggsint
1168984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggsnvc0_instmem_init(struct drm_device *dev)
1174b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs{
118147cad0936f3c59ec5678fe47319e44e3ea44d87Ben Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
1198984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem;
1208984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct pci_dev *pdev = dev->pdev;
1218984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct nvc0_instmem_priv *priv;
1228984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct nouveau_vm *vm = NULL;
1238984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	int ret;
124147cad0936f3c59ec5678fe47319e44e3ea44d87Ben Skeggs
1258984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
1268984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (!priv)
127147cad0936f3c59ec5678fe47319e44e3ea44d87Ben Skeggs		return -ENOMEM;
1288984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	pinstmem->priv = priv;
1298984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs
1308984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	/* BAR3 VM */
1318984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	ret = nouveau_vm_new(dev, 0, pci_resource_len(pdev, 3), 0,
1328984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs			     &dev_priv->bar3_vm);
1338984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (ret)
1348984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		goto error;
1358984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs
1368984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	ret = nouveau_gpuobj_new(dev, NULL,
1378984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs				 (pci_resource_len(pdev, 3) >> 12) * 8, 0,
1388984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs				 NVOBJ_FLAG_DONT_MAP |
1398984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs				 NVOBJ_FLAG_ZERO_ALLOC,
1408984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs				 &dev_priv->bar3_vm->pgt[0].obj[0]);
1418984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (ret)
1428984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		goto error;
1438984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	dev_priv->bar3_vm->pgt[0].refcount[0] = 1;
1448984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs
1458984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nv50_instmem_map(dev_priv->bar3_vm->pgt[0].obj[0]);
1468984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs
1478984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	ret = nouveau_gpuobj_new(dev, NULL, 0x8000, 4096,
1488984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs				 NVOBJ_FLAG_ZERO_ALLOC, &priv->bar3_pgd);
1498984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (ret)
1508984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		goto error;
1518984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs
1528984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	ret = nouveau_vm_ref(dev_priv->bar3_vm, &vm, priv->bar3_pgd);
1538984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (ret)
1548984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		goto error;
1558984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nouveau_vm_ref(NULL, &vm, NULL);
1568984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs
1578984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	ret = nvc0_channel_new(dev, 8192, dev_priv->bar3_vm, &priv->bar3,
1588984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs			       priv->bar3_pgd, pci_resource_len(dev->pdev, 3));
1598984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (ret)
1608984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		goto error;
1618984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs
1628984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	/* BAR1 VM */
1638984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	ret = nouveau_vm_new(dev, 0, pci_resource_len(pdev, 1), 0, &vm);
1648984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (ret)
1658984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		goto error;
1668984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs
1678984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	ret = nouveau_gpuobj_new(dev, NULL, 0x8000, 4096,
1688984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs				 NVOBJ_FLAG_ZERO_ALLOC, &priv->bar1_pgd);
1698984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (ret)
1708984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		goto error;
1718984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs
1728984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	ret = nouveau_vm_ref(vm, &dev_priv->bar1_vm, priv->bar1_pgd);
1738984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (ret)
1748984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		goto error;
1758984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nouveau_vm_ref(NULL, &vm, NULL);
1768984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs
1778984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	ret = nvc0_channel_new(dev, 8192, dev_priv->bar1_vm, &priv->bar1,
1788984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs			       priv->bar1_pgd, pci_resource_len(dev->pdev, 1));
1798984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	if (ret)
1808984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs		goto error;
1818984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs
18299805566d93d69b7daf2373aba9fae52a62396f4Ben Skeggs	/* channel vm */
1835de8037ab466d397df17ff72382c33a908f42f6cBen Skeggs	ret = nouveau_vm_new(dev, 0, (1ULL << 40), 0x0008000000ULL,
1845de8037ab466d397df17ff72382c33a908f42f6cBen Skeggs			     &dev_priv->chan_vm);
18599805566d93d69b7daf2373aba9fae52a62396f4Ben Skeggs	if (ret)
18699805566d93d69b7daf2373aba9fae52a62396f4Ben Skeggs		goto error;
18799805566d93d69b7daf2373aba9fae52a62396f4Ben Skeggs
1888984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nvc0_instmem_resume(dev);
1894b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs	return 0;
1908984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggserror:
1918984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nvc0_instmem_takedown(dev);
1928984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	return ret;
1934b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs}
1944b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs
1954b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggsvoid
1968984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggsnvc0_instmem_takedown(struct drm_device *dev)
1974b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs{
19868b83a939cf8ed5466d11b7e9bfaa1dd22c11469Ben Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
1998984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct nvc0_instmem_priv *priv = dev_priv->engine.instmem.priv;
2008984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	struct nouveau_vm *vm = NULL;
20168b83a939cf8ed5466d11b7e9bfaa1dd22c11469Ben Skeggs
2028984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nvc0_instmem_suspend(dev);
20368b83a939cf8ed5466d11b7e9bfaa1dd22c11469Ben Skeggs
2048984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nv_wr32(dev, 0x1704, 0x00000000);
2058984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nv_wr32(dev, 0x1714, 0x00000000);
20668b83a939cf8ed5466d11b7e9bfaa1dd22c11469Ben Skeggs
2075de8037ab466d397df17ff72382c33a908f42f6cBen Skeggs	nouveau_vm_ref(NULL, &dev_priv->chan_vm, NULL);
20899805566d93d69b7daf2373aba9fae52a62396f4Ben Skeggs
2098984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nvc0_channel_del(&priv->bar1);
2108984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nouveau_vm_ref(NULL, &dev_priv->bar1_vm, priv->bar1_pgd);
2118984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nouveau_gpuobj_ref(NULL, &priv->bar1_pgd);
21268b83a939cf8ed5466d11b7e9bfaa1dd22c11469Ben Skeggs
2138984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nvc0_channel_del(&priv->bar3);
2148984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nouveau_vm_ref(dev_priv->bar3_vm, &vm, NULL);
2158984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nouveau_vm_ref(NULL, &vm, priv->bar3_pgd);
2168984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nouveau_gpuobj_ref(NULL, &priv->bar3_pgd);
2178984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nouveau_gpuobj_ref(NULL, &dev_priv->bar3_vm->pgt[0].obj[0]);
2188984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	nouveau_vm_ref(NULL, &dev_priv->bar3_vm, NULL);
2194b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs
2208984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	dev_priv->engine.instmem.priv = NULL;
2218984e046153eb1d6b0b24626169f9c6e58232e1bBen Skeggs	kfree(priv);
2224b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs}
2234b223eefe43d201c323d120a01dbd0dcbba64e6dBen Skeggs
224