FAILED: patch "[PATCH] drm/hibmc: Use drm_atomic_helper_check_plane_state()" failed to apply to 5.10-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 5.10-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]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.10.y
git checkout FETCH_HEAD
git cherry-pick -x 715c5db68bdbd4a524b79ebf20fb61e880fffea0
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026090953-parka-swoop-b3c1@gregkh' --subject-prefix 'PATCH 5.10.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 715c5db68bdbd4a524b79ebf20fb61e880fffea0 Mon Sep 17 00:00:00 2001
From: Thomas Zimmermann <[email protected]>
Date: Thu, 18 Jun 2026 14:28:39 +0200
Subject: [PATCH] drm/hibmc: Use drm_atomic_helper_check_plane_state()
Call drm_atomic_helper_check_plane_state() from the primary plane's atomic-check helper and replace the custom implementation.
All plane's implementations of atomic_check should call the shared _check_plane_state() helper first. It adjusts the plane state for correct positioning, rotation and scaling of the plane. Do this even if the plane's CRTC has been disabled by setting the parameter can_update_disabled. The original code returned early in this case, but it's safe to so and cleaner to have all plane state initialized.
As we don't set can_position, drm_atomic_helper_check_plane_state()'s visibility check tests if the plane covers all of the CRTC. This is a small change from the original code, which tested if the plane is exactly the size of the CRTC. With the new test, the plane still has to cover all of the CRTC, but can be larger than the CRTC's size. A later patch can fully implement this feature in hibmc.
If the plane is disabled, the helper clears the visibility flag in the plane state. On errors or if the plane is not visible, the atomic-check helper can return early. Implement all this in hibmc and drop the custom code that does some of it.
v2:
- extend the commit description (Yongbang)
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c +15 -33
@@ -72,46 +72,28 @@ static int hibmc_get_best_clock_idx(const struct drm_display_mode *mode)static int hibmc_plane_atomic_check (struct drm_plane *plane,struct drm_atomic_commit *state) { -struct drm_plane_state *new_plane_state =drm_atomic_get_new_plane_state (state, - plane); -struct drm_framebuffer *fb = new_plane_state->fb; -struct drm_crtc *crtc = new_plane_state->crtc; -struct drm_crtc_state *crtc_state; -u32 src_w = new_plane_state->src_w >>16 ; -u32 src_h = new_plane_state->src_h >>16 ; +struct drm_plane_state *new_plane_state = +drm_atomic_get_new_plane_state (state, plane); +struct drm_crtc_state *new_crtc_state =NULL ; +int ret; -if (!crtc || !fb) +if (new_plane_state->crtc) + new_crtc_state =drm_atomic_get_new_crtc_state (state, new_plane_state->crtc); + + ret =drm_atomic_helper_check_plane_state (new_plane_state, new_crtc_state, +DRM_PLANE_NO_SCALING , +DRM_PLANE_NO_SCALING , + false, true); +if (ret) +return ret; +else if (!new_plane_state->visible)return 0 ; - crtc_state =drm_atomic_get_crtc_state (state, crtc); -if (IS_ERR (crtc_state)) -return PTR_ERR (crtc_state); - -if (src_w != new_plane_state->crtc_w || src_h != new_plane_state->crtc_h) { -drm_dbg_atomic (plane->dev,"scale not support\n" ); -return -EINVAL ; - } - -if (new_plane_state->crtc_x <0 || new_plane_state->crtc_y <0 ) { -drm_dbg_atomic (plane->dev,"crtc_x/y of drm_plane state is invalid\n" ); -return -EINVAL ; - } - -if (!crtc_state->enable) -return 0 ; - -if (new_plane_state->crtc_x + new_plane_state->crtc_w > - crtc_state->adjusted_mode.hdisplay || - new_plane_state->crtc_y + new_plane_state->crtc_h > - crtc_state->adjusted_mode.vdisplay) { -drm_dbg_atomic (plane->dev,"visible portion of plane is invalid\n" ); -return -EINVAL ; - } -if (new_plane_state->fb->pitches[0 ] %128 !=0 ) {drm_dbg_atomic (plane->dev,"wrong stride with 128-byte aligned\n" );return -EINVAL ; } +return 0 ; }
Sasha Levin
maintainerPATCH 1/1 drm/hibmc: Use drm_atomic_helper_check_plane_state()
From: Thomas Zimmermann <[email protected]>
[ Upstream commit 715c5db68bdbd4a524b79ebf20fb61e880fffea0 ]
Call drm_atomic_helper_check_plane_state() from the primary plane's atomic-check helper and replace the custom implementation.
All plane's implementations of atomic_check should call the shared _check_plane_state() helper first. It adjusts the plane state for correct positioning, rotation and scaling of the plane. Do this even if the plane's CRTC has been disabled by setting the parameter can_update_disabled. The original code returned early in this case, but it's safe to so and cleaner to have all plane state initialized.
As we don't set can_position, drm_atomic_helper_check_plane_state()'s visibility check tests if the plane covers all of the CRTC. This is a small change from the original code, which tested if the plane is exactly the size of the CRTC. With the new test, the plane still has to cover all of the CRTC, but can be larger than the CRTC's size. A later patch can fully implement this feature in hibmc.
If the plane is disabled, the helper clears the visibility flag in the plane state. On errors or if the plane is not visible, the atomic-check helper can return early. Implement all this in hibmc and drop the custom code that does some of it.
v2:
- extend the commit description (Yongbang)
--- .../gpu/drm/hisilicon/hibmc/hibmc_drm_de.c | 43 ++++++------------- 1 file changed, 13 insertions(+), 30 deletions(-)
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c +13 -30
@@ -17,6 +17,7 @@#include <drm/drm_atomic_helper.h> #include <drm/drm_fourcc.h> #include <drm/drm_gem_vram_helper.h> +#include <drm/drm_plane_helper.h> #include <drm/drm_vblank.h> #include "hibmc_drm_drv.h"
@@ -57,44 +58,26 @@ static const struct hibmc_dislay_pll_config hibmc_pll_table[] = {static int hibmc_plane_atomic_check (struct drm_plane *plane,struct drm_plane_state *state) { -struct drm_framebuffer *fb = state->fb; -struct drm_crtc *crtc = state->crtc; -struct drm_crtc_state *crtc_state; -u32 src_w = state->src_w >>16 ; -u32 src_h = state->src_h >>16 ; - -if (!crtc || !fb) -return 0 ; - - crtc_state =drm_atomic_get_crtc_state (state->state, crtc); -if (IS_ERR (crtc_state)) -return PTR_ERR (crtc_state); - -if (src_w != state->crtc_w || src_h != state->crtc_h) { -drm_dbg_atomic (plane->dev,"scale not support\n" ); -return -EINVAL ; - } +struct drm_crtc_state *new_crtc_state =NULL ; +int ret; -if (state->crtc_x <0 || state->crtc_y <0 ) { -drm_dbg_atomic (plane->dev,"crtc_x/y of drm_plane state is invalid\n" ); -return -EINVAL ; - } +if (state->crtc) + new_crtc_state =drm_atomic_get_new_crtc_state (state->state, state->crtc); -if (!crtc_state->enable) + ret =drm_atomic_helper_check_plane_state (state, new_crtc_state, +DRM_PLANE_HELPER_NO_SCALING , +DRM_PLANE_HELPER_NO_SCALING , + false, true); +if (ret) +return ret; +else if (!state->visible)return 0 ; -if (state->crtc_x + state->crtc_w > - crtc_state->adjusted_mode.hdisplay || - state->crtc_y + state->crtc_h > - crtc_state->adjusted_mode.vdisplay) { -drm_dbg_atomic (plane->dev,"visible portion of plane is invalid\n" ); -return -EINVAL ; - } -if (state->fb->pitches[0 ] %128 !=0 ) {drm_dbg_atomic (plane->dev,"wrong stride with 128-byte aligned\n" );return -EINVAL ; } +return 0 ; }
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 1/3 drm/atomic-helper: Add helper drm_atomic_helper_check_crtc_state()
In reply to [email protected]From: Thomas Zimmermann <[email protected]>
[ Upstream commit d6b9af1097fefa7e6509a4b2f03af45f9eaddae9 ]
Add drm_atomic_helper_check_crtc_state(), which contains tests common to many CRTCs. The first added test verifies that an enabled CRTC has at least one enabled primary plane.
Stable-dep-of: 715c5db68bdb ("drm/hibmc: Use drm_atomic_helper_check_plane_state()")
--- drivers/gpu/drm/drm_atomic_helper.c | 55 +++++++++++++++++++++++++++++ include/drm/drm_atomic_helper.h | 2 ++ 2 files changed, 57 insertions(+)
drivers/gpu/drm/drm_atomic_helper.c +55 -0
@@ -890,6 +890,61 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state, }EXPORT_SYMBOL (drm_atomic_helper_check_plane_state); +/** +* drm_atomic_helper_check_crtc_state() - Check CRTC state for validity +* @crtc_state: CRTC state to check +* @can_disable_primary_planes: can the CRTC be enabled without a primary plane? +* +* Checks that a desired CRTC update is valid. Drivers that provide +* their own CRTC handling rather than helper-provided implementations may +* still wish to call this function to avoid duplication of error checking +* code. +* +* Note that @can_disable_primary_planes only tests if the CRTC can be +* enabled without a primary plane. To test if a primary plane can be updated +* without a CRTC, use drm_atomic_helper_check_plane_state() in the plane's +* atomic check. +* +* RETURNS: +* Zero if update appears valid, error code on failure +*/ +int drm_atomic_helper_check_crtc_state (struct drm_crtc_state *crtc_state, +bool can_disable_primary_planes) +{ +struct drm_device *dev = crtc_state->crtc->dev; +struct drm_atomic_state *state = crtc_state->state; + +if (!crtc_state->enable) +return 0 ; + +/* needs at least one primary plane to be enabled */ +if (!can_disable_primary_planes) { +bool has_primary_plane = false; +struct drm_plane *plane; + +drm_for_each_plane_mask (plane, dev, crtc_state->plane_mask) { +struct drm_plane_state *plane_state; + +if (plane->type !=DRM_PLANE_TYPE_PRIMARY ) +continue ; + plane_state =drm_atomic_get_plane_state (state, plane); +if (IS_ERR (plane_state)) +return PTR_ERR (plane_state); +if (plane_state->fb && plane_state->crtc) { + has_primary_plane = true; +break ; + } + } +if (!has_primary_plane) { +drm_dbg_kms (dev,"Cannot enable CRTC without a primary plane.\n" ); +return -EINVAL ; + } + } + +return 0 ; +} +EXPORT_SYMBOL (drm_atomic_helper_check_crtc_state); +/** * drm_atomic_helper_check_planes - validate state object for planes changes * @dev: DRM device
include/drm/drm_atomic_helper.h +2 -0
@@ -46,6 +46,8 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,int max_scale, bool can_position, bool can_update_disabled); +int drm_atomic_helper_check_crtc_state (struct drm_crtc_state *crtc_state, +bool can_disable_primary_plane);int drm_atomic_helper_check_planes (struct drm_device *dev,struct drm_atomic_state *state); int drm_atomic_helper_check(struct drm_device *dev,
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/3 drm/atomic-helper: Move DRM_PLANE_HELPER_NO_SCALING to atomic helpers
From: Thomas Zimmermann <[email protected]>
[ Upstream commit 382fc1f681324bb38bedfe763107a60256c4ddc8 ]
The macro DRM_PLANE_HELPER_NO_SCALING is only useful with the interfaces in drm_atomic_helper.h, but defined in drm_plane_helper.h. So half of DRM includes the latter header file for using this macro. Move the macro and remove the include statements.
Stable adaptation for 5.10 and target 715c5db68bdb:
Keep the macro move but omit the optional driver include cleanup. Several upstream drivers do not exist in 5.10 and others still have older header dependencies. Define DRM_PLANE_NO_SCALING as an alias so the target can use the newer spelling without renaming existing callers.
The target also expects HIBMC's plane check to receive the full atomic state. Add an optional atomic_check_state member to the existing plane helper table and dispatch it from drm_atomic_helper_check_planes(), with the legacy atomic_check path retained for all other drivers. Convert only HIBMC's existing check to this entry and match the target's local state names. Its validation behavior is unchanged until the target is applied. Use 5.10's struct drm_atomic_state rather than the later drm_atomic_commit name. No function definitions are added.
[ sashal: Reduced backport -- upstream 382fc1f681324 touches 31 file(s), this
backport carries 5. Not backported here:
drivers/gpu/drm/arm/hdlcd_crtc.c
drivers/gpu/drm/ast/ast_mode.c drivers/gpu/drm/drm_simple_kms_helper.c drivers/gpu/drm/i915/display/i9xx_plane.c drivers/gpu/drm/i915/display/intel_cursor.c drivers/gpu/drm/i915/display/intel_sprite.c drivers/gpu/drm/i915/display/skl_universal_plane.c drivers/gpu/drm/imx/ipuv3-plane.c
... and 21 more
This note is generated from the file lists only; see the resolution record for the reasoning. ]
Stable-dep-of: 715c5db68bdb ("drm/hibmc: Use drm_atomic_helper_check_plane_state()")
--- drivers/gpu/drm/drm_atomic_helper.c | 9 +++++-- .../gpu/drm/hisilicon/hibmc/hibmc_drm_de.c | 26 ++++++++++--------- include/drm/drm_atomic_helper.h | 10 +++++++ include/drm/drm_modeset_helper_vtables.h | 11 ++++++++ include/drm/drm_plane_helper.h | 9 ------- 5 files changed, 42 insertions(+), 23 deletions(-)
drivers/gpu/drm/drm_atomic_helper.c +7 -2
@@ -982,10 +982,15 @@ drm_atomic_helper_check_planes(struct drm_device *dev,drm_atomic_helper_check_plane_damage (state, new_plane_state); -if (!funcs || !funcs->atomic_check) +if (!funcs)continue ; - ret = funcs->atomic_check (plane, new_plane_state); +if (funcs->atomic_check_state) + ret = funcs->atomic_check_state (plane, state); +else if (funcs->atomic_check) + ret = funcs->atomic_check (plane, new_plane_state); +else +continue ;if (ret) {DRM_DEBUG_ATOMIC ("[PLANE:%d:%s] atomic driver check failed\n" , plane->base.id, plane->name);
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c +14 -12
@@ -55,27 +55,29 @@ static const struct hibmc_dislay_pll_config hibmc_pll_table[] = {#define PADDING (align, data) (((data) + (align) - 1) & (~((align) - 1)))static int hibmc_plane_atomic_check (struct drm_plane *plane, -struct drm_plane_state *state) +struct drm_atomic_state *state) { -struct drm_framebuffer *fb = state->fb; -struct drm_crtc *crtc = state->crtc; +struct drm_plane_state *new_plane_state =drm_atomic_get_new_plane_state (state, + plane); +struct drm_framebuffer *fb = new_plane_state->fb; +struct drm_crtc *crtc = new_plane_state->crtc;struct drm_crtc_state *crtc_state; -u32 src_w = state->src_w >>16 ; -u32 src_h = state->src_h >>16 ; +u32 src_w = new_plane_state->src_w >>16 ; +u32 src_h = new_plane_state->src_h >>16 ;if (!crtc || !fb)return 0 ; - crtc_state =drm_atomic_get_crtc_state (state->state, crtc); + crtc_state =drm_atomic_get_crtc_state (state, crtc);if (IS_ERR (crtc_state))return PTR_ERR (crtc_state); -if (src_w != state->crtc_w || src_h != state->crtc_h) { +if (src_w != new_plane_state->crtc_w || src_h != new_plane_state->crtc_h) {drm_dbg_atomic (plane->dev,"scale not support\n" );return -EINVAL ; } -if (state->crtc_x <0 || state->crtc_y <0 ) { +if (new_plane_state->crtc_x <0 || new_plane_state->crtc_y <0 ) {drm_dbg_atomic (plane->dev,"crtc_x/y of drm_plane state is invalid\n" );return -EINVAL ; }
@@ -83,15 +85,15 @@ static int hibmc_plane_atomic_check(struct drm_plane *plane,if (!crtc_state->enable)return 0 ; -if (state->crtc_x + state->crtc_w > +if (new_plane_state->crtc_x + new_plane_state->crtc_w > crtc_state->adjusted_mode.hdisplay || - state->crtc_y + state->crtc_h > + new_plane_state->crtc_y + new_plane_state->crtc_h > crtc_state->adjusted_mode.vdisplay) {drm_dbg_atomic (plane->dev,"visible portion of plane is invalid\n" );return -EINVAL ; } -if (state->fb->pitches[0 ] %128 !=0 ) { +if (new_plane_state->fb->pitches[0 ] %128 !=0 ) {drm_dbg_atomic (plane->dev,"wrong stride with 128-byte aligned\n" );return -EINVAL ; }
@@ -153,7 +155,7 @@ static struct drm_plane_funcs hibmc_plane_funcs = {static const struct drm_plane_helper_funcs hibmc_plane_helper_funcs = { .prepare_fb = drm_gem_vram_plane_helper_prepare_fb, .cleanup_fb = drm_gem_vram_plane_helper_cleanup_fb, - .atomic_check = hibmc_plane_atomic_check, + .atomic_check_state = hibmc_plane_atomic_check, .atomic_update = hibmc_plane_atomic_update, };
include/drm/drm_atomic_helper.h +10 -0
@@ -34,6 +34,16 @@#include <drm/drm_atomic_state_helper.h> #include <drm/drm_util.h> +/* +* Drivers that don't allow primary plane scaling may pass this macro in place +* of the min/max scale parameters of the plane-state checker function. +* +* Due to src being in 16.16 fixed point and dest being in integer pixels, +* 1<<16 represents no scaling. +*/ +#define DRM_PLANE_HELPER_NO_SCALING (1<<16) +#define DRM_PLANE_NO_SCALING DRM_PLANE_HELPER_NO_SCALING +struct drm_atomic_state ;struct drm_private_obj ;struct drm_private_state ;
include/drm/drm_modeset_helper_vtables.h +11 -0
@@ -1252,6 +1252,17 @@ struct drm_plane_helper_funcs {int (*atomic_check)(struct drm_plane *plane,struct drm_plane_state *state); +/** +* @atomic_check_state: +* +* This hook is equivalent to @atomic_check, but receives the full +* atomic state. Drivers should implement only one of these hooks. +* drm_atomic_helper_check_planes() calls this hook in preference to +* @atomic_check when both are set. +*/ +int (*atomic_check_state)(struct drm_plane *plane, +struct drm_atomic_state *state); +/** * @atomic_update: *
include/drm/drm_plane_helper.h +0 -9
@@ -29,15 +29,6 @@#include <drm/drm_modeset_helper_vtables.h> #include <drm/drm_modeset_helper.h> -/* -* Drivers that don't allow primary plane scaling may pass this macro in place -* of the min/max scale parameters of the update checker function. -* -* Due to src being in 16.16 fixed point and dest being in integer pixels, -* 1<<16 represents no scaling. -*/ -#define DRM_PLANE_HELPER_NO_SCALING (1<<16) -void drm_primary_helper_destroy (struct drm_plane *plane);extern const struct drm_plane_funcs drm_primary_helper_funcs;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 3/3 drm/hibmc: Use drm_atomic_helper_check_plane_state()
In reply to Sasha LevinFrom: Thomas Zimmermann <[email protected]>
[ Upstream commit 715c5db68bdbd4a524b79ebf20fb61e880fffea0 ]
Call drm_atomic_helper_check_plane_state() from the primary plane's atomic-check helper and replace the custom implementation.
All plane's implementations of atomic_check should call the shared _check_plane_state() helper first. It adjusts the plane state for correct positioning, rotation and scaling of the plane. Do this even if the plane's CRTC has been disabled by setting the parameter can_update_disabled. The original code returned early in this case, but it's safe to so and cleaner to have all plane state initialized.
As we don't set can_position, drm_atomic_helper_check_plane_state()'s visibility check tests if the plane covers all of the CRTC. This is a small change from the original code, which tested if the plane is exactly the size of the CRTC. With the new test, the plane still has to cover all of the CRTC, but can be larger than the CRTC's size. A later patch can fully implement this feature in hibmc.
If the plane is disabled, the helper clears the visibility flag in the plane state. On errors or if the plane is not visible, the atomic-check helper can return early. Implement all this in hibmc and drop the custom code that does some of it.
v2:
- extend the commit description (Yongbang)
--- .../gpu/drm/hisilicon/hibmc/hibmc_drm_de.c | 46 ++++++------------- 1 file changed, 14 insertions(+), 32 deletions(-)
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c +14 -32
@@ -57,46 +57,28 @@ static const struct hibmc_dislay_pll_config hibmc_pll_table[] = {static int hibmc_plane_atomic_check (struct drm_plane *plane,struct drm_atomic_state *state) { -struct drm_plane_state *new_plane_state =drm_atomic_get_new_plane_state (state, - plane); -struct drm_framebuffer *fb = new_plane_state->fb; -struct drm_crtc *crtc = new_plane_state->crtc; -struct drm_crtc_state *crtc_state; -u32 src_w = new_plane_state->src_w >>16 ; -u32 src_h = new_plane_state->src_h >>16 ; - -if (!crtc || !fb) -return 0 ; +struct drm_plane_state *new_plane_state = +drm_atomic_get_new_plane_state (state, plane); +struct drm_crtc_state *new_crtc_state =NULL ; +int ret; - crtc_state =drm_atomic_get_crtc_state (state, crtc); -if (IS_ERR (crtc_state)) -return PTR_ERR (crtc_state); +if (new_plane_state->crtc) + new_crtc_state =drm_atomic_get_new_crtc_state (state, new_plane_state->crtc); -if (src_w != new_plane_state->crtc_w || src_h != new_plane_state->crtc_h) { -drm_dbg_atomic (plane->dev,"scale not support\n" ); -return -EINVAL ; - } - -if (new_plane_state->crtc_x <0 || new_plane_state->crtc_y <0 ) { -drm_dbg_atomic (plane->dev,"crtc_x/y of drm_plane state is invalid\n" ); -return -EINVAL ; - } - -if (!crtc_state->enable) + ret =drm_atomic_helper_check_plane_state (new_plane_state, new_crtc_state, +DRM_PLANE_NO_SCALING , +DRM_PLANE_NO_SCALING , + false, true); +if (ret) +return ret; +else if (!new_plane_state->visible)return 0 ; -if (new_plane_state->crtc_x + new_plane_state->crtc_w > - crtc_state->adjusted_mode.hdisplay || - new_plane_state->crtc_y + new_plane_state->crtc_h > - crtc_state->adjusted_mode.vdisplay) { -drm_dbg_atomic (plane->dev,"visible portion of plane is invalid\n" ); -return -EINVAL ; - } -if (new_plane_state->fb->pitches[0 ] %128 !=0 ) {drm_dbg_atomic (plane->dev,"wrong stride with 128-byte aligned\n" );return -EINVAL ; } +return 0 ; }
Signature · 1 line
2.53.0