drm/amd/powerplay: refine the logic of whether need to update power state.
authorRex Zhu <Rex.Zhu@amd.com>
Wed, 4 Nov 2015 06:56:56 +0000 (14:56 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 21 Dec 2015 21:42:29 +0000 (16:42 -0500)
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>
drivers/gpu/drm/amd/powerplay/eventmgr/psm.c
drivers/gpu/drm/amd/powerplay/eventmgr/psm.h

index 08b75bd70c0f6a9464c54c34a15a7fe7439cf43f..82774ace8bdbccba45ddbcad7b06dd8869734974 100644 (file)
@@ -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;
index 15abfac720ee23cf946264d6c705eff78de3f785..1380470fdb1cd4f73b56cfc25f5c15db38619944 100644 (file)
@@ -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);