[PATCH] drm/amd/display: Cap pflip irqs per max otg number

Kazlauskas, Nicholas nicholas.kazlauskas at amd.com
Thu Feb 3 22:54:04 UTC 2022


On 2/3/2022 5:14 PM, Roman.Li at amd.com wrote:
> From: Roman Li <Roman.Li at amd.com>
> 
> [Why]
> pflip interrupt order are mapped 1 to 1 to otg id.
> e.g. if irq_src=26 corresponds to otg0 then 27->otg1, 28->otg2...
> 
> Linux DM registers pflip interrupts per number of crtcs.
> In fused pipe case crtc numbers can be less than otg id.
> 
> e.g. if one pipe out of 3(otg#0-2) is fused adev->mode_info.num_crtc=2
> so DM only registers irq_src 26,27.
> This is a bug since if pipe#2 remains unfused DM never gets
> otg2 pflip interrupt (irq_src=28)
> That may results in gfx failure due to pflip timeout.
> 
> [How]
> Register pflip interrupts per max num of otg instead of num_crtc
> 
> Signed-off-by: Roman Li <Roman.Li at amd.com>

Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>

Regards,
Nicholas Kazlauskas

> ---
>   drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +-
>   drivers/gpu/drm/amd/display/dc/core/dc.c          | 2 ++
>   drivers/gpu/drm/amd/display/dc/dc.h               | 1 +
>   3 files changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index 8f53c9f..10ca3fc 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -3646,7 +3646,7 @@ static int dcn10_register_irq_handlers(struct amdgpu_device *adev)
>   
>   	/* Use GRPH_PFLIP interrupt */
>   	for (i = DCN_1_0__SRCID__HUBP0_FLIP_INTERRUPT;
> -			i <= DCN_1_0__SRCID__HUBP0_FLIP_INTERRUPT + adev->mode_info.num_crtc - 1;
> +			i <= DCN_1_0__SRCID__HUBP0_FLIP_INTERRUPT + dc->caps.max_otg_num - 1;
>   			i++) {
>   		r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_DCE, i, &adev->pageflip_irq);
>   		if (r) {
> diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
> index 1d9404f..70a0b89 100644
> --- a/drivers/gpu/drm/amd/display/dc/core/dc.c
> +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
> @@ -1220,6 +1220,8 @@ struct dc *dc_create(const struct dc_init_data *init_params)
>   
>   		dc->caps.max_dp_protocol_version = DP_VERSION_1_4;
>   
> +		dc->caps.max_otg_num = dc->res_pool->res_cap->num_timing_generator;
> +
>   		if (dc->res_pool->dmcu != NULL)
>   			dc->versions.dmcu_version = dc->res_pool->dmcu->dmcu_version;
>   	}
> diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
> index 69d264d..af05877 100644
> --- a/drivers/gpu/drm/amd/display/dc/dc.h
> +++ b/drivers/gpu/drm/amd/display/dc/dc.h
> @@ -200,6 +200,7 @@ struct dc_caps {
>   	bool edp_dsc_support;
>   	bool vbios_lttpr_aware;
>   	bool vbios_lttpr_enable;
> +	uint32_t max_otg_num;
>   };
>   
>   struct dc_bug_wa {



More information about the amd-gfx mailing list