From: Rex Zhu Date: Wed, 4 Nov 2015 06:56:56 +0000 (+0800) Subject: drm/amd/powerplay: refine the logic of whether need to update power state. X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=f4caf3e584120e20f8ecabefa8a0d62fe9b3ec89;p=GitHub%2Fmoto-9609%2Fandroid_kernel_motorola_exynos9610.git drm/amd/powerplay: refine the logic of whether need to update power state. Better handle power state changes. Signed-off-by: Rex Zhu Reviewed-by: Alex Deucher Reviewed-by: Jammy Zhou --- diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c index 08b75bd70c0f..82774ace8bdb 100644 --- a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c +++ b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c @@ -86,9 +86,10 @@ int psm_set_performance_states(struct pp_eventmgr *eventmgr, unsigned long *stat int psm_adjust_power_state_dynamic(struct pp_eventmgr *eventmgr, bool skip) { - const struct pp_power_state *pcurrent; - struct pp_power_state *requested; + struct pp_power_state *pcurrent; + struct pp_power_state *requested; struct pp_hwmgr *hwmgr; + bool equal; if (skip) return 0; @@ -97,7 +98,13 @@ int psm_adjust_power_state_dynamic(struct pp_eventmgr *eventmgr, bool skip) pcurrent = hwmgr->current_ps; requested = hwmgr->request_ps; - if ((pcurrent != NULL || requested != NULL) && (pcurrent != requested)) { + if (requested == NULL) + return 0; + + if (pcurrent == NULL || (0 != phm_check_states_equal(hwmgr, &pcurrent->hardware, &requested->hardware, &equal))) + equal = false; + + if (!equal || phm_check_smc_update_required_for_display_configuration(hwmgr)) { phm_apply_state_adjust_rules(hwmgr, requested, pcurrent); phm_set_power_state(hwmgr, &pcurrent->hardware, &requested->hardware); hwmgr->current_ps = requested; diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.h b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.h index 15abfac720ee..1380470fdb1c 100644 --- a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.h +++ b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.h @@ -25,6 +25,7 @@ #include "eventmanagement.h" #include "eventmanager.h" #include "power_state.h" +#include "hardwaremanager.h" int psm_get_ui_state(struct pp_eventmgr *eventmgr, enum PP_StateUILabel ui_label, unsigned long *state_id);