* [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug
@ 2019-05-10 8:48 Chengming Gui
[not found] ` <1557478117-17823-1-git-send-email-Jack.Gui-5C7GfCeVMHo@public.gmane.org>
0 siblings, 1 reply; 8+ messages in thread
From: Chengming Gui @ 2019-05-10 8:48 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Chengming Gui
add pm_enabled to control the dpm off/on.
Signed-off-by: Chengming Gui <Jack.Gui@amd.com>
---
drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 34 +++++++++++++++++++++++---
drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 1 +
drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 34 ++++++++++++++++++++++----
3 files changed, 60 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
index 52d919a..99b2082 100644
--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
@@ -198,6 +198,8 @@ int smu_sys_set_pp_table(struct smu_context *smu, void *buf, size_t size)
ATOM_COMMON_TABLE_HEADER *header = (ATOM_COMMON_TABLE_HEADER *)buf;
int ret = 0;
+ if (!smu->pm_enabled)
+ return -EINVAL;
if (header->usStructureSize != size) {
pr_err("pp table size not matched !\n");
return -EIO;
@@ -233,6 +235,8 @@ int smu_feature_init_dpm(struct smu_context *smu)
int ret = 0;
uint32_t unallowed_feature_mask[SMU_FEATURE_MAX/32];
+ if (!smu->pm_enabled)
+ return ret;
mutex_lock(&feature->mutex);
bitmap_fill(feature->allowed, SMU_FEATURE_MAX);
mutex_unlock(&feature->mutex);
@@ -344,6 +348,7 @@ static int smu_early_init(void *handle)
struct smu_context *smu = &adev->smu;
smu->adev = adev;
+ smu->pm_enabled = amdgpu_dpm;
mutex_init(&smu->mutex);
return smu_set_funcs(adev);
@@ -353,6 +358,9 @@ static int smu_late_init(void *handle)
{
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
struct smu_context *smu = &adev->smu;
+
+ if (!smu->pm_enabled)
+ return 0;
mutex_lock(&smu->mutex);
smu_handle_task(&adev->smu,
smu->smu_dpm.dpm_level,
@@ -746,6 +754,9 @@ static int smu_smc_table_hw_init(struct smu_context *smu,
*/
ret = smu_set_tool_table_location(smu);
+ if (!smu_is_dpm_running(smu))
+ pr_info("dpm has been disabled\n");
+
return ret;
}
@@ -861,7 +872,10 @@ static int smu_hw_init(void *handle)
mutex_unlock(&smu->mutex);
- adev->pm.dpm_enabled = true;
+ if (!smu->pm_enabled)
+ adev->pm.dpm_enabled = false;
+ else
+ adev->pm.dpm_enabled = true;
pr_info("SMU is initialized successfully!\n");
@@ -879,6 +893,8 @@ static int smu_hw_fini(void *handle)
struct smu_table_context *table_context = &smu->smu_table;
int ret = 0;
+ if (!smu->pm_enabled)
+ return ret;
if (!is_support_sw_smu(adev))
return -EINVAL;
@@ -932,10 +948,12 @@ int smu_reset(struct smu_context *smu)
static int smu_suspend(void *handle)
{
- int ret;
+ int ret = 0;
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
struct smu_context *smu = &adev->smu;
+ if (!smu->pm_enabled)
+ return ret;
if (!is_support_sw_smu(adev))
return -EINVAL;
@@ -950,10 +968,12 @@ static int smu_suspend(void *handle)
static int smu_resume(void *handle)
{
- int ret;
+ int ret = 0;
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
struct smu_context *smu = &adev->smu;
+ if (!smu->pm_enabled)
+ return ret;
if (!is_support_sw_smu(adev))
return -EINVAL;
@@ -985,7 +1005,7 @@ int smu_display_configuration_change(struct smu_context *smu,
int index = 0;
int num_of_active_display = 0;
- if (!is_support_sw_smu(smu->adev))
+ if (!smu->pm_enabled || !is_support_sw_smu(smu->adev))
return -EINVAL;
if (!display_config)
@@ -1113,6 +1133,8 @@ static int smu_enable_umd_pstate(void *handle,
struct smu_context *smu = (struct smu_context*)(handle);
struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
+ if (!smu->pm_enabled)
+ return -EINVAL;
if (!smu_dpm_ctx->dpm_context)
return -EINVAL;
@@ -1156,6 +1178,8 @@ int smu_adjust_power_state_dynamic(struct smu_context *smu,
long workload;
struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
+ if (!smu->pm_enabled)
+ return -EINVAL;
if (!skip_display_settings) {
ret = smu_display_config_changed(smu);
if (ret) {
@@ -1164,6 +1188,8 @@ int smu_adjust_power_state_dynamic(struct smu_context *smu,
}
}
+ if (!smu->pm_enabled)
+ return -EINVAL;
ret = smu_apply_clocks_adjust_rules(smu);
if (ret) {
pr_err("Failed to apply clocks adjust rules!");
diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
index 8905241..56b9812 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
@@ -401,6 +401,7 @@ struct smu_context
uint32_t workload_setting[WORKLOAD_POLICY_MAX];
uint32_t power_profile_mode;
uint32_t default_power_profile_mode;
+ bool pm_enabled;
uint32_t smc_if_version;
};
diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
index cd36c42..dee1e91 100644
--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
@@ -360,6 +360,8 @@ static int smu_v11_0_init_power(struct smu_context *smu)
{
struct smu_power_context *smu_power = &smu->smu_power;
+ if (!smu->pm_enabled)
+ return 0;
if (smu_power->power_context || smu_power->power_context_size != 0)
return -EINVAL;
@@ -376,6 +378,8 @@ static int smu_v11_0_fini_power(struct smu_context *smu)
{
struct smu_power_context *smu_power = &smu->smu_power;
+ if (!smu->pm_enabled)
+ return 0;
if (!smu_power->power_context || smu_power->power_context_size == 0)
return -EINVAL;
@@ -641,6 +645,8 @@ static int smu_v11_0_set_min_dcef_deep_sleep(struct smu_context *smu)
{
struct smu_table_context *table_context = &smu->smu_table;
+ if (!smu->pm_enabled)
+ return 0;
if (!table_context)
return -EINVAL;
@@ -669,6 +675,9 @@ static int smu_v11_0_set_tool_table_location(struct smu_context *smu)
static int smu_v11_0_init_display(struct smu_context *smu)
{
int ret = 0;
+
+ if (!smu->pm_enabled)
+ return ret;
ret = smu_send_smc_msg_with_param(smu, SMU_MSG_NumOfDisplays, 0);
return ret;
}
@@ -678,6 +687,8 @@ static int smu_v11_0_update_feature_enable_state(struct smu_context *smu, uint32
uint32_t feature_low = 0, feature_high = 0;
int ret = 0;
+ if (!smu->pm_enabled)
+ return ret;
if (feature_id >= 0 && feature_id < 31)
feature_low = (1 << feature_id);
else if (feature_id > 31 && feature_id < 63)
@@ -784,10 +795,13 @@ static int smu_v11_0_system_features_control(struct smu_context *smu,
uint32_t feature_mask[2];
int ret = 0;
- ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures :
- SMU_MSG_DisableAllSmuFeatures));
- if (ret)
- return ret;
+ if (smu->pm_enabled) {
+ ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures :
+ SMU_MSG_DisableAllSmuFeatures));
+ if (ret)
+ return ret;
+ }
+
ret = smu_feature_get_enabled_mask(smu, feature_mask, 2);
if (ret)
return ret;
@@ -804,6 +818,8 @@ static int smu_v11_0_notify_display_change(struct smu_context *smu)
{
int ret = 0;
+ if (!smu->pm_enabled)
+ return ret;
if (smu_feature_is_enabled(smu, FEATURE_DPM_UCLK_BIT))
ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetUclkFastSwitch, 1);
@@ -816,6 +832,8 @@ smu_v11_0_get_max_sustainable_clock(struct smu_context *smu, uint32_t *clock,
{
int ret = 0;
+ if (!smu->pm_enabled)
+ return ret;
ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetDcModeMaxDpmFreq,
clock_select << 16);
if (ret) {
@@ -1072,6 +1090,8 @@ static int smu_v11_0_start_thermal_control(struct smu_context *smu)
struct PP_TemperatureRange range;
struct amdgpu_device *adev = smu->adev;
+ if (!smu->pm_enabled)
+ return ret;
smu_v11_0_get_thermal_range(smu, &range);
if (smu->smu_table.thermal_controller_type) {
@@ -1242,6 +1262,8 @@ smu_v11_0_display_clock_voltage_request(struct smu_context *smu,
PPCLK_e clk_select = 0;
uint32_t clk_freq = clock_req->clock_freq_in_khz / 1000;
+ if (!smu->pm_enabled)
+ return -EINVAL;
if (smu_feature_is_enabled(smu, FEATURE_DPM_DCEFCLK_BIT)) {
switch (clk_type) {
case amd_pp_dcef_clock:
@@ -1525,7 +1547,7 @@ static int smu_v11_0_get_power_profile_mode(struct smu_context *smu, char *buf)
"PD_Data_error_rate_coeff"};
int result = 0;
- if (!buf)
+ if (!smu->pm_enabled || !buf)
return -EINVAL;
size += sprintf(buf + size, "%16s %s %s %s %s %s %s %s %s %s %s\n",
@@ -1612,6 +1634,8 @@ static int smu_v11_0_set_power_profile_mode(struct smu_context *smu, long *input
smu->power_profile_mode = input[size];
+ if (!smu->pm_enabled)
+ return ret;
if (smu->power_profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) {
pr_err("Invalid power profile mode %d\n", smu->power_profile_mode);
return -EINVAL;
--
2.7.4
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 8+ messages in thread[parent not found: <1557478117-17823-1-git-send-email-Jack.Gui-5C7GfCeVMHo@public.gmane.org>]
* [PATCH 2/2] drm/amd/powerplay: Enable "disable dpm" feature for vega20 power functions. [not found] ` <1557478117-17823-1-git-send-email-Jack.Gui-5C7GfCeVMHo@public.gmane.org> @ 2019-05-10 8:48 ` Chengming Gui [not found] ` <1557478117-17823-2-git-send-email-Jack.Gui-5C7GfCeVMHo@public.gmane.org> 2019-05-12 3:18 ` [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug Zhang, Hawking 1 sibling, 1 reply; 8+ messages in thread From: Chengming Gui @ 2019-05-10 8:48 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Chengming Gui use pm_enabled to control all power related functions about vega20. Signed-off-by: Chengming Gui <Jack.Gui@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 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 8+ messages in thread
[parent not found: <1557478117-17823-2-git-send-email-Jack.Gui-5C7GfCeVMHo@public.gmane.org>]
* RE: [PATCH 2/2] drm/amd/powerplay: Enable "disable dpm" feature for vega20 power functions. [not found] ` <1557478117-17823-2-git-send-email-Jack.Gui-5C7GfCeVMHo@public.gmane.org> @ 2019-05-12 3:18 ` Zhang, Hawking [not found] ` <BYAPR12MB263244237A28E226D34F348EFC0E0-ZGDeBxoHBPk+ukJnzp2+RQdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> 0 siblings, 1 reply; 8+ messages in thread From: Zhang, Hawking @ 2019-05-12 3:18 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org; +Cc: Gui, Jack I'm wondering whether we are able to handle all asic specific ppt function gracefully. Add pm_enable check into ppt functions would be boring since we have to do similar jobs for each ASIC. Instead, is it possible to return early from amdgpu_smu interface level? Take smu_handle_task for the example, all the amdgpu_smu level interface invoked from this function could be stopped if we check smu pm_enable flag at the beginning of smu_handle_task. We probably have better approach to eliminate this patch. Regards, Hawking -----Original Message----- From: amd-gfx <amd-gfx-bounces@lists.freedesktop.org> On Behalf Of Chengming Gui Sent: 2019年5月10日 16:49 To: amd-gfx@lists.freedesktop.org Cc: Gui, Jack <Jack.Gui@amd.com> Subject: [PATCH 2/2] drm/amd/powerplay: Enable "disable dpm" feature for vega20 power functions. [CAUTION: External Email] use pm_enabled to control all power related functions about vega20. Signed-off-by: Chengming Gui <Jack.Gui@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 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 8+ messages in thread
[parent not found: <BYAPR12MB263244237A28E226D34F348EFC0E0-ZGDeBxoHBPk+ukJnzp2+RQdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>]
* RE: [PATCH 2/2] drm/amd/powerplay: Enable "disable dpm" feature for vega20 power functions. [not found] ` <BYAPR12MB263244237A28E226D34F348EFC0E0-ZGDeBxoHBPk+ukJnzp2+RQdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> @ 2019-05-13 3:26 ` Gui, Jack [not found] ` <MN2PR12MB358219B85CA0E1B4B159FB0C8B0F0-rweVpJHSKTr2mYjuiDFEwwdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> 0 siblings, 1 reply; 8+ messages in thread From: Gui, Jack @ 2019-05-13 3:26 UTC (permalink / raw) To: Zhang, Hawking, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Hi Hawking, If no other tools (sysfs inferfaces have been controlled by adev->dpm_enabled) directly use the ppt functs, PATCH[1/2] can cover all the cases now, PATCH[2/2] can be dropped. BR, Jack Gui -----Original Message----- From: Zhang, Hawking <Hawking.Zhang@amd.com> Sent: Sunday, May 12, 2019 11:18 AM To: Gui, Jack <Jack.Gui@amd.com>; amd-gfx@lists.freedesktop.org Cc: Gui, Jack <Jack.Gui@amd.com> Subject: RE: [PATCH 2/2] drm/amd/powerplay: Enable "disable dpm" feature for vega20 power functions. I'm wondering whether we are able to handle all asic specific ppt function gracefully. Add pm_enable check into ppt functions would be boring since we have to do similar jobs for each ASIC. Instead, is it possible to return early from amdgpu_smu interface level? Take smu_handle_task for the example, all the amdgpu_smu level interface invoked from this function could be stopped if we check smu pm_enable flag at the beginning of smu_handle_task. We probably have better approach to eliminate this patch. Regards, Hawking -----Original Message----- From: amd-gfx <amd-gfx-bounces@lists.freedesktop.org> On Behalf Of Chengming Gui Sent: 2019年5月10日 16:49 To: amd-gfx@lists.freedesktop.org Cc: Gui, Jack <Jack.Gui@amd.com> Subject: [PATCH 2/2] drm/amd/powerplay: Enable "disable dpm" feature for vega20 power functions. [CAUTION: External Email] use pm_enabled to control all power related functions about vega20. Signed-off-by: Chengming Gui <Jack.Gui@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 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 8+ messages in thread
[parent not found: <MN2PR12MB358219B85CA0E1B4B159FB0C8B0F0-rweVpJHSKTr2mYjuiDFEwwdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>]
* RE: [PATCH 2/2] drm/amd/powerplay: Enable "disable dpm" feature for vega20 power functions. [not found] ` <MN2PR12MB358219B85CA0E1B4B159FB0C8B0F0-rweVpJHSKTr2mYjuiDFEwwdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> @ 2019-05-14 14:26 ` Zhang, Hawking 0 siblings, 0 replies; 8+ messages in thread From: Zhang, Hawking @ 2019-05-14 14:26 UTC (permalink / raw) To: Gui, Jack, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Hi Jack, Let's hold on patch #2 for now. I'd prefer to gracefully deal with dpm_disabled in amdgpu_pm interface level (or at least amdgpu_smu level) so that we don't need to maintain the case for each ASIC since ppt is asic specific ones. Regards, Hawking -----Original Message----- From: Gui, Jack <Jack.Gui@amd.com> Sent: 2019年5月13日 11:26 To: Zhang, Hawking <Hawking.Zhang@amd.com>; amd-gfx@lists.freedesktop.org Subject: RE: [PATCH 2/2] drm/amd/powerplay: Enable "disable dpm" feature for vega20 power functions. Hi Hawking, If no other tools (sysfs inferfaces have been controlled by adev->dpm_enabled) directly use the ppt functs, PATCH[1/2] can cover all the cases now, PATCH[2/2] can be dropped. BR, Jack Gui -----Original Message----- From: Zhang, Hawking <Hawking.Zhang@amd.com> Sent: Sunday, May 12, 2019 11:18 AM To: Gui, Jack <Jack.Gui@amd.com>; amd-gfx@lists.freedesktop.org Cc: Gui, Jack <Jack.Gui@amd.com> Subject: RE: [PATCH 2/2] drm/amd/powerplay: Enable "disable dpm" feature for vega20 power functions. I'm wondering whether we are able to handle all asic specific ppt function gracefully. Add pm_enable check into ppt functions would be boring since we have to do similar jobs for each ASIC. Instead, is it possible to return early from amdgpu_smu interface level? Take smu_handle_task for the example, all the amdgpu_smu level interface invoked from this function could be stopped if we check smu pm_enable flag at the beginning of smu_handle_task. We probably have better approach to eliminate this patch. Regards, Hawking -----Original Message----- From: amd-gfx <amd-gfx-bounces@lists.freedesktop.org> On Behalf Of Chengming Gui Sent: 2019年5月10日 16:49 To: amd-gfx@lists.freedesktop.org Cc: Gui, Jack <Jack.Gui@amd.com> Subject: [PATCH 2/2] drm/amd/powerplay: Enable "disable dpm" feature for vega20 power functions. [CAUTION: External Email] use pm_enabled to control all power related functions about vega20. Signed-off-by: Chengming Gui <Jack.Gui@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 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 8+ messages in thread
* RE: [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug [not found] ` <1557478117-17823-1-git-send-email-Jack.Gui-5C7GfCeVMHo@public.gmane.org> 2019-05-10 8:48 ` [PATCH 2/2] drm/amd/powerplay: Enable "disable dpm" feature for vega20 power functions Chengming Gui @ 2019-05-12 3:18 ` Zhang, Hawking [not found] ` <BYAPR12MB263278FD5AB7F03B991DEA43FC0E0-ZGDeBxoHBPk+ukJnzp2+RQdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> 1 sibling, 1 reply; 8+ messages in thread From: Zhang, Hawking @ 2019-05-12 3:18 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org; +Cc: Gui, Jack [-- Attachment #1.1: Type: text/plain, Size: 11165 bytes --] Please check my comments inline. Regards, Hawking -----Original Message----- From: amd-gfx <amd-gfx-bounces@lists.freedesktop.org> On Behalf Of Chengming Gui Sent: 2019年5月10日 16:49 To: amd-gfx@lists.freedesktop.org Cc: Gui, Jack <Jack.Gui@amd.com> Subject: [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug [CAUTION: External Email] add pm_enabled to control the dpm off/on. Signed-off-by: Chengming Gui <Jack.Gui@amd.com<mailto:Jack.Gui@amd.com>> --- drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 34 +++++++++++++++++++++++--- drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 1 + drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 34 ++++++++++++++++++++++---- 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c index 52d919a..99b2082 100644 --- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c +++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c @@ -198,6 +198,8 @@ int smu_sys_set_pp_table(struct smu_context *smu, void *buf, size_t size) ATOM_COMMON_TABLE_HEADER *header = (ATOM_COMMON_TABLE_HEADER *)buf; int ret = 0; + if (!smu->pm_enabled) + return -EINVAL; if (header->usStructureSize != size) { pr_err("pp table size not matched !\n"); return -EIO; @@ -233,6 +235,8 @@ int smu_feature_init_dpm(struct smu_context *smu) int ret = 0; uint32_t unallowed_feature_mask[SMU_FEATURE_MAX/32]; + if (!smu->pm_enabled) + return ret; mutex_lock(&feature->mutex); bitmap_fill(feature->allowed, SMU_FEATURE_MAX); mutex_unlock(&feature->mutex); @@ -344,6 +348,7 @@ static int smu_early_init(void *handle) struct smu_context *smu = &adev->smu; smu->adev = adev; + smu->pm_enabled = amdgpu_dpm; mutex_init(&smu->mutex); return smu_set_funcs(adev); @@ -353,6 +358,9 @@ static int smu_late_init(void *handle) { struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct smu_context *smu = &adev->smu; + + if (!smu->pm_enabled) + return 0; mutex_lock(&smu->mutex); smu_handle_task(&adev->smu, smu->smu_dpm.dpm_level, @@ -746,6 +754,9 @@ static int smu_smc_table_hw_init(struct smu_context *smu, */ ret = smu_set_tool_table_location(smu); + if (!smu_is_dpm_running(smu)) + pr_info("dpm has been disabled\n"); + return ret; } @@ -861,7 +872,10 @@ static int smu_hw_init(void *handle) mutex_unlock(&smu->mutex); - adev->pm.dpm_enabled = true; + if (!smu->pm_enabled) + adev->pm.dpm_enabled = false; + else + adev->pm.dpm_enabled = true; pr_info("SMU is initialized successfully!\n"); @@ -879,6 +893,8 @@ static int smu_hw_fini(void *handle) struct smu_table_context *table_context = &smu->smu_table; int ret = 0; + if (!smu->pm_enabled) + return ret; if (!is_support_sw_smu(adev)) return -EINVAL; @@ -932,10 +948,12 @@ int smu_reset(struct smu_context *smu) static int smu_suspend(void *handle) { - int ret; + int ret = 0; struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct smu_context *smu = &adev->smu; + if (!smu->pm_enabled) + return ret; [Hawking]: Just return 0 directly if dpm was disabled. Don't change the default return value to 0 which means resume complete successfully if (!is_support_sw_smu(adev)) return -EINVAL; @@ -950,10 +968,12 @@ static int smu_suspend(void *handle) static int smu_resume(void *handle) { - int ret; + int ret = 0; struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct smu_context *smu = &adev->smu; + if (!smu->pm_enabled) + return ret; [Hawking]: similar as suspend, directly return 0 if dpm was disabled. if (!is_support_sw_smu(adev)) return -EINVAL; @@ -985,7 +1005,7 @@ int smu_display_configuration_change(struct smu_context *smu, int index = 0; int num_of_active_display = 0; - if (!is_support_sw_smu(smu->adev)) + if (!smu->pm_enabled || !is_support_sw_smu(smu->adev)) return -EINVAL; if (!display_config) @@ -1113,6 +1133,8 @@ static int smu_enable_umd_pstate(void *handle, struct smu_context *smu = (struct smu_context*)(handle); struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); + if (!smu->pm_enabled) + return -EINVAL; [Hawking]: please merge this with the dpm_context check if (!smu_dpm_ctx->dpm_context) return -EINVAL; @@ -1156,6 +1178,8 @@ int smu_adjust_power_state_dynamic(struct smu_context *smu, long workload; struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); + if (!smu->pm_enabled) + return -EINVAL; if (!skip_display_settings) { ret = smu_display_config_changed(smu); if (ret) { @@ -1164,6 +1188,8 @@ int smu_adjust_power_state_dynamic(struct smu_context *smu, } } + if (!smu->pm_enabled) + return -EINVAL; ret = smu_apply_clocks_adjust_rules(smu); if (ret) { pr_err("Failed to apply clocks adjust rules!"); diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h index 8905241..56b9812 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h +++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h @@ -401,6 +401,7 @@ struct smu_context uint32_t workload_setting[WORKLOAD_POLICY_MAX]; uint32_t power_profile_mode; uint32_t default_power_profile_mode; + bool pm_enabled; uint32_t smc_if_version; }; diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c index cd36c42..dee1e91 100644 --- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c @@ -360,6 +360,8 @@ static int smu_v11_0_init_power(struct smu_context *smu) { struct smu_power_context *smu_power = &smu->smu_power; + if (!smu->pm_enabled) + return 0; if (smu_power->power_context || smu_power->power_context_size != 0) return -EINVAL; @@ -376,6 +378,8 @@ static int smu_v11_0_fini_power(struct smu_context *smu) { struct smu_power_context *smu_power = &smu->smu_power; + if (!smu->pm_enabled) + return 0; if (!smu_power->power_context || smu_power->power_context_size == 0) return -EINVAL; @@ -641,6 +645,8 @@ static int smu_v11_0_set_min_dcef_deep_sleep(struct smu_context *smu) { struct smu_table_context *table_context = &smu->smu_table; + if (!smu->pm_enabled) + return 0; if (!table_context) return -EINVAL; @@ -669,6 +675,9 @@ static int smu_v11_0_set_tool_table_location(struct smu_context *smu) static int smu_v11_0_init_display(struct smu_context *smu) { int ret = 0; + + if (!smu->pm_enabled) + return ret; ret = smu_send_smc_msg_with_param(smu, SMU_MSG_NumOfDisplays, 0); return ret; } @@ -678,6 +687,8 @@ static int smu_v11_0_update_feature_enable_state(struct smu_context *smu, uint32 uint32_t feature_low = 0, feature_high = 0; int ret = 0; + if (!smu->pm_enabled) + return ret; if (feature_id >= 0 && feature_id < 31) feature_low = (1 << feature_id); else if (feature_id > 31 && feature_id < 63) @@ -784,10 +795,13 @@ static int smu_v11_0_system_features_control(struct smu_context *smu, uint32_t feature_mask[2]; int ret = 0; - ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures : - SMU_MSG_DisableAllSmuFeatures)); - if (ret) - return ret; + if (smu->pm_enabled) { + ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures : + SMU_MSG_DisableAllSmuFeatures)); + if (ret) + return ret; + } + ret = smu_feature_get_enabled_mask(smu, feature_mask, 2); if (ret) return ret; @@ -804,6 +818,8 @@ static int smu_v11_0_notify_display_change(struct smu_context *smu) { int ret = 0; + if (!smu->pm_enabled) + return ret; if (smu_feature_is_enabled(smu, FEATURE_DPM_UCLK_BIT)) ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetUclkFastSwitch, 1); @@ -816,6 +832,8 @@ smu_v11_0_get_max_sustainable_clock(struct smu_context *smu, uint32_t *clock, { int ret = 0; + if (!smu->pm_enabled) + return ret; ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetDcModeMaxDpmFreq, clock_select << 16); if (ret) { @@ -1072,6 +1090,8 @@ static int smu_v11_0_start_thermal_control(struct smu_context *smu) struct PP_TemperatureRange range; struct amdgpu_device *adev = smu->adev; + if (!smu->pm_enabled) + return ret; smu_v11_0_get_thermal_range(smu, &range); if (smu->smu_table.thermal_controller_type) { @@ -1242,6 +1262,8 @@ smu_v11_0_display_clock_voltage_request(struct smu_context *smu, PPCLK_e clk_select = 0; uint32_t clk_freq = clock_req->clock_freq_in_khz / 1000; + if (!smu->pm_enabled) + return -EINVAL; if (smu_feature_is_enabled(smu, FEATURE_DPM_DCEFCLK_BIT)) { switch (clk_type) { case amd_pp_dcef_clock: @@ -1525,7 +1547,7 @@ static int smu_v11_0_get_power_profile_mode(struct smu_context *smu, char *buf) "PD_Data_error_rate_coeff"}; int result = 0; - if (!buf) + if (!smu->pm_enabled || !buf) return -EINVAL; size += sprintf(buf + size, "%16s %s %s %s %s %s %s %s %s %s %s\n", @@ -1612,6 +1634,8 @@ static int smu_v11_0_set_power_profile_mode(struct smu_context *smu, long *input smu->power_profile_mode = input[size]; + if (!smu->pm_enabled) + return ret; if (smu->power_profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) { pr_err("Invalid power profile mode %d\n", smu->power_profile_mode); return -EINVAL; -- 2.7.4 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org<mailto:amd-gfx@lists.freedesktop.org> https://lists.freedesktop.org/mailman/listinfo/amd-gfx [-- Attachment #1.2: Type: text/html, Size: 24927 bytes --] [-- Attachment #2: Type: text/plain, Size: 153 bytes --] _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 8+ messages in thread
[parent not found: <BYAPR12MB263278FD5AB7F03B991DEA43FC0E0-ZGDeBxoHBPk+ukJnzp2+RQdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>]
* RE: [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug [not found] ` <BYAPR12MB263278FD5AB7F03B991DEA43FC0E0-ZGDeBxoHBPk+ukJnzp2+RQdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> @ 2019-05-13 3:32 ` Gui, Jack [not found] ` <MN2PR12MB3582F42887F65C1B5A8E92F18B0F0-rweVpJHSKTr2mYjuiDFEwwdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> 0 siblings, 1 reply; 8+ messages in thread From: Gui, Jack @ 2019-05-13 3:32 UTC (permalink / raw) To: Zhang, Hawking, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org [-- Attachment #1.1: Type: text/plain, Size: 11742 bytes --] Hi Hawking, V2 patch attached: Return 0 directly and merge some check code. Please help review again, thanks. BR, Jack Gui _____________________________________________ From: Zhang, Hawking <Hawking.Zhang@amd.com> Sent: Sunday, May 12, 2019 11:18 AM To: Gui, Jack <Jack.Gui@amd.com>; amd-gfx@lists.freedesktop.org Cc: Gui, Jack <Jack.Gui@amd.com> Subject: RE: [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug Please check my comments inline. Regards, Hawking -----Original Message----- From: amd-gfx <amd-gfx-bounces@lists.freedesktop.org<mailto:amd-gfx-bounces@lists.freedesktop.org>> On Behalf Of Chengming Gui Sent: 2019年5月10日 16:49 To: amd-gfx@lists.freedesktop.org<mailto:amd-gfx@lists.freedesktop.org> Cc: Gui, Jack <Jack.Gui@amd.com<mailto:Jack.Gui@amd.com>> Subject: [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug [CAUTION: External Email] add pm_enabled to control the dpm off/on. Signed-off-by: Chengming Gui <Jack.Gui@amd.com<mailto:Jack.Gui@amd.com>> --- drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 34 +++++++++++++++++++++++--- drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 1 + drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 34 ++++++++++++++++++++++---- 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c index 52d919a..99b2082 100644 --- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c +++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c @@ -198,6 +198,8 @@ int smu_sys_set_pp_table(struct smu_context *smu, void *buf, size_t size) ATOM_COMMON_TABLE_HEADER *header = (ATOM_COMMON_TABLE_HEADER *)buf; int ret = 0; + if (!smu->pm_enabled) + return -EINVAL; if (header->usStructureSize != size) { pr_err("pp table size not matched !\n"); return -EIO; @@ -233,6 +235,8 @@ int smu_feature_init_dpm(struct smu_context *smu) int ret = 0; uint32_t unallowed_feature_mask[SMU_FEATURE_MAX/32]; + if (!smu->pm_enabled) + return ret; mutex_lock(&feature->mutex); bitmap_fill(feature->allowed, SMU_FEATURE_MAX); mutex_unlock(&feature->mutex); @@ -344,6 +348,7 @@ static int smu_early_init(void *handle) struct smu_context *smu = &adev->smu; smu->adev = adev; + smu->pm_enabled = amdgpu_dpm; mutex_init(&smu->mutex); return smu_set_funcs(adev); @@ -353,6 +358,9 @@ static int smu_late_init(void *handle) { struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct smu_context *smu = &adev->smu; + + if (!smu->pm_enabled) + return 0; mutex_lock(&smu->mutex); smu_handle_task(&adev->smu, smu->smu_dpm.dpm_level, @@ -746,6 +754,9 @@ static int smu_smc_table_hw_init(struct smu_context *smu, */ ret = smu_set_tool_table_location(smu); + if (!smu_is_dpm_running(smu)) + pr_info("dpm has been disabled\n"); + return ret; } @@ -861,7 +872,10 @@ static int smu_hw_init(void *handle) mutex_unlock(&smu->mutex); - adev->pm.dpm_enabled = true; + if (!smu->pm_enabled) + adev->pm.dpm_enabled = false; + else + adev->pm.dpm_enabled = true; pr_info("SMU is initialized successfully!\n"); @@ -879,6 +893,8 @@ static int smu_hw_fini(void *handle) struct smu_table_context *table_context = &smu->smu_table; int ret = 0; + if (!smu->pm_enabled) + return ret; if (!is_support_sw_smu(adev)) return -EINVAL; @@ -932,10 +948,12 @@ int smu_reset(struct smu_context *smu) static int smu_suspend(void *handle) { - int ret; + int ret = 0; struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct smu_context *smu = &adev->smu; + if (!smu->pm_enabled) + return ret; [Hawking]: Just return 0 directly if dpm was disabled. Don't change the default return value to 0 which means resume complete successfully if (!is_support_sw_smu(adev)) return -EINVAL; @@ -950,10 +968,12 @@ static int smu_suspend(void *handle) static int smu_resume(void *handle) { - int ret; + int ret = 0; struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct smu_context *smu = &adev->smu; + if (!smu->pm_enabled) + return ret; [Hawking]: similar as suspend, directly return 0 if dpm was disabled. if (!is_support_sw_smu(adev)) return -EINVAL; @@ -985,7 +1005,7 @@ int smu_display_configuration_change(struct smu_context *smu, int index = 0; int num_of_active_display = 0; - if (!is_support_sw_smu(smu->adev)) + if (!smu->pm_enabled || !is_support_sw_smu(smu->adev)) return -EINVAL; if (!display_config) @@ -1113,6 +1133,8 @@ static int smu_enable_umd_pstate(void *handle, struct smu_context *smu = (struct smu_context*)(handle); struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); + if (!smu->pm_enabled) + return -EINVAL; [Hawking]: please merge this with the dpm_context check if (!smu_dpm_ctx->dpm_context) return -EINVAL; @@ -1156,6 +1178,8 @@ int smu_adjust_power_state_dynamic(struct smu_context *smu, long workload; struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); + if (!smu->pm_enabled) + return -EINVAL; if (!skip_display_settings) { ret = smu_display_config_changed(smu); if (ret) { @@ -1164,6 +1188,8 @@ int smu_adjust_power_state_dynamic(struct smu_context *smu, } } + if (!smu->pm_enabled) + return -EINVAL; ret = smu_apply_clocks_adjust_rules(smu); if (ret) { pr_err("Failed to apply clocks adjust rules!"); diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h index 8905241..56b9812 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h +++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h @@ -401,6 +401,7 @@ struct smu_context uint32_t workload_setting[WORKLOAD_POLICY_MAX]; uint32_t power_profile_mode; uint32_t default_power_profile_mode; + bool pm_enabled; uint32_t smc_if_version; }; diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c index cd36c42..dee1e91 100644 --- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c @@ -360,6 +360,8 @@ static int smu_v11_0_init_power(struct smu_context *smu) { struct smu_power_context *smu_power = &smu->smu_power; + if (!smu->pm_enabled) + return 0; if (smu_power->power_context || smu_power->power_context_size != 0) return -EINVAL; @@ -376,6 +378,8 @@ static int smu_v11_0_fini_power(struct smu_context *smu) { struct smu_power_context *smu_power = &smu->smu_power; + if (!smu->pm_enabled) + return 0; if (!smu_power->power_context || smu_power->power_context_size == 0) return -EINVAL; @@ -641,6 +645,8 @@ static int smu_v11_0_set_min_dcef_deep_sleep(struct smu_context *smu) { struct smu_table_context *table_context = &smu->smu_table; + if (!smu->pm_enabled) + return 0; if (!table_context) return -EINVAL; @@ -669,6 +675,9 @@ static int smu_v11_0_set_tool_table_location(struct smu_context *smu) static int smu_v11_0_init_display(struct smu_context *smu) { int ret = 0; + + if (!smu->pm_enabled) + return ret; ret = smu_send_smc_msg_with_param(smu, SMU_MSG_NumOfDisplays, 0); return ret; } @@ -678,6 +687,8 @@ static int smu_v11_0_update_feature_enable_state(struct smu_context *smu, uint32 uint32_t feature_low = 0, feature_high = 0; int ret = 0; + if (!smu->pm_enabled) + return ret; if (feature_id >= 0 && feature_id < 31) feature_low = (1 << feature_id); else if (feature_id > 31 && feature_id < 63) @@ -784,10 +795,13 @@ static int smu_v11_0_system_features_control(struct smu_context *smu, uint32_t feature_mask[2]; int ret = 0; - ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures : - SMU_MSG_DisableAllSmuFeatures)); - if (ret) - return ret; + if (smu->pm_enabled) { + ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures : + SMU_MSG_DisableAllSmuFeatures)); + if (ret) + return ret; + } + ret = smu_feature_get_enabled_mask(smu, feature_mask, 2); if (ret) return ret; @@ -804,6 +818,8 @@ static int smu_v11_0_notify_display_change(struct smu_context *smu) { int ret = 0; + if (!smu->pm_enabled) + return ret; if (smu_feature_is_enabled(smu, FEATURE_DPM_UCLK_BIT)) ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetUclkFastSwitch, 1); @@ -816,6 +832,8 @@ smu_v11_0_get_max_sustainable_clock(struct smu_context *smu, uint32_t *clock, { int ret = 0; + if (!smu->pm_enabled) + return ret; ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetDcModeMaxDpmFreq, clock_select << 16); if (ret) { @@ -1072,6 +1090,8 @@ static int smu_v11_0_start_thermal_control(struct smu_context *smu) struct PP_TemperatureRange range; struct amdgpu_device *adev = smu->adev; + if (!smu->pm_enabled) + return ret; smu_v11_0_get_thermal_range(smu, &range); if (smu->smu_table.thermal_controller_type) { @@ -1242,6 +1262,8 @@ smu_v11_0_display_clock_voltage_request(struct smu_context *smu, PPCLK_e clk_select = 0; uint32_t clk_freq = clock_req->clock_freq_in_khz / 1000; + if (!smu->pm_enabled) + return -EINVAL; if (smu_feature_is_enabled(smu, FEATURE_DPM_DCEFCLK_BIT)) { switch (clk_type) { case amd_pp_dcef_clock: @@ -1525,7 +1547,7 @@ static int smu_v11_0_get_power_profile_mode(struct smu_context *smu, char *buf) "PD_Data_error_rate_coeff"}; int result = 0; - if (!buf) + if (!smu->pm_enabled || !buf) return -EINVAL; size += sprintf(buf + size, "%16s %s %s %s %s %s %s %s %s %s %s\n", @@ -1612,6 +1634,8 @@ static int smu_v11_0_set_power_profile_mode(struct smu_context *smu, long *input smu->power_profile_mode = input[size]; + if (!smu->pm_enabled) + return ret; if (smu->power_profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) { pr_err("Invalid power profile mode %d\n", smu->power_profile_mode); return -EINVAL; -- 2.7.4 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org<mailto:amd-gfx@lists.freedesktop.org> https://lists.freedesktop.org/mailman/listinfo/amd-gfx [-- Attachment #1.2: Type: text/html, Size: 33649 bytes --] [-- Attachment #2: 0001-drm-amd-powerplay-Enable-disable-dpm-feature-to-supp.patch --] [-- Type: application/octet-stream, Size: 8828 bytes --] From 700efde46568a7b80a98048d4266acca19531a8a Mon Sep 17 00:00:00 2001 From: Chengming Gui <Jack.Gui@amd.com> Date: Wed, 8 May 2019 14:38:55 +0800 Subject: [PATCH] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug (v2) add pm_enabled to control the dpm off/on. v2: Directly return 0 to replace return ret and merge some check code. Signed-off-by: Chengming Gui <Jack.Gui@amd.com> --- drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 30 ++++++++++++++++++++--- drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 1 + drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 34 ++++++++++++++++++++++---- 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c index 52d919a..eb6b08f 100644 --- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c +++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c @@ -198,6 +198,8 @@ int smu_sys_set_pp_table(struct smu_context *smu, void *buf, size_t size) ATOM_COMMON_TABLE_HEADER *header = (ATOM_COMMON_TABLE_HEADER *)buf; int ret = 0; + if (!smu->pm_enabled) + return -EINVAL; if (header->usStructureSize != size) { pr_err("pp table size not matched !\n"); return -EIO; @@ -233,6 +235,8 @@ int smu_feature_init_dpm(struct smu_context *smu) int ret = 0; uint32_t unallowed_feature_mask[SMU_FEATURE_MAX/32]; + if (!smu->pm_enabled) + return ret; mutex_lock(&feature->mutex); bitmap_fill(feature->allowed, SMU_FEATURE_MAX); mutex_unlock(&feature->mutex); @@ -344,6 +348,7 @@ static int smu_early_init(void *handle) struct smu_context *smu = &adev->smu; smu->adev = adev; + smu->pm_enabled = amdgpu_dpm; mutex_init(&smu->mutex); return smu_set_funcs(adev); @@ -353,6 +358,9 @@ static int smu_late_init(void *handle) { struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct smu_context *smu = &adev->smu; + + if (!smu->pm_enabled) + return 0; mutex_lock(&smu->mutex); smu_handle_task(&adev->smu, smu->smu_dpm.dpm_level, @@ -746,6 +754,9 @@ static int smu_smc_table_hw_init(struct smu_context *smu, */ ret = smu_set_tool_table_location(smu); + if (!smu_is_dpm_running(smu)) + pr_info("dpm has been disabled\n"); + return ret; } @@ -861,7 +872,10 @@ static int smu_hw_init(void *handle) mutex_unlock(&smu->mutex); - adev->pm.dpm_enabled = true; + if (!smu->pm_enabled) + adev->pm.dpm_enabled = false; + else + adev->pm.dpm_enabled = true; pr_info("SMU is initialized successfully!\n"); @@ -879,6 +893,8 @@ static int smu_hw_fini(void *handle) struct smu_table_context *table_context = &smu->smu_table; int ret = 0; + if (!smu->pm_enabled) + return ret; if (!is_support_sw_smu(adev)) return -EINVAL; @@ -936,6 +952,8 @@ static int smu_suspend(void *handle) struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct smu_context *smu = &adev->smu; + if (!smu->pm_enabled) + return 0; if (!is_support_sw_smu(adev)) return -EINVAL; @@ -954,6 +972,8 @@ static int smu_resume(void *handle) struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct smu_context *smu = &adev->smu; + if (!smu->pm_enabled) + return 0; if (!is_support_sw_smu(adev)) return -EINVAL; @@ -985,7 +1005,7 @@ int smu_display_configuration_change(struct smu_context *smu, int index = 0; int num_of_active_display = 0; - if (!is_support_sw_smu(smu->adev)) + if (!smu->pm_enabled || !is_support_sw_smu(smu->adev)) return -EINVAL; if (!display_config) @@ -1113,7 +1133,7 @@ static int smu_enable_umd_pstate(void *handle, struct smu_context *smu = (struct smu_context*)(handle); 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; if (!(smu_dpm_ctx->dpm_level & profile_mode_mask)) { @@ -1156,6 +1176,8 @@ int smu_adjust_power_state_dynamic(struct smu_context *smu, long workload; struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); + if (!smu->pm_enabled) + return -EINVAL; if (!skip_display_settings) { ret = smu_display_config_changed(smu); if (ret) { @@ -1164,6 +1186,8 @@ int smu_adjust_power_state_dynamic(struct smu_context *smu, } } + if (!smu->pm_enabled) + return -EINVAL; ret = smu_apply_clocks_adjust_rules(smu); if (ret) { pr_err("Failed to apply clocks adjust rules!"); diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h index 8905241..56b9812 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h +++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h @@ -401,6 +401,7 @@ struct smu_context uint32_t workload_setting[WORKLOAD_POLICY_MAX]; uint32_t power_profile_mode; uint32_t default_power_profile_mode; + bool pm_enabled; uint32_t smc_if_version; }; diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c index cd36c42..dee1e91 100644 --- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c @@ -360,6 +360,8 @@ static int smu_v11_0_init_power(struct smu_context *smu) { struct smu_power_context *smu_power = &smu->smu_power; + if (!smu->pm_enabled) + return 0; if (smu_power->power_context || smu_power->power_context_size != 0) return -EINVAL; @@ -376,6 +378,8 @@ static int smu_v11_0_fini_power(struct smu_context *smu) { struct smu_power_context *smu_power = &smu->smu_power; + if (!smu->pm_enabled) + return 0; if (!smu_power->power_context || smu_power->power_context_size == 0) return -EINVAL; @@ -641,6 +645,8 @@ static int smu_v11_0_set_min_dcef_deep_sleep(struct smu_context *smu) { struct smu_table_context *table_context = &smu->smu_table; + if (!smu->pm_enabled) + return 0; if (!table_context) return -EINVAL; @@ -669,6 +675,9 @@ static int smu_v11_0_set_tool_table_location(struct smu_context *smu) static int smu_v11_0_init_display(struct smu_context *smu) { int ret = 0; + + if (!smu->pm_enabled) + return ret; ret = smu_send_smc_msg_with_param(smu, SMU_MSG_NumOfDisplays, 0); return ret; } @@ -678,6 +687,8 @@ static int smu_v11_0_update_feature_enable_state(struct smu_context *smu, uint32 uint32_t feature_low = 0, feature_high = 0; int ret = 0; + if (!smu->pm_enabled) + return ret; if (feature_id >= 0 && feature_id < 31) feature_low = (1 << feature_id); else if (feature_id > 31 && feature_id < 63) @@ -784,10 +795,13 @@ static int smu_v11_0_system_features_control(struct smu_context *smu, uint32_t feature_mask[2]; int ret = 0; - ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures : - SMU_MSG_DisableAllSmuFeatures)); - if (ret) - return ret; + if (smu->pm_enabled) { + ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures : + SMU_MSG_DisableAllSmuFeatures)); + if (ret) + return ret; + } + ret = smu_feature_get_enabled_mask(smu, feature_mask, 2); if (ret) return ret; @@ -804,6 +818,8 @@ static int smu_v11_0_notify_display_change(struct smu_context *smu) { int ret = 0; + if (!smu->pm_enabled) + return ret; if (smu_feature_is_enabled(smu, FEATURE_DPM_UCLK_BIT)) ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetUclkFastSwitch, 1); @@ -816,6 +832,8 @@ smu_v11_0_get_max_sustainable_clock(struct smu_context *smu, uint32_t *clock, { int ret = 0; + if (!smu->pm_enabled) + return ret; ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetDcModeMaxDpmFreq, clock_select << 16); if (ret) { @@ -1072,6 +1090,8 @@ static int smu_v11_0_start_thermal_control(struct smu_context *smu) struct PP_TemperatureRange range; struct amdgpu_device *adev = smu->adev; + if (!smu->pm_enabled) + return ret; smu_v11_0_get_thermal_range(smu, &range); if (smu->smu_table.thermal_controller_type) { @@ -1242,6 +1262,8 @@ smu_v11_0_display_clock_voltage_request(struct smu_context *smu, PPCLK_e clk_select = 0; uint32_t clk_freq = clock_req->clock_freq_in_khz / 1000; + if (!smu->pm_enabled) + return -EINVAL; if (smu_feature_is_enabled(smu, FEATURE_DPM_DCEFCLK_BIT)) { switch (clk_type) { case amd_pp_dcef_clock: @@ -1525,7 +1547,7 @@ static int smu_v11_0_get_power_profile_mode(struct smu_context *smu, char *buf) "PD_Data_error_rate_coeff"}; int result = 0; - if (!buf) + if (!smu->pm_enabled || !buf) return -EINVAL; size += sprintf(buf + size, "%16s %s %s %s %s %s %s %s %s %s %s\n", @@ -1612,6 +1634,8 @@ static int smu_v11_0_set_power_profile_mode(struct smu_context *smu, long *input smu->power_profile_mode = input[size]; + if (!smu->pm_enabled) + return ret; if (smu->power_profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) { pr_err("Invalid power profile mode %d\n", smu->power_profile_mode); return -EINVAL; -- 2.7.4 [-- Attachment #3: Type: text/plain, Size: 153 bytes --] _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 8+ messages in thread
[parent not found: <MN2PR12MB3582F42887F65C1B5A8E92F18B0F0-rweVpJHSKTr2mYjuiDFEwwdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>]
* RE: [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug [not found] ` <MN2PR12MB3582F42887F65C1B5A8E92F18B0F0-rweVpJHSKTr2mYjuiDFEwwdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> @ 2019-05-14 13:56 ` Zhang, Hawking 0 siblings, 0 replies; 8+ messages in thread From: Zhang, Hawking @ 2019-05-14 13:56 UTC (permalink / raw) To: Gui, Jack, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org [-- Attachment #1.1: Type: text/plain, Size: 12180 bytes --] Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com> Regards, Hawking _____________________________________________ From: Gui, Jack <Jack.Gui@amd.com> Sent: 2019年5月13日 11:32 To: Zhang, Hawking <Hawking.Zhang@amd.com>; amd-gfx@lists.freedesktop.org Subject: RE: [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug << File: 0001-drm-amd-powerplay-Enable-disable-dpm-feature-to-supp.patch >> Hi Hawking, V2 patch attached: Return 0 directly and merge some check code. Please help review again, thanks. BR, Jack Gui _____________________________________________ From: Zhang, Hawking <Hawking.Zhang@amd.com> Sent: Sunday, May 12, 2019 11:18 AM To: Gui, Jack <Jack.Gui@amd.com>; amd-gfx@lists.freedesktop.org Cc: Gui, Jack <Jack.Gui@amd.com> Subject: RE: [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug Please check my comments inline. Regards, Hawking -----Original Message----- From: amd-gfx <amd-gfx-bounces@lists.freedesktop.org<mailto:amd-gfx-bounces@lists.freedesktop.org>> On Behalf Of Chengming Gui Sent: 2019年5月10日 16:49 To: amd-gfx@lists.freedesktop.org<mailto:amd-gfx@lists.freedesktop.org> Cc: Gui, Jack <Jack.Gui@amd.com<mailto:Jack.Gui@amd.com>> Subject: [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug [CAUTION: External Email] add pm_enabled to control the dpm off/on. Signed-off-by: Chengming Gui <Jack.Gui@amd.com<mailto:Jack.Gui@amd.com>> --- drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 34 +++++++++++++++++++++++--- drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 1 + drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 34 ++++++++++++++++++++++---- 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c index 52d919a..99b2082 100644 --- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c +++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c @@ -198,6 +198,8 @@ int smu_sys_set_pp_table(struct smu_context *smu, void *buf, size_t size) ATOM_COMMON_TABLE_HEADER *header = (ATOM_COMMON_TABLE_HEADER *)buf; int ret = 0; + if (!smu->pm_enabled) + return -EINVAL; if (header->usStructureSize != size) { pr_err("pp table size not matched !\n"); return -EIO; @@ -233,6 +235,8 @@ int smu_feature_init_dpm(struct smu_context *smu) int ret = 0; uint32_t unallowed_feature_mask[SMU_FEATURE_MAX/32]; + if (!smu->pm_enabled) + return ret; mutex_lock(&feature->mutex); bitmap_fill(feature->allowed, SMU_FEATURE_MAX); mutex_unlock(&feature->mutex); @@ -344,6 +348,7 @@ static int smu_early_init(void *handle) struct smu_context *smu = &adev->smu; smu->adev = adev; + smu->pm_enabled = amdgpu_dpm; mutex_init(&smu->mutex); return smu_set_funcs(adev); @@ -353,6 +358,9 @@ static int smu_late_init(void *handle) { struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct smu_context *smu = &adev->smu; + + if (!smu->pm_enabled) + return 0; mutex_lock(&smu->mutex); smu_handle_task(&adev->smu, smu->smu_dpm.dpm_level, @@ -746,6 +754,9 @@ static int smu_smc_table_hw_init(struct smu_context *smu, */ ret = smu_set_tool_table_location(smu); + if (!smu_is_dpm_running(smu)) + pr_info("dpm has been disabled\n"); + return ret; } @@ -861,7 +872,10 @@ static int smu_hw_init(void *handle) mutex_unlock(&smu->mutex); - adev->pm.dpm_enabled = true; + if (!smu->pm_enabled) + adev->pm.dpm_enabled = false; + else + adev->pm.dpm_enabled = true; pr_info("SMU is initialized successfully!\n"); @@ -879,6 +893,8 @@ static int smu_hw_fini(void *handle) struct smu_table_context *table_context = &smu->smu_table; int ret = 0; + if (!smu->pm_enabled) + return ret; if (!is_support_sw_smu(adev)) return -EINVAL; @@ -932,10 +948,12 @@ int smu_reset(struct smu_context *smu) static int smu_suspend(void *handle) { - int ret; + int ret = 0; struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct smu_context *smu = &adev->smu; + if (!smu->pm_enabled) + return ret; [Hawking]: Just return 0 directly if dpm was disabled. Don't change the default return value to 0 which means resume complete successfully if (!is_support_sw_smu(adev)) return -EINVAL; @@ -950,10 +968,12 @@ static int smu_suspend(void *handle) static int smu_resume(void *handle) { - int ret; + int ret = 0; struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct smu_context *smu = &adev->smu; + if (!smu->pm_enabled) + return ret; [Hawking]: similar as suspend, directly return 0 if dpm was disabled. if (!is_support_sw_smu(adev)) return -EINVAL; @@ -985,7 +1005,7 @@ int smu_display_configuration_change(struct smu_context *smu, int index = 0; int num_of_active_display = 0; - if (!is_support_sw_smu(smu->adev)) + if (!smu->pm_enabled || !is_support_sw_smu(smu->adev)) return -EINVAL; if (!display_config) @@ -1113,6 +1133,8 @@ static int smu_enable_umd_pstate(void *handle, struct smu_context *smu = (struct smu_context*)(handle); struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); + if (!smu->pm_enabled) + return -EINVAL; [Hawking]: please merge this with the dpm_context check if (!smu_dpm_ctx->dpm_context) return -EINVAL; @@ -1156,6 +1178,8 @@ int smu_adjust_power_state_dynamic(struct smu_context *smu, long workload; struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); + if (!smu->pm_enabled) + return -EINVAL; if (!skip_display_settings) { ret = smu_display_config_changed(smu); if (ret) { @@ -1164,6 +1188,8 @@ int smu_adjust_power_state_dynamic(struct smu_context *smu, } } + if (!smu->pm_enabled) + return -EINVAL; ret = smu_apply_clocks_adjust_rules(smu); if (ret) { pr_err("Failed to apply clocks adjust rules!"); diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h index 8905241..56b9812 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h +++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h @@ -401,6 +401,7 @@ struct smu_context uint32_t workload_setting[WORKLOAD_POLICY_MAX]; uint32_t power_profile_mode; uint32_t default_power_profile_mode; + bool pm_enabled; uint32_t smc_if_version; }; diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c index cd36c42..dee1e91 100644 --- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c @@ -360,6 +360,8 @@ static int smu_v11_0_init_power(struct smu_context *smu) { struct smu_power_context *smu_power = &smu->smu_power; + if (!smu->pm_enabled) + return 0; if (smu_power->power_context || smu_power->power_context_size != 0) return -EINVAL; @@ -376,6 +378,8 @@ static int smu_v11_0_fini_power(struct smu_context *smu) { struct smu_power_context *smu_power = &smu->smu_power; + if (!smu->pm_enabled) + return 0; if (!smu_power->power_context || smu_power->power_context_size == 0) return -EINVAL; @@ -641,6 +645,8 @@ static int smu_v11_0_set_min_dcef_deep_sleep(struct smu_context *smu) { struct smu_table_context *table_context = &smu->smu_table; + if (!smu->pm_enabled) + return 0; if (!table_context) return -EINVAL; @@ -669,6 +675,9 @@ static int smu_v11_0_set_tool_table_location(struct smu_context *smu) static int smu_v11_0_init_display(struct smu_context *smu) { int ret = 0; + + if (!smu->pm_enabled) + return ret; ret = smu_send_smc_msg_with_param(smu, SMU_MSG_NumOfDisplays, 0); return ret; } @@ -678,6 +687,8 @@ static int smu_v11_0_update_feature_enable_state(struct smu_context *smu, uint32 uint32_t feature_low = 0, feature_high = 0; int ret = 0; + if (!smu->pm_enabled) + return ret; if (feature_id >= 0 && feature_id < 31) feature_low = (1 << feature_id); else if (feature_id > 31 && feature_id < 63) @@ -784,10 +795,13 @@ static int smu_v11_0_system_features_control(struct smu_context *smu, uint32_t feature_mask[2]; int ret = 0; - ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures : - SMU_MSG_DisableAllSmuFeatures)); - if (ret) - return ret; + if (smu->pm_enabled) { + ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures : + SMU_MSG_DisableAllSmuFeatures)); + if (ret) + return ret; + } + ret = smu_feature_get_enabled_mask(smu, feature_mask, 2); if (ret) return ret; @@ -804,6 +818,8 @@ static int smu_v11_0_notify_display_change(struct smu_context *smu) { int ret = 0; + if (!smu->pm_enabled) + return ret; if (smu_feature_is_enabled(smu, FEATURE_DPM_UCLK_BIT)) ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetUclkFastSwitch, 1); @@ -816,6 +832,8 @@ smu_v11_0_get_max_sustainable_clock(struct smu_context *smu, uint32_t *clock, { int ret = 0; + if (!smu->pm_enabled) + return ret; ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetDcModeMaxDpmFreq, clock_select << 16); if (ret) { @@ -1072,6 +1090,8 @@ static int smu_v11_0_start_thermal_control(struct smu_context *smu) struct PP_TemperatureRange range; struct amdgpu_device *adev = smu->adev; + if (!smu->pm_enabled) + return ret; smu_v11_0_get_thermal_range(smu, &range); if (smu->smu_table.thermal_controller_type) { @@ -1242,6 +1262,8 @@ smu_v11_0_display_clock_voltage_request(struct smu_context *smu, PPCLK_e clk_select = 0; uint32_t clk_freq = clock_req->clock_freq_in_khz / 1000; + if (!smu->pm_enabled) + return -EINVAL; if (smu_feature_is_enabled(smu, FEATURE_DPM_DCEFCLK_BIT)) { switch (clk_type) { case amd_pp_dcef_clock: @@ -1525,7 +1547,7 @@ static int smu_v11_0_get_power_profile_mode(struct smu_context *smu, char *buf) "PD_Data_error_rate_coeff"}; int result = 0; - if (!buf) + if (!smu->pm_enabled || !buf) return -EINVAL; size += sprintf(buf + size, "%16s %s %s %s %s %s %s %s %s %s %s\n", @@ -1612,6 +1634,8 @@ static int smu_v11_0_set_power_profile_mode(struct smu_context *smu, long *input smu->power_profile_mode = input[size]; + if (!smu->pm_enabled) + return ret; if (smu->power_profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) { pr_err("Invalid power profile mode %d\n", smu->power_profile_mode); return -EINVAL; -- 2.7.4 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org<mailto:amd-gfx@lists.freedesktop.org> https://lists.freedesktop.org/mailman/listinfo/amd-gfx [-- Attachment #1.2: Type: text/html, Size: 34896 bytes --] [-- Attachment #2: Type: text/plain, Size: 153 bytes --] _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2019-05-14 14:26 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-05-10 8:48 [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug Chengming Gui
[not found] ` <1557478117-17823-1-git-send-email-Jack.Gui-5C7GfCeVMHo@public.gmane.org>
2019-05-10 8:48 ` [PATCH 2/2] drm/amd/powerplay: Enable "disable dpm" feature for vega20 power functions Chengming Gui
[not found] ` <1557478117-17823-2-git-send-email-Jack.Gui-5C7GfCeVMHo@public.gmane.org>
2019-05-12 3:18 ` Zhang, Hawking
[not found] ` <BYAPR12MB263244237A28E226D34F348EFC0E0-ZGDeBxoHBPk+ukJnzp2+RQdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2019-05-13 3:26 ` Gui, Jack
[not found] ` <MN2PR12MB358219B85CA0E1B4B159FB0C8B0F0-rweVpJHSKTr2mYjuiDFEwwdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2019-05-14 14:26 ` Zhang, Hawking
2019-05-12 3:18 ` [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug Zhang, Hawking
[not found] ` <BYAPR12MB263278FD5AB7F03B991DEA43FC0E0-ZGDeBxoHBPk+ukJnzp2+RQdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2019-05-13 3:32 ` Gui, Jack
[not found] ` <MN2PR12MB3582F42887F65C1B5A8E92F18B0F0-rweVpJHSKTr2mYjuiDFEwwdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2019-05-14 13:56 ` Zhang, Hawking
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox