diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bo.c | 36 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_mem.c | 6 |
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 | ||
756 | out: | ||
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 | ||