aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_pm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_pm.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_pm.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
index f0234351fd5..6dbfdf48a5f 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -22,6 +22,7 @@
22 */ 22 */
23#include "drmP.h" 23#include "drmP.h"
24#include "radeon.h" 24#include "radeon.h"
25#include "avivod.h"
25 26
26#define RADEON_IDLE_LOOP_MS 100 27#define RADEON_IDLE_LOOP_MS 100
27#define RADEON_RECLOCK_DELAY_MS 200 28#define RADEON_RECLOCK_DELAY_MS 200
@@ -283,6 +284,28 @@ void radeon_pm_compute_clocks(struct radeon_device *rdev)
283 mutex_unlock(&rdev->pm.mutex); 284 mutex_unlock(&rdev->pm.mutex);
284} 285}
285 286
287static bool radeon_pm_debug_check_in_vbl(struct radeon_device *rdev, bool finish)
288{
289 u32 stat_crtc1 = 0, stat_crtc2 = 0;
290 bool in_vbl = true;
291
292 if (ASIC_IS_AVIVO(rdev)) {
293 if (rdev->pm.active_crtcs & (1 << 0)) {
294 stat_crtc1 = RREG32(D1CRTC_STATUS);
295 if (!(stat_crtc1 & 1))
296 in_vbl = false;
297 }
298 if (rdev->pm.active_crtcs & (1 << 1)) {
299 stat_crtc2 = RREG32(D2CRTC_STATUS);
300 if (!(stat_crtc2 & 1))
301 in_vbl = false;
302 }
303 }
304 if (in_vbl == false)
305 DRM_INFO("not in vbl for pm change %08x %08x at %s\n", stat_crtc1,
306 stat_crtc2, finish ? "exit" : "entry");
307 return in_vbl;
308}
286static void radeon_pm_set_clocks_locked(struct radeon_device *rdev) 309static void radeon_pm_set_clocks_locked(struct radeon_device *rdev)
287{ 310{
288 /*radeon_fence_wait_last(rdev);*/ 311 /*radeon_fence_wait_last(rdev);*/
@@ -299,7 +322,11 @@ static void radeon_pm_set_clocks_locked(struct radeon_device *rdev)
299 DRM_ERROR("%s: PM_ACTION_NONE\n", __func__); 322 DRM_ERROR("%s: PM_ACTION_NONE\n", __func__);
300 break; 323 break;
301 } 324 }
325
326 /* check if we are in vblank */
327 radeon_pm_debug_check_in_vbl(rdev, false);
302 radeon_set_power_state(rdev); 328 radeon_set_power_state(rdev);
329 radeon_pm_debug_check_in_vbl(rdev, true);
303 rdev->pm.planned_action = PM_ACTION_NONE; 330 rdev->pm.planned_action = PM_ACTION_NONE;
304} 331}
305 332