Commit 914a8987 authored by Alex Deucher's avatar Alex Deucher

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: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 01ac8794
...@@ -252,6 +252,7 @@ struct radeon_clock { ...@@ -252,6 +252,7 @@ struct radeon_clock {
* Power management * Power management
*/ */
int radeon_pm_init(struct radeon_device *rdev); int radeon_pm_init(struct radeon_device *rdev);
int radeon_pm_late_init(struct radeon_device *rdev);
void radeon_pm_fini(struct radeon_device *rdev); void radeon_pm_fini(struct radeon_device *rdev);
void radeon_pm_compute_clocks(struct radeon_device *rdev); void radeon_pm_compute_clocks(struct radeon_device *rdev);
void radeon_pm_suspend(struct radeon_device *rdev); void radeon_pm_suspend(struct radeon_device *rdev);
...@@ -1780,6 +1781,7 @@ struct radeon_asic { ...@@ -1780,6 +1781,7 @@ struct radeon_asic {
int (*init)(struct radeon_device *rdev); int (*init)(struct radeon_device *rdev);
void (*setup_asic)(struct radeon_device *rdev); void (*setup_asic)(struct radeon_device *rdev);
int (*enable)(struct radeon_device *rdev); int (*enable)(struct radeon_device *rdev);
int (*late_enable)(struct radeon_device *rdev);
void (*disable)(struct radeon_device *rdev); void (*disable)(struct radeon_device *rdev);
int (*pre_set_power_state)(struct radeon_device *rdev); int (*pre_set_power_state)(struct radeon_device *rdev);
int (*set_power_state)(struct radeon_device *rdev); int (*set_power_state)(struct radeon_device *rdev);
...@@ -2655,6 +2657,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v); ...@@ -2655,6 +2657,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
#define radeon_dpm_init(rdev) rdev->asic->dpm.init((rdev)) #define radeon_dpm_init(rdev) rdev->asic->dpm.init((rdev))
#define radeon_dpm_setup_asic(rdev) rdev->asic->dpm.setup_asic((rdev)) #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_enable(rdev) rdev->asic->dpm.enable((rdev))
#define radeon_dpm_late_enable(rdev) rdev->asic->dpm.late_enable((rdev))
#define radeon_dpm_disable(rdev) rdev->asic->dpm.disable((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_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_set_power_state(rdev) rdev->asic->dpm.set_power_state((rdev))
......
...@@ -1288,6 +1288,18 @@ int radeon_pm_init(struct radeon_device *rdev) ...@@ -1288,6 +1288,18 @@ int radeon_pm_init(struct radeon_device *rdev)
return radeon_pm_init_old(rdev); return radeon_pm_init_old(rdev);
} }
int radeon_pm_late_init(struct radeon_device *rdev)
{
int ret = 0;
if (rdev->pm.pm_method == PM_METHOD_DPM) {
mutex_lock(&rdev->pm.mutex);
ret = radeon_dpm_late_enable(rdev);
mutex_unlock(&rdev->pm.mutex);
}
return ret;
}
static void radeon_pm_fini_old(struct radeon_device *rdev) static void radeon_pm_fini_old(struct radeon_device *rdev)
{ {
if (rdev->pm.num_power_states > 1) { if (rdev->pm.num_power_states > 1) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment