summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRex Zhu <Rex.Zhu@amd.com>2015-11-04 14:56:56 +0800
committerAlex Deucher <alexander.deucher@amd.com>2015-12-21 16:42:29 -0500
commitf4caf3e584120e20f8ecabefa8a0d62fe9b3ec89 (patch)
treef3ea3716f6b864e0a1d315b0f3378e702319afe6 /drivers
parente829ecdb15671d8c1a106f608aa419f7fd4d7366 (diff)
downloadlinux-f4caf3e584120e20f8ecabefa8a0d62fe9b3ec89.tar.bz2
drm/amd/powerplay: refine the logic of whether need to update power state.
Better handle power state changes. Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/amd/powerplay/eventmgr/psm.c13
-rw-r--r--drivers/gpu/drm/amd/powerplay/eventmgr/psm.h1
2 files changed, 11 insertions, 3 deletions
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);