drm/amdgpu/powerplay: implement pem_task for display_configuration_change
authorRex Zhu <Rex.Zhu@amd.com>
Fri, 16 Oct 2015 06:59:17 +0000 (14:59 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 21 Dec 2015 21:42:19 +0000 (16:42 -0500)
Add support for display configuration changes to the event manager.

Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.c
drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c
drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.h
drivers/gpu/drm/amd/powerplay/eventmgr/psm.c

index 49d8a2978a186b8379af3c946800251deb7b52c9..e5dd86d23045d72bb52d11f2dd8a63c116020e63 100644 (file)
@@ -152,7 +152,7 @@ const pem_event_action set_boot_state_tasks[] = {
 const pem_event_action adjust_power_state_tasks[] = {
        pem_task_notify_hw_mgr_display_configuration_change,
        pem_task_adjust_power_state,
-       /*pem_task_notify_smc_display_config_after_power_state_adjustment,*/
+       pem_task_notify_smc_display_config_after_power_state_adjustment,
        pem_task_update_allowed_performance_levels,
        /* to do pem_task_Enable_disable_bapm, */
        NULL
index 55d5490339e4a0530f4e39e57023f78557761898..8ca32803c2ed22b2af5b36bd9d48dfec03e3392f 100644 (file)
@@ -189,16 +189,25 @@ int pem_task_store_dal_configuration(struct pp_eventmgr *eventmgr, const struct
 
 int pem_task_notify_hw_mgr_display_configuration_change(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
 {
-       /* TODO */
-       return 0;
+       if (pem_is_hw_access_blocked(eventmgr))
+               return 0;
+
+       return phm_display_configuration_changed(eventmgr->hwmgr);
 }
 
 int pem_task_notify_hw_mgr_pre_display_configuration_change(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
 {
-       /* TODO */
        return 0;
 }
 
+int pem_task_notify_smc_display_config_after_power_state_adjustment(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
+{
+       if (pem_is_hw_access_blocked(eventmgr))
+               return 0;
+
+       return phm_notify_smc_display_config_after_ps_adjustment(eventmgr->hwmgr);
+}
+
 int pem_task_block_adjust_power_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
 {
        eventmgr->block_adjust_power_state = true;
index 37d3cf1665a06b350fed58e4c0166e47ed7d3b9a..287c87cede7755dccc5ce8dc5f5083fba88c3dca 100644 (file)
@@ -57,7 +57,7 @@ int pem_task_block_hw_access(struct pp_eventmgr *eventmgr, struct pem_event_data
 int pem_task_un_block_hw_access(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
 int pem_task_reset_display_phys_access(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
 int pem_task_set_cpu_power_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-
+int pem_task_notify_smc_display_config_after_power_state_adjustment(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
 /*powersaving*/
 
 int pem_task_set_power_source(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
index 7469c4cd9528ec6503bba6b553bb4cd191540cf9..08b75bd70c0f6a9464c54c34a15a7fe7439cf43f 100644 (file)
@@ -97,7 +97,7 @@ 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) {
+       if ((pcurrent != NULL || requested != NULL) && (pcurrent != requested)) {
                phm_apply_state_adjust_rules(hwmgr, requested, pcurrent);
                phm_set_power_state(hwmgr, &pcurrent->hardware, &requested->hardware);
                hwmgr->current_ps = requested;