]> www.infradead.org Git - users/willy/xarray.git/commitdiff
drm/i915/dsb: Use chained DSBs for LUT programming
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Mon, 24 Jun 2024 19:10:32 +0000 (22:10 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 29 Aug 2024 11:54:03 +0000 (14:54 +0300)
In order to better handle the necessary DSB DEwake tricks let's
switch over to using a chained DSB for the actual LUT programming.
The CPU will start 'dsb_color_commit', which in turn will start the
chained 'dsb_color_vblank'.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240624191032.27333-15-ville.syrjala@linux.intel.com
Reviewed-by: Animesh Manna <animesh.manna@intel.com>
drivers/gpu/drm/i915/display/intel_atomic.c
drivers/gpu/drm/i915/display/intel_color.c
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_display_types.h

index 55ce71be41ec58b159f3404999d08b4306044bc9..12d6ed940751427f94b3c9a504fc308d85fabfb6 100644 (file)
@@ -277,6 +277,7 @@ intel_crtc_duplicate_state(struct drm_crtc *crtc)
        crtc_state->fb_bits = 0;
        crtc_state->update_planes = 0;
        crtc_state->dsb_color_vblank = NULL;
+       crtc_state->dsb_color_commit = NULL;
 
        return &crtc_state->uapi;
 }
@@ -311,6 +312,7 @@ intel_crtc_destroy_state(struct drm_crtc *crtc,
        struct intel_crtc_state *crtc_state = to_intel_crtc_state(state);
 
        drm_WARN_ON(crtc->dev, crtc_state->dsb_color_vblank);
+       drm_WARN_ON(crtc->dev, crtc_state->dsb_color_commit);
 
        __drm_atomic_helper_crtc_destroy_state(&crtc_state->uapi);
        intel_crtc_free_hw_state(crtc_state);
index 27acbf92d60f62a28a90d727e3ec719bc41c3e5c..5d701f48351b963df9ccfde505704c5fa3369360 100644 (file)
@@ -1890,8 +1890,8 @@ void intel_color_commit_arm(const struct intel_crtc_state *crtc_state)
 
        i915->display.funcs.color->color_commit_arm(crtc_state);
 
-       if (crtc_state->dsb_color_vblank)
-               intel_dsb_commit(crtc_state->dsb_color_vblank, true);
+       if (crtc_state->dsb_color_commit)
+               intel_dsb_commit(crtc_state->dsb_color_commit, false);
 }
 
 void intel_color_post_update(const struct intel_crtc_state *crtc_state)
@@ -1919,26 +1919,44 @@ void intel_color_prepare_commit(struct intel_atomic_state *state,
        if (!crtc_state->pre_csc_lut && !crtc_state->post_csc_lut)
                return;
 
-       crtc_state->dsb_color_vblank = intel_dsb_prepare(state, crtc, INTEL_DSB_0, 1024);
+       crtc_state->dsb_color_vblank = intel_dsb_prepare(state, crtc, INTEL_DSB_1, 1024);
        if (!crtc_state->dsb_color_vblank)
                return;
 
        i915->display.funcs.color->load_luts(crtc_state);
 
        intel_dsb_finish(crtc_state->dsb_color_vblank);
+
+       crtc_state->dsb_color_commit = intel_dsb_prepare(state, crtc, INTEL_DSB_0, 16);
+       if (!crtc_state->dsb_color_commit) {
+               intel_dsb_cleanup(crtc_state->dsb_color_vblank);
+               crtc_state->dsb_color_vblank = NULL;
+               return;
+       }
+
+       intel_dsb_chain(state, crtc_state->dsb_color_commit,
+                       crtc_state->dsb_color_vblank, true);
+
+       intel_dsb_finish(crtc_state->dsb_color_commit);
 }
 
 void intel_color_cleanup_commit(struct intel_crtc_state *crtc_state)
 {
-       if (!crtc_state->dsb_color_vblank)
-               return;
+       if (crtc_state->dsb_color_commit) {
+               intel_dsb_cleanup(crtc_state->dsb_color_commit);
+               crtc_state->dsb_color_commit = NULL;
+       }
 
-       intel_dsb_cleanup(crtc_state->dsb_color_vblank);
-       crtc_state->dsb_color_vblank = NULL;
+       if (crtc_state->dsb_color_vblank) {
+               intel_dsb_cleanup(crtc_state->dsb_color_vblank);
+               crtc_state->dsb_color_vblank = NULL;
+       }
 }
 
 void intel_color_wait_commit(const struct intel_crtc_state *crtc_state)
 {
+       if (crtc_state->dsb_color_commit)
+               intel_dsb_wait(crtc_state->dsb_color_commit);
        if (crtc_state->dsb_color_vblank)
                intel_dsb_wait(crtc_state->dsb_color_vblank);
 }
index 10a82596472a6522fad687b13a92de062bf82c46..78ce402a5cd0be78b005a39c0e28660521c51f2a 100644 (file)
@@ -7514,6 +7514,7 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
                 * FIXME get rid of this funny new->old swapping
                 */
                old_crtc_state->dsb_color_vblank = fetch_and_zero(&new_crtc_state->dsb_color_vblank);
+               old_crtc_state->dsb_color_commit = fetch_and_zero(&new_crtc_state->dsb_color_commit);
        }
 
        /* Underruns don't always raise interrupts, so check manually */
index 8ae9d06915e604fc3d1e9cbbde1c23030808ca2c..868ff8976ed93cd8292dac624977d7c39a1eafdf 100644 (file)
@@ -1397,7 +1397,7 @@ struct intel_crtc_state {
        enum transcoder mst_master_transcoder;
 
        /* For DSB based color LUT updates */
-       struct intel_dsb *dsb_color_vblank;
+       struct intel_dsb *dsb_color_vblank, *dsb_color_commit;
 
        u32 psr2_man_track_ctl;