[PATCH] drm/amdgpu: add JPEG check to VCN idle handler and begin use

Christian König ckoenig.leichtzumerken at gmail.com
Thu Dec 12 08:18:30 UTC 2019


Am 11.12.19 um 20:48 schrieb Leo Liu:
> Since it's only needed with VCN1.0 when HW has no its
> own JPEG HW IP block

Wouldn't it be simpler/cleaner to just define a 
vcn_v1_0_ring_begin_use() and vcn_v1_0_idle_work_handler() instead?

Regards,
Christian.

>
> Signed-off-by: Leo Liu <leo.liu at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 29 +++++++++++++++----------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h |  2 ++
>   2 files changed, 20 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> index 428cfd58b37d..95ac721f2de0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
> @@ -186,6 +186,9 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
>   		}
>   	}
>   
> +	adev->vcn.has_jpeg_block = (amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_JPEG)) ?
> +		true : false;
> +
>   	return 0;
>   }
>   
> @@ -306,15 +309,17 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)
>   			else
>   				new_state.fw_based = VCN_DPG_STATE__UNPAUSE;
>   
> -			if (amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec))
> -				new_state.jpeg = VCN_DPG_STATE__PAUSE;
> -			else
> -				new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
> -
> +			if (!adev->vcn.has_jpeg_block) {
> +				if (amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec))
> +					new_state.jpeg = VCN_DPG_STATE__PAUSE;
> +				else
> +					new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
> +			}
>   			adev->vcn.pause_dpg_mode(adev, &new_state);
>   		}
>   
> -		fence[j] += amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec);
> +		if (!adev->vcn.has_jpeg_block)
> +			fence[j] += amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec);
>   		fence[j] += amdgpu_fence_count_emitted(&adev->vcn.inst[j].ring_dec);
>   		fences += fence[j];
>   	}
> @@ -358,14 +363,16 @@ void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring)
>   		else
>   			new_state.fw_based = VCN_DPG_STATE__UNPAUSE;
>   
> -		if (amdgpu_fence_count_emitted(&adev->jpeg.inst[ring->me].ring_dec))
> -			new_state.jpeg = VCN_DPG_STATE__PAUSE;
> -		else
> -			new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
> +		if (!adev->vcn.has_jpeg_block) {
> +			if (amdgpu_fence_count_emitted(&adev->jpeg.inst[ring->me].ring_dec))
> +				new_state.jpeg = VCN_DPG_STATE__PAUSE;
> +			else
> +				new_state.jpeg = VCN_DPG_STATE__UNPAUSE;
> +		}
>   
>   		if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC)
>   			new_state.fw_based = VCN_DPG_STATE__PAUSE;
> -		else if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_JPEG)
> +		else if (!adev->vcn.has_jpeg_block && ring->funcs->type == AMDGPU_RING_TYPE_VCN_JPEG)
>   			new_state.jpeg = VCN_DPG_STATE__PAUSE;
>   
>   		adev->vcn.pause_dpg_mode(adev, &new_state);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
> index 402a5046b985..9a2381d006c6 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
> @@ -192,6 +192,8 @@ struct amdgpu_vcn {
>   	unsigned	harvest_config;
>   	int (*pause_dpg_mode)(struct amdgpu_device *adev,
>   		struct dpg_pause_state *new_state);
> +
> +	bool has_jpeg_block;
>   };
>   
>   int amdgpu_vcn_sw_init(struct amdgpu_device *adev);



More information about the amd-gfx mailing list