Op 08-07-2019 om 14:53 schreef Ville Syrjala: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > We need to insert stuff between the plane and crtc .atomic_check() > drm_atomic_helper_check_planes() doesn't allow us to do that so > stop using it and hand roll the loops instead. > > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > --- > .../gpu/drm/i915/display/intel_atomic_plane.c | 10 +--- > .../gpu/drm/i915/display/intel_atomic_plane.h | 2 + > drivers/gpu/drm/i915/display/intel_display.c | 57 +++++++++++++++---- > 3 files changed, 50 insertions(+), 19 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c b/drivers/gpu/drm/i915/display/intel_atomic_plane.c > index 7ff19b524f9d..d7493551b28c 100644 > --- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c > +++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c > @@ -194,14 +194,11 @@ get_crtc_from_states(const struct intel_plane_state *old_plane_state, > return NULL; > } > > -static int intel_plane_atomic_check(struct drm_plane *_plane, > - struct drm_plane_state *_new_plane_state) > +int intel_plane_atomic_check(struct intel_atomic_state *state, > + struct intel_plane *plane) > { > - struct intel_plane *plane = to_intel_plane(_plane); > - struct intel_atomic_state *state = > - to_intel_atomic_state(_new_plane_state->state); > struct intel_plane_state *new_plane_state = > - to_intel_plane_state(_new_plane_state); > + intel_atomic_get_new_plane_state(state, plane); > const struct intel_plane_state *old_plane_state = > intel_atomic_get_old_plane_state(state, plane); > struct intel_crtc *crtc = > @@ -368,5 +365,4 @@ void i9xx_update_planes_on_crtc(struct intel_atomic_state *state, > const struct drm_plane_helper_funcs intel_plane_helper_funcs = { > .prepare_fb = intel_prepare_plane_fb, > .cleanup_fb = intel_cleanup_plane_fb, > - .atomic_check = intel_plane_atomic_check, > }; > diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.h b/drivers/gpu/drm/i915/display/intel_atomic_plane.h > index cb7ef4f9eafd..dc85af02e9b7 100644 > --- a/drivers/gpu/drm/i915/display/intel_atomic_plane.h > +++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.h > @@ -41,6 +41,8 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_ > struct intel_crtc_state *crtc_state, > const struct intel_plane_state *old_plane_state, > struct intel_plane_state *intel_state); > +int intel_plane_atomic_check(struct intel_atomic_state *state, > + struct intel_plane *plane); > int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_state, > struct intel_crtc_state *crtc_state, > const struct intel_plane_state *old_plane_state, > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > index 5635f2079e4c..5a42cbfa72c3 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -11733,15 +11733,14 @@ static bool c8_planes_changed(const struct intel_crtc_state *new_crtc_state) > return !old_crtc_state->c8_planes != !new_crtc_state->c8_planes; > } > > -static int intel_crtc_atomic_check(struct drm_crtc *_crtc, > - struct drm_crtc_state *_crtc_state) > +static int intel_crtc_atomic_check(struct intel_atomic_state *state, > + struct intel_crtc *crtc) > { > - struct intel_crtc *crtc = to_intel_crtc(_crtc); > struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); > struct intel_crtc_state *crtc_state = > - to_intel_crtc_state(_crtc_state); > - int ret; > + intel_atomic_get_new_crtc_state(state, crtc); > bool mode_changed = needs_modeset(crtc_state); > + int ret; > > if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv) && > mode_changed && !crtc_state->base.active) > @@ -11813,10 +11812,6 @@ static int intel_crtc_atomic_check(struct drm_crtc *_crtc, > return ret; > } > > -static const struct drm_crtc_helper_funcs intel_helper_funcs = { > - .atomic_check = intel_crtc_atomic_check, > -}; > - > static void intel_modeset_update_connector_atomic_state(struct drm_device *dev) > { > struct intel_connector *connector; > @@ -13457,6 +13452,42 @@ static void intel_crtc_check_fastset(const struct intel_crtc_state *old_crtc_sta > new_crtc_state->has_drrs = old_crtc_state->has_drrs; > } > > +static int intel_atomic_check_planes(struct intel_atomic_state *state) > +{ > + struct intel_plane_state *plane_state; > + struct intel_plane *plane; > + int i, ret; > + > + for_each_new_intel_plane_in_state(state, plane, plane_state, i) { > + ret = intel_plane_atomic_check(state, plane); > + if (ret) { > + DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic driver check failed\n", > + plane->base.base.id, plane->base.name); > + return ret; > + } > + } > + > + return 0; > +} > + > +static int intel_atomic_check_crtcs(struct intel_atomic_state *state) > +{ > + struct intel_crtc_state *crtc_state; > + struct intel_crtc *crtc; > + int i; > + > + for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) { > + int ret = intel_crtc_atomic_check(state, crtc); > + if (ret) { > + DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic driver check failed\n", > + crtc->base.base.id, crtc->base.name); > + return ret; > + } > + } > + > + return 0; > +} > + > /** > * intel_atomic_check - validate state object > * @dev: drm device > @@ -13520,7 +13551,11 @@ static int intel_atomic_check(struct drm_device *dev, > if (ret) > goto fail; > > - ret = drm_atomic_helper_check_planes(dev, &state->base); > + ret = intel_atomic_check_planes(state); > + if (ret) > + goto fail; > + > + ret = intel_atomic_check_crtcs(state); > if (ret) > goto fail; > > @@ -15051,8 +15086,6 @@ static int intel_crtc_init(struct drm_i915_private *dev_priv, enum pipe pipe) > dev_priv->plane_to_crtc_mapping[i9xx_plane] = intel_crtc; > } > > - drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs); > - > intel_color_init(intel_crtc); > > WARN_ON(drm_crtc_index(&intel_crtc->base) != intel_crtc->pipe); Literally what helper_check_planes does anyway, so r-b if not yet pushed. :) _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel