> -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Ville Syrjala > Sent: Wednesday, November 23, 2022 8:57 PM > To: intel-gfx@xxxxxxxxxxxxxxxxxxxxx > Subject: [PATCH 08/13] drm/i915: Move the DSB setup/cleaup into the > color code > > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > Since the color management code is the only user of the DSB at the moment move > the DSB prepare/cleanup there too. The code has to anyway make decisions on > whether to use the DSB or not (and how to use it). Also we'll need a place where we > actually generate the DSB command buffer ahead of time rather than the current > situation where it gets generated too late during the mmio programming of the > hardware. Looks Good to me. Reviewed-by: Uma Shankar <uma.shankar@xxxxxxxxx> > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_color.c | 10 ++++++++ > drivers/gpu/drm/i915/display/intel_color.h | 2 ++ > drivers/gpu/drm/i915/display/intel_display.c | 25 ++++++++------------ > drivers/gpu/drm/i915/display/intel_display.h | 8 +++++++ > 4 files changed, 30 insertions(+), 15 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index 5a4f794e1d08..5a8652407f30 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -1389,6 +1389,16 @@ void intel_color_commit_arm(const struct > intel_crtc_state *crtc_state) > i915->display.funcs.color->color_commit_arm(crtc_state); > } > > +void intel_color_prepare_commit(struct intel_crtc_state *crtc_state) { > + intel_dsb_prepare(crtc_state); > +} > + > +void intel_color_cleanup_commit(struct intel_crtc_state *crtc_state) { > + intel_dsb_cleanup(crtc_state); > +} > + > static bool intel_can_preload_luts(const struct intel_crtc_state *new_crtc_state) { > struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc); > diff --git a/drivers/gpu/drm/i915/display/intel_color.h > b/drivers/gpu/drm/i915/display/intel_color.h > index 1c6b1755f6d2..d620b5b1e2a6 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.h > +++ b/drivers/gpu/drm/i915/display/intel_color.h > @@ -17,6 +17,8 @@ void intel_color_init_hooks(struct drm_i915_private *i915); int > intel_color_init(struct drm_i915_private *i915); void intel_color_crtc_init(struct > intel_crtc *crtc); int intel_color_check(struct intel_crtc_state *crtc_state); > +void intel_color_prepare_commit(struct intel_crtc_state *crtc_state); > +void intel_color_cleanup_commit(struct intel_crtc_state *crtc_state); > void intel_color_commit_noarm(const struct intel_crtc_state *crtc_state); void > intel_color_commit_arm(const struct intel_crtc_state *crtc_state); void > intel_color_load_luts(const struct intel_crtc_state *crtc_state); diff --git > a/drivers/gpu/drm/i915/display/intel_display.c > b/drivers/gpu/drm/i915/display/intel_display.c > index 32b257157186..45d7996f5c1a 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -93,7 +93,6 @@ > #include "intel_dp_link_training.h" > #include "intel_dpio_phy.h" > #include "intel_dpt.h" > -#include "intel_dsb.h" > #include "intel_fbc.h" > #include "intel_fbdev.h" > #include "intel_fdi.h" > @@ -6931,7 +6930,7 @@ static int intel_atomic_prepare_commit(struct > intel_atomic_state *state) > > for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) { > if (intel_crtc_needs_color_update(crtc_state)) > - intel_dsb_prepare(crtc_state); > + intel_color_prepare_commit(crtc_state); > } > > return 0; > @@ -7382,24 +7381,18 @@ static void intel_atomic_commit_fence_wait(struct > intel_atomic_state *intel_stat > &wait_reset); > } > > -static void intel_cleanup_dsbs(struct intel_atomic_state *state) -{ > - struct intel_crtc_state *old_crtc_state, *new_crtc_state; > - struct intel_crtc *crtc; > - int i; > - > - for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, > - new_crtc_state, i) > - intel_dsb_cleanup(old_crtc_state); > -} > - > static void intel_atomic_cleanup_work(struct work_struct *work) { > struct intel_atomic_state *state = > container_of(work, struct intel_atomic_state, base.commit_work); > struct drm_i915_private *i915 = to_i915(state->base.dev); > + struct intel_crtc_state *old_crtc_state; > + struct intel_crtc *crtc; > + int i; > + > + for_each_old_intel_crtc_in_state(state, crtc, old_crtc_state, i) > + intel_color_cleanup_commit(old_crtc_state); > > - intel_cleanup_dsbs(state); > drm_atomic_helper_cleanup_planes(&i915->drm, &state->base); > drm_atomic_helper_commit_cleanup_done(&state->base); > drm_atomic_state_put(&state->base); > @@ -7590,6 +7583,8 @@ static void intel_atomic_commit_tail(struct > intel_atomic_state *state) > * DSB cleanup is done in cleanup_work aligning with framebuffer > * cleanup. So copy and reset the dsb structure to sync with > * commit_done and later do dsb cleanup in cleanup_work. > + * > + * FIXME get rid of this funny new->old swapping > */ > old_crtc_state->dsb = fetch_and_zero(&new_crtc_state->dsb); > } > @@ -7740,7 +7735,7 @@ static int intel_atomic_commit(struct drm_device *dev, > i915_sw_fence_commit(&state->commit_ready); > > for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) > - intel_dsb_cleanup(new_crtc_state); > + intel_color_cleanup_commit(new_crtc_state); > > drm_atomic_helper_cleanup_planes(dev, &state->base); > intel_runtime_pm_put(&dev_priv->runtime_pm, state->wakeref); > diff --git a/drivers/gpu/drm/i915/display/intel_display.h > b/drivers/gpu/drm/i915/display/intel_display.h > index 714030136b7f..ef73730f32b0 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.h > +++ b/drivers/gpu/drm/i915/display/intel_display.h > @@ -440,6 +440,14 @@ enum hpd_pin { > (__i)++) \ > for_each_if(plane) > > +#define for_each_old_intel_crtc_in_state(__state, crtc, old_crtc_state, __i) \ > + for ((__i) = 0; \ > + (__i) < (__state)->base.dev->mode_config.num_crtc && \ > + ((crtc) = to_intel_crtc((__state)->base.crtcs[__i].ptr), \ > + (old_crtc_state) = to_intel_crtc_state((__state)- > >base.crtcs[__i].old_state), 1); \ > + (__i)++) \ > + for_each_if(crtc) > + > #define for_each_new_intel_plane_in_state(__state, plane, new_plane_state, __i) \ > for ((__i) = 0; \ > (__i) < (__state)->base.dev->mode_config.num_total_plane && \ > -- > 2.37.4