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 49d8a29..e5dd86d 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 55d5490..8ca3280 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 37d3cf1..287c87c 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 7469c4c..08b75bd 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;