aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/nouveau')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_bo.c36
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drv.h1
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_mem.c6
3 files changed, 36 insertions, 7 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index d7a9e80a7c79..4e74957ef2cf 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -508,10 +508,12 @@ nvc0_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
508 int ret; 508 int ret;
509 509
510 src_offset = old_mem->start << PAGE_SHIFT; 510 src_offset = old_mem->start << PAGE_SHIFT;
511 if (old_mem->mem_type == TTM_PL_VRAM) 511 if (old_mem->mem_type == TTM_PL_VRAM) {
512 src_offset = nvbo->vma.offset; 512 struct nouveau_vram *node = old_mem->mm_node;
513 else 513 src_offset = node->tmp_vma.offset;
514 } else {
514 src_offset += dev_priv->gart_info.aper_base; 515 src_offset += dev_priv->gart_info.aper_base;
516 }
515 517
516 dst_offset = new_mem->start << PAGE_SHIFT; 518 dst_offset = new_mem->start << PAGE_SHIFT;
517 if (new_mem->mem_type == TTM_PL_VRAM) 519 if (new_mem->mem_type == TTM_PL_VRAM)
@@ -559,10 +561,12 @@ nv50_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
559 int ret; 561 int ret;
560 562
561 src_offset = old_mem->start << PAGE_SHIFT; 563 src_offset = old_mem->start << PAGE_SHIFT;
562 if (old_mem->mem_type == TTM_PL_VRAM) 564 if (old_mem->mem_type == TTM_PL_VRAM) {
563 src_offset = nvbo->vma.offset; 565 struct nouveau_vram *node = old_mem->mm_node;
564 else 566 src_offset = node->tmp_vma.offset;
567 } else {
565 src_offset += dev_priv->gart_info.aper_base; 568 src_offset += dev_priv->gart_info.aper_base;
569 }
566 570
567 dst_offset = new_mem->start << PAGE_SHIFT; 571 dst_offset = new_mem->start << PAGE_SHIFT;
568 if (new_mem->mem_type == TTM_PL_VRAM) 572 if (new_mem->mem_type == TTM_PL_VRAM)
@@ -711,6 +715,7 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
711{ 715{
712 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); 716 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
713 struct nouveau_bo *nvbo = nouveau_bo(bo); 717 struct nouveau_bo *nvbo = nouveau_bo(bo);
718 struct ttm_mem_reg *old_mem = &bo->mem;
714 struct nouveau_channel *chan; 719 struct nouveau_channel *chan;
715 int ret; 720 int ret;
716 721
@@ -720,6 +725,21 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
720 mutex_lock_nested(&chan->mutex, NOUVEAU_KCHANNEL_MUTEX); 725 mutex_lock_nested(&chan->mutex, NOUVEAU_KCHANNEL_MUTEX);
721 } 726 }
722 727
728 /* create temporary vma for old memory, this will get cleaned
729 * up after ttm destroys the ttm_mem_reg
730 */
731 if (dev_priv->card_type >= NV_50 && old_mem->mem_type == TTM_PL_VRAM) {
732 struct nouveau_vram *node = old_mem->mm_node;
733
734 ret = nouveau_vm_get(chan->vm, old_mem->num_pages << PAGE_SHIFT,
735 nvbo->vma.node->type, NV_MEM_ACCESS_RO,
736 &node->tmp_vma);
737 if (ret)
738 goto out;
739
740 nouveau_vm_map(&node->tmp_vma, node);
741 }
742
723 if (dev_priv->card_type < NV_50) 743 if (dev_priv->card_type < NV_50)
724 ret = nv04_bo_move_m2mf(chan, bo, &bo->mem, new_mem); 744 ret = nv04_bo_move_m2mf(chan, bo, &bo->mem, new_mem);
725 else 745 else
@@ -733,6 +753,7 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
733 no_wait_gpu, new_mem); 753 no_wait_gpu, new_mem);
734 } 754 }
735 755
756out:
736 if (chan == dev_priv->channel) 757 if (chan == dev_priv->channel)
737 mutex_unlock(&chan->mutex); 758 mutex_unlock(&chan->mutex);
738 return ret; 759 return ret;
@@ -811,7 +832,7 @@ nouveau_bo_move_ntfy(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem)
811 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); 832 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
812 struct nouveau_bo *nvbo = nouveau_bo(bo); 833 struct nouveau_bo *nvbo = nouveau_bo(bo);
813 834
814 if (dev_priv->card_type < NV_50 || nvbo->no_vm) 835 if (dev_priv->card_type < NV_50)
815 return; 836 return;
816 837
817 switch (new_mem->mem_type) { 838 switch (new_mem->mem_type) {
@@ -820,6 +841,7 @@ nouveau_bo_move_ntfy(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem)
820 break; 841 break;
821 case TTM_PL_TT: 842 case TTM_PL_TT:
822 default: 843 default:
844 nouveau_vm_unmap(&nvbo->vma);
823 break; 845 break;
824 } 846 }
825} 847}
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index d409c0dc425b..45609ee447b3 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -69,6 +69,7 @@ struct nouveau_vram {
69 struct drm_device *dev; 69 struct drm_device *dev;
70 70
71 struct nouveau_vma bar_vma; 71 struct nouveau_vma bar_vma;
72 struct nouveau_vma tmp_vma;
72 u8 page_shift; 73 u8 page_shift;
73 74
74 struct list_head regions; 75 struct list_head regions;
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c
index 16eee50a0572..b90383fd18fd 100644
--- a/drivers/gpu/drm/nouveau/nouveau_mem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_mem.c
@@ -710,8 +710,14 @@ nouveau_vram_manager_del(struct ttm_mem_type_manager *man,
710{ 710{
711 struct drm_nouveau_private *dev_priv = nouveau_bdev(man->bdev); 711 struct drm_nouveau_private *dev_priv = nouveau_bdev(man->bdev);
712 struct nouveau_vram_engine *vram = &dev_priv->engine.vram; 712 struct nouveau_vram_engine *vram = &dev_priv->engine.vram;
713 struct nouveau_vram *node = mem->mm_node;
713 struct drm_device *dev = dev_priv->dev; 714 struct drm_device *dev = dev_priv->dev;
714 715
716 if (node->tmp_vma.node) {
717 nouveau_vm_unmap(&node->tmp_vma);
718 nouveau_vm_put(&node->tmp_vma);
719 }
720
715 vram->put(dev, (struct nouveau_vram **)&mem->mm_node); 721 vram->put(dev, (struct nouveau_vram **)&mem->mm_node);
716} 722}
717 723