disp: msm: sde: disable hw-fencing for commit before vm transition
This change disables hw-fencing for the last commit before vm transition. This avoids configuration issues if hw-fencing is disabled in the incoming VM. Change-Id: I573b7d1665f8cef442168bd0ab83a4b2b6cebbb6 Signed-off-by: Christina Oliveira <quic_coliveir@quicinc.com>
This commit is contained in:
@@ -3855,6 +3855,8 @@ static bool _sde_crtc_wait_for_fences(struct drm_crtc *crtc)
|
|||||||
bool input_hw_fences_enable;
|
bool input_hw_fences_enable;
|
||||||
struct sde_kms *sde_kms = _sde_crtc_get_kms(crtc);
|
struct sde_kms *sde_kms = _sde_crtc_get_kms(crtc);
|
||||||
int ret;
|
int ret;
|
||||||
|
enum sde_crtc_vm_req vm_req;
|
||||||
|
bool disable_hw_fences = false;
|
||||||
|
|
||||||
SDE_DEBUG("\n");
|
SDE_DEBUG("\n");
|
||||||
|
|
||||||
@@ -3866,10 +3868,15 @@ static bool _sde_crtc_wait_for_fences(struct drm_crtc *crtc)
|
|||||||
|
|
||||||
SDE_ATRACE_BEGIN("plane_wait_input_fence");
|
SDE_ATRACE_BEGIN("plane_wait_input_fence");
|
||||||
|
|
||||||
|
/* if this is the last frame on vm transition, disable hw fences */
|
||||||
|
vm_req = sde_crtc_get_property(to_sde_crtc_state(crtc->state), CRTC_PROP_VM_REQ_STATE);
|
||||||
|
if (vm_req == VM_REQ_RELEASE)
|
||||||
|
disable_hw_fences = true;
|
||||||
|
|
||||||
/* update ctl hw to wait for ipcc input signal before fetch */
|
/* update ctl hw to wait for ipcc input signal before fetch */
|
||||||
if (test_bit(HW_FENCE_IN_FENCES_ENABLE, sde_crtc->hwfence_features_mask) &&
|
if (test_bit(HW_FENCE_IN_FENCES_ENABLE, sde_crtc->hwfence_features_mask) &&
|
||||||
!sde_fence_update_input_hw_fence_signal(hw_ctl, sde_kms->debugfs_hw_fence,
|
!sde_fence_update_input_hw_fence_signal(hw_ctl, sde_kms->debugfs_hw_fence,
|
||||||
sde_kms->hw_mdp))
|
sde_kms->hw_mdp, disable_hw_fences))
|
||||||
ipcc_input_signal_wait = true;
|
ipcc_input_signal_wait = true;
|
||||||
|
|
||||||
/* avoid hw-fences in first frame after timing engine enable */
|
/* avoid hw-fences in first frame after timing engine enable */
|
||||||
|
@@ -469,7 +469,7 @@ static int _reset_hw_fence_timeline(struct sde_hw_ctl *hw_ctl, u32 flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sde_fence_update_input_hw_fence_signal(struct sde_hw_ctl *hw_ctl, u32 debugfs_hw_fence,
|
int sde_fence_update_input_hw_fence_signal(struct sde_hw_ctl *hw_ctl, u32 debugfs_hw_fence,
|
||||||
struct sde_hw_mdp *hw_mdp)
|
struct sde_hw_mdp *hw_mdp, bool disable)
|
||||||
{
|
{
|
||||||
struct sde_hw_fence_data *data;
|
struct sde_hw_fence_data *data;
|
||||||
u32 ipcc_signal_id;
|
u32 ipcc_signal_id;
|
||||||
@@ -486,6 +486,11 @@ int sde_fence_update_input_hw_fence_signal(struct sde_hw_ctl *hw_ctl, u32 debugf
|
|||||||
ctl_id = hw_ctl->idx - CTL_0;
|
ctl_id = hw_ctl->idx - CTL_0;
|
||||||
data = &hw_ctl->hwfence_data;
|
data = &hw_ctl->hwfence_data;
|
||||||
|
|
||||||
|
if (disable) {
|
||||||
|
hw_ctl->ops.hw_fence_ctrl(hw_ctl, false, false, 0);
|
||||||
|
return -EPERM;
|
||||||
|
}
|
||||||
|
|
||||||
if ((debugfs_hw_fence & SDE_INPUT_HW_FENCE_TIMESTAMP)
|
if ((debugfs_hw_fence & SDE_INPUT_HW_FENCE_TIMESTAMP)
|
||||||
&& hw_mdp->ops.hw_fence_input_timestamp_ctrl)
|
&& hw_mdp->ops.hw_fence_input_timestamp_ctrl)
|
||||||
hw_mdp->ops.hw_fence_input_timestamp_ctrl(hw_mdp, true, false);
|
hw_mdp->ops.hw_fence_input_timestamp_ctrl(hw_mdp, true, false);
|
||||||
|
@@ -192,11 +192,12 @@ int sde_fence_update_hw_fences_txq(struct sde_fence_context *ctx, bool vid_mode,
|
|||||||
* @ctl: hw ctl to update the input-fence and enable hw-fences
|
* @ctl: hw ctl to update the input-fence and enable hw-fences
|
||||||
* @debugfs_hw_fence: hw-fence timestamp debugfs value
|
* @debugfs_hw_fence: hw-fence timestamp debugfs value
|
||||||
* @hw_mdp: pointer to hw_mdp to get timestamp registers
|
* @hw_mdp: pointer to hw_mdp to get timestamp registers
|
||||||
|
* @disable: bool to indicate if we should disable hw-fencing for this commit
|
||||||
*
|
*
|
||||||
* Returns: Zero on success, otherwise returns an error code.
|
* Returns: Zero on success, otherwise returns an error code.
|
||||||
*/
|
*/
|
||||||
int sde_fence_update_input_hw_fence_signal(struct sde_hw_ctl *ctl, u32 debugfs_hw_fence,
|
int sde_fence_update_input_hw_fence_signal(struct sde_hw_ctl *ctl, u32 debugfs_hw_fence,
|
||||||
struct sde_hw_mdp *hw_mdp);
|
struct sde_hw_mdp *hw_mdp, bool disable);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sde_fence_deinit - deinit fence container
|
* sde_fence_deinit - deinit fence container
|
||||||
|
@@ -365,7 +365,12 @@ static inline void sde_hw_ctl_hw_fence_ctrl(struct sde_hw_ctl *ctx, bool sw_over
|
|||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
val = SDE_REG_READ(&ctx->hw, CTL_HW_FENCE_CTRL);
|
val = SDE_REG_READ(&ctx->hw, CTL_HW_FENCE_CTRL);
|
||||||
val |= (0x1 & mode) | (sw_override_set ? BIT(5) : 0) | (sw_override_clear ? BIT(4) : 0);
|
val |= (sw_override_set ? BIT(5) : 0) | (sw_override_clear ? BIT(4) : 0);
|
||||||
|
if (!mode)
|
||||||
|
val &= ~BIT(0);
|
||||||
|
else
|
||||||
|
val |= BIT(0);
|
||||||
|
|
||||||
SDE_REG_WRITE(&ctx->hw, CTL_HW_FENCE_CTRL, val);
|
SDE_REG_WRITE(&ctx->hw, CTL_HW_FENCE_CTRL, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user