Commit ffcb08df authored by Huang Rui's avatar Huang Rui Committed by Alex Deucher

drm/amd/powerplay: introduce smu feature type to handle feature mask for each asic

This patch introduces new smu feature type, it's to handle the different feature
mask defines for each asic with the same smu ip.
Signed-off-by: default avatarHuang Rui <ray.huang@amd.com>
Reviewed-by: default avatarKevin Wang <kevin1.wang@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Reviewed-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 0de94acf
......@@ -254,11 +254,14 @@ int smu_feature_init_dpm(struct smu_context *smu)
return ret;
}
int smu_feature_is_enabled(struct smu_context *smu, int feature_id)
int smu_feature_is_enabled(struct smu_context *smu, enum smu_feature_mask mask)
{
struct smu_feature *feature = &smu->smu_feature;
uint32_t feature_id;
int ret = 0;
feature_id = smu_feature_get_index(smu, mask);
WARN_ON(feature_id > feature->feature_num);
mutex_lock(&feature->mutex);
......@@ -268,11 +271,15 @@ int smu_feature_is_enabled(struct smu_context *smu, int feature_id)
return ret;
}
int smu_feature_set_enabled(struct smu_context *smu, int feature_id, bool enable)
int smu_feature_set_enabled(struct smu_context *smu, enum smu_feature_mask mask,
bool enable)
{
struct smu_feature *feature = &smu->smu_feature;
uint32_t feature_id;
int ret = 0;
feature_id = smu_feature_get_index(smu, mask);
WARN_ON(feature_id > feature->feature_num);
mutex_lock(&feature->mutex);
......@@ -291,11 +298,14 @@ int smu_feature_set_enabled(struct smu_context *smu, int feature_id, bool enable
return ret;
}
int smu_feature_is_supported(struct smu_context *smu, int feature_id)
int smu_feature_is_supported(struct smu_context *smu, enum smu_feature_mask mask)
{
struct smu_feature *feature = &smu->smu_feature;
uint32_t feature_id;
int ret = 0;
feature_id = smu_feature_get_index(smu, mask);
WARN_ON(feature_id > feature->feature_num);
mutex_lock(&feature->mutex);
......@@ -305,12 +315,16 @@ int smu_feature_is_supported(struct smu_context *smu, int feature_id)
return ret;
}
int smu_feature_set_supported(struct smu_context *smu, int feature_id,
int smu_feature_set_supported(struct smu_context *smu,
enum smu_feature_mask mask,
bool enable)
{
struct smu_feature *feature = &smu->smu_feature;
uint32_t feature_id;
int ret = 0;
feature_id = smu_feature_get_index(smu, mask);
WARN_ON(feature_id > feature->feature_num);
mutex_lock(&feature->mutex);
......
......@@ -243,6 +243,63 @@ enum smu_clk_type
SMU_CLK_COUNT,
};
enum smu_feature_mask
{
SMU_FEATURE_DPM_PREFETCHER_BIT,
SMU_FEATURE_DPM_GFXCLK_BIT,
SMU_FEATURE_DPM_UCLK_BIT,
SMU_FEATURE_DPM_SOCCLK_BIT,
SMU_FEATURE_DPM_UVD_BIT,
SMU_FEATURE_DPM_VCE_BIT,
SMU_FEATURE_ULV_BIT,
SMU_FEATURE_DPM_MP0CLK_BIT,
SMU_FEATURE_DPM_LINK_BIT,
SMU_FEATURE_DPM_DCEFCLK_BIT,
SMU_FEATURE_DS_GFXCLK_BIT,
SMU_FEATURE_DS_SOCCLK_BIT,
SMU_FEATURE_DS_LCLK_BIT,
SMU_FEATURE_PPT_BIT,
SMU_FEATURE_TDC_BIT,
SMU_FEATURE_THERMAL_BIT,
SMU_FEATURE_GFX_PER_CU_CG_BIT,
SMU_FEATURE_RM_BIT,
SMU_FEATURE_DS_DCEFCLK_BIT,
SMU_FEATURE_ACDC_BIT,
SMU_FEATURE_VR0HOT_BIT,
SMU_FEATURE_VR1HOT_BIT,
SMU_FEATURE_FW_CTF_BIT,
SMU_FEATURE_LED_DISPLAY_BIT,
SMU_FEATURE_FAN_CONTROL_BIT,
SMU_FEATURE_GFX_EDC_BIT,
SMU_FEATURE_GFXOFF_BIT,
SMU_FEATURE_CG_BIT,
SMU_FEATURE_DPM_FCLK_BIT,
SMU_FEATURE_DS_FCLK_BIT,
SMU_FEATURE_DS_MP1CLK_BIT,
SMU_FEATURE_DS_MP0CLK_BIT,
SMU_FEATURE_XGMI_BIT,
SMU_FEATURE_DPM_GFX_PACE_BIT,
SMU_FEATURE_MEM_VDDCI_SCALING_BIT,
SMU_FEATURE_MEM_MVDD_SCALING_BIT,
SMU_FEATURE_DS_UCLK_BIT,
SMU_FEATURE_GFX_ULV_BIT,
SMU_FEATURE_FW_DSTATE_BIT,
SMU_FEATURE_BACO_BIT,
SMU_FEATURE_VCN_PG_BIT,
SMU_FEATURE_JPEG_PG_BIT,
SMU_FEATURE_USB_PG_BIT,
SMU_FEATURE_RSMU_SMN_CG_BIT,
SMU_FEATURE_APCC_PLUS_BIT,
SMU_FEATURE_GTHR_BIT,
SMU_FEATURE_GFX_DCS_BIT,
SMU_FEATURE_GFX_SS_BIT,
SMU_FEATURE_OUT_OF_BAND_MONITOR_BIT,
SMU_FEATURE_TEMP_DEPENDENT_VMIN_BIT,
SMU_FEATURE_MMHUB_PG_BIT,
SMU_FEATURE_ATHUB_PG_BIT,
SMU_FEATURE_COUNT,
};
enum smu_memory_pool_size
{
SMU_MEMORY_POOL_SIZE_ZERO = 0,
......@@ -437,6 +494,7 @@ struct pptable_funcs {
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 (*get_smu_feature_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);
......@@ -723,6 +781,8 @@ struct smu_funcs
((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_feature_get_index(smu, msg) \
((smu)->ppt_funcs? ((smu)->ppt_funcs->get_smu_feature_index? (smu)->ppt_funcs->get_smu_feature_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) \
......@@ -779,10 +839,14 @@ extern const struct amd_ip_funcs smu_ip_funcs;
extern const struct amdgpu_ip_block_version smu_v11_0_ip_block;
extern int smu_feature_init_dpm(struct smu_context *smu);
extern int smu_feature_is_enabled(struct smu_context *smu, int feature_id);
extern int smu_feature_set_enabled(struct smu_context *smu, int feature_id, bool enable);
extern int smu_feature_is_supported(struct smu_context *smu, int feature_id);
extern int smu_feature_set_supported(struct smu_context *smu, int feature_id, bool enable);
extern int smu_feature_is_enabled(struct smu_context *smu,
enum smu_feature_mask mask);
extern int smu_feature_set_enabled(struct smu_context *smu,
enum smu_feature_mask mask, bool enable);
extern int smu_feature_is_supported(struct smu_context *smu,
enum smu_feature_mask mask);
extern int smu_feature_set_supported(struct smu_context *smu,
enum smu_feature_mask mask, bool enable);
int smu_update_table_with_arg(struct smu_context *smu, uint16_t table_id, uint16_t exarg,
void *table_data, bool drv2smu);
......
......@@ -90,8 +90,8 @@
#define FEATURE_OUT_OF_BAND_MONITOR_BIT 38
#define FEATURE_TEMP_DEPENDENT_VMIN_BIT 39
#define FEATURE_MMHUB_PG 40
#define FEATURE_ATHUB_PG 41
#define FEATURE_MMHUB_PG_BIT 40
#define FEATURE_ATHUB_PG_BIT 41
#define FEATURE_SPARE_42_BIT 42
#define FEATURE_SPARE_43_BIT 43
#define FEATURE_SPARE_44_BIT 44
......
......@@ -43,6 +43,9 @@
#define CLK_MAP(clk, index) \
[SMU_##clk] = index
#define FEA_MAP(fea) \
[SMU_FEATURE_##fea##_BIT] = FEATURE_##fea##_BIT
struct smu_11_0_max_sustainable_clocks {
uint32_t display_clock;
uint32_t phy_clock;
......
......@@ -111,6 +111,51 @@ static int navi10_clk_map[SMU_CLK_COUNT] = {
CLK_MAP(PHYCLK, PPCLK_PHYCLK),
};
static int navi10_feature_mask_map[SMU_FEATURE_COUNT] = {
FEA_MAP(DPM_PREFETCHER),
FEA_MAP(DPM_GFXCLK),
FEA_MAP(DPM_GFX_PACE),
FEA_MAP(DPM_UCLK),
FEA_MAP(DPM_SOCCLK),
FEA_MAP(DPM_MP0CLK),
FEA_MAP(DPM_LINK),
FEA_MAP(DPM_DCEFCLK),
FEA_MAP(MEM_VDDCI_SCALING),
FEA_MAP(MEM_MVDD_SCALING),
FEA_MAP(DS_GFXCLK),
FEA_MAP(DS_SOCCLK),
FEA_MAP(DS_LCLK),
FEA_MAP(DS_DCEFCLK),
FEA_MAP(DS_UCLK),
FEA_MAP(GFX_ULV),
FEA_MAP(FW_DSTATE),
FEA_MAP(GFXOFF),
FEA_MAP(BACO),
FEA_MAP(VCN_PG),
FEA_MAP(JPEG_PG),
FEA_MAP(USB_PG),
FEA_MAP(RSMU_SMN_CG),
FEA_MAP(PPT),
FEA_MAP(TDC),
FEA_MAP(GFX_EDC),
FEA_MAP(APCC_PLUS),
FEA_MAP(GTHR),
FEA_MAP(ACDC),
FEA_MAP(VR0HOT),
FEA_MAP(VR1HOT),
FEA_MAP(FW_CTF),
FEA_MAP(FAN_CONTROL),
FEA_MAP(THERMAL),
FEA_MAP(GFX_DCS),
FEA_MAP(RM),
FEA_MAP(LED_DISPLAY),
FEA_MAP(GFX_SS),
FEA_MAP(OUT_OF_BAND_MONITOR),
FEA_MAP(TEMP_DEPENDENT_VMIN),
FEA_MAP(MMHUB_PG),
FEA_MAP(ATHUB_PG),
};
static int navi10_get_smu_msg_index(struct smu_context *smc, uint32_t index)
{
int val;
......@@ -137,6 +182,19 @@ static int navi10_get_smu_clk_index(struct smu_context *smc, uint32_t index)
return val;
}
static int navi10_get_smu_feature_index(struct smu_context *smc, uint32_t index)
{
int val;
if (index >= SMU_FEATURE_COUNT)
return -EINVAL;
val = navi10_feature_mask_map[index];
if (val > 64)
return -EINVAL;
return val;
}
#define FEATURE_MASK(feature) (1UL << feature)
static int
navi10_get_allowed_feature_mask(struct smu_context *smu,
......@@ -163,8 +221,8 @@ navi10_get_allowed_feature_mask(struct smu_context *smu,
| FEATURE_MASK(FEATURE_FAN_CONTROL_BIT)
| FEATURE_MASK(FEATURE_THERMAL_BIT)
| FEATURE_MASK(FEATURE_LED_DISPLAY_BIT)
| FEATURE_MASK(FEATURE_MMHUB_PG)
| FEATURE_MASK(FEATURE_ATHUB_PG)
| FEATURE_MASK(FEATURE_MMHUB_PG_BIT)
| FEATURE_MASK(FEATURE_ATHUB_PG_BIT)
| FEATURE_MASK(FEATURE_DPM_DCEFCLK_BIT);
if (adev->pm.pp_feature & PP_GFXOFF_MASK)
......@@ -353,6 +411,7 @@ static const struct pptable_funcs navi10_ppt_funcs = {
.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_smu_feature_index = navi10_get_smu_feature_index,
.get_allowed_feature_mask = navi10_get_allowed_feature_mask,
.set_default_dpm_table = navi10_set_default_dpm_table,
};
......
......@@ -912,7 +912,7 @@ static int smu_v11_0_notify_display_change(struct smu_context *smu)
if (!smu->pm_enabled)
return ret;
if (smu_feature_is_enabled(smu, FEATURE_DPM_UCLK_BIT))
if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_UCLK_BIT))
ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetUclkFastSwitch, 1);
return ret;
......@@ -969,7 +969,7 @@ static int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu)
max_sustainable_clocks->phy_clock = 0xFFFFFFFF;
max_sustainable_clocks->pixel_clock = 0xFFFFFFFF;
if (smu_feature_is_enabled(smu, FEATURE_DPM_UCLK_BIT)) {
if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_UCLK_BIT)) {
ret = smu_v11_0_get_max_sustainable_clock(smu,
&(max_sustainable_clocks->uclock),
SMU_UCLK);
......@@ -980,7 +980,7 @@ static int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu)
}
}
if (smu_feature_is_enabled(smu, FEATURE_DPM_SOCCLK_BIT)) {
if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_SOCCLK_BIT)) {
ret = smu_v11_0_get_max_sustainable_clock(smu,
&(max_sustainable_clocks->soc_clock),
SMU_SOCCLK);
......@@ -991,7 +991,7 @@ static int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu)
}
}
if (smu_feature_is_enabled(smu, FEATURE_DPM_DCEFCLK_BIT)) {
if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_DCEFCLK_BIT)) {
ret = smu_v11_0_get_max_sustainable_clock(smu,
&(max_sustainable_clocks->dcef_clock),
SMU_DCEFCLK);
......@@ -1076,7 +1076,7 @@ static int smu_v11_0_set_power_limit(struct smu_context *smu, uint32_t n)
max_power_limit /= 100;
}
if (smu_feature_is_enabled(smu, FEATURE_PPT_BIT))
if (smu_feature_is_enabled(smu, SMU_FEATURE_PPT_BIT))
ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetPptLimit, n);
if (ret) {
pr_err("[%s] Set power limit Failed!", __func__);
......@@ -1439,7 +1439,7 @@ smu_v11_0_display_clock_voltage_request(struct smu_context *smu,
if (!smu->pm_enabled)
return -EINVAL;
if (smu_feature_is_enabled(smu, FEATURE_DPM_DCEFCLK_BIT)) {
if (smu_feature_is_enabled(smu, SMU_FEATURE_DPM_DCEFCLK_BIT)) {
switch (clk_type) {
case amd_pp_dcef_clock:
clk_select = SMU_DCEFCLK;
......@@ -1539,8 +1539,8 @@ smu_v11_0_set_watermarks_for_clock_ranges(struct smu_context *smu, struct
Watermarks_t *table = watermarks->cpu_addr;
if (!smu->disable_watermark &&
smu_feature_is_enabled(smu, FEATURE_DPM_DCEFCLK_BIT) &&
smu_feature_is_enabled(smu, FEATURE_DPM_SOCCLK_BIT)) {
smu_feature_is_enabled(smu, SMU_FEATURE_DPM_DCEFCLK_BIT) &&
smu_feature_is_enabled(smu, SMU_FEATURE_DPM_SOCCLK_BIT)) {
smu_v11_0_set_watermarks_table(smu, table, clock_ranges);
smu->watermarks_bitmap |= WATERMARKS_EXIST;
smu->watermarks_bitmap &= ~WATERMARKS_LOADED;
......@@ -1608,7 +1608,7 @@ static uint32_t smu_v11_0_dpm_get_sclk(struct smu_context *smu, bool low)
uint32_t gfx_clk;
int ret;
if (!smu_feature_is_enabled(smu, FEATURE_DPM_GFXCLK_BIT)) {
if (!smu_feature_is_enabled(smu, SMU_FEATURE_DPM_GFXCLK_BIT)) {
pr_err("[GetSclks]: gfxclk dpm not enabled!\n");
return -EPERM;
}
......@@ -1635,7 +1635,7 @@ static uint32_t smu_v11_0_dpm_get_mclk(struct smu_context *smu, bool low)
uint32_t mem_clk;
int ret;
if (!smu_feature_is_enabled(smu, FEATURE_DPM_UCLK_BIT)) {
if (!smu_feature_is_enabled(smu, SMU_FEATURE_DPM_UCLK_BIT)) {
pr_err("[GetMclks]: memclk dpm not enabled!\n");
return -EPERM;
}
......@@ -1743,7 +1743,7 @@ static int smu_v11_0_get_current_rpm(struct smu_context *smu,
static uint32_t
smu_v11_0_get_fan_control_mode(struct smu_context *smu)
{
if (!smu_feature_is_enabled(smu, FEATURE_FAN_CONTROL_BIT))
if (!smu_feature_is_enabled(smu, SMU_FEATURE_FAN_CONTROL_BIT))
return AMD_FAN_CTRL_MANUAL;
else
return AMD_FAN_CTRL_AUTO;
......@@ -1770,10 +1770,10 @@ smu_v11_0_smc_fan_control(struct smu_context *smu, bool start)
{
int ret = 0;
if (smu_feature_is_supported(smu, FEATURE_FAN_CONTROL_BIT))
if (smu_feature_is_supported(smu, SMU_FEATURE_FAN_CONTROL_BIT))
return 0;
ret = smu_feature_set_enabled(smu, FEATURE_FAN_CONTROL_BIT, start);
ret = smu_feature_set_enabled(smu, SMU_FEATURE_FAN_CONTROL_BIT, start);
if (ret)
pr_err("[%s]%s smc FAN CONTROL feature failed!",
__func__, (start ? "Start" : "Stop"));
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment