From mboxrd@z Thu Jan 1 00:00:00 1970 From: Robert Chiras Subject: [PATCH 07/10] drm/mxsfb: Signal mode changed when bpp changed Date: Wed, 9 Jan 2019 14:13:47 +0000 Message-ID: <1547043209-8283-8-git-send-email-robert.chiras@nxp.com> References: <1547043209-8283-1-git-send-email-robert.chiras@nxp.com> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Return-path: In-Reply-To: <1547043209-8283-1-git-send-email-robert.chiras@nxp.com> Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org To: Daniel Vetter , Philipp Zabel , Marek Vasut Cc: Mirela Rabulea , Stefan Agner , Shawn Guo , Fabio Estevam , David Airlie , Anson Huang , "dri-devel@lists.freedesktop.org" , dl-linux-imx , "kernel@pengutronix.de" , "linux-kernel@vger.kernel.org" List-Id: dri-devel@lists.freedesktop.org From: Mirela Rabulea Add mxsfb_atomic_helper_check to signal mode changed when bpp changed. This will trigger the execution of disable/enable on a modeset with different bpp than the current one. Signed-off-by: Mirela Rabulea --- drivers/gpu/drm/mxsfb/mxsfb_drv.c | 48 +++++++++++++++++++++++++++++++++++= +++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsf= b_drv.c index d3fb3a8..f528a37 100644 --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c @@ -115,9 +115,55 @@ void mxsfb_disable_axi_clk(struct mxsfb_drm_private *m= xsfb) clk_disable_unprepare(mxsfb->clk_axi); } =20 +/** + * mxsfb_atomic_helper_check - validate state object + * @dev: DRM device + * @state: the driver state object + * + * On top of the drm imlementation drm_atomic_helper_check, + * check if the bpp is changed, if so, signal mode_changed, + * this will trigger disable/enable + * + * RETURNS: + * Zero for success or -errno + */ +static int mxsfb_atomic_helper_check(struct drm_device *dev, + struct drm_atomic_state *state) +{ + struct drm_crtc *crtc; + struct drm_crtc_state *crtc_state; + int i, ret; + + ret =3D drm_atomic_helper_check(dev, state); + if (ret) + return ret; + + for_each_crtc_in_state(state, crtc, crtc_state, i) { + struct drm_plane_state *primary_state; + int old_bpp =3D 0; + int new_bpp =3D 0; + + if (!crtc->primary || !crtc->primary->old_fb) + continue; + primary_state =3D + drm_atomic_get_plane_state(state, crtc->primary); + if (!primary_state || !primary_state->fb) + continue; + old_bpp =3D crtc->primary->old_fb->format->depth; + new_bpp =3D primary_state->fb->format->depth; + if (old_bpp !=3D new_bpp) { + crtc_state->mode_changed =3D true; + DRM_DEBUG_ATOMIC( + "[CRTC:%d:%s] mode changed, bpp %d->%d\n", + crtc->base.id, crtc->name, old_bpp, new_bpp); + } + } + return ret; +} + static const struct drm_mode_config_funcs mxsfb_mode_config_funcs =3D { .fb_create =3D drm_gem_fb_create, - .atomic_check =3D drm_atomic_helper_check, + .atomic_check =3D mxsfb_atomic_helper_check, .atomic_commit =3D drm_atomic_helper_commit, }; =20 --=20 2.7.4