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