]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/radeon/r600.c
drm/radeon/kms/pm: rework power management
[karo-tx-linux.git] / drivers / gpu / drm / radeon / r600.c
index 4f7f318b5437452d67e1f09f23c8a6cf396318a0..4691309940646723c1f8ff37a423866fe0b43b30 100644 (file)
@@ -247,7 +247,7 @@ void r600_get_power_state(struct radeon_device *rdev,
                 pcie_lanes);
 }
 
-void r600_set_power_state(struct radeon_device *rdev)
+void r600_set_power_state(struct radeon_device *rdev, bool static_switch)
 {
        u32 sclk, mclk;
 
@@ -266,37 +266,52 @@ void r600_set_power_state(struct radeon_device *rdev)
                        clock_info[rdev->pm.requested_clock_mode_index].mclk;
                if (mclk > rdev->clock.default_mclk)
                        mclk = rdev->clock.default_mclk;
-               /* don't change the mclk with multiple crtcs */
-               if (rdev->pm.active_crtc_count > 1)
-                       mclk = rdev->clock.default_mclk;
-
-               /* set pcie lanes */
-               /* TODO */
 
-               /* set voltage */
-               /* TODO */
+               /* voltage, pcie lanes, etc.*/
+               radeon_pm_misc(rdev);
 
-               /* set engine clock */
-               if (sclk != rdev->pm.current_sclk) {
-                       radeon_sync_with_vblank(rdev);
-                       radeon_pm_debug_check_in_vbl(rdev, false);
-                       radeon_set_engine_clock(rdev, sclk);
-                       radeon_pm_debug_check_in_vbl(rdev, true);
-                       rdev->pm.current_sclk = sclk;
-                       DRM_INFO("Setting: e: %d\n", sclk);
-               }
+               if (static_switch) {
+                       radeon_pm_prepare(rdev);
+                       /* set engine clock */
+                       if (sclk != rdev->pm.current_sclk) {
+                               radeon_set_engine_clock(rdev, sclk);
+                               rdev->pm.current_sclk = sclk;
+                               DRM_INFO("Setting: e: %d\n", sclk);
+                       }
+#if 0
+                       /* set memory clock */
+                       if (rdev->asic->set_memory_clock && (mclk != rdev->pm.current_mclk)) {
+                               radeon_set_memory_clock(rdev, mclk);
+                               rdev->pm.current_mclk = mclk;
+                               DRM_INFO("Setting: m: %d\n", mclk);
+                       }
+#endif
+                       radeon_pm_finish(rdev);
+               } else {
+                       /* set engine clock */
+                       if (sclk != rdev->pm.current_sclk) {
+                               radeon_sync_with_vblank(rdev);
+                               radeon_pm_debug_check_in_vbl(rdev, false);
+                               radeon_set_engine_clock(rdev, sclk);
+                               radeon_pm_debug_check_in_vbl(rdev, true);
+                               rdev->pm.current_sclk = sclk;
+                               DRM_INFO("Setting: e: %d\n", sclk);
+                       }
 
 #if 0
-               /* set memory clock */
-               if (rdev->asic->set_memory_clock && (mclk != rdev->pm.current_mclk)) {
-                       radeon_sync_with_vblank(rdev);
-                       radeon_pm_debug_check_in_vbl(rdev, false);
-                       radeon_set_memory_clock(rdev, mclk);
-                       radeon_pm_debug_check_in_vbl(rdev, true);
-                       rdev->pm.current_mclk = mclk;
-                       DRM_INFO("Setting: m: %d\n", mclk);
-               }
+                       /* set memory clock */
+                       if (rdev->asic->set_memory_clock && (mclk != rdev->pm.current_mclk)) {
+                               radeon_sync_with_vblank(rdev);
+                               radeon_pm_debug_check_in_vbl(rdev, false);
+                               radeon_pm_prepare(rdev);
+                               radeon_set_memory_clock(rdev, mclk);
+                               radeon_pm_finish(rdev);
+                               radeon_pm_debug_check_in_vbl(rdev, true);
+                               rdev->pm.current_mclk = mclk;
+                               DRM_INFO("Setting: m: %d\n", mclk);
+                       }
 #endif
+               }
 
                rdev->pm.current_power_state_index = rdev->pm.requested_power_state_index;
                rdev->pm.current_clock_mode_index = rdev->pm.requested_clock_mode_index;
@@ -304,6 +319,11 @@ void r600_set_power_state(struct radeon_device *rdev)
                DRM_INFO("GUI not idle!!!\n");
 }
 
+void r600_pm_misc(struct radeon_device *rdev)
+{
+
+}
+
 bool r600_gui_idle(struct radeon_device *rdev)
 {
        if (RREG32(GRBM_STATUS) & GUI_ACTIVE)