diff options
| author | Lloyd Atkinson <latkinso@codeaurora.org> | 2016-05-30 14:01:10 -0400 |
|---|---|---|
| committer | Dhaval Patel <pdhaval@codeaurora.org> | 2016-08-01 12:35:44 -0700 |
| commit | 6dad51ec34d798f00fc0e6fe3c0151e2ceb2275d (patch) | |
| tree | ae2b47ace7ad8411b177fbf69b3e8f7473a61431 | |
| parent | e15f949d09fd7e8badd39e271c084e680a5940e5 (diff) | |
drm/msm: add subdriver callback for single kickoff
Add a callback that will give subdrivers a single point where
flush to hardware trigger is appropriate in all commit
callflows; after bridge pre-enable and encoder enable, but
before bridge enable. Current flush to hardware trigger is
spread across different code paths depending on whether the
commit is doing an enable or just a page flip.
Change-Id: If3c9383f176af90b154dd02b338017c48e2fbc70
Signed-off-by: Lloyd Atkinson <latkinso@codeaurora.org>
| -rw-r--r-- | drivers/gpu/drm/msm/msm_atomic.c | 32 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_kms.h | 7 |
2 files changed, 36 insertions, 3 deletions
diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_atomic.c index 4c20137f0791..f3dc6b33febb 100644 --- a/drivers/gpu/drm/msm/msm_atomic.c +++ b/drivers/gpu/drm/msm/msm_atomic.c @@ -307,13 +307,16 @@ void msm_atomic_helper_commit_modeset_disables(struct drm_device *dev, * and do the plane commits at the end. This is useful for drivers doing runtime * PM since planes updates then only happen when the CRTC is actually enabled. */ -void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev, +static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev, struct drm_atomic_state *old_state) { struct drm_crtc *crtc; struct drm_crtc_state *old_crtc_state; struct drm_connector *connector; struct drm_connector_state *old_conn_state; + struct msm_drm_private *priv = dev->dev_private; + struct msm_kms *kms = priv->kms; + int bridge_enable_count = 0; int i; for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) { @@ -369,11 +372,38 @@ void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev, * it away), so we won't call enable hooks twice. */ drm_bridge_pre_enable(encoder->bridge); + ++bridge_enable_count; if (funcs->enable) funcs->enable(encoder); else funcs->commit(encoder); + } + + if (kms->funcs->commit) { + DRM_DEBUG_ATOMIC("triggering commit\n"); + kms->funcs->commit(kms, old_state); + } + + /* If no bridges were pre_enabled, skip iterating over them again */ + if (bridge_enable_count == 0) + return; + + for_each_connector_in_state(old_state, connector, old_conn_state, i) { + struct drm_encoder *encoder; + + if (!connector->state->best_encoder) + continue; + + if (!connector->state->crtc->state->active || + !drm_atomic_crtc_needs_modeset( + connector->state->crtc->state)) + continue; + + encoder = connector->state->best_encoder; + + DRM_DEBUG_ATOMIC("bridge enable enabling [ENCODER:%d:%s]\n", + encoder->base.id, encoder->name); drm_bridge_enable(encoder->bridge); } diff --git a/drivers/gpu/drm/msm/msm_kms.h b/drivers/gpu/drm/msm/msm_kms.h index 63c5c8b1ca10..e6f1cad16850 100644 --- a/drivers/gpu/drm/msm/msm_kms.h +++ b/drivers/gpu/drm/msm/msm_kms.h @@ -50,8 +50,11 @@ struct msm_kms_funcs { int (*enable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc); void (*disable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc); /* modeset, bracketing atomic_commit(): */ - void (*prepare_commit)(struct msm_kms *kms, struct drm_atomic_state *state); - void (*complete_commit)(struct msm_kms *kms, struct drm_atomic_state *state); + void (*prepare_commit)(struct msm_kms *kms, + struct drm_atomic_state *state); + void (*commit)(struct msm_kms *kms, struct drm_atomic_state *state); + void (*complete_commit)(struct msm_kms *kms, + struct drm_atomic_state *state); /* functions to wait for atomic commit completed on each CRTC */ void (*wait_for_crtc_commit_done)(struct msm_kms *kms, struct drm_crtc *crtc); |
