aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index f1076e3edf53..cef135ef7334 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -338,19 +338,34 @@ static void amdgpu_ring_lru_touch_locked(struct amdgpu_device *adev,
338 list_move_tail(&ring->lru_list, &adev->ring_lru_list); 338 list_move_tail(&ring->lru_list, &adev->ring_lru_list);
339} 339}
340 340
341static bool amdgpu_ring_is_blacklisted(struct amdgpu_ring *ring,
342 int *blacklist, int num_blacklist)
343{
344 int i;
345
346 for (i = 0; i < num_blacklist; i++) {
347 if (ring->idx == blacklist[i])
348 return true;
349 }
350
351 return false;
352}
353
341/** 354/**
342 * amdgpu_ring_lru_get - get the least recently used ring for a HW IP block 355 * amdgpu_ring_lru_get - get the least recently used ring for a HW IP block
343 * 356 *
344 * @adev: amdgpu_device pointer 357 * @adev: amdgpu_device pointer
345 * @type: amdgpu_ring_type enum 358 * @type: amdgpu_ring_type enum
359 * @blacklist: blacklisted ring ids array
360 * @num_blacklist: number of entries in @blacklist
346 * @ring: output ring 361 * @ring: output ring
347 * 362 *
348 * Retrieve the amdgpu_ring structure for the least recently used ring of 363 * Retrieve the amdgpu_ring structure for the least recently used ring of
349 * a specific IP block (all asics). 364 * a specific IP block (all asics).
350 * Returns 0 on success, error on failure. 365 * Returns 0 on success, error on failure.
351 */ 366 */
352int amdgpu_ring_lru_get(struct amdgpu_device *adev, int type, 367int amdgpu_ring_lru_get(struct amdgpu_device *adev, int type, int *blacklist,
353 struct amdgpu_ring **ring) 368 int num_blacklist, struct amdgpu_ring **ring)
354{ 369{
355 struct amdgpu_ring *entry; 370 struct amdgpu_ring *entry;
356 371
@@ -359,11 +374,15 @@ int amdgpu_ring_lru_get(struct amdgpu_device *adev, int type,
359 *ring = NULL; 374 *ring = NULL;
360 spin_lock(&adev->ring_lru_list_lock); 375 spin_lock(&adev->ring_lru_list_lock);
361 list_for_each_entry(entry, &adev->ring_lru_list, lru_list) { 376 list_for_each_entry(entry, &adev->ring_lru_list, lru_list) {
362 if (entry->funcs->type == type) { 377 if (entry->funcs->type != type)
363 *ring = entry; 378 continue;
364 amdgpu_ring_lru_touch_locked(adev, *ring); 379
365 break; 380 if (amdgpu_ring_is_blacklisted(entry, blacklist, num_blacklist))
366 } 381 continue;
382
383 *ring = entry;
384 amdgpu_ring_lru_touch_locked(adev, *ring);
385 break;
367 } 386 }
368 spin_unlock(&adev->ring_lru_list_lock); 387 spin_unlock(&adev->ring_lru_list_lock);
369 388