drm/msm/mdp5: Add cursor planes
authorArchit Taneja <architt@codeaurora.org>
Fri, 16 Dec 2016 06:30:30 +0000 (12:00 +0530)
committerRob Clark <robdclark@gmail.com>
Mon, 6 Feb 2017 16:28:44 +0000 (11:28 -0500)
Register cursor drm_planes. The loop in modeset_init that inits the
planes and crtcs has to be refactored a bit. We first iterate all the
hwpipes to find the cursor planes. Then, we loop again to create
crtcs.

In msm_atomic_wait_for_commit_done, remove the check which bypasses
waiting for vsyncs if state->legacy_cursor_updates is true.

We will later create a fast path for cursor position changes in the
cursor plane's update_plane func that doesn't go via the regular
atomic commit path. For rest of cursor related updates, we will have
to wait for vsyncs, so ignore the legacy_cursor_updates flag.

Signed-off-by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
drivers/gpu/drm/msm/msm_atomic.c

index 70a1950de8ae074e1b25c00b4502409fec99a6b5..3eb0749223d9d8c10a330c67a81fff45ea957661 100644 (file)
@@ -411,7 +411,9 @@ static int modeset_init(struct mdp5_kms *mdp5_kms)
        struct msm_drm_private *priv = dev->dev_private;
        const struct mdp5_cfg_hw *hw_cfg;
        unsigned int num_crtcs;
-       int i, ret;
+       int i, ret, pi = 0, ci = 0;
+       struct drm_plane *primary[MAX_BASES] = { NULL };
+       struct drm_plane *cursor[MAX_BASES] = { NULL };
 
        hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
 
@@ -438,13 +440,14 @@ static int modeset_init(struct mdp5_kms *mdp5_kms)
         * planes for the CRTCs, with the remainder as overlay planes:
         */
        for (i = 0; i < mdp5_kms->num_hwpipes; i++) {
-               bool primary = i < num_crtcs;
+               struct mdp5_hw_pipe *hwpipe = mdp5_kms->hwpipes[i];
                struct drm_plane *plane;
-               struct drm_crtc *crtc;
                enum drm_plane_type type;
 
-               if (primary)
+               if (i < num_crtcs)
                        type = DRM_PLANE_TYPE_PRIMARY;
+               else if (hwpipe->caps & MDP_PIPE_CAP_CURSOR)
+                       type = DRM_PLANE_TYPE_CURSOR;
                else
                        type = DRM_PLANE_TYPE_OVERLAY;
 
@@ -456,10 +459,16 @@ static int modeset_init(struct mdp5_kms *mdp5_kms)
                }
                priv->planes[priv->num_planes++] = plane;
 
-               if (!primary)
-                       continue;
+               if (type == DRM_PLANE_TYPE_PRIMARY)
+                       primary[pi++] = plane;
+               if (type == DRM_PLANE_TYPE_CURSOR)
+                       cursor[ci++] = plane;
+       }
+
+       for (i = 0; i < num_crtcs; i++) {
+               struct drm_crtc *crtc;
 
-               crtc  = mdp5_crtc_init(dev, plane, NULL, i);
+               crtc  = mdp5_crtc_init(dev, primary[i], cursor[i], i);
                if (IS_ERR(crtc)) {
                        ret = PTR_ERR(crtc);
                        dev_err(dev->dev, "failed to construct crtc %d (%d)\n", i, ret);
@@ -791,6 +800,9 @@ static int hwpipe_init(struct mdp5_kms *mdp5_kms)
        static const enum mdp5_pipe dma_planes[] = {
                        SSPP_DMA0, SSPP_DMA1,
        };
+       static const enum mdp5_pipe cursor_planes[] = {
+                       SSPP_CURSOR0, SSPP_CURSOR1,
+       };
        const struct mdp5_cfg_hw *hw_cfg;
        int ret;
 
@@ -814,6 +826,13 @@ static int hwpipe_init(struct mdp5_kms *mdp5_kms)
        if (ret)
                return ret;
 
+       /* Construct cursor pipes: */
+       ret = construct_pipes(mdp5_kms, hw_cfg->pipe_cursor.count,
+                       cursor_planes, hw_cfg->pipe_cursor.base,
+                       hw_cfg->pipe_cursor.caps);
+       if (ret)
+               return ret;
+
        return 0;
 }
 
index 6924fa28f04fda8fe99243dbe5b3a21650ed7c9d..9633a68b14d7b95e6151e192dc4326d8f1746df6 100644 (file)
@@ -93,11 +93,6 @@ static void msm_atomic_wait_for_commit_done(struct drm_device *dev,
                if (!crtc->state->enable)
                        continue;
 
-               /* Legacy cursor ioctls are completely unsynced, and userspace
-                * relies on that (by doing tons of cursor updates). */
-               if (old_state->legacy_cursor_update)
-                       continue;
-
                kms->funcs->wait_for_crtc_commit_done(kms, crtc);
        }
 }