summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLloyd Atkinson <latkinso@codeaurora.org>2016-05-30 14:01:10 -0400
committerDhaval Patel <pdhaval@codeaurora.org>2016-08-01 12:35:44 -0700
commit6dad51ec34d798f00fc0e6fe3c0151e2ceb2275d (patch)
treeae2b47ace7ad8411b177fbf69b3e8f7473a61431
parente15f949d09fd7e8badd39e271c084e680a5940e5 (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.c32
-rw-r--r--drivers/gpu/drm/msm/msm_kms.h7
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);