diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c | 20 | 
1 files changed, 14 insertions, 6 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c index c23d97d34b7e..5acd20ff5979 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c @@ -128,6 +128,7 @@ int amdgpu_vpe_configure_dpm(struct amdgpu_vpe *vpe)  		struct dpm_clock *VPEClks;  		struct dpm_clock *SOCClks;  		uint32_t idx; +		uint32_t vpeclk_enalbled_num = 0;  		uint32_t pratio_vmax_vnorm = 0, pratio_vnorm_vmid = 0, pratio_vmid_vmin = 0;  		uint16_t pratio_vmin_freq = 0, pratio_vmid_freq = 0, pratio_vnorm_freq = 0, pratio_vmax_freq = 0; @@ -144,6 +145,14 @@ int amdgpu_vpe_configure_dpm(struct amdgpu_vpe *vpe)  		SOCClks = clock_table.SocClocks;  		VPEClks = clock_table.VPEClocks; +		/* Comfirm enabled vpe clk num +		 * Enabled VPE clocks are ordered from low to high in VPEClks +		 * The highest valid clock index+1 is the number of VPEClks +		 */ +		for (idx = PP_SMU_NUM_VPECLK_DPM_LEVELS; idx && !vpeclk_enalbled_num; idx--) +			if (VPEClks[idx-1].Freq) +				vpeclk_enalbled_num = idx; +  		/* vpe dpm only cares 4 levels. */  		for (idx = 0; idx < VPE_MAX_DPM_LEVEL; idx++) {  			uint32_t soc_dpm_level; @@ -155,8 +164,8 @@ int amdgpu_vpe_configure_dpm(struct amdgpu_vpe *vpe)  				soc_dpm_level = (idx * 2) + 1;  			/* clamp the max level */ -			if (soc_dpm_level > PP_SMU_NUM_VPECLK_DPM_LEVELS - 1) -				soc_dpm_level = PP_SMU_NUM_VPECLK_DPM_LEVELS - 1; +			if (soc_dpm_level > vpeclk_enalbled_num - 1) +				soc_dpm_level = vpeclk_enalbled_num - 1;  			min_freq = (SOCClks[soc_dpm_level].Freq < VPEClks[soc_dpm_level].Freq) ?  				   SOCClks[soc_dpm_level].Freq : VPEClks[soc_dpm_level].Freq; @@ -223,13 +232,11 @@ int amdgpu_vpe_init_microcode(struct amdgpu_vpe *vpe)  {  	struct amdgpu_device *adev = vpe->ring.adev;  	const struct vpe_firmware_header_v1_0 *vpe_hdr; -	char fw_prefix[32], fw_name[64]; +	char fw_prefix[32];  	int ret;  	amdgpu_ucode_ip_version_decode(adev, VPE_HWIP, fw_prefix, sizeof(fw_prefix)); -	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s.bin", fw_prefix); - -	ret = amdgpu_ucode_request(adev, &adev->vpe.fw, fw_name); +	ret = amdgpu_ucode_request(adev, &adev->vpe.fw, "amdgpu/%s.bin", fw_prefix);  	if (ret)  		goto out; @@ -295,6 +302,7 @@ static int vpe_early_init(void *handle)  	switch (amdgpu_ip_version(adev, VPE_HWIP, 0)) {  	case IP_VERSION(6, 1, 0): +	case IP_VERSION(6, 1, 3):  		vpe_v6_1_set_funcs(vpe);  		break;  	case IP_VERSION(6, 1, 1): |