diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2287-drm-amd-powerplay-introduce-smu-clk-type-to-handle-p.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2287-drm-amd-powerplay-introduce-smu-clk-type-to-handle-p.patch | 433 |
1 files changed, 433 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2287-drm-amd-powerplay-introduce-smu-clk-type-to-handle-p.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2287-drm-amd-powerplay-introduce-smu-clk-type-to-handle-p.patch new file mode 100644 index 00000000..6e4c9fda --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2287-drm-amd-powerplay-introduce-smu-clk-type-to-handle-p.patch @@ -0,0 +1,433 @@ +From 18e4ae2d7526b60fb19ac25de66977a50d762c82 Mon Sep 17 00:00:00 2001 +From: Huang Rui <ray.huang@amd.com> +Date: Sun, 24 Mar 2019 19:22:07 +0800 +Subject: [PATCH 2287/2940] drm/amd/powerplay: introduce smu clk type to handle + ppclk for each asic + +This patch introduces new smu clk type, it's to handle the different ppclk +defines for each asic with the same smu ip. + +Signed-off-by: Huang Rui <ray.huang@amd.com> +Reviewed-by: Kevin Wang <kevin1.wang@amd.com> +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 21 +++++- + drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h | 3 + + drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 26 ++++++++ + drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 66 ++++++++++--------- + drivers/gpu/drm/amd/powerplay/vega20_ppt.c | 32 ++++++++- + 5 files changed, 113 insertions(+), 35 deletions(-) + +diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h +index 2336597c09e0..65990dd700f0 100644 +--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h ++++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h +@@ -227,6 +227,22 @@ enum smu_message_type + SMU_MSG_MAX_COUNT, + }; + ++enum smu_clk_type ++{ ++ SMU_GFXCLK, ++ SMU_VCLK, ++ SMU_DCLK, ++ SMU_ECLK, ++ SMU_SOCCLK, ++ SMU_UCLK, ++ SMU_DCEFCLK, ++ SMU_DISPCLK, ++ SMU_PIXCLK, ++ SMU_PHYCLK, ++ SMU_FCLK, ++ SMU_CLK_COUNT, ++}; ++ + enum smu_memory_pool_size + { + SMU_MEMORY_POOL_SIZE_ZERO = 0, +@@ -420,6 +436,7 @@ struct pptable_funcs { + int (*check_powerplay_table)(struct smu_context *smu); + int (*append_powerplay_table)(struct smu_context *smu); + int (*get_smu_msg_index)(struct smu_context *smu, uint32_t index); ++ int (*get_smu_clk_index)(struct smu_context *smu, uint32_t index); + int (*run_afll_btc)(struct smu_context *smu); + int (*get_allowed_feature_mask)(struct smu_context *smu, uint32_t *feature_mask, uint32_t num); + enum amd_pm_state_type (*get_current_power_state)(struct smu_context *smu); +@@ -510,7 +527,7 @@ struct smu_funcs + int (*notify_display_change)(struct smu_context *smu); + int (*get_power_limit)(struct smu_context *smu, uint32_t *limit, bool def); + int (*set_power_limit)(struct smu_context *smu, uint32_t n); +- int (*get_current_clk_freq)(struct smu_context *smu, uint32_t clk_id, uint32_t *value); ++ int (*get_current_clk_freq)(struct smu_context *smu, enum smu_clk_type clk_id, uint32_t *value); + int (*init_max_sustainable_clocks)(struct smu_context *smu); + int (*start_thermal_control)(struct smu_context *smu); + int (*read_sensor)(struct smu_context *smu, enum amd_pp_sensors sensor, +@@ -704,6 +721,8 @@ struct smu_funcs + + #define smu_msg_get_index(smu, msg) \ + ((smu)->ppt_funcs? ((smu)->ppt_funcs->get_smu_msg_index? (smu)->ppt_funcs->get_smu_msg_index((smu), (msg)) : -EINVAL) : -EINVAL) ++#define smu_clk_get_index(smu, msg) \ ++ ((smu)->ppt_funcs? ((smu)->ppt_funcs->get_smu_clk_index? (smu)->ppt_funcs->get_smu_clk_index((smu), (msg)) : -EINVAL) : -EINVAL) + #define smu_run_afll_btc(smu) \ + ((smu)->ppt_funcs? ((smu)->ppt_funcs->run_afll_btc? (smu)->ppt_funcs->run_afll_btc((smu)) : 0) : 0) + #define smu_get_allowed_feature_mask(smu, feature_mask, num) \ +diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h +index cd5e66b82ce1..cae6619d2df5 100644 +--- a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h ++++ b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h +@@ -40,6 +40,9 @@ + #define TEMP_RANGE_MIN (0) + #define TEMP_RANGE_MAX (80 * 1000) + ++#define CLK_MAP(clk, index) \ ++ [SMU_##clk] = index ++ + struct smu_11_0_max_sustainable_clocks { + uint32_t display_clock; + uint32_t phy_clock; +diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c +index 961f44e55f35..f45df244013f 100644 +--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c ++++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c +@@ -99,6 +99,18 @@ static int navi10_message_map[SMU_MSG_MAX_COUNT] = { + MSG_MAP(PrepareMp1ForShutdown, PPSMC_MSG_PrepareMp1ForShutdown), + }; + ++static int navi10_clk_map[SMU_CLK_COUNT] = { ++ CLK_MAP(GFXCLK, PPCLK_GFXCLK), ++ CLK_MAP(SOCCLK, PPCLK_SOCCLK), ++ CLK_MAP(UCLK, PPCLK_UCLK), ++ CLK_MAP(DCLK, PPCLK_DCLK), ++ CLK_MAP(VCLK, PPCLK_VCLK), ++ CLK_MAP(DCEFCLK, PPCLK_DCEFCLK), ++ CLK_MAP(DISPCLK, PPCLK_DISPCLK), ++ CLK_MAP(PIXCLK, PPCLK_PIXCLK), ++ CLK_MAP(PHYCLK, PPCLK_PHYCLK), ++}; ++ + static int navi10_get_smu_msg_index(struct smu_context *smc, uint32_t index) + { + int val; +@@ -112,6 +124,19 @@ static int navi10_get_smu_msg_index(struct smu_context *smc, uint32_t index) + return val; + } + ++static int navi10_get_smu_clk_index(struct smu_context *smc, uint32_t index) ++{ ++ int val; ++ if (index >= SMU_CLK_COUNT) ++ return -EINVAL; ++ ++ val = navi10_clk_map[index]; ++ if (val >= PPCLK_COUNT) ++ return -EINVAL; ++ ++ return val; ++} ++ + #define FEATURE_MASK(feature) (1UL << feature) + static int + navi10_get_allowed_feature_mask(struct smu_context *smu, +@@ -327,6 +352,7 @@ static const struct pptable_funcs navi10_ppt_funcs = { + .check_powerplay_table = navi10_check_powerplay_table, + .append_powerplay_table = navi10_append_powerplay_table, + .get_smu_msg_index = navi10_get_smu_msg_index, ++ .get_smu_clk_index = navi10_get_smu_clk_index, + .get_allowed_feature_mask = navi10_get_allowed_feature_mask, + .set_default_dpm_table = navi10_set_default_dpm_table, + }; +diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +index d0019b8a68f3..367c9795985c 100644 +--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c ++++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +@@ -920,14 +920,14 @@ static int smu_v11_0_notify_display_change(struct smu_context *smu) + + static int + smu_v11_0_get_max_sustainable_clock(struct smu_context *smu, uint32_t *clock, +- PPCLK_e clock_select) ++ enum smu_clk_type clock_select) + { + int ret = 0; + + if (!smu->pm_enabled) + return ret; + ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetDcModeMaxDpmFreq, +- clock_select << 16); ++ smu_clk_get_index(smu, clock_select) << 16); + if (ret) { + pr_err("[GetMaxSustainableClock] Failed to get max DC clock from SMC!"); + return ret; +@@ -942,7 +942,7 @@ smu_v11_0_get_max_sustainable_clock(struct smu_context *smu, uint32_t *clock, + + /* if DC limit is zero, return AC limit */ + ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetMaxDpmFreq, +- clock_select << 16); ++ smu_clk_get_index(smu, clock_select) << 16); + if (ret) { + pr_err("[GetMaxSustainableClock] failed to get max AC clock from SMC!"); + return ret; +@@ -972,7 +972,7 @@ static int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu) + if (smu_feature_is_enabled(smu, FEATURE_DPM_UCLK_BIT)) { + ret = smu_v11_0_get_max_sustainable_clock(smu, + &(max_sustainable_clocks->uclock), +- PPCLK_UCLK); ++ SMU_UCLK); + if (ret) { + pr_err("[%s] failed to get max UCLK from SMC!", + __func__); +@@ -983,7 +983,7 @@ static int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu) + if (smu_feature_is_enabled(smu, FEATURE_DPM_SOCCLK_BIT)) { + ret = smu_v11_0_get_max_sustainable_clock(smu, + &(max_sustainable_clocks->soc_clock), +- PPCLK_SOCCLK); ++ SMU_SOCCLK); + if (ret) { + pr_err("[%s] failed to get max SOCCLK from SMC!", + __func__); +@@ -994,7 +994,7 @@ static int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu) + if (smu_feature_is_enabled(smu, FEATURE_DPM_DCEFCLK_BIT)) { + ret = smu_v11_0_get_max_sustainable_clock(smu, + &(max_sustainable_clocks->dcef_clock), +- PPCLK_DCEFCLK); ++ SMU_DCEFCLK); + if (ret) { + pr_err("[%s] failed to get max DCEFCLK from SMC!", + __func__); +@@ -1003,7 +1003,7 @@ static int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu) + + ret = smu_v11_0_get_max_sustainable_clock(smu, + &(max_sustainable_clocks->display_clock), +- PPCLK_DISPCLK); ++ SMU_DISPCLK); + if (ret) { + pr_err("[%s] failed to get max DISPCLK from SMC!", + __func__); +@@ -1011,7 +1011,7 @@ static int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu) + } + ret = smu_v11_0_get_max_sustainable_clock(smu, + &(max_sustainable_clocks->phy_clock), +- PPCLK_PHYCLK); ++ SMU_PHYCLK); + if (ret) { + pr_err("[%s] failed to get max PHYCLK from SMC!", + __func__); +@@ -1019,7 +1019,7 @@ static int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu) + } + ret = smu_v11_0_get_max_sustainable_clock(smu, + &(max_sustainable_clocks->pixel_clock), +- PPCLK_PIXCLK); ++ SMU_PIXCLK); + if (ret) { + pr_err("[%s] failed to get max PIXCLK from SMC!", + __func__); +@@ -1086,16 +1086,18 @@ static int smu_v11_0_set_power_limit(struct smu_context *smu, uint32_t n) + return ret; + } + +-static int smu_v11_0_get_current_clk_freq(struct smu_context *smu, uint32_t clk_id, uint32_t *value) ++static int smu_v11_0_get_current_clk_freq(struct smu_context *smu, ++ enum smu_clk_type clk_id, ++ uint32_t *value) + { + int ret = 0; + uint32_t freq; + +- if (clk_id >= PPCLK_COUNT || !value) ++ if (clk_id >= SMU_CLK_COUNT || !value) + return -EINVAL; + +- ret = smu_send_smc_msg_with_param(smu, +- SMU_MSG_GetDpmClockFreq, (clk_id << 16)); ++ ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetDpmClockFreq, ++ (smu_clk_get_index(smu, clk_id) << 16)); + if (ret) + return ret; + +@@ -1381,11 +1383,11 @@ static int smu_v11_0_read_sensor(struct smu_context *smu, + *size = 4; + break; + case AMDGPU_PP_SENSOR_GFX_MCLK: +- ret = smu_get_current_clk_freq(smu, PPCLK_UCLK, (uint32_t *)data); ++ ret = smu_get_current_clk_freq(smu, SMU_UCLK, (uint32_t *)data); + *size = 4; + break; + case AMDGPU_PP_SENSOR_GFX_SCLK: +- ret = smu_get_current_clk_freq(smu, PPCLK_GFXCLK, (uint32_t *)data); ++ ret = smu_get_current_clk_freq(smu, SMU_GFXCLK, (uint32_t *)data); + *size = 4; + break; + case AMDGPU_PP_SENSOR_HOTSPOT_TEMP: +@@ -1432,7 +1434,7 @@ smu_v11_0_display_clock_voltage_request(struct smu_context *smu, + { + enum amd_pp_clock_type clk_type = clock_req->clock_type; + int ret = 0; +- PPCLK_e clk_select = 0; ++ enum smu_clk_type clk_select = 0; + uint32_t clk_freq = clock_req->clock_freq_in_khz / 1000; + + if (!smu->pm_enabled) +@@ -1440,16 +1442,16 @@ smu_v11_0_display_clock_voltage_request(struct smu_context *smu, + if (smu_feature_is_enabled(smu, FEATURE_DPM_DCEFCLK_BIT)) { + switch (clk_type) { + case amd_pp_dcef_clock: +- clk_select = PPCLK_DCEFCLK; ++ clk_select = SMU_DCEFCLK; + break; + case amd_pp_disp_clock: +- clk_select = PPCLK_DISPCLK; ++ clk_select = SMU_DISPCLK; + break; + case amd_pp_pixel_clock: +- clk_select = PPCLK_PIXCLK; ++ clk_select = SMU_PIXCLK; + break; + case amd_pp_phy_clock: +- clk_select = PPCLK_PHYCLK; ++ clk_select = SMU_PHYCLK; + break; + default: + pr_info("[%s] Invalid Clock Type!", __func__); +@@ -1461,7 +1463,7 @@ smu_v11_0_display_clock_voltage_request(struct smu_context *smu, + goto failed; + + ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetHardMinByFreq, +- (clk_select << 16) | clk_freq); ++ (smu_clk_get_index(smu, clk_select) << 16) | clk_freq); + } + + failed: +@@ -1575,14 +1577,14 @@ static int smu_v11_0_gfx_off_control(struct smu_context *smu, bool enable) + + static int smu_v11_0_get_clock_ranges(struct smu_context *smu, + uint32_t *clock, +- PPCLK_e clock_select, ++ enum smu_clk_type clock_select, + bool max) + { + int ret; + *clock = 0; + if (max) { + ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetMaxDpmFreq, +- (clock_select << 16)); ++ smu_clk_get_index(smu, clock_select) << 16); + if (ret) { + pr_err("[GetClockRanges] Failed to get max clock from SMC!\n"); + return ret; +@@ -1590,7 +1592,7 @@ static int smu_v11_0_get_clock_ranges(struct smu_context *smu, + smu_read_smc_arg(smu, clock); + } else { + ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetMinDpmFreq, +- (clock_select << 16)); ++ smu_clk_get_index(smu, clock_select) << 16); + if (ret) { + pr_err("[GetClockRanges] Failed to get min clock from SMC!\n"); + return ret; +@@ -1612,15 +1614,15 @@ static uint32_t smu_v11_0_dpm_get_sclk(struct smu_context *smu, bool low) + } + + if (low) { +- ret = smu_v11_0_get_clock_ranges(smu, &gfx_clk, PPCLK_GFXCLK, false); ++ ret = smu_v11_0_get_clock_ranges(smu, &gfx_clk, SMU_GFXCLK, false); + if (ret) { +- pr_err("[GetSclks]: fail to get min PPCLK_GFXCLK\n"); ++ pr_err("[GetSclks]: fail to get min SMU_GFXCLK\n"); + return ret; + } + } else { +- ret = smu_v11_0_get_clock_ranges(smu, &gfx_clk, PPCLK_GFXCLK, true); ++ ret = smu_v11_0_get_clock_ranges(smu, &gfx_clk, SMU_GFXCLK, true); + if (ret) { +- pr_err("[GetSclks]: fail to get max PPCLK_GFXCLK\n"); ++ pr_err("[GetSclks]: fail to get max SMU_GFXCLK\n"); + return ret; + } + } +@@ -1639,15 +1641,15 @@ static uint32_t smu_v11_0_dpm_get_mclk(struct smu_context *smu, bool low) + } + + if (low) { +- ret = smu_v11_0_get_clock_ranges(smu, &mem_clk, PPCLK_UCLK, false); ++ ret = smu_v11_0_get_clock_ranges(smu, &mem_clk, SMU_UCLK, false); + if (ret) { +- pr_err("[GetMclks]: fail to get min PPCLK_UCLK\n"); ++ pr_err("[GetMclks]: fail to get min SMU_UCLK\n"); + return ret; + } + } else { +- ret = smu_v11_0_get_clock_ranges(smu, &mem_clk, PPCLK_GFXCLK, true); ++ ret = smu_v11_0_get_clock_ranges(smu, &mem_clk, SMU_GFXCLK, true); + if (ret) { +- pr_err("[GetMclks]: fail to get max PPCLK_UCLK\n"); ++ pr_err("[GetMclks]: fail to get max SMU_UCLK\n"); + return ret; + } + } +diff --git a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c +index 7e6148ab134b..b3fc9c034aa0 100644 +--- a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c ++++ b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c +@@ -139,6 +139,33 @@ static int vega20_message_map[SMU_MSG_MAX_COUNT] = { + MSG_MAP(GetAVFSVoltageByDpm), + }; + ++static int vega20_clk_map[SMU_CLK_COUNT] = { ++ CLK_MAP(GFXCLK, PPCLK_GFXCLK), ++ CLK_MAP(VCLK, PPCLK_VCLK), ++ CLK_MAP(DCLK, PPCLK_DCLK), ++ CLK_MAP(ECLK, PPCLK_ECLK), ++ CLK_MAP(SOCCLK, PPCLK_SOCCLK), ++ CLK_MAP(UCLK, PPCLK_UCLK), ++ CLK_MAP(DCEFCLK, PPCLK_DCEFCLK), ++ CLK_MAP(DISPCLK, PPCLK_DISPCLK), ++ CLK_MAP(PIXCLK, PPCLK_PIXCLK), ++ CLK_MAP(PHYCLK, PPCLK_PHYCLK), ++ CLK_MAP(FCLK, PPCLK_FCLK), ++}; ++ ++static int vega20_get_smu_clk_index(struct smu_context *smc, uint32_t index) ++{ ++ int val; ++ if (index >= SMU_CLK_COUNT) ++ return -EINVAL; ++ ++ val = vega20_clk_map[index]; ++ if (val >= PPCLK_COUNT) ++ return -EINVAL; ++ ++ return val; ++} ++ + static int vega20_get_smu_msg_index(struct smu_context *smc, uint32_t index) + { + int val; +@@ -776,7 +803,7 @@ static int vega20_print_clk_levels(struct smu_context *smu, + + switch (type) { + case PP_SCLK: +- ret = smu_get_current_clk_freq(smu, PPCLK_GFXCLK, &now); ++ ret = smu_get_current_clk_freq(smu, SMU_GFXCLK, &now); + if (ret) { + pr_err("Attempt to get current gfx clk Failed!"); + return ret; +@@ -797,7 +824,7 @@ static int vega20_print_clk_levels(struct smu_context *smu, + break; + + case PP_MCLK: +- ret = smu_get_current_clk_freq(smu, PPCLK_UCLK, &now); ++ ret = smu_get_current_clk_freq(smu, SMU_UCLK, &now); + if (ret) { + pr_err("Attempt to get current mclk Failed!"); + return ret; +@@ -2847,6 +2874,7 @@ static const struct pptable_funcs vega20_ppt_funcs = { + .check_powerplay_table = vega20_check_powerplay_table, + .append_powerplay_table = vega20_append_powerplay_table, + .get_smu_msg_index = vega20_get_smu_msg_index, ++ .get_smu_clk_index = vega20_get_smu_clk_index, + .run_afll_btc = vega20_run_btc_afll, + .get_allowed_feature_mask = vega20_get_allowed_feature_mask, + .get_current_power_state = vega20_get_current_power_state, +-- +2.17.1 + |