FAILED: patch "[PATCH] drm: Don't force all planes to be added to the state due to" failed to apply to 4.8-stable tree
Subsystems (7)
[email protected]
maintainerThe patch below does not apply to the 4.8-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
38d868e41c4b9250d5a115c049dc2d48f4909581Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <[email protected]>
Date: Mon, 10 Oct 2016 17:50:56 +0300
Subject: [PATCH] drm: Don't force all planes to be added to the state due to
zpos
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
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)
drivers/gpu/drm/drm_atomic_helper.c +0 -4
@@ -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;
drivers/gpu/drm/exynos/exynos_drm_drv.c +20 -0
@@ -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;
drivers/gpu/drm/exynos/exynos_drm_drv.h +1 -0
@@ -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;
drivers/gpu/drm/exynos/exynos_drm_fb.c +1 -1
@@ -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, };
drivers/gpu/drm/rcar-du/rcar_du_kms.c +10 -2
@@ -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 ))
drivers/gpu/drm/sti/sti_drv.c +21 -1
@@ -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) {
@@ -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, };
include/drm/drm_plane.h +7 -1
@@ -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