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

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
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -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 @@ failed:
	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);
+68 −4
Original line number Diff line number Diff line
@@ -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);
+2 −2
Original line number Diff line number Diff line
@@ -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
+3 −0
Original line number Diff line number Diff line
@@ -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;
+61 −2
Original line number Diff line number Diff line
@@ -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,
};
Loading