[PATCH 1/2] drm/amd/powerplay: Enable "disable dpm" feature to support swSMU debug

Zhang, Hawking Hawking.Zhang at amd.com
Sun May 12 03:18:22 UTC 2019


Please check my comments inline.

Regards,
Hawking
-----Original Message-----
From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> On Behalf Of Chengming Gui
Sent: 2019年5月10日 16:49
To: amd-gfx at lists.freedesktop.org
Cc: Gui, Jack <Jack.Gui at 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 at amd.com<mailto:Jack.Gui at 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 at lists.freedesktop.org<mailto:amd-gfx at lists.freedesktop.org>
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20190512/863f4206/attachment-0001.html>


More information about the amd-gfx mailing list