diff options
| author | Christian König <christian.koenig@amd.com> | 2014-07-03 03:02:23 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2014-07-07 21:15:58 -0400 |
| commit | e3f202798aaa808e7a38faa8c3a9f0aa93b85cc0 (patch) | |
| tree | 3eac926b195d382c73a900c2eae11137aab9cf09 | |
| parent | 4e4e7dc55af5aa62497ac060e3cfd143bd4b4db3 (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.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo_manager.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c | 1 | ||||
| -rw-r--r-- | include/drm/ttm/ttm_bo_driver.h | 2 |
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 | |||
| 76 | nouveau_vram_manager_new(struct ttm_mem_type_manager *man, | 76 | nouveau_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 | |||
| 162 | nouveau_gart_manager_new(struct ttm_mem_type_manager *man, | 163 | nouveau_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 | |||
| 242 | nv04_gart_manager_new(struct ttm_mem_type_manager *man, | 244 | nv04_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 { | |||
| 50 | static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man, | 50 | static 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 { | |||
| 47 | static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man, | 47 | static 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 | /** |
