diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_pm.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 15 | 
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index aa14dbb7e4f..0bfa656aa87 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c @@ -234,7 +234,7 @@ static void radeon_set_power_state(struct radeon_device *rdev)  static void radeon_pm_set_clocks(struct radeon_device *rdev)  { -	int i; +	int i, r;  	/* no need to take locks, etc. if nothing's going to change */  	if ((rdev->pm.requested_clock_mode_index == rdev->pm.current_clock_mode_index) && @@ -248,8 +248,17 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev)  	/* wait for the rings to drain */  	for (i = 0; i < RADEON_NUM_RINGS; i++) {  		struct radeon_ring *ring = &rdev->ring[i]; -		if (ring->ready) -			radeon_fence_wait_empty_locked(rdev, i); +		if (!ring->ready) { +			continue; +		} +		r = radeon_fence_wait_empty_locked(rdev, i); +		if (r) { +			/* needs a GPU reset dont reset here */ +			mutex_unlock(&rdev->ring_lock); +			up_write(&rdev->pm.mclk_lock); +			mutex_unlock(&rdev->ddev->struct_mutex); +			return; +		}  	}  	radeon_unmap_vram_bos(rdev);  |