Skip to content

Commit

Permalink
drm: Don't force all planes to be added to the state due to zpos
Browse files Browse the repository at this point in the history
We don't want all planes to be added to the state whenever a
plane with fixed zpos gets enabled/disabled. This is true
especially for eg. cursor planes on i915, as we want cursor
updates to go through w/o throttling. Same holds for drivers
that don't support zpos at all (i915 actually falls into this
category right now since we've not yet added zpos support).

Allow drivers more freedom by letting them deal with zpos
themselves instead of doing it in drm_atomic_helper_check_planes()
unconditionally. Let's just inline the required calls into all
the driver that currently depend on this.

v2: Inline the stuff into the drivers instead of adding another
    helper, document things better (Daniel)

Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>
Cc: Benjamin Gaignard <benjamin.gaignard@linaro.org>
Cc: Vincent Abriou <vincent.abriou@st.com>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Inki Dae <inki.dae@samsung.com>
Cc: Joonyoung Shim <jy0922.shim@samsung.com>
Cc: Seung-Woo Kim <sw0312.kim@samsung.com>
Cc: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Lyude <cpaul@redhat.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: stable@vger.kernel.org
Fixes: 44d1240 ("drm: add generic zpos property")
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
Acked-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/1476111056-12734-1-git-send-email-ville.syrjala@linux.intel.com
  • Loading branch information
Ville Syrjälä authored and Daniel Vetter committed Oct 26, 2016
1 parent 7dfcb36 commit 38d868e
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 9 deletions.
4 changes: 0 additions & 4 deletions drivers/gpu/drm/drm_atomic_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -594,10 +594,6 @@ drm_atomic_helper_check_planes(struct drm_device *dev,
struct drm_plane_state *plane_state;
int i, ret = 0;

ret = drm_atomic_normalize_zpos(dev, state);
if (ret)
return ret;

for_each_plane_in_state(state, plane, plane_state, i) {
const struct drm_plane_helper_funcs *funcs;

Expand Down
20 changes: 20 additions & 0 deletions drivers/gpu/drm/exynos/exynos_drm_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,26 @@ int exynos_atomic_commit(struct drm_device *dev, struct drm_atomic_state *state,
return 0;
}

int exynos_atomic_check(struct drm_device *dev,
struct drm_atomic_state *state)
{
int ret;

ret = drm_atomic_helper_check_modeset(dev, state);
if (ret)
return ret;

ret = drm_atomic_normalize_zpos(dev, state);
if (ret)
return ret;

ret = drm_atomic_helper_check_planes(dev, state);
if (ret)
return ret;

return ret;
}

static int exynos_drm_open(struct drm_device *dev, struct drm_file *file)
{
struct drm_exynos_file_private *file_priv;
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/exynos/exynos_drm_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,7 @@ static inline int exynos_dpi_bind(struct drm_device *dev,

int exynos_atomic_commit(struct drm_device *dev, struct drm_atomic_state *state,
bool nonblock);
int exynos_atomic_check(struct drm_device *dev, struct drm_atomic_state *state);


extern struct platform_driver fimd_driver;
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/exynos/exynos_drm_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ dma_addr_t exynos_drm_fb_dma_addr(struct drm_framebuffer *fb, int index)
static const struct drm_mode_config_funcs exynos_drm_mode_config_funcs = {
.fb_create = exynos_user_fb_create,
.output_poll_changed = exynos_drm_output_poll_changed,
.atomic_check = drm_atomic_helper_check,
.atomic_check = exynos_atomic_check,
.atomic_commit = exynos_atomic_commit,
};

Expand Down
12 changes: 10 additions & 2 deletions drivers/gpu/drm/rcar-du/rcar_du_kms.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,8 +231,16 @@ static int rcar_du_atomic_check(struct drm_device *dev,
struct rcar_du_device *rcdu = dev->dev_private;
int ret;

ret = drm_atomic_helper_check(dev, state);
if (ret < 0)
ret = drm_atomic_helper_check_modeset(dev, state);
if (ret)
return ret;

ret = drm_atomic_normalize_zpos(dev, state);
if (ret)
return ret;

ret = drm_atomic_helper_check_planes(dev, state);
if (ret)
return ret;

if (rcar_du_has(rcdu, RCAR_DU_FEATURE_VSP1_SOURCE))
Expand Down
22 changes: 21 additions & 1 deletion drivers/gpu/drm/sti/sti_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,26 @@ static void sti_atomic_work(struct work_struct *work)
sti_atomic_complete(private, private->commit.state);
}

static int sti_atomic_check(struct drm_device *dev,
struct drm_atomic_state *state)
{
int ret;

ret = drm_atomic_helper_check_modeset(dev, state);
if (ret)
return ret;

ret = drm_atomic_normalize_zpos(dev, state);
if (ret)
return ret;

ret = drm_atomic_helper_check_planes(dev, state);
if (ret)
return ret;

return ret;
}

static int sti_atomic_commit(struct drm_device *drm,
struct drm_atomic_state *state, bool nonblock)
{
Expand Down Expand Up @@ -248,7 +268,7 @@ static void sti_output_poll_changed(struct drm_device *ddev)
static const struct drm_mode_config_funcs sti_mode_config_funcs = {
.fb_create = drm_fb_cma_create,
.output_poll_changed = sti_output_poll_changed,
.atomic_check = drm_atomic_helper_check,
.atomic_check = sti_atomic_check,
.atomic_commit = sti_atomic_commit,
};

Expand Down
8 changes: 7 additions & 1 deletion include/drm/drm_plane.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,14 @@ struct drm_crtc;
* @src_h: height of visible portion of plane (in 16.16)
* @rotation: rotation of the plane
* @zpos: priority of the given plane on crtc (optional)
* Note that multiple active planes on the same crtc can have an identical
* zpos value. The rule to solving the conflict is to compare the plane
* object IDs; the plane with a higher ID must be stacked on top of a
* plane with a lower ID.
* @normalized_zpos: normalized value of zpos: unique, range from 0 to N-1
* where N is the number of active planes for given crtc
* where N is the number of active planes for given crtc. Note that
* the driver must call drm_atomic_normalize_zpos() to update this before
* it can be trusted.
* @src: clipped source coordinates of the plane (in 16.16)
* @dst: clipped destination coordinates of the plane
* @visible: visibility of the plane
Expand Down

0 comments on commit 38d868e

Please sign in to comment.