disp: msm: sde: delay encoder disable for clone mode

Clone WB encoder disable before posted start commit
trigger adds wb_wait delay in current frame trigger
sequence. This adds 1 frame jank if CWB enable/disable
path exercised periodically like 100ms or 200ms. This
change delays CWB encoder disable after frame trigger
and vsync/wr_ptr wait to avoid jank issue.

Change-Id: Ifa10042473397b37396d217d2410e7cf5a1e32a1
Signed-off-by: Dhaval Patel <pdhaval@codeaurora.org>
This commit is contained in:
Dhaval Patel
2020-08-17 23:21:21 -07:00
committed by Gerrit - the friendly Code Review server
parent 153926f999
commit 28826f09cf
2 changed files with 64 additions and 10 deletions

View File

@@ -87,19 +87,19 @@ static inline bool _msm_seamless_for_conn(struct drm_connector *connector,
old_conn_state->crtc->state->connectors_changed)
return false;
if (msm_is_mode_seamless(&connector->encoder->crtc->state->mode))
if (msm_is_mode_seamless(&old_conn_state->crtc->state->mode))
return true;
if (msm_is_mode_seamless_vrr(
&connector->encoder->crtc->state->adjusted_mode))
&old_conn_state->crtc->state->adjusted_mode))
return true;
if (msm_is_mode_seamless_dyn_clk(
&connector->encoder->crtc->state->adjusted_mode))
&old_conn_state->crtc->state->adjusted_mode))
return true;
if (msm_is_mode_seamless_dms(
&connector->encoder->crtc->state->adjusted_mode))
&old_conn_state->crtc->state->adjusted_mode))
return true;
return false;
@@ -142,17 +142,51 @@ static void msm_atomic_wait_for_commit_done(
}
}
static void
msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
static bool
msm_disable_outputs_for_clone_conn(struct drm_device *dev,
struct drm_atomic_state *old_state)
{
struct drm_connector *connector;
struct drm_connector_state *old_conn_state;
struct drm_crtc *crtc;
struct drm_crtc_state *old_crtc_state;
struct drm_crtc *crtc = NULL;
int i;
bool clone_state = false;
for_each_old_connector_in_state(old_state, connector,
old_conn_state, i) {
if (!old_conn_state->crtc)
continue;
old_crtc_state = drm_atomic_get_old_crtc_state(old_state,
old_conn_state->crtc);
if (!old_crtc_state->active ||
!old_conn_state->crtc->state->connectors_changed ||
(!_msm_seamless_for_conn(connector, old_conn_state,
false) && (connector->connector_type !=
DRM_MODE_CONNECTOR_VIRTUAL)))
return false;
if (crtc)
clone_state = (crtc == old_conn_state->crtc)
? true : false;
crtc = old_conn_state->crtc;
}
return clone_state;
}
static void
msm_disable_connector_outputs(struct drm_device *dev,
struct drm_atomic_state *old_state)
{
struct drm_connector *connector;
struct drm_connector_state *old_conn_state;
struct drm_panel_notifier notifier_data;
int i, blank;
SDE_ATRACE_BEGIN("msm_disable");
for_each_old_connector_in_state(old_state, connector,
old_conn_state, i) {
const struct drm_encoder_helper_funcs *funcs;
@@ -222,6 +256,18 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
&notifier_data);
}
}
}
static void
msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
{
struct drm_crtc *crtc;
struct drm_crtc_state *old_crtc_state;
int i;
SDE_ATRACE_BEGIN("msm_disable");
if (!msm_disable_outputs_for_clone_conn(dev, old_state))
msm_disable_connector_outputs(dev, old_state);
for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
const struct drm_crtc_helper_funcs *funcs;
@@ -564,6 +610,9 @@ static void complete_commit(struct msm_commit *c)
kms->funcs->complete_commit(kms, state);
if (msm_disable_outputs_for_clone_conn(dev, state))
msm_disable_connector_outputs(dev, state);
drm_atomic_state_put(state);
commit_destroy(c);