Commit bff8fba4 authored by Archit Taneja's avatar Archit Taneja Committed by Rob Clark

drm/msm/mdp5: Add cursor planes

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: default avatarArchit Taneja <architt@codeaurora.org>
Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
parent 5798c8e0
...@@ -411,7 +411,9 @@ static int modeset_init(struct mdp5_kms *mdp5_kms) ...@@ -411,7 +411,9 @@ static int modeset_init(struct mdp5_kms *mdp5_kms)
struct msm_drm_private *priv = dev->dev_private; struct msm_drm_private *priv = dev->dev_private;
const struct mdp5_cfg_hw *hw_cfg; const struct mdp5_cfg_hw *hw_cfg;
unsigned int num_crtcs; 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); hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
...@@ -438,13 +440,14 @@ static int modeset_init(struct mdp5_kms *mdp5_kms) ...@@ -438,13 +440,14 @@ static int modeset_init(struct mdp5_kms *mdp5_kms)
* planes for the CRTCs, with the remainder as overlay planes: * planes for the CRTCs, with the remainder as overlay planes:
*/ */
for (i = 0; i < mdp5_kms->num_hwpipes; i++) { 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_plane *plane;
struct drm_crtc *crtc;
enum drm_plane_type type; enum drm_plane_type type;
if (primary) if (i < num_crtcs)
type = DRM_PLANE_TYPE_PRIMARY; type = DRM_PLANE_TYPE_PRIMARY;
else if (hwpipe->caps & MDP_PIPE_CAP_CURSOR)
type = DRM_PLANE_TYPE_CURSOR;
else else
type = DRM_PLANE_TYPE_OVERLAY; type = DRM_PLANE_TYPE_OVERLAY;
...@@ -456,10 +459,16 @@ static int modeset_init(struct mdp5_kms *mdp5_kms) ...@@ -456,10 +459,16 @@ static int modeset_init(struct mdp5_kms *mdp5_kms)
} }
priv->planes[priv->num_planes++] = plane; priv->planes[priv->num_planes++] = plane;
if (!primary) if (type == DRM_PLANE_TYPE_PRIMARY)
continue; 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)) { if (IS_ERR(crtc)) {
ret = PTR_ERR(crtc); ret = PTR_ERR(crtc);
dev_err(dev->dev, "failed to construct crtc %d (%d)\n", i, ret); 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) ...@@ -791,6 +800,9 @@ static int hwpipe_init(struct mdp5_kms *mdp5_kms)
static const enum mdp5_pipe dma_planes[] = { static const enum mdp5_pipe dma_planes[] = {
SSPP_DMA0, SSPP_DMA1, SSPP_DMA0, SSPP_DMA1,
}; };
static const enum mdp5_pipe cursor_planes[] = {
SSPP_CURSOR0, SSPP_CURSOR1,
};
const struct mdp5_cfg_hw *hw_cfg; const struct mdp5_cfg_hw *hw_cfg;
int ret; int ret;
...@@ -814,6 +826,13 @@ static int hwpipe_init(struct mdp5_kms *mdp5_kms) ...@@ -814,6 +826,13 @@ static int hwpipe_init(struct mdp5_kms *mdp5_kms)
if (ret) if (ret)
return 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; return 0;
} }
......
...@@ -93,11 +93,6 @@ static void msm_atomic_wait_for_commit_done(struct drm_device *dev, ...@@ -93,11 +93,6 @@ static void msm_atomic_wait_for_commit_done(struct drm_device *dev,
if (!crtc->state->enable) if (!crtc->state->enable)
continue; 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); kms->funcs->wait_for_crtc_commit_done(kms, crtc);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment