Message ID | 1547043209-8283-8-git-send-email-robert.chiras@nxp.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add support for DRM bridge and additional pixel formats | expand |
Hi, On Wed, Jan 09, 2019 at 02:13:47PM +0000, Robert Chiras wrote: > From: Mirela Rabulea <mirela.rabulea@nxp.com> > > 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 <mirela.rabulea@nxp.com> > --- > 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/mxsfb_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 *mxsfb) > clk_disable_unprepare(mxsfb->clk_axi); > } > > +/** > + * 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 = drm_atomic_helper_check(dev, state); > + if (ret) > + return ret; > + > + for_each_crtc_in_state(state, crtc, crtc_state, i) { This does not exist anymore in recent drm, see 9ba29fcb76a559078491adffc74f66bf92b9dbea. Cheers, -- Guido > + struct drm_plane_state *primary_state; > + int old_bpp = 0; > + int new_bpp = 0; > + > + if (!crtc->primary || !crtc->primary->old_fb) > + continue; > + primary_state = > + drm_atomic_get_plane_state(state, crtc->primary); > + if (!primary_state || !primary_state->fb) > + continue; > + old_bpp = crtc->primary->old_fb->format->depth; > + new_bpp = primary_state->fb->format->depth; > + if (old_bpp != new_bpp) { > + crtc_state->mode_changed = 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 = { > .fb_create = drm_gem_fb_create, > - .atomic_check = drm_atomic_helper_check, > + .atomic_check = mxsfb_atomic_helper_check, > .atomic_commit = drm_atomic_helper_commit, > }; > > -- > 2.7.4 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsfb_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 *mxsfb) clk_disable_unprepare(mxsfb->clk_axi); } +/** + * 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 = 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 = 0; + int new_bpp = 0; + + if (!crtc->primary || !crtc->primary->old_fb) + continue; + primary_state = + drm_atomic_get_plane_state(state, crtc->primary); + if (!primary_state || !primary_state->fb) + continue; + old_bpp = crtc->primary->old_fb->format->depth; + new_bpp = primary_state->fb->format->depth; + if (old_bpp != new_bpp) { + crtc_state->mode_changed = 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 = { .fb_create = drm_gem_fb_create, - .atomic_check = drm_atomic_helper_check, + .atomic_check = mxsfb_atomic_helper_check, .atomic_commit = drm_atomic_helper_commit, };