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