drm/amd/powerplay: add GFX per cu powergating for Baffin
authorEric Huang <JinHuiEric.Huang@amd.com>
Fri, 11 Mar 2016 19:53:39 +0000 (14:53 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 5 May 2016 00:27:09 +0000 (20:27 -0400)
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Eric Huang <JinHuiEric.Huang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/hwmgr/ellesmere_clockpowergating.c
drivers/gpu/drm/amd/powerplay/hwmgr/ellesmere_clockpowergating.h
drivers/gpu/drm/amd/powerplay/hwmgr/ellesmere_hwmgr.c

index a94f6a8e88a28be3c3fc48b03286a9f726541ccd..93db8241a154a39ef8a53b2d710cb3ad5750751f 100644 (file)
@@ -398,3 +398,31 @@ int ellesmere_phm_update_clock_gatings(struct pp_hwmgr *hwmgr,
 
        return 0;
 }
+
+/* This function is for Baffin only for now,
+ * Powerplay will only control the static per CU Power Gating.
+ * Dynamic per CU Power Gating will be done in gfx.
+ */
+int ellesmere_phm_enable_per_cu_power_gating(struct pp_hwmgr *hwmgr, bool enable)
+{
+       struct cgs_system_info sys_info = {0};
+       uint32_t active_cus;
+       int result;
+
+       sys_info.size = sizeof(struct cgs_system_info);
+       sys_info.info_id = CGS_SYSTEM_INFO_GFX_CU_INFO;
+
+       result = cgs_query_system_info(hwmgr->device, &sys_info);
+
+       if (result)
+               return -EINVAL;
+       else
+               active_cus = sys_info.value;
+
+       if (enable)
+               return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                               PPSMC_MSG_GFX_CU_PG_ENABLE, active_cus);
+       else
+               return smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_GFX_CU_PG_DISABLE);
+}
index a90577eca6a7af1dd7779f290aa637256a98e7b1..b403e1112f040d8beb143d21d469403227aa22d9 100644 (file)
@@ -35,5 +35,6 @@ int ellesmere_phm_powergate_acp(struct pp_hwmgr *hwmgr, bool bgate);
 int ellesmere_phm_disable_clock_power_gating(struct pp_hwmgr *hwmgr);
 int ellesmere_phm_update_clock_gatings(struct pp_hwmgr *hwmgr,
                                        const uint32_t *msg_id);
+int ellesmere_phm_enable_per_cu_power_gating(struct pp_hwmgr *hwmgr, bool enable);
 
 #endif /* _ELLESMERE_CLOCK_POWER_GATING_H_ */
index c87d5ef213617b4afb02d4e51da17aecde7a92f1..152d77d8d3fc5c9cdaac3b3aa33915ac83fb0560 100644 (file)
@@ -4687,6 +4687,11 @@ static const struct pp_hwmgr_func ellesmere_hwmgr_funcs = {
        .register_internal_thermal_interrupt = ellesmere_register_internal_thermal_interrupt,
        .check_smc_update_required_for_display_configuration = ellesmere_check_smc_update_required_for_display_configuration,
        .check_states_equal = ellesmere_check_states_equal,
+       .get_pp_table = ellesmere_get_pp_table,
+       .set_pp_table = ellesmere_set_pp_table,
+       .force_clock_level = ellesmere_force_clock_level,
+       .print_clock_levels = ellesmere_print_clock_levels,
+       .enable_per_cu_power_gating = ellesmere_phm_enable_per_cu_power_gating,
 };
 
 int ellesemere_hwmgr_init(struct pp_hwmgr *hwmgr)