diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/2382-drm-amd-powerplay-move-function-get_metrics_table-to.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/2382-drm-amd-powerplay-move-function-get_metrics_table-to.patch | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/2382-drm-amd-powerplay-move-function-get_metrics_table-to.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/2382-drm-amd-powerplay-move-function-get_metrics_table-to.patch new file mode 100644 index 00000000..32985fd3 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/2382-drm-amd-powerplay-move-function-get_metrics_table-to.patch @@ -0,0 +1,220 @@ +From 71410b6f9624d0810c2794e08c11df9d67249dcf Mon Sep 17 00:00:00 2001 +From: Kevin Wang <kevin1.wang@amd.com> +Date: Fri, 17 May 2019 14:02:15 +0800 +Subject: [PATCH 2382/2940] drm/amd/powerplay: move function get_metrics_table + to vega20_ppt + +the SmuMetrics_t table is asic related data structure. +so move vega20_ppt file to implement. + +Signed-off-by: Kevin Wang <kevin1.wang@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 6 +-- + drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 2 +- + drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 36 +++--------------- + drivers/gpu/drm/amd/powerplay/vega20_ppt.c | 37 ++++++++++++++++--- + 4 files changed, 42 insertions(+), 39 deletions(-) + +diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h +index 4706eaf39cf7..0fd3d89386be 100644 +--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h ++++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h +@@ -406,6 +406,8 @@ struct smu_table_context + void *power_play_table; + uint32_t power_play_table_size; + void *hardcode_pptable; ++ unsigned long metrics_time; ++ void *metrics_table; + + void *max_sustainable_clocks; + struct smu_bios_boot_up_values boot_values; +@@ -524,8 +526,6 @@ struct smu_context + + uint32_t smc_if_version; + +- unsigned long metrics_time; +- void *metrics_table; + }; + + struct pptable_funcs { +@@ -589,7 +589,7 @@ struct pptable_funcs { + int (*set_ppfeature_status)(struct smu_context *smu, uint64_t ppfeatures); + int (*get_ppfeature_status)(struct smu_context *smu, char *buf); + bool (*is_dpm_running)(struct smu_context *smu); +- void (*tables_init)(struct smu_context *smu, struct smu_table *tables); ++ int (*tables_init)(struct smu_context *smu, struct smu_table *tables); + int (*set_thermal_fan_table)(struct smu_context *smu); + int (*get_fan_speed_percent)(struct smu_context *smu, uint32_t *speed); + int (*set_watermarks_table)(struct smu_context *smu, void *watermarks, +diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c +index d20d498af675..130719663566 100644 +--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c ++++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c +@@ -479,7 +479,7 @@ static int navi10_store_powerplay_table(struct smu_context *smu) + return 0; + } + +-static void navi10_tables_init(struct smu_context *smu, struct smu_table *tables) ++static int navi10_tables_init(struct smu_context *smu, struct smu_table *tables) + { + SMU_TABLE_INIT(tables, SMU_TABLE_PPTABLE, sizeof(PPTable_t), + PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM); +diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +index 1896ce1ece6b..538f52ab4b72 100644 +--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c ++++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +@@ -407,7 +407,9 @@ static int smu_v11_0_init_smc_tables(struct smu_context *smu) + + smu_table->tables = tables; + +- smu_tables_init(smu, tables); ++ ret = smu_tables_init(smu, tables); ++ if (ret) ++ return ret; + + ret = smu_v11_0_init_dpm_context(smu); + if (ret) +@@ -425,8 +427,11 @@ static int smu_v11_0_fini_smc_tables(struct smu_context *smu) + return -EINVAL; + + kfree(smu_table->tables); ++ kfree(smu_table->metrics_table); + smu_table->tables = NULL; + smu_table->table_count = 0; ++ smu_table->metrics_table = NULL; ++ smu_table->metrics_time = 0; + + ret = smu_v11_0_fini_dpm_context(smu); + if (ret) +@@ -449,13 +454,6 @@ static int smu_v11_0_init_power(struct smu_context *smu) + return -ENOMEM; + smu_power->power_context_size = sizeof(struct smu_11_0_dpm_context); + +- smu->metrics_time = 0; +- smu->metrics_table = kzalloc(sizeof(SmuMetrics_t), GFP_KERNEL); +- if (!smu->metrics_table) { +- kfree(smu_power->power_context); +- return -ENOMEM; +- } +- + return 0; + } + +@@ -468,9 +466,7 @@ static int smu_v11_0_fini_power(struct smu_context *smu) + if (!smu_power->power_context || smu_power->power_context_size == 0) + return -EINVAL; + +- kfree(smu->metrics_table); + kfree(smu_power->power_context); +- smu->metrics_table = NULL; + smu_power->power_context = NULL; + smu_power->power_context_size = 0; + +@@ -1227,26 +1223,6 @@ static int smu_v11_0_start_thermal_control(struct smu_context *smu) + return ret; + } + +-static int smu_v11_0_get_metrics_table(struct smu_context *smu, +- SmuMetrics_t *metrics_table) +-{ +- int ret = 0; +- +- if (!smu->metrics_time || time_after(jiffies, smu->metrics_time + HZ / 1000)) { +- ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, +- (void *)metrics_table, false); +- if (ret) { +- pr_info("Failed to export SMU metrics table!\n"); +- return ret; +- } +- memcpy(smu->metrics_table, metrics_table, sizeof(SmuMetrics_t)); +- smu->metrics_time = jiffies; +- } else +- memcpy(metrics_table, smu->metrics_table, sizeof(SmuMetrics_t)); +- +- return ret; +-} +- + static int smu_v11_0_thermal_get_temperature(struct smu_context *smu, + enum amd_pp_sensors sensor, + uint32_t *value) +diff --git a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c +index 81fb5b5d76be..dd354a993bf1 100644 +--- a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c ++++ b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c +@@ -294,8 +294,10 @@ static int vega20_get_workload_type(struct smu_context *smu, enum PP_SMC_POWER_P + return val; + } + +-static void vega20_tables_init(struct smu_context *smu, struct smu_table *tables) ++static int vega20_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), +@@ -309,6 +311,13 @@ static void vega20_tables_init(struct smu_context *smu, struct smu_table *tables + SMU_TABLE_INIT(tables, SMU_TABLE_ACTIVITY_MONITOR_COEFF, + 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 vega20_allocate_dpm_context(struct smu_context *smu) +@@ -1654,6 +1663,26 @@ static int vega20_set_default_od8_setttings(struct smu_context *smu) + return 0; + } + ++static int vega20_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, ++ (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 vega20_get_od_percentage(struct smu_context *smu, + enum pp_clock_type type) + { +@@ -2933,8 +2962,7 @@ static int vega20_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, +- false); ++ ret = vega20_get_metrics_table(smu, &metrics); + if (ret) + return ret; + +@@ -2953,8 +2981,7 @@ static int vega20_get_current_activity_percent(struct smu_context *smu, + if (!value) + return -EINVAL; + +- ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, +- (void *)&metrics, false); ++ ret = vega20_get_metrics_table(smu, &metrics); + if (ret) + return ret; + +-- +2.17.1 + |