aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2992-drm-amd-powerplay-correct-smu_update_table-usage.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2992-drm-amd-powerplay-correct-smu_update_table-usage.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2992-drm-amd-powerplay-correct-smu_update_table-usage.patch250
1 files changed, 250 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2992-drm-amd-powerplay-correct-smu_update_table-usage.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2992-drm-amd-powerplay-correct-smu_update_table-usage.patch
new file mode 100644
index 00000000..a69e286f
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2992-drm-amd-powerplay-correct-smu_update_table-usage.patch
@@ -0,0 +1,250 @@
+From ac9c38946a2e033899db8b46f89a6d8e295e273d Mon Sep 17 00:00:00 2001
+From: Evan Quan <evan.quan@amd.com>
+Date: Thu, 11 Jul 2019 15:13:17 +0800
+Subject: [PATCH 2992/4256] drm/amd/powerplay: correct smu_update_table usage
+
+The interface was used in a confusing way. In profile mode scenario,
+the 2nd parameter of the interface was used in a different way from
+other scenarios.
+
+Change-Id: Iabcebb47db8fdf242580c1059393132ee10b93e4
+Signed-off-by: Evan Quan <evan.quan@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 4 ++--
+ .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 2 +-
+ drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 16 +++++++--------
+ drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 4 ++--
+ drivers/gpu/drm/amd/powerplay/vega20_ppt.c | 20 +++++++++----------
+ 5 files changed, 23 insertions(+), 23 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+index 40604fe1c684..5d5664fb1a84 100644
+--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
++++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+@@ -323,7 +323,7 @@ int smu_common_read_sensor(struct smu_context *smu, enum amd_pp_sensors sensor,
+ return ret;
+ }
+
+-int smu_update_table(struct smu_context *smu, enum smu_table_id table_index,
++int smu_update_table(struct smu_context *smu, enum smu_table_id table_index, int argument,
+ void *table_data, bool drv2smu)
+ {
+ struct smu_table_context *smu_table = &smu->smu_table;
+@@ -350,7 +350,7 @@ int smu_update_table(struct smu_context *smu, enum smu_table_id table_index,
+ ret = smu_send_smc_msg_with_param(smu, drv2smu ?
+ SMU_MSG_TransferTableDram2Smu :
+ SMU_MSG_TransferTableSmu2Dram,
+- table_id);
++ table_id | ((argument & 0xFFFF) << 16));
+ if (ret)
+ return ret;
+
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+index c80077db6cf5..514d31518853 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+@@ -947,7 +947,7 @@ extern int smu_feature_is_supported(struct smu_context *smu,
+ extern int smu_feature_set_supported(struct smu_context *smu,
+ enum smu_feature_mask mask, bool enable);
+
+-int smu_update_table(struct smu_context *smu, uint32_t table_index,
++int smu_update_table(struct smu_context *smu, enum smu_table_id table_index, int argument,
+ void *table_data, bool drv2smu);
+
+ bool is_support_sw_smu(struct amdgpu_device *adev);
+diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+index 0c40d390d04b..0ab02efcbc83 100644
+--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+@@ -633,7 +633,7 @@ static int navi10_get_current_clk_freq_by_table(struct smu_context *smu,
+
+ memset(&metrics, 0, sizeof(metrics));
+
+- ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, (void *)&metrics, false);
++ ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, 0, (void *)&metrics, false);
+ if (ret)
+ return ret;
+
+@@ -886,7 +886,7 @@ static int navi10_get_gpu_power(struct smu_context *smu, uint32_t *value)
+ if (!value)
+ return -EINVAL;
+
+- ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, (void *)&metrics,
++ ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, 0, (void *)&metrics,
+ false);
+ if (ret)
+ return ret;
+@@ -908,7 +908,7 @@ static int navi10_get_current_activity_percent(struct smu_context *smu,
+
+ msleep(1);
+
+- ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS,
++ ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, 0,
+ (void *)&metrics, false);
+ if (ret)
+ return ret;
+@@ -949,7 +949,7 @@ static int navi10_get_fan_speed(struct smu_context *smu, uint16_t *value)
+
+ memset(&metrics, 0, sizeof(metrics));
+
+- ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS,
++ ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, 0,
+ (void *)&metrics, false);
+ if (ret)
+ return ret;
+@@ -1018,7 +1018,7 @@ static int navi10_get_power_profile_mode(struct smu_context *smu, char *buf)
+ return -EINVAL;
+
+ result = smu_update_table(smu,
+- SMU_TABLE_ACTIVITY_MONITOR_COEFF | workload_type << 16,
++ SMU_TABLE_ACTIVITY_MONITOR_COEFF, workload_type,
+ (void *)(&activity_monitor), false);
+ if (result) {
+ pr_err("[%s] Failed to get activity monitor!", __func__);
+@@ -1091,7 +1091,7 @@ static int navi10_set_power_profile_mode(struct smu_context *smu, long *input, u
+ return -EINVAL;
+
+ ret = smu_update_table(smu,
+- SMU_TABLE_ACTIVITY_MONITOR_COEFF | WORKLOAD_PPLIB_CUSTOM_BIT << 16,
++ SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT,
+ (void *)(&activity_monitor), false);
+ if (ret) {
+ pr_err("[%s] Failed to get activity monitor!", __func__);
+@@ -1135,7 +1135,7 @@ static int navi10_set_power_profile_mode(struct smu_context *smu, long *input, u
+ }
+
+ ret = smu_update_table(smu,
+- SMU_TABLE_ACTIVITY_MONITOR_COEFF | WORKLOAD_PPLIB_CUSTOM_BIT << 16,
++ SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT,
+ (void *)(&activity_monitor), true);
+ if (ret) {
+ pr_err("[%s] Failed to set activity monitor!", __func__);
+@@ -1303,7 +1303,7 @@ static int navi10_thermal_get_temperature(struct smu_context *smu,
+ if (!value)
+ return -EINVAL;
+
+- ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, (void *)&metrics, false);
++ ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, 0, (void *)&metrics, false);
+ if (ret)
+ return ret;
+
+diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+index e60a5ceb5bff..9f60e5c78ba0 100644
+--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
++++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+@@ -710,7 +710,7 @@ static int smu_v11_0_write_pptable(struct smu_context *smu)
+ struct smu_table_context *table_context = &smu->smu_table;
+ int ret = 0;
+
+- ret = smu_update_table(smu, SMU_TABLE_PPTABLE,
++ ret = smu_update_table(smu, SMU_TABLE_PPTABLE, 0,
+ table_context->driver_pptable, true);
+
+ return ret;
+@@ -729,7 +729,7 @@ static int smu_v11_0_write_watermarks_table(struct smu_context *smu)
+ if (!table->cpu_addr)
+ return -EINVAL;
+
+- ret = smu_update_table(smu, SMU_TABLE_WATERMARKS, table->cpu_addr,
++ ret = smu_update_table(smu, SMU_TABLE_WATERMARKS, 0, table->cpu_addr,
+ true);
+
+ return ret;
+diff --git a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
+index 6b0180d1552b..ff74ac76805d 100644
+--- a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
+@@ -1699,7 +1699,7 @@ static int vega20_get_metrics_table(struct smu_context *smu,
+ int ret = 0;
+
+ if (!smu_table->metrics_time || time_after(jiffies, smu_table->metrics_time + HZ / 1000)) {
+- ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS,
++ ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, 0,
+ (void *)smu_table->metrics_table, false);
+ if (ret) {
+ pr_info("Failed to export SMU metrics table!\n");
+@@ -1728,7 +1728,7 @@ static int vega20_set_default_od_settings(struct smu_context *smu,
+ if (!table_context->overdrive_table)
+ return -ENOMEM;
+
+- ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE,
++ ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE, 0,
+ table_context->overdrive_table, false);
+ if (ret) {
+ pr_err("Failed to export over drive table!\n");
+@@ -1740,7 +1740,7 @@ static int vega20_set_default_od_settings(struct smu_context *smu,
+ return ret;
+ }
+
+- ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE,
++ ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE, 0,
+ table_context->overdrive_table, true);
+ if (ret) {
+ pr_err("Failed to import over drive table!\n");
+@@ -1827,7 +1827,7 @@ static int vega20_get_power_profile_mode(struct smu_context *smu, char *buf)
+ return -EINVAL;
+
+ result = smu_update_table(smu,
+- SMU_TABLE_ACTIVITY_MONITOR_COEFF | workload_type << 16,
++ SMU_TABLE_ACTIVITY_MONITOR_COEFF, workload_type,
+ (void *)(&activity_monitor), false);
+ if (result) {
+ pr_err("[%s] Failed to get activity monitor!", __func__);
+@@ -1913,7 +1913,7 @@ static int vega20_set_power_profile_mode(struct smu_context *smu, long *input, u
+
+ if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) {
+ ret = smu_update_table(smu,
+- SMU_TABLE_ACTIVITY_MONITOR_COEFF | WORKLOAD_PPLIB_CUSTOM_BIT << 16,
++ SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT,
+ (void *)(&activity_monitor), false);
+ if (ret) {
+ pr_err("[%s] Failed to get activity monitor!", __func__);
+@@ -1968,7 +1968,7 @@ static int vega20_set_power_profile_mode(struct smu_context *smu, long *input, u
+ }
+
+ ret = smu_update_table(smu,
+- SMU_TABLE_ACTIVITY_MONITOR_COEFF | WORKLOAD_PPLIB_CUSTOM_BIT << 16,
++ SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT,
+ (void *)(&activity_monitor), true);
+ if (ret) {
+ pr_err("[%s] Failed to set activity monitor!", __func__);
+@@ -2519,7 +2519,7 @@ static int vega20_update_od8_settings(struct smu_context *smu,
+ struct smu_table_context *table_context = &smu->smu_table;
+ int ret;
+
+- ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE,
++ ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE, 0,
+ table_context->overdrive_table, false);
+ if (ret) {
+ pr_err("Failed to export over drive table!\n");
+@@ -2530,7 +2530,7 @@ static int vega20_update_od8_settings(struct smu_context *smu,
+ if (ret)
+ return ret;
+
+- ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE,
++ ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE, 0,
+ table_context->overdrive_table, true);
+ if (ret) {
+ pr_err("Failed to import over drive table!\n");
+@@ -2794,7 +2794,7 @@ static int vega20_odn_edit_dpm_table(struct smu_context *smu,
+ break;
+
+ case PP_OD_RESTORE_DEFAULT_TABLE:
+- ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE, table_context->overdrive_table, false);
++ ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE, 0, table_context->overdrive_table, false);
+ if (ret) {
+ pr_err("Failed to export over drive table!\n");
+ return ret;
+@@ -2803,7 +2803,7 @@ static int vega20_odn_edit_dpm_table(struct smu_context *smu,
+ break;
+
+ case PP_OD_COMMIT_DPM_TABLE:
+- ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE, table_context->overdrive_table, true);
++ ret = smu_update_table(smu, SMU_TABLE_OVERDRIVE, 0, table_context->overdrive_table, true);
+ if (ret) {
+ pr_err("Failed to import over drive table!\n");
+ return ret;
+--
+2.17.1
+