diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/nv.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/nv.c | 51 | 
1 files changed, 41 insertions, 10 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c index 0ba66bef5746..2d1bebdf1603 100644 --- a/drivers/gpu/drm/amd/amdgpu/nv.c +++ b/drivers/gpu/drm/amd/amdgpu/nv.c @@ -53,6 +53,7 @@  #include "gfx_v10_0.h"  #include "sdma_v5_0.h"  #include "vcn_v2_0.h" +#include "jpeg_v2_0.h"  #include "dce_virtual.h"  #include "mes_v10_1.h"  #include "mxgpu_nv.h" @@ -314,6 +315,16 @@ static int nv_asic_mode1_reset(struct amdgpu_device *adev)  	return ret;  } +static bool nv_asic_supports_baco(struct amdgpu_device *adev) +{ +	struct smu_context *smu = &adev->smu; + +	if (smu_baco_is_support(smu)) +		return true; +	else +		return false; +} +  static enum amd_reset_method  nv_asic_reset_method(struct amdgpu_device *adev)  { @@ -342,7 +353,12 @@ static int nv_asic_reset(struct amdgpu_device *adev)  	if (nv_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {  		if (!adev->in_suspend)  			amdgpu_inc_vram_lost(adev); -		ret = smu_baco_reset(smu); +		ret = smu_baco_enter(smu); +		if (ret) +			return ret; +		ret = smu_baco_exit(smu); +		if (ret) +			return ret;  	} else {  		if (!adev->in_suspend)  			amdgpu_inc_vram_lost(adev); @@ -462,7 +478,7 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)  		amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block);  		amdgpu_device_ip_block_add(adev, &psp_v11_0_ip_block);  		if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP && -		    is_support_sw_smu(adev) && !amdgpu_sriov_vf(adev)) +		    !amdgpu_sriov_vf(adev))  			amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);  		if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))  			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); @@ -473,9 +489,10 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)  		amdgpu_device_ip_block_add(adev, &gfx_v10_0_ip_block);  		amdgpu_device_ip_block_add(adev, &sdma_v5_0_ip_block);  		if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT && -		    is_support_sw_smu(adev) && !amdgpu_sriov_vf(adev)) +		    !amdgpu_sriov_vf(adev))  			amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);  		amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block); +		amdgpu_device_ip_block_add(adev, &jpeg_v2_0_ip_block);  		if (adev->enable_mes)  			amdgpu_device_ip_block_add(adev, &mes_v10_1_ip_block);  		break; @@ -485,7 +502,7 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)  		amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block);  		amdgpu_device_ip_block_add(adev, &psp_v11_0_ip_block);  		if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP && -		    is_support_sw_smu(adev) && !amdgpu_sriov_vf(adev)) +		    !amdgpu_sriov_vf(adev))  			amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);  		if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))  			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); @@ -496,9 +513,10 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)  		amdgpu_device_ip_block_add(adev, &gfx_v10_0_ip_block);  		amdgpu_device_ip_block_add(adev, &sdma_v5_0_ip_block);  		if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT && -		    is_support_sw_smu(adev) && !amdgpu_sriov_vf(adev)) +		    !amdgpu_sriov_vf(adev))  			amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);  		amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block); +		amdgpu_device_ip_block_add(adev, &jpeg_v2_0_ip_block);  		break;  	default:  		return -EINVAL; @@ -617,6 +635,7 @@ static const struct amdgpu_asic_funcs nv_asic_funcs =  	.get_pcie_usage = &nv_get_pcie_usage,  	.need_reset_on_init = &nv_need_reset_on_init,  	.get_pcie_replay_count = &nv_get_pcie_replay_count, +	.supports_baco = &nv_asic_supports_baco,  };  static int nv_common_early_init(void *handle) @@ -656,10 +675,12 @@ static int nv_common_early_init(void *handle)  			AMD_CG_SUPPORT_ATHUB_MGCG |  			AMD_CG_SUPPORT_ATHUB_LS |  			AMD_CG_SUPPORT_VCN_MGCG | +			AMD_CG_SUPPORT_JPEG_MGCG |  			AMD_CG_SUPPORT_BIF_MGCG |  			AMD_CG_SUPPORT_BIF_LS;  		adev->pg_flags = AMD_PG_SUPPORT_VCN |  			AMD_PG_SUPPORT_VCN_DPG | +			AMD_PG_SUPPORT_JPEG |  			AMD_PG_SUPPORT_ATHUB;  		adev->external_rev_id = adev->rev_id + 0x1;  		break; @@ -676,9 +697,11 @@ static int nv_common_early_init(void *handle)  			AMD_CG_SUPPORT_ATHUB_MGCG |  			AMD_CG_SUPPORT_ATHUB_LS |  			AMD_CG_SUPPORT_VCN_MGCG | +			AMD_CG_SUPPORT_JPEG_MGCG |  			AMD_CG_SUPPORT_BIF_MGCG |  			AMD_CG_SUPPORT_BIF_LS;  		adev->pg_flags = AMD_PG_SUPPORT_VCN | +			AMD_PG_SUPPORT_JPEG |  			AMD_PG_SUPPORT_VCN_DPG;  		adev->external_rev_id = adev->rev_id + 20;  		break; @@ -697,10 +720,18 @@ static int nv_common_early_init(void *handle)  			AMD_CG_SUPPORT_MC_LS |  			AMD_CG_SUPPORT_ATHUB_MGCG |  			AMD_CG_SUPPORT_ATHUB_LS | -			AMD_CG_SUPPORT_VCN_MGCG; +			AMD_CG_SUPPORT_VCN_MGCG | +			AMD_CG_SUPPORT_JPEG_MGCG;  		adev->pg_flags = AMD_PG_SUPPORT_VCN |  			AMD_PG_SUPPORT_VCN_DPG | +			AMD_PG_SUPPORT_JPEG |  			AMD_PG_SUPPORT_ATHUB; +		/* guest vm gets 0xffffffff when reading RCC_DEV0_EPF0_STRAP0, +		 * as a consequence, the rev_id and external_rev_id are wrong. +		 * workaround it by hardcoding rev_id to 0 (default value). +		 */ +		if (amdgpu_sriov_vf(adev)) +			adev->rev_id = 0;  		adev->external_rev_id = adev->rev_id + 0xa;  		break;  	default: @@ -919,13 +950,13 @@ static int nv_common_set_clockgating_state(void *handle,  	case CHIP_NAVI14:  	case CHIP_NAVI12:  		adev->nbio.funcs->update_medium_grain_clock_gating(adev, -				state == AMD_CG_STATE_GATE ? true : false); +				state == AMD_CG_STATE_GATE);  		adev->nbio.funcs->update_medium_grain_light_sleep(adev, -				state == AMD_CG_STATE_GATE ? true : false); +				state == AMD_CG_STATE_GATE);  		nv_update_hdp_mem_power_gating(adev, -				   state == AMD_CG_STATE_GATE ? true : false); +				   state == AMD_CG_STATE_GATE);  		nv_update_hdp_clock_gating(adev, -				state == AMD_CG_STATE_GATE ? true : false); +				state == AMD_CG_STATE_GATE);  		break;  	default:  		break; | 
