diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/cz_dpm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cz_dpm.c | 84 | 
1 files changed, 62 insertions, 22 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c index 1a2d419cbf16..2e3373ed4c94 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); +		}  	}  } @@ -558,6 +596,12 @@ static int cz_dpm_late_init(void *handle)  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;  	if (amdgpu_dpm) { +		int ret; +		/* init the sysfs and debugfs files late */ +		ret = amdgpu_pm_sysfs_init(adev); +		if (ret) +			return ret; +  		/* powerdown unused blocks for now */  		cz_dpm_powergate_uvd(adev, true);  		cz_dpm_powergate_vce(adev, true); @@ -594,10 +638,6 @@ static int cz_dpm_sw_init(void *handle)  	if (amdgpu_dpm == 1)  		amdgpu_pm_print_power_states(adev); -	ret = amdgpu_pm_sysfs_init(adev); -	if (ret) -		goto dpm_init_failed; -  	mutex_unlock(&adev->pm.mutex);  	DRM_INFO("amdgpu: dpm initialized\n"); @@ -1558,9 +1598,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; | 
