[Intel-gfx] [PATCH 08/13] drm/i915: Move the DSB setup/cleaup into the color code
Shankar, Uma
uma.shankar at intel.com
Wed Dec 7 09:29:23 UTC 2022
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of Ville Syrjala
> Sent: Wednesday, November 23, 2022 8:57 PM
> To: intel-gfx at lists.freedesktop.org
> Subject: [Intel-gfx] [PATCH 08/13] drm/i915: Move the DSB setup/cleaup into the
> color code
>
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> 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 at intel.com>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> 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
More information about the Intel-gfx
mailing list