diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_mem.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_mem.c | 71 |
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 | |||
1061 | static int | ||
1062 | nv04_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 | |||
1070 | static int | ||
1071 | nv04_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 | |||
1079 | static void | ||
1080 | nv04_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 | |||
1089 | static int | ||
1090 | nv04_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 | |||
1116 | void | ||
1117 | nv04_gart_manager_debug(struct ttm_mem_type_manager *man, const char *prefix) | ||
1118 | { | ||
1119 | } | ||
1120 | |||
1121 | const 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 | }; | ||