drm/radeon: add radeon_fence_count_emited function
Split counting of emited fences out of power management into a seperate function. Signed-off-by: Christian König <deathsimple@vodafone.de> Reviewed-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
committed by
Dave Airlie
parent
4c87bc268d
commit
47492a23a1
@@ -226,6 +226,7 @@ int radeon_fence_wait_next(struct radeon_device *rdev, int ring);
|
|||||||
int radeon_fence_wait_last(struct radeon_device *rdev, int ring);
|
int radeon_fence_wait_last(struct radeon_device *rdev, int ring);
|
||||||
struct radeon_fence *radeon_fence_ref(struct radeon_fence *fence);
|
struct radeon_fence *radeon_fence_ref(struct radeon_fence *fence);
|
||||||
void radeon_fence_unref(struct radeon_fence **fence);
|
void radeon_fence_unref(struct radeon_fence **fence);
|
||||||
|
int radeon_fence_count_emitted(struct radeon_device *rdev, int ring);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Semaphores.
|
* Semaphores.
|
||||||
|
@@ -368,6 +368,27 @@ void radeon_fence_process(struct radeon_device *rdev, int ring)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int radeon_fence_count_emitted(struct radeon_device *rdev, int ring)
|
||||||
|
{
|
||||||
|
unsigned long irq_flags;
|
||||||
|
int not_processed = 0;
|
||||||
|
|
||||||
|
read_lock_irqsave(&rdev->fence_lock, irq_flags);
|
||||||
|
if (!rdev->fence_drv[ring].initialized)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!list_empty(&rdev->fence_drv[ring].emitted)) {
|
||||||
|
struct list_head *ptr;
|
||||||
|
list_for_each(ptr, &rdev->fence_drv[ring].emitted) {
|
||||||
|
/* count up to 3, that's enought info */
|
||||||
|
if (++not_processed >= 3)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
read_unlock_irqrestore(&rdev->fence_lock, irq_flags);
|
||||||
|
return not_processed;
|
||||||
|
}
|
||||||
|
|
||||||
int radeon_fence_driver_init(struct radeon_device *rdev, int num_rings)
|
int radeon_fence_driver_init(struct radeon_device *rdev, int num_rings)
|
||||||
{
|
{
|
||||||
unsigned long irq_flags;
|
unsigned long irq_flags;
|
||||||
|
@@ -802,27 +802,14 @@ static void radeon_dynpm_idle_work_handler(struct work_struct *work)
|
|||||||
resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev);
|
resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev);
|
||||||
mutex_lock(&rdev->pm.mutex);
|
mutex_lock(&rdev->pm.mutex);
|
||||||
if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE) {
|
if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE) {
|
||||||
unsigned long irq_flags;
|
|
||||||
int not_processed = 0;
|
int not_processed = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
read_lock_irqsave(&rdev->fence_lock, irq_flags);
|
|
||||||
for (i = 0; i < RADEON_NUM_RINGS; ++i) {
|
for (i = 0; i < RADEON_NUM_RINGS; ++i) {
|
||||||
if (!rdev->fence_drv[i].initialized)
|
not_processed += radeon_fence_count_emitted(rdev, i);
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!list_empty(&rdev->fence_drv[i].emitted)) {
|
|
||||||
struct list_head *ptr;
|
|
||||||
list_for_each(ptr, &rdev->fence_drv[i].emitted) {
|
|
||||||
/* count up to 3, that's enought info */
|
|
||||||
if (++not_processed >= 3)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (not_processed >= 3)
|
if (not_processed >= 3)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
read_unlock_irqrestore(&rdev->fence_lock, irq_flags);
|
|
||||||
|
|
||||||
if (not_processed >= 3) { /* should upclock */
|
if (not_processed >= 3) { /* should upclock */
|
||||||
if (rdev->pm.dynpm_planned_action == DYNPM_ACTION_DOWNCLOCK) {
|
if (rdev->pm.dynpm_planned_action == DYNPM_ACTION_DOWNCLOCK) {
|
||||||
|
Reference in New Issue
Block a user