diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /drivers/gpu/drm/amd/amdgpu/cz_dpm.c | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/cz_dpm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cz_dpm.c | 90 | 
1 files changed, 68 insertions, 22 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c index f75a31df30bd..44fa96ad4709 100644 --- a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c @@ -494,29 +494,67 @@ static void cz_dpm_fini(struct amdgpu_device *adev)  	amdgpu_free_extended_power_table(adev);  } +#define ixSMUSVI_NB_CURRENTVID 0xD8230044 +#define CURRENT_NB_VID_MASK 0xff000000 +#define CURRENT_NB_VID__SHIFT 24 +#define ixSMUSVI_GFX_CURRENTVID  0xD8230048 +#define CURRENT_GFX_VID_MASK 0xff000000 +#define CURRENT_GFX_VID__SHIFT 24 +  static void  cz_dpm_debugfs_print_current_performance_level(struct amdgpu_device *adev,  					       struct seq_file *m)  { +	struct cz_power_info *pi = cz_get_pi(adev);  	struct amdgpu_clock_voltage_dependency_table *table =  		&adev->pm.dpm.dyn_state.vddc_dependency_on_sclk; -	u32 current_index = -		(RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX) & -		TARGET_AND_CURRENT_PROFILE_INDEX__CURR_SCLK_INDEX_MASK) >> -		TARGET_AND_CURRENT_PROFILE_INDEX__CURR_SCLK_INDEX__SHIFT; -	u32 sclk, tmp; -	u16 vddc; - -	if (current_index >= NUM_SCLK_LEVELS) { -		seq_printf(m, "invalid dpm profile %d\n", current_index); +	struct amdgpu_uvd_clock_voltage_dependency_table *uvd_table = +		&adev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table; +	struct amdgpu_vce_clock_voltage_dependency_table *vce_table = +		&adev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table; +	u32 sclk_index = REG_GET_FIELD(RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX), +				       TARGET_AND_CURRENT_PROFILE_INDEX, CURR_SCLK_INDEX); +	u32 uvd_index = REG_GET_FIELD(RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX_2), +				      TARGET_AND_CURRENT_PROFILE_INDEX_2, CURR_UVD_INDEX); +	u32 vce_index = REG_GET_FIELD(RREG32_SMC(ixTARGET_AND_CURRENT_PROFILE_INDEX_2), +				      TARGET_AND_CURRENT_PROFILE_INDEX_2, CURR_VCE_INDEX); +	u32 sclk, vclk, dclk, ecclk, tmp; +	u16 vddnb, vddgfx; + +	if (sclk_index >= NUM_SCLK_LEVELS) { +		seq_printf(m, "invalid sclk dpm profile %d\n", sclk_index);  	} else { -		sclk = table->entries[current_index].clk; -		tmp = (RREG32_SMC(ixSMU_VOLTAGE_STATUS) & -			SMU_VOLTAGE_STATUS__SMU_VOLTAGE_CURRENT_LEVEL_MASK) >> -			SMU_VOLTAGE_STATUS__SMU_VOLTAGE_CURRENT_LEVEL__SHIFT; -		vddc = cz_convert_8bit_index_to_voltage(adev, (u16)tmp); -		seq_printf(m, "power level %d    sclk: %u vddc: %u\n", -			   current_index, sclk, vddc); +		sclk = table->entries[sclk_index].clk; +		seq_printf(m, "%u sclk: %u\n", sclk_index, sclk); +	} + +	tmp = (RREG32_SMC(ixSMUSVI_NB_CURRENTVID) & +	       CURRENT_NB_VID_MASK) >> CURRENT_NB_VID__SHIFT; +	vddnb = cz_convert_8bit_index_to_voltage(adev, (u16)tmp); +	tmp = (RREG32_SMC(ixSMUSVI_GFX_CURRENTVID) & +	       CURRENT_GFX_VID_MASK) >> CURRENT_GFX_VID__SHIFT; +	vddgfx = cz_convert_8bit_index_to_voltage(adev, (u16)tmp); +	seq_printf(m, "vddnb: %u vddgfx: %u\n", vddnb, vddgfx); + +	seq_printf(m, "uvd    %sabled\n", pi->uvd_power_gated ? "dis" : "en"); +	if (!pi->uvd_power_gated) { +		if (uvd_index >= CZ_MAX_HARDWARE_POWERLEVELS) { +			seq_printf(m, "invalid uvd dpm level %d\n", uvd_index); +		} else { +			vclk = uvd_table->entries[uvd_index].vclk; +			dclk = uvd_table->entries[uvd_index].dclk; +			seq_printf(m, "%u uvd vclk: %u dclk: %u\n", uvd_index, vclk, dclk); +		} +	} + +	seq_printf(m, "vce    %sabled\n", pi->vce_power_gated ? "dis" : "en"); +	if (!pi->vce_power_gated) { +		if (vce_index >= CZ_MAX_HARDWARE_POWERLEVELS) { +			seq_printf(m, "invalid vce dpm level %d\n", vce_index); +		} else { +			ecclk = vce_table->entries[vce_index].ecclk; +			seq_printf(m, "%u vce ecclk: %u\n", vce_index, ecclk); +		}  	}  } @@ -1558,9 +1596,9 @@ static int cz_dpm_update_low_memory_pstate(struct amdgpu_device *adev)  	if (pi->sys_info.nb_dpm_enable) {  		if (ps->force_high) -			cz_dpm_nbdpm_lm_pstate_enable(adev, true); -		else  			cz_dpm_nbdpm_lm_pstate_enable(adev, false); +		else +			cz_dpm_nbdpm_lm_pstate_enable(adev, true);  	}  	return ret; @@ -1679,25 +1717,31 @@ static int cz_dpm_unforce_dpm_levels(struct amdgpu_device *adev)  	if (ret)  		return ret; -	DRM_INFO("DPM unforce state min=%d, max=%d.\n", -			pi->sclk_dpm.soft_min_clk, -			pi->sclk_dpm.soft_max_clk); +	DRM_DEBUG("DPM unforce state min=%d, max=%d.\n", +		  pi->sclk_dpm.soft_min_clk, +		  pi->sclk_dpm.soft_max_clk);  	return 0;  }  static int cz_dpm_force_dpm_level(struct amdgpu_device *adev, -				enum amdgpu_dpm_forced_level level) +				  enum amdgpu_dpm_forced_level level)  {  	int ret = 0;  	switch (level) {  	case AMDGPU_DPM_FORCED_LEVEL_HIGH: +		ret = cz_dpm_unforce_dpm_levels(adev); +		if (ret) +			return ret;  		ret = cz_dpm_force_highest(adev);  		if (ret)  			return ret;  		break;  	case AMDGPU_DPM_FORCED_LEVEL_LOW: +		ret = cz_dpm_unforce_dpm_levels(adev); +		if (ret) +			return ret;  		ret = cz_dpm_force_lowest(adev);  		if (ret)  			return ret; @@ -1711,6 +1755,8 @@ static int cz_dpm_force_dpm_level(struct amdgpu_device *adev,  		break;  	} +	adev->pm.dpm.forced_level = level; +  	return ret;  }  |