Loading drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c +12 −4 Original line number Diff line number Diff line Loading @@ -1061,6 +1061,7 @@ static int _sde_encoder_phys_cmd_wait_for_ctl_start( to_sde_encoder_phys_cmd(phys_enc); struct sde_encoder_wait_info wait_info; int ret; bool frame_pending = true; if (!phys_enc || !phys_enc->hw_ctl) { SDE_ERROR("invalid argument(s)\n"); Loading @@ -1078,10 +1079,17 @@ static int _sde_encoder_phys_cmd_wait_for_ctl_start( ret = sde_encoder_helper_wait_for_irq(phys_enc, INTR_IDX_CTL_START, &wait_info); if (ret == -ETIMEDOUT) { SDE_ERROR_CMDENC(cmd_enc, "ctl start interrupt wait failed\n"); ret = -EINVAL; } else if (!ret) struct sde_hw_ctl *ctl = phys_enc->hw_ctl; if (ctl && ctl->ops.get_start_state) frame_pending = ctl->ops.get_start_state(ctl); if (frame_pending) SDE_ERROR_CMDENC(cmd_enc, "ctl start interrupt wait failed\n"); else ret = 0; } return ret; } Loading drivers/gpu/drm/msm/sde/sde_hw_ctl.c +6 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,11 @@ static inline void sde_hw_ctl_trigger_start(struct sde_hw_ctl *ctx) SDE_REG_WRITE(&ctx->hw, CTL_START, 0x1); } static inline int sde_hw_ctl_get_start_state(struct sde_hw_ctl *ctx) { return SDE_REG_READ(&ctx->hw, CTL_START); } static inline void sde_hw_ctl_trigger_pending(struct sde_hw_ctl *ctx) { SDE_REG_WRITE(&ctx->hw, CTL_PREPARE, 0x1); Loading Loading @@ -649,6 +654,7 @@ static void _setup_ctl_ops(struct sde_hw_ctl_ops *ops, ops->get_bitmask_cdm = sde_hw_ctl_get_bitmask_cdm; ops->get_bitmask_wb = sde_hw_ctl_get_bitmask_wb; ops->reg_dma_flush = sde_hw_reg_dma_flush; ops->get_start_state = sde_hw_ctl_get_start_state; if (cap & BIT(SDE_CTL_SBUF)) { ops->get_bitmask_rot = sde_hw_ctl_get_bitmask_rot; Loading drivers/gpu/drm/msm/sde/sde_hw_ctl.h +6 −0 Original line number Diff line number Diff line Loading @@ -225,6 +225,12 @@ struct sde_hw_ctl_ops { */ void (*reg_dma_flush)(struct sde_hw_ctl *ctx, bool blocking); /** * check if ctl start trigger state to confirm the frame pending * status * @ctx : ctl path ctx pointer */ int (*get_start_state)(struct sde_hw_ctl *ctx); }; /** Loading Loading
drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c +12 −4 Original line number Diff line number Diff line Loading @@ -1061,6 +1061,7 @@ static int _sde_encoder_phys_cmd_wait_for_ctl_start( to_sde_encoder_phys_cmd(phys_enc); struct sde_encoder_wait_info wait_info; int ret; bool frame_pending = true; if (!phys_enc || !phys_enc->hw_ctl) { SDE_ERROR("invalid argument(s)\n"); Loading @@ -1078,10 +1079,17 @@ static int _sde_encoder_phys_cmd_wait_for_ctl_start( ret = sde_encoder_helper_wait_for_irq(phys_enc, INTR_IDX_CTL_START, &wait_info); if (ret == -ETIMEDOUT) { SDE_ERROR_CMDENC(cmd_enc, "ctl start interrupt wait failed\n"); ret = -EINVAL; } else if (!ret) struct sde_hw_ctl *ctl = phys_enc->hw_ctl; if (ctl && ctl->ops.get_start_state) frame_pending = ctl->ops.get_start_state(ctl); if (frame_pending) SDE_ERROR_CMDENC(cmd_enc, "ctl start interrupt wait failed\n"); else ret = 0; } return ret; } Loading
drivers/gpu/drm/msm/sde/sde_hw_ctl.c +6 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,11 @@ static inline void sde_hw_ctl_trigger_start(struct sde_hw_ctl *ctx) SDE_REG_WRITE(&ctx->hw, CTL_START, 0x1); } static inline int sde_hw_ctl_get_start_state(struct sde_hw_ctl *ctx) { return SDE_REG_READ(&ctx->hw, CTL_START); } static inline void sde_hw_ctl_trigger_pending(struct sde_hw_ctl *ctx) { SDE_REG_WRITE(&ctx->hw, CTL_PREPARE, 0x1); Loading Loading @@ -649,6 +654,7 @@ static void _setup_ctl_ops(struct sde_hw_ctl_ops *ops, ops->get_bitmask_cdm = sde_hw_ctl_get_bitmask_cdm; ops->get_bitmask_wb = sde_hw_ctl_get_bitmask_wb; ops->reg_dma_flush = sde_hw_reg_dma_flush; ops->get_start_state = sde_hw_ctl_get_start_state; if (cap & BIT(SDE_CTL_SBUF)) { ops->get_bitmask_rot = sde_hw_ctl_get_bitmask_rot; Loading
drivers/gpu/drm/msm/sde/sde_hw_ctl.h +6 −0 Original line number Diff line number Diff line Loading @@ -225,6 +225,12 @@ struct sde_hw_ctl_ops { */ void (*reg_dma_flush)(struct sde_hw_ctl *ctx, bool blocking); /** * check if ctl start trigger state to confirm the frame pending * status * @ctx : ctl path ctx pointer */ int (*get_start_state)(struct sde_hw_ctl *ctx); }; /** Loading