aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-12-19 11:37:22 -0500
committerAlex Deucher <alexander.deucher@amd.com>2013-12-24 17:54:56 -0500
commit914a89872be27db59546525ea96be817c7b2509c (patch)
tree927b30218bcbc8439281e85cd1c71cc92a513cdb
parent01ac8794a77192236a4b91c33adf4177ac5a21f0 (diff)
drm/radeon/dpm: add a late enable callback
Certain features need to be enabled after ring tests (e.g., powergating, etc.). Add a function pointer to split out late enable features. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/radeon.h3
-rw-r--r--drivers/gpu/drm/radeon/radeon_pm.c12
2 files changed, 15 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 572476b61d89..869465aafbc5 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -252,6 +252,7 @@ struct radeon_clock {
252 * Power management 252 * Power management
253 */ 253 */
254int radeon_pm_init(struct radeon_device *rdev); 254int radeon_pm_init(struct radeon_device *rdev);
255int radeon_pm_late_init(struct radeon_device *rdev);
255void radeon_pm_fini(struct radeon_device *rdev); 256void radeon_pm_fini(struct radeon_device *rdev);
256void radeon_pm_compute_clocks(struct radeon_device *rdev); 257void radeon_pm_compute_clocks(struct radeon_device *rdev);
257void radeon_pm_suspend(struct radeon_device *rdev); 258void radeon_pm_suspend(struct radeon_device *rdev);
@@ -1780,6 +1781,7 @@ struct radeon_asic {
1780 int (*init)(struct radeon_device *rdev); 1781 int (*init)(struct radeon_device *rdev);
1781 void (*setup_asic)(struct radeon_device *rdev); 1782 void (*setup_asic)(struct radeon_device *rdev);
1782 int (*enable)(struct radeon_device *rdev); 1783 int (*enable)(struct radeon_device *rdev);
1784 int (*late_enable)(struct radeon_device *rdev);
1783 void (*disable)(struct radeon_device *rdev); 1785 void (*disable)(struct radeon_device *rdev);
1784 int (*pre_set_power_state)(struct radeon_device *rdev); 1786 int (*pre_set_power_state)(struct radeon_device *rdev);
1785 int (*set_power_state)(struct radeon_device *rdev); 1787 int (*set_power_state)(struct radeon_device *rdev);
@@ -2655,6 +2657,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
2655#define radeon_dpm_init(rdev) rdev->asic->dpm.init((rdev)) 2657#define radeon_dpm_init(rdev) rdev->asic->dpm.init((rdev))
2656#define radeon_dpm_setup_asic(rdev) rdev->asic->dpm.setup_asic((rdev)) 2658#define radeon_dpm_setup_asic(rdev) rdev->asic->dpm.setup_asic((rdev))
2657#define radeon_dpm_enable(rdev) rdev->asic->dpm.enable((rdev)) 2659#define radeon_dpm_enable(rdev) rdev->asic->dpm.enable((rdev))
2660#define radeon_dpm_late_enable(rdev) rdev->asic->dpm.late_enable((rdev))
2658#define radeon_dpm_disable(rdev) rdev->asic->dpm.disable((rdev)) 2661#define radeon_dpm_disable(rdev) rdev->asic->dpm.disable((rdev))
2659#define radeon_dpm_pre_set_power_state(rdev) rdev->asic->dpm.pre_set_power_state((rdev)) 2662#define radeon_dpm_pre_set_power_state(rdev) rdev->asic->dpm.pre_set_power_state((rdev))
2660#define radeon_dpm_set_power_state(rdev) rdev->asic->dpm.set_power_state((rdev)) 2663#define radeon_dpm_set_power_state(rdev) rdev->asic->dpm.set_power_state((rdev))
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
index 384758d011e4..d4e5bcfeb77d 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -1288,6 +1288,18 @@ int radeon_pm_init(struct radeon_device *rdev)
1288 return radeon_pm_init_old(rdev); 1288 return radeon_pm_init_old(rdev);
1289} 1289}
1290 1290
1291int radeon_pm_late_init(struct radeon_device *rdev)
1292{
1293 int ret = 0;
1294
1295 if (rdev->pm.pm_method == PM_METHOD_DPM) {
1296 mutex_lock(&rdev->pm.mutex);
1297 ret = radeon_dpm_late_enable(rdev);
1298 mutex_unlock(&rdev->pm.mutex);
1299 }
1300 return ret;
1301}
1302
1291static void radeon_pm_fini_old(struct radeon_device *rdev) 1303static void radeon_pm_fini_old(struct radeon_device *rdev)
1292{ 1304{
1293 if (rdev->pm.num_power_states > 1) { 1305 if (rdev->pm.num_power_states > 1) {