diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_bo.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bo.c | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index 5a71ca4346c..4d142031d54 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c | |||
@@ -32,6 +32,8 @@ | |||
32 | #include "nouveau_drm.h" | 32 | #include "nouveau_drm.h" |
33 | #include "nouveau_drv.h" | 33 | #include "nouveau_drv.h" |
34 | #include "nouveau_dma.h" | 34 | #include "nouveau_dma.h" |
35 | #include "nouveau_mm.h" | ||
36 | #include "nouveau_vm.h" | ||
35 | 37 | ||
36 | #include <linux/log2.h> | 38 | #include <linux/log2.h> |
37 | #include <linux/slab.h> | 39 | #include <linux/slab.h> |
@@ -386,10 +388,13 @@ nouveau_bo_init_mem_type(struct ttm_bo_device *bdev, uint32_t type, | |||
386 | man->default_caching = TTM_PL_FLAG_CACHED; | 388 | man->default_caching = TTM_PL_FLAG_CACHED; |
387 | break; | 389 | break; |
388 | case TTM_PL_VRAM: | 390 | case TTM_PL_VRAM: |
389 | if (dev_priv->card_type == NV_50) | 391 | if (dev_priv->card_type == NV_50) { |
390 | man->func = &nouveau_vram_manager; | 392 | man->func = &nouveau_vram_manager; |
391 | else | 393 | man->io_reserve_fastpath = false; |
394 | man->use_io_reserve_lru = true; | ||
395 | } else { | ||
392 | man->func = &ttm_bo_manager_func; | 396 | man->func = &ttm_bo_manager_func; |
397 | } | ||
393 | man->flags = TTM_MEMTYPE_FLAG_FIXED | | 398 | man->flags = TTM_MEMTYPE_FLAG_FIXED | |
394 | TTM_MEMTYPE_FLAG_MAPPABLE; | 399 | TTM_MEMTYPE_FLAG_MAPPABLE; |
395 | man->available_caching = TTM_PL_FLAG_UNCACHED | | 400 | man->available_caching = TTM_PL_FLAG_UNCACHED | |
@@ -858,6 +863,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) | |||
858 | struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type]; | 863 | struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type]; |
859 | struct drm_nouveau_private *dev_priv = nouveau_bdev(bdev); | 864 | struct drm_nouveau_private *dev_priv = nouveau_bdev(bdev); |
860 | struct drm_device *dev = dev_priv->dev; | 865 | struct drm_device *dev = dev_priv->dev; |
866 | int ret; | ||
861 | 867 | ||
862 | mem->bus.addr = NULL; | 868 | mem->bus.addr = NULL; |
863 | mem->bus.offset = 0; | 869 | mem->bus.offset = 0; |
@@ -880,9 +886,32 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) | |||
880 | #endif | 886 | #endif |
881 | break; | 887 | break; |
882 | case TTM_PL_VRAM: | 888 | case TTM_PL_VRAM: |
883 | mem->bus.offset = mem->start << PAGE_SHIFT; | 889 | { |
890 | struct nouveau_vram *vram = mem->mm_node; | ||
891 | |||
892 | if (!dev_priv->bar1_vm) { | ||
893 | mem->bus.offset = mem->start << PAGE_SHIFT; | ||
894 | mem->bus.base = pci_resource_start(dev->pdev, 1); | ||
895 | mem->bus.is_iomem = true; | ||
896 | break; | ||
897 | } | ||
898 | |||
899 | ret = nouveau_vm_get(dev_priv->bar1_vm, mem->bus.size, 12, | ||
900 | NV_MEM_ACCESS_RW, &vram->bar_vma); | ||
901 | if (ret) | ||
902 | return ret; | ||
903 | |||
904 | nouveau_vm_map(&vram->bar_vma, vram); | ||
905 | if (ret) { | ||
906 | nouveau_vm_put(&vram->bar_vma); | ||
907 | return ret; | ||
908 | } | ||
909 | |||
910 | mem->bus.offset = vram->bar_vma.offset; | ||
911 | mem->bus.offset -= 0x0020000000ULL; | ||
884 | mem->bus.base = pci_resource_start(dev->pdev, 1); | 912 | mem->bus.base = pci_resource_start(dev->pdev, 1); |
885 | mem->bus.is_iomem = true; | 913 | mem->bus.is_iomem = true; |
914 | } | ||
886 | break; | 915 | break; |
887 | default: | 916 | default: |
888 | return -EINVAL; | 917 | return -EINVAL; |
@@ -893,6 +922,17 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) | |||
893 | static void | 922 | static void |
894 | nouveau_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) | 923 | nouveau_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) |
895 | { | 924 | { |
925 | struct drm_nouveau_private *dev_priv = nouveau_bdev(bdev); | ||
926 | struct nouveau_vram *vram = mem->mm_node; | ||
927 | |||
928 | if (!dev_priv->bar1_vm || mem->mem_type != TTM_PL_VRAM) | ||
929 | return; | ||
930 | |||
931 | if (!vram->bar_vma.node) | ||
932 | return; | ||
933 | |||
934 | nouveau_vm_unmap(&vram->bar_vma); | ||
935 | nouveau_vm_put(&vram->bar_vma); | ||
896 | } | 936 | } |
897 | 937 | ||
898 | static int | 938 | static int |