* [RFC PATCH 1/3] drm: use flags instead of boolean in plane check
@ 2020-09-10 9:24 Stefan Agner
2020-09-10 9:24 ` [RFC PATCH 2/3] drm/atomic-helper: add REQUIRE_MATCHING_FB flag Stefan Agner
` (3 more replies)
0 siblings, 4 replies; 11+ messages in thread
From: Stefan Agner @ 2020-09-10 9:24 UTC (permalink / raw)
To: marex, stefan, laurent.pinchart, daniel
Cc: airlied, tomi.valkeinen, dri-devel
To improve readability and make it easier to add further optional checks
replace the boolean parameters with a single flag bitfield as parameter
of drm_atomic_helper_check_plane_state.
The regular call sites have been converted using a simple coccinelle
patch.
virtual patch
@@
expression e1, e2, e3, e4;
symbol true, false;
@@
(
- drm_atomic_helper_check_plane_state(e1, e2, e3, e4, true, true)
+ drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED)
|
- drm_atomic_helper_check_plane_state(e1, e2, e3, e4, true, false)
+ drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_POSITION)
|
- drm_atomic_helper_check_plane_state(e1, e2, e3, e4, false, true)
+ drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_UPDATE_DISABLED)
|
- drm_atomic_helper_check_plane_state(e1, e2, e3, e4, false, false)
+ drm_atomic_helper_check_plane_state(e1, e2, e3, e4, 0)
)
Signed-off-by: Stefan Agner <stefan@agner.ch>
---
This implements what has been discussed in the thread of the patch
"drm: mxsfb: check framebuffer pitch":
https://lkml.org/lkml/2020/9/8/1342
Before sending it out to all maintainers I wanted to get conformation
if the general approach is fine.
I think in some places there should be another linebreak for the flags,
but this is what coccinelle gives me. Not sure if I should manually fix
those places...
--
Stefan
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 5 ++--
drivers/gpu/drm/arm/hdlcd_crtc.c | 6 ++---
drivers/gpu/drm/arm/malidp_planes.c | 5 ++--
drivers/gpu/drm/armada/armada_plane.c | 3 ++-
drivers/gpu/drm/ast/ast_mode.c | 4 +--
.../gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c | 4 +--
drivers/gpu/drm/drm_atomic_helper.c | 17 +++++++------
drivers/gpu/drm/drm_plane_helper.c | 9 +++----
drivers/gpu/drm/drm_simple_kms_helper.c | 2 +-
drivers/gpu/drm/i915/display/intel_display.c | 9 ++++---
drivers/gpu/drm/i915/display/intel_sprite.c | 6 ++---
drivers/gpu/drm/imx/ipuv3-plane.c | 7 ++++--
drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 7 ++++--
drivers/gpu/drm/mediatek/mtk_drm_plane.c | 4 +--
drivers/gpu/drm/meson/meson_overlay.c | 2 +-
drivers/gpu/drm/meson/meson_plane.c | 2 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 7 +++---
drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c | 4 +--
drivers/gpu/drm/mxsfb/mxsfb_kms.c | 2 +-
drivers/gpu/drm/nouveau/dispnv50/base507c.c | 2 +-
drivers/gpu/drm/nouveau/dispnv50/curs507a.c | 2 +-
drivers/gpu/drm/nouveau/dispnv50/ovly507e.c | 2 +-
drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c | 2 +-
drivers/gpu/drm/rcar-du/rcar_du_plane.c | 2 +-
drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 4 +--
.../gpu/drm/selftests/test-drm_plane_helper.c | 25 +++++++++----------
drivers/gpu/drm/sun4i/sun8i_ui_layer.c | 2 +-
drivers/gpu/drm/sun4i/sun8i_vi_layer.c | 2 +-
drivers/gpu/drm/tegra/plane.c | 5 ++--
drivers/gpu/drm/tidss/tidss_plane.c | 3 ++-
drivers/gpu/drm/vboxvideo/vbox_mode.c | 4 +--
drivers/gpu/drm/vc4/vc4_plane.c | 3 ++-
drivers/gpu/drm/virtio/virtgpu_plane.c | 7 ++++--
drivers/gpu/drm/vkms/vkms_plane.c | 8 +++---
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 4 +--
drivers/gpu/drm/xlnx/zynqmp_disp.c | 2 +-
drivers/gpu/drm/zte/zx_plane.c | 4 +--
include/drm/drm_atomic_helper.h | 7 ++++--
38 files changed, 108 insertions(+), 87 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index fd96fafec5b8..db0256ecf1a2 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -5731,8 +5731,9 @@ static int dm_plane_helper_check_state(struct drm_plane_state *state,
int max_upscale = INT_MAX;
/* TODO: These should be checked against DC plane caps */
- return drm_atomic_helper_check_plane_state(
- state, new_crtc_state, max_downscale, max_upscale, true, true);
+ return drm_atomic_helper_check_plane_state(state, new_crtc_state,
+ max_downscale, max_upscale,
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
}
static int dm_plane_atomic_check(struct drm_plane *plane,
diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c
index af67fefed38d..94c9a75c0c2d 100644
--- a/drivers/gpu/drm/arm/hdlcd_crtc.c
+++ b/drivers/gpu/drm/arm/hdlcd_crtc.c
@@ -247,9 +247,9 @@ static int hdlcd_plane_atomic_check(struct drm_plane *plane,
if (!state->fb && crtc_state->active)
return -EINVAL;
return drm_atomic_helper_check_plane_state(state, crtc_state,
- DRM_PLANE_HELPER_NO_SCALING,
- DRM_PLANE_HELPER_NO_SCALING,
- false, true);
+ DRM_PLANE_HELPER_NO_SCALING,
+ DRM_PLANE_HELPER_NO_SCALING,
+ DRM_PLANE_CAN_UPDATE_DISABLED);
}
return 0;
diff --git a/drivers/gpu/drm/arm/malidp_planes.c b/drivers/gpu/drm/arm/malidp_planes.c
index 351a85088d0e..c818e0a8e399 100644
--- a/drivers/gpu/drm/arm/malidp_planes.c
+++ b/drivers/gpu/drm/arm/malidp_planes.c
@@ -281,8 +281,9 @@ static int malidp_se_check_scaling(struct malidp_plane *mp,
mc = to_malidp_crtc_state(crtc_state);
- ret = drm_atomic_helper_check_plane_state(state, crtc_state,
- 0, INT_MAX, true, true);
+ ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
+ INT_MAX,
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/armada/armada_plane.c b/drivers/gpu/drm/armada/armada_plane.c
index e7cc2b343bcb..0f2af0faae5a 100644
--- a/drivers/gpu/drm/armada/armada_plane.c
+++ b/drivers/gpu/drm/armada/armada_plane.c
@@ -125,7 +125,8 @@ int armada_drm_plane_atomic_check(struct drm_plane *plane,
crtc_state = crtc->state;
ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
- INT_MAX, true, false);
+ INT_MAX,
+ DRM_PLANE_CAN_POSITION);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index 62fe682a7de6..5bafa1c5981f 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -539,7 +539,7 @@ static int ast_primary_plane_helper_atomic_check(struct drm_plane *plane,
ret = drm_atomic_helper_check_plane_state(state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- false, true);
+ DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
@@ -644,7 +644,7 @@ static int ast_cursor_plane_helper_atomic_check(struct drm_plane *plane,
ret = drm_atomic_helper_check_plane_state(state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
index 40800ec5700a..ecc0984b05d1 100644
--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
@@ -611,8 +611,8 @@ static int atmel_hlcdc_plane_atomic_check(struct drm_plane *p,
mode = &crtc_state->adjusted_mode;
ret = drm_atomic_helper_check_plane_state(s, crtc_state,
- (1 << 16) / 2048,
- INT_MAX, true, true);
+ (1 << 16) / 2048, INT_MAX,
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret || !s->visible)
return ret;
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index f68c69a45752..755572a37f3f 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -771,11 +771,7 @@ EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
* @crtc_state: CRTC state to check
* @min_scale: minimum @src:@dest scaling factor in 16.16 fixed point
* @max_scale: maximum @src:@dest scaling factor in 16.16 fixed point
- * @can_position: is it legal to position the plane such that it
- * doesn't cover the entire CRTC? This will generally
- * only be false for primary planes.
- * @can_update_disabled: can the plane be updated while the CRTC
- * is disabled?
+ * @flags: flags for checking the plane state
*
* Checks that a desired plane update is valid, and updates various
* bits of derived state (clipped coordinates etc.). Drivers that provide
@@ -783,6 +779,12 @@ EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
* still wish to call this function to avoid duplication of error checking
* code.
*
+ * Drivers may set the CAN_POSITION flag in @flags if the display controller
+ * can position the plane such that it doesn't cover the entire CRTC. This will
+ * generally be set for all but primary planes. The CAN_UPDATE_DISABLED flag
+ * may be set if the display controller can update the plane while the CRTC is
+ * disabled.
+ *
* RETURNS:
* Zero if update appears valid, error code on failure
*/
@@ -790,8 +792,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
const struct drm_crtc_state *crtc_state,
int min_scale,
int max_scale,
- bool can_position,
- bool can_update_disabled)
+ uint32_t flags)
{
struct drm_framebuffer *fb = plane_state->fb;
struct drm_rect *src = &plane_state->src;
@@ -799,6 +800,8 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
unsigned int rotation = plane_state->rotation;
struct drm_rect clip = {};
int hscale, vscale;
+ bool can_position = flags & DRM_PLANE_CAN_POSITION;
+ bool can_update_disabled = flags & DRM_PLANE_CAN_UPDATE_DISABLED;
WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c
index 3aae7ea522f2..1d5fd5f4da52 100644
--- a/drivers/gpu/drm/drm_plane_helper.c
+++ b/drivers/gpu/drm/drm_plane_helper.c
@@ -106,8 +106,7 @@ static int drm_plane_helper_check_update(struct drm_plane *plane,
unsigned int rotation,
int min_scale,
int max_scale,
- bool can_position,
- bool can_update_disabled,
+ uint32_t flags,
bool *visible)
{
struct drm_plane_state plane_state = {
@@ -133,9 +132,7 @@ static int drm_plane_helper_check_update(struct drm_plane *plane,
int ret;
ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
- min_scale, max_scale,
- can_position,
- can_update_disabled);
+ min_scale, max_scale, flags);
if (ret)
return ret;
@@ -182,7 +179,7 @@ static int drm_primary_helper_update(struct drm_plane *plane, struct drm_crtc *c
DRM_MODE_ROTATE_0,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- false, false, &visible);
+ 0, &visible);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c
index 74946690aba4..f3ce7a0a827c 100644
--- a/drivers/gpu/drm/drm_simple_kms_helper.c
+++ b/drivers/gpu/drm/drm_simple_kms_helper.c
@@ -178,7 +178,7 @@ static int drm_simple_kms_plane_atomic_check(struct drm_plane *plane,
ret = drm_atomic_helper_check_plane_state(plane_state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- false, true);
+ DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 729ec6e0d43a..04b3005162f5 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -4344,17 +4344,20 @@ i9xx_plane_check(struct intel_crtc_state *crtc_state,
{
struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
int ret;
+ uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
ret = chv_plane_check_rotation(plane_state);
if (ret)
return ret;
+ if (i9xx_plane_has_windowing(plane))
+ flags |= DRM_PLANE_CAN_POSITION;
+
ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
&crtc_state->uapi,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- i9xx_plane_has_windowing(plane),
- true);
+ flags);
if (ret)
return ret;
@@ -11367,7 +11370,7 @@ static int intel_check_cursor(struct intel_crtc_state *crtc_state,
&crtc_state->uapi,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/i915/display/intel_sprite.c b/drivers/gpu/drm/i915/display/intel_sprite.c
index d03860fef2d7..4f4ba474cf46 100644
--- a/drivers/gpu/drm/i915/display/intel_sprite.c
+++ b/drivers/gpu/drm/i915/display/intel_sprite.c
@@ -2013,7 +2013,7 @@ g4x_sprite_check(struct intel_crtc_state *crtc_state,
ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
&crtc_state->uapi,
min_scale, max_scale,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
@@ -2072,7 +2072,7 @@ vlv_sprite_check(struct intel_crtc_state *crtc_state,
&crtc_state->uapi,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
@@ -2282,7 +2282,7 @@ static int skl_plane_check(struct intel_crtc_state *crtc_state,
ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
&crtc_state->uapi,
min_scale, max_scale,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c
index 6776ebb3246d..d6e5f86c24d5 100644
--- a/drivers/gpu/drm/imx/ipuv3-plane.c
+++ b/drivers/gpu/drm/imx/ipuv3-plane.c
@@ -352,7 +352,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
struct drm_framebuffer *fb = state->fb;
struct drm_framebuffer *old_fb = old_state->fb;
unsigned long eba, ubo, vbo, old_ubo, old_vbo, alpha_eba;
- bool can_position = (plane->type == DRM_PLANE_TYPE_OVERLAY);
+ uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
int ret;
/* Ok to disable */
@@ -367,10 +367,13 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
if (WARN_ON(!crtc_state))
return -EINVAL;
+ if (plane->type == DRM_PLANE_TYPE_OVERLAY)
+ flags |= DRM_PLANE_CAN_POSITION;
+
ret = drm_atomic_helper_check_plane_state(state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- can_position, true);
+ flags);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
index 5dab9c3d0a52..d885b9e6bfee 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
@@ -298,6 +298,7 @@ static int ingenic_drm_plane_atomic_check(struct drm_plane *plane,
struct ingenic_drm *priv = drm_device_get_priv(plane->dev);
struct drm_crtc_state *crtc_state;
struct drm_crtc *crtc = state->crtc ?: plane->state->crtc;
+ uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
int ret;
if (!crtc)
@@ -307,11 +308,13 @@ static int ingenic_drm_plane_atomic_check(struct drm_plane *plane,
if (WARN_ON(!crtc_state))
return -EINVAL;
+ if (priv->soc_info->has_osd)
+ flags |= DRM_PLANE_CAN_POSITION;
+
ret = drm_atomic_helper_check_plane_state(state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- priv->soc_info->has_osd,
- true);
+ flags);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
index 92141a19681b..cfa7551b2a66 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
@@ -105,7 +105,7 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane,
return drm_atomic_helper_check_plane_state(plane->state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
}
static void mtk_plane_atomic_async_update(struct drm_plane *plane,
@@ -161,7 +161,7 @@ static int mtk_plane_atomic_check(struct drm_plane *plane,
return drm_atomic_helper_check_plane_state(state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
}
static void mtk_plane_atomic_disable(struct drm_plane *plane,
diff --git a/drivers/gpu/drm/meson/meson_overlay.c b/drivers/gpu/drm/meson/meson_overlay.c
index a8bcc70644df..91c1d86e0429 100644
--- a/drivers/gpu/drm/meson/meson_overlay.c
+++ b/drivers/gpu/drm/meson/meson_overlay.c
@@ -179,7 +179,7 @@ static int meson_overlay_atomic_check(struct drm_plane *plane,
return drm_atomic_helper_check_plane_state(state, crtc_state,
FRAC_16_16(1, 5),
FRAC_16_16(5, 1),
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
}
/* Takes a fixed 16.16 number and converts it to integer. */
diff --git a/drivers/gpu/drm/meson/meson_plane.c b/drivers/gpu/drm/meson/meson_plane.c
index 35338ed18209..1d4a4d62ff53 100644
--- a/drivers/gpu/drm/meson/meson_plane.c
+++ b/drivers/gpu/drm/meson/meson_plane.c
@@ -90,7 +90,7 @@ static int meson_plane_atomic_check(struct drm_plane *plane,
return drm_atomic_helper_check_plane_state(state, crtc_state,
FRAC_16_16(1, 5),
DRM_PLANE_HELPER_NO_SCALING,
- false, true);
+ DRM_PLANE_CAN_UPDATE_DISABLED);
}
#define MESON_MOD_AFBC_VALID_BITS (AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | \
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index 33f6c56f01ed..bf8153361f23 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -867,9 +867,10 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
state->crtc);
min_scale = FRAC_16_16(1, pdpu->pipe_sblk->maxdwnscale);
- ret = drm_atomic_helper_check_plane_state(state, crtc_state, min_scale,
- pdpu->pipe_sblk->maxupscale << 16,
- true, true);
+ ret = drm_atomic_helper_check_plane_state(state, crtc_state,
+ min_scale,
+ pdpu->pipe_sblk->maxupscale << 16,
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret) {
DPU_DEBUG_PLANE(pdpu, "Check plane state failed (%d)\n", ret);
return ret;
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
index 83423092de2f..c8f5d39dda29 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
@@ -300,7 +300,7 @@ static int mdp5_plane_atomic_check_with_state(struct drm_crtc_state *crtc_state,
ret = drm_atomic_helper_check_plane_state(state, crtc_state,
min_scale, max_scale,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
@@ -474,7 +474,7 @@ static int mdp5_plane_atomic_async_check(struct drm_plane *plane,
ret = drm_atomic_helper_check_plane_state(state, crtc_state,
min_scale, max_scale,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
index b721b8b262ce..c24ef330718e 100644
--- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
+++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
@@ -410,7 +410,7 @@ static int mxsfb_plane_atomic_check(struct drm_plane *plane,
return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- false, true);
+ DRM_PLANE_CAN_UPDATE_DISABLED);
}
static void mxsfb_plane_primary_atomic_update(struct drm_plane *plane,
diff --git a/drivers/gpu/drm/nouveau/dispnv50/base507c.c b/drivers/gpu/drm/nouveau/dispnv50/base507c.c
index 302d4e6fc52f..bc6846c6618b 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/base507c.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/base507c.c
@@ -236,7 +236,7 @@ base507c_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- false, true);
+ DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/nouveau/dispnv50/curs507a.c b/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
index 54fbd6fe751d..dbf5a23e178d 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
@@ -104,7 +104,7 @@ curs507a_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
asyh->curs.visible = asyw->state.visible;
if (ret || !asyh->curs.visible)
return ret;
diff --git a/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c b/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
index afd6c7271de1..56f98e464f2f 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
@@ -109,7 +109,7 @@ ovly507e_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c b/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
index 57df997c5ff3..b2441deb762f 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
@@ -303,7 +303,7 @@ wndwc37e_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
return drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
}
static const u32
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
index a0021fc25b27..713d4e06ce7e 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
@@ -587,7 +587,7 @@ int __rcar_du_plane_atomic_check(struct drm_plane *plane,
ret = drm_atomic_helper_check_plane_state(state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret < 0)
return ret;
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index c80f7d9fd13f..f2c64068888e 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -800,7 +800,7 @@ static int vop_plane_atomic_check(struct drm_plane *plane,
ret = drm_atomic_helper_check_plane_state(state, crtc_state,
min_scale, max_scale,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
@@ -1048,7 +1048,7 @@ static int vop_plane_atomic_async_check(struct drm_plane *plane,
return drm_atomic_helper_check_plane_state(plane->state, crtc_state,
min_scale, max_scale,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
}
static void vop_plane_atomic_async_update(struct drm_plane *plane,
diff --git a/drivers/gpu/drm/selftests/test-drm_plane_helper.c b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
index 0a9553f51796..01e95b2d572f 100644
--- a/drivers/gpu/drm/selftests/test-drm_plane_helper.c
+++ b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
@@ -103,7 +103,7 @@ int igt_check_plane_state(void *ignored)
ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- false, false);
+ 0);
FAIL(ret < 0, "Simple clipping check should pass\n");
FAIL_ON(!plane_state.visible);
FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1024 << 16, 768 << 16));
@@ -114,7 +114,7 @@ int igt_check_plane_state(void *ignored)
ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- false, false);
+ 0);
FAIL(ret < 0, "Rotated clipping check should pass\n");
FAIL_ON(!plane_state.visible);
FAIL_ON(!check_src_eq(&plane_state, 0, 0, 768 << 16, 1024 << 16));
@@ -127,13 +127,13 @@ int igt_check_plane_state(void *ignored)
ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- false, false);
+ 0);
FAIL(!ret, "Should not be able to position on the crtc with can_position=false\n");
ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- true, false);
+ DRM_PLANE_CAN_POSITION);
FAIL(ret < 0, "Simple positioning should work\n");
FAIL_ON(!plane_state.visible);
FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1023 << 16, 767 << 16));
@@ -145,12 +145,12 @@ int igt_check_plane_state(void *ignored)
ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
0x8001,
DRM_PLANE_HELPER_NO_SCALING,
- false, false);
+ 0);
FAIL(!ret, "Upscaling out of range should fail.\n");
ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
0x8000,
DRM_PLANE_HELPER_NO_SCALING,
- false, false);
+ 0);
FAIL(ret < 0, "Upscaling exactly 2x should work\n");
FAIL_ON(!plane_state.visible);
FAIL_ON(!check_src_eq(&plane_state, 0, 0, 512 << 16, 384 << 16));
@@ -159,11 +159,11 @@ int igt_check_plane_state(void *ignored)
set_src(&plane_state, 0, 0, 2048 << 16, 1536 << 16);
ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
- 0x1ffff, false, false);
+ 0x1ffff, 0);
FAIL(!ret, "Downscaling out of range should fail.\n");
ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
- 0x20000, false, false);
+ 0x20000, 0);
FAIL(ret < 0, "Should succeed with exact scaling limit\n");
FAIL_ON(!plane_state.visible);
FAIL_ON(!check_src_eq(&plane_state, 0, 0, 2048 << 16, 1536 << 16));
@@ -175,7 +175,7 @@ int igt_check_plane_state(void *ignored)
ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
0x10001,
- true, false);
+ DRM_PLANE_CAN_POSITION);
FAIL(ret < 0, "Should succeed by clipping to exact multiple");
FAIL_ON(!plane_state.visible);
FAIL_ON(!check_src_eq(&plane_state, 0, 0, 2 << 16, 2 << 16));
@@ -185,8 +185,7 @@ int igt_check_plane_state(void *ignored)
set_crtc(&plane_state, -2, -2, 1028, 772);
ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
- 0x10001,
- false, false);
+ 0x10001, 0);
FAIL(ret < 0, "Should succeed by clipping to exact multiple");
FAIL_ON(!plane_state.visible);
FAIL_ON(!check_src_eq(&plane_state, 0x40002, 0x40002, 1024 << 16, 768 << 16));
@@ -197,7 +196,7 @@ int igt_check_plane_state(void *ignored)
ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
0xffff,
DRM_PLANE_HELPER_NO_SCALING,
- true, false);
+ DRM_PLANE_CAN_POSITION);
FAIL(ret < 0, "Should succeed by clipping to exact multiple");
FAIL_ON(!plane_state.visible);
/* Should not be rounded to 0x20001, which would be upscaling. */
@@ -209,7 +208,7 @@ int igt_check_plane_state(void *ignored)
ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
0xffff,
DRM_PLANE_HELPER_NO_SCALING,
- false, false);
+ 0);
FAIL(ret < 0, "Should succeed by clipping to exact multiple");
FAIL_ON(!plane_state.visible);
FAIL_ON(!check_src_eq(&plane_state, 0x3fffe, 0x3fffe, 1024 << 16, 768 << 16));
diff --git a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
index 816ad4ce8996..c706b615bbe1 100644
--- a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
+++ b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
@@ -260,7 +260,7 @@ static int sun8i_ui_layer_atomic_check(struct drm_plane *plane,
return drm_atomic_helper_check_plane_state(state, crtc_state,
min_scale, max_scale,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
}
static void sun8i_ui_layer_atomic_disable(struct drm_plane *plane,
diff --git a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
index a360697a4a4a..7490c19b0117 100644
--- a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
+++ b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
@@ -363,7 +363,7 @@ static int sun8i_vi_layer_atomic_check(struct drm_plane *plane,
return drm_atomic_helper_check_plane_state(state, crtc_state,
min_scale, max_scale,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
}
static void sun8i_vi_layer_atomic_disable(struct drm_plane *plane,
diff --git a/drivers/gpu/drm/tegra/plane.c b/drivers/gpu/drm/tegra/plane.c
index 4cd0461cc508..7bb0d5361900 100644
--- a/drivers/gpu/drm/tegra/plane.c
+++ b/drivers/gpu/drm/tegra/plane.c
@@ -230,8 +230,9 @@ int tegra_plane_state_add(struct tegra_plane *plane,
return PTR_ERR(crtc_state);
/* Check plane state for visibility and calculate clipping bounds */
- err = drm_atomic_helper_check_plane_state(state, crtc_state,
- 0, INT_MAX, true, true);
+ err = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
+ INT_MAX,
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (err < 0)
return err;
diff --git a/drivers/gpu/drm/tidss/tidss_plane.c b/drivers/gpu/drm/tidss/tidss_plane.c
index 43e72d0b2d84..9b47cdab51fd 100644
--- a/drivers/gpu/drm/tidss/tidss_plane.c
+++ b/drivers/gpu/drm/tidss/tidss_plane.c
@@ -46,7 +46,8 @@ static int tidss_plane_atomic_check(struct drm_plane *plane,
return PTR_ERR(crtc_state);
ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
- INT_MAX, true, true);
+ INT_MAX,
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret < 0)
return ret;
diff --git a/drivers/gpu/drm/vboxvideo/vbox_mode.c b/drivers/gpu/drm/vboxvideo/vbox_mode.c
index d9a5af62af89..9a775cd71fe1 100644
--- a/drivers/gpu/drm/vboxvideo/vbox_mode.c
+++ b/drivers/gpu/drm/vboxvideo/vbox_mode.c
@@ -264,7 +264,7 @@ static int vbox_primary_atomic_check(struct drm_plane *plane,
return drm_atomic_helper_check_plane_state(new_state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- false, true);
+ DRM_PLANE_CAN_UPDATE_DISABLED);
}
static void vbox_primary_atomic_update(struct drm_plane *plane,
@@ -340,7 +340,7 @@ static int vbox_cursor_atomic_check(struct drm_plane *plane,
ret = drm_atomic_helper_check_plane_state(new_state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
index d040d9f12c6d..7263209bf266 100644
--- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -324,7 +324,8 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state)
}
ret = drm_atomic_helper_check_plane_state(state, crtc_state, 1,
- INT_MAX, true, true);
+ INT_MAX,
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c
index 6a311cd93440..1297c6c8bae8 100644
--- a/drivers/gpu/drm/virtio/virtgpu_plane.c
+++ b/drivers/gpu/drm/virtio/virtgpu_plane.c
@@ -85,7 +85,7 @@ static const struct drm_plane_funcs virtio_gpu_plane_funcs = {
static int virtio_gpu_plane_atomic_check(struct drm_plane *plane,
struct drm_plane_state *state)
{
- bool is_cursor = plane->type == DRM_PLANE_TYPE_CURSOR;
+ uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
struct drm_crtc_state *crtc_state;
int ret;
@@ -96,10 +96,13 @@ static int virtio_gpu_plane_atomic_check(struct drm_plane *plane,
if (IS_ERR(crtc_state))
return PTR_ERR(crtc_state);
+ if (plane->type == DRM_PLANE_TYPE_CURSOR)
+ flags |= DRM_PLANE_CAN_POSITION;
+
ret = drm_atomic_helper_check_plane_state(state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- is_cursor, true);
+ flags);
return ret;
}
diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_plane.c
index 6d31265a2ab7..6fa0f9452efd 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -114,7 +114,7 @@ static int vkms_plane_atomic_check(struct drm_plane *plane,
struct drm_plane_state *state)
{
struct drm_crtc_state *crtc_state;
- bool can_position = false;
+ uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
int ret;
if (!state->fb || WARN_ON(!state->crtc))
@@ -125,17 +125,17 @@ static int vkms_plane_atomic_check(struct drm_plane *plane,
return PTR_ERR(crtc_state);
if (plane->type == DRM_PLANE_TYPE_CURSOR)
- can_position = true;
+ flags |= DRM_PLANE_CAN_POSITION;
ret = drm_atomic_helper_check_plane_state(state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- can_position, true);
+ flags);
if (ret != 0)
return ret;
/* for now primary plane must be visible and full screen */
- if (!state->visible && !can_position)
+ if (!state->visible && plane->type != DRM_PLANE_TYPE_CURSOR)
return -EINVAL;
return 0;
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index 312ed0881a99..d58088ab44a4 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -453,7 +453,7 @@ int vmw_du_primary_plane_atomic_check(struct drm_plane *plane,
ret = drm_atomic_helper_check_plane_state(state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- false, true);
+ DRM_PLANE_CAN_UPDATE_DISABLED);
if (!ret && new_fb) {
struct drm_crtc *crtc = state->crtc;
@@ -494,7 +494,7 @@ int vmw_du_cursor_plane_atomic_check(struct drm_plane *plane,
ret = drm_atomic_helper_check_plane_state(new_state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/xlnx/zynqmp_disp.c b/drivers/gpu/drm/xlnx/zynqmp_disp.c
index a455cfc1bee5..4969e2e0c874 100644
--- a/drivers/gpu/drm/xlnx/zynqmp_disp.c
+++ b/drivers/gpu/drm/xlnx/zynqmp_disp.c
@@ -1164,7 +1164,7 @@ zynqmp_disp_plane_atomic_check(struct drm_plane *plane,
return drm_atomic_helper_check_plane_state(state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- false, false);
+ 0);
}
static void
diff --git a/drivers/gpu/drm/zte/zx_plane.c b/drivers/gpu/drm/zte/zx_plane.c
index c8f7b21fa09e..e12935ab488c 100644
--- a/drivers/gpu/drm/zte/zx_plane.c
+++ b/drivers/gpu/drm/zte/zx_plane.c
@@ -72,7 +72,7 @@ static int zx_vl_plane_atomic_check(struct drm_plane *plane,
return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
min_scale, max_scale,
- true, true);
+ DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
}
static int zx_vl_get_fmt(uint32_t format)
@@ -300,7 +300,7 @@ static int zx_gl_plane_atomic_check(struct drm_plane *plane,
return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- false, true);
+ DRM_PLANE_CAN_UPDATE_DISABLED);
}
static int zx_gl_get_fmt(uint32_t format)
diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
index b268180c97eb..bb9957b4f91b 100644
--- a/include/drm/drm_atomic_helper.h
+++ b/include/drm/drm_atomic_helper.h
@@ -40,12 +40,15 @@ struct drm_private_state;
int drm_atomic_helper_check_modeset(struct drm_device *dev,
struct drm_atomic_state *state);
+
+#define DRM_PLANE_CAN_POSITION BIT(0)
+#define DRM_PLANE_CAN_UPDATE_DISABLED BIT(1)
+
int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
const struct drm_crtc_state *crtc_state,
int min_scale,
int max_scale,
- bool can_position,
- bool can_update_disabled);
+ uint32_t flags);
int drm_atomic_helper_check_planes(struct drm_device *dev,
struct drm_atomic_state *state);
int drm_atomic_helper_check(struct drm_device *dev,
--
2.28.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 2/3] drm/atomic-helper: add REQUIRE_MATCHING_FB flag
2020-09-10 9:24 [RFC PATCH 1/3] drm: use flags instead of boolean in plane check Stefan Agner
@ 2020-09-10 9:24 ` Stefan Agner
2020-09-11 8:52 ` Daniel Vetter
2020-09-11 11:59 ` Ville Syrjälä
2020-09-10 9:24 ` [RFC PATCH 3/3] drm: mxsfb: enforce framebuffer size matches plane size Stefan Agner
` (2 subsequent siblings)
3 siblings, 2 replies; 11+ messages in thread
From: Stefan Agner @ 2020-09-10 9:24 UTC (permalink / raw)
To: marex, stefan, laurent.pinchart, daniel
Cc: airlied, tomi.valkeinen, dri-devel
Add flag which checks that the framebuffer size matches the plane size
exactly. This is useful for display controller which can't handle
framebuffers other than the plane/CRTC size.
Signed-off-by: Stefan Agner <stefan@agner.ch>
---
drivers/gpu/drm/drm_atomic_helper.c | 7 +++++++
drivers/gpu/drm/selftests/test-drm_plane_helper.c | 9 +++++++++
include/drm/drm_atomic_helper.h | 1 +
3 files changed, 17 insertions(+)
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index 755572a37f3f..8bc7f8c2e566 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -802,6 +802,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
int hscale, vscale;
bool can_position = flags & DRM_PLANE_CAN_POSITION;
bool can_update_disabled = flags & DRM_PLANE_CAN_UPDATE_DISABLED;
+ bool require_matching_fb = flags & DRM_PLANE_REQUIRE_MATCHING_FB;
WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
@@ -860,6 +861,12 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
return -EINVAL;
}
+ if (require_matching_fb && (drm_rect_width(src) != fb->width ||
+ drm_rect_height(src) != fb->height)) {
+ DRM_DEBUG_KMS("Framebuffer size must match plane size.\n");
+ return -EINVAL;
+ }
+
return 0;
}
EXPORT_SYMBOL(drm_atomic_helper_check_plane_state);
diff --git a/drivers/gpu/drm/selftests/test-drm_plane_helper.c b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
index 01e95b2d572f..2c81bbef830e 100644
--- a/drivers/gpu/drm/selftests/test-drm_plane_helper.c
+++ b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
@@ -139,6 +139,15 @@ int igt_check_plane_state(void *ignored)
FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1023 << 16, 767 << 16));
FAIL_ON(!check_crtc_eq(&plane_state, 0, 0, 1023, 767));
+ /* Check whether requiring same size framebuffer works correctly. */
+ set_src(&plane_state, 0, 0, 1024 << 16, 768 << 16);
+ set_crtc(&plane_state, 0, 0, 1024, 768);
+ ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
+ DRM_PLANE_HELPER_NO_SCALING,
+ DRM_PLANE_HELPER_NO_SCALING,
+ DRM_PLANE_REQUIRE_MATCHING_FB);
+ FAIL(!ret, "Should not be able to use different size framebuffer with REQUIRE_MATCHING_FB\n");
+
/* Simple scaling tests. */
set_src(&plane_state, 0, 0, 512 << 16, 384 << 16);
set_crtc(&plane_state, 0, 0, 1024, 768);
diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
index bb9957b4f91b..244b730e84d3 100644
--- a/include/drm/drm_atomic_helper.h
+++ b/include/drm/drm_atomic_helper.h
@@ -43,6 +43,7 @@ int drm_atomic_helper_check_modeset(struct drm_device *dev,
#define DRM_PLANE_CAN_POSITION BIT(0)
#define DRM_PLANE_CAN_UPDATE_DISABLED BIT(1)
+#define DRM_PLANE_REQUIRE_MATCHING_FB BIT(2)
int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
const struct drm_crtc_state *crtc_state,
--
2.28.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [RFC PATCH 3/3] drm: mxsfb: enforce framebuffer size matches plane size
2020-09-10 9:24 [RFC PATCH 1/3] drm: use flags instead of boolean in plane check Stefan Agner
2020-09-10 9:24 ` [RFC PATCH 2/3] drm/atomic-helper: add REQUIRE_MATCHING_FB flag Stefan Agner
@ 2020-09-10 9:24 ` Stefan Agner
2020-09-11 8:50 ` [RFC PATCH 1/3] drm: use flags instead of boolean in plane check Daniel Vetter
2020-09-15 22:58 ` Laurent Pinchart
3 siblings, 0 replies; 11+ messages in thread
From: Stefan Agner @ 2020-09-10 9:24 UTC (permalink / raw)
To: marex, stefan, laurent.pinchart, daniel
Cc: airlied, tomi.valkeinen, dri-devel
The plane size must match the CRTC already (enforced by not setting
the CAN_POSTION flag). However, the controller also requires the
framebuffer to be exactly the CRTC size. Make use of the new flag
DRM_PLANE_REQUIRE_MATCHING_FB to match the plane size.
Signed-off-by: Stefan Agner <stefan@agner.ch>
---
drivers/gpu/drm/mxsfb/mxsfb_kms.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
index c24ef330718e..7091da1c73cc 100644
--- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
+++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
@@ -410,7 +410,8 @@ static int mxsfb_plane_atomic_check(struct drm_plane *plane,
return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
DRM_PLANE_HELPER_NO_SCALING,
DRM_PLANE_HELPER_NO_SCALING,
- DRM_PLANE_CAN_UPDATE_DISABLED);
+ DRM_PLANE_CAN_UPDATE_DISABLED |
+ DRM_PLANE_REQUIRE_MATCHING_FB);
}
static void mxsfb_plane_primary_atomic_update(struct drm_plane *plane,
--
2.28.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 1/3] drm: use flags instead of boolean in plane check
2020-09-10 9:24 [RFC PATCH 1/3] drm: use flags instead of boolean in plane check Stefan Agner
2020-09-10 9:24 ` [RFC PATCH 2/3] drm/atomic-helper: add REQUIRE_MATCHING_FB flag Stefan Agner
2020-09-10 9:24 ` [RFC PATCH 3/3] drm: mxsfb: enforce framebuffer size matches plane size Stefan Agner
@ 2020-09-11 8:50 ` Daniel Vetter
2020-09-16 10:31 ` Stefan Agner
2020-09-15 22:58 ` Laurent Pinchart
3 siblings, 1 reply; 11+ messages in thread
From: Daniel Vetter @ 2020-09-11 8:50 UTC (permalink / raw)
To: Stefan Agner; +Cc: marex, airlied, dri-devel, tomi.valkeinen, laurent.pinchart
On Thu, Sep 10, 2020 at 11:24:23AM +0200, Stefan Agner wrote:
> To improve readability and make it easier to add further optional checks
> replace the boolean parameters with a single flag bitfield as parameter
> of drm_atomic_helper_check_plane_state.
>
> The regular call sites have been converted using a simple coccinelle
> patch.
>
> virtual patch
Looks reasonable, but needs kerneldoc. For that either do a list in the
kerneldoc for drm_atomic_helper_check_plane_state, or make the flags an
enum (still setting the value for each explicitly), and then kerneldoc
that with a link from the function to that.
-Daniel
>
> @@
> expression e1, e2, e3, e4;
> symbol true, false;
> @@
>
> (
> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, true, true)
> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED)
> |
> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, true, false)
> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_POSITION)
> |
> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, false, true)
> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_UPDATE_DISABLED)
> |
> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, false, false)
> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, 0)
> )
>
> Signed-off-by: Stefan Agner <stefan@agner.ch>
> ---
> This implements what has been discussed in the thread of the patch
> "drm: mxsfb: check framebuffer pitch":
> https://lkml.org/lkml/2020/9/8/1342
>
> Before sending it out to all maintainers I wanted to get conformation
> if the general approach is fine.
>
> I think in some places there should be another linebreak for the flags,
> but this is what coccinelle gives me. Not sure if I should manually fix
> those places...
>
> --
> Stefan
>
> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 5 ++--
> drivers/gpu/drm/arm/hdlcd_crtc.c | 6 ++---
> drivers/gpu/drm/arm/malidp_planes.c | 5 ++--
> drivers/gpu/drm/armada/armada_plane.c | 3 ++-
> drivers/gpu/drm/ast/ast_mode.c | 4 +--
> .../gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c | 4 +--
> drivers/gpu/drm/drm_atomic_helper.c | 17 +++++++------
> drivers/gpu/drm/drm_plane_helper.c | 9 +++----
> drivers/gpu/drm/drm_simple_kms_helper.c | 2 +-
> drivers/gpu/drm/i915/display/intel_display.c | 9 ++++---
> drivers/gpu/drm/i915/display/intel_sprite.c | 6 ++---
> drivers/gpu/drm/imx/ipuv3-plane.c | 7 ++++--
> drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 7 ++++--
> drivers/gpu/drm/mediatek/mtk_drm_plane.c | 4 +--
> drivers/gpu/drm/meson/meson_overlay.c | 2 +-
> drivers/gpu/drm/meson/meson_plane.c | 2 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 7 +++---
> drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c | 4 +--
> drivers/gpu/drm/mxsfb/mxsfb_kms.c | 2 +-
> drivers/gpu/drm/nouveau/dispnv50/base507c.c | 2 +-
> drivers/gpu/drm/nouveau/dispnv50/curs507a.c | 2 +-
> drivers/gpu/drm/nouveau/dispnv50/ovly507e.c | 2 +-
> drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c | 2 +-
> drivers/gpu/drm/rcar-du/rcar_du_plane.c | 2 +-
> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 4 +--
> .../gpu/drm/selftests/test-drm_plane_helper.c | 25 +++++++++----------
> drivers/gpu/drm/sun4i/sun8i_ui_layer.c | 2 +-
> drivers/gpu/drm/sun4i/sun8i_vi_layer.c | 2 +-
> drivers/gpu/drm/tegra/plane.c | 5 ++--
> drivers/gpu/drm/tidss/tidss_plane.c | 3 ++-
> drivers/gpu/drm/vboxvideo/vbox_mode.c | 4 +--
> drivers/gpu/drm/vc4/vc4_plane.c | 3 ++-
> drivers/gpu/drm/virtio/virtgpu_plane.c | 7 ++++--
> drivers/gpu/drm/vkms/vkms_plane.c | 8 +++---
> drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 4 +--
> drivers/gpu/drm/xlnx/zynqmp_disp.c | 2 +-
> drivers/gpu/drm/zte/zx_plane.c | 4 +--
> include/drm/drm_atomic_helper.h | 7 ++++--
> 38 files changed, 108 insertions(+), 87 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index fd96fafec5b8..db0256ecf1a2 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -5731,8 +5731,9 @@ static int dm_plane_helper_check_state(struct drm_plane_state *state,
> int max_upscale = INT_MAX;
>
> /* TODO: These should be checked against DC plane caps */
> - return drm_atomic_helper_check_plane_state(
> - state, new_crtc_state, max_downscale, max_upscale, true, true);
> + return drm_atomic_helper_check_plane_state(state, new_crtc_state,
> + max_downscale, max_upscale,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static int dm_plane_atomic_check(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c
> index af67fefed38d..94c9a75c0c2d 100644
> --- a/drivers/gpu/drm/arm/hdlcd_crtc.c
> +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c
> @@ -247,9 +247,9 @@ static int hdlcd_plane_atomic_check(struct drm_plane *plane,
> if (!state->fb && crtc_state->active)
> return -EINVAL;
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> - DRM_PLANE_HELPER_NO_SCALING,
> - DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_HELPER_NO_SCALING,
> + DRM_PLANE_HELPER_NO_SCALING,
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> return 0;
> diff --git a/drivers/gpu/drm/arm/malidp_planes.c b/drivers/gpu/drm/arm/malidp_planes.c
> index 351a85088d0e..c818e0a8e399 100644
> --- a/drivers/gpu/drm/arm/malidp_planes.c
> +++ b/drivers/gpu/drm/arm/malidp_planes.c
> @@ -281,8 +281,9 @@ static int malidp_se_check_scaling(struct malidp_plane *mp,
>
> mc = to_malidp_crtc_state(crtc_state);
>
> - ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> - 0, INT_MAX, true, true);
> + ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
> + INT_MAX,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/armada/armada_plane.c b/drivers/gpu/drm/armada/armada_plane.c
> index e7cc2b343bcb..0f2af0faae5a 100644
> --- a/drivers/gpu/drm/armada/armada_plane.c
> +++ b/drivers/gpu/drm/armada/armada_plane.c
> @@ -125,7 +125,8 @@ int armada_drm_plane_atomic_check(struct drm_plane *plane,
> crtc_state = crtc->state;
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
> - INT_MAX, true, false);
> + INT_MAX,
> + DRM_PLANE_CAN_POSITION);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index 62fe682a7de6..5bafa1c5981f 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -539,7 +539,7 @@ static int ast_primary_plane_helper_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> @@ -644,7 +644,7 @@ static int ast_cursor_plane_helper_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
> index 40800ec5700a..ecc0984b05d1 100644
> --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
> +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
> @@ -611,8 +611,8 @@ static int atmel_hlcdc_plane_atomic_check(struct drm_plane *p,
> mode = &crtc_state->adjusted_mode;
>
> ret = drm_atomic_helper_check_plane_state(s, crtc_state,
> - (1 << 16) / 2048,
> - INT_MAX, true, true);
> + (1 << 16) / 2048, INT_MAX,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret || !s->visible)
> return ret;
>
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> index f68c69a45752..755572a37f3f 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> @@ -771,11 +771,7 @@ EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
> * @crtc_state: CRTC state to check
> * @min_scale: minimum @src:@dest scaling factor in 16.16 fixed point
> * @max_scale: maximum @src:@dest scaling factor in 16.16 fixed point
> - * @can_position: is it legal to position the plane such that it
> - * doesn't cover the entire CRTC? This will generally
> - * only be false for primary planes.
> - * @can_update_disabled: can the plane be updated while the CRTC
> - * is disabled?
> + * @flags: flags for checking the plane state
> *
> * Checks that a desired plane update is valid, and updates various
> * bits of derived state (clipped coordinates etc.). Drivers that provide
> @@ -783,6 +779,12 @@ EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
> * still wish to call this function to avoid duplication of error checking
> * code.
> *
> + * Drivers may set the CAN_POSITION flag in @flags if the display controller
> + * can position the plane such that it doesn't cover the entire CRTC. This will
> + * generally be set for all but primary planes. The CAN_UPDATE_DISABLED flag
> + * may be set if the display controller can update the plane while the CRTC is
> + * disabled.
> + *
> * RETURNS:
> * Zero if update appears valid, error code on failure
> */
> @@ -790,8 +792,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> const struct drm_crtc_state *crtc_state,
> int min_scale,
> int max_scale,
> - bool can_position,
> - bool can_update_disabled)
> + uint32_t flags)
> {
> struct drm_framebuffer *fb = plane_state->fb;
> struct drm_rect *src = &plane_state->src;
> @@ -799,6 +800,8 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> unsigned int rotation = plane_state->rotation;
> struct drm_rect clip = {};
> int hscale, vscale;
> + bool can_position = flags & DRM_PLANE_CAN_POSITION;
> + bool can_update_disabled = flags & DRM_PLANE_CAN_UPDATE_DISABLED;
>
> WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
>
> diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c
> index 3aae7ea522f2..1d5fd5f4da52 100644
> --- a/drivers/gpu/drm/drm_plane_helper.c
> +++ b/drivers/gpu/drm/drm_plane_helper.c
> @@ -106,8 +106,7 @@ static int drm_plane_helper_check_update(struct drm_plane *plane,
> unsigned int rotation,
> int min_scale,
> int max_scale,
> - bool can_position,
> - bool can_update_disabled,
> + uint32_t flags,
> bool *visible)
> {
> struct drm_plane_state plane_state = {
> @@ -133,9 +132,7 @@ static int drm_plane_helper_check_update(struct drm_plane *plane,
> int ret;
>
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> - min_scale, max_scale,
> - can_position,
> - can_update_disabled);
> + min_scale, max_scale, flags);
> if (ret)
> return ret;
>
> @@ -182,7 +179,7 @@ static int drm_primary_helper_update(struct drm_plane *plane, struct drm_crtc *c
> DRM_MODE_ROTATE_0,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false, &visible);
> + 0, &visible);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c
> index 74946690aba4..f3ce7a0a827c 100644
> --- a/drivers/gpu/drm/drm_simple_kms_helper.c
> +++ b/drivers/gpu/drm/drm_simple_kms_helper.c
> @@ -178,7 +178,7 @@ static int drm_simple_kms_plane_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(plane_state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index 729ec6e0d43a..04b3005162f5 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -4344,17 +4344,20 @@ i9xx_plane_check(struct intel_crtc_state *crtc_state,
> {
> struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
> int ret;
> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
>
> ret = chv_plane_check_rotation(plane_state);
> if (ret)
> return ret;
>
> + if (i9xx_plane_has_windowing(plane))
> + flags |= DRM_PLANE_CAN_POSITION;
> +
> ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
> &crtc_state->uapi,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - i9xx_plane_has_windowing(plane),
> - true);
> + flags);
> if (ret)
> return ret;
>
> @@ -11367,7 +11370,7 @@ static int intel_check_cursor(struct intel_crtc_state *crtc_state,
> &crtc_state->uapi,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/i915/display/intel_sprite.c b/drivers/gpu/drm/i915/display/intel_sprite.c
> index d03860fef2d7..4f4ba474cf46 100644
> --- a/drivers/gpu/drm/i915/display/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/display/intel_sprite.c
> @@ -2013,7 +2013,7 @@ g4x_sprite_check(struct intel_crtc_state *crtc_state,
> ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
> &crtc_state->uapi,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> @@ -2072,7 +2072,7 @@ vlv_sprite_check(struct intel_crtc_state *crtc_state,
> &crtc_state->uapi,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> @@ -2282,7 +2282,7 @@ static int skl_plane_check(struct intel_crtc_state *crtc_state,
> ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
> &crtc_state->uapi,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c
> index 6776ebb3246d..d6e5f86c24d5 100644
> --- a/drivers/gpu/drm/imx/ipuv3-plane.c
> +++ b/drivers/gpu/drm/imx/ipuv3-plane.c
> @@ -352,7 +352,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
> struct drm_framebuffer *fb = state->fb;
> struct drm_framebuffer *old_fb = old_state->fb;
> unsigned long eba, ubo, vbo, old_ubo, old_vbo, alpha_eba;
> - bool can_position = (plane->type == DRM_PLANE_TYPE_OVERLAY);
> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
> int ret;
>
> /* Ok to disable */
> @@ -367,10 +367,13 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
> if (WARN_ON(!crtc_state))
> return -EINVAL;
>
> + if (plane->type == DRM_PLANE_TYPE_OVERLAY)
> + flags |= DRM_PLANE_CAN_POSITION;
> +
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - can_position, true);
> + flags);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> index 5dab9c3d0a52..d885b9e6bfee 100644
> --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> @@ -298,6 +298,7 @@ static int ingenic_drm_plane_atomic_check(struct drm_plane *plane,
> struct ingenic_drm *priv = drm_device_get_priv(plane->dev);
> struct drm_crtc_state *crtc_state;
> struct drm_crtc *crtc = state->crtc ?: plane->state->crtc;
> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
> int ret;
>
> if (!crtc)
> @@ -307,11 +308,13 @@ static int ingenic_drm_plane_atomic_check(struct drm_plane *plane,
> if (WARN_ON(!crtc_state))
> return -EINVAL;
>
> + if (priv->soc_info->has_osd)
> + flags |= DRM_PLANE_CAN_POSITION;
> +
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - priv->soc_info->has_osd,
> - true);
> + flags);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
> index 92141a19681b..cfa7551b2a66 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
> @@ -105,7 +105,7 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(plane->state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void mtk_plane_atomic_async_update(struct drm_plane *plane,
> @@ -161,7 +161,7 @@ static int mtk_plane_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void mtk_plane_atomic_disable(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/meson/meson_overlay.c b/drivers/gpu/drm/meson/meson_overlay.c
> index a8bcc70644df..91c1d86e0429 100644
> --- a/drivers/gpu/drm/meson/meson_overlay.c
> +++ b/drivers/gpu/drm/meson/meson_overlay.c
> @@ -179,7 +179,7 @@ static int meson_overlay_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> FRAC_16_16(1, 5),
> FRAC_16_16(5, 1),
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> /* Takes a fixed 16.16 number and converts it to integer. */
> diff --git a/drivers/gpu/drm/meson/meson_plane.c b/drivers/gpu/drm/meson/meson_plane.c
> index 35338ed18209..1d4a4d62ff53 100644
> --- a/drivers/gpu/drm/meson/meson_plane.c
> +++ b/drivers/gpu/drm/meson/meson_plane.c
> @@ -90,7 +90,7 @@ static int meson_plane_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> FRAC_16_16(1, 5),
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> #define MESON_MOD_AFBC_VALID_BITS (AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | \
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> index 33f6c56f01ed..bf8153361f23 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> @@ -867,9 +867,10 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
> state->crtc);
>
> min_scale = FRAC_16_16(1, pdpu->pipe_sblk->maxdwnscale);
> - ret = drm_atomic_helper_check_plane_state(state, crtc_state, min_scale,
> - pdpu->pipe_sblk->maxupscale << 16,
> - true, true);
> + ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> + min_scale,
> + pdpu->pipe_sblk->maxupscale << 16,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret) {
> DPU_DEBUG_PLANE(pdpu, "Check plane state failed (%d)\n", ret);
> return ret;
> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
> index 83423092de2f..c8f5d39dda29 100644
> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
> @@ -300,7 +300,7 @@ static int mdp5_plane_atomic_check_with_state(struct drm_crtc_state *crtc_state,
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> @@ -474,7 +474,7 @@ static int mdp5_plane_atomic_async_check(struct drm_plane *plane,
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> index b721b8b262ce..c24ef330718e 100644
> --- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> +++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> @@ -410,7 +410,7 @@ static int mxsfb_plane_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void mxsfb_plane_primary_atomic_update(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/nouveau/dispnv50/base507c.c b/drivers/gpu/drm/nouveau/dispnv50/base507c.c
> index 302d4e6fc52f..bc6846c6618b 100644
> --- a/drivers/gpu/drm/nouveau/dispnv50/base507c.c
> +++ b/drivers/gpu/drm/nouveau/dispnv50/base507c.c
> @@ -236,7 +236,7 @@ base507c_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
> ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/nouveau/dispnv50/curs507a.c b/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
> index 54fbd6fe751d..dbf5a23e178d 100644
> --- a/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
> +++ b/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
> @@ -104,7 +104,7 @@ curs507a_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
> ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> asyh->curs.visible = asyw->state.visible;
> if (ret || !asyh->curs.visible)
> return ret;
> diff --git a/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c b/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
> index afd6c7271de1..56f98e464f2f 100644
> --- a/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
> +++ b/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
> @@ -109,7 +109,7 @@ ovly507e_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
> ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c b/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
> index 57df997c5ff3..b2441deb762f 100644
> --- a/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
> +++ b/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
> @@ -303,7 +303,7 @@ wndwc37e_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
> return drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static const u32
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> index a0021fc25b27..713d4e06ce7e 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> @@ -587,7 +587,7 @@ int __rcar_du_plane_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret < 0)
> return ret;
>
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> index c80f7d9fd13f..f2c64068888e 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> @@ -800,7 +800,7 @@ static int vop_plane_atomic_check(struct drm_plane *plane,
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> @@ -1048,7 +1048,7 @@ static int vop_plane_atomic_async_check(struct drm_plane *plane,
>
> return drm_atomic_helper_check_plane_state(plane->state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void vop_plane_atomic_async_update(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/selftests/test-drm_plane_helper.c b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> index 0a9553f51796..01e95b2d572f 100644
> --- a/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> +++ b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> @@ -103,7 +103,7 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> FAIL(ret < 0, "Simple clipping check should pass\n");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1024 << 16, 768 << 16));
> @@ -114,7 +114,7 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> FAIL(ret < 0, "Rotated clipping check should pass\n");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 768 << 16, 1024 << 16));
> @@ -127,13 +127,13 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> FAIL(!ret, "Should not be able to position on the crtc with can_position=false\n");
>
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, false);
> + DRM_PLANE_CAN_POSITION);
> FAIL(ret < 0, "Simple positioning should work\n");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1023 << 16, 767 << 16));
> @@ -145,12 +145,12 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> 0x8001,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> FAIL(!ret, "Upscaling out of range should fail.\n");
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> 0x8000,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> FAIL(ret < 0, "Upscaling exactly 2x should work\n");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 512 << 16, 384 << 16));
> @@ -159,11 +159,11 @@ int igt_check_plane_state(void *ignored)
> set_src(&plane_state, 0, 0, 2048 << 16, 1536 << 16);
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> - 0x1ffff, false, false);
> + 0x1ffff, 0);
> FAIL(!ret, "Downscaling out of range should fail.\n");
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> - 0x20000, false, false);
> + 0x20000, 0);
> FAIL(ret < 0, "Should succeed with exact scaling limit\n");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 2048 << 16, 1536 << 16));
> @@ -175,7 +175,7 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> 0x10001,
> - true, false);
> + DRM_PLANE_CAN_POSITION);
> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 2 << 16, 2 << 16));
> @@ -185,8 +185,7 @@ int igt_check_plane_state(void *ignored)
> set_crtc(&plane_state, -2, -2, 1028, 772);
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> - 0x10001,
> - false, false);
> + 0x10001, 0);
> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0x40002, 0x40002, 1024 << 16, 768 << 16));
> @@ -197,7 +196,7 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> 0xffff,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, false);
> + DRM_PLANE_CAN_POSITION);
> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
> FAIL_ON(!plane_state.visible);
> /* Should not be rounded to 0x20001, which would be upscaling. */
> @@ -209,7 +208,7 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> 0xffff,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0x3fffe, 0x3fffe, 1024 << 16, 768 << 16));
> diff --git a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
> index 816ad4ce8996..c706b615bbe1 100644
> --- a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
> +++ b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
> @@ -260,7 +260,7 @@ static int sun8i_ui_layer_atomic_check(struct drm_plane *plane,
>
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void sun8i_ui_layer_atomic_disable(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
> index a360697a4a4a..7490c19b0117 100644
> --- a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
> +++ b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
> @@ -363,7 +363,7 @@ static int sun8i_vi_layer_atomic_check(struct drm_plane *plane,
>
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void sun8i_vi_layer_atomic_disable(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/tegra/plane.c b/drivers/gpu/drm/tegra/plane.c
> index 4cd0461cc508..7bb0d5361900 100644
> --- a/drivers/gpu/drm/tegra/plane.c
> +++ b/drivers/gpu/drm/tegra/plane.c
> @@ -230,8 +230,9 @@ int tegra_plane_state_add(struct tegra_plane *plane,
> return PTR_ERR(crtc_state);
>
> /* Check plane state for visibility and calculate clipping bounds */
> - err = drm_atomic_helper_check_plane_state(state, crtc_state,
> - 0, INT_MAX, true, true);
> + err = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
> + INT_MAX,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (err < 0)
> return err;
>
> diff --git a/drivers/gpu/drm/tidss/tidss_plane.c b/drivers/gpu/drm/tidss/tidss_plane.c
> index 43e72d0b2d84..9b47cdab51fd 100644
> --- a/drivers/gpu/drm/tidss/tidss_plane.c
> +++ b/drivers/gpu/drm/tidss/tidss_plane.c
> @@ -46,7 +46,8 @@ static int tidss_plane_atomic_check(struct drm_plane *plane,
> return PTR_ERR(crtc_state);
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
> - INT_MAX, true, true);
> + INT_MAX,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret < 0)
> return ret;
>
> diff --git a/drivers/gpu/drm/vboxvideo/vbox_mode.c b/drivers/gpu/drm/vboxvideo/vbox_mode.c
> index d9a5af62af89..9a775cd71fe1 100644
> --- a/drivers/gpu/drm/vboxvideo/vbox_mode.c
> +++ b/drivers/gpu/drm/vboxvideo/vbox_mode.c
> @@ -264,7 +264,7 @@ static int vbox_primary_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(new_state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void vbox_primary_atomic_update(struct drm_plane *plane,
> @@ -340,7 +340,7 @@ static int vbox_cursor_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(new_state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
> index d040d9f12c6d..7263209bf266 100644
> --- a/drivers/gpu/drm/vc4/vc4_plane.c
> +++ b/drivers/gpu/drm/vc4/vc4_plane.c
> @@ -324,7 +324,8 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state)
> }
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state, 1,
> - INT_MAX, true, true);
> + INT_MAX,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c
> index 6a311cd93440..1297c6c8bae8 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_plane.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_plane.c
> @@ -85,7 +85,7 @@ static const struct drm_plane_funcs virtio_gpu_plane_funcs = {
> static int virtio_gpu_plane_atomic_check(struct drm_plane *plane,
> struct drm_plane_state *state)
> {
> - bool is_cursor = plane->type == DRM_PLANE_TYPE_CURSOR;
> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
> struct drm_crtc_state *crtc_state;
> int ret;
>
> @@ -96,10 +96,13 @@ static int virtio_gpu_plane_atomic_check(struct drm_plane *plane,
> if (IS_ERR(crtc_state))
> return PTR_ERR(crtc_state);
>
> + if (plane->type == DRM_PLANE_TYPE_CURSOR)
> + flags |= DRM_PLANE_CAN_POSITION;
> +
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - is_cursor, true);
> + flags);
> return ret;
> }
>
> diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_plane.c
> index 6d31265a2ab7..6fa0f9452efd 100644
> --- a/drivers/gpu/drm/vkms/vkms_plane.c
> +++ b/drivers/gpu/drm/vkms/vkms_plane.c
> @@ -114,7 +114,7 @@ static int vkms_plane_atomic_check(struct drm_plane *plane,
> struct drm_plane_state *state)
> {
> struct drm_crtc_state *crtc_state;
> - bool can_position = false;
> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
> int ret;
>
> if (!state->fb || WARN_ON(!state->crtc))
> @@ -125,17 +125,17 @@ static int vkms_plane_atomic_check(struct drm_plane *plane,
> return PTR_ERR(crtc_state);
>
> if (plane->type == DRM_PLANE_TYPE_CURSOR)
> - can_position = true;
> + flags |= DRM_PLANE_CAN_POSITION;
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - can_position, true);
> + flags);
> if (ret != 0)
> return ret;
>
> /* for now primary plane must be visible and full screen */
> - if (!state->visible && !can_position)
> + if (!state->visible && plane->type != DRM_PLANE_TYPE_CURSOR)
> return -EINVAL;
>
> return 0;
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> index 312ed0881a99..d58088ab44a4 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> @@ -453,7 +453,7 @@ int vmw_du_primary_plane_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
>
> if (!ret && new_fb) {
> struct drm_crtc *crtc = state->crtc;
> @@ -494,7 +494,7 @@ int vmw_du_cursor_plane_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(new_state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/xlnx/zynqmp_disp.c b/drivers/gpu/drm/xlnx/zynqmp_disp.c
> index a455cfc1bee5..4969e2e0c874 100644
> --- a/drivers/gpu/drm/xlnx/zynqmp_disp.c
> +++ b/drivers/gpu/drm/xlnx/zynqmp_disp.c
> @@ -1164,7 +1164,7 @@ zynqmp_disp_plane_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> }
>
> static void
> diff --git a/drivers/gpu/drm/zte/zx_plane.c b/drivers/gpu/drm/zte/zx_plane.c
> index c8f7b21fa09e..e12935ab488c 100644
> --- a/drivers/gpu/drm/zte/zx_plane.c
> +++ b/drivers/gpu/drm/zte/zx_plane.c
> @@ -72,7 +72,7 @@ static int zx_vl_plane_atomic_check(struct drm_plane *plane,
>
> return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static int zx_vl_get_fmt(uint32_t format)
> @@ -300,7 +300,7 @@ static int zx_gl_plane_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static int zx_gl_get_fmt(uint32_t format)
> diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
> index b268180c97eb..bb9957b4f91b 100644
> --- a/include/drm/drm_atomic_helper.h
> +++ b/include/drm/drm_atomic_helper.h
> @@ -40,12 +40,15 @@ struct drm_private_state;
>
> int drm_atomic_helper_check_modeset(struct drm_device *dev,
> struct drm_atomic_state *state);
> +
> +#define DRM_PLANE_CAN_POSITION BIT(0)
> +#define DRM_PLANE_CAN_UPDATE_DISABLED BIT(1)
> +
> int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> const struct drm_crtc_state *crtc_state,
> int min_scale,
> int max_scale,
> - bool can_position,
> - bool can_update_disabled);
> + uint32_t flags);
> int drm_atomic_helper_check_planes(struct drm_device *dev,
> struct drm_atomic_state *state);
> int drm_atomic_helper_check(struct drm_device *dev,
> --
> 2.28.0
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 2/3] drm/atomic-helper: add REQUIRE_MATCHING_FB flag
2020-09-10 9:24 ` [RFC PATCH 2/3] drm/atomic-helper: add REQUIRE_MATCHING_FB flag Stefan Agner
@ 2020-09-11 8:52 ` Daniel Vetter
2020-09-16 10:44 ` Stefan Agner
2020-09-11 11:59 ` Ville Syrjälä
1 sibling, 1 reply; 11+ messages in thread
From: Daniel Vetter @ 2020-09-11 8:52 UTC (permalink / raw)
To: Stefan Agner; +Cc: marex, airlied, dri-devel, tomi.valkeinen, laurent.pinchart
On Thu, Sep 10, 2020 at 11:24:24AM +0200, Stefan Agner wrote:
> Add flag which checks that the framebuffer size matches the plane size
> exactly. This is useful for display controller which can't handle
> framebuffers other than the plane/CRTC size.
>
> Signed-off-by: Stefan Agner <stefan@agner.ch>
> ---
> drivers/gpu/drm/drm_atomic_helper.c | 7 +++++++
> drivers/gpu/drm/selftests/test-drm_plane_helper.c | 9 +++++++++
> include/drm/drm_atomic_helper.h | 1 +
> 3 files changed, 17 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> index 755572a37f3f..8bc7f8c2e566 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> @@ -802,6 +802,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> int hscale, vscale;
> bool can_position = flags & DRM_PLANE_CAN_POSITION;
> bool can_update_disabled = flags & DRM_PLANE_CAN_UPDATE_DISABLED;
> + bool require_matching_fb = flags & DRM_PLANE_REQUIRE_MATCHING_FB;
>
> WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
>
> @@ -860,6 +861,12 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> return -EINVAL;
> }
>
> + if (require_matching_fb && (drm_rect_width(src) != fb->width ||
> + drm_rect_height(src) != fb->height)) {
> + DRM_DEBUG_KMS("Framebuffer size must match plane size.\n");
> + return -EINVAL;
> + }
I think you also want to check that the x,y src are at (0, 0).
Plus needs kerneldoc.
But aside from the details, I like.
> +
> return 0;
> }
> EXPORT_SYMBOL(drm_atomic_helper_check_plane_state);
> diff --git a/drivers/gpu/drm/selftests/test-drm_plane_helper.c b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> index 01e95b2d572f..2c81bbef830e 100644
> --- a/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> +++ b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> @@ -139,6 +139,15 @@ int igt_check_plane_state(void *ignored)
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1023 << 16, 767 << 16));
> FAIL_ON(!check_crtc_eq(&plane_state, 0, 0, 1023, 767));
>
> + /* Check whether requiring same size framebuffer works correctly. */
> + set_src(&plane_state, 0, 0, 1024 << 16, 768 << 16);
> + set_crtc(&plane_state, 0, 0, 1024, 768);
> + ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> + DRM_PLANE_HELPER_NO_SCALING,
> + DRM_PLANE_HELPER_NO_SCALING,
> + DRM_PLANE_REQUIRE_MATCHING_FB);
> + FAIL(!ret, "Should not be able to use different size framebuffer with REQUIRE_MATCHING_FB\n");
I think also needs a negative test with src_x/y != 0, plus maybe one that
succeeds.
Cheers, Daniel
> +
> /* Simple scaling tests. */
> set_src(&plane_state, 0, 0, 512 << 16, 384 << 16);
> set_crtc(&plane_state, 0, 0, 1024, 768);
> diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
> index bb9957b4f91b..244b730e84d3 100644
> --- a/include/drm/drm_atomic_helper.h
> +++ b/include/drm/drm_atomic_helper.h
> @@ -43,6 +43,7 @@ int drm_atomic_helper_check_modeset(struct drm_device *dev,
>
> #define DRM_PLANE_CAN_POSITION BIT(0)
> #define DRM_PLANE_CAN_UPDATE_DISABLED BIT(1)
> +#define DRM_PLANE_REQUIRE_MATCHING_FB BIT(2)
>
> int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> const struct drm_crtc_state *crtc_state,
> --
> 2.28.0
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 2/3] drm/atomic-helper: add REQUIRE_MATCHING_FB flag
2020-09-10 9:24 ` [RFC PATCH 2/3] drm/atomic-helper: add REQUIRE_MATCHING_FB flag Stefan Agner
2020-09-11 8:52 ` Daniel Vetter
@ 2020-09-11 11:59 ` Ville Syrjälä
2020-09-16 10:49 ` Stefan Agner
1 sibling, 1 reply; 11+ messages in thread
From: Ville Syrjälä @ 2020-09-11 11:59 UTC (permalink / raw)
To: Stefan Agner; +Cc: marex, airlied, dri-devel, tomi.valkeinen, laurent.pinchart
On Thu, Sep 10, 2020 at 11:24:24AM +0200, Stefan Agner wrote:
> Add flag which checks that the framebuffer size matches the plane size
> exactly. This is useful for display controller which can't handle
> framebuffers other than the plane/CRTC size.
>
> Signed-off-by: Stefan Agner <stefan@agner.ch>
> ---
> drivers/gpu/drm/drm_atomic_helper.c | 7 +++++++
> drivers/gpu/drm/selftests/test-drm_plane_helper.c | 9 +++++++++
> include/drm/drm_atomic_helper.h | 1 +
> 3 files changed, 17 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> index 755572a37f3f..8bc7f8c2e566 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> @@ -802,6 +802,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> int hscale, vscale;
> bool can_position = flags & DRM_PLANE_CAN_POSITION;
> bool can_update_disabled = flags & DRM_PLANE_CAN_UPDATE_DISABLED;
> + bool require_matching_fb = flags & DRM_PLANE_REQUIRE_MATCHING_FB;
>
> WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
>
> @@ -860,6 +861,12 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> return -EINVAL;
> }
>
> + if (require_matching_fb && (drm_rect_width(src) != fb->width ||
> + drm_rect_height(src) != fb->height)) {
src rect is .16 fixed point vs. fb dimensions are integers
Still not a fan of these swiss army knife functions but meh.
> + DRM_DEBUG_KMS("Framebuffer size must match plane size.\n");
> + return -EINVAL;
> + }
> +
> return 0;
> }
> EXPORT_SYMBOL(drm_atomic_helper_check_plane_state);
> diff --git a/drivers/gpu/drm/selftests/test-drm_plane_helper.c b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> index 01e95b2d572f..2c81bbef830e 100644
> --- a/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> +++ b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> @@ -139,6 +139,15 @@ int igt_check_plane_state(void *ignored)
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1023 << 16, 767 << 16));
> FAIL_ON(!check_crtc_eq(&plane_state, 0, 0, 1023, 767));
>
> + /* Check whether requiring same size framebuffer works correctly. */
> + set_src(&plane_state, 0, 0, 1024 << 16, 768 << 16);
> + set_crtc(&plane_state, 0, 0, 1024, 768);
> + ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> + DRM_PLANE_HELPER_NO_SCALING,
> + DRM_PLANE_HELPER_NO_SCALING,
> + DRM_PLANE_REQUIRE_MATCHING_FB);
> + FAIL(!ret, "Should not be able to use different size framebuffer with REQUIRE_MATCHING_FB\n");
> +
> /* Simple scaling tests. */
> set_src(&plane_state, 0, 0, 512 << 16, 384 << 16);
> set_crtc(&plane_state, 0, 0, 1024, 768);
> diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
> index bb9957b4f91b..244b730e84d3 100644
> --- a/include/drm/drm_atomic_helper.h
> +++ b/include/drm/drm_atomic_helper.h
> @@ -43,6 +43,7 @@ int drm_atomic_helper_check_modeset(struct drm_device *dev,
>
> #define DRM_PLANE_CAN_POSITION BIT(0)
> #define DRM_PLANE_CAN_UPDATE_DISABLED BIT(1)
> +#define DRM_PLANE_REQUIRE_MATCHING_FB BIT(2)
>
> int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> const struct drm_crtc_state *crtc_state,
> --
> 2.28.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Ville Syrjälä
Intel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 1/3] drm: use flags instead of boolean in plane check
2020-09-10 9:24 [RFC PATCH 1/3] drm: use flags instead of boolean in plane check Stefan Agner
` (2 preceding siblings ...)
2020-09-11 8:50 ` [RFC PATCH 1/3] drm: use flags instead of boolean in plane check Daniel Vetter
@ 2020-09-15 22:58 ` Laurent Pinchart
3 siblings, 0 replies; 11+ messages in thread
From: Laurent Pinchart @ 2020-09-15 22:58 UTC (permalink / raw)
To: Stefan Agner; +Cc: marex, airlied, tomi.valkeinen, dri-devel
Hi Stefan,
Thank you for the patch.
On Thu, Sep 10, 2020 at 11:24:23AM +0200, Stefan Agner wrote:
> To improve readability and make it easier to add further optional checks
> replace the boolean parameters with a single flag bitfield as parameter
> of drm_atomic_helper_check_plane_state.
>
> The regular call sites have been converted using a simple coccinelle
> patch.
>
> virtual patch
>
> @@
> expression e1, e2, e3, e4;
> symbol true, false;
> @@
>
> (
> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, true, true)
> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED)
> |
> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, true, false)
> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_POSITION)
> |
> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, false, true)
> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_UPDATE_DISABLED)
> |
> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, false, false)
> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, 0)
> )
>
> Signed-off-by: Stefan Agner <stefan@agner.ch>
> ---
> This implements what has been discussed in the thread of the patch
> "drm: mxsfb: check framebuffer pitch":
> https://lkml.org/lkml/2020/9/8/1342
>
> Before sending it out to all maintainers I wanted to get conformation
> if the general approach is fine.
I think it's good, yes. As Daniel pointed out it's just missing
documentation.
> I think in some places there should be another linebreak for the flags,
> but this is what coccinelle gives me. Not sure if I should manually fix
> those places...
A break after | would indeed be nice. Sometimes manual edit is required,
although I've seen coccinelle indenting code correctly before. I'm no
expert in that area.
> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 5 ++--
> drivers/gpu/drm/arm/hdlcd_crtc.c | 6 ++---
> drivers/gpu/drm/arm/malidp_planes.c | 5 ++--
> drivers/gpu/drm/armada/armada_plane.c | 3 ++-
> drivers/gpu/drm/ast/ast_mode.c | 4 +--
> .../gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c | 4 +--
> drivers/gpu/drm/drm_atomic_helper.c | 17 +++++++------
> drivers/gpu/drm/drm_plane_helper.c | 9 +++----
> drivers/gpu/drm/drm_simple_kms_helper.c | 2 +-
> drivers/gpu/drm/i915/display/intel_display.c | 9 ++++---
> drivers/gpu/drm/i915/display/intel_sprite.c | 6 ++---
> drivers/gpu/drm/imx/ipuv3-plane.c | 7 ++++--
> drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 7 ++++--
> drivers/gpu/drm/mediatek/mtk_drm_plane.c | 4 +--
> drivers/gpu/drm/meson/meson_overlay.c | 2 +-
> drivers/gpu/drm/meson/meson_plane.c | 2 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 7 +++---
> drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c | 4 +--
> drivers/gpu/drm/mxsfb/mxsfb_kms.c | 2 +-
> drivers/gpu/drm/nouveau/dispnv50/base507c.c | 2 +-
> drivers/gpu/drm/nouveau/dispnv50/curs507a.c | 2 +-
> drivers/gpu/drm/nouveau/dispnv50/ovly507e.c | 2 +-
> drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c | 2 +-
> drivers/gpu/drm/rcar-du/rcar_du_plane.c | 2 +-
> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 4 +--
> .../gpu/drm/selftests/test-drm_plane_helper.c | 25 +++++++++----------
> drivers/gpu/drm/sun4i/sun8i_ui_layer.c | 2 +-
> drivers/gpu/drm/sun4i/sun8i_vi_layer.c | 2 +-
> drivers/gpu/drm/tegra/plane.c | 5 ++--
> drivers/gpu/drm/tidss/tidss_plane.c | 3 ++-
> drivers/gpu/drm/vboxvideo/vbox_mode.c | 4 +--
> drivers/gpu/drm/vc4/vc4_plane.c | 3 ++-
> drivers/gpu/drm/virtio/virtgpu_plane.c | 7 ++++--
> drivers/gpu/drm/vkms/vkms_plane.c | 8 +++---
> drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 4 +--
> drivers/gpu/drm/xlnx/zynqmp_disp.c | 2 +-
> drivers/gpu/drm/zte/zx_plane.c | 4 +--
> include/drm/drm_atomic_helper.h | 7 ++++--
> 38 files changed, 108 insertions(+), 87 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index fd96fafec5b8..db0256ecf1a2 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -5731,8 +5731,9 @@ static int dm_plane_helper_check_state(struct drm_plane_state *state,
> int max_upscale = INT_MAX;
>
> /* TODO: These should be checked against DC plane caps */
> - return drm_atomic_helper_check_plane_state(
> - state, new_crtc_state, max_downscale, max_upscale, true, true);
> + return drm_atomic_helper_check_plane_state(state, new_crtc_state,
> + max_downscale, max_upscale,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static int dm_plane_atomic_check(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c
> index af67fefed38d..94c9a75c0c2d 100644
> --- a/drivers/gpu/drm/arm/hdlcd_crtc.c
> +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c
> @@ -247,9 +247,9 @@ static int hdlcd_plane_atomic_check(struct drm_plane *plane,
> if (!state->fb && crtc_state->active)
> return -EINVAL;
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> - DRM_PLANE_HELPER_NO_SCALING,
> - DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_HELPER_NO_SCALING,
> + DRM_PLANE_HELPER_NO_SCALING,
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> return 0;
> diff --git a/drivers/gpu/drm/arm/malidp_planes.c b/drivers/gpu/drm/arm/malidp_planes.c
> index 351a85088d0e..c818e0a8e399 100644
> --- a/drivers/gpu/drm/arm/malidp_planes.c
> +++ b/drivers/gpu/drm/arm/malidp_planes.c
> @@ -281,8 +281,9 @@ static int malidp_se_check_scaling(struct malidp_plane *mp,
>
> mc = to_malidp_crtc_state(crtc_state);
>
> - ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> - 0, INT_MAX, true, true);
> + ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
> + INT_MAX,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/armada/armada_plane.c b/drivers/gpu/drm/armada/armada_plane.c
> index e7cc2b343bcb..0f2af0faae5a 100644
> --- a/drivers/gpu/drm/armada/armada_plane.c
> +++ b/drivers/gpu/drm/armada/armada_plane.c
> @@ -125,7 +125,8 @@ int armada_drm_plane_atomic_check(struct drm_plane *plane,
> crtc_state = crtc->state;
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
> - INT_MAX, true, false);
> + INT_MAX,
> + DRM_PLANE_CAN_POSITION);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index 62fe682a7de6..5bafa1c5981f 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -539,7 +539,7 @@ static int ast_primary_plane_helper_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> @@ -644,7 +644,7 @@ static int ast_cursor_plane_helper_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
> index 40800ec5700a..ecc0984b05d1 100644
> --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
> +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
> @@ -611,8 +611,8 @@ static int atmel_hlcdc_plane_atomic_check(struct drm_plane *p,
> mode = &crtc_state->adjusted_mode;
>
> ret = drm_atomic_helper_check_plane_state(s, crtc_state,
> - (1 << 16) / 2048,
> - INT_MAX, true, true);
> + (1 << 16) / 2048, INT_MAX,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret || !s->visible)
> return ret;
>
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> index f68c69a45752..755572a37f3f 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> @@ -771,11 +771,7 @@ EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
> * @crtc_state: CRTC state to check
> * @min_scale: minimum @src:@dest scaling factor in 16.16 fixed point
> * @max_scale: maximum @src:@dest scaling factor in 16.16 fixed point
> - * @can_position: is it legal to position the plane such that it
> - * doesn't cover the entire CRTC? This will generally
> - * only be false for primary planes.
> - * @can_update_disabled: can the plane be updated while the CRTC
> - * is disabled?
> + * @flags: flags for checking the plane state
> *
> * Checks that a desired plane update is valid, and updates various
> * bits of derived state (clipped coordinates etc.). Drivers that provide
> @@ -783,6 +779,12 @@ EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
> * still wish to call this function to avoid duplication of error checking
> * code.
> *
> + * Drivers may set the CAN_POSITION flag in @flags if the display controller
> + * can position the plane such that it doesn't cover the entire CRTC. This will
> + * generally be set for all but primary planes. The CAN_UPDATE_DISABLED flag
> + * may be set if the display controller can update the plane while the CRTC is
> + * disabled.
> + *
> * RETURNS:
> * Zero if update appears valid, error code on failure
> */
> @@ -790,8 +792,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> const struct drm_crtc_state *crtc_state,
> int min_scale,
> int max_scale,
> - bool can_position,
> - bool can_update_disabled)
> + uint32_t flags)
> {
> struct drm_framebuffer *fb = plane_state->fb;
> struct drm_rect *src = &plane_state->src;
> @@ -799,6 +800,8 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> unsigned int rotation = plane_state->rotation;
> struct drm_rect clip = {};
> int hscale, vscale;
> + bool can_position = flags & DRM_PLANE_CAN_POSITION;
> + bool can_update_disabled = flags & DRM_PLANE_CAN_UPDATE_DISABLED;
>
> WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
>
> diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c
> index 3aae7ea522f2..1d5fd5f4da52 100644
> --- a/drivers/gpu/drm/drm_plane_helper.c
> +++ b/drivers/gpu/drm/drm_plane_helper.c
> @@ -106,8 +106,7 @@ static int drm_plane_helper_check_update(struct drm_plane *plane,
> unsigned int rotation,
> int min_scale,
> int max_scale,
> - bool can_position,
> - bool can_update_disabled,
> + uint32_t flags,
> bool *visible)
> {
> struct drm_plane_state plane_state = {
> @@ -133,9 +132,7 @@ static int drm_plane_helper_check_update(struct drm_plane *plane,
> int ret;
>
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> - min_scale, max_scale,
> - can_position,
> - can_update_disabled);
> + min_scale, max_scale, flags);
> if (ret)
> return ret;
>
> @@ -182,7 +179,7 @@ static int drm_primary_helper_update(struct drm_plane *plane, struct drm_crtc *c
> DRM_MODE_ROTATE_0,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false, &visible);
> + 0, &visible);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c
> index 74946690aba4..f3ce7a0a827c 100644
> --- a/drivers/gpu/drm/drm_simple_kms_helper.c
> +++ b/drivers/gpu/drm/drm_simple_kms_helper.c
> @@ -178,7 +178,7 @@ static int drm_simple_kms_plane_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(plane_state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index 729ec6e0d43a..04b3005162f5 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -4344,17 +4344,20 @@ i9xx_plane_check(struct intel_crtc_state *crtc_state,
> {
> struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
> int ret;
> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
>
> ret = chv_plane_check_rotation(plane_state);
> if (ret)
> return ret;
>
> + if (i9xx_plane_has_windowing(plane))
> + flags |= DRM_PLANE_CAN_POSITION;
> +
> ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
> &crtc_state->uapi,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - i9xx_plane_has_windowing(plane),
> - true);
> + flags);
> if (ret)
> return ret;
>
> @@ -11367,7 +11370,7 @@ static int intel_check_cursor(struct intel_crtc_state *crtc_state,
> &crtc_state->uapi,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/i915/display/intel_sprite.c b/drivers/gpu/drm/i915/display/intel_sprite.c
> index d03860fef2d7..4f4ba474cf46 100644
> --- a/drivers/gpu/drm/i915/display/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/display/intel_sprite.c
> @@ -2013,7 +2013,7 @@ g4x_sprite_check(struct intel_crtc_state *crtc_state,
> ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
> &crtc_state->uapi,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> @@ -2072,7 +2072,7 @@ vlv_sprite_check(struct intel_crtc_state *crtc_state,
> &crtc_state->uapi,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> @@ -2282,7 +2282,7 @@ static int skl_plane_check(struct intel_crtc_state *crtc_state,
> ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
> &crtc_state->uapi,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c
> index 6776ebb3246d..d6e5f86c24d5 100644
> --- a/drivers/gpu/drm/imx/ipuv3-plane.c
> +++ b/drivers/gpu/drm/imx/ipuv3-plane.c
> @@ -352,7 +352,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
> struct drm_framebuffer *fb = state->fb;
> struct drm_framebuffer *old_fb = old_state->fb;
> unsigned long eba, ubo, vbo, old_ubo, old_vbo, alpha_eba;
> - bool can_position = (plane->type == DRM_PLANE_TYPE_OVERLAY);
> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
> int ret;
>
> /* Ok to disable */
> @@ -367,10 +367,13 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
> if (WARN_ON(!crtc_state))
> return -EINVAL;
>
> + if (plane->type == DRM_PLANE_TYPE_OVERLAY)
> + flags |= DRM_PLANE_CAN_POSITION;
> +
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - can_position, true);
> + flags);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> index 5dab9c3d0a52..d885b9e6bfee 100644
> --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> @@ -298,6 +298,7 @@ static int ingenic_drm_plane_atomic_check(struct drm_plane *plane,
> struct ingenic_drm *priv = drm_device_get_priv(plane->dev);
> struct drm_crtc_state *crtc_state;
> struct drm_crtc *crtc = state->crtc ?: plane->state->crtc;
> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
> int ret;
>
> if (!crtc)
> @@ -307,11 +308,13 @@ static int ingenic_drm_plane_atomic_check(struct drm_plane *plane,
> if (WARN_ON(!crtc_state))
> return -EINVAL;
>
> + if (priv->soc_info->has_osd)
> + flags |= DRM_PLANE_CAN_POSITION;
> +
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - priv->soc_info->has_osd,
> - true);
> + flags);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
> index 92141a19681b..cfa7551b2a66 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
> @@ -105,7 +105,7 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(plane->state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void mtk_plane_atomic_async_update(struct drm_plane *plane,
> @@ -161,7 +161,7 @@ static int mtk_plane_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void mtk_plane_atomic_disable(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/meson/meson_overlay.c b/drivers/gpu/drm/meson/meson_overlay.c
> index a8bcc70644df..91c1d86e0429 100644
> --- a/drivers/gpu/drm/meson/meson_overlay.c
> +++ b/drivers/gpu/drm/meson/meson_overlay.c
> @@ -179,7 +179,7 @@ static int meson_overlay_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> FRAC_16_16(1, 5),
> FRAC_16_16(5, 1),
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> /* Takes a fixed 16.16 number and converts it to integer. */
> diff --git a/drivers/gpu/drm/meson/meson_plane.c b/drivers/gpu/drm/meson/meson_plane.c
> index 35338ed18209..1d4a4d62ff53 100644
> --- a/drivers/gpu/drm/meson/meson_plane.c
> +++ b/drivers/gpu/drm/meson/meson_plane.c
> @@ -90,7 +90,7 @@ static int meson_plane_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> FRAC_16_16(1, 5),
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> #define MESON_MOD_AFBC_VALID_BITS (AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | \
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> index 33f6c56f01ed..bf8153361f23 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> @@ -867,9 +867,10 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
> state->crtc);
>
> min_scale = FRAC_16_16(1, pdpu->pipe_sblk->maxdwnscale);
> - ret = drm_atomic_helper_check_plane_state(state, crtc_state, min_scale,
> - pdpu->pipe_sblk->maxupscale << 16,
> - true, true);
> + ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> + min_scale,
> + pdpu->pipe_sblk->maxupscale << 16,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret) {
> DPU_DEBUG_PLANE(pdpu, "Check plane state failed (%d)\n", ret);
> return ret;
> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
> index 83423092de2f..c8f5d39dda29 100644
> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
> @@ -300,7 +300,7 @@ static int mdp5_plane_atomic_check_with_state(struct drm_crtc_state *crtc_state,
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> @@ -474,7 +474,7 @@ static int mdp5_plane_atomic_async_check(struct drm_plane *plane,
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> index b721b8b262ce..c24ef330718e 100644
> --- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> +++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> @@ -410,7 +410,7 @@ static int mxsfb_plane_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void mxsfb_plane_primary_atomic_update(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/nouveau/dispnv50/base507c.c b/drivers/gpu/drm/nouveau/dispnv50/base507c.c
> index 302d4e6fc52f..bc6846c6618b 100644
> --- a/drivers/gpu/drm/nouveau/dispnv50/base507c.c
> +++ b/drivers/gpu/drm/nouveau/dispnv50/base507c.c
> @@ -236,7 +236,7 @@ base507c_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
> ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/nouveau/dispnv50/curs507a.c b/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
> index 54fbd6fe751d..dbf5a23e178d 100644
> --- a/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
> +++ b/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
> @@ -104,7 +104,7 @@ curs507a_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
> ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> asyh->curs.visible = asyw->state.visible;
> if (ret || !asyh->curs.visible)
> return ret;
> diff --git a/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c b/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
> index afd6c7271de1..56f98e464f2f 100644
> --- a/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
> +++ b/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
> @@ -109,7 +109,7 @@ ovly507e_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
> ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c b/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
> index 57df997c5ff3..b2441deb762f 100644
> --- a/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
> +++ b/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
> @@ -303,7 +303,7 @@ wndwc37e_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
> return drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static const u32
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> index a0021fc25b27..713d4e06ce7e 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> @@ -587,7 +587,7 @@ int __rcar_du_plane_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret < 0)
> return ret;
>
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> index c80f7d9fd13f..f2c64068888e 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> @@ -800,7 +800,7 @@ static int vop_plane_atomic_check(struct drm_plane *plane,
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> @@ -1048,7 +1048,7 @@ static int vop_plane_atomic_async_check(struct drm_plane *plane,
>
> return drm_atomic_helper_check_plane_state(plane->state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void vop_plane_atomic_async_update(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/selftests/test-drm_plane_helper.c b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> index 0a9553f51796..01e95b2d572f 100644
> --- a/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> +++ b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> @@ -103,7 +103,7 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> FAIL(ret < 0, "Simple clipping check should pass\n");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1024 << 16, 768 << 16));
> @@ -114,7 +114,7 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> FAIL(ret < 0, "Rotated clipping check should pass\n");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 768 << 16, 1024 << 16));
> @@ -127,13 +127,13 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> FAIL(!ret, "Should not be able to position on the crtc with can_position=false\n");
>
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, false);
> + DRM_PLANE_CAN_POSITION);
> FAIL(ret < 0, "Simple positioning should work\n");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1023 << 16, 767 << 16));
> @@ -145,12 +145,12 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> 0x8001,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> FAIL(!ret, "Upscaling out of range should fail.\n");
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> 0x8000,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> FAIL(ret < 0, "Upscaling exactly 2x should work\n");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 512 << 16, 384 << 16));
> @@ -159,11 +159,11 @@ int igt_check_plane_state(void *ignored)
> set_src(&plane_state, 0, 0, 2048 << 16, 1536 << 16);
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> - 0x1ffff, false, false);
> + 0x1ffff, 0);
> FAIL(!ret, "Downscaling out of range should fail.\n");
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> - 0x20000, false, false);
> + 0x20000, 0);
> FAIL(ret < 0, "Should succeed with exact scaling limit\n");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 2048 << 16, 1536 << 16));
> @@ -175,7 +175,7 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> 0x10001,
> - true, false);
> + DRM_PLANE_CAN_POSITION);
> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 2 << 16, 2 << 16));
> @@ -185,8 +185,7 @@ int igt_check_plane_state(void *ignored)
> set_crtc(&plane_state, -2, -2, 1028, 772);
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> - 0x10001,
> - false, false);
> + 0x10001, 0);
> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0x40002, 0x40002, 1024 << 16, 768 << 16));
> @@ -197,7 +196,7 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> 0xffff,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, false);
> + DRM_PLANE_CAN_POSITION);
> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
> FAIL_ON(!plane_state.visible);
> /* Should not be rounded to 0x20001, which would be upscaling. */
> @@ -209,7 +208,7 @@ int igt_check_plane_state(void *ignored)
> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> 0xffff,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
> FAIL_ON(!plane_state.visible);
> FAIL_ON(!check_src_eq(&plane_state, 0x3fffe, 0x3fffe, 1024 << 16, 768 << 16));
> diff --git a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
> index 816ad4ce8996..c706b615bbe1 100644
> --- a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
> +++ b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
> @@ -260,7 +260,7 @@ static int sun8i_ui_layer_atomic_check(struct drm_plane *plane,
>
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void sun8i_ui_layer_atomic_disable(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
> index a360697a4a4a..7490c19b0117 100644
> --- a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
> +++ b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
> @@ -363,7 +363,7 @@ static int sun8i_vi_layer_atomic_check(struct drm_plane *plane,
>
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void sun8i_vi_layer_atomic_disable(struct drm_plane *plane,
> diff --git a/drivers/gpu/drm/tegra/plane.c b/drivers/gpu/drm/tegra/plane.c
> index 4cd0461cc508..7bb0d5361900 100644
> --- a/drivers/gpu/drm/tegra/plane.c
> +++ b/drivers/gpu/drm/tegra/plane.c
> @@ -230,8 +230,9 @@ int tegra_plane_state_add(struct tegra_plane *plane,
> return PTR_ERR(crtc_state);
>
> /* Check plane state for visibility and calculate clipping bounds */
> - err = drm_atomic_helper_check_plane_state(state, crtc_state,
> - 0, INT_MAX, true, true);
> + err = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
> + INT_MAX,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (err < 0)
> return err;
>
> diff --git a/drivers/gpu/drm/tidss/tidss_plane.c b/drivers/gpu/drm/tidss/tidss_plane.c
> index 43e72d0b2d84..9b47cdab51fd 100644
> --- a/drivers/gpu/drm/tidss/tidss_plane.c
> +++ b/drivers/gpu/drm/tidss/tidss_plane.c
> @@ -46,7 +46,8 @@ static int tidss_plane_atomic_check(struct drm_plane *plane,
> return PTR_ERR(crtc_state);
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
> - INT_MAX, true, true);
> + INT_MAX,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret < 0)
> return ret;
>
> diff --git a/drivers/gpu/drm/vboxvideo/vbox_mode.c b/drivers/gpu/drm/vboxvideo/vbox_mode.c
> index d9a5af62af89..9a775cd71fe1 100644
> --- a/drivers/gpu/drm/vboxvideo/vbox_mode.c
> +++ b/drivers/gpu/drm/vboxvideo/vbox_mode.c
> @@ -264,7 +264,7 @@ static int vbox_primary_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(new_state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static void vbox_primary_atomic_update(struct drm_plane *plane,
> @@ -340,7 +340,7 @@ static int vbox_cursor_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(new_state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
> index d040d9f12c6d..7263209bf266 100644
> --- a/drivers/gpu/drm/vc4/vc4_plane.c
> +++ b/drivers/gpu/drm/vc4/vc4_plane.c
> @@ -324,7 +324,8 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state)
> }
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state, 1,
> - INT_MAX, true, true);
> + INT_MAX,
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c
> index 6a311cd93440..1297c6c8bae8 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_plane.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_plane.c
> @@ -85,7 +85,7 @@ static const struct drm_plane_funcs virtio_gpu_plane_funcs = {
> static int virtio_gpu_plane_atomic_check(struct drm_plane *plane,
> struct drm_plane_state *state)
> {
> - bool is_cursor = plane->type == DRM_PLANE_TYPE_CURSOR;
> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
> struct drm_crtc_state *crtc_state;
> int ret;
>
> @@ -96,10 +96,13 @@ static int virtio_gpu_plane_atomic_check(struct drm_plane *plane,
> if (IS_ERR(crtc_state))
> return PTR_ERR(crtc_state);
>
> + if (plane->type == DRM_PLANE_TYPE_CURSOR)
> + flags |= DRM_PLANE_CAN_POSITION;
> +
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - is_cursor, true);
> + flags);
> return ret;
> }
>
> diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_plane.c
> index 6d31265a2ab7..6fa0f9452efd 100644
> --- a/drivers/gpu/drm/vkms/vkms_plane.c
> +++ b/drivers/gpu/drm/vkms/vkms_plane.c
> @@ -114,7 +114,7 @@ static int vkms_plane_atomic_check(struct drm_plane *plane,
> struct drm_plane_state *state)
> {
> struct drm_crtc_state *crtc_state;
> - bool can_position = false;
> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
> int ret;
>
> if (!state->fb || WARN_ON(!state->crtc))
> @@ -125,17 +125,17 @@ static int vkms_plane_atomic_check(struct drm_plane *plane,
> return PTR_ERR(crtc_state);
>
> if (plane->type == DRM_PLANE_TYPE_CURSOR)
> - can_position = true;
> + flags |= DRM_PLANE_CAN_POSITION;
>
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - can_position, true);
> + flags);
> if (ret != 0)
> return ret;
>
> /* for now primary plane must be visible and full screen */
> - if (!state->visible && !can_position)
> + if (!state->visible && plane->type != DRM_PLANE_TYPE_CURSOR)
> return -EINVAL;
>
> return 0;
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> index 312ed0881a99..d58088ab44a4 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> @@ -453,7 +453,7 @@ int vmw_du_primary_plane_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
>
> if (!ret && new_fb) {
> struct drm_crtc *crtc = state->crtc;
> @@ -494,7 +494,7 @@ int vmw_du_cursor_plane_atomic_check(struct drm_plane *plane,
> ret = drm_atomic_helper_check_plane_state(new_state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/xlnx/zynqmp_disp.c b/drivers/gpu/drm/xlnx/zynqmp_disp.c
> index a455cfc1bee5..4969e2e0c874 100644
> --- a/drivers/gpu/drm/xlnx/zynqmp_disp.c
> +++ b/drivers/gpu/drm/xlnx/zynqmp_disp.c
> @@ -1164,7 +1164,7 @@ zynqmp_disp_plane_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, false);
> + 0);
> }
>
> static void
> diff --git a/drivers/gpu/drm/zte/zx_plane.c b/drivers/gpu/drm/zte/zx_plane.c
> index c8f7b21fa09e..e12935ab488c 100644
> --- a/drivers/gpu/drm/zte/zx_plane.c
> +++ b/drivers/gpu/drm/zte/zx_plane.c
> @@ -72,7 +72,7 @@ static int zx_vl_plane_atomic_check(struct drm_plane *plane,
>
> return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
> min_scale, max_scale,
> - true, true);
> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static int zx_vl_get_fmt(uint32_t format)
> @@ -300,7 +300,7 @@ static int zx_gl_plane_atomic_check(struct drm_plane *plane,
> return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
> DRM_PLANE_HELPER_NO_SCALING,
> DRM_PLANE_HELPER_NO_SCALING,
> - false, true);
> + DRM_PLANE_CAN_UPDATE_DISABLED);
> }
>
> static int zx_gl_get_fmt(uint32_t format)
> diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
> index b268180c97eb..bb9957b4f91b 100644
> --- a/include/drm/drm_atomic_helper.h
> +++ b/include/drm/drm_atomic_helper.h
> @@ -40,12 +40,15 @@ struct drm_private_state;
>
> int drm_atomic_helper_check_modeset(struct drm_device *dev,
> struct drm_atomic_state *state);
> +
> +#define DRM_PLANE_CAN_POSITION BIT(0)
> +#define DRM_PLANE_CAN_UPDATE_DISABLED BIT(1)
> +
> int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> const struct drm_crtc_state *crtc_state,
> int min_scale,
> int max_scale,
> - bool can_position,
> - bool can_update_disabled);
> + uint32_t flags);
> int drm_atomic_helper_check_planes(struct drm_device *dev,
> struct drm_atomic_state *state);
> int drm_atomic_helper_check(struct drm_device *dev,
--
Regards,
Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 1/3] drm: use flags instead of boolean in plane check
2020-09-11 8:50 ` [RFC PATCH 1/3] drm: use flags instead of boolean in plane check Daniel Vetter
@ 2020-09-16 10:31 ` Stefan Agner
2020-09-16 11:26 ` Daniel Vetter
0 siblings, 1 reply; 11+ messages in thread
From: Stefan Agner @ 2020-09-16 10:31 UTC (permalink / raw)
To: Daniel Vetter; +Cc: marex, airlied, tomi.valkeinen, laurent.pinchart, dri-devel
On 2020-09-11 10:50, Daniel Vetter wrote:
> On Thu, Sep 10, 2020 at 11:24:23AM +0200, Stefan Agner wrote:
>> To improve readability and make it easier to add further optional checks
>> replace the boolean parameters with a single flag bitfield as parameter
>> of drm_atomic_helper_check_plane_state.
>>
>> The regular call sites have been converted using a simple coccinelle
>> patch.
>>
>> virtual patch
>
> Looks reasonable, but needs kerneldoc. For that either do a list in the
> kerneldoc for drm_atomic_helper_check_plane_state, or make the flags an
> enum (still setting the value for each explicitly), and then kerneldoc
> that with a link from the function to that.
The kerneldoc updates for drm_atomic_helper_check_plane_state() should
cover it mostly. I did miss update it in patch 2, so will fix that.
I thought to keep it similar to drm_atomic_helper_commit_planes() and
use #defines as well as describing the flags in the function kerneldoc.
Should I make it a list instead?
--
Stefan
> -Daniel
>
>>
>> @@
>> expression e1, e2, e3, e4;
>> symbol true, false;
>> @@
>>
>> (
>> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, true, true)
>> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED)
>> |
>> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, true, false)
>> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_POSITION)
>> |
>> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, false, true)
>> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_UPDATE_DISABLED)
>> |
>> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, false, false)
>> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, 0)
>> )
>>
>> Signed-off-by: Stefan Agner <stefan@agner.ch>
>> ---
>> This implements what has been discussed in the thread of the patch
>> "drm: mxsfb: check framebuffer pitch":
>> https://lkml.org/lkml/2020/9/8/1342
>>
>> Before sending it out to all maintainers I wanted to get conformation
>> if the general approach is fine.
>>
>> I think in some places there should be another linebreak for the flags,
>> but this is what coccinelle gives me. Not sure if I should manually fix
>> those places...
>>
>> --
>> Stefan
>>
>> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 5 ++--
>> drivers/gpu/drm/arm/hdlcd_crtc.c | 6 ++---
>> drivers/gpu/drm/arm/malidp_planes.c | 5 ++--
>> drivers/gpu/drm/armada/armada_plane.c | 3 ++-
>> drivers/gpu/drm/ast/ast_mode.c | 4 +--
>> .../gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c | 4 +--
>> drivers/gpu/drm/drm_atomic_helper.c | 17 +++++++------
>> drivers/gpu/drm/drm_plane_helper.c | 9 +++----
>> drivers/gpu/drm/drm_simple_kms_helper.c | 2 +-
>> drivers/gpu/drm/i915/display/intel_display.c | 9 ++++---
>> drivers/gpu/drm/i915/display/intel_sprite.c | 6 ++---
>> drivers/gpu/drm/imx/ipuv3-plane.c | 7 ++++--
>> drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 7 ++++--
>> drivers/gpu/drm/mediatek/mtk_drm_plane.c | 4 +--
>> drivers/gpu/drm/meson/meson_overlay.c | 2 +-
>> drivers/gpu/drm/meson/meson_plane.c | 2 +-
>> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 7 +++---
>> drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c | 4 +--
>> drivers/gpu/drm/mxsfb/mxsfb_kms.c | 2 +-
>> drivers/gpu/drm/nouveau/dispnv50/base507c.c | 2 +-
>> drivers/gpu/drm/nouveau/dispnv50/curs507a.c | 2 +-
>> drivers/gpu/drm/nouveau/dispnv50/ovly507e.c | 2 +-
>> drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c | 2 +-
>> drivers/gpu/drm/rcar-du/rcar_du_plane.c | 2 +-
>> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 4 +--
>> .../gpu/drm/selftests/test-drm_plane_helper.c | 25 +++++++++----------
>> drivers/gpu/drm/sun4i/sun8i_ui_layer.c | 2 +-
>> drivers/gpu/drm/sun4i/sun8i_vi_layer.c | 2 +-
>> drivers/gpu/drm/tegra/plane.c | 5 ++--
>> drivers/gpu/drm/tidss/tidss_plane.c | 3 ++-
>> drivers/gpu/drm/vboxvideo/vbox_mode.c | 4 +--
>> drivers/gpu/drm/vc4/vc4_plane.c | 3 ++-
>> drivers/gpu/drm/virtio/virtgpu_plane.c | 7 ++++--
>> drivers/gpu/drm/vkms/vkms_plane.c | 8 +++---
>> drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 4 +--
>> drivers/gpu/drm/xlnx/zynqmp_disp.c | 2 +-
>> drivers/gpu/drm/zte/zx_plane.c | 4 +--
>> include/drm/drm_atomic_helper.h | 7 ++++--
>> 38 files changed, 108 insertions(+), 87 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>> index fd96fafec5b8..db0256ecf1a2 100644
>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>> @@ -5731,8 +5731,9 @@ static int dm_plane_helper_check_state(struct drm_plane_state *state,
>> int max_upscale = INT_MAX;
>>
>> /* TODO: These should be checked against DC plane caps */
>> - return drm_atomic_helper_check_plane_state(
>> - state, new_crtc_state, max_downscale, max_upscale, true, true);
>> + return drm_atomic_helper_check_plane_state(state, new_crtc_state,
>> + max_downscale, max_upscale,
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> static int dm_plane_atomic_check(struct drm_plane *plane,
>> diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c
>> index af67fefed38d..94c9a75c0c2d 100644
>> --- a/drivers/gpu/drm/arm/hdlcd_crtc.c
>> +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c
>> @@ -247,9 +247,9 @@ static int hdlcd_plane_atomic_check(struct drm_plane *plane,
>> if (!state->fb && crtc_state->active)
>> return -EINVAL;
>> return drm_atomic_helper_check_plane_state(state, crtc_state,
>> - DRM_PLANE_HELPER_NO_SCALING,
>> - DRM_PLANE_HELPER_NO_SCALING,
>> - false, true);
>> + DRM_PLANE_HELPER_NO_SCALING,
>> + DRM_PLANE_HELPER_NO_SCALING,
>> + DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> return 0;
>> diff --git a/drivers/gpu/drm/arm/malidp_planes.c b/drivers/gpu/drm/arm/malidp_planes.c
>> index 351a85088d0e..c818e0a8e399 100644
>> --- a/drivers/gpu/drm/arm/malidp_planes.c
>> +++ b/drivers/gpu/drm/arm/malidp_planes.c
>> @@ -281,8 +281,9 @@ static int malidp_se_check_scaling(struct malidp_plane *mp,
>>
>> mc = to_malidp_crtc_state(crtc_state);
>>
>> - ret = drm_atomic_helper_check_plane_state(state, crtc_state,
>> - 0, INT_MAX, true, true);
>> + ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
>> + INT_MAX,
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/armada/armada_plane.c b/drivers/gpu/drm/armada/armada_plane.c
>> index e7cc2b343bcb..0f2af0faae5a 100644
>> --- a/drivers/gpu/drm/armada/armada_plane.c
>> +++ b/drivers/gpu/drm/armada/armada_plane.c
>> @@ -125,7 +125,8 @@ int armada_drm_plane_atomic_check(struct drm_plane *plane,
>> crtc_state = crtc->state;
>>
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
>> - INT_MAX, true, false);
>> + INT_MAX,
>> + DRM_PLANE_CAN_POSITION);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
>> index 62fe682a7de6..5bafa1c5981f 100644
>> --- a/drivers/gpu/drm/ast/ast_mode.c
>> +++ b/drivers/gpu/drm/ast/ast_mode.c
>> @@ -539,7 +539,7 @@ static int ast_primary_plane_helper_atomic_check(struct drm_plane *plane,
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, true);
>> + DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> @@ -644,7 +644,7 @@ static int ast_cursor_plane_helper_atomic_check(struct drm_plane *plane,
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
>> index 40800ec5700a..ecc0984b05d1 100644
>> --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
>> +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
>> @@ -611,8 +611,8 @@ static int atmel_hlcdc_plane_atomic_check(struct drm_plane *p,
>> mode = &crtc_state->adjusted_mode;
>>
>> ret = drm_atomic_helper_check_plane_state(s, crtc_state,
>> - (1 << 16) / 2048,
>> - INT_MAX, true, true);
>> + (1 << 16) / 2048, INT_MAX,
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret || !s->visible)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
>> index f68c69a45752..755572a37f3f 100644
>> --- a/drivers/gpu/drm/drm_atomic_helper.c
>> +++ b/drivers/gpu/drm/drm_atomic_helper.c
>> @@ -771,11 +771,7 @@ EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
>> * @crtc_state: CRTC state to check
>> * @min_scale: minimum @src:@dest scaling factor in 16.16 fixed point
>> * @max_scale: maximum @src:@dest scaling factor in 16.16 fixed point
>> - * @can_position: is it legal to position the plane such that it
>> - * doesn't cover the entire CRTC? This will generally
>> - * only be false for primary planes.
>> - * @can_update_disabled: can the plane be updated while the CRTC
>> - * is disabled?
>> + * @flags: flags for checking the plane state
>> *
>> * Checks that a desired plane update is valid, and updates various
>> * bits of derived state (clipped coordinates etc.). Drivers that provide
>> @@ -783,6 +779,12 @@ EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
>> * still wish to call this function to avoid duplication of error checking
>> * code.
>> *
>> + * Drivers may set the CAN_POSITION flag in @flags if the display controller
>> + * can position the plane such that it doesn't cover the entire CRTC. This will
>> + * generally be set for all but primary planes. The CAN_UPDATE_DISABLED flag
>> + * may be set if the display controller can update the plane while the CRTC is
>> + * disabled.
>> + *
>> * RETURNS:
>> * Zero if update appears valid, error code on failure
>> */
>> @@ -790,8 +792,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
>> const struct drm_crtc_state *crtc_state,
>> int min_scale,
>> int max_scale,
>> - bool can_position,
>> - bool can_update_disabled)
>> + uint32_t flags)
>> {
>> struct drm_framebuffer *fb = plane_state->fb;
>> struct drm_rect *src = &plane_state->src;
>> @@ -799,6 +800,8 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
>> unsigned int rotation = plane_state->rotation;
>> struct drm_rect clip = {};
>> int hscale, vscale;
>> + bool can_position = flags & DRM_PLANE_CAN_POSITION;
>> + bool can_update_disabled = flags & DRM_PLANE_CAN_UPDATE_DISABLED;
>>
>> WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
>>
>> diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c
>> index 3aae7ea522f2..1d5fd5f4da52 100644
>> --- a/drivers/gpu/drm/drm_plane_helper.c
>> +++ b/drivers/gpu/drm/drm_plane_helper.c
>> @@ -106,8 +106,7 @@ static int drm_plane_helper_check_update(struct drm_plane *plane,
>> unsigned int rotation,
>> int min_scale,
>> int max_scale,
>> - bool can_position,
>> - bool can_update_disabled,
>> + uint32_t flags,
>> bool *visible)
>> {
>> struct drm_plane_state plane_state = {
>> @@ -133,9 +132,7 @@ static int drm_plane_helper_check_update(struct drm_plane *plane,
>> int ret;
>>
>> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> - min_scale, max_scale,
>> - can_position,
>> - can_update_disabled);
>> + min_scale, max_scale, flags);
>> if (ret)
>> return ret;
>>
>> @@ -182,7 +179,7 @@ static int drm_primary_helper_update(struct drm_plane *plane, struct drm_crtc *c
>> DRM_MODE_ROTATE_0,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, false, &visible);
>> + 0, &visible);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c
>> index 74946690aba4..f3ce7a0a827c 100644
>> --- a/drivers/gpu/drm/drm_simple_kms_helper.c
>> +++ b/drivers/gpu/drm/drm_simple_kms_helper.c
>> @@ -178,7 +178,7 @@ static int drm_simple_kms_plane_atomic_check(struct drm_plane *plane,
>> ret = drm_atomic_helper_check_plane_state(plane_state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, true);
>> + DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
>> index 729ec6e0d43a..04b3005162f5 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display.c
>> +++ b/drivers/gpu/drm/i915/display/intel_display.c
>> @@ -4344,17 +4344,20 @@ i9xx_plane_check(struct intel_crtc_state *crtc_state,
>> {
>> struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
>> int ret;
>> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
>>
>> ret = chv_plane_check_rotation(plane_state);
>> if (ret)
>> return ret;
>>
>> + if (i9xx_plane_has_windowing(plane))
>> + flags |= DRM_PLANE_CAN_POSITION;
>> +
>> ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
>> &crtc_state->uapi,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - i9xx_plane_has_windowing(plane),
>> - true);
>> + flags);
>> if (ret)
>> return ret;
>>
>> @@ -11367,7 +11370,7 @@ static int intel_check_cursor(struct intel_crtc_state *crtc_state,
>> &crtc_state->uapi,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/i915/display/intel_sprite.c b/drivers/gpu/drm/i915/display/intel_sprite.c
>> index d03860fef2d7..4f4ba474cf46 100644
>> --- a/drivers/gpu/drm/i915/display/intel_sprite.c
>> +++ b/drivers/gpu/drm/i915/display/intel_sprite.c
>> @@ -2013,7 +2013,7 @@ g4x_sprite_check(struct intel_crtc_state *crtc_state,
>> ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
>> &crtc_state->uapi,
>> min_scale, max_scale,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> @@ -2072,7 +2072,7 @@ vlv_sprite_check(struct intel_crtc_state *crtc_state,
>> &crtc_state->uapi,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> @@ -2282,7 +2282,7 @@ static int skl_plane_check(struct intel_crtc_state *crtc_state,
>> ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
>> &crtc_state->uapi,
>> min_scale, max_scale,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c
>> index 6776ebb3246d..d6e5f86c24d5 100644
>> --- a/drivers/gpu/drm/imx/ipuv3-plane.c
>> +++ b/drivers/gpu/drm/imx/ipuv3-plane.c
>> @@ -352,7 +352,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
>> struct drm_framebuffer *fb = state->fb;
>> struct drm_framebuffer *old_fb = old_state->fb;
>> unsigned long eba, ubo, vbo, old_ubo, old_vbo, alpha_eba;
>> - bool can_position = (plane->type == DRM_PLANE_TYPE_OVERLAY);
>> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
>> int ret;
>>
>> /* Ok to disable */
>> @@ -367,10 +367,13 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
>> if (WARN_ON(!crtc_state))
>> return -EINVAL;
>>
>> + if (plane->type == DRM_PLANE_TYPE_OVERLAY)
>> + flags |= DRM_PLANE_CAN_POSITION;
>> +
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - can_position, true);
>> + flags);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
>> index 5dab9c3d0a52..d885b9e6bfee 100644
>> --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
>> +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
>> @@ -298,6 +298,7 @@ static int ingenic_drm_plane_atomic_check(struct drm_plane *plane,
>> struct ingenic_drm *priv = drm_device_get_priv(plane->dev);
>> struct drm_crtc_state *crtc_state;
>> struct drm_crtc *crtc = state->crtc ?: plane->state->crtc;
>> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
>> int ret;
>>
>> if (!crtc)
>> @@ -307,11 +308,13 @@ static int ingenic_drm_plane_atomic_check(struct drm_plane *plane,
>> if (WARN_ON(!crtc_state))
>> return -EINVAL;
>>
>> + if (priv->soc_info->has_osd)
>> + flags |= DRM_PLANE_CAN_POSITION;
>> +
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - priv->soc_info->has_osd,
>> - true);
>> + flags);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
>> index 92141a19681b..cfa7551b2a66 100644
>> --- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c
>> +++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
>> @@ -105,7 +105,7 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane,
>> return drm_atomic_helper_check_plane_state(plane->state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> static void mtk_plane_atomic_async_update(struct drm_plane *plane,
>> @@ -161,7 +161,7 @@ static int mtk_plane_atomic_check(struct drm_plane *plane,
>> return drm_atomic_helper_check_plane_state(state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> static void mtk_plane_atomic_disable(struct drm_plane *plane,
>> diff --git a/drivers/gpu/drm/meson/meson_overlay.c b/drivers/gpu/drm/meson/meson_overlay.c
>> index a8bcc70644df..91c1d86e0429 100644
>> --- a/drivers/gpu/drm/meson/meson_overlay.c
>> +++ b/drivers/gpu/drm/meson/meson_overlay.c
>> @@ -179,7 +179,7 @@ static int meson_overlay_atomic_check(struct drm_plane *plane,
>> return drm_atomic_helper_check_plane_state(state, crtc_state,
>> FRAC_16_16(1, 5),
>> FRAC_16_16(5, 1),
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> /* Takes a fixed 16.16 number and converts it to integer. */
>> diff --git a/drivers/gpu/drm/meson/meson_plane.c b/drivers/gpu/drm/meson/meson_plane.c
>> index 35338ed18209..1d4a4d62ff53 100644
>> --- a/drivers/gpu/drm/meson/meson_plane.c
>> +++ b/drivers/gpu/drm/meson/meson_plane.c
>> @@ -90,7 +90,7 @@ static int meson_plane_atomic_check(struct drm_plane *plane,
>> return drm_atomic_helper_check_plane_state(state, crtc_state,
>> FRAC_16_16(1, 5),
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, true);
>> + DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> #define MESON_MOD_AFBC_VALID_BITS (AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | \
>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
>> index 33f6c56f01ed..bf8153361f23 100644
>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
>> @@ -867,9 +867,10 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
>> state->crtc);
>>
>> min_scale = FRAC_16_16(1, pdpu->pipe_sblk->maxdwnscale);
>> - ret = drm_atomic_helper_check_plane_state(state, crtc_state, min_scale,
>> - pdpu->pipe_sblk->maxupscale << 16,
>> - true, true);
>> + ret = drm_atomic_helper_check_plane_state(state, crtc_state,
>> + min_scale,
>> + pdpu->pipe_sblk->maxupscale << 16,
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret) {
>> DPU_DEBUG_PLANE(pdpu, "Check plane state failed (%d)\n", ret);
>> return ret;
>> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
>> index 83423092de2f..c8f5d39dda29 100644
>> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
>> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
>> @@ -300,7 +300,7 @@ static int mdp5_plane_atomic_check_with_state(struct drm_crtc_state *crtc_state,
>>
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
>> min_scale, max_scale,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> @@ -474,7 +474,7 @@ static int mdp5_plane_atomic_async_check(struct drm_plane *plane,
>>
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
>> min_scale, max_scale,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
>> index b721b8b262ce..c24ef330718e 100644
>> --- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
>> +++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
>> @@ -410,7 +410,7 @@ static int mxsfb_plane_atomic_check(struct drm_plane *plane,
>> return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, true);
>> + DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> static void mxsfb_plane_primary_atomic_update(struct drm_plane *plane,
>> diff --git a/drivers/gpu/drm/nouveau/dispnv50/base507c.c b/drivers/gpu/drm/nouveau/dispnv50/base507c.c
>> index 302d4e6fc52f..bc6846c6618b 100644
>> --- a/drivers/gpu/drm/nouveau/dispnv50/base507c.c
>> +++ b/drivers/gpu/drm/nouveau/dispnv50/base507c.c
>> @@ -236,7 +236,7 @@ base507c_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
>> ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, true);
>> + DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/nouveau/dispnv50/curs507a.c b/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
>> index 54fbd6fe751d..dbf5a23e178d 100644
>> --- a/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
>> +++ b/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
>> @@ -104,7 +104,7 @@ curs507a_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
>> ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> asyh->curs.visible = asyw->state.visible;
>> if (ret || !asyh->curs.visible)
>> return ret;
>> diff --git a/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c b/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
>> index afd6c7271de1..56f98e464f2f 100644
>> --- a/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
>> +++ b/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
>> @@ -109,7 +109,7 @@ ovly507e_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
>> ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c b/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
>> index 57df997c5ff3..b2441deb762f 100644
>> --- a/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
>> +++ b/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
>> @@ -303,7 +303,7 @@ wndwc37e_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
>> return drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> static const u32
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
>> index a0021fc25b27..713d4e06ce7e 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
>> @@ -587,7 +587,7 @@ int __rcar_du_plane_atomic_check(struct drm_plane *plane,
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret < 0)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
>> index c80f7d9fd13f..f2c64068888e 100644
>> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
>> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
>> @@ -800,7 +800,7 @@ static int vop_plane_atomic_check(struct drm_plane *plane,
>>
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
>> min_scale, max_scale,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> @@ -1048,7 +1048,7 @@ static int vop_plane_atomic_async_check(struct drm_plane *plane,
>>
>> return drm_atomic_helper_check_plane_state(plane->state, crtc_state,
>> min_scale, max_scale,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> static void vop_plane_atomic_async_update(struct drm_plane *plane,
>> diff --git a/drivers/gpu/drm/selftests/test-drm_plane_helper.c b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
>> index 0a9553f51796..01e95b2d572f 100644
>> --- a/drivers/gpu/drm/selftests/test-drm_plane_helper.c
>> +++ b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
>> @@ -103,7 +103,7 @@ int igt_check_plane_state(void *ignored)
>> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, false);
>> + 0);
>> FAIL(ret < 0, "Simple clipping check should pass\n");
>> FAIL_ON(!plane_state.visible);
>> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1024 << 16, 768 << 16));
>> @@ -114,7 +114,7 @@ int igt_check_plane_state(void *ignored)
>> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, false);
>> + 0);
>> FAIL(ret < 0, "Rotated clipping check should pass\n");
>> FAIL_ON(!plane_state.visible);
>> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 768 << 16, 1024 << 16));
>> @@ -127,13 +127,13 @@ int igt_check_plane_state(void *ignored)
>> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, false);
>> + 0);
>> FAIL(!ret, "Should not be able to position on the crtc with can_position=false\n");
>>
>> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - true, false);
>> + DRM_PLANE_CAN_POSITION);
>> FAIL(ret < 0, "Simple positioning should work\n");
>> FAIL_ON(!plane_state.visible);
>> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1023 << 16, 767 << 16));
>> @@ -145,12 +145,12 @@ int igt_check_plane_state(void *ignored)
>> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> 0x8001,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, false);
>> + 0);
>> FAIL(!ret, "Upscaling out of range should fail.\n");
>> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> 0x8000,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, false);
>> + 0);
>> FAIL(ret < 0, "Upscaling exactly 2x should work\n");
>> FAIL_ON(!plane_state.visible);
>> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 512 << 16, 384 << 16));
>> @@ -159,11 +159,11 @@ int igt_check_plane_state(void *ignored)
>> set_src(&plane_state, 0, 0, 2048 << 16, 1536 << 16);
>> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - 0x1ffff, false, false);
>> + 0x1ffff, 0);
>> FAIL(!ret, "Downscaling out of range should fail.\n");
>> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - 0x20000, false, false);
>> + 0x20000, 0);
>> FAIL(ret < 0, "Should succeed with exact scaling limit\n");
>> FAIL_ON(!plane_state.visible);
>> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 2048 << 16, 1536 << 16));
>> @@ -175,7 +175,7 @@ int igt_check_plane_state(void *ignored)
>> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> 0x10001,
>> - true, false);
>> + DRM_PLANE_CAN_POSITION);
>> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
>> FAIL_ON(!plane_state.visible);
>> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 2 << 16, 2 << 16));
>> @@ -185,8 +185,7 @@ int igt_check_plane_state(void *ignored)
>> set_crtc(&plane_state, -2, -2, 1028, 772);
>> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - 0x10001,
>> - false, false);
>> + 0x10001, 0);
>> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
>> FAIL_ON(!plane_state.visible);
>> FAIL_ON(!check_src_eq(&plane_state, 0x40002, 0x40002, 1024 << 16, 768 << 16));
>> @@ -197,7 +196,7 @@ int igt_check_plane_state(void *ignored)
>> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> 0xffff,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - true, false);
>> + DRM_PLANE_CAN_POSITION);
>> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
>> FAIL_ON(!plane_state.visible);
>> /* Should not be rounded to 0x20001, which would be upscaling. */
>> @@ -209,7 +208,7 @@ int igt_check_plane_state(void *ignored)
>> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> 0xffff,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, false);
>> + 0);
>> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
>> FAIL_ON(!plane_state.visible);
>> FAIL_ON(!check_src_eq(&plane_state, 0x3fffe, 0x3fffe, 1024 << 16, 768 << 16));
>> diff --git a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
>> index 816ad4ce8996..c706b615bbe1 100644
>> --- a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
>> +++ b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
>> @@ -260,7 +260,7 @@ static int sun8i_ui_layer_atomic_check(struct drm_plane *plane,
>>
>> return drm_atomic_helper_check_plane_state(state, crtc_state,
>> min_scale, max_scale,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> static void sun8i_ui_layer_atomic_disable(struct drm_plane *plane,
>> diff --git a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
>> index a360697a4a4a..7490c19b0117 100644
>> --- a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
>> +++ b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
>> @@ -363,7 +363,7 @@ static int sun8i_vi_layer_atomic_check(struct drm_plane *plane,
>>
>> return drm_atomic_helper_check_plane_state(state, crtc_state,
>> min_scale, max_scale,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> static void sun8i_vi_layer_atomic_disable(struct drm_plane *plane,
>> diff --git a/drivers/gpu/drm/tegra/plane.c b/drivers/gpu/drm/tegra/plane.c
>> index 4cd0461cc508..7bb0d5361900 100644
>> --- a/drivers/gpu/drm/tegra/plane.c
>> +++ b/drivers/gpu/drm/tegra/plane.c
>> @@ -230,8 +230,9 @@ int tegra_plane_state_add(struct tegra_plane *plane,
>> return PTR_ERR(crtc_state);
>>
>> /* Check plane state for visibility and calculate clipping bounds */
>> - err = drm_atomic_helper_check_plane_state(state, crtc_state,
>> - 0, INT_MAX, true, true);
>> + err = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
>> + INT_MAX,
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (err < 0)
>> return err;
>>
>> diff --git a/drivers/gpu/drm/tidss/tidss_plane.c b/drivers/gpu/drm/tidss/tidss_plane.c
>> index 43e72d0b2d84..9b47cdab51fd 100644
>> --- a/drivers/gpu/drm/tidss/tidss_plane.c
>> +++ b/drivers/gpu/drm/tidss/tidss_plane.c
>> @@ -46,7 +46,8 @@ static int tidss_plane_atomic_check(struct drm_plane *plane,
>> return PTR_ERR(crtc_state);
>>
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
>> - INT_MAX, true, true);
>> + INT_MAX,
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret < 0)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/vboxvideo/vbox_mode.c b/drivers/gpu/drm/vboxvideo/vbox_mode.c
>> index d9a5af62af89..9a775cd71fe1 100644
>> --- a/drivers/gpu/drm/vboxvideo/vbox_mode.c
>> +++ b/drivers/gpu/drm/vboxvideo/vbox_mode.c
>> @@ -264,7 +264,7 @@ static int vbox_primary_atomic_check(struct drm_plane *plane,
>> return drm_atomic_helper_check_plane_state(new_state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, true);
>> + DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> static void vbox_primary_atomic_update(struct drm_plane *plane,
>> @@ -340,7 +340,7 @@ static int vbox_cursor_atomic_check(struct drm_plane *plane,
>> ret = drm_atomic_helper_check_plane_state(new_state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
>> index d040d9f12c6d..7263209bf266 100644
>> --- a/drivers/gpu/drm/vc4/vc4_plane.c
>> +++ b/drivers/gpu/drm/vc4/vc4_plane.c
>> @@ -324,7 +324,8 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state)
>> }
>>
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state, 1,
>> - INT_MAX, true, true);
>> + INT_MAX,
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c
>> index 6a311cd93440..1297c6c8bae8 100644
>> --- a/drivers/gpu/drm/virtio/virtgpu_plane.c
>> +++ b/drivers/gpu/drm/virtio/virtgpu_plane.c
>> @@ -85,7 +85,7 @@ static const struct drm_plane_funcs virtio_gpu_plane_funcs = {
>> static int virtio_gpu_plane_atomic_check(struct drm_plane *plane,
>> struct drm_plane_state *state)
>> {
>> - bool is_cursor = plane->type == DRM_PLANE_TYPE_CURSOR;
>> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
>> struct drm_crtc_state *crtc_state;
>> int ret;
>>
>> @@ -96,10 +96,13 @@ static int virtio_gpu_plane_atomic_check(struct drm_plane *plane,
>> if (IS_ERR(crtc_state))
>> return PTR_ERR(crtc_state);
>>
>> + if (plane->type == DRM_PLANE_TYPE_CURSOR)
>> + flags |= DRM_PLANE_CAN_POSITION;
>> +
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - is_cursor, true);
>> + flags);
>> return ret;
>> }
>>
>> diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_plane.c
>> index 6d31265a2ab7..6fa0f9452efd 100644
>> --- a/drivers/gpu/drm/vkms/vkms_plane.c
>> +++ b/drivers/gpu/drm/vkms/vkms_plane.c
>> @@ -114,7 +114,7 @@ static int vkms_plane_atomic_check(struct drm_plane *plane,
>> struct drm_plane_state *state)
>> {
>> struct drm_crtc_state *crtc_state;
>> - bool can_position = false;
>> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
>> int ret;
>>
>> if (!state->fb || WARN_ON(!state->crtc))
>> @@ -125,17 +125,17 @@ static int vkms_plane_atomic_check(struct drm_plane *plane,
>> return PTR_ERR(crtc_state);
>>
>> if (plane->type == DRM_PLANE_TYPE_CURSOR)
>> - can_position = true;
>> + flags |= DRM_PLANE_CAN_POSITION;
>>
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - can_position, true);
>> + flags);
>> if (ret != 0)
>> return ret;
>>
>> /* for now primary plane must be visible and full screen */
>> - if (!state->visible && !can_position)
>> + if (!state->visible && plane->type != DRM_PLANE_TYPE_CURSOR)
>> return -EINVAL;
>>
>> return 0;
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
>> index 312ed0881a99..d58088ab44a4 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
>> @@ -453,7 +453,7 @@ int vmw_du_primary_plane_atomic_check(struct drm_plane *plane,
>> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, true);
>> + DRM_PLANE_CAN_UPDATE_DISABLED);
>>
>> if (!ret && new_fb) {
>> struct drm_crtc *crtc = state->crtc;
>> @@ -494,7 +494,7 @@ int vmw_du_cursor_plane_atomic_check(struct drm_plane *plane,
>> ret = drm_atomic_helper_check_plane_state(new_state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> if (ret)
>> return ret;
>>
>> diff --git a/drivers/gpu/drm/xlnx/zynqmp_disp.c b/drivers/gpu/drm/xlnx/zynqmp_disp.c
>> index a455cfc1bee5..4969e2e0c874 100644
>> --- a/drivers/gpu/drm/xlnx/zynqmp_disp.c
>> +++ b/drivers/gpu/drm/xlnx/zynqmp_disp.c
>> @@ -1164,7 +1164,7 @@ zynqmp_disp_plane_atomic_check(struct drm_plane *plane,
>> return drm_atomic_helper_check_plane_state(state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, false);
>> + 0);
>> }
>>
>> static void
>> diff --git a/drivers/gpu/drm/zte/zx_plane.c b/drivers/gpu/drm/zte/zx_plane.c
>> index c8f7b21fa09e..e12935ab488c 100644
>> --- a/drivers/gpu/drm/zte/zx_plane.c
>> +++ b/drivers/gpu/drm/zte/zx_plane.c
>> @@ -72,7 +72,7 @@ static int zx_vl_plane_atomic_check(struct drm_plane *plane,
>>
>> return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
>> min_scale, max_scale,
>> - true, true);
>> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> static int zx_vl_get_fmt(uint32_t format)
>> @@ -300,7 +300,7 @@ static int zx_gl_plane_atomic_check(struct drm_plane *plane,
>> return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
>> DRM_PLANE_HELPER_NO_SCALING,
>> DRM_PLANE_HELPER_NO_SCALING,
>> - false, true);
>> + DRM_PLANE_CAN_UPDATE_DISABLED);
>> }
>>
>> static int zx_gl_get_fmt(uint32_t format)
>> diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
>> index b268180c97eb..bb9957b4f91b 100644
>> --- a/include/drm/drm_atomic_helper.h
>> +++ b/include/drm/drm_atomic_helper.h
>> @@ -40,12 +40,15 @@ struct drm_private_state;
>>
>> int drm_atomic_helper_check_modeset(struct drm_device *dev,
>> struct drm_atomic_state *state);
>> +
>> +#define DRM_PLANE_CAN_POSITION BIT(0)
>> +#define DRM_PLANE_CAN_UPDATE_DISABLED BIT(1)
>> +
>> int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
>> const struct drm_crtc_state *crtc_state,
>> int min_scale,
>> int max_scale,
>> - bool can_position,
>> - bool can_update_disabled);
>> + uint32_t flags);
>> int drm_atomic_helper_check_planes(struct drm_device *dev,
>> struct drm_atomic_state *state);
>> int drm_atomic_helper_check(struct drm_device *dev,
>> --
>> 2.28.0
>>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 2/3] drm/atomic-helper: add REQUIRE_MATCHING_FB flag
2020-09-11 8:52 ` Daniel Vetter
@ 2020-09-16 10:44 ` Stefan Agner
0 siblings, 0 replies; 11+ messages in thread
From: Stefan Agner @ 2020-09-16 10:44 UTC (permalink / raw)
To: Daniel Vetter; +Cc: marex, airlied, tomi.valkeinen, laurent.pinchart, dri-devel
On 2020-09-11 10:52, Daniel Vetter wrote:
> On Thu, Sep 10, 2020 at 11:24:24AM +0200, Stefan Agner wrote:
>> Add flag which checks that the framebuffer size matches the plane size
>> exactly. This is useful for display controller which can't handle
>> framebuffers other than the plane/CRTC size.
>>
>> Signed-off-by: Stefan Agner <stefan@agner.ch>
>> ---
>> drivers/gpu/drm/drm_atomic_helper.c | 7 +++++++
>> drivers/gpu/drm/selftests/test-drm_plane_helper.c | 9 +++++++++
>> include/drm/drm_atomic_helper.h | 1 +
>> 3 files changed, 17 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
>> index 755572a37f3f..8bc7f8c2e566 100644
>> --- a/drivers/gpu/drm/drm_atomic_helper.c
>> +++ b/drivers/gpu/drm/drm_atomic_helper.c
>> @@ -802,6 +802,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
>> int hscale, vscale;
>> bool can_position = flags & DRM_PLANE_CAN_POSITION;
>> bool can_update_disabled = flags & DRM_PLANE_CAN_UPDATE_DISABLED;
>> + bool require_matching_fb = flags & DRM_PLANE_REQUIRE_MATCHING_FB;
>>
>> WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
>>
>> @@ -860,6 +861,12 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
>> return -EINVAL;
>> }
>>
>> + if (require_matching_fb && (drm_rect_width(src) != fb->width ||
>> + drm_rect_height(src) != fb->height)) {
>> + DRM_DEBUG_KMS("Framebuffer size must match plane size.\n");
>> + return -EINVAL;
>> + }
>
> I think you also want to check that the x,y src are at (0, 0).
Hm, I was thinking that is handled by CAN_POSITION, but that really is
all about src vs. dst in plane coordinates.
I guess at that point its almost nicer to create a drm_rect for fb and
use drm_rect_equals.
--
Stefan
>
> Plus needs kerneldoc.
>
> But aside from the details, I like.
>
>> +
>> return 0;
>> }
>> EXPORT_SYMBOL(drm_atomic_helper_check_plane_state);
>> diff --git a/drivers/gpu/drm/selftests/test-drm_plane_helper.c b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
>> index 01e95b2d572f..2c81bbef830e 100644
>> --- a/drivers/gpu/drm/selftests/test-drm_plane_helper.c
>> +++ b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
>> @@ -139,6 +139,15 @@ int igt_check_plane_state(void *ignored)
>> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1023 << 16, 767 << 16));
>> FAIL_ON(!check_crtc_eq(&plane_state, 0, 0, 1023, 767));
>>
>> + /* Check whether requiring same size framebuffer works correctly. */
>> + set_src(&plane_state, 0, 0, 1024 << 16, 768 << 16);
>> + set_crtc(&plane_state, 0, 0, 1024, 768);
>> + ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> + DRM_PLANE_HELPER_NO_SCALING,
>> + DRM_PLANE_HELPER_NO_SCALING,
>> + DRM_PLANE_REQUIRE_MATCHING_FB);
>> + FAIL(!ret, "Should not be able to use different size framebuffer with REQUIRE_MATCHING_FB\n");
>
> I think also needs a negative test with src_x/y != 0, plus maybe one that
> succeeds.
>
> Cheers, Daniel
>> +
>> /* Simple scaling tests. */
>> set_src(&plane_state, 0, 0, 512 << 16, 384 << 16);
>> set_crtc(&plane_state, 0, 0, 1024, 768);
>> diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
>> index bb9957b4f91b..244b730e84d3 100644
>> --- a/include/drm/drm_atomic_helper.h
>> +++ b/include/drm/drm_atomic_helper.h
>> @@ -43,6 +43,7 @@ int drm_atomic_helper_check_modeset(struct drm_device *dev,
>>
>> #define DRM_PLANE_CAN_POSITION BIT(0)
>> #define DRM_PLANE_CAN_UPDATE_DISABLED BIT(1)
>> +#define DRM_PLANE_REQUIRE_MATCHING_FB BIT(2)
>>
>> int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
>> const struct drm_crtc_state *crtc_state,
>> --
>> 2.28.0
>>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 2/3] drm/atomic-helper: add REQUIRE_MATCHING_FB flag
2020-09-11 11:59 ` Ville Syrjälä
@ 2020-09-16 10:49 ` Stefan Agner
0 siblings, 0 replies; 11+ messages in thread
From: Stefan Agner @ 2020-09-16 10:49 UTC (permalink / raw)
To: Ville Syrjälä
Cc: marex, airlied, dri-devel, tomi.valkeinen, laurent.pinchart
On 2020-09-11 13:59, Ville Syrjälä wrote:
> On Thu, Sep 10, 2020 at 11:24:24AM +0200, Stefan Agner wrote:
>> Add flag which checks that the framebuffer size matches the plane size
>> exactly. This is useful for display controller which can't handle
>> framebuffers other than the plane/CRTC size.
>>
>> Signed-off-by: Stefan Agner <stefan@agner.ch>
>> ---
>> drivers/gpu/drm/drm_atomic_helper.c | 7 +++++++
>> drivers/gpu/drm/selftests/test-drm_plane_helper.c | 9 +++++++++
>> include/drm/drm_atomic_helper.h | 1 +
>> 3 files changed, 17 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
>> index 755572a37f3f..8bc7f8c2e566 100644
>> --- a/drivers/gpu/drm/drm_atomic_helper.c
>> +++ b/drivers/gpu/drm/drm_atomic_helper.c
>> @@ -802,6 +802,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
>> int hscale, vscale;
>> bool can_position = flags & DRM_PLANE_CAN_POSITION;
>> bool can_update_disabled = flags & DRM_PLANE_CAN_UPDATE_DISABLED;
>> + bool require_matching_fb = flags & DRM_PLANE_REQUIRE_MATCHING_FB;
>>
>> WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
>>
>> @@ -860,6 +861,12 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
>> return -EINVAL;
>> }
>>
>> + if (require_matching_fb && (drm_rect_width(src) != fb->width ||
>> + drm_rect_height(src) != fb->height)) {
>
> src rect is .16 fixed point vs. fb dimensions are integers
Good catch, will fix.
Hm, I wonder why this did not trip my test.
--
Stefan
>
> Still not a fan of these swiss army knife functions but meh.
>
>> + DRM_DEBUG_KMS("Framebuffer size must match plane size.\n");
>> + return -EINVAL;
>> + }
>> +
>> return 0;
>> }
>> EXPORT_SYMBOL(drm_atomic_helper_check_plane_state);
>> diff --git a/drivers/gpu/drm/selftests/test-drm_plane_helper.c b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
>> index 01e95b2d572f..2c81bbef830e 100644
>> --- a/drivers/gpu/drm/selftests/test-drm_plane_helper.c
>> +++ b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
>> @@ -139,6 +139,15 @@ int igt_check_plane_state(void *ignored)
>> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1023 << 16, 767 << 16));
>> FAIL_ON(!check_crtc_eq(&plane_state, 0, 0, 1023, 767));
>>
>> + /* Check whether requiring same size framebuffer works correctly. */
>> + set_src(&plane_state, 0, 0, 1024 << 16, 768 << 16);
>> + set_crtc(&plane_state, 0, 0, 1024, 768);
>> + ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
>> + DRM_PLANE_HELPER_NO_SCALING,
>> + DRM_PLANE_HELPER_NO_SCALING,
>> + DRM_PLANE_REQUIRE_MATCHING_FB);
>> + FAIL(!ret, "Should not be able to use different size framebuffer with REQUIRE_MATCHING_FB\n");
>> +
>> /* Simple scaling tests. */
>> set_src(&plane_state, 0, 0, 512 << 16, 384 << 16);
>> set_crtc(&plane_state, 0, 0, 1024, 768);
>> diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
>> index bb9957b4f91b..244b730e84d3 100644
>> --- a/include/drm/drm_atomic_helper.h
>> +++ b/include/drm/drm_atomic_helper.h
>> @@ -43,6 +43,7 @@ int drm_atomic_helper_check_modeset(struct drm_device *dev,
>>
>> #define DRM_PLANE_CAN_POSITION BIT(0)
>> #define DRM_PLANE_CAN_UPDATE_DISABLED BIT(1)
>> +#define DRM_PLANE_REQUIRE_MATCHING_FB BIT(2)
>>
>> int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
>> const struct drm_crtc_state *crtc_state,
>> --
>> 2.28.0
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [RFC PATCH 1/3] drm: use flags instead of boolean in plane check
2020-09-16 10:31 ` Stefan Agner
@ 2020-09-16 11:26 ` Daniel Vetter
0 siblings, 0 replies; 11+ messages in thread
From: Daniel Vetter @ 2020-09-16 11:26 UTC (permalink / raw)
To: Stefan Agner; +Cc: marex, airlied, dri-devel, tomi.valkeinen, laurent.pinchart
On Wed, Sep 16, 2020 at 12:31:44PM +0200, Stefan Agner wrote:
> On 2020-09-11 10:50, Daniel Vetter wrote:
> > On Thu, Sep 10, 2020 at 11:24:23AM +0200, Stefan Agner wrote:
> >> To improve readability and make it easier to add further optional checks
> >> replace the boolean parameters with a single flag bitfield as parameter
> >> of drm_atomic_helper_check_plane_state.
> >>
> >> The regular call sites have been converted using a simple coccinelle
> >> patch.
> >>
> >> virtual patch
> >
> > Looks reasonable, but needs kerneldoc. For that either do a list in the
> > kerneldoc for drm_atomic_helper_check_plane_state, or make the flags an
> > enum (still setting the value for each explicitly), and then kerneldoc
> > that with a link from the function to that.
>
> The kerneldoc updates for drm_atomic_helper_check_plane_state() should
> cover it mostly. I did miss update it in patch 2, so will fix that.
>
> I thought to keep it similar to drm_atomic_helper_commit_planes() and
> use #defines as well as describing the flags in the function kerneldoc.
> Should I make it a list instead?
A kerneldoc/rst list within the function should work well too and look
pretty. Whatever you prefer, just make sure the html output isn't broken
somehow.
-Daniel
>
> --
> Stefan
>
> > -Daniel
> >
> >>
> >> @@
> >> expression e1, e2, e3, e4;
> >> symbol true, false;
> >> @@
> >>
> >> (
> >> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, true, true)
> >> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED)
> >> |
> >> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, true, false)
> >> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_POSITION)
> >> |
> >> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, false, true)
> >> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, DRM_PLANE_CAN_UPDATE_DISABLED)
> >> |
> >> - drm_atomic_helper_check_plane_state(e1, e2, e3, e4, false, false)
> >> + drm_atomic_helper_check_plane_state(e1, e2, e3, e4, 0)
> >> )
> >>
> >> Signed-off-by: Stefan Agner <stefan@agner.ch>
> >> ---
> >> This implements what has been discussed in the thread of the patch
> >> "drm: mxsfb: check framebuffer pitch":
> >> https://lkml.org/lkml/2020/9/8/1342
> >>
> >> Before sending it out to all maintainers I wanted to get conformation
> >> if the general approach is fine.
> >>
> >> I think in some places there should be another linebreak for the flags,
> >> but this is what coccinelle gives me. Not sure if I should manually fix
> >> those places...
> >>
> >> --
> >> Stefan
> >>
> >> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 5 ++--
> >> drivers/gpu/drm/arm/hdlcd_crtc.c | 6 ++---
> >> drivers/gpu/drm/arm/malidp_planes.c | 5 ++--
> >> drivers/gpu/drm/armada/armada_plane.c | 3 ++-
> >> drivers/gpu/drm/ast/ast_mode.c | 4 +--
> >> .../gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c | 4 +--
> >> drivers/gpu/drm/drm_atomic_helper.c | 17 +++++++------
> >> drivers/gpu/drm/drm_plane_helper.c | 9 +++----
> >> drivers/gpu/drm/drm_simple_kms_helper.c | 2 +-
> >> drivers/gpu/drm/i915/display/intel_display.c | 9 ++++---
> >> drivers/gpu/drm/i915/display/intel_sprite.c | 6 ++---
> >> drivers/gpu/drm/imx/ipuv3-plane.c | 7 ++++--
> >> drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 7 ++++--
> >> drivers/gpu/drm/mediatek/mtk_drm_plane.c | 4 +--
> >> drivers/gpu/drm/meson/meson_overlay.c | 2 +-
> >> drivers/gpu/drm/meson/meson_plane.c | 2 +-
> >> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 7 +++---
> >> drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c | 4 +--
> >> drivers/gpu/drm/mxsfb/mxsfb_kms.c | 2 +-
> >> drivers/gpu/drm/nouveau/dispnv50/base507c.c | 2 +-
> >> drivers/gpu/drm/nouveau/dispnv50/curs507a.c | 2 +-
> >> drivers/gpu/drm/nouveau/dispnv50/ovly507e.c | 2 +-
> >> drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c | 2 +-
> >> drivers/gpu/drm/rcar-du/rcar_du_plane.c | 2 +-
> >> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 4 +--
> >> .../gpu/drm/selftests/test-drm_plane_helper.c | 25 +++++++++----------
> >> drivers/gpu/drm/sun4i/sun8i_ui_layer.c | 2 +-
> >> drivers/gpu/drm/sun4i/sun8i_vi_layer.c | 2 +-
> >> drivers/gpu/drm/tegra/plane.c | 5 ++--
> >> drivers/gpu/drm/tidss/tidss_plane.c | 3 ++-
> >> drivers/gpu/drm/vboxvideo/vbox_mode.c | 4 +--
> >> drivers/gpu/drm/vc4/vc4_plane.c | 3 ++-
> >> drivers/gpu/drm/virtio/virtgpu_plane.c | 7 ++++--
> >> drivers/gpu/drm/vkms/vkms_plane.c | 8 +++---
> >> drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 4 +--
> >> drivers/gpu/drm/xlnx/zynqmp_disp.c | 2 +-
> >> drivers/gpu/drm/zte/zx_plane.c | 4 +--
> >> include/drm/drm_atomic_helper.h | 7 ++++--
> >> 38 files changed, 108 insertions(+), 87 deletions(-)
> >>
> >> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> >> index fd96fafec5b8..db0256ecf1a2 100644
> >> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> >> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> >> @@ -5731,8 +5731,9 @@ static int dm_plane_helper_check_state(struct drm_plane_state *state,
> >> int max_upscale = INT_MAX;
> >>
> >> /* TODO: These should be checked against DC plane caps */
> >> - return drm_atomic_helper_check_plane_state(
> >> - state, new_crtc_state, max_downscale, max_upscale, true, true);
> >> + return drm_atomic_helper_check_plane_state(state, new_crtc_state,
> >> + max_downscale, max_upscale,
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> static int dm_plane_atomic_check(struct drm_plane *plane,
> >> diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c
> >> index af67fefed38d..94c9a75c0c2d 100644
> >> --- a/drivers/gpu/drm/arm/hdlcd_crtc.c
> >> +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c
> >> @@ -247,9 +247,9 @@ static int hdlcd_plane_atomic_check(struct drm_plane *plane,
> >> if (!state->fb && crtc_state->active)
> >> return -EINVAL;
> >> return drm_atomic_helper_check_plane_state(state, crtc_state,
> >> - DRM_PLANE_HELPER_NO_SCALING,
> >> - DRM_PLANE_HELPER_NO_SCALING,
> >> - false, true);
> >> + DRM_PLANE_HELPER_NO_SCALING,
> >> + DRM_PLANE_HELPER_NO_SCALING,
> >> + DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> return 0;
> >> diff --git a/drivers/gpu/drm/arm/malidp_planes.c b/drivers/gpu/drm/arm/malidp_planes.c
> >> index 351a85088d0e..c818e0a8e399 100644
> >> --- a/drivers/gpu/drm/arm/malidp_planes.c
> >> +++ b/drivers/gpu/drm/arm/malidp_planes.c
> >> @@ -281,8 +281,9 @@ static int malidp_se_check_scaling(struct malidp_plane *mp,
> >>
> >> mc = to_malidp_crtc_state(crtc_state);
> >>
> >> - ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> - 0, INT_MAX, true, true);
> >> + ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
> >> + INT_MAX,
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/armada/armada_plane.c b/drivers/gpu/drm/armada/armada_plane.c
> >> index e7cc2b343bcb..0f2af0faae5a 100644
> >> --- a/drivers/gpu/drm/armada/armada_plane.c
> >> +++ b/drivers/gpu/drm/armada/armada_plane.c
> >> @@ -125,7 +125,8 @@ int armada_drm_plane_atomic_check(struct drm_plane *plane,
> >> crtc_state = crtc->state;
> >>
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
> >> - INT_MAX, true, false);
> >> + INT_MAX,
> >> + DRM_PLANE_CAN_POSITION);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> >> index 62fe682a7de6..5bafa1c5981f 100644
> >> --- a/drivers/gpu/drm/ast/ast_mode.c
> >> +++ b/drivers/gpu/drm/ast/ast_mode.c
> >> @@ -539,7 +539,7 @@ static int ast_primary_plane_helper_atomic_check(struct drm_plane *plane,
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, true);
> >> + DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> @@ -644,7 +644,7 @@ static int ast_cursor_plane_helper_atomic_check(struct drm_plane *plane,
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
> >> index 40800ec5700a..ecc0984b05d1 100644
> >> --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
> >> +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
> >> @@ -611,8 +611,8 @@ static int atmel_hlcdc_plane_atomic_check(struct drm_plane *p,
> >> mode = &crtc_state->adjusted_mode;
> >>
> >> ret = drm_atomic_helper_check_plane_state(s, crtc_state,
> >> - (1 << 16) / 2048,
> >> - INT_MAX, true, true);
> >> + (1 << 16) / 2048, INT_MAX,
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret || !s->visible)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> >> index f68c69a45752..755572a37f3f 100644
> >> --- a/drivers/gpu/drm/drm_atomic_helper.c
> >> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> >> @@ -771,11 +771,7 @@ EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
> >> * @crtc_state: CRTC state to check
> >> * @min_scale: minimum @src:@dest scaling factor in 16.16 fixed point
> >> * @max_scale: maximum @src:@dest scaling factor in 16.16 fixed point
> >> - * @can_position: is it legal to position the plane such that it
> >> - * doesn't cover the entire CRTC? This will generally
> >> - * only be false for primary planes.
> >> - * @can_update_disabled: can the plane be updated while the CRTC
> >> - * is disabled?
> >> + * @flags: flags for checking the plane state
> >> *
> >> * Checks that a desired plane update is valid, and updates various
> >> * bits of derived state (clipped coordinates etc.). Drivers that provide
> >> @@ -783,6 +779,12 @@ EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
> >> * still wish to call this function to avoid duplication of error checking
> >> * code.
> >> *
> >> + * Drivers may set the CAN_POSITION flag in @flags if the display controller
> >> + * can position the plane such that it doesn't cover the entire CRTC. This will
> >> + * generally be set for all but primary planes. The CAN_UPDATE_DISABLED flag
> >> + * may be set if the display controller can update the plane while the CRTC is
> >> + * disabled.
> >> + *
> >> * RETURNS:
> >> * Zero if update appears valid, error code on failure
> >> */
> >> @@ -790,8 +792,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> >> const struct drm_crtc_state *crtc_state,
> >> int min_scale,
> >> int max_scale,
> >> - bool can_position,
> >> - bool can_update_disabled)
> >> + uint32_t flags)
> >> {
> >> struct drm_framebuffer *fb = plane_state->fb;
> >> struct drm_rect *src = &plane_state->src;
> >> @@ -799,6 +800,8 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> >> unsigned int rotation = plane_state->rotation;
> >> struct drm_rect clip = {};
> >> int hscale, vscale;
> >> + bool can_position = flags & DRM_PLANE_CAN_POSITION;
> >> + bool can_update_disabled = flags & DRM_PLANE_CAN_UPDATE_DISABLED;
> >>
> >> WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
> >>
> >> diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c
> >> index 3aae7ea522f2..1d5fd5f4da52 100644
> >> --- a/drivers/gpu/drm/drm_plane_helper.c
> >> +++ b/drivers/gpu/drm/drm_plane_helper.c
> >> @@ -106,8 +106,7 @@ static int drm_plane_helper_check_update(struct drm_plane *plane,
> >> unsigned int rotation,
> >> int min_scale,
> >> int max_scale,
> >> - bool can_position,
> >> - bool can_update_disabled,
> >> + uint32_t flags,
> >> bool *visible)
> >> {
> >> struct drm_plane_state plane_state = {
> >> @@ -133,9 +132,7 @@ static int drm_plane_helper_check_update(struct drm_plane *plane,
> >> int ret;
> >>
> >> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> >> - min_scale, max_scale,
> >> - can_position,
> >> - can_update_disabled);
> >> + min_scale, max_scale, flags);
> >> if (ret)
> >> return ret;
> >>
> >> @@ -182,7 +179,7 @@ static int drm_primary_helper_update(struct drm_plane *plane, struct drm_crtc *c
> >> DRM_MODE_ROTATE_0,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, false, &visible);
> >> + 0, &visible);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c
> >> index 74946690aba4..f3ce7a0a827c 100644
> >> --- a/drivers/gpu/drm/drm_simple_kms_helper.c
> >> +++ b/drivers/gpu/drm/drm_simple_kms_helper.c
> >> @@ -178,7 +178,7 @@ static int drm_simple_kms_plane_atomic_check(struct drm_plane *plane,
> >> ret = drm_atomic_helper_check_plane_state(plane_state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, true);
> >> + DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> >> index 729ec6e0d43a..04b3005162f5 100644
> >> --- a/drivers/gpu/drm/i915/display/intel_display.c
> >> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> >> @@ -4344,17 +4344,20 @@ i9xx_plane_check(struct intel_crtc_state *crtc_state,
> >> {
> >> struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
> >> int ret;
> >> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
> >>
> >> ret = chv_plane_check_rotation(plane_state);
> >> if (ret)
> >> return ret;
> >>
> >> + if (i9xx_plane_has_windowing(plane))
> >> + flags |= DRM_PLANE_CAN_POSITION;
> >> +
> >> ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
> >> &crtc_state->uapi,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - i9xx_plane_has_windowing(plane),
> >> - true);
> >> + flags);
> >> if (ret)
> >> return ret;
> >>
> >> @@ -11367,7 +11370,7 @@ static int intel_check_cursor(struct intel_crtc_state *crtc_state,
> >> &crtc_state->uapi,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/i915/display/intel_sprite.c b/drivers/gpu/drm/i915/display/intel_sprite.c
> >> index d03860fef2d7..4f4ba474cf46 100644
> >> --- a/drivers/gpu/drm/i915/display/intel_sprite.c
> >> +++ b/drivers/gpu/drm/i915/display/intel_sprite.c
> >> @@ -2013,7 +2013,7 @@ g4x_sprite_check(struct intel_crtc_state *crtc_state,
> >> ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
> >> &crtc_state->uapi,
> >> min_scale, max_scale,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> @@ -2072,7 +2072,7 @@ vlv_sprite_check(struct intel_crtc_state *crtc_state,
> >> &crtc_state->uapi,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> @@ -2282,7 +2282,7 @@ static int skl_plane_check(struct intel_crtc_state *crtc_state,
> >> ret = drm_atomic_helper_check_plane_state(&plane_state->uapi,
> >> &crtc_state->uapi,
> >> min_scale, max_scale,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c
> >> index 6776ebb3246d..d6e5f86c24d5 100644
> >> --- a/drivers/gpu/drm/imx/ipuv3-plane.c
> >> +++ b/drivers/gpu/drm/imx/ipuv3-plane.c
> >> @@ -352,7 +352,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
> >> struct drm_framebuffer *fb = state->fb;
> >> struct drm_framebuffer *old_fb = old_state->fb;
> >> unsigned long eba, ubo, vbo, old_ubo, old_vbo, alpha_eba;
> >> - bool can_position = (plane->type == DRM_PLANE_TYPE_OVERLAY);
> >> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
> >> int ret;
> >>
> >> /* Ok to disable */
> >> @@ -367,10 +367,13 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
> >> if (WARN_ON(!crtc_state))
> >> return -EINVAL;
> >>
> >> + if (plane->type == DRM_PLANE_TYPE_OVERLAY)
> >> + flags |= DRM_PLANE_CAN_POSITION;
> >> +
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - can_position, true);
> >> + flags);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> >> index 5dab9c3d0a52..d885b9e6bfee 100644
> >> --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> >> +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> >> @@ -298,6 +298,7 @@ static int ingenic_drm_plane_atomic_check(struct drm_plane *plane,
> >> struct ingenic_drm *priv = drm_device_get_priv(plane->dev);
> >> struct drm_crtc_state *crtc_state;
> >> struct drm_crtc *crtc = state->crtc ?: plane->state->crtc;
> >> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
> >> int ret;
> >>
> >> if (!crtc)
> >> @@ -307,11 +308,13 @@ static int ingenic_drm_plane_atomic_check(struct drm_plane *plane,
> >> if (WARN_ON(!crtc_state))
> >> return -EINVAL;
> >>
> >> + if (priv->soc_info->has_osd)
> >> + flags |= DRM_PLANE_CAN_POSITION;
> >> +
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - priv->soc_info->has_osd,
> >> - true);
> >> + flags);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
> >> index 92141a19681b..cfa7551b2a66 100644
> >> --- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c
> >> +++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
> >> @@ -105,7 +105,7 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane,
> >> return drm_atomic_helper_check_plane_state(plane->state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> static void mtk_plane_atomic_async_update(struct drm_plane *plane,
> >> @@ -161,7 +161,7 @@ static int mtk_plane_atomic_check(struct drm_plane *plane,
> >> return drm_atomic_helper_check_plane_state(state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> static void mtk_plane_atomic_disable(struct drm_plane *plane,
> >> diff --git a/drivers/gpu/drm/meson/meson_overlay.c b/drivers/gpu/drm/meson/meson_overlay.c
> >> index a8bcc70644df..91c1d86e0429 100644
> >> --- a/drivers/gpu/drm/meson/meson_overlay.c
> >> +++ b/drivers/gpu/drm/meson/meson_overlay.c
> >> @@ -179,7 +179,7 @@ static int meson_overlay_atomic_check(struct drm_plane *plane,
> >> return drm_atomic_helper_check_plane_state(state, crtc_state,
> >> FRAC_16_16(1, 5),
> >> FRAC_16_16(5, 1),
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> /* Takes a fixed 16.16 number and converts it to integer. */
> >> diff --git a/drivers/gpu/drm/meson/meson_plane.c b/drivers/gpu/drm/meson/meson_plane.c
> >> index 35338ed18209..1d4a4d62ff53 100644
> >> --- a/drivers/gpu/drm/meson/meson_plane.c
> >> +++ b/drivers/gpu/drm/meson/meson_plane.c
> >> @@ -90,7 +90,7 @@ static int meson_plane_atomic_check(struct drm_plane *plane,
> >> return drm_atomic_helper_check_plane_state(state, crtc_state,
> >> FRAC_16_16(1, 5),
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, true);
> >> + DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> #define MESON_MOD_AFBC_VALID_BITS (AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | \
> >> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> >> index 33f6c56f01ed..bf8153361f23 100644
> >> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> >> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> >> @@ -867,9 +867,10 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
> >> state->crtc);
> >>
> >> min_scale = FRAC_16_16(1, pdpu->pipe_sblk->maxdwnscale);
> >> - ret = drm_atomic_helper_check_plane_state(state, crtc_state, min_scale,
> >> - pdpu->pipe_sblk->maxupscale << 16,
> >> - true, true);
> >> + ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> + min_scale,
> >> + pdpu->pipe_sblk->maxupscale << 16,
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret) {
> >> DPU_DEBUG_PLANE(pdpu, "Check plane state failed (%d)\n", ret);
> >> return ret;
> >> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
> >> index 83423092de2f..c8f5d39dda29 100644
> >> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
> >> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c
> >> @@ -300,7 +300,7 @@ static int mdp5_plane_atomic_check_with_state(struct drm_crtc_state *crtc_state,
> >>
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> min_scale, max_scale,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> @@ -474,7 +474,7 @@ static int mdp5_plane_atomic_async_check(struct drm_plane *plane,
> >>
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> min_scale, max_scale,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> >> index b721b8b262ce..c24ef330718e 100644
> >> --- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> >> +++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> >> @@ -410,7 +410,7 @@ static int mxsfb_plane_atomic_check(struct drm_plane *plane,
> >> return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, true);
> >> + DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> static void mxsfb_plane_primary_atomic_update(struct drm_plane *plane,
> >> diff --git a/drivers/gpu/drm/nouveau/dispnv50/base507c.c b/drivers/gpu/drm/nouveau/dispnv50/base507c.c
> >> index 302d4e6fc52f..bc6846c6618b 100644
> >> --- a/drivers/gpu/drm/nouveau/dispnv50/base507c.c
> >> +++ b/drivers/gpu/drm/nouveau/dispnv50/base507c.c
> >> @@ -236,7 +236,7 @@ base507c_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
> >> ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, true);
> >> + DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/nouveau/dispnv50/curs507a.c b/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
> >> index 54fbd6fe751d..dbf5a23e178d 100644
> >> --- a/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
> >> +++ b/drivers/gpu/drm/nouveau/dispnv50/curs507a.c
> >> @@ -104,7 +104,7 @@ curs507a_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
> >> ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> asyh->curs.visible = asyw->state.visible;
> >> if (ret || !asyh->curs.visible)
> >> return ret;
> >> diff --git a/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c b/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
> >> index afd6c7271de1..56f98e464f2f 100644
> >> --- a/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
> >> +++ b/drivers/gpu/drm/nouveau/dispnv50/ovly507e.c
> >> @@ -109,7 +109,7 @@ ovly507e_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
> >> ret = drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c b/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
> >> index 57df997c5ff3..b2441deb762f 100644
> >> --- a/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
> >> +++ b/drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
> >> @@ -303,7 +303,7 @@ wndwc37e_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw,
> >> return drm_atomic_helper_check_plane_state(&asyw->state, &asyh->state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> static const u32
> >> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> >> index a0021fc25b27..713d4e06ce7e 100644
> >> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> >> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> >> @@ -587,7 +587,7 @@ int __rcar_du_plane_atomic_check(struct drm_plane *plane,
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret < 0)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> >> index c80f7d9fd13f..f2c64068888e 100644
> >> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> >> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> >> @@ -800,7 +800,7 @@ static int vop_plane_atomic_check(struct drm_plane *plane,
> >>
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> min_scale, max_scale,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> @@ -1048,7 +1048,7 @@ static int vop_plane_atomic_async_check(struct drm_plane *plane,
> >>
> >> return drm_atomic_helper_check_plane_state(plane->state, crtc_state,
> >> min_scale, max_scale,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> static void vop_plane_atomic_async_update(struct drm_plane *plane,
> >> diff --git a/drivers/gpu/drm/selftests/test-drm_plane_helper.c b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> >> index 0a9553f51796..01e95b2d572f 100644
> >> --- a/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> >> +++ b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
> >> @@ -103,7 +103,7 @@ int igt_check_plane_state(void *ignored)
> >> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, false);
> >> + 0);
> >> FAIL(ret < 0, "Simple clipping check should pass\n");
> >> FAIL_ON(!plane_state.visible);
> >> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1024 << 16, 768 << 16));
> >> @@ -114,7 +114,7 @@ int igt_check_plane_state(void *ignored)
> >> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, false);
> >> + 0);
> >> FAIL(ret < 0, "Rotated clipping check should pass\n");
> >> FAIL_ON(!plane_state.visible);
> >> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 768 << 16, 1024 << 16));
> >> @@ -127,13 +127,13 @@ int igt_check_plane_state(void *ignored)
> >> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, false);
> >> + 0);
> >> FAIL(!ret, "Should not be able to position on the crtc with can_position=false\n");
> >>
> >> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - true, false);
> >> + DRM_PLANE_CAN_POSITION);
> >> FAIL(ret < 0, "Simple positioning should work\n");
> >> FAIL_ON(!plane_state.visible);
> >> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1023 << 16, 767 << 16));
> >> @@ -145,12 +145,12 @@ int igt_check_plane_state(void *ignored)
> >> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> >> 0x8001,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, false);
> >> + 0);
> >> FAIL(!ret, "Upscaling out of range should fail.\n");
> >> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> >> 0x8000,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, false);
> >> + 0);
> >> FAIL(ret < 0, "Upscaling exactly 2x should work\n");
> >> FAIL_ON(!plane_state.visible);
> >> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 512 << 16, 384 << 16));
> >> @@ -159,11 +159,11 @@ int igt_check_plane_state(void *ignored)
> >> set_src(&plane_state, 0, 0, 2048 << 16, 1536 << 16);
> >> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - 0x1ffff, false, false);
> >> + 0x1ffff, 0);
> >> FAIL(!ret, "Downscaling out of range should fail.\n");
> >> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - 0x20000, false, false);
> >> + 0x20000, 0);
> >> FAIL(ret < 0, "Should succeed with exact scaling limit\n");
> >> FAIL_ON(!plane_state.visible);
> >> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 2048 << 16, 1536 << 16));
> >> @@ -175,7 +175,7 @@ int igt_check_plane_state(void *ignored)
> >> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> 0x10001,
> >> - true, false);
> >> + DRM_PLANE_CAN_POSITION);
> >> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
> >> FAIL_ON(!plane_state.visible);
> >> FAIL_ON(!check_src_eq(&plane_state, 0, 0, 2 << 16, 2 << 16));
> >> @@ -185,8 +185,7 @@ int igt_check_plane_state(void *ignored)
> >> set_crtc(&plane_state, -2, -2, 1028, 772);
> >> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - 0x10001,
> >> - false, false);
> >> + 0x10001, 0);
> >> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
> >> FAIL_ON(!plane_state.visible);
> >> FAIL_ON(!check_src_eq(&plane_state, 0x40002, 0x40002, 1024 << 16, 768 << 16));
> >> @@ -197,7 +196,7 @@ int igt_check_plane_state(void *ignored)
> >> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> >> 0xffff,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - true, false);
> >> + DRM_PLANE_CAN_POSITION);
> >> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
> >> FAIL_ON(!plane_state.visible);
> >> /* Should not be rounded to 0x20001, which would be upscaling. */
> >> @@ -209,7 +208,7 @@ int igt_check_plane_state(void *ignored)
> >> ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
> >> 0xffff,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, false);
> >> + 0);
> >> FAIL(ret < 0, "Should succeed by clipping to exact multiple");
> >> FAIL_ON(!plane_state.visible);
> >> FAIL_ON(!check_src_eq(&plane_state, 0x3fffe, 0x3fffe, 1024 << 16, 768 << 16));
> >> diff --git a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
> >> index 816ad4ce8996..c706b615bbe1 100644
> >> --- a/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
> >> +++ b/drivers/gpu/drm/sun4i/sun8i_ui_layer.c
> >> @@ -260,7 +260,7 @@ static int sun8i_ui_layer_atomic_check(struct drm_plane *plane,
> >>
> >> return drm_atomic_helper_check_plane_state(state, crtc_state,
> >> min_scale, max_scale,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> static void sun8i_ui_layer_atomic_disable(struct drm_plane *plane,
> >> diff --git a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
> >> index a360697a4a4a..7490c19b0117 100644
> >> --- a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
> >> +++ b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
> >> @@ -363,7 +363,7 @@ static int sun8i_vi_layer_atomic_check(struct drm_plane *plane,
> >>
> >> return drm_atomic_helper_check_plane_state(state, crtc_state,
> >> min_scale, max_scale,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> static void sun8i_vi_layer_atomic_disable(struct drm_plane *plane,
> >> diff --git a/drivers/gpu/drm/tegra/plane.c b/drivers/gpu/drm/tegra/plane.c
> >> index 4cd0461cc508..7bb0d5361900 100644
> >> --- a/drivers/gpu/drm/tegra/plane.c
> >> +++ b/drivers/gpu/drm/tegra/plane.c
> >> @@ -230,8 +230,9 @@ int tegra_plane_state_add(struct tegra_plane *plane,
> >> return PTR_ERR(crtc_state);
> >>
> >> /* Check plane state for visibility and calculate clipping bounds */
> >> - err = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> - 0, INT_MAX, true, true);
> >> + err = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
> >> + INT_MAX,
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (err < 0)
> >> return err;
> >>
> >> diff --git a/drivers/gpu/drm/tidss/tidss_plane.c b/drivers/gpu/drm/tidss/tidss_plane.c
> >> index 43e72d0b2d84..9b47cdab51fd 100644
> >> --- a/drivers/gpu/drm/tidss/tidss_plane.c
> >> +++ b/drivers/gpu/drm/tidss/tidss_plane.c
> >> @@ -46,7 +46,8 @@ static int tidss_plane_atomic_check(struct drm_plane *plane,
> >> return PTR_ERR(crtc_state);
> >>
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state, 0,
> >> - INT_MAX, true, true);
> >> + INT_MAX,
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret < 0)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/vboxvideo/vbox_mode.c b/drivers/gpu/drm/vboxvideo/vbox_mode.c
> >> index d9a5af62af89..9a775cd71fe1 100644
> >> --- a/drivers/gpu/drm/vboxvideo/vbox_mode.c
> >> +++ b/drivers/gpu/drm/vboxvideo/vbox_mode.c
> >> @@ -264,7 +264,7 @@ static int vbox_primary_atomic_check(struct drm_plane *plane,
> >> return drm_atomic_helper_check_plane_state(new_state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, true);
> >> + DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> static void vbox_primary_atomic_update(struct drm_plane *plane,
> >> @@ -340,7 +340,7 @@ static int vbox_cursor_atomic_check(struct drm_plane *plane,
> >> ret = drm_atomic_helper_check_plane_state(new_state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
> >> index d040d9f12c6d..7263209bf266 100644
> >> --- a/drivers/gpu/drm/vc4/vc4_plane.c
> >> +++ b/drivers/gpu/drm/vc4/vc4_plane.c
> >> @@ -324,7 +324,8 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state)
> >> }
> >>
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state, 1,
> >> - INT_MAX, true, true);
> >> + INT_MAX,
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c
> >> index 6a311cd93440..1297c6c8bae8 100644
> >> --- a/drivers/gpu/drm/virtio/virtgpu_plane.c
> >> +++ b/drivers/gpu/drm/virtio/virtgpu_plane.c
> >> @@ -85,7 +85,7 @@ static const struct drm_plane_funcs virtio_gpu_plane_funcs = {
> >> static int virtio_gpu_plane_atomic_check(struct drm_plane *plane,
> >> struct drm_plane_state *state)
> >> {
> >> - bool is_cursor = plane->type == DRM_PLANE_TYPE_CURSOR;
> >> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
> >> struct drm_crtc_state *crtc_state;
> >> int ret;
> >>
> >> @@ -96,10 +96,13 @@ static int virtio_gpu_plane_atomic_check(struct drm_plane *plane,
> >> if (IS_ERR(crtc_state))
> >> return PTR_ERR(crtc_state);
> >>
> >> + if (plane->type == DRM_PLANE_TYPE_CURSOR)
> >> + flags |= DRM_PLANE_CAN_POSITION;
> >> +
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - is_cursor, true);
> >> + flags);
> >> return ret;
> >> }
> >>
> >> diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_plane.c
> >> index 6d31265a2ab7..6fa0f9452efd 100644
> >> --- a/drivers/gpu/drm/vkms/vkms_plane.c
> >> +++ b/drivers/gpu/drm/vkms/vkms_plane.c
> >> @@ -114,7 +114,7 @@ static int vkms_plane_atomic_check(struct drm_plane *plane,
> >> struct drm_plane_state *state)
> >> {
> >> struct drm_crtc_state *crtc_state;
> >> - bool can_position = false;
> >> + uint32_t flags = DRM_PLANE_CAN_UPDATE_DISABLED;
> >> int ret;
> >>
> >> if (!state->fb || WARN_ON(!state->crtc))
> >> @@ -125,17 +125,17 @@ static int vkms_plane_atomic_check(struct drm_plane *plane,
> >> return PTR_ERR(crtc_state);
> >>
> >> if (plane->type == DRM_PLANE_TYPE_CURSOR)
> >> - can_position = true;
> >> + flags |= DRM_PLANE_CAN_POSITION;
> >>
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - can_position, true);
> >> + flags);
> >> if (ret != 0)
> >> return ret;
> >>
> >> /* for now primary plane must be visible and full screen */
> >> - if (!state->visible && !can_position)
> >> + if (!state->visible && plane->type != DRM_PLANE_TYPE_CURSOR)
> >> return -EINVAL;
> >>
> >> return 0;
> >> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> >> index 312ed0881a99..d58088ab44a4 100644
> >> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> >> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> >> @@ -453,7 +453,7 @@ int vmw_du_primary_plane_atomic_check(struct drm_plane *plane,
> >> ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, true);
> >> + DRM_PLANE_CAN_UPDATE_DISABLED);
> >>
> >> if (!ret && new_fb) {
> >> struct drm_crtc *crtc = state->crtc;
> >> @@ -494,7 +494,7 @@ int vmw_du_cursor_plane_atomic_check(struct drm_plane *plane,
> >> ret = drm_atomic_helper_check_plane_state(new_state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> if (ret)
> >> return ret;
> >>
> >> diff --git a/drivers/gpu/drm/xlnx/zynqmp_disp.c b/drivers/gpu/drm/xlnx/zynqmp_disp.c
> >> index a455cfc1bee5..4969e2e0c874 100644
> >> --- a/drivers/gpu/drm/xlnx/zynqmp_disp.c
> >> +++ b/drivers/gpu/drm/xlnx/zynqmp_disp.c
> >> @@ -1164,7 +1164,7 @@ zynqmp_disp_plane_atomic_check(struct drm_plane *plane,
> >> return drm_atomic_helper_check_plane_state(state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, false);
> >> + 0);
> >> }
> >>
> >> static void
> >> diff --git a/drivers/gpu/drm/zte/zx_plane.c b/drivers/gpu/drm/zte/zx_plane.c
> >> index c8f7b21fa09e..e12935ab488c 100644
> >> --- a/drivers/gpu/drm/zte/zx_plane.c
> >> +++ b/drivers/gpu/drm/zte/zx_plane.c
> >> @@ -72,7 +72,7 @@ static int zx_vl_plane_atomic_check(struct drm_plane *plane,
> >>
> >> return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
> >> min_scale, max_scale,
> >> - true, true);
> >> + DRM_PLANE_CAN_POSITION | DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> static int zx_vl_get_fmt(uint32_t format)
> >> @@ -300,7 +300,7 @@ static int zx_gl_plane_atomic_check(struct drm_plane *plane,
> >> return drm_atomic_helper_check_plane_state(plane_state, crtc_state,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> DRM_PLANE_HELPER_NO_SCALING,
> >> - false, true);
> >> + DRM_PLANE_CAN_UPDATE_DISABLED);
> >> }
> >>
> >> static int zx_gl_get_fmt(uint32_t format)
> >> diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
> >> index b268180c97eb..bb9957b4f91b 100644
> >> --- a/include/drm/drm_atomic_helper.h
> >> +++ b/include/drm/drm_atomic_helper.h
> >> @@ -40,12 +40,15 @@ struct drm_private_state;
> >>
> >> int drm_atomic_helper_check_modeset(struct drm_device *dev,
> >> struct drm_atomic_state *state);
> >> +
> >> +#define DRM_PLANE_CAN_POSITION BIT(0)
> >> +#define DRM_PLANE_CAN_UPDATE_DISABLED BIT(1)
> >> +
> >> int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
> >> const struct drm_crtc_state *crtc_state,
> >> int min_scale,
> >> int max_scale,
> >> - bool can_position,
> >> - bool can_update_disabled);
> >> + uint32_t flags);
> >> int drm_atomic_helper_check_planes(struct drm_device *dev,
> >> struct drm_atomic_state *state);
> >> int drm_atomic_helper_check(struct drm_device *dev,
> >> --
> >> 2.28.0
> >>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2020-09-16 11:26 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-09-10 9:24 [RFC PATCH 1/3] drm: use flags instead of boolean in plane check Stefan Agner
2020-09-10 9:24 ` [RFC PATCH 2/3] drm/atomic-helper: add REQUIRE_MATCHING_FB flag Stefan Agner
2020-09-11 8:52 ` Daniel Vetter
2020-09-16 10:44 ` Stefan Agner
2020-09-11 11:59 ` Ville Syrjälä
2020-09-16 10:49 ` Stefan Agner
2020-09-10 9:24 ` [RFC PATCH 3/3] drm: mxsfb: enforce framebuffer size matches plane size Stefan Agner
2020-09-11 8:50 ` [RFC PATCH 1/3] drm: use flags instead of boolean in plane check Daniel Vetter
2020-09-16 10:31 ` Stefan Agner
2020-09-16 11:26 ` Daniel Vetter
2020-09-15 22:58 ` Laurent Pinchart
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.