<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from rtf -->
<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
</head>
<body>
<font face="Calibri" size="2"><span style="font-size:11pt;">
<div>Please check my comments inline. </div>
<div><font face="Times New Roman"> </font></div>
<div>Regards,<br>

Hawking</div>
<div>-----Original Message-----<br>

From: amd-gfx <amd-gfx-bounces@lists.freedesktop.org> On Behalf Of Chengming Gui<br>

Sent: 2019<font face="等线">年</font>5<font face="等线">月</font>10<font face="等线">日</font> 16:49<br>

To: amd-gfx@lists.freedesktop.org<br>

Cc: Gui, Jack <Jack.Gui@amd.com><br>

Subject: [PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug</div>
<div><font face="Times New Roman"> </font></div>
<div>[CAUTION: External Email]</div>
<div> </div>
<div>add pm_enabled to control the dpm off/on.</div>
<div> </div>
<div>Signed-off-by: Chengming Gui <<a href="mailto:Jack.Gui@amd.com">Jack.Gui@amd.com</a>></div>
<div>---</div>
<div> drivers/gpu/drm/amd/powerplay/amdgpu_smu.c     | 34 +++++++++++++++++++++++---</div>
<div> drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h |  1 +</div>
<div> drivers/gpu/drm/amd/powerplay/smu_v11_0.c      | 34 ++++++++++++++++++++++----</div>
<div> 3 files changed, 60 insertions(+), 9 deletions(-)</div>
<div> </div>
<div>diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c</div>
<div>index 52d919a..99b2082 100644</div>
<div>--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c</div>
<div>+++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c</div>
<div>@@ -198,6 +198,8 @@ int smu_sys_set_pp_table(struct smu_context *smu,  void *buf, size_t size)</div>
<div>        ATOM_COMMON_TABLE_HEADER *header = (ATOM_COMMON_TABLE_HEADER *)buf;</div>
<div>        int ret = 0;</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return -EINVAL;</div>
<div>        if (header->usStructureSize != size) {</div>
<div>                pr_err("pp table size not matched !\n");</div>
<div>                return -EIO;</div>
<div>@@ -233,6 +235,8 @@ int smu_feature_init_dpm(struct smu_context *smu)</div>
<div>        int ret = 0;</div>
<div>        uint32_t unallowed_feature_mask[SMU_FEATURE_MAX/32];</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return ret;</div>
<div>        mutex_lock(&feature->mutex);</div>
<div>        bitmap_fill(feature->allowed, SMU_FEATURE_MAX);</div>
<div>        mutex_unlock(&feature->mutex);</div>
<div>@@ -344,6 +348,7 @@ static int smu_early_init(void *handle)</div>
<div>        struct smu_context *smu = &adev->smu;</div>
<div> </div>
<div>        smu->adev = adev;</div>
<div>+       smu->pm_enabled = amdgpu_dpm;</div>
<div>        mutex_init(&smu->mutex);</div>
<div> </div>
<div>        return smu_set_funcs(adev);</div>
<div>@@ -353,6 +358,9 @@ static int smu_late_init(void *handle)  {</div>
<div>        struct amdgpu_device *adev = (struct amdgpu_device *)handle;</div>
<div>        struct smu_context *smu = &adev->smu;</div>
<div>+</div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return 0;</div>
<div>        mutex_lock(&smu->mutex);</div>
<div>        smu_handle_task(&adev->smu,</div>
<div>                        smu->smu_dpm.dpm_level, @@ -746,6 +754,9 @@ static int smu_smc_table_hw_init(struct smu_context *smu,</div>
<div>         */</div>
<div>        ret = smu_set_tool_table_location(smu);</div>
<div> </div>
<div>+       if (!smu_is_dpm_running(smu))</div>
<div>+               pr_info("dpm has been disabled\n");</div>
<div>+</div>
<div>        return ret;</div>
<div> }</div>
<div> </div>
<div>@@ -861,7 +872,10 @@ static int smu_hw_init(void *handle)</div>
<div> </div>
<div>        mutex_unlock(&smu->mutex);</div>
<div> </div>
<div>-       adev->pm.dpm_enabled = true;</div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               adev->pm.dpm_enabled = false;</div>
<div>+       else</div>
<div>+               adev->pm.dpm_enabled = true;</div>
<div> </div>
<div>        pr_info("SMU is initialized successfully!\n");</div>
<div> </div>
<div>@@ -879,6 +893,8 @@ static int smu_hw_fini(void *handle)</div>
<div>        struct smu_table_context *table_context = &smu->smu_table;</div>
<div>        int ret = 0;</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return ret;</div>
<div>        if (!is_support_sw_smu(adev))</div>
<div>                return -EINVAL;</div>
<div> </div>
<div>@@ -932,10 +948,12 @@ int smu_reset(struct smu_context *smu)</div>
<div> </div>
<div> static int smu_suspend(void *handle)</div>
<div> {</div>
<div>-       int ret;</div>
<div>+       int ret = 0;</div>
<div>        struct amdgpu_device *adev = (struct amdgpu_device *)handle;</div>
<div>        struct smu_context *smu = &adev->smu;</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return ret;</div>
<div><font color="#1F3864">[Hawking]: Just return 0 directly if dpm was disabled. Don't change the default return value to 0 which means resume complete successfully </font></div>
<div><font face="Times New Roman"> </font></div>
<div>        if (!is_support_sw_smu(adev))</div>
<div>                return -EINVAL;</div>
<div> </div>
<div>@@ -950,10 +968,12 @@ static int smu_suspend(void *handle)</div>
<div> </div>
<div> static int smu_resume(void *handle)</div>
<div> {</div>
<div>-       int ret;</div>
<div>+       int ret = 0;</div>
<div>        struct amdgpu_device *adev = (struct amdgpu_device *)handle;</div>
<div>        struct smu_context *smu = &adev->smu;</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return ret;</div>
<div><font color="#1F3864">[Hawking]: similar as suspend, directly return 0 if dpm was disabled.</font></div>
<div><font face="Times New Roman"> </font></div>
<div>        if (!is_support_sw_smu(adev))</div>
<div>                return -EINVAL;</div>
<div> </div>
<div>@@ -985,7 +1005,7 @@ int smu_display_configuration_change(struct smu_context *smu,</div>
<div>        int index = 0;</div>
<div>        int num_of_active_display = 0;</div>
<div> </div>
<div>-       if (!is_support_sw_smu(smu->adev))</div>
<div>+       if (!smu->pm_enabled || !is_support_sw_smu(smu->adev))</div>
<div>                return -EINVAL;</div>
<div> </div>
<div>        if (!display_config)</div>
<div>@@ -1113,6 +1133,8 @@ static int smu_enable_umd_pstate(void *handle,</div>
<div> </div>
<div>        struct smu_context *smu = (struct smu_context*)(handle);</div>
<div>        struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);</div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return -EINVAL;</div>
<div><font color="#1F3864">[Hawking]: please merge this with the dpm_context check</font></div>
<div><font face="Times New Roman"> </font></div>
<div>        if (!smu_dpm_ctx->dpm_context)</div>
<div>                return -EINVAL;</div>
<div> </div>
<div>@@ -1156,6 +1178,8 @@ int smu_adjust_power_state_dynamic(struct smu_context *smu,</div>
<div>        long workload;</div>
<div>        struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return -EINVAL;</div>
<div>        if (!skip_display_settings) {</div>
<div>                ret = smu_display_config_changed(smu);</div>
<div>                if (ret) {</div>
<div>@@ -1164,6 +1188,8 @@ int smu_adjust_power_state_dynamic(struct smu_context *smu,</div>
<div>                }</div>
<div>        }</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return -EINVAL;</div>
<div>        ret = smu_apply_clocks_adjust_rules(smu);</div>
<div>        if (ret) {</div>
<div>                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</div>
<div>index 8905241..56b9812 100644</div>
<div>--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h</div>
<div>+++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h</div>
<div>@@ -401,6 +401,7 @@ struct smu_context</div>
<div>        uint32_t workload_setting[WORKLOAD_POLICY_MAX];</div>
<div>        uint32_t power_profile_mode;</div>
<div>        uint32_t default_power_profile_mode;</div>
<div>+       bool pm_enabled;</div>
<div> </div>
<div>        uint32_t smc_if_version;</div>
<div> };</div>
<div>diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c</div>
<div>index cd36c42..dee1e91 100644</div>
<div>--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c</div>
<div>+++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c</div>
<div>@@ -360,6 +360,8 @@ static int smu_v11_0_init_power(struct smu_context *smu)  {</div>
<div>        struct smu_power_context *smu_power = &smu->smu_power;</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return 0;</div>
<div>        if (smu_power->power_context || smu_power->power_context_size != 0)</div>
<div>                return -EINVAL;</div>
<div> </div>
<div>@@ -376,6 +378,8 @@ static int smu_v11_0_fini_power(struct smu_context *smu)  {</div>
<div>        struct smu_power_context *smu_power = &smu->smu_power;</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return 0;</div>
<div>        if (!smu_power->power_context || smu_power->power_context_size == 0)</div>
<div>                return -EINVAL;</div>
<div> </div>
<div>@@ -641,6 +645,8 @@ static int smu_v11_0_set_min_dcef_deep_sleep(struct smu_context *smu)  {</div>
<div>        struct smu_table_context *table_context = &smu->smu_table;</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return 0;</div>
<div>        if (!table_context)</div>
<div>                return -EINVAL;</div>
<div> </div>
<div>@@ -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)  {</div>
<div>        int ret = 0;</div>
<div>+</div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return ret;</div>
<div>        ret = smu_send_smc_msg_with_param(smu, SMU_MSG_NumOfDisplays, 0);</div>
<div>        return ret;</div>
<div> }</div>
<div>@@ -678,6 +687,8 @@ static int smu_v11_0_update_feature_enable_state(struct smu_context *smu, uint32</div>
<div>        uint32_t feature_low = 0, feature_high = 0;</div>
<div>        int ret = 0;</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return ret;</div>
<div>        if (feature_id >= 0 && feature_id < 31)</div>
<div>                feature_low = (1 << feature_id);</div>
<div>        else if (feature_id > 31 && feature_id < 63) @@ -784,10 +795,13 @@ static int smu_v11_0_system_features_control(struct smu_context *smu,</div>
<div>        uint32_t feature_mask[2];</div>
<div>        int ret = 0;</div>
<div> </div>
<div>-       ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures :</div>
<div>-                                    SMU_MSG_DisableAllSmuFeatures));</div>
<div>-       if (ret)</div>
<div>-               return ret;</div>
<div>+       if (smu->pm_enabled) {</div>
<div>+               ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures :</div>
<div>+                                            SMU_MSG_DisableAllSmuFeatures));</div>
<div>+               if (ret)</div>
<div>+                       return ret;</div>
<div>+       }</div>
<div>+</div>
<div>        ret = smu_feature_get_enabled_mask(smu, feature_mask, 2);</div>
<div>        if (ret)</div>
<div>                return ret;</div>
<div>@@ -804,6 +818,8 @@ static int smu_v11_0_notify_display_change(struct smu_context *smu)  {</div>
<div>        int ret = 0;</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return ret;</div>
<div>        if (smu_feature_is_enabled(smu, FEATURE_DPM_UCLK_BIT))</div>
<div>            ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetUclkFastSwitch, 1);</div>
<div> </div>
<div>@@ -816,6 +832,8 @@ smu_v11_0_get_max_sustainable_clock(struct smu_context *smu, uint32_t *clock,  {</div>
<div>        int ret = 0;</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return ret;</div>
<div>        ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetDcModeMaxDpmFreq,</div>
<div>                                          clock_select << 16);</div>
<div>        if (ret) {</div>
<div>@@ -1072,6 +1090,8 @@ static int smu_v11_0_start_thermal_control(struct smu_context *smu)</div>
<div>        struct PP_TemperatureRange range;</div>
<div>        struct amdgpu_device *adev = smu->adev;</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return ret;</div>
<div>        smu_v11_0_get_thermal_range(smu, &range);</div>
<div> </div>
<div>        if (smu->smu_table.thermal_controller_type) { @@ -1242,6 +1262,8 @@ smu_v11_0_display_clock_voltage_request(struct smu_context *smu,</div>
<div>        PPCLK_e clk_select = 0;</div>
<div>        uint32_t clk_freq = clock_req->clock_freq_in_khz / 1000;</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return -EINVAL;</div>
<div>        if (smu_feature_is_enabled(smu, FEATURE_DPM_DCEFCLK_BIT)) {</div>
<div>                switch (clk_type) {</div>
<div>                case amd_pp_dcef_clock:</div>
<div>@@ -1525,7 +1547,7 @@ static int smu_v11_0_get_power_profile_mode(struct smu_context *smu, char *buf)</div>
<div>                        "PD_Data_error_rate_coeff"};</div>
<div>        int result = 0;</div>
<div> </div>
<div>-       if (!buf)</div>
<div>+       if (!smu->pm_enabled || !buf)</div>
<div>                return -EINVAL;</div>
<div> </div>
<div>        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</div>
<div> </div>
<div>        smu->power_profile_mode = input[size];</div>
<div> </div>
<div>+       if (!smu->pm_enabled)</div>
<div>+               return ret;</div>
<div>        if (smu->power_profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) {</div>
<div>                pr_err("Invalid power profile mode %d\n", smu->power_profile_mode);</div>
<div>                return -EINVAL;</div>
<div>--</div>
<div>2.7.4</div>
<div> </div>
<div>_______________________________________________</div>
<div>amd-gfx mailing list</div>
<div><font face="Times New Roman"><a href="mailto:amd-gfx@lists.freedesktop.org"><font face="Calibri">amd-gfx@lists.freedesktop.org</font></a></font></div>
<div><font face="Times New Roman"><a href="https://lists.freedesktop.org/mailman/listinfo/amd-gfx"><font face="Calibri">https://lists.freedesktop.org/mailman/listinfo/amd-gfx</font></a></font></div>
<div><font face="Times New Roman"> </font></div>
</span></font>
</body>
</html>