drm/amd/powerplay: common API for disabling all features with exception
authorEvan Quan <evan.quan@amd.com>
Tue, 7 Jul 2020 03:41:29 +0000 (11:41 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 21 Jul 2020 19:37:38 +0000 (15:37 -0400)
We are moving to centralize all feature enablement/support checking and
setting APIs in smu_cmn.c.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
drivers/gpu/drm/amd/powerplay/navi10_ppt.c
drivers/gpu/drm/amd/powerplay/renoir_ppt.c
drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
drivers/gpu/drm/amd/powerplay/smu_cmn.c
drivers/gpu/drm/amd/powerplay/smu_cmn.h
drivers/gpu/drm/amd/powerplay/smu_internal.h

index 9b7287a..f464f9a 100644 (file)
@@ -1108,7 +1108,6 @@ static int smu_hw_init(void *handle)
 static int smu_disable_dpms(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
-       uint64_t features_to_disable;
        int ret = 0;
        bool use_baco = !smu->is_apu &&
                ((adev->in_gpu_reset &&
@@ -1144,13 +1143,8 @@ static int smu_disable_dpms(struct smu_context *smu)
         * BACO feature has to be kept enabled.
         */
        if (use_baco && smu_feature_is_enabled(smu, SMU_FEATURE_BACO_BIT)) {
-               features_to_disable = U64_MAX &
-                       ~(1ULL << smu_cmn_to_asic_specific_index(smu,
-                                                       CMN2ASIC_MAPPING_FEATURE,
-                                                       SMU_FEATURE_BACO_BIT));
-               ret = smu_feature_update_enable_state(smu,
-                                                     features_to_disable,
-                                                     0);
+               ret = smu_disable_all_features_with_exception(smu,
+                                                             SMU_FEATURE_BACO_BIT);
                if (ret)
                        dev_err(adev->dev, "Failed to disable smu features except BACO.\n");
        } else {
index 420c3fc..c542f16 100644 (file)
@@ -2286,6 +2286,7 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
        .set_allowed_mask = smu_v11_0_set_allowed_mask,
        .get_enabled_mask = smu_cmn_get_enabled_mask,
        .feature_is_enabled = smu_cmn_feature_is_enabled,
+       .disable_all_features_with_exception = smu_cmn_disable_all_features_with_exception,
        .notify_display_change = NULL,
        .set_power_limit = smu_v11_0_set_power_limit,
        .init_max_sustainable_clocks = smu_v11_0_init_max_sustainable_clocks,
index 7d37807..e67b74d 100644 (file)
@@ -534,6 +534,7 @@ struct pptable_funcs {
        int (*set_allowed_mask)(struct smu_context *smu);
        int (*get_enabled_mask)(struct smu_context *smu, uint32_t *feature_mask, uint32_t num);
        int (*feature_is_enabled)(struct smu_context *smu, enum smu_feature_mask mask);
+       int (*disable_all_features_with_exception)(struct smu_context *smu, enum smu_feature_mask mask);
        int (*notify_display_change)(struct smu_context *smu);
        int (*set_power_limit)(struct smu_context *smu, uint32_t n);
        int (*init_max_sustainable_clocks)(struct smu_context *smu);
index fcffeaa..3d76f13 100644 (file)
@@ -2301,6 +2301,7 @@ static const struct pptable_funcs navi10_ppt_funcs = {
        .set_allowed_mask = smu_v11_0_set_allowed_mask,
        .get_enabled_mask = smu_cmn_get_enabled_mask,
        .feature_is_enabled = smu_cmn_feature_is_enabled,
+       .disable_all_features_with_exception = smu_cmn_disable_all_features_with_exception,
        .notify_display_change = smu_v11_0_notify_display_change,
        .set_power_limit = smu_v11_0_set_power_limit,
        .init_max_sustainable_clocks = smu_v11_0_init_max_sustainable_clocks,
index 418cfa4..afdcbe4 100644 (file)
@@ -1020,6 +1020,7 @@ static const struct pptable_funcs renoir_ppt_funcs = {
        .set_default_dpm_table = smu_v12_0_set_default_dpm_tables,
        .get_enabled_mask = smu_cmn_get_enabled_mask,
        .feature_is_enabled = smu_cmn_feature_is_enabled,
+       .disable_all_features_with_exception = smu_cmn_disable_all_features_with_exception,
        .get_dpm_ultimate_freq = renoir_get_dpm_ultimate_freq,
        .mode2_reset = smu_v12_0_mode2_reset,
        .set_soft_freq_limited_range = smu_v12_0_set_soft_freq_limited_range,
index 3ed8b77..331560a 100644 (file)
@@ -2452,6 +2452,7 @@ static const struct pptable_funcs sienna_cichlid_ppt_funcs = {
        .set_allowed_mask = smu_v11_0_set_allowed_mask,
        .get_enabled_mask = smu_cmn_get_enabled_mask,
        .feature_is_enabled = smu_cmn_feature_is_enabled,
+       .disable_all_features_with_exception = smu_cmn_disable_all_features_with_exception,
        .notify_display_change = NULL,
        .set_power_limit = smu_v11_0_set_power_limit,
        .init_max_sustainable_clocks = smu_v11_0_init_max_sustainable_clocks,
index d0293b3..85c1069 100644 (file)
@@ -355,3 +355,22 @@ int smu_cmn_set_pp_feature_mask(struct smu_context *smu,
 
        return ret;
 }
+
+int smu_cmn_disable_all_features_with_exception(struct smu_context *smu,
+                                               enum smu_feature_mask mask)
+{
+       uint64_t features_to_disable = U64_MAX;
+       int skipped_feature_id;
+
+       skipped_feature_id = smu_cmn_to_asic_specific_index(smu,
+                                                           CMN2ASIC_MAPPING_FEATURE,
+                                                           mask);
+       if (skipped_feature_id < 0)
+               return -EINVAL;
+
+       features_to_disable &= ~(1ULL << skipped_feature_id);
+
+       return smu_cmn_feature_update_enable_state(smu,
+                                                  features_to_disable,
+                                                  0);
+}
index 36a2931..08968ad 100644 (file)
@@ -49,4 +49,7 @@ size_t smu_cmn_get_pp_feature_mask(struct smu_context *smu,
 int smu_cmn_set_pp_feature_mask(struct smu_context *smu,
                                uint64_t new_mask);
 
+int smu_cmn_disable_all_features_with_exception(struct smu_context *smu,
+                                               enum smu_feature_mask mask);
+
 #endif
index 208d111..a27e05a 100644 (file)
@@ -56,6 +56,7 @@
 #define smu_feature_set_allowed_mask(smu)                              smu_ppt_funcs(set_allowed_mask, 0, smu)
 #define smu_feature_get_enabled_mask(smu, mask, num)                   smu_ppt_funcs(get_enabled_mask, 0, smu, mask, num)
 #define smu_feature_is_enabled(smu, mask)                              smu_ppt_funcs(feature_is_enabled, 0, smu, mask)
+#define smu_disable_all_features_with_exception(smu, mask)             smu_ppt_funcs(disable_all_features_with_exception, 0, smu, mask)
 #define smu_is_dpm_running(smu)                                                smu_ppt_funcs(is_dpm_running, 0 , smu)
 #define smu_notify_display_change(smu)                                 smu_ppt_funcs(notify_display_change, 0, smu)
 #define smu_set_default_dpm_table(smu)                                 smu_ppt_funcs(set_default_dpm_table, 0, smu)