aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nouveau_mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_mem.c')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_mem.c71
1 files changed, 69 insertions, 2 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c
index 4aea1c4c46ef..48131ceeeb80 100644
--- a/drivers/gpu/drm/nouveau/nouveau_mem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_mem.c
@@ -38,7 +38,6 @@
38#include "nouveau_drv.h" 38#include "nouveau_drv.h"
39#include "nouveau_pm.h" 39#include "nouveau_pm.h"
40#include <core/mm.h> 40#include <core/mm.h>
41#include <subdev/vm.h>
42#include <engine/fifo.h> 41#include <engine/fifo.h>
43#include "nouveau_fence.h" 42#include "nouveau_fence.h"
44 43
@@ -220,7 +219,7 @@ nouveau_mem_vram_init(struct drm_device *dev)
220 dev_priv->fb_mappable_pages = pci_resource_len(dev->pdev, 1); 219 dev_priv->fb_mappable_pages = pci_resource_len(dev->pdev, 1);
221 dev_priv->fb_mappable_pages >>= PAGE_SHIFT; 220 dev_priv->fb_mappable_pages >>= PAGE_SHIFT;
222 221
223 dev_priv->fb_available_size -= dev_priv->ramin_rsvd_vram; 222 dev_priv->fb_available_size -= nvimem_reserved(dev);
224 dev_priv->fb_aper_free = dev_priv->fb_available_size; 223 dev_priv->fb_aper_free = dev_priv->fb_available_size;
225 224
226 /* mappable vram */ 225 /* mappable vram */
@@ -1058,3 +1057,71 @@ const struct ttm_mem_type_manager_func nouveau_gart_manager = {
1058 nouveau_gart_manager_del, 1057 nouveau_gart_manager_del,
1059 nouveau_gart_manager_debug 1058 nouveau_gart_manager_debug
1060}; 1059};
1060
1061static int
1062nv04_gart_manager_init(struct ttm_mem_type_manager *man, unsigned long psize)
1063{
1064 struct drm_nouveau_private *dev_priv = nouveau_bdev(man->bdev);
1065 struct drm_device *dev = dev_priv->dev;
1066 man->priv = nv04vm_ref(dev);
1067 return (man->priv != NULL) ? 0 : -ENODEV;
1068}
1069
1070static int
1071nv04_gart_manager_fini(struct ttm_mem_type_manager *man)
1072{
1073 struct nouveau_vm *vm = man->priv;
1074 nouveau_vm_ref(NULL, &vm, NULL);
1075 man->priv = NULL;
1076 return 0;
1077}
1078
1079static void
1080nv04_gart_manager_del(struct ttm_mem_type_manager *man, struct ttm_mem_reg *mem)
1081{
1082 struct nouveau_mem *node = mem->mm_node;
1083 if (node->vma[0].node)
1084 nouveau_vm_put(&node->vma[0]);
1085 kfree(mem->mm_node);
1086 mem->mm_node = NULL;
1087}
1088
1089static int
1090nv04_gart_manager_new(struct ttm_mem_type_manager *man,
1091 struct ttm_buffer_object *bo,
1092 struct ttm_placement *placement,
1093 struct ttm_mem_reg *mem)
1094{
1095 struct nouveau_mem *node;
1096 int ret;
1097
1098 node = kzalloc(sizeof(*node), GFP_KERNEL);
1099 if (!node)
1100 return -ENOMEM;
1101
1102 node->page_shift = 12;
1103
1104 ret = nouveau_vm_get(man->priv, mem->num_pages << 12, node->page_shift,
1105 NV_MEM_ACCESS_RW, &node->vma[0]);
1106 if (ret) {
1107 kfree(node);
1108 return ret;
1109 }
1110
1111 mem->mm_node = node;
1112 mem->start = node->vma[0].offset >> PAGE_SHIFT;
1113 return 0;
1114}
1115
1116void
1117nv04_gart_manager_debug(struct ttm_mem_type_manager *man, const char *prefix)
1118{
1119}
1120
1121const struct ttm_mem_type_manager_func nv04_gart_manager = {
1122 nv04_gart_manager_init,
1123 nv04_gart_manager_fini,
1124 nv04_gart_manager_new,
1125 nv04_gart_manager_del,
1126 nv04_gart_manager_debug
1127};