[PATCH 2/2] drm/amd/powerplay: Enable "disable dpm" feature for vega20 power functions.

Chengming Gui Jack.Gui at amd.com
Fri May 10 08:48:37 UTC 2019


use pm_enabled to control all power related functions about vega20.

Signed-off-by: Chengming Gui <Jack.Gui at amd.com>
---
 drivers/gpu/drm/amd/powerplay/vega20_ppt.c | 48 +++++++++++++++++++++++-------
 1 file changed, 38 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
index 8fafcbd..7faa6a1 100644
--- a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
@@ -411,7 +411,8 @@ amd_pm_state_type vega20_get_current_power_state(struct smu_context *smu)
 	enum amd_pm_state_type pm_type;
 	struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
 
-	if (!smu_dpm_ctx->dpm_context ||
+	if (!smu->pm_enabled ||
+	    !smu_dpm_ctx->dpm_context ||
 	    !smu_dpm_ctx->dpm_current_power_state)
 		return -EINVAL;
 
@@ -491,12 +492,14 @@ static void vega20_init_single_dpm_state(struct vega20_dpm_state *dpm_state)
 
 static int vega20_set_default_dpm_table(struct smu_context *smu)
 {
-	int ret;
+	int ret = 0;
 
 	struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
 	struct vega20_dpm_table *dpm_table = NULL;
 	struct vega20_single_dpm_table *single_dpm_table;
 
+	if (smu->pm_enabled)
+		return ret;
 	dpm_table = smu_dpm->dpm_context;
 
 	/* socclk */
@@ -738,6 +741,8 @@ static int vega20_print_clk_levels(struct smu_context *smu,
 
 	dpm_table = smu_dpm->dpm_context;
 
+	if (!smu->pm_enabled)
+		return -EINVAL;
 	switch (type) {
 	case PP_SCLK:
 		ret = smu_get_current_clk_freq(smu, PPCLK_GFXCLK, &now);
@@ -969,6 +974,8 @@ static int vega20_upload_dpm_level(struct smu_context *smu, bool max,
 	uint32_t freq;
 	int ret = 0;
 
+	if (!smu->pm_enabled)
+		return -EINVAL;
 	dpm_table = smu->smu_dpm.dpm_context;
 
 	if (smu_feature_is_enabled(smu, FEATURE_DPM_GFXCLK_BIT) &&
@@ -1058,6 +1065,8 @@ static int vega20_force_clk_levels(struct smu_context *smu,
 	struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
 	int ret = 0;
 
+	if (!smu->pm_enabled)
+		return -EINVAL;
 	if (smu_dpm->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) {
 		pr_info("force clock level is for dpm manual mode only.\n");
 		return -EINVAL;
@@ -1232,8 +1241,9 @@ static int vega20_get_clock_by_type_with_latency(struct smu_context *smu,
 
 	dpm_table = smu_dpm->dpm_context;
 
+	if (!smu->pm_enabled)
+		return -EINVAL;
 	mutex_lock(&smu->mutex);
-
 	switch (type) {
 	case amd_pp_sys_clock:
 		single_dpm_table = &(dpm_table->gfx_table);
@@ -1265,6 +1275,8 @@ static int vega20_overdrive_get_gfx_clk_base_voltage(struct smu_context *smu,
 {
 	int ret;
 
+	if (!smu->pm_enabled)
+		return -EINVAL;
 	ret = smu_send_smc_msg_with_param(smu,
 			SMU_MSG_GetAVFSVoltageByDpm,
 			((AVFS_CURVE << 24) | (OD8_HOTCURVE_TEMPERATURE << 16) | freq));
@@ -1287,7 +1299,7 @@ static int vega20_set_default_od8_setttings(struct smu_context *smu)
 	PPTable_t *smc_pptable = table_context->driver_pptable;
 	int i, ret;
 
-	if (table_context->od8_settings)
+	if (!smu->pm_enabled || table_context->od8_settings)
 		return -EINVAL;
 
 	table_context->od8_settings = kzalloc(sizeof(struct vega20_od8_settings), GFP_KERNEL);
@@ -1474,6 +1486,8 @@ static int vega20_get_od_percentage(struct smu_context *smu,
 	dpm_table = smu_dpm->dpm_context;
 	golden_table = smu_dpm->golden_dpm_context;
 
+	if (!smu->pm_enabled)
+		return -EINVAL;
 	switch (type) {
 	case OD_SCLK:
 		single_dpm_table = &(dpm_table->gfx_table);
@@ -1509,7 +1523,7 @@ vega20_get_profiling_clk_mask(struct smu_context *smu,
 	struct vega20_single_dpm_table *mem_dpm_table;
 	struct vega20_single_dpm_table *soc_dpm_table;
 
-	if (!smu->smu_dpm.dpm_context)
+	if (!smu->pm_enabled || !smu->smu_dpm.dpm_context)
 		return -EINVAL;
 
 	gfx_dpm_table = &dpm_table->gfx_table;
@@ -1579,7 +1593,7 @@ static int vega20_pre_display_config_changed(struct smu_context *smu)
 	int ret = 0;
 	struct vega20_dpm_table *dpm_table = smu->smu_dpm.dpm_context;
 
-	if (!smu->smu_dpm.dpm_context)
+	if (!smu->pm_enabled || !smu->smu_dpm.dpm_context)
 		return -EINVAL;
 
 	smu_send_smc_msg_with_param(smu, SMU_MSG_NumOfDisplays, 0);
@@ -1594,7 +1608,7 @@ static int vega20_display_config_changed(struct smu_context *smu)
 {
 	int ret = 0;
 
-	if (!smu->funcs)
+	if (!smu->pm_enabled || !smu->funcs)
 		return -EINVAL;
 
 	if (!smu->smu_dpm.dpm_context ||
@@ -1632,6 +1646,8 @@ static int vega20_apply_clocks_adjust_rules(struct smu_context *smu)
 	bool disable_mclk_switching;
 	uint32_t i, latency;
 
+	if (!smu->pm_enabled)
+		return -EINVAL;
 	disable_mclk_switching = ((1 < smu->display_config->num_display) &&
 				  !smu->display_config->multi_monitor_in_sync) || vblank_too_short;
 	latency = smu->display_config->dce_tolerable_mclk_in_active_latency;
@@ -1779,6 +1795,8 @@ vega20_notify_smc_dispaly_config(struct smu_context *smu)
 	struct pp_display_clock_request clock_req;
 	int ret = 0;
 
+	if (!smu->pm_enabled)
+		return -EINVAL;
 	min_clocks.dcef_clock = smu->display_config->min_dcef_set_clk;
 	min_clocks.dcef_clock_in_sr = smu->display_config->min_dcef_deep_sleep_set_clk;
 	min_clocks.memory_clock = smu->display_config->min_mem_set_clock;
@@ -1867,6 +1885,8 @@ static int vega20_force_dpm_limit_value(struct smu_context *smu, bool highest)
 	struct vega20_dpm_table *dpm_table =
 		(struct vega20_dpm_table *)smu->smu_dpm.dpm_context;
 
+	if (!smu->pm_enabled)
+		return -EINVAL;
 	if (highest)
 		soft_level = vega20_find_highest_dpm_level(&(dpm_table->gfx_table));
 	else
@@ -1918,6 +1938,8 @@ static int vega20_unforce_dpm_levels(struct smu_context *smu)
 	struct vega20_dpm_table *dpm_table =
 		(struct vega20_dpm_table *)smu->smu_dpm.dpm_context;
 
+	if (!smu->pm_enabled)
+		return -EINVAL;
 	soft_min_level = vega20_find_lowest_dpm_level(&(dpm_table->gfx_table));
 	soft_max_level = vega20_find_highest_dpm_level(&(dpm_table->gfx_table));
 	dpm_table->gfx_table.dpm_state.soft_min_level =
@@ -1957,9 +1979,9 @@ static int vega20_unforce_dpm_levels(struct smu_context *smu)
 static enum amd_dpm_forced_level vega20_get_performance_level(struct smu_context *smu)
 {
 	struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
-	if (!smu_dpm_ctx->dpm_context)
-		return -EINVAL;
 
+	if (!smu->pm_enabled || !smu_dpm_ctx->dpm_context)
+		return -EINVAL;
 	if (smu_dpm_ctx->dpm_level != smu_dpm_ctx->saved_dpm_level) {
 		mutex_lock(&(smu->mutex));
 		smu_dpm_ctx->saved_dpm_level = smu_dpm_ctx->dpm_level;
@@ -1975,7 +1997,7 @@ vega20_force_performance_level(struct smu_context *smu, enum amd_dpm_forced_leve
 	int i;
 	struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
 
-	if (!smu_dpm_ctx->dpm_context)
+	if (!smu->pm_enabled || !smu_dpm_ctx->dpm_context)
 		return -EINVAL;
 
 	for (i = 0; i < smu->adev->num_ip_blocks; i++) {
@@ -2004,6 +2026,8 @@ static int vega20_update_specified_od8_value(struct smu_context *smu,
 	struct vega20_od8_settings *od8_settings =
 		(struct vega20_od8_settings *)table_context->od8_settings;
 
+	if (!smu->pm_enabled)
+		return -EINVAL;
 	switch (index) {
 	case OD8_SETTING_GFXCLK_FMIN:
 		od_table->GfxclkFmin = (uint16_t)value;
@@ -2085,6 +2109,8 @@ static int vega20_set_od_percentage(struct smu_context *smu,
 	int feature_enabled;
 	PPCLK_e clk_id;
 
+	if (!smu->pm_enabled)
+		return -EINVAL;
 	mutex_lock(&(smu->mutex));
 
 	dpm_table = smu_dpm->dpm_context;
@@ -2163,6 +2189,8 @@ static int vega20_odn_edit_dpm_table(struct smu_context *smu,
 
 	dpm_table = smu_dpm->dpm_context;
 
+	if (!smu->pm_enabled)
+		return -EINVAL;
 	if (!input) {
 		pr_warn("NULL user input for clock and voltage\n");
 		return -EINVAL;
-- 
2.7.4



More information about the amd-gfx mailing list