From: Ville Syrjälä <ville.syrj...@linux.intel.com>

Once we start using DSB for plane updates we'll need to defer
generating the DSB buffer until the clear color has been
read out. So we need to move at some of the DSB stuff into
commit_tail(). That is perhaps a better place for it anyway
as the ioctl thread can move on immediately without spending
time building the DSB commands.

We always have the MMIO fallback (in case the DSB buffer
allocation fails), so there's no real reason to keep any
of this in the synchronous part of the ioctl.

Because the DSB LUT programming doesn't depend on the plane
clear color we can still do that part before waiting for
fences/etc. which should help paralleize things a bit more.
The DSB plane programming will need to happen after those
however as that depends on the clear color.

Reviewed-by: Animesh Manna <animesh.ma...@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c | 23 +++++++++-----------
 1 file changed, 10 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 283e0214c4a3..40a4957d805d 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -6770,17 +6770,12 @@ int intel_atomic_check(struct drm_device *dev,
 
 static int intel_atomic_prepare_commit(struct intel_atomic_state *state)
 {
-       struct intel_crtc_state __maybe_unused *crtc_state;
-       struct intel_crtc *crtc;
-       int i, ret;
+       int ret;
 
        ret = drm_atomic_helper_prepare_planes(state->base.dev, &state->base);
        if (ret < 0)
                return ret;
 
-       for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i)
-               intel_color_prepare_commit(state, crtc);
-
        return 0;
 }
 
@@ -7371,6 +7366,12 @@ static void 
intel_atomic_prepare_plane_clear_colors(struct intel_atomic_state *s
        }
 }
 
+static void intel_atomic_dsb_prepare(struct intel_atomic_state *state,
+                                    struct intel_crtc *crtc)
+{
+       intel_color_prepare_commit(state, crtc);
+}
+
 static void intel_atomic_commit_tail(struct intel_atomic_state *state)
 {
        struct drm_device *dev = state->base.dev;
@@ -7381,6 +7382,9 @@ static void intel_atomic_commit_tail(struct 
intel_atomic_state *state)
        intel_wakeref_t wakeref = 0;
        int i;
 
+       for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i)
+               intel_atomic_dsb_prepare(state, crtc);
+
        intel_atomic_commit_fence_wait(state);
 
        intel_td_flush(dev_priv);
@@ -7692,13 +7696,6 @@ int intel_atomic_commit(struct drm_device *dev, struct 
drm_atomic_state *_state,
                ret = intel_atomic_swap_state(state);
 
        if (ret) {
-               struct intel_crtc_state *new_crtc_state;
-               struct intel_crtc *crtc;
-               int i;
-
-               for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i)
-                       intel_color_cleanup_commit(new_crtc_state);
-
                drm_atomic_helper_unprepare_planes(dev, &state->base);
                intel_runtime_pm_put(&dev_priv->runtime_pm, state->wakeref);
                return ret;
-- 
2.45.2

Reply via email to