aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nouveau_bo.c
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2010-11-14 20:53:16 -0500
committerBen Skeggs <bskeggs@redhat.com>2010-12-07 22:48:12 -0500
commitf869ef882382a4b6cb42d259e399aeec3781d4bb (patch)
tree64c15a801acc45528fcc150becd797612acdd0fb /drivers/gpu/drm/nouveau/nouveau_bo.c
parenta11c3198c9ba38d81e25b65e3908d531feba1372 (diff)
drm/nv50: implement BAR1/BAR3 management on top of new VM code
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_bo.c')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_bo.c46
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 5a71ca4346c8..4d142031d542 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)
893static void 922static void
894nouveau_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) 923nouveau_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
898static int 938static int