summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-01-16 12:52:04 -0500
committerAlex Deucher <alexander.deucher@amd.com>2013-06-27 19:16:16 -0400
commit84dd1928260fe82344c1d587900bce630c1e6e66 (patch)
tree02598c28ad2991757891b14a7900d57450618a35 /drivers/gpu
parent940eea8e4d92ef92e376d48970079386ea2a4bf3 (diff)
downloadblackbird-op-linux-84dd1928260fe82344c1d587900bce630c1e6e66.tar.gz
blackbird-op-linux-84dd1928260fe82344c1d587900bce630c1e6e66.zip
drm/radeon/dpm: add new pre/post_set_power_state callbacks
Needed to properly handle dynamic state adjustment. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/radeon/radeon.h4
-rw-r--r--drivers/gpu/drm/radeon/radeon_pm.c11
2 files changed, 15 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index a0ab625553ea..c5d83c145cc7 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -1615,7 +1615,9 @@ struct radeon_asic {
void (*setup_asic)(struct radeon_device *rdev);
int (*enable)(struct radeon_device *rdev);
void (*disable)(struct radeon_device *rdev);
+ int (*pre_set_power_state)(struct radeon_device *rdev);
int (*set_power_state)(struct radeon_device *rdev);
+ void (*post_set_power_state)(struct radeon_device *rdev);
void (*display_configuration_changed)(struct radeon_device *rdev);
void (*fini)(struct radeon_device *rdev);
u32 (*get_sclk)(struct radeon_device *rdev, bool low);
@@ -2328,7 +2330,9 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
#define radeon_dpm_setup_asic(rdev) rdev->asic->dpm.setup_asic((rdev))
#define radeon_dpm_enable(rdev) rdev->asic->dpm.enable((rdev))
#define radeon_dpm_disable(rdev) rdev->asic->dpm.disable((rdev))
+#define radeon_dpm_pre_set_power_state(rdev) rdev->asic->dpm.pre_set_power_state((rdev))
#define radeon_dpm_set_power_state(rdev) rdev->asic->dpm.set_power_state((rdev))
+#define radeon_dpm_post_set_power_state(rdev) rdev->asic->dpm.post_set_power_state((rdev))
#define radeon_dpm_display_configuration_changed(rdev) rdev->asic->dpm.display_configuration_changed((rdev))
#define radeon_dpm_fini(rdev) rdev->asic->dpm.fini((rdev))
#define radeon_dpm_get_sclk(rdev, l) rdev->asic->dpm.get_sclk((rdev), (l))
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
index 7143c914fc84..4e2ccc6b75fb 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -700,6 +700,7 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
int i;
struct radeon_ps *ps;
enum radeon_pm_state_type dpm_state;
+ int ret;
/* if dpm init failed */
if (!rdev->pm.dpm_enabled)
@@ -766,6 +767,12 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
down_write(&rdev->pm.mclk_lock);
mutex_lock(&rdev->ring_lock);
+ if (rdev->asic->dpm.pre_set_power_state) {
+ ret = radeon_dpm_pre_set_power_state(rdev);
+ if (ret)
+ goto done;
+ }
+
/* update display watermarks based on new power state */
radeon_bandwidth_update(rdev);
/* update displays */
@@ -787,6 +794,10 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
/* update current power state */
rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps;
+ if (rdev->asic->dpm.post_set_power_state)
+ radeon_dpm_post_set_power_state(rdev);
+
+done:
mutex_unlock(&rdev->ring_lock);
up_write(&rdev->pm.mclk_lock);
mutex_unlock(&rdev->ddev->struct_mutex);
OpenPOWER on IntegriCloud