On Tue, Sep 16, 2025 at 12:47:43PM +0800, Hermes Wu via B4 Relay wrote:
> From: Hermes Wu <hermes...@ite.com.tw>
> 
> IT6505 supports HW link training which will write DPCD and check
> training status automatically.
> 
> In the case that driver set link rate at 2.7G and HW fail to training,
> it will change link configuration and try 1.65G. And this will cause
> INT_VID_FIFO_ERROR triggered when link clock is changed.
> 
> When video error occurs, video logic is reset and link training restart,
> this will cause endless auto link training.
> 
> Modify link auto training with disable INT_VID_FIFO_ERROR to avoid loop
> and check INT_LINK_TRAIN_FAIL event to abort wait training done.
> 
> Signed-off-by: Hermes Wu <hermes...@ite.com.tw>
> ---
>  drivers/gpu/drm/bridge/ite-it6505.c | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/bridge/ite-it6505.c 
> b/drivers/gpu/drm/bridge/ite-it6505.c
> index 
> 7f6227c278a51358c70a3de93454aafeef64f2bb..f9b99c70789eea6beb3c6513155c9a4ca103d219
>  100644
> --- a/drivers/gpu/drm/bridge/ite-it6505.c
> +++ b/drivers/gpu/drm/bridge/ite-it6505.c
> @@ -1806,6 +1806,13 @@ static bool it6505_link_start_auto_train(struct it6505 
> *it6505)
>       struct device *dev = it6505->dev;
>  
>       mutex_lock(&it6505->aux_lock);
> +
> +     /* Disable FIFO error interrupt trigger  */
> +     /* to prevent training fail loop issue   */
> +     it6505_set_bits(it6505, INT_MASK_03, BIT(INT_VID_FIFO_ERROR), 0);
> +
> +     it6505_write(it6505, INT_STATUS_03,
> +                  BIT(INT_LINK_TRAIN_FAIL) | BIT(INT_VID_FIFO_ERROR));
>       it6505_set_bits(it6505, REG_TRAIN_CTRL0,
>                       FORCE_CR_DONE | FORCE_EQ_DONE, 0x00);
>       /* reset link state machine and re start training*/
> @@ -1818,8 +1825,10 @@ static bool it6505_link_start_auto_train(struct it6505 
> *it6505)
>               link_training_state = it6505_read(it6505, REG_LINK_TRAIN_STS);
>               int03 = it6505_read(it6505, INT_STATUS_03);
>               if (int03 & BIT(INT_LINK_TRAIN_FAIL)) {
> +                     /* Ignore INT_VID_FIFO_ERROR when auto training fail*/
>                       it6505_write(it6505, INT_STATUS_03,
> -                                  BIT(INT_LINK_TRAIN_FAIL));
> +                                  BIT(INT_LINK_TRAIN_FAIL) |
> +                                  BIT(INT_VID_FIFO_ERROR));

I'm really unusure about this change. Judging by the description of the
problem, it's fix for the issue, but the issue gets introduced in the
previous patch.

>  
>                       DRM_DEV_DEBUG_DRIVER(dev,
>                                            "INT_LINK_TRAIN_FAIL(%x)!",
> @@ -1837,6 +1846,9 @@ static bool it6505_link_start_auto_train(struct it6505 
> *it6505)
>               timeout--;
>       }
>  unlock:
> +     /* recover interrupt trigger*/
> +     it6505_set_bits(it6505, INT_MASK_03,
> +                     BIT(INT_VID_FIFO_ERROR), BIT(INT_VID_FIFO_ERROR));
>       mutex_unlock(&it6505->aux_lock);
>  
>       return state;
> 
> -- 
> 2.34.1
> 
> 

-- 
With best wishes
Dmitry

Reply via email to