diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_pm.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 27 |
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 | ||
287 | static 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 | } | ||
286 | static void radeon_pm_set_clocks_locked(struct radeon_device *rdev) | 309 | static 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 | ||