]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/i915/dsb: Introduce intel_dsb_finish()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 18 Jan 2023 16:30:31 +0000 (18:30 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 3 Feb 2023 12:04:01 +0000 (14:04 +0200)
Introduce a function to emits whatever commands we need
at the end of the DSB command buffer. For the moment we
only do the tail cacheline alignment there, but eventually
we might want to eg. emit an interrupt.

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

index c5bf8019a0dce6636c2ac448917eff4ec42b0e7e..bd3434af1764f07784afda709ac7289536fe64d3 100644 (file)
@@ -1257,6 +1257,7 @@ static void icl_load_luts(const struct intel_crtc_state *crtc_state)
        }
 
        if (crtc_state->dsb) {
+               intel_dsb_finish(crtc_state->dsb);
                intel_dsb_commit(crtc_state->dsb);
                intel_dsb_wait(crtc_state->dsb);
        }
index 0b2faa33f2042bee52229fc8c760ed5c4d665a9d..9e25b1345927620e5da614b074c74d01c26c44e3 100644 (file)
@@ -199,7 +199,7 @@ void intel_dsb_reg_write(struct intel_dsb *dsb,
        }
 }
 
-static u32 intel_dsb_align_tail(struct intel_dsb *dsb)
+static void intel_dsb_align_tail(struct intel_dsb *dsb)
 {
        u32 aligned_tail, tail;
 
@@ -211,8 +211,11 @@ static u32 intel_dsb_align_tail(struct intel_dsb *dsb)
                       aligned_tail - tail);
 
        dsb->free_pos = aligned_tail / 4;
+}
 
-       return aligned_tail;
+void intel_dsb_finish(struct intel_dsb *dsb)
+{
+       intel_dsb_align_tail(dsb);
 }
 
 /**
@@ -228,8 +231,8 @@ void intel_dsb_commit(struct intel_dsb *dsb)
        enum pipe pipe = crtc->pipe;
        u32 tail;
 
-       tail = intel_dsb_align_tail(dsb);
-       if (tail == 0)
+       tail = dsb->free_pos * 4;
+       if (drm_WARN_ON(&dev_priv->drm, !IS_ALIGNED(tail, CACHELINE_BYTES)))
                return;
 
        if (is_dsb_busy(dev_priv, pipe, dsb->id)) {
index 7999199c2464424addd6352b1ca558d8476a6450..6b22499e8a5d84e3c11c8a3f1dbb41a03f16b1f8 100644 (file)
@@ -15,6 +15,7 @@ struct intel_dsb;
 
 struct intel_dsb *intel_dsb_prepare(struct intel_crtc *crtc,
                                    unsigned int max_cmds);
+void intel_dsb_finish(struct intel_dsb *dsb);
 void intel_dsb_cleanup(struct intel_dsb *dsb);
 void intel_dsb_reg_write(struct intel_dsb *dsb,
                         i915_reg_t reg, u32 val);