diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 33 |
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 | ||
341 | static 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 | */ |
352 | int amdgpu_ring_lru_get(struct amdgpu_device *adev, int type, | 367 | int 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 | ||