aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drv.h1
-rw-r--r--drivers/gpu/drm/nouveau/nv50_instmem.c25
2 files changed, 24 insertions, 2 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index 4c5fc9c9912b..2cd87e6b54b7 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -158,6 +158,7 @@ enum nouveau_flags {
158#define NVOBJ_FLAG_DONT_MAP (1 << 0) 158#define NVOBJ_FLAG_DONT_MAP (1 << 0)
159#define NVOBJ_FLAG_ZERO_ALLOC (1 << 1) 159#define NVOBJ_FLAG_ZERO_ALLOC (1 << 1)
160#define NVOBJ_FLAG_ZERO_FREE (1 << 2) 160#define NVOBJ_FLAG_ZERO_FREE (1 << 2)
161#define NVOBJ_FLAG_VM (1 << 3)
161 162
162#define NVOBJ_CINST_GLOBAL 0xdeadbeef 163#define NVOBJ_CINST_GLOBAL 0xdeadbeef
163 164
diff --git a/drivers/gpu/drm/nouveau/nv50_instmem.c b/drivers/gpu/drm/nouveau/nv50_instmem.c
index ec102bda8446..e2efd6f22ffb 100644
--- a/drivers/gpu/drm/nouveau/nv50_instmem.c
+++ b/drivers/gpu/drm/nouveau/nv50_instmem.c
@@ -302,6 +302,7 @@ nv50_instmem_resume(struct drm_device *dev)
302 302
303struct nv50_gpuobj_node { 303struct nv50_gpuobj_node {
304 struct nouveau_vram *vram; 304 struct nouveau_vram *vram;
305 struct nouveau_vma chan_vma;
305 u32 align; 306 u32 align;
306}; 307};
307 308
@@ -310,6 +311,7 @@ int
310nv50_instmem_get(struct nouveau_gpuobj *gpuobj, u32 size, u32 align) 311nv50_instmem_get(struct nouveau_gpuobj *gpuobj, u32 size, u32 align)
311{ 312{
312 struct drm_device *dev = gpuobj->dev; 313 struct drm_device *dev = gpuobj->dev;
314 struct drm_nouveau_private *dev_priv = dev->dev_private;
313 struct nv50_gpuobj_node *node = NULL; 315 struct nv50_gpuobj_node *node = NULL;
314 int ret; 316 int ret;
315 317
@@ -328,8 +330,23 @@ nv50_instmem_get(struct nouveau_gpuobj *gpuobj, u32 size, u32 align)
328 } 330 }
329 331
330 gpuobj->vinst = node->vram->offset; 332 gpuobj->vinst = node->vram->offset;
331 gpuobj->size = size; 333
332 gpuobj->node = node; 334 if (gpuobj->flags & NVOBJ_FLAG_VM) {
335 ret = nouveau_vm_get(dev_priv->chan_vm, size, 12,
336 NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS,
337 &node->chan_vma);
338 if (ret) {
339 nv50_vram_del(dev, &node->vram);
340 kfree(node);
341 return ret;
342 }
343
344 nouveau_vm_map(&node->chan_vma, node->vram);
345 gpuobj->vinst = node->chan_vma.offset;
346 }
347
348 gpuobj->size = size;
349 gpuobj->node = node;
333 return 0; 350 return 0;
334} 351}
335 352
@@ -342,6 +359,10 @@ nv50_instmem_put(struct nouveau_gpuobj *gpuobj)
342 node = gpuobj->node; 359 node = gpuobj->node;
343 gpuobj->node = NULL; 360 gpuobj->node = NULL;
344 361
362 if (node->chan_vma.node) {
363 nouveau_vm_unmap(&node->chan_vma);
364 nouveau_vm_put(&node->chan_vma);
365 }
345 nv50_vram_del(dev, &node->vram); 366 nv50_vram_del(dev, &node->vram);
346 kfree(node); 367 kfree(node);
347} 368}