| From 34bf5a3ee4e40f20273dd41373fedd96d01822e8 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com> |
| Date: Wed, 1 Nov 2017 22:15:58 +0200 |
| Subject: [PATCH 0538/1795] drm: Check crtc_state->enable rather than |
| crtc->enabled in drm_plane_helper_check_state() |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| drm_plane_helper_check_state() is supposed to do things the atomic way, |
| so it should not be inspecting crtc->enabled. Rather we should be |
| looking at crtc_state->enable. |
| |
| We have a slight complication due to drm_plane_helper_check_update() |
| reusing drm_plane_helper_check_state() for non-atomic drivers. Thus |
| we'll have to pass the crtc_state in manally and construct a fake |
| crtc_state in drm_plane_helper_check_update(). |
| |
| v2: Fix the WARNs about plane_state->crtc matching crtc_state->crtc |
| |
| Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20171101201558.6059-1-ville.syrjala@linux.intel.com |
| Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit 10b47ee02d1ae66160058241cf5b962f64e81b47) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| |
| Conflicts: |
| drivers/gpu/drm/vmwgfx/vmwgfx_kms.c |
| --- |
| drivers/gpu/drm/arm/hdlcd_crtc.c | 2 +- |
| drivers/gpu/drm/arm/malidp_planes.c | 3 +- |
| drivers/gpu/drm/drm_plane_helper.c | 51 ++++++++++++--------- |
| drivers/gpu/drm/drm_simple_kms_helper.c | 2 +- |
| drivers/gpu/drm/i915/intel_display.c | 2 + |
| drivers/gpu/drm/imx/ipuv3-plane.c | 2 +- |
| drivers/gpu/drm/mediatek/mtk_drm_plane.c | 2 +- |
| drivers/gpu/drm/meson/meson_plane.c | 2 +- |
| drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | 4 +- |
| drivers/gpu/drm/nouveau/nv50_display.c | 6 ++- |
| drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 2 +- |
| drivers/gpu/drm/tegra/dc.c | 4 +- |
| drivers/gpu/drm/zte/zx_plane.c | 4 +- |
| include/drm/drm_plane_helper.h | 3 +- |
| 14 files changed, 51 insertions(+), 38 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c |
| index 72b22b805412..14721723fa8a 100644 |
| --- a/drivers/gpu/drm/arm/hdlcd_crtc.c |
| +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c |
| @@ -252,7 +252,7 @@ static int hdlcd_plane_atomic_check(struct drm_plane *plane, |
| clip.x2 = crtc_state->adjusted_mode.hdisplay; |
| clip.y2 = crtc_state->adjusted_mode.vdisplay; |
| |
| - return drm_plane_helper_check_state(state, &clip, |
| + return drm_plane_helper_check_state(state, crtc_state, &clip, |
| DRM_PLANE_HELPER_NO_SCALING, |
| DRM_PLANE_HELPER_NO_SCALING, |
| false, true); |
| diff --git a/drivers/gpu/drm/arm/malidp_planes.c b/drivers/gpu/drm/arm/malidp_planes.c |
| index 16b8b310ae5c..1a24fe75007a 100644 |
| --- a/drivers/gpu/drm/arm/malidp_planes.c |
| +++ b/drivers/gpu/drm/arm/malidp_planes.c |
| @@ -151,7 +151,8 @@ static int malidp_se_check_scaling(struct malidp_plane *mp, |
| |
| clip.x2 = crtc_state->adjusted_mode.hdisplay; |
| clip.y2 = crtc_state->adjusted_mode.vdisplay; |
| - ret = drm_plane_helper_check_state(state, &clip, 0, INT_MAX, true, true); |
| + ret = drm_plane_helper_check_state(state, crtc_state, &clip, |
| + 0, INT_MAX, true, true); |
| if (ret) |
| return ret; |
| |
| diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c |
| index 06aee1741e96..859be4b65307 100644 |
| --- a/drivers/gpu/drm/drm_plane_helper.c |
| +++ b/drivers/gpu/drm/drm_plane_helper.c |
| @@ -101,7 +101,8 @@ static int get_connectors_for_crtc(struct drm_crtc *crtc, |
| |
| /** |
| * drm_plane_helper_check_state() - Check plane state for validity |
| - * @state: plane state to check |
| + * @plane_state: plane state to check |
| + * @crtc_state: crtc state to check |
| * @clip: integer clipping coordinates |
| * @min_scale: minimum @src:@dest scaling factor in 16.16 fixed point |
| * @max_scale: maximum @src:@dest scaling factor in 16.16 fixed point |
| @@ -120,35 +121,37 @@ static int get_connectors_for_crtc(struct drm_crtc *crtc, |
| * RETURNS: |
| * Zero if update appears valid, error code on failure |
| */ |
| -int drm_plane_helper_check_state(struct drm_plane_state *state, |
| +int drm_plane_helper_check_state(struct drm_plane_state *plane_state, |
| + const struct drm_crtc_state *crtc_state, |
| const struct drm_rect *clip, |
| int min_scale, |
| int max_scale, |
| bool can_position, |
| bool can_update_disabled) |
| { |
| - struct drm_crtc *crtc = state->crtc; |
| - struct drm_framebuffer *fb = state->fb; |
| - struct drm_rect *src = &state->src; |
| - struct drm_rect *dst = &state->dst; |
| - unsigned int rotation = state->rotation; |
| + struct drm_framebuffer *fb = plane_state->fb; |
| + struct drm_rect *src = &plane_state->src; |
| + struct drm_rect *dst = &plane_state->dst; |
| + unsigned int rotation = plane_state->rotation; |
| int hscale, vscale; |
| |
| - *src = drm_plane_state_src(state); |
| - *dst = drm_plane_state_dest(state); |
| + WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc); |
| + |
| + *src = drm_plane_state_src(plane_state); |
| + *dst = drm_plane_state_dest(plane_state); |
| |
| if (!fb) { |
| - state->visible = false; |
| + plane_state->visible = false; |
| return 0; |
| } |
| |
| /* crtc should only be NULL when disabling (i.e., !fb) */ |
| - if (WARN_ON(!crtc)) { |
| - state->visible = false; |
| + if (WARN_ON(!plane_state->crtc)) { |
| + plane_state->visible = false; |
| return 0; |
| } |
| |
| - if (!crtc->enabled && !can_update_disabled) { |
| + if (!crtc_state->enable && !can_update_disabled) { |
| DRM_DEBUG_KMS("Cannot update plane of a disabled CRTC.\n"); |
| return -EINVAL; |
| } |
| @@ -160,16 +163,16 @@ int drm_plane_helper_check_state(struct drm_plane_state *state, |
| vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale); |
| if (hscale < 0 || vscale < 0) { |
| DRM_DEBUG_KMS("Invalid scaling of plane\n"); |
| - drm_rect_debug_print("src: ", &state->src, true); |
| - drm_rect_debug_print("dst: ", &state->dst, false); |
| + drm_rect_debug_print("src: ", &plane_state->src, true); |
| + drm_rect_debug_print("dst: ", &plane_state->dst, false); |
| return -ERANGE; |
| } |
| |
| - state->visible = drm_rect_clip_scaled(src, dst, clip, hscale, vscale); |
| + plane_state->visible = drm_rect_clip_scaled(src, dst, clip, hscale, vscale); |
| |
| drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16, rotation); |
| |
| - if (!state->visible) |
| + if (!plane_state->visible) |
| /* |
| * Plane isn't visible; some drivers can handle this |
| * so we just return success here. Drivers that can't |
| @@ -230,7 +233,7 @@ int drm_plane_helper_check_update(struct drm_plane *plane, |
| bool can_update_disabled, |
| bool *visible) |
| { |
| - struct drm_plane_state state = { |
| + struct drm_plane_state plane_state = { |
| .plane = plane, |
| .crtc = crtc, |
| .fb = fb, |
| @@ -245,18 +248,22 @@ int drm_plane_helper_check_update(struct drm_plane *plane, |
| .rotation = rotation, |
| .visible = *visible, |
| }; |
| + struct drm_crtc_state crtc_state = { |
| + .crtc = crtc, |
| + .enable = crtc->enabled, |
| + }; |
| int ret; |
| |
| - ret = drm_plane_helper_check_state(&state, clip, |
| + ret = drm_plane_helper_check_state(&plane_state, &crtc_state, clip, |
| min_scale, max_scale, |
| can_position, |
| can_update_disabled); |
| if (ret) |
| return ret; |
| |
| - *src = state.src; |
| - *dst = state.dst; |
| - *visible = state.visible; |
| + *src = plane_state.src; |
| + *dst = plane_state.dst; |
| + *visible = plane_state.visible; |
| |
| return 0; |
| } |
| diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c |
| index dc9fd109de14..d428c805025c 100644 |
| --- a/drivers/gpu/drm/drm_simple_kms_helper.c |
| +++ b/drivers/gpu/drm/drm_simple_kms_helper.c |
| @@ -103,7 +103,7 @@ static int drm_simple_kms_plane_atomic_check(struct drm_plane *plane, |
| clip.x2 = crtc_state->adjusted_mode.hdisplay; |
| clip.y2 = crtc_state->adjusted_mode.vdisplay; |
| |
| - ret = drm_plane_helper_check_state(plane_state, &clip, |
| + ret = drm_plane_helper_check_state(plane_state, crtc_state, &clip, |
| DRM_PLANE_HELPER_NO_SCALING, |
| DRM_PLANE_HELPER_NO_SCALING, |
| false, true); |
| diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
| index cf648c526e12..6f33d4465774 100644 |
| --- a/drivers/gpu/drm/i915/intel_display.c |
| +++ b/drivers/gpu/drm/i915/intel_display.c |
| @@ -9401,6 +9401,7 @@ static int intel_check_cursor(struct intel_crtc_state *crtc_state, |
| int ret; |
| |
| ret = drm_plane_helper_check_state(&plane_state->base, |
| + &crtc_state->base, |
| &plane_state->clip, |
| DRM_PLANE_HELPER_NO_SCALING, |
| DRM_PLANE_HELPER_NO_SCALING, |
| @@ -12871,6 +12872,7 @@ intel_check_primary_plane(struct intel_plane *plane, |
| } |
| |
| ret = drm_plane_helper_check_state(&state->base, |
| + &crtc_state->base, |
| &state->clip, |
| min_scale, max_scale, |
| can_position, true); |
| diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c |
| index cf98596c7ce1..4ae6ee46a416 100644 |
| --- a/drivers/gpu/drm/imx/ipuv3-plane.c |
| +++ b/drivers/gpu/drm/imx/ipuv3-plane.c |
| @@ -341,7 +341,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane, |
| clip.y1 = 0; |
| clip.x2 = crtc_state->adjusted_mode.hdisplay; |
| clip.y2 = crtc_state->adjusted_mode.vdisplay; |
| - ret = drm_plane_helper_check_state(state, &clip, |
| + ret = drm_plane_helper_check_state(state, crtc_state, &clip, |
| DRM_PLANE_HELPER_NO_SCALING, |
| DRM_PLANE_HELPER_NO_SCALING, |
| can_position, true); |
| diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c b/drivers/gpu/drm/mediatek/mtk_drm_plane.c |
| index 6f121891430f..7ebb33657704 100644 |
| --- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c |
| +++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c |
| @@ -111,7 +111,7 @@ static int mtk_plane_atomic_check(struct drm_plane *plane, |
| clip.x2 = crtc_state->mode.hdisplay; |
| clip.y2 = crtc_state->mode.vdisplay; |
| |
| - return drm_plane_helper_check_state(state, &clip, |
| + return drm_plane_helper_check_state(state, crtc_state, &clip, |
| DRM_PLANE_HELPER_NO_SCALING, |
| DRM_PLANE_HELPER_NO_SCALING, |
| true, true); |
| diff --git a/drivers/gpu/drm/meson/meson_plane.c b/drivers/gpu/drm/meson/meson_plane.c |
| index 0b6011b8d632..b4cc8166ca02 100644 |
| --- a/drivers/gpu/drm/meson/meson_plane.c |
| +++ b/drivers/gpu/drm/meson/meson_plane.c |
| @@ -61,7 +61,7 @@ static int meson_plane_atomic_check(struct drm_plane *plane, |
| clip.x2 = crtc_state->mode.hdisplay; |
| clip.y2 = crtc_state->mode.vdisplay; |
| |
| - return drm_plane_helper_check_state(state, &clip, |
| + return drm_plane_helper_check_state(state, crtc_state, &clip, |
| DRM_PLANE_HELPER_NO_SCALING, |
| DRM_PLANE_HELPER_NO_SCALING, |
| true, true); |
| diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c |
| index 4b22ac3413a1..1c194a9453d9 100644 |
| --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c |
| +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c |
| @@ -348,8 +348,8 @@ static int mdp5_plane_atomic_check_with_state(struct drm_crtc_state *crtc_state, |
| min_scale = FRAC_16_16(1, 8); |
| max_scale = FRAC_16_16(8, 1); |
| |
| - ret = drm_plane_helper_check_state(state, &clip, min_scale, |
| - max_scale, true, true); |
| + ret = drm_plane_helper_check_state(state, crtc_state, &clip, |
| + min_scale, max_scale, true, true); |
| if (ret) |
| return ret; |
| |
| diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c |
| index e558fa480682..deffd6212b51 100644 |
| --- a/drivers/gpu/drm/nouveau/nv50_display.c |
| +++ b/drivers/gpu/drm/nouveau/nv50_display.c |
| @@ -1143,7 +1143,8 @@ nv50_curs_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw, |
| { |
| int ret; |
| |
| - ret = drm_plane_helper_check_state(&asyw->state, &asyw->clip, |
| + ret = drm_plane_helper_check_state(&asyw->state, &asyh->state, |
| + &asyw->clip, |
| DRM_PLANE_HELPER_NO_SCALING, |
| DRM_PLANE_HELPER_NO_SCALING, |
| true, true); |
| @@ -1432,7 +1433,8 @@ nv50_base_acquire(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw, |
| if (!fb->format->depth) |
| return -EINVAL; |
| |
| - ret = drm_plane_helper_check_state(&asyw->state, &asyw->clip, |
| + ret = drm_plane_helper_check_state(&asyw->state, &asyh->state, |
| + &asyw->clip, |
| DRM_PLANE_HELPER_NO_SCALING, |
| DRM_PLANE_HELPER_NO_SCALING, |
| false, true); |
| diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c |
| index f1fa8d5c9b52..9716b2735fd0 100644 |
| --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c |
| +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c |
| @@ -658,7 +658,7 @@ static int vop_plane_atomic_check(struct drm_plane *plane, |
| clip.x2 = crtc_state->adjusted_mode.hdisplay; |
| clip.y2 = crtc_state->adjusted_mode.vdisplay; |
| |
| - ret = drm_plane_helper_check_state(state, &clip, |
| + ret = drm_plane_helper_check_state(state, crtc_state, &clip, |
| min_scale, max_scale, |
| true, true); |
| if (ret) |
| diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c |
| index 4df39112e38e..08b899fd74fc 100644 |
| --- a/drivers/gpu/drm/tegra/dc.c |
| +++ b/drivers/gpu/drm/tegra/dc.c |
| @@ -500,8 +500,8 @@ static int tegra_plane_state_add(struct tegra_plane *plane, |
| clip.y2 = crtc_state->mode.vdisplay; |
| |
| /* Check plane state for visibility and calculate clipping bounds */ |
| - err = drm_plane_helper_check_state(state, &clip, 0, INT_MAX, |
| - true, true); |
| + err = drm_plane_helper_check_state(state, crtc_state, &clip, |
| + 0, INT_MAX, true, true); |
| if (err < 0) |
| return err; |
| |
| diff --git a/drivers/gpu/drm/zte/zx_plane.c b/drivers/gpu/drm/zte/zx_plane.c |
| index 18e763493264..ee0002529b8f 100644 |
| --- a/drivers/gpu/drm/zte/zx_plane.c |
| +++ b/drivers/gpu/drm/zte/zx_plane.c |
| @@ -80,7 +80,7 @@ static int zx_vl_plane_atomic_check(struct drm_plane *plane, |
| clip.x2 = crtc_state->adjusted_mode.hdisplay; |
| clip.y2 = crtc_state->adjusted_mode.vdisplay; |
| |
| - return drm_plane_helper_check_state(plane_state, &clip, |
| + return drm_plane_helper_check_state(plane_state, crtc_state, &clip, |
| min_scale, max_scale, |
| true, true); |
| } |
| @@ -315,7 +315,7 @@ static int zx_gl_plane_atomic_check(struct drm_plane *plane, |
| clip.x2 = crtc_state->adjusted_mode.hdisplay; |
| clip.y2 = crtc_state->adjusted_mode.vdisplay; |
| |
| - return drm_plane_helper_check_state(plane_state, &clip, |
| + return drm_plane_helper_check_state(plane_state, crtc_state, &clip, |
| DRM_PLANE_HELPER_NO_SCALING, |
| DRM_PLANE_HELPER_NO_SCALING, |
| false, true); |
| diff --git a/include/drm/drm_plane_helper.h b/include/drm/drm_plane_helper.h |
| index 7c8a00ceadb7..41b8309b0a57 100644 |
| --- a/include/drm/drm_plane_helper.h |
| +++ b/include/drm/drm_plane_helper.h |
| @@ -38,7 +38,8 @@ |
| */ |
| #define DRM_PLANE_HELPER_NO_SCALING (1<<16) |
| |
| -int drm_plane_helper_check_state(struct drm_plane_state *state, |
| +int drm_plane_helper_check_state(struct drm_plane_state *plane_state, |
| + const struct drm_crtc_state *crtc_state, |
| const struct drm_rect *clip, |
| int min_scale, int max_scale, |
| bool can_position, |
| -- |
| 2.19.0 |
| |