diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 33 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 |
5 files changed, 26 insertions, 16 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index a5427cf4b19d..593618e6c186 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -1484,7 +1484,6 @@ struct amdgpu_device { | |||
1484 | struct amdgpu_wb wb; | 1484 | struct amdgpu_wb wb; |
1485 | atomic64_t vram_usage; | 1485 | atomic64_t vram_usage; |
1486 | atomic64_t vram_vis_usage; | 1486 | atomic64_t vram_vis_usage; |
1487 | atomic64_t gtt_usage; | ||
1488 | atomic64_t num_bytes_moved; | 1487 | atomic64_t num_bytes_moved; |
1489 | atomic64_t num_evictions; | 1488 | atomic64_t num_evictions; |
1490 | atomic64_t num_vram_cpu_page_faults; | 1489 | atomic64_t num_vram_cpu_page_faults; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c index 97c63ee1e20a..9e05e257729f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | |||
@@ -28,7 +28,7 @@ | |||
28 | struct amdgpu_gtt_mgr { | 28 | struct amdgpu_gtt_mgr { |
29 | struct drm_mm mm; | 29 | struct drm_mm mm; |
30 | spinlock_t lock; | 30 | spinlock_t lock; |
31 | uint64_t available; | 31 | atomic64_t available; |
32 | }; | 32 | }; |
33 | 33 | ||
34 | /** | 34 | /** |
@@ -54,7 +54,7 @@ static int amdgpu_gtt_mgr_init(struct ttm_mem_type_manager *man, | |||
54 | size = (adev->mc.gart_size >> PAGE_SHIFT) - start; | 54 | size = (adev->mc.gart_size >> PAGE_SHIFT) - start; |
55 | drm_mm_init(&mgr->mm, start, size); | 55 | drm_mm_init(&mgr->mm, start, size); |
56 | spin_lock_init(&mgr->lock); | 56 | spin_lock_init(&mgr->lock); |
57 | mgr->available = p_size; | 57 | atomic64_set(&mgr->available, p_size); |
58 | man->priv = mgr; | 58 | man->priv = mgr; |
59 | return 0; | 59 | return 0; |
60 | } | 60 | } |
@@ -173,11 +173,11 @@ static int amdgpu_gtt_mgr_new(struct ttm_mem_type_manager *man, | |||
173 | int r; | 173 | int r; |
174 | 174 | ||
175 | spin_lock(&mgr->lock); | 175 | spin_lock(&mgr->lock); |
176 | if (mgr->available < mem->num_pages) { | 176 | if (atomic64_read(&mgr->available) < mem->num_pages) { |
177 | spin_unlock(&mgr->lock); | 177 | spin_unlock(&mgr->lock); |
178 | return 0; | 178 | return 0; |
179 | } | 179 | } |
180 | mgr->available -= mem->num_pages; | 180 | atomic64_sub(mem->num_pages, &mgr->available); |
181 | spin_unlock(&mgr->lock); | 181 | spin_unlock(&mgr->lock); |
182 | 182 | ||
183 | node = kzalloc(sizeof(*node), GFP_KERNEL); | 183 | node = kzalloc(sizeof(*node), GFP_KERNEL); |
@@ -204,9 +204,7 @@ static int amdgpu_gtt_mgr_new(struct ttm_mem_type_manager *man, | |||
204 | 204 | ||
205 | return 0; | 205 | return 0; |
206 | err_out: | 206 | err_out: |
207 | spin_lock(&mgr->lock); | 207 | atomic64_add(mem->num_pages, &mgr->available); |
208 | mgr->available += mem->num_pages; | ||
209 | spin_unlock(&mgr->lock); | ||
210 | 208 | ||
211 | return r; | 209 | return r; |
212 | } | 210 | } |
@@ -233,14 +231,28 @@ static void amdgpu_gtt_mgr_del(struct ttm_mem_type_manager *man, | |||
233 | spin_lock(&mgr->lock); | 231 | spin_lock(&mgr->lock); |
234 | if (node->start != AMDGPU_BO_INVALID_OFFSET) | 232 | if (node->start != AMDGPU_BO_INVALID_OFFSET) |
235 | drm_mm_remove_node(node); | 233 | drm_mm_remove_node(node); |
236 | mgr->available += mem->num_pages; | ||
237 | spin_unlock(&mgr->lock); | 234 | spin_unlock(&mgr->lock); |
235 | atomic64_add(mem->num_pages, &mgr->available); | ||
238 | 236 | ||
239 | kfree(node); | 237 | kfree(node); |
240 | mem->mm_node = NULL; | 238 | mem->mm_node = NULL; |
241 | } | 239 | } |
242 | 240 | ||
243 | /** | 241 | /** |
242 | * amdgpu_gtt_mgr_usage - return usage of GTT domain | ||
243 | * | ||
244 | * @man: TTM memory type manager | ||
245 | * | ||
246 | * Return how many bytes are used in the GTT domain | ||
247 | */ | ||
248 | uint64_t amdgpu_gtt_mgr_usage(struct ttm_mem_type_manager *man) | ||
249 | { | ||
250 | struct amdgpu_gtt_mgr *mgr = man->priv; | ||
251 | |||
252 | return (u64)(man->size - atomic64_read(&mgr->available)) * PAGE_SIZE; | ||
253 | } | ||
254 | |||
255 | /** | ||
244 | * amdgpu_gtt_mgr_debug - dump VRAM table | 256 | * amdgpu_gtt_mgr_debug - dump VRAM table |
245 | * | 257 | * |
246 | * @man: TTM memory type manager | 258 | * @man: TTM memory type manager |
@@ -251,7 +263,6 @@ static void amdgpu_gtt_mgr_del(struct ttm_mem_type_manager *man, | |||
251 | static void amdgpu_gtt_mgr_debug(struct ttm_mem_type_manager *man, | 263 | static void amdgpu_gtt_mgr_debug(struct ttm_mem_type_manager *man, |
252 | struct drm_printer *printer) | 264 | struct drm_printer *printer) |
253 | { | 265 | { |
254 | struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); | ||
255 | struct amdgpu_gtt_mgr *mgr = man->priv; | 266 | struct amdgpu_gtt_mgr *mgr = man->priv; |
256 | 267 | ||
257 | spin_lock(&mgr->lock); | 268 | spin_lock(&mgr->lock); |
@@ -259,8 +270,8 @@ static void amdgpu_gtt_mgr_debug(struct ttm_mem_type_manager *man, | |||
259 | spin_unlock(&mgr->lock); | 270 | spin_unlock(&mgr->lock); |
260 | 271 | ||
261 | drm_printf(printer, "man size:%llu pages, gtt available:%llu pages, usage:%lluMB\n", | 272 | drm_printf(printer, "man size:%llu pages, gtt available:%llu pages, usage:%lluMB\n", |
262 | man->size, mgr->available, | 273 | man->size, (u64)atomic64_read(&mgr->available), |
263 | (u64)atomic64_read(&adev->gtt_usage) >> 20); | 274 | amdgpu_gtt_mgr_usage(man) >> 20); |
264 | } | 275 | } |
265 | 276 | ||
266 | const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func = { | 277 | const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func = { |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index c908f972283c..889f96fcfc81 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |||
@@ -461,7 +461,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
461 | ui64 = atomic64_read(&adev->vram_vis_usage); | 461 | ui64 = atomic64_read(&adev->vram_vis_usage); |
462 | return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; | 462 | return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; |
463 | case AMDGPU_INFO_GTT_USAGE: | 463 | case AMDGPU_INFO_GTT_USAGE: |
464 | ui64 = atomic64_read(&adev->gtt_usage); | 464 | ui64 = amdgpu_gtt_mgr_usage(&adev->mman.bdev.man[TTM_PL_TT]); |
465 | return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; | 465 | return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; |
466 | case AMDGPU_INFO_GDS_CONFIG: { | 466 | case AMDGPU_INFO_GDS_CONFIG: { |
467 | struct drm_amdgpu_info_gds gds_info; | 467 | struct drm_amdgpu_info_gds gds_info; |
@@ -514,7 +514,8 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
514 | mem.gtt.total_heap_size *= PAGE_SIZE; | 514 | mem.gtt.total_heap_size *= PAGE_SIZE; |
515 | mem.gtt.usable_heap_size = mem.gtt.total_heap_size | 515 | mem.gtt.usable_heap_size = mem.gtt.total_heap_size |
516 | - adev->gart_pin_size; | 516 | - adev->gart_pin_size; |
517 | mem.gtt.heap_usage = atomic64_read(&adev->gtt_usage); | 517 | mem.gtt.heap_usage = |
518 | amdgpu_gtt_mgr_usage(&adev->mman.bdev.man[TTM_PL_TT]); | ||
518 | mem.gtt.max_allocation = mem.gtt.usable_heap_size * 3 / 4; | 519 | mem.gtt.max_allocation = mem.gtt.usable_heap_size * 3 / 4; |
519 | 520 | ||
520 | return copy_to_user(out, &mem, | 521 | return copy_to_user(out, &mem, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 6e72fe7901ec..57d2cb6bd331 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | |||
@@ -62,7 +62,6 @@ static void amdgpu_update_memory_usage(struct amdgpu_device *adev, | |||
62 | if (new_mem) { | 62 | if (new_mem) { |
63 | switch (new_mem->mem_type) { | 63 | switch (new_mem->mem_type) { |
64 | case TTM_PL_TT: | 64 | case TTM_PL_TT: |
65 | atomic64_add(new_mem->size, &adev->gtt_usage); | ||
66 | break; | 65 | break; |
67 | case TTM_PL_VRAM: | 66 | case TTM_PL_VRAM: |
68 | atomic64_add(new_mem->size, &adev->vram_usage); | 67 | atomic64_add(new_mem->size, &adev->vram_usage); |
@@ -75,7 +74,6 @@ static void amdgpu_update_memory_usage(struct amdgpu_device *adev, | |||
75 | if (old_mem) { | 74 | if (old_mem) { |
76 | switch (old_mem->mem_type) { | 75 | switch (old_mem->mem_type) { |
77 | case TTM_PL_TT: | 76 | case TTM_PL_TT: |
78 | atomic64_sub(old_mem->size, &adev->gtt_usage); | ||
79 | break; | 77 | break; |
80 | case TTM_PL_VRAM: | 78 | case TTM_PL_VRAM: |
81 | atomic64_sub(old_mem->size, &adev->vram_usage); | 79 | atomic64_sub(old_mem->size, &adev->vram_usage); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 0e2399f32de7..1307ab581449 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | |||
@@ -66,6 +66,7 @@ int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man, | |||
66 | struct ttm_buffer_object *tbo, | 66 | struct ttm_buffer_object *tbo, |
67 | const struct ttm_place *place, | 67 | const struct ttm_place *place, |
68 | struct ttm_mem_reg *mem); | 68 | struct ttm_mem_reg *mem); |
69 | uint64_t amdgpu_gtt_mgr_usage(struct ttm_mem_type_manager *man); | ||
69 | 70 | ||
70 | int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset, | 71 | int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset, |
71 | uint64_t dst_offset, uint32_t byte_count, | 72 | uint64_t dst_offset, uint32_t byte_count, |