Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 47492a23 authored by Christian König's avatar Christian König Committed by Dave Airlie
Browse files

drm/radeon: add radeon_fence_count_emited function



Split counting of emited fences out of power
management into a seperate function.

Signed-off-by: default avatarChristian König <deathsimple@vodafone.de>
Reviewed-by: default avatarJerome Glisse <jglisse@redhat.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 4c87bc26
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
struct radeon_fence *radeon_fence_ref(struct radeon_fence *fence);
void radeon_fence_unref(struct radeon_fence **fence);
int radeon_fence_count_emitted(struct radeon_device *rdev, int ring);

/*
 * Semaphores.
+21 −0
Original line number Diff line number Diff line
@@ -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)
{
	unsigned long irq_flags;
+1 −14
Original line number Diff line number Diff line
@@ -802,27 +802,14 @@ static void radeon_dynpm_idle_work_handler(struct work_struct *work)
	resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev);
	mutex_lock(&rdev->pm.mutex);
	if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE) {
		unsigned long irq_flags;
		int not_processed = 0;
		int i;

		read_lock_irqsave(&rdev->fence_lock, irq_flags);
		for (i = 0; i < RADEON_NUM_RINGS; ++i) {
			if (!rdev->fence_drv[i].initialized)
				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;
				}
			}
			not_processed += radeon_fence_count_emitted(rdev, i);
			if (not_processed >= 3)
				break;
		}
		read_unlock_irqrestore(&rdev->fence_lock, irq_flags);

		if (not_processed >= 3) { /* should upclock */
			if (rdev->pm.dynpm_planned_action == DYNPM_ACTION_DOWNCLOCK) {