aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2014-07-03 03:02:23 -0400
committerDave Airlie <airlied@redhat.com>2014-07-07 21:15:58 -0400
commite3f202798aaa808e7a38faa8c3a9f0aa93b85cc0 (patch)
tree3eac926b195d382c73a900c2eae11137aab9cf09
parent4e4e7dc55af5aa62497ac060e3cfd143bd4b4db3 (diff)
drm/ttm: fix handling of TTM_PL_FLAG_TOPDOWN v2
bo->mem.placement is not initialized when ttm_bo_man_get_node is called, so the flag had no effect at all. v2: change nouveau and vmwgfx as well Signed-off-by: Christian König <christian.koenig@amd.com> Cc: stable@vger.kernel.org Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_ttm.c3
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo.c6
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo_manager.c3
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c1
-rw-r--r--include/drm/ttm/ttm_bo_driver.h2
5 files changed, 11 insertions, 4 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c
index ab0228f640a5..7e185c122750 100644
--- a/drivers/gpu/drm/nouveau/nouveau_ttm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c
@@ -76,6 +76,7 @@ static int
76nouveau_vram_manager_new(struct ttm_mem_type_manager *man, 76nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
77 struct ttm_buffer_object *bo, 77 struct ttm_buffer_object *bo,
78 struct ttm_placement *placement, 78 struct ttm_placement *placement,
79 uint32_t flags,
79 struct ttm_mem_reg *mem) 80 struct ttm_mem_reg *mem)
80{ 81{
81 struct nouveau_drm *drm = nouveau_bdev(man->bdev); 82 struct nouveau_drm *drm = nouveau_bdev(man->bdev);
@@ -162,6 +163,7 @@ static int
162nouveau_gart_manager_new(struct ttm_mem_type_manager *man, 163nouveau_gart_manager_new(struct ttm_mem_type_manager *man,
163 struct ttm_buffer_object *bo, 164 struct ttm_buffer_object *bo,
164 struct ttm_placement *placement, 165 struct ttm_placement *placement,
166 uint32_t flags,
165 struct ttm_mem_reg *mem) 167 struct ttm_mem_reg *mem)
166{ 168{
167 struct nouveau_drm *drm = nouveau_bdev(bo->bdev); 169 struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
@@ -242,6 +244,7 @@ static int
242nv04_gart_manager_new(struct ttm_mem_type_manager *man, 244nv04_gart_manager_new(struct ttm_mem_type_manager *man,
243 struct ttm_buffer_object *bo, 245 struct ttm_buffer_object *bo,
244 struct ttm_placement *placement, 246 struct ttm_placement *placement,
247 uint32_t flags,
245 struct ttm_mem_reg *mem) 248 struct ttm_mem_reg *mem)
246{ 249{
247 struct nouveau_mem *node; 250 struct nouveau_mem *node;
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 4ab9f7171c4f..a13a10025ec7 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -784,7 +784,7 @@ static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
784 int ret; 784 int ret;
785 785
786 do { 786 do {
787 ret = (*man->func->get_node)(man, bo, placement, mem); 787 ret = (*man->func->get_node)(man, bo, placement, 0, mem);
788 if (unlikely(ret != 0)) 788 if (unlikely(ret != 0))
789 return ret; 789 return ret;
790 if (mem->mm_node) 790 if (mem->mm_node)
@@ -897,7 +897,8 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
897 897
898 if (man->has_type && man->use_type) { 898 if (man->has_type && man->use_type) {
899 type_found = true; 899 type_found = true;
900 ret = (*man->func->get_node)(man, bo, placement, mem); 900 ret = (*man->func->get_node)(man, bo, placement,
901 cur_flags, mem);
901 if (unlikely(ret)) 902 if (unlikely(ret))
902 return ret; 903 return ret;
903 } 904 }
@@ -937,7 +938,6 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
937 ttm_flag_masked(&cur_flags, placement->busy_placement[i], 938 ttm_flag_masked(&cur_flags, placement->busy_placement[i],
938 ~TTM_PL_MASK_MEMTYPE); 939 ~TTM_PL_MASK_MEMTYPE);
939 940
940
941 if (mem_type == TTM_PL_SYSTEM) { 941 if (mem_type == TTM_PL_SYSTEM) {
942 mem->mem_type = mem_type; 942 mem->mem_type = mem_type;
943 mem->placement = cur_flags; 943 mem->placement = cur_flags;
diff --git a/drivers/gpu/drm/ttm/ttm_bo_manager.c b/drivers/gpu/drm/ttm/ttm_bo_manager.c
index bd850c9f4bca..9e103a4875c8 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_manager.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_manager.c
@@ -50,6 +50,7 @@ struct ttm_range_manager {
50static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man, 50static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
51 struct ttm_buffer_object *bo, 51 struct ttm_buffer_object *bo,
52 struct ttm_placement *placement, 52 struct ttm_placement *placement,
53 uint32_t flags,
53 struct ttm_mem_reg *mem) 54 struct ttm_mem_reg *mem)
54{ 55{
55 struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv; 56 struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv;
@@ -67,7 +68,7 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
67 if (!node) 68 if (!node)
68 return -ENOMEM; 69 return -ENOMEM;
69 70
70 if (bo->mem.placement & TTM_PL_FLAG_TOPDOWN) 71 if (flags & TTM_PL_FLAG_TOPDOWN)
71 aflags = DRM_MM_CREATE_TOP; 72 aflags = DRM_MM_CREATE_TOP;
72 73
73 spin_lock(&rman->lock); 74 spin_lock(&rman->lock);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
index b1273e8e9a69..26f8bdde3529 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
@@ -47,6 +47,7 @@ struct vmwgfx_gmrid_man {
47static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man, 47static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man,
48 struct ttm_buffer_object *bo, 48 struct ttm_buffer_object *bo,
49 struct ttm_placement *placement, 49 struct ttm_placement *placement,
50 uint32_t flags,
50 struct ttm_mem_reg *mem) 51 struct ttm_mem_reg *mem)
51{ 52{
52 struct vmwgfx_gmrid_man *gman = 53 struct vmwgfx_gmrid_man *gman =
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index e3f8c99a8a9d..202f0a7171e8 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -182,6 +182,7 @@ struct ttm_mem_type_manager_func {
182 * @man: Pointer to a memory type manager. 182 * @man: Pointer to a memory type manager.
183 * @bo: Pointer to the buffer object we're allocating space for. 183 * @bo: Pointer to the buffer object we're allocating space for.
184 * @placement: Placement details. 184 * @placement: Placement details.
185 * @flags: Additional placement flags.
185 * @mem: Pointer to a struct ttm_mem_reg to be filled in. 186 * @mem: Pointer to a struct ttm_mem_reg to be filled in.
186 * 187 *
187 * This function should allocate space in the memory type managed 188 * This function should allocate space in the memory type managed
@@ -206,6 +207,7 @@ struct ttm_mem_type_manager_func {
206 int (*get_node)(struct ttm_mem_type_manager *man, 207 int (*get_node)(struct ttm_mem_type_manager *man,
207 struct ttm_buffer_object *bo, 208 struct ttm_buffer_object *bo,
208 struct ttm_placement *placement, 209 struct ttm_placement *placement,
210 uint32_t flags,
209 struct ttm_mem_reg *mem); 211 struct ttm_mem_reg *mem);
210 212
211 /** 213 /**