diff options
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nv50_instmem.c | 25 |
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 | ||
303 | struct nv50_gpuobj_node { | 303 | struct 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 | |||
310 | nv50_instmem_get(struct nouveau_gpuobj *gpuobj, u32 size, u32 align) | 311 | nv50_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 | } |