aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3244-drm-amd-powerplay-honor-hw-limit-on-fetching-metrics.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3244-drm-amd-powerplay-honor-hw-limit-on-fetching-metrics.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3244-drm-amd-powerplay-honor-hw-limit-on-fetching-metrics.patch131
1 files changed, 131 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3244-drm-amd-powerplay-honor-hw-limit-on-fetching-metrics.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3244-drm-amd-powerplay-honor-hw-limit-on-fetching-metrics.patch
new file mode 100644
index 00000000..6df773f8
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3244-drm-amd-powerplay-honor-hw-limit-on-fetching-metrics.patch
@@ -0,0 +1,131 @@
+From 5f67ba93c9f5047feeff8e6db1dcc64fa79ddc54 Mon Sep 17 00:00:00 2001
+From: Kevin Wang <kevin1.wang@amd.com>
+Date: Fri, 2 Aug 2019 12:01:00 +0800
+Subject: [PATCH 3244/4256] drm/amd/powerplay: honor hw limit on fetching
+ metrics data for navi10
+
+too frequently to update mertrics table will cause smu internal error.
+
+Signed-off-by: Kevin Wang <kevin1.wang@amd.com>
+Reviewed-by: Evan Quan <evan.quan@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 56 +++++++++++++++-------
+ 1 file changed, 38 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+index b7bb0f78f489..c9a7d26e6c92 100644
+--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+@@ -515,6 +515,8 @@ static int navi10_store_powerplay_table(struct smu_context *smu)
+
+ static int navi10_tables_init(struct smu_context *smu, struct smu_table *tables)
+ {
++ struct smu_table_context *smu_table = &smu->smu_table;
++
+ SMU_TABLE_INIT(tables, SMU_TABLE_PPTABLE, sizeof(PPTable_t),
+ PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
+ SMU_TABLE_INIT(tables, SMU_TABLE_WATERMARKS, sizeof(Watermarks_t),
+@@ -529,9 +531,35 @@ static int navi10_tables_init(struct smu_context *smu, struct smu_table *tables)
+ sizeof(DpmActivityMonitorCoeffInt_t), PAGE_SIZE,
+ AMDGPU_GEM_DOMAIN_VRAM);
+
++ smu_table->metrics_table = kzalloc(sizeof(SmuMetrics_t), GFP_KERNEL);
++ if (!smu_table->metrics_table)
++ return -ENOMEM;
++ smu_table->metrics_time = 0;
++
+ return 0;
+ }
+
++static int navi10_get_metrics_table(struct smu_context *smu,
++ SmuMetrics_t *metrics_table)
++{
++ struct smu_table_context *smu_table= &smu->smu_table;
++ 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, 0,
++ (void *)smu_table->metrics_table, false);
++ if (ret) {
++ pr_info("Failed to export SMU metrics table!\n");
++ return ret;
++ }
++ smu_table->metrics_time = jiffies;
++ }
++
++ memcpy(metrics_table, smu_table->metrics_table, sizeof(SmuMetrics_t));
++
++ return ret;
++}
++
+ static int navi10_allocate_dpm_context(struct smu_context *smu)
+ {
+ struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
+@@ -618,15 +646,10 @@ static int navi10_get_current_clk_freq_by_table(struct smu_context *smu,
+ enum smu_clk_type clk_type,
+ uint32_t *value)
+ {
+- static SmuMetrics_t metrics;
+ int ret = 0, clk_id = 0;
++ SmuMetrics_t metrics;
+
+- if (!value)
+- return -EINVAL;
+-
+- memset(&metrics, 0, sizeof(metrics));
+-
+- ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, 0, (void *)&metrics, false);
++ ret = navi10_get_metrics_table(smu, &metrics);
+ if (ret)
+ return ret;
+
+@@ -914,8 +937,9 @@ 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, 0, (void *)&metrics,
+- false);
++ ret = navi10_get_metrics_table(smu, &metrics);
++ if (ret)
++ return ret;
+ if (ret)
+ return ret;
+
+@@ -934,10 +958,7 @@ static int navi10_get_current_activity_percent(struct smu_context *smu,
+ if (!value)
+ return -EINVAL;
+
+- msleep(1);
+-
+- ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, 0,
+- (void *)&metrics, false);
++ ret = navi10_get_metrics_table(smu, &metrics);
+ if (ret)
+ return ret;
+
+@@ -976,10 +997,9 @@ static int navi10_get_fan_speed_rpm(struct smu_context *smu,
+ if (!speed)
+ return -EINVAL;
+
+- memset(&metrics, 0, sizeof(metrics));
+-
+- ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, 0,
+- (void *)&metrics, false);
++ ret = navi10_get_metrics_table(smu, &metrics);
++ if (ret)
++ return ret;
+ if (ret)
+ return ret;
+
+@@ -1332,7 +1352,7 @@ static int navi10_thermal_get_temperature(struct smu_context *smu,
+ if (!value)
+ return -EINVAL;
+
+- ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, 0, (void *)&metrics, false);
++ ret = navi10_get_metrics_table(smu, &metrics);
+ if (ret)
+ return ret;
+
+--
+2.17.1
+