diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3364-drm-amd-powerplay-honor-hw-limit-on-fetching-metrics.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3364-drm-amd-powerplay-honor-hw-limit-on-fetching-metrics.patch | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3364-drm-amd-powerplay-honor-hw-limit-on-fetching-metrics.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3364-drm-amd-powerplay-honor-hw-limit-on-fetching-metrics.patch new file mode 100644 index 00000000..633e6b7c --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3364-drm-amd-powerplay-honor-hw-limit-on-fetching-metrics.patch @@ -0,0 +1,131 @@ +From 3d70fac9bc2242f6f49db5f6b632d1949f6c6e7a 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 3364/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 907035a6e995..99c1f94e44d1 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 + |