drm/radeon/dpm: fixup dynamic state adjust for sumo
authorAlex Deucher <alexander.deucher@amd.com>
Fri, 30 Nov 2012 01:27:50 +0000 (20:27 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 27 Jun 2013 23:15:51 +0000 (19:15 -0400)
Use a dedicated copy of the current power state since
we may have to adjust it on the fly.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_pm.c
drivers/gpu/drm/radeon/sumo_dpm.c
drivers/gpu/drm/radeon/sumo_dpm.h

index db31f20e2204e802d2c96144df642e91b38e3d3a..0c33887ca2ba2dbbc9bbf8801043d81e23c4d858 100644 (file)
@@ -1289,6 +1289,7 @@ struct radeon_dpm {
        struct radeon_ps        *boot_ps;
        /* default uvd power state */
        struct radeon_ps        *uvd_ps;
+       struct radeon_ps        hw_ps;
        enum radeon_pm_state_type state;
        enum radeon_pm_state_type user_state;
        u32                     platform_caps;
index 79e35d6a40e319365d2a8bcaa615980a27361ff3..196c65a9df3b06e9ec55b55c6a7994844ea89fda 100644 (file)
@@ -684,6 +684,17 @@ restart_search:
        return NULL;
 }
 
+static void radeon_dpm_update_requested_ps(struct radeon_device *rdev,
+                                          struct radeon_ps *ps)
+{
+       /* copy the ps to the hw ps and point the requested ps
+        * at the hw state in case the driver wants to modify
+        * the state dynamically.
+        */
+       rdev->pm.dpm.hw_ps = *ps;
+       rdev->pm.dpm.requested_ps = &rdev->pm.dpm.hw_ps;
+}
+
 static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
 {
        int i;
@@ -704,7 +715,7 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
 
        ps = radeon_dpm_pick_power_state(rdev, dpm_state);
        if (ps)
-               rdev->pm.dpm.requested_ps = ps;
+               radeon_dpm_update_requested_ps(rdev, ps);
        else
                return;
 
index 7bd3fca175decd84f43555ba592177c249c5c654..9e4248c505148a94cac533738eb4bcb06295021b 100644 (file)
@@ -1072,6 +1072,11 @@ static void sumo_apply_state_adjust_rules(struct radeon_device *rdev)
        u32 sclk_in_sr = pi->sys_info.min_sclk; /* ??? */
        u32 i;
 
+       /* point to the hw copy since this function will modify the ps */
+       pi->hw_ps = *ps;
+       rdev->pm.dpm.hw_ps.ps_priv = &pi->hw_ps;
+       ps = &pi->hw_ps;
+
        if (rps->class & ATOM_PPLIB_CLASSIFICATION_THERMAL)
                return sumo_patch_thermal_state(rdev, ps, current_ps);
 
index d041a6cf11bab3804c89ccca3a47baeaa5be7741..a40b62ae095755ab7c9c7c2bf5ce8fa0b8e97b0d 100644 (file)
@@ -129,6 +129,7 @@ struct sumo_power_info {
        bool enable_dynamic_patch_ps;
        bool enable_dpm;
        bool enable_boost;
+       struct sumo_ps hw_ps;
 };
 
 #define SUMO_UTC_DFLT_00                     0x48