Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
To: intel-xe@lists.freedesktop.org
Subject: [CI 12/13] late flush
Date: Tue, 19 Aug 2025 09:55:33 +0100	[thread overview]
Message-ID: <20250819085537.97902-13-tvrtko.ursulin@igalia.com> (raw)
In-Reply-To: <20250819085537.97902-1-tvrtko.ursulin@igalia.com>

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
---
 drivers/gpu/drm/i915/display/intel_display.c  | 15 ++++-
 drivers/gpu/drm/i915/gem/i915_gem_object.h    |  5 ++
 .../compat-i915-headers/gem/i915_gem_object.h |  2 +
 drivers/gpu/drm/xe/display/xe_fb_pin.c        | 55 +++++--------------
 drivers/gpu/drm/xe/xe_bo_types.h              |  4 +-
 5 files changed, 37 insertions(+), 44 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index c1a3a95c65f0..bdd487f5b3de 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -45,6 +45,7 @@
 #include <drm/drm_rect.h>
 #include <drm/drm_vblank.h>
 
+#include "gem/i915_gem_object.h"
 #include "g4x_dp.h"
 #include "g4x_hdmi.h"
 #include "hsw_ips.h"
@@ -7099,7 +7100,7 @@ static void intel_atomic_commit_fence_wait(struct intel_atomic_state *intel_stat
 	struct drm_plane *plane;
 	struct drm_plane_state *new_plane_state;
 	long ret;
-	int i;
+	int i, j;
 
 	for_each_new_plane_in_state(&intel_state->base, plane, new_plane_state, i) {
 		if (new_plane_state->fence) {
@@ -7112,6 +7113,18 @@ static void intel_atomic_commit_fence_wait(struct intel_atomic_state *intel_stat
 			new_plane_state->fence = NULL;
 		}
 	}
+
+	for_each_new_plane_in_state(&intel_state->base, plane, new_plane_state, i) {
+		if (!new_plane_state->fb)
+			continue;
+
+		for (j = 0; j < new_plane_state->fb->format->num_planes; j++) {
+			if (!new_plane_state->fb->obj[j])
+				continue;
+
+			intel_display_object_sync_flush(new_plane_state->fb->obj[j]);
+		}
+	}
 }
 
 static void intel_atomic_dsb_wait_commit(struct intel_crtc_state *crtc_state)
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index 565f8fa330db..c185234924ab 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -772,6 +772,11 @@ void i915_gem_object_flush_if_display(struct drm_i915_gem_object *obj);
 void i915_gem_object_flush_if_display_locked(struct drm_i915_gem_object *obj);
 bool i915_gem_cpu_write_needs_clflush(struct drm_i915_gem_object *obj);
 
+static inline void intel_display_object_sync_flush(struct drm_gem_object *obj)
+{
+
+}
+
 int __must_check
 i915_gem_object_set_to_wc_domain(struct drm_i915_gem_object *obj, bool write);
 int __must_check
diff --git a/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object.h b/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object.h
index 8a048980ea38..48b8e0612f3b 100644
--- a/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object.h
@@ -12,4 +12,6 @@ static inline void i915_gem_fence_wait_priority(struct dma_fence *fence,
 {
 }
 
+void intel_display_object_sync_flush(struct drm_gem_object *obj);
+
 #endif
diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index bf600cad0284..3a4d8cb10b33 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -371,44 +371,23 @@ static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
 	return ret;
 }
 
-static void xe_bo_clflush_auxccs(struct xe_bo *bo,
-				 const struct i915_gtt_view *view)
+void intel_display_object_sync_flush(struct drm_gem_object *obj)
 {
-	const struct intel_remapped_info *remap_info = &view->remapped;
-	unsigned int i;
+	struct xe_bo *bo = gem_to_xe_bo(obj);
+	int ret;
 
-	if (!IS_ENABLED(CONFIG_X86))
-		return;
+	ret = ttm_bo_reserve(&bo->ttm, false, false, NULL);
+	WARN_ON_ONCE(ret);
 
-	if (!static_cpu_has(X86_FEATURE_CLFLUSH))
-		return;
+	if (!bo->display_flush)
+		goto unlock;
 
-	for (i = 0; i < ARRAY_SIZE(remap_info->plane); i++) {
-		const struct intel_remapped_plane_info *plane =
-						&remap_info->plane[i];
-		const int size = boot_cpu_data.x86_clflush_size;
-		struct sg_table *st = xe_bo_sg(bo);
-		struct sg_page_iter sg_iter;
+	drm_clflush_sg(xe_bo_sg(bo));
 
-		if (!plane->width && !plane->height && !plane->linear)
-			continue;
+	bo->display_flush = false;
 
-		if (!plane->linear)
-			continue;
-
-		mb();
-		for_each_sgtable_page(st, &sg_iter, plane->offset) {
-			struct page *page = sg_page_iter_page(&sg_iter);
-			uint8_t *page_virtual;
-			unsigned int j;
-
-			page_virtual = kmap_local_page(page);
-			for (j = 0; j < PAGE_SIZE; j += size)
-				clflushopt(page_virtual + j);
-			kunmap_local(page_virtual);
-		}
-		mb();
-	}
+unlock:
+	ttm_bo_unreserve(&bo->ttm);
 }
 
 static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb,
@@ -420,7 +399,6 @@ static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb,
 	struct i915_vma *vma = kzalloc(sizeof(*vma), GFP_KERNEL);
 	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
 	struct xe_bo *bo = gem_to_xe_bo(obj);
-	bool first_pin;
 	int ret;
 
 	if (!vma)
@@ -452,9 +430,6 @@ static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb,
 	if (ret)
 		goto err;
 
-	first_pin = !bo->display_pin;
-	bo->display_pin = true;
-
 	if (IS_DGFX(xe))
 		ret = xe_bo_migrate(bo, XE_PL_VRAM0);
 	else
@@ -476,11 +451,9 @@ static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb,
 	/*
 	 * Force flush AuxCCS data for non-coherent display access.
 	 */
-	if (first_pin &&
-	    !xe_bo_is_vram(bo) && !xe_bo_is_stolen(bo) &&
-	    intel_fb_is_ccs_modifier(fb->base.modifier) &&
-	    view->type == I915_GTT_VIEW_REMAPPED)
-		xe_bo_clflush_auxccs(bo, view);
+	bo->display_flush = !xe_bo_is_vram(bo) && !xe_bo_is_stolen(bo) &&
+			    intel_fb_is_ccs_modifier(fb->base.modifier) &&
+			    view->type == I915_GTT_VIEW_REMAPPED;
 
 	return vma;
 
diff --git a/drivers/gpu/drm/xe/xe_bo_types.h b/drivers/gpu/drm/xe/xe_bo_types.h
index d5096f7f6f9a..150a54be0b2e 100644
--- a/drivers/gpu/drm/xe/xe_bo_types.h
+++ b/drivers/gpu/drm/xe/xe_bo_types.h
@@ -91,8 +91,8 @@ struct xe_bo {
 	/** @ccs_cleared */
 	bool ccs_cleared : 1;
 
-	/** @display_pin: Was it ever pinned to display */
-	bool display_pin : 1;
+	/** @display_flush: Is clflush required before first scanout */
+	bool display_flush : 1;
 
 	/** @vram_userfault_link: Link into @mem_access.vram_userfault.list */
 		struct list_head vram_userfault_link;
-- 
2.48.0


  parent reply	other threads:[~2025-08-19  8:55 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-19  8:55 [CI 00/13] auxccs late flush Tvrtko Ursulin
2025-08-19  8:55 ` [CI 01/13] drm/xe/xelpg: Flush CCS when flushing caches Tvrtko Ursulin
2025-08-19  8:55 ` [CI 02/13] drm/xe/xelp: Quiesce memory traffic before invalidating auxccs Tvrtko Ursulin
2025-08-19  8:55 ` [CI 03/13] drm/xe/xelp: Support auxccs invalidation on blitter Tvrtko Ursulin
2025-08-19  8:55 ` [CI 04/13] drm/xe/xelp: Use MI_FLUSH_DW_CCS on auxccs platforms Tvrtko Ursulin
2025-08-19  8:55 ` [CI 05/13] drm/xe/xelp: Wait for AuxCCS invalidation to complete Tvrtko Ursulin
2025-08-19  8:55 ` [CI 06/13] drm/xe: Export xe_emit_aux_table_inv Tvrtko Ursulin
2025-08-19  8:55 ` [CI 07/13] drm/xe/xelp: Add AuxCCS invalidation to the indirect context workarounds Tvrtko Ursulin
2025-08-19  8:55 ` [CI 08/13] drm/xe: Flush GGTT writes after populating DPT Tvrtko Ursulin
2025-08-19  8:55 ` [CI 09/13] drm/xe: Handle DPT in system memory Tvrtko Ursulin
2025-08-19  8:55 ` [CI 10/13] drm/xe/display: Add support for AuxCCS Tvrtko Ursulin
2025-08-19  8:55 ` [CI 11/13] drm/xe: Force flush system memory AuxCCS data before scan out Tvrtko Ursulin
2025-08-19  8:55 ` Tvrtko Ursulin [this message]
2025-08-19  8:55 ` [CI 13/13] drm/i915/display: Expose AuxCCS frame buffer modifiers for Xe Tvrtko Ursulin
2025-08-19 14:16 ` ✗ CI.checkpatch: warning for auxccs late flush Patchwork
2025-08-19 14:17 ` ✓ CI.KUnit: success " Patchwork
  -- strict thread matches above, loose matches on Subject: below --
2025-08-19 14:38 [CI 00/13] " Tvrtko Ursulin
2025-08-19 14:38 ` [CI 12/13] " Tvrtko Ursulin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250819085537.97902-13-tvrtko.ursulin@igalia.com \
    --to=tvrtko.ursulin@igalia.com \
    --cc=intel-xe@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox