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>
This commit is contained in:
parent
940eea8e4d
commit
84dd192826
2 changed files with 15 additions and 0 deletions
|
@ -1615,7 +1615,9 @@ struct radeon_asic {
|
||||||
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);
|
||||||
void (*disable)(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);
|
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 (*display_configuration_changed)(struct radeon_device *rdev);
|
||||||
void (*fini)(struct radeon_device *rdev);
|
void (*fini)(struct radeon_device *rdev);
|
||||||
u32 (*get_sclk)(struct radeon_device *rdev, bool low);
|
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_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_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_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))
|
||||||
|
#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_display_configuration_changed(rdev) rdev->asic->dpm.display_configuration_changed((rdev))
|
||||||
#define radeon_dpm_fini(rdev) rdev->asic->dpm.fini((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))
|
#define radeon_dpm_get_sclk(rdev, l) rdev->asic->dpm.get_sclk((rdev), (l))
|
||||||
|
|
|
@ -700,6 +700,7 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
|
||||||
int i;
|
int i;
|
||||||
struct radeon_ps *ps;
|
struct radeon_ps *ps;
|
||||||
enum radeon_pm_state_type dpm_state;
|
enum radeon_pm_state_type dpm_state;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* if dpm init failed */
|
/* if dpm init failed */
|
||||||
if (!rdev->pm.dpm_enabled)
|
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);
|
down_write(&rdev->pm.mclk_lock);
|
||||||
mutex_lock(&rdev->ring_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 */
|
/* update display watermarks based on new power state */
|
||||||
radeon_bandwidth_update(rdev);
|
radeon_bandwidth_update(rdev);
|
||||||
/* update displays */
|
/* update displays */
|
||||||
|
@ -787,6 +794,10 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
|
||||||
/* update current power state */
|
/* update current power state */
|
||||||
rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps;
|
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);
|
mutex_unlock(&rdev->ring_lock);
|
||||||
up_write(&rdev->pm.mclk_lock);
|
up_write(&rdev->pm.mclk_lock);
|
||||||
mutex_unlock(&rdev->ddev->struct_mutex);
|
mutex_unlock(&rdev->ddev->struct_mutex);
|
||||||
|
|
Loading…
Add table
Reference in a new issue