|
@@ -330,8 +330,6 @@ static void _sde_encoder_phys_cmd_setup_irq_hw_idx(
|
|
|
{
|
|
|
struct sde_encoder_irq *irq;
|
|
|
struct sde_kms *sde_kms;
|
|
|
- int ret = 0;
|
|
|
- u32 vblank_refcount;
|
|
|
|
|
|
if (!phys_enc->sde_kms || !phys_enc->hw_pp || !phys_enc->hw_ctl) {
|
|
|
SDE_ERROR("invalid args %d %d %d\n", !phys_enc->sde_kms,
|
|
@@ -346,39 +344,13 @@ static void _sde_encoder_phys_cmd_setup_irq_hw_idx(
|
|
|
|
|
|
sde_kms = phys_enc->sde_kms;
|
|
|
|
|
|
- mutex_lock(phys_enc->vblank_ctl_lock);
|
|
|
- vblank_refcount = atomic_read(&phys_enc->vblank_refcount);
|
|
|
- if (vblank_refcount) {
|
|
|
- ret = sde_encoder_helper_unregister_irq(phys_enc,
|
|
|
- INTR_IDX_RDPTR);
|
|
|
- if (ret)
|
|
|
- SDE_ERROR(
|
|
|
- "control vblank irq registration error %d\n",
|
|
|
- ret);
|
|
|
- if (vblank_refcount > 1)
|
|
|
- SDE_ERROR(
|
|
|
- "vblank_refcount mismatch detected, try to reset %d\n",
|
|
|
- atomic_read(&phys_enc->vblank_refcount));
|
|
|
- else
|
|
|
- atomic_set(&phys_enc->vblank_cached_refcount, 1);
|
|
|
-
|
|
|
- SDE_EVT32(DRMID(phys_enc->parent),
|
|
|
- phys_enc->hw_pp->idx - PINGPONG_0, vblank_refcount,
|
|
|
- atomic_read(&phys_enc->vblank_cached_refcount));
|
|
|
- }
|
|
|
- atomic_set(&phys_enc->vblank_refcount, 0);
|
|
|
- mutex_unlock(phys_enc->vblank_ctl_lock);
|
|
|
-
|
|
|
irq = &phys_enc->irq[INTR_IDX_CTL_START];
|
|
|
irq->hw_idx = phys_enc->hw_ctl->idx;
|
|
|
- irq->irq_idx = -EINVAL;
|
|
|
|
|
|
irq = &phys_enc->irq[INTR_IDX_PINGPONG];
|
|
|
irq->hw_idx = phys_enc->hw_pp->idx;
|
|
|
- irq->irq_idx = -EINVAL;
|
|
|
|
|
|
irq = &phys_enc->irq[INTR_IDX_RDPTR];
|
|
|
- irq->irq_idx = -EINVAL;
|
|
|
if (phys_enc->has_intf_te)
|
|
|
irq->hw_idx = phys_enc->hw_intf->idx;
|
|
|
else
|
|
@@ -386,17 +358,14 @@ static void _sde_encoder_phys_cmd_setup_irq_hw_idx(
|
|
|
|
|
|
irq = &phys_enc->irq[INTR_IDX_UNDERRUN];
|
|
|
irq->hw_idx = phys_enc->intf_idx;
|
|
|
- irq->irq_idx = -EINVAL;
|
|
|
|
|
|
irq = &phys_enc->irq[INTR_IDX_AUTOREFRESH_DONE];
|
|
|
- irq->irq_idx = -EINVAL;
|
|
|
if (phys_enc->has_intf_te)
|
|
|
irq->hw_idx = phys_enc->hw_intf->idx;
|
|
|
else
|
|
|
irq->hw_idx = phys_enc->hw_pp->idx;
|
|
|
|
|
|
irq = &phys_enc->irq[INTR_IDX_WRPTR];
|
|
|
- irq->irq_idx = -EINVAL;
|
|
|
if (phys_enc->has_intf_te)
|
|
|
irq->hw_idx = phys_enc->hw_intf->idx;
|
|
|
else
|
|
@@ -821,7 +790,7 @@ static int sde_encoder_phys_cmd_control_vblank_irq(
|
|
|
struct sde_encoder_phys_cmd *cmd_enc =
|
|
|
to_sde_encoder_phys_cmd(phys_enc);
|
|
|
int ret = 0;
|
|
|
- u32 refcount, cached_refcount;
|
|
|
+ u32 refcount;
|
|
|
struct sde_kms *sde_kms;
|
|
|
|
|
|
if (!phys_enc || !phys_enc->hw_pp) {
|
|
@@ -836,17 +805,11 @@ static int sde_encoder_phys_cmd_control_vblank_irq(
|
|
|
goto end;
|
|
|
|
|
|
refcount = atomic_read(&phys_enc->vblank_refcount);
|
|
|
- cached_refcount = atomic_read(&phys_enc->vblank_cached_refcount);
|
|
|
|
|
|
/* protect against negative */
|
|
|
if (!enable && refcount == 0) {
|
|
|
- if (cached_refcount == 1) {
|
|
|
- atomic_set(&phys_enc->vblank_cached_refcount, 0);
|
|
|
- goto end;
|
|
|
- } else {
|
|
|
- ret = -EINVAL;
|
|
|
- goto end;
|
|
|
- }
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto end;
|
|
|
}
|
|
|
|
|
|
SDE_DEBUG_CMDENC(cmd_enc, "[%pS] enable=%d/%d\n",
|
|
@@ -866,11 +829,6 @@ static int sde_encoder_phys_cmd_control_vblank_irq(
|
|
|
atomic_inc_return(&phys_enc->vblank_refcount);
|
|
|
}
|
|
|
|
|
|
- if (enable && cached_refcount) {
|
|
|
- atomic_inc(&phys_enc->vblank_refcount);
|
|
|
- atomic_set(&phys_enc->vblank_cached_refcount, 0);
|
|
|
- }
|
|
|
-
|
|
|
end:
|
|
|
mutex_unlock(phys_enc->vblank_ctl_lock);
|
|
|
if (ret) {
|
|
@@ -2108,7 +2066,6 @@ struct sde_encoder_phys *sde_encoder_phys_cmd_init(
|
|
|
irq->cb.func = sde_encoder_phys_cmd_wr_ptr_irq;
|
|
|
|
|
|
atomic_set(&phys_enc->vblank_refcount, 0);
|
|
|
- atomic_set(&phys_enc->vblank_cached_refcount, 0);
|
|
|
atomic_set(&phys_enc->pending_kickoff_cnt, 0);
|
|
|
atomic_set(&phys_enc->pending_retire_fence_cnt, 0);
|
|
|
atomic_set(&cmd_enc->pending_vblank_cnt, 0);
|