diff options
Diffstat (limited to 'drivers/gpu/drm/amd/pm')
| -rw-r--r-- | drivers/gpu/drm/amd/pm/amdgpu_pm.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/pm/inc/smu_v11_0.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/pm/inc/smu_v13_0.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomfwctrl.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 135 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/pm/swsmu/smu11/cyan_skillfish_ppt.c | 17 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c | 64 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 119 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c | 117 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c | 96 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c | 33 | 
14 files changed, 326 insertions, 313 deletions
| diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c index 249cb0aeb5ae..49fe4155c374 100644 --- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c @@ -310,7 +310,7 @@ static ssize_t amdgpu_set_power_dpm_force_performance_level(struct device *dev,  	struct amdgpu_device *adev = drm_to_adev(ddev);  	const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;  	enum amd_dpm_forced_level level; -	enum amd_dpm_forced_level current_level = 0xff; +	enum amd_dpm_forced_level current_level;  	int ret = 0;  	if (amdgpu_in_reset(adev)) @@ -350,6 +350,8 @@ static ssize_t amdgpu_set_power_dpm_force_performance_level(struct device *dev,  	if (pp_funcs->get_performance_level)  		current_level = amdgpu_dpm_get_performance_level(adev); +	else +		current_level = adev->pm.dpm.forced_level;  	if (current_level == level) {  		pm_runtime_mark_last_busy(ddev->dev); @@ -2019,15 +2021,15 @@ static struct amdgpu_device_attr amdgpu_device_attrs[] = {  	AMDGPU_DEVICE_ATTR_RW(pp_dpm_pcie,				ATTR_FLAG_BASIC),  	AMDGPU_DEVICE_ATTR_RW(pp_sclk_od,				ATTR_FLAG_BASIC),  	AMDGPU_DEVICE_ATTR_RW(pp_mclk_od,				ATTR_FLAG_BASIC), -	AMDGPU_DEVICE_ATTR_RW(pp_power_profile_mode,			ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RW(pp_power_profile_mode,			ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),  	AMDGPU_DEVICE_ATTR_RW(pp_od_clk_voltage,			ATTR_FLAG_BASIC), -	AMDGPU_DEVICE_ATTR_RO(gpu_busy_percent,				ATTR_FLAG_BASIC), -	AMDGPU_DEVICE_ATTR_RO(mem_busy_percent,				ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RO(gpu_busy_percent,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), +	AMDGPU_DEVICE_ATTR_RO(mem_busy_percent,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),  	AMDGPU_DEVICE_ATTR_RO(pcie_bw,					ATTR_FLAG_BASIC), -	AMDGPU_DEVICE_ATTR_RW(pp_features,				ATTR_FLAG_BASIC), -	AMDGPU_DEVICE_ATTR_RO(unique_id,				ATTR_FLAG_BASIC), -	AMDGPU_DEVICE_ATTR_RW(thermal_throttling_logging,		ATTR_FLAG_BASIC), -	AMDGPU_DEVICE_ATTR_RO(gpu_metrics,				ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RW(pp_features,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), +	AMDGPU_DEVICE_ATTR_RO(unique_id,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), +	AMDGPU_DEVICE_ATTR_RW(thermal_throttling_logging,		ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), +	AMDGPU_DEVICE_ATTR_RO(gpu_metrics,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),  	AMDGPU_DEVICE_ATTR_RO(smartshift_apu_power,			ATTR_FLAG_BASIC,  			      .attr_update = ss_power_attr_update),  	AMDGPU_DEVICE_ATTR_RO(smartshift_dgpu_power,			ATTR_FLAG_BASIC, @@ -2087,10 +2089,10 @@ static int default_attr_update(struct amdgpu_device *adev, struct amdgpu_device_  		if (asic_type < CHIP_VEGA12)  			*states = ATTR_STATE_UNSUPPORTED;  	} else if (DEVICE_ATTR_IS(pp_dpm_vclk)) { -		if (!(asic_type == CHIP_VANGOGH)) +		if (!(asic_type == CHIP_VANGOGH || asic_type == CHIP_SIENNA_CICHLID))  			*states = ATTR_STATE_UNSUPPORTED;  	} else if (DEVICE_ATTR_IS(pp_dpm_dclk)) { -		if (!(asic_type == CHIP_VANGOGH)) +		if (!(asic_type == CHIP_VANGOGH || asic_type == CHIP_SIENNA_CICHLID))  			*states = ATTR_STATE_UNSUPPORTED;  	} diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h index 8156729c370b..3557f4e7fc30 100644 --- a/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h +++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h @@ -1008,7 +1008,9 @@ struct pptable_funcs {  	/**  	 * @set_power_limit: Set power limit in watts.  	 */ -	int (*set_power_limit)(struct smu_context *smu, uint32_t n); +	int (*set_power_limit)(struct smu_context *smu, +			       enum smu_ppt_limit_type limit_type, +			       uint32_t limit);  	/**  	 * @init_max_sustainable_clocks: Populate max sustainable clock speed diff --git a/drivers/gpu/drm/amd/pm/inc/smu_v11_0.h b/drivers/gpu/drm/amd/pm/inc/smu_v11_0.h index cbdae8a2c698..2d422e6a9feb 100644 --- a/drivers/gpu/drm/amd/pm/inc/smu_v11_0.h +++ b/drivers/gpu/drm/amd/pm/inc/smu_v11_0.h @@ -197,7 +197,9 @@ int smu_v11_0_notify_display_change(struct smu_context *smu);  int smu_v11_0_get_current_power_limit(struct smu_context *smu,  				      uint32_t *power_limit); -int smu_v11_0_set_power_limit(struct smu_context *smu, uint32_t n); +int smu_v11_0_set_power_limit(struct smu_context *smu, +			      enum smu_ppt_limit_type limit_type, +			      uint32_t limit);  int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu); diff --git a/drivers/gpu/drm/amd/pm/inc/smu_v13_0.h b/drivers/gpu/drm/amd/pm/inc/smu_v13_0.h index dc91eb608791..e5d3b0d1a032 100644 --- a/drivers/gpu/drm/amd/pm/inc/smu_v13_0.h +++ b/drivers/gpu/drm/amd/pm/inc/smu_v13_0.h @@ -163,7 +163,9 @@ int smu_v13_0_notify_display_change(struct smu_context *smu);  int smu_v13_0_get_current_power_limit(struct smu_context *smu,  				      uint32_t *power_limit); -int smu_v13_0_set_power_limit(struct smu_context *smu, uint32_t n); +int smu_v13_0_set_power_limit(struct smu_context *smu, +			      enum smu_ppt_limit_type limit_type, +			      uint32_t limit);  int smu_v13_0_init_max_sustainable_clocks(struct smu_context *smu); diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomfwctrl.h b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomfwctrl.h index b7e2651b570b..2fc1733bcdcf 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomfwctrl.h +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppatomfwctrl.h @@ -29,9 +29,9 @@  typedef enum atom_smu9_syspll0_clock_id BIOS_CLKID;  #define GetIndexIntoMasterCmdTable(FieldName) \ -	(((char*)(&((struct atom_master_list_of_command_functions_v2_1*)0)->FieldName)-(char*)0)/sizeof(uint16_t)) +	(offsetof(struct atom_master_list_of_command_functions_v2_1, FieldName) / sizeof(uint16_t))  #define GetIndexIntoMasterDataTable(FieldName) \ -	(((char*)(&((struct atom_master_list_of_data_tables_v2_1*)0)->FieldName)-(char*)0)/sizeof(uint16_t)) +	(offsetof(struct atom_master_list_of_data_tables_v2_1, FieldName) / sizeof(uint16_t))  #define PP_ATOMFWCTRL_MAX_VOLTAGE_ENTRIES 32 diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c index 04863a797115..b06c59dcc1b4 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c @@ -455,7 +455,11 @@ static int smu_get_power_num_states(void *handle,  bool is_support_sw_smu(struct amdgpu_device *adev)  { -	if (adev->asic_type >= CHIP_ARCTURUS) +	/* vega20 is 11.0.2, but it's supported via the powerplay code */ +	if (adev->asic_type == CHIP_VEGA20) +		return false; + +	if (adev->ip_versions[MP1_HWIP][0] >= IP_VERSION(11, 0, 0))  		return true;  	return false; @@ -575,41 +579,43 @@ static int smu_set_funcs(struct amdgpu_device *adev)  	if (adev->pm.pp_feature & PP_OVERDRIVE_MASK)  		smu->od_enabled = true; -	switch (adev->asic_type) { -	case CHIP_NAVI10: -	case CHIP_NAVI14: -	case CHIP_NAVI12: +	switch (adev->ip_versions[MP1_HWIP][0]) { +	case IP_VERSION(11, 0, 0): +	case IP_VERSION(11, 0, 5): +	case IP_VERSION(11, 0, 9):  		navi10_set_ppt_funcs(smu);  		break; -	case CHIP_ARCTURUS: -		adev->pm.pp_feature &= ~PP_GFXOFF_MASK; -		arcturus_set_ppt_funcs(smu); -		/* OD is not supported on Arcturus */ -		smu->od_enabled =false; -		break; -	case CHIP_SIENNA_CICHLID: -	case CHIP_NAVY_FLOUNDER: -	case CHIP_DIMGREY_CAVEFISH: -	case CHIP_BEIGE_GOBY: +	case IP_VERSION(11, 0, 7): +	case IP_VERSION(11, 0, 11): +	case IP_VERSION(11, 0, 12): +	case IP_VERSION(11, 0, 13):  		sienna_cichlid_set_ppt_funcs(smu);  		break; -	case CHIP_ALDEBARAN: -		aldebaran_set_ppt_funcs(smu); -		/* Enable pp_od_clk_voltage node */ -		smu->od_enabled = true; -		break; -	case CHIP_RENOIR: +	case IP_VERSION(12, 0, 0): +	case IP_VERSION(12, 0, 1):  		renoir_set_ppt_funcs(smu);  		break; -	case CHIP_VANGOGH: +	case IP_VERSION(11, 5, 0):  		vangogh_set_ppt_funcs(smu);  		break; -	case CHIP_YELLOW_CARP: +	case IP_VERSION(13, 0, 1): +	case IP_VERSION(13, 0, 3):  		yellow_carp_set_ppt_funcs(smu);  		break; -	case CHIP_CYAN_SKILLFISH: +	case IP_VERSION(11, 0, 8):  		cyan_skillfish_set_ppt_funcs(smu);  		break; +	case IP_VERSION(11, 0, 2): +		adev->pm.pp_feature &= ~PP_GFXOFF_MASK; +		arcturus_set_ppt_funcs(smu); +		/* OD is not supported on Arcturus */ +		smu->od_enabled =false; +		break; +	case IP_VERSION(13, 0, 2): +		aldebaran_set_ppt_funcs(smu); +		/* Enable pp_od_clk_voltage node */ +		smu->od_enabled = true; +		break;  	default:  		return -EINVAL;  	} @@ -694,7 +700,8 @@ static int smu_late_init(void *handle)  		return ret;  	} -	if (adev->asic_type == CHIP_YELLOW_CARP) +	if ((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 1)) || +	    (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 3)))  		return 0;  	if (!amdgpu_sriov_vf(adev) || smu->od_enabled) { @@ -1140,9 +1147,16 @@ static int smu_smc_hw_setup(struct smu_context *smu)  	if (adev->in_suspend && smu_is_dpm_running(smu)) {  		dev_info(adev->dev, "dpm has been enabled\n");  		/* this is needed specifically */ -		if ((adev->asic_type >= CHIP_SIENNA_CICHLID) && -		    (adev->asic_type <= CHIP_DIMGREY_CAVEFISH)) +		switch (adev->ip_versions[MP1_HWIP][0]) { +		case IP_VERSION(11, 0, 7): +		case IP_VERSION(11, 0, 11): +		case IP_VERSION(11, 5, 0): +		case IP_VERSION(11, 0, 12):  			ret = smu_system_features_control(smu, true); +			break; +		default: +			break; +		}  		return ret;  	} @@ -1284,7 +1298,7 @@ static int smu_start_smc_engine(struct smu_context *smu)  	int ret = 0;  	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) { -		if (adev->asic_type < CHIP_NAVI10) { +		if (adev->ip_versions[MP1_HWIP][0] < IP_VERSION(11, 0, 0)) {  			if (smu->ppt_funcs->load_microcode) {  				ret = smu->ppt_funcs->load_microcode(smu);  				if (ret) @@ -1402,23 +1416,41 @@ static int smu_disable_dpms(struct smu_context *smu)  	 *   - SMU firmware can handle the DPM reenablement  	 *     properly.  	 */ -	if (smu->uploading_custom_pp_table && -	    (adev->asic_type >= CHIP_NAVI10) && -	    (adev->asic_type <= CHIP_BEIGE_GOBY)) -		return smu_disable_all_features_with_exception(smu, -							       true, -							       SMU_FEATURE_COUNT); +	if (smu->uploading_custom_pp_table) { +		switch (adev->ip_versions[MP1_HWIP][0]) { +		case IP_VERSION(11, 0, 0): +		case IP_VERSION(11, 0, 5): +		case IP_VERSION(11, 0, 9): +		case IP_VERSION(11, 0, 7): +		case IP_VERSION(11, 0, 11): +		case IP_VERSION(11, 5, 0): +		case IP_VERSION(11, 0, 12): +		case IP_VERSION(11, 0, 13): +			return smu_disable_all_features_with_exception(smu, +								       true, +								       SMU_FEATURE_COUNT); +		default: +			break; +		} +	}  	/*  	 * For Sienna_Cichlid, PMFW will handle the features disablement properly  	 * on BACO in. Driver involvement is unnecessary.  	 */ -	if (((adev->asic_type == CHIP_SIENNA_CICHLID) || -	     ((adev->asic_type >= CHIP_NAVI10) && (adev->asic_type <= CHIP_NAVI12))) && -	     use_baco) -		return smu_disable_all_features_with_exception(smu, -							       true, -							       SMU_FEATURE_BACO_BIT); +	if (use_baco) { +		switch (adev->ip_versions[MP1_HWIP][0]) { +		case IP_VERSION(11, 0, 7): +		case IP_VERSION(11, 0, 0): +		case IP_VERSION(11, 0, 5): +		case IP_VERSION(11, 0, 9): +			return smu_disable_all_features_with_exception(smu, +								       true, +								       SMU_FEATURE_BACO_BIT); +		default: +			break; +		} +	}  	/*  	 * For gpu reset, runpm and hibernation through BACO, @@ -1436,7 +1468,7 @@ static int smu_disable_dpms(struct smu_context *smu)  			dev_err(adev->dev, "Failed to disable smu features.\n");  	} -	if (adev->asic_type >= CHIP_NAVI10 && +	if (adev->ip_versions[MP1_HWIP][0] >= IP_VERSION(11, 0, 0) &&  	    adev->gfx.rlc.funcs->stop)  		adev->gfx.rlc.funcs->stop(adev); @@ -2229,6 +2261,7 @@ int smu_get_power_limit(void *handle,  			enum pp_power_type pp_power_type)  {  	struct smu_context *smu = handle; +	struct amdgpu_device *adev = smu->adev;  	enum smu_ppt_limit_level limit_level;  	uint32_t limit_type;  	int ret = 0; @@ -2272,15 +2305,20 @@ int smu_get_power_limit(void *handle,  	} else {  		switch (limit_level) {  		case SMU_PPT_LIMIT_CURRENT: -			if ((smu->adev->asic_type == CHIP_ALDEBARAN) || -			     (smu->adev->asic_type == CHIP_SIENNA_CICHLID) || -			     (smu->adev->asic_type == CHIP_NAVY_FLOUNDER) || -			     (smu->adev->asic_type == CHIP_DIMGREY_CAVEFISH) || -			     (smu->adev->asic_type == CHIP_BEIGE_GOBY)) +			switch (adev->ip_versions[MP1_HWIP][0]) { +			case IP_VERSION(13, 0, 2): +			case IP_VERSION(11, 0, 7): +			case IP_VERSION(11, 0, 11): +			case IP_VERSION(11, 0, 12): +			case IP_VERSION(11, 0, 13):  				ret = smu_get_asic_power_limits(smu,  								&smu->current_power_limit,  								NULL,  								NULL); +				break; +			default: +				break; +			}  			*limit = smu->current_power_limit;  			break;  		case SMU_PPT_LIMIT_DEFAULT: @@ -2310,9 +2348,10 @@ static int smu_set_power_limit(void *handle, uint32_t limit)  	mutex_lock(&smu->mutex); +	limit &= (1<<24)-1;  	if (limit_type != SMU_DEFAULT_PPT_LIMIT)  		if (smu->ppt_funcs->set_power_limit) { -			ret = smu->ppt_funcs->set_power_limit(smu, limit); +			ret = smu->ppt_funcs->set_power_limit(smu, limit_type, limit);  			goto out;  		} @@ -2328,7 +2367,7 @@ static int smu_set_power_limit(void *handle, uint32_t limit)  		limit = smu->current_power_limit;  	if (smu->ppt_funcs->set_power_limit) { -		ret = smu->ppt_funcs->set_power_limit(smu, limit); +		ret = smu->ppt_funcs->set_power_limit(smu, limit_type, limit);  		if (!ret && !(smu->user_dpm_profile.flags & SMU_DPM_USER_PROFILE_RESTORE))  			smu->user_dpm_profile.power_limit = limit;  	} diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c index 082f01893f3d..fd1d30a93db5 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c @@ -436,6 +436,19 @@ static void arcturus_check_bxco_support(struct smu_context *smu)  	}  } +static void arcturus_check_fan_support(struct smu_context *smu) +{ +	struct smu_table_context *table_context = &smu->smu_table; +	PPTable_t *pptable = table_context->driver_pptable; + +	/* No sort of fan control possible if PPTable has it disabled */ +	smu->adev->pm.no_fan = +		!(pptable->FeaturesToRun[0] & FEATURE_FAN_CONTROL_MASK); +	if (smu->adev->pm.no_fan) +		dev_info_once(smu->adev->dev, +			      "PMFW based fan control disabled"); +} +  static int arcturus_check_powerplay_table(struct smu_context *smu)  {  	struct smu_table_context *table_context = &smu->smu_table; @@ -443,6 +456,7 @@ static int arcturus_check_powerplay_table(struct smu_context *smu)  		table_context->power_play_table;  	arcturus_check_bxco_support(smu); +	arcturus_check_fan_support(smu);  	table_context->thermal_controller_type =  		powerplay_table->thermal_controller_type; diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/cyan_skillfish_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/cyan_skillfish_ppt.c index 3d4c65bc29dc..cbc3f99e8573 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/cyan_skillfish_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/cyan_skillfish_ppt.c @@ -47,7 +47,6 @@  /* unit: MHz */  #define CYAN_SKILLFISH_SCLK_MIN			1000  #define CYAN_SKILLFISH_SCLK_MAX			2000 -#define CYAN_SKILLFISH_SCLK_DEFAULT			1800  /* unit: mV */  #define CYAN_SKILLFISH_VDDC_MIN			700 @@ -59,6 +58,8 @@ static struct gfx_user_settings {  	uint32_t vddc;  } cyan_skillfish_user_settings; +static uint32_t cyan_skillfish_sclk_default; +  #define FEATURE_MASK(feature) (1ULL << feature)  #define SMC_DPM_FEATURE ( \  	FEATURE_MASK(FEATURE_FCLK_DPM_BIT)	|	\ @@ -365,13 +366,19 @@ static bool cyan_skillfish_is_dpm_running(struct smu_context *smu)  		return false;  	ret = smu_cmn_get_enabled_32_bits_mask(smu, feature_mask, 2); -  	if (ret)  		return false;  	feature_enabled = (uint64_t)feature_mask[0] |  				((uint64_t)feature_mask[1] << 32); +	/* +	 * cyan_skillfish specific, query default sclk inseted of hard code. +	 */ +	if (!cyan_skillfish_sclk_default) +		cyan_skillfish_get_smu_metrics_data(smu, METRICS_CURR_GFXCLK, +			&cyan_skillfish_sclk_default); +  	return !!(feature_enabled & SMC_DPM_FEATURE);  } @@ -444,14 +451,14 @@ static int cyan_skillfish_od_edit_dpm_table(struct smu_context *smu,  			return -EINVAL;  		} -		if (input[1] <= CYAN_SKILLFISH_SCLK_MIN || +		if (input[1] < CYAN_SKILLFISH_SCLK_MIN ||  			input[1] > CYAN_SKILLFISH_SCLK_MAX) {  			dev_err(smu->adev->dev, "Invalid sclk! Valid sclk range: %uMHz - %uMhz\n",  					CYAN_SKILLFISH_SCLK_MIN, CYAN_SKILLFISH_SCLK_MAX);  			return -EINVAL;  		} -		if (input[2] <= CYAN_SKILLFISH_VDDC_MIN || +		if (input[2] < CYAN_SKILLFISH_VDDC_MIN ||  			input[2] > CYAN_SKILLFISH_VDDC_MAX) {  			dev_err(smu->adev->dev, "Invalid vddc! Valid vddc range: %umV - %umV\n",  					CYAN_SKILLFISH_VDDC_MIN, CYAN_SKILLFISH_VDDC_MAX); @@ -468,7 +475,7 @@ static int cyan_skillfish_od_edit_dpm_table(struct smu_context *smu,  			return -EINVAL;  		} -		cyan_skillfish_user_settings.sclk = CYAN_SKILLFISH_SCLK_DEFAULT; +		cyan_skillfish_user_settings.sclk = cyan_skillfish_sclk_default;  		cyan_skillfish_user_settings.vddc = CYAN_SKILLFISH_VDDC_MAGIC;  		break; diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c index b1ad451af06b..71161f6b78fe 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c @@ -86,21 +86,21 @@ static struct cmn2asic_msg_mapping navi10_message_map[SMU_MSG_MAX_COUNT] = {  	MSG_MAP(DisableSmuFeaturesHigh,		PPSMC_MSG_DisableSmuFeaturesHigh,	0),  	MSG_MAP(GetEnabledSmuFeaturesLow,	PPSMC_MSG_GetEnabledSmuFeaturesLow,	1),  	MSG_MAP(GetEnabledSmuFeaturesHigh,	PPSMC_MSG_GetEnabledSmuFeaturesHigh,	1), -	MSG_MAP(SetWorkloadMask,		PPSMC_MSG_SetWorkloadMask,		1), +	MSG_MAP(SetWorkloadMask,		PPSMC_MSG_SetWorkloadMask,		0),  	MSG_MAP(SetPptLimit,			PPSMC_MSG_SetPptLimit,			0), -	MSG_MAP(SetDriverDramAddrHigh,		PPSMC_MSG_SetDriverDramAddrHigh,	0), -	MSG_MAP(SetDriverDramAddrLow,		PPSMC_MSG_SetDriverDramAddrLow,		0), +	MSG_MAP(SetDriverDramAddrHigh,		PPSMC_MSG_SetDriverDramAddrHigh,	1), +	MSG_MAP(SetDriverDramAddrLow,		PPSMC_MSG_SetDriverDramAddrLow,		1),  	MSG_MAP(SetToolsDramAddrHigh,		PPSMC_MSG_SetToolsDramAddrHigh,		0),  	MSG_MAP(SetToolsDramAddrLow,		PPSMC_MSG_SetToolsDramAddrLow,		0), -	MSG_MAP(TransferTableSmu2Dram,		PPSMC_MSG_TransferTableSmu2Dram,	0), +	MSG_MAP(TransferTableSmu2Dram,		PPSMC_MSG_TransferTableSmu2Dram,	1),  	MSG_MAP(TransferTableDram2Smu,		PPSMC_MSG_TransferTableDram2Smu,	0),  	MSG_MAP(UseDefaultPPTable,		PPSMC_MSG_UseDefaultPPTable,		0),  	MSG_MAP(UseBackupPPTable,		PPSMC_MSG_UseBackupPPTable,		0),  	MSG_MAP(RunBtc,				PPSMC_MSG_RunBtc,			0),  	MSG_MAP(EnterBaco,			PPSMC_MSG_EnterBaco,			0), -	MSG_MAP(SetSoftMinByFreq,		PPSMC_MSG_SetSoftMinByFreq,		0), -	MSG_MAP(SetSoftMaxByFreq,		PPSMC_MSG_SetSoftMaxByFreq,		0), -	MSG_MAP(SetHardMinByFreq,		PPSMC_MSG_SetHardMinByFreq,		1), +	MSG_MAP(SetSoftMinByFreq,		PPSMC_MSG_SetSoftMinByFreq,		1), +	MSG_MAP(SetSoftMaxByFreq,		PPSMC_MSG_SetSoftMaxByFreq,		1), +	MSG_MAP(SetHardMinByFreq,		PPSMC_MSG_SetHardMinByFreq,		0),  	MSG_MAP(SetHardMaxByFreq,		PPSMC_MSG_SetHardMaxByFreq,		0),  	MSG_MAP(GetMinDpmFreq,			PPSMC_MSG_GetMinDpmFreq,		1),  	MSG_MAP(GetMaxDpmFreq,			PPSMC_MSG_GetMaxDpmFreq,		1), @@ -345,7 +345,7 @@ navi10_get_allowed_feature_mask(struct smu_context *smu,  	/* DPM UCLK enablement should be skipped for navi10 A0 secure board */  	if (!(is_asic_secure(smu) && -	     (adev->asic_type == CHIP_NAVI10) && +	     (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 0)) &&  	     (adev->rev_id == 0)) &&  	    (adev->pm.pp_feature & PP_MCLK_DPM_MASK))  		*(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_DPM_UCLK_BIT) @@ -354,7 +354,7 @@ navi10_get_allowed_feature_mask(struct smu_context *smu,  	/* DS SOCCLK enablement should be skipped for navi10 A0 secure board */  	if (is_asic_secure(smu) && -	    (adev->asic_type == CHIP_NAVI10) && +	    (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 0)) &&  	    (adev->rev_id == 0))  		*(uint64_t *)feature_mask &=  				~FEATURE_MASK(FEATURE_DS_SOCCLK_BIT); @@ -925,18 +925,18 @@ static int navi1x_get_smu_metrics_data(struct smu_context *smu,  		return ret;  	} -	switch (adev->asic_type) { -	case CHIP_NAVI12: +	switch (adev->ip_versions[MP1_HWIP][0]) { +	case IP_VERSION(11, 0, 9):  		if (smu_version > 0x00341C00)  			ret = navi12_get_smu_metrics_data(smu, member, value);  		else  			ret = navi12_get_legacy_smu_metrics_data(smu, member, value);  		break; -	case CHIP_NAVI10: -	case CHIP_NAVI14: +	case IP_VERSION(11, 0, 0): +	case IP_VERSION(11, 0, 5):  	default: -		if (((adev->asic_type == CHIP_NAVI14) && smu_version > 0x00351F00) || -		      ((adev->asic_type == CHIP_NAVI10) && smu_version > 0x002A3B00)) +		if (((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 5)) && smu_version > 0x00351F00) || +		      ((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 0)) && smu_version > 0x002A3B00))  			ret = navi10_get_smu_metrics_data(smu, member, value);  		else  			ret = navi10_get_legacy_smu_metrics_data(smu, member, value); @@ -1509,8 +1509,8 @@ static int navi10_populate_umd_state_clk(struct smu_context *smu)  	uint32_t sclk_freq;  	pstate_table->gfxclk_pstate.min = gfx_table->min; -	switch (adev->asic_type) { -	case CHIP_NAVI10: +	switch (adev->ip_versions[MP1_HWIP][0]) { +	case IP_VERSION(11, 0, 0):  		switch (adev->pdev->revision) {  		case 0xf0: /* XTX */  		case 0xc0: @@ -1525,7 +1525,7 @@ static int navi10_populate_umd_state_clk(struct smu_context *smu)  			break;  		}  		break; -	case CHIP_NAVI14: +	case IP_VERSION(11, 0, 5):  		switch (adev->pdev->revision) {  		case 0xc7: /* XT */  		case 0xf4: @@ -1548,7 +1548,7 @@ static int navi10_populate_umd_state_clk(struct smu_context *smu)  			break;  		}  		break; -	case CHIP_NAVI12: +	case IP_VERSION(11, 0, 9):  		sclk_freq = NAVI12_UMD_PSTATE_PEAK_GFXCLK;  		break;  	default: @@ -2562,8 +2562,8 @@ static bool navi10_need_umc_cdr_workaround(struct smu_context *smu)  	if (!smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_UCLK_BIT))  		return false; -	if (adev->asic_type == CHIP_NAVI10 || -	    adev->asic_type == CHIP_NAVI14) +	if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 0) || +	    adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 5))  		return true;  	return false; @@ -2671,8 +2671,8 @@ static int navi10_run_umc_cdr_workaround(struct smu_context *smu)  	 * - PPSMC_MSG_SetDriverDummyTableDramAddrLow  	 * - PPSMC_MSG_GetUMCFWWA  	 */ -	if (((adev->asic_type == CHIP_NAVI10) && (pmfw_version >= 0x2a3500)) || -	    ((adev->asic_type == CHIP_NAVI14) && (pmfw_version >= 0x351D00))) { +	if (((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 0)) && (pmfw_version >= 0x2a3500)) || +	    ((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 5)) && (pmfw_version >= 0x351D00))) {  		ret = smu_cmn_send_smc_msg_with_param(smu,  						      SMU_MSG_GET_UMC_FW_WA,  						      0, @@ -2691,13 +2691,13 @@ static int navi10_run_umc_cdr_workaround(struct smu_context *smu)  			return 0;  		if (umc_fw_disable_cdr) { -			if (adev->asic_type == CHIP_NAVI10) +			if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 0))  				return navi10_umc_hybrid_cdr_workaround(smu);  		} else {  			return navi10_set_dummy_pstates_table_location(smu);  		}  	} else { -		if (adev->asic_type == CHIP_NAVI10) +		if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 0))  			return navi10_umc_hybrid_cdr_workaround(smu);  	} @@ -3151,18 +3151,18 @@ static ssize_t navi1x_get_gpu_metrics(struct smu_context *smu,  		return ret;  	} -	switch (adev->asic_type) { -	case CHIP_NAVI12: +	switch (adev->ip_versions[MP1_HWIP][0]) { +	case IP_VERSION(11, 0, 9):  		if (smu_version > 0x00341C00)  			ret = navi12_get_gpu_metrics(smu, table);  		else  			ret = navi12_get_legacy_gpu_metrics(smu, table);  		break; -	case CHIP_NAVI10: -	case CHIP_NAVI14: +	case IP_VERSION(11, 0, 0): +	case IP_VERSION(11, 0, 5):  	default: -		if (((adev->asic_type == CHIP_NAVI14) && smu_version > 0x00351F00) || -		      ((adev->asic_type == CHIP_NAVI10) && smu_version > 0x002A3B00)) +		if (((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 5)) && smu_version > 0x00351F00) || +		      ((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 0)) && smu_version > 0x002A3B00))  			ret = navi10_get_gpu_metrics(smu, table);  		else  			ret =navi10_get_legacy_gpu_metrics(smu, table); @@ -3180,7 +3180,7 @@ static int navi10_enable_mgpu_fan_boost(struct smu_context *smu)  	uint32_t param = 0;  	/* Navi12 does not support this */ -	if (adev->asic_type == CHIP_NAVI12) +	if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 9))  		return 0;  	/* diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c index ca57221e3962..a4108025fe29 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c @@ -74,7 +74,7 @@  #define SMU_11_0_7_GFX_BUSY_THRESHOLD 15  #define GET_PPTABLE_MEMBER(field, member) do {\ -	if (smu->adev->asic_type == CHIP_BEIGE_GOBY)\ +	if (smu->adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 13))\  		(*member) = (smu->smu_table.driver_pptable + offsetof(PPTable_beige_goby_t, field));\  	else\  		(*member) = (smu->smu_table.driver_pptable + offsetof(PPTable_t, field));\ @@ -82,7 +82,7 @@  static int get_table_size(struct smu_context *smu)  { -	if (smu->adev->asic_type == CHIP_BEIGE_GOBY) +	if (smu->adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 13))  		return sizeof(PPTable_beige_goby_t);  	else  		return sizeof(PPTable_t); @@ -298,7 +298,7 @@ sienna_cichlid_get_allowed_feature_mask(struct smu_context *smu,  	}  	if ((adev->pm.pp_feature & PP_GFX_DCS_MASK) && -	    (adev->asic_type > CHIP_SIENNA_CICHLID) && +	    (adev->ip_versions[MP1_HWIP][0] > IP_VERSION(11, 0, 7)) &&  	    !(adev->flags & AMD_IS_APU))  		*(uint64_t *)feature_mask |= FEATURE_MASK(FEATURE_GFX_DCS_BIT); @@ -496,7 +496,7 @@ static uint32_t sienna_cichlid_get_throttler_status_locked(struct smu_context *s  	uint32_t throttler_status = 0;  	int i; -	if ((smu->adev->asic_type == CHIP_SIENNA_CICHLID) && +	if ((smu->adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 7)) &&  	     (smu->smc_fw_version >= 0x3A4300)) {  		for (i = 0; i < THROTTLER_COUNT; i++)  			throttler_status |= @@ -517,7 +517,7 @@ static int sienna_cichlid_get_smu_metrics_data(struct smu_context *smu,  		&(((SmuMetricsExternal_t *)(smu_table->metrics_table))->SmuMetrics);  	SmuMetrics_V2_t *metrics_v2 =  		&(((SmuMetricsExternal_t *)(smu_table->metrics_table))->SmuMetrics_V2); -	bool use_metrics_v2 = ((smu->adev->asic_type == CHIP_SIENNA_CICHLID) && +	bool use_metrics_v2 = ((smu->adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 7)) &&  		(smu->smc_fw_version >= 0x3A4300)) ? true : false;  	uint16_t average_gfx_activity;  	int ret = 0; @@ -670,7 +670,7 @@ static int sienna_cichlid_set_default_dpm_table(struct smu_context *smu)  	struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;  	struct smu_11_0_dpm_table *dpm_table;  	struct amdgpu_device *adev = smu->adev; -	int ret = 0; +	int i, ret = 0;  	DpmDescriptor_t *table_member;  	/* socclk dpm table setup */ @@ -746,78 +746,45 @@ static int sienna_cichlid_set_default_dpm_table(struct smu_context *smu)  		dpm_table->max = dpm_table->dpm_levels[0].value;  	} -	/* vclk0 dpm table setup */ -	dpm_table = &dpm_context->dpm_tables.vclk_table; -	if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_MM_DPM_PG_BIT)) { -		ret = smu_v11_0_set_single_dpm_table(smu, -						     SMU_VCLK, -						     dpm_table); -		if (ret) -			return ret; -		dpm_table->is_fine_grained = -			!table_member[PPCLK_VCLK_0].SnapToDiscrete; -	} else { -		dpm_table->count = 1; -		dpm_table->dpm_levels[0].value = smu->smu_table.boot_values.vclk / 100; -		dpm_table->dpm_levels[0].enabled = true; -		dpm_table->min = dpm_table->dpm_levels[0].value; -		dpm_table->max = dpm_table->dpm_levels[0].value; -	} +	/* vclk0/1 dpm table setup */ +	for (i = 0; i < adev->vcn.num_vcn_inst; i++) { +		if (adev->vcn.harvest_config & (1 << i)) +			continue; -	/* vclk1 dpm table setup */ -	if (adev->vcn.num_vcn_inst > 1) { -		dpm_table = &dpm_context->dpm_tables.vclk1_table; +		dpm_table = &dpm_context->dpm_tables.vclk_table;  		if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_MM_DPM_PG_BIT)) {  			ret = smu_v11_0_set_single_dpm_table(smu, -							     SMU_VCLK1, +							     i ? SMU_VCLK1 : SMU_VCLK,  							     dpm_table);  			if (ret)  				return ret;  			dpm_table->is_fine_grained = -				!table_member[PPCLK_VCLK_1].SnapToDiscrete; +				!table_member[i ? PPCLK_VCLK_1 : PPCLK_VCLK_0].SnapToDiscrete;  		} else {  			dpm_table->count = 1; -			dpm_table->dpm_levels[0].value = -				smu->smu_table.boot_values.vclk / 100; +			dpm_table->dpm_levels[0].value = smu->smu_table.boot_values.vclk / 100;  			dpm_table->dpm_levels[0].enabled = true;  			dpm_table->min = dpm_table->dpm_levels[0].value;  			dpm_table->max = dpm_table->dpm_levels[0].value;  		}  	} -	/* dclk0 dpm table setup */ -	dpm_table = &dpm_context->dpm_tables.dclk_table; -	if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_MM_DPM_PG_BIT)) { -		ret = smu_v11_0_set_single_dpm_table(smu, -						     SMU_DCLK, -						     dpm_table); -		if (ret) -			return ret; -		dpm_table->is_fine_grained = -			!table_member[PPCLK_DCLK_0].SnapToDiscrete; -	} else { -		dpm_table->count = 1; -		dpm_table->dpm_levels[0].value = smu->smu_table.boot_values.dclk / 100; -		dpm_table->dpm_levels[0].enabled = true; -		dpm_table->min = dpm_table->dpm_levels[0].value; -		dpm_table->max = dpm_table->dpm_levels[0].value; -	} - -	/* dclk1 dpm table setup */ -	if (adev->vcn.num_vcn_inst > 1) { -		dpm_table = &dpm_context->dpm_tables.dclk1_table; +	/* dclk0/1 dpm table setup */ +	for (i = 0; i < adev->vcn.num_vcn_inst; i++) { +		if (adev->vcn.harvest_config & (1 << i)) +			continue; +		dpm_table = &dpm_context->dpm_tables.dclk_table;  		if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_MM_DPM_PG_BIT)) {  			ret = smu_v11_0_set_single_dpm_table(smu, -							     SMU_DCLK1, +							     i ? SMU_DCLK1 : SMU_DCLK,  							     dpm_table);  			if (ret)  				return ret;  			dpm_table->is_fine_grained = -				!table_member[PPCLK_DCLK_1].SnapToDiscrete; +				!table_member[i ? PPCLK_DCLK_1 : PPCLK_DCLK_0].SnapToDiscrete;  		} else {  			dpm_table->count = 1; -			dpm_table->dpm_levels[0].value = -				smu->smu_table.boot_values.dclk / 100; +			dpm_table->dpm_levels[0].value = smu->smu_table.boot_values.dclk / 100;  			dpm_table->dpm_levels[0].enabled = true;  			dpm_table->min = dpm_table->dpm_levels[0].value;  			dpm_table->max = dpm_table->dpm_levels[0].value; @@ -902,32 +869,18 @@ static int sienna_cichlid_set_default_dpm_table(struct smu_context *smu)  static int sienna_cichlid_dpm_set_vcn_enable(struct smu_context *smu, bool enable)  {  	struct amdgpu_device *adev = smu->adev; -	int ret = 0; +	int i, ret = 0; -	if (enable) { +	for (i = 0; i < adev->vcn.num_vcn_inst; i++) { +		if (adev->vcn.harvest_config & (1 << i)) +			continue;  		/* vcn dpm on is a prerequisite for vcn power gate messages */  		if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_MM_DPM_PG_BIT)) { -			ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_PowerUpVcn, 0, NULL); +			ret = smu_cmn_send_smc_msg_with_param(smu, enable ? +							      SMU_MSG_PowerUpVcn : SMU_MSG_PowerDownVcn, +							      0x10000 * i, NULL);  			if (ret)  				return ret; -			if (adev->vcn.num_vcn_inst > 1) { -				ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_PowerUpVcn, -								  0x10000, NULL); -				if (ret) -					return ret; -			} -		} -	} else { -		if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_MM_DPM_PG_BIT)) { -			ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_PowerDownVcn, 0, NULL); -			if (ret) -				return ret; -			if (adev->vcn.num_vcn_inst > 1) { -				ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_PowerDownVcn, -								  0x10000, NULL); -				if (ret) -					return ret; -			}  		}  	} @@ -1170,7 +1123,7 @@ static int sienna_cichlid_print_clk_levels(struct smu_context *smu,  		 * and onwards SMU firmwares.  		 */  		smu_cmn_get_smc_version(smu, NULL, &smu_version); -		if ((adev->asic_type == CHIP_SIENNA_CICHLID) && +		if ((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 7)) &&  		     (smu_version < 0x003a2900))  			break; @@ -1937,7 +1890,7 @@ static void sienna_cichlid_dump_od_table(struct smu_context *smu,  							od_table->UclkFmax);  	smu_cmn_get_smc_version(smu, NULL, &smu_version); -	if (!((adev->asic_type == CHIP_SIENNA_CICHLID) && +	if (!((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 7)) &&  	       (smu_version < 0x003a2900)))  		dev_dbg(smu->adev->dev, "OD: VddGfxOffset: %d\n", od_table->VddGfxOffset);  } @@ -2161,7 +2114,7 @@ static int sienna_cichlid_od_edit_dpm_table(struct smu_context *smu,  		 * and onwards SMU firmwares.  		 */  		smu_cmn_get_smc_version(smu, NULL, &smu_version); -		if ((adev->asic_type == CHIP_SIENNA_CICHLID) && +		if ((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 7)) &&  		     (smu_version < 0x003a2900)) {  			dev_err(smu->adev->dev, "OD GFX Voltage offset functionality is supported "  						"only by 58.41.0 and onwards SMU firmwares!\n"); @@ -2865,7 +2818,7 @@ static void sienna_cichlid_dump_pptable(struct smu_context *smu)  	PPTable_t *pptable = table_context->driver_pptable;  	int i; -	if (smu->adev->asic_type == CHIP_BEIGE_GOBY) { +	if (smu->adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 13)) {  		beige_goby_dump_pptable(smu);  		return;  	} @@ -3625,7 +3578,7 @@ static ssize_t sienna_cichlid_get_gpu_metrics(struct smu_context *smu,  	SmuMetrics_V2_t *metrics_v2 =  		&(metrics_external.SmuMetrics_V2);  	struct amdgpu_device *adev = smu->adev; -	bool use_metrics_v2 = ((adev->asic_type == CHIP_SIENNA_CICHLID) && +	bool use_metrics_v2 = ((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 7)) &&  		(smu->smc_fw_version >= 0x3A4300)) ? true : false;  	uint16_t average_gfx_activity;  	int ret = 0; @@ -3706,8 +3659,8 @@ static ssize_t sienna_cichlid_get_gpu_metrics(struct smu_context *smu,  	gpu_metrics->current_fan_speed = use_metrics_v2 ? metrics_v2->CurrFanSpeed : metrics->CurrFanSpeed; -	if (((adev->asic_type == CHIP_SIENNA_CICHLID) && smu->smc_fw_version > 0x003A1E00) || -	      ((adev->asic_type == CHIP_NAVY_FLOUNDER) && smu->smc_fw_version > 0x00410400)) { +	if (((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 7)) && smu->smc_fw_version > 0x003A1E00) || +	      ((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 11)) && smu->smc_fw_version > 0x00410400)) {  		gpu_metrics->pcie_link_width = use_metrics_v2 ? metrics_v2->PcieWidth : metrics->PcieWidth;  		gpu_metrics->pcie_link_speed = link_speed[use_metrics_v2 ? metrics_v2->PcieRate : metrics->PcieRate];  	} else { diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c index 87b055466a33..28b7c0562b99 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c @@ -90,37 +90,38 @@ int smu_v11_0_init_microcode(struct smu_context *smu)  	struct amdgpu_firmware_info *ucode = NULL;  	if (amdgpu_sriov_vf(adev) && -			((adev->asic_type == CHIP_NAVI12) || -			 (adev->asic_type == CHIP_SIENNA_CICHLID))) +	    ((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 9)) || +	     (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 7))))  		return 0; -	switch (adev->asic_type) { -	case CHIP_ARCTURUS: -		chip_name = "arcturus"; -		break; -	case CHIP_NAVI10: +	switch (adev->ip_versions[MP1_HWIP][0]) { +	case IP_VERSION(11, 0, 0):  		chip_name = "navi10";  		break; -	case CHIP_NAVI14: +	case IP_VERSION(11, 0, 5):  		chip_name = "navi14";  		break; -	case CHIP_NAVI12: +	case IP_VERSION(11, 0, 9):  		chip_name = "navi12";  		break; -	case CHIP_SIENNA_CICHLID: +	case IP_VERSION(11, 0, 7):  		chip_name = "sienna_cichlid";  		break; -	case CHIP_NAVY_FLOUNDER: +	case IP_VERSION(11, 0, 11):  		chip_name = "navy_flounder";  		break; -	case CHIP_DIMGREY_CAVEFISH: +	case IP_VERSION(11, 0, 12):  		chip_name = "dimgrey_cavefish";  		break; -	case CHIP_BEIGE_GOBY: +	case IP_VERSION(11, 0, 13):  		chip_name = "beige_goby";  		break; +	case IP_VERSION(11, 0, 2): +		chip_name = "arcturus"; +		break;  	default: -		dev_err(adev->dev, "Unsupported ASIC type %d\n", adev->asic_type); +		dev_err(adev->dev, "Unsupported IP version 0x%x\n", +			adev->ip_versions[MP1_HWIP][0]);  		return -EINVAL;  	} @@ -238,39 +239,40 @@ int smu_v11_0_check_fw_version(struct smu_context *smu)  	if (smu->is_apu)  		adev->pm.fw_version = smu_version; -	switch (smu->adev->asic_type) { -	case CHIP_ARCTURUS: -		smu->smc_driver_if_version = SMU11_DRIVER_IF_VERSION_ARCT; -		break; -	case CHIP_NAVI10: +	switch (adev->ip_versions[MP1_HWIP][0]) { +	case IP_VERSION(11, 0, 0):  		smu->smc_driver_if_version = SMU11_DRIVER_IF_VERSION_NV10;  		break; -	case CHIP_NAVI12: +	case IP_VERSION(11, 0, 9):  		smu->smc_driver_if_version = SMU11_DRIVER_IF_VERSION_NV12;  		break; -	case CHIP_NAVI14: +	case IP_VERSION(11, 0, 5):  		smu->smc_driver_if_version = SMU11_DRIVER_IF_VERSION_NV14;  		break; -	case CHIP_SIENNA_CICHLID: +	case IP_VERSION(11, 0, 7):  		smu->smc_driver_if_version = SMU11_DRIVER_IF_VERSION_Sienna_Cichlid;  		break; -	case CHIP_NAVY_FLOUNDER: +	case IP_VERSION(11, 0, 11):  		smu->smc_driver_if_version = SMU11_DRIVER_IF_VERSION_Navy_Flounder;  		break; -	case CHIP_VANGOGH: +	case IP_VERSION(11, 5, 0):  		smu->smc_driver_if_version = SMU11_DRIVER_IF_VERSION_VANGOGH;  		break; -	case CHIP_DIMGREY_CAVEFISH: +	case IP_VERSION(11, 0, 12):  		smu->smc_driver_if_version = SMU11_DRIVER_IF_VERSION_Dimgrey_Cavefish;  		break; -	case CHIP_BEIGE_GOBY: +	case IP_VERSION(11, 0, 13):  		smu->smc_driver_if_version = SMU11_DRIVER_IF_VERSION_Beige_Goby;  		break; -	case CHIP_CYAN_SKILLFISH: +	case IP_VERSION(11, 0, 8):  		smu->smc_driver_if_version = SMU11_DRIVER_IF_VERSION_Cyan_Skillfish;  		break; +	case IP_VERSION(11, 0, 2): +		smu->smc_driver_if_version = SMU11_DRIVER_IF_VERSION_ARCT; +		break;  	default: -		dev_err(smu->adev->dev, "smu unsupported asic type:%d.\n", smu->adev->asic_type); +		dev_err(smu->adev->dev, "smu unsupported IP version: 0x%x.\n", +			adev->ip_versions[MP1_HWIP][0]);  		smu->smc_driver_if_version = SMU11_DRIVER_IF_VERSION_INV;  		break;  	} @@ -492,8 +494,9 @@ int smu_v11_0_fini_smc_tables(struct smu_context *smu)  int smu_v11_0_init_power(struct smu_context *smu)  { +	struct amdgpu_device *adev = smu->adev;  	struct smu_power_context *smu_power = &smu->smu_power; -	size_t size = smu->adev->asic_type == CHIP_VANGOGH ? +	size_t size = adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 5, 0) ?  			sizeof(struct smu_11_5_power_context) :  			sizeof(struct smu_11_0_power_context); @@ -750,8 +753,10 @@ int smu_v11_0_init_display_count(struct smu_context *smu, uint32_t count)  	/* Navy_Flounder/Dimgrey_Cavefish do not support to change  	 * display num currently  	 */ -	if (adev->asic_type >= CHIP_NAVY_FLOUNDER && -	    adev->asic_type <= CHIP_BEIGE_GOBY) +	if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 11) || +	    adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 5, 0) || +	    adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 12) || +	    adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 13))  		return 0;  	return smu_cmn_send_smc_msg_with_param(smu, @@ -974,10 +979,16 @@ int smu_v11_0_get_current_power_limit(struct smu_context *smu,  	return ret;  } -int smu_v11_0_set_power_limit(struct smu_context *smu, uint32_t n) +int smu_v11_0_set_power_limit(struct smu_context *smu, +			      enum smu_ppt_limit_type limit_type, +			      uint32_t limit)  {  	int power_src;  	int ret = 0; +	uint32_t limit_param; + +	if (limit_type != SMU_DEFAULT_PPT_LIMIT) +		return -EINVAL;  	if (!smu_cmn_feature_is_enabled(smu, SMU_FEATURE_PPT_BIT)) {  		dev_err(smu->adev->dev, "Setting new power limit is not supported!\n"); @@ -997,16 +1008,16 @@ int smu_v11_0_set_power_limit(struct smu_context *smu, uint32_t n)  	 * BIT 16-23: PowerSource  	 * BIT 0-15: PowerLimit  	 */ -	n &= 0xFFFF; -	n |= 0 << 24; -	n |= (power_src) << 16; -	ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetPptLimit, n, NULL); +	limit_param  = (limit & 0xFFFF); +	limit_param |= 0 << 24; +	limit_param |= (power_src) << 16; +	ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetPptLimit, limit_param, NULL);  	if (ret) {  		dev_err(smu->adev->dev, "[%s] Set power limit Failed!\n", __func__);  		return ret;  	} -	smu->current_power_limit = n; +	smu->current_power_limit = limit;  	return 0;  } @@ -1136,15 +1147,15 @@ int smu_v11_0_gfx_off_control(struct smu_context *smu, bool enable)  	int ret = 0;  	struct amdgpu_device *adev = smu->adev; -	switch (adev->asic_type) { -	case CHIP_NAVI10: -	case CHIP_NAVI14: -	case CHIP_NAVI12: -	case CHIP_SIENNA_CICHLID: -	case CHIP_NAVY_FLOUNDER: -	case CHIP_DIMGREY_CAVEFISH: -	case CHIP_BEIGE_GOBY: -	case CHIP_VANGOGH: +	switch (adev->ip_versions[MP1_HWIP][0]) { +	case IP_VERSION(11, 0, 0): +	case IP_VERSION(11, 0, 5): +	case IP_VERSION(11, 0, 9): +	case IP_VERSION(11, 0, 7): +	case IP_VERSION(11, 0, 11): +	case IP_VERSION(11, 0, 12): +	case IP_VERSION(11, 0, 13): +	case IP_VERSION(11, 5, 0):  		if (!(adev->pm.pp_feature & PP_GFXOFF_MASK))  			return 0;  		if (enable) @@ -1630,11 +1641,11 @@ int smu_v11_0_baco_set_state(struct smu_context *smu, enum smu_baco_state state)  	mutex_lock(&smu_baco->mutex);  	if (state == SMU_BACO_STATE_ENTER) { -		switch (adev->asic_type) { -		case CHIP_SIENNA_CICHLID: -		case CHIP_NAVY_FLOUNDER: -		case CHIP_DIMGREY_CAVEFISH: -		case CHIP_BEIGE_GOBY: +		switch (adev->ip_versions[MP1_HWIP][0]) { +		case IP_VERSION(11, 0, 7): +		case IP_VERSION(11, 0, 11): +		case IP_VERSION(11, 0, 12): +		case IP_VERSION(11, 0, 13):  			if (amdgpu_runtime_pm == 2)  				ret = smu_cmn_send_smc_msg_with_param(smu,  								      SMU_MSG_EnterBaco, @@ -1649,7 +1660,7 @@ int smu_v11_0_baco_set_state(struct smu_context *smu, enum smu_baco_state state)  		default:  			if (!ras || !adev->ras_enabled ||  			    adev->gmc.xgmi.pending_reset) { -				if (adev->asic_type == CHIP_ARCTURUS) { +				if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 2)) {  					data = RREG32_SOC15(THM, 0, mmTHM_BACO_CNTL_ARCT);  					data |= 0x80000000;  					WREG32_SOC15(THM, 0, mmTHM_BACO_CNTL_ARCT, data); @@ -1931,7 +1942,7 @@ int smu_v11_0_set_performance_level(struct smu_context *smu,  	 * Separate MCLK and SOCCLK soft min/max settings are not allowed  	 * on Arcturus.  	 */ -	if (adev->asic_type == CHIP_ARCTURUS) { +	if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(11, 0, 2)) {  		mclk_min = mclk_max = 0;  		socclk_min = socclk_max = 0;  	} diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c index f6ef0ce6e9e2..421f38e8dada 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c @@ -1386,52 +1386,38 @@ static int vangogh_set_performance_level(struct smu_context *smu,  	uint32_t soc_mask, mclk_mask, fclk_mask;  	uint32_t vclk_mask = 0, dclk_mask = 0; +	smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq; +	smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq; +  	switch (level) {  	case AMD_DPM_FORCED_LEVEL_HIGH: -		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq; +		smu->gfx_actual_hard_min_freq = smu->gfx_default_soft_max_freq;  		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq; -		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq; -		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq;  		ret = vangogh_force_dpm_limit_value(smu, true); +		if (ret) +			return ret;  		break;  	case AMD_DPM_FORCED_LEVEL_LOW:  		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq; -		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq; - -		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq; -		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq; +		smu->gfx_actual_soft_max_freq = smu->gfx_default_hard_min_freq;  		ret = vangogh_force_dpm_limit_value(smu, false); +		if (ret) +			return ret;  		break;  	case AMD_DPM_FORCED_LEVEL_AUTO:  		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq;  		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq; -		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq; -		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq; -  		ret = vangogh_unforce_dpm_levels(smu); -		break; -	case AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD: -		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq; -		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq; - -		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq; -		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq; - -		ret = smu_cmn_send_smc_msg_with_param(smu, -					SMU_MSG_SetHardMinGfxClk, -					VANGOGH_UMD_PSTATE_STANDARD_GFXCLK, NULL); -		if (ret) -			return ret; - -		ret = smu_cmn_send_smc_msg_with_param(smu, -					SMU_MSG_SetSoftMaxGfxClk, -					VANGOGH_UMD_PSTATE_STANDARD_GFXCLK, NULL);  		if (ret)  			return ret; +		break; +	case AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD: +		smu->gfx_actual_hard_min_freq = VANGOGH_UMD_PSTATE_STANDARD_GFXCLK; +		smu->gfx_actual_soft_max_freq = VANGOGH_UMD_PSTATE_STANDARD_GFXCLK;  		ret = vangogh_get_profiling_clk_mask(smu, level,  							&vclk_mask, @@ -1446,32 +1432,15 @@ static int vangogh_set_performance_level(struct smu_context *smu,  		vangogh_force_clk_levels(smu, SMU_SOCCLK, 1 << soc_mask);  		vangogh_force_clk_levels(smu, SMU_VCLK, 1 << vclk_mask);  		vangogh_force_clk_levels(smu, SMU_DCLK, 1 << dclk_mask); -  		break;  	case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK:  		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq; -		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq; - -		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq; -		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq; - -		ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetHardMinVcn, -								VANGOGH_UMD_PSTATE_PEAK_DCLK, NULL); -		if (ret) -			return ret; - -		ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetSoftMaxVcn, -								VANGOGH_UMD_PSTATE_PEAK_DCLK, NULL); -		if (ret) -			return ret; +		smu->gfx_actual_soft_max_freq = smu->gfx_default_hard_min_freq;  		break;  	case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK:  		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq;  		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq; -		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq; -		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq; -  		ret = vangogh_get_profiling_clk_mask(smu, level,  							NULL,  							NULL, @@ -1484,29 +1453,29 @@ static int vangogh_set_performance_level(struct smu_context *smu,  		vangogh_force_clk_levels(smu, SMU_FCLK, 1 << fclk_mask);  		break;  	case AMD_DPM_FORCED_LEVEL_PROFILE_PEAK: -		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq; -		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq; - -		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq; -		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq; - -		ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetHardMinGfxClk, -				VANGOGH_UMD_PSTATE_PEAK_GFXCLK, NULL); -		if (ret) -			return ret; +		smu->gfx_actual_hard_min_freq = VANGOGH_UMD_PSTATE_PEAK_GFXCLK; +		smu->gfx_actual_soft_max_freq = VANGOGH_UMD_PSTATE_PEAK_GFXCLK; -		ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetSoftMaxGfxClk, -				VANGOGH_UMD_PSTATE_PEAK_GFXCLK, NULL); +		ret = vangogh_set_peak_clock_by_device(smu);  		if (ret)  			return ret; - -		ret = vangogh_set_peak_clock_by_device(smu);  		break;  	case AMD_DPM_FORCED_LEVEL_MANUAL:  	case AMD_DPM_FORCED_LEVEL_PROFILE_EXIT:  	default: -		break; +		return 0;  	} + +	ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetHardMinGfxClk, +					      smu->gfx_actual_hard_min_freq, NULL); +	if (ret) +		return ret; + +	ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetSoftMaxGfxClk, +					      smu->gfx_actual_soft_max_freq, NULL); +	if (ret) +		return ret; +  	return ret;  } @@ -2144,11 +2113,12 @@ static int vangogh_get_ppt_limit(struct smu_context *smu,  	return 0;  } -static int vangogh_set_power_limit(struct smu_context *smu, uint32_t ppt_limit) +static int vangogh_set_power_limit(struct smu_context *smu, +				   enum smu_ppt_limit_type limit_type, +				   uint32_t ppt_limit)  {  	struct smu_11_5_power_context *power_context = -							smu->smu_power.power_context; -	uint32_t limit_type = ppt_limit >> 24; +			smu->smu_power.power_context;  	int ret = 0;  	if (!smu_cmn_feature_is_enabled(smu, SMU_FEATURE_PPT_BIT)) { diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c index 5019903db492..59a7d276541d 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c @@ -1241,11 +1241,13 @@ static int aldebaran_get_power_limit(struct smu_context *smu,  	return 0;  } -static int aldebaran_set_power_limit(struct smu_context *smu, uint32_t n) +static int aldebaran_set_power_limit(struct smu_context *smu, +				     enum smu_ppt_limit_type limit_type, +				     uint32_t limit)  {  	/* Power limit can be set only through primary die */  	if (aldebaran_is_primary(smu)) -		return smu_v13_0_set_power_limit(smu, n); +		return smu_v13_0_set_power_limit(smu, limit_type, limit);  	return -EINVAL;  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c index a0e50f23b1dd..35145db6eedf 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c @@ -89,12 +89,13 @@ int smu_v13_0_init_microcode(struct smu_context *smu)  	if (amdgpu_sriov_vf(adev))  		return 0; -	switch (adev->asic_type) { -	case CHIP_ALDEBARAN: +	switch (adev->ip_versions[MP1_HWIP][0]) { +	case IP_VERSION(13, 0, 2):  		chip_name = "aldebaran";  		break;  	default: -		dev_err(adev->dev, "Unsupported ASIC type %d\n", adev->asic_type); +		dev_err(adev->dev, "Unsupported IP version 0x%x\n", +			adev->ip_versions[MP1_HWIP][0]);  		return -EINVAL;  	} @@ -210,15 +211,17 @@ int smu_v13_0_check_fw_version(struct smu_context *smu)  	smu_minor = (smu_version >> 8) & 0xff;  	smu_debug = (smu_version >> 0) & 0xff; -	switch (smu->adev->asic_type) { -	case CHIP_ALDEBARAN: +	switch (smu->adev->ip_versions[MP1_HWIP][0]) { +	case IP_VERSION(13, 0, 2):  		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_ALDE;  		break; -	case CHIP_YELLOW_CARP: +	case IP_VERSION(13, 0, 1): +	case IP_VERSION(13, 0, 3):  		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_YELLOW_CARP;  		break;  	default: -		dev_err(smu->adev->dev, "smu unsupported asic type:%d.\n", smu->adev->asic_type); +		dev_err(smu->adev->dev, "smu unsupported IP version: 0x%x.\n", +			smu->adev->ip_versions[MP1_HWIP][0]);  		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_INV;  		break;  	} @@ -740,8 +743,9 @@ int smu_v13_0_gfx_off_control(struct smu_context *smu, bool enable)  	int ret = 0;  	struct amdgpu_device *adev = smu->adev; -	switch (adev->asic_type) { -	case CHIP_YELLOW_CARP: +	switch (adev->ip_versions[MP1_HWIP][0]) { +	case IP_VERSION(13, 0, 1): +	case IP_VERSION(13, 0, 3):  		if (!(adev->pm.pp_feature & PP_GFXOFF_MASK))  			return 0;  		if (enable) @@ -941,22 +945,27 @@ int smu_v13_0_get_current_power_limit(struct smu_context *smu,  	return ret;  } -int smu_v13_0_set_power_limit(struct smu_context *smu, uint32_t n) +int smu_v13_0_set_power_limit(struct smu_context *smu, +			      enum smu_ppt_limit_type limit_type, +			      uint32_t limit)  {  	int ret = 0; +	if (limit_type != SMU_DEFAULT_PPT_LIMIT) +		return -EINVAL; +  	if (!smu_cmn_feature_is_enabled(smu, SMU_FEATURE_PPT_BIT)) {  		dev_err(smu->adev->dev, "Setting new power limit is not supported!\n");  		return -EOPNOTSUPP;  	} -	ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetPptLimit, n, NULL); +	ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetPptLimit, limit, NULL);  	if (ret) {  		dev_err(smu->adev->dev, "[%s] Set power limit Failed!\n", __func__);  		return ret;  	} -	smu->current_power_limit = n; +	smu->current_power_limit = limit;  	return 0;  } | 
