]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/i915/display: perform transient flush
authorMatthew Auld <matthew.auld@intel.com>
Tue, 30 Apr 2024 17:28:49 +0000 (10:28 -0700)
committerRadhakrishna Sripada <radhakrishna.sripada@intel.com>
Fri, 3 May 2024 20:15:54 +0000 (13:15 -0700)
Perform manual transient cache flush prior to flip and at the end of
frontbuffer_flush. This is needed to ensure display engine doesn't see
garbage if the surface is L3:XD dirty.

Testcase: igt@xe-pat@display-vs-wb-transient
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Signed-off-by: Balasubramani Vivekanandan <balasubramani.vivekanandan@intel.com>
Acked-by: Nirmoy Das <nirmoy.das@intel.com>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Radhakrishna Sripada <radhakrishna.sripada@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240430172850.1881525-19-radhakrishna.sripada@intel.com
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_frontbuffer.c
drivers/gpu/drm/i915/display/intel_tdf.h [new file with mode: 0644]
drivers/gpu/drm/xe/Makefile
drivers/gpu/drm/xe/display/xe_tdf.c [new file with mode: 0644]

index c62ef56ca0dca16ab080ca3c89e96e213ab4b358..ef986b50843179b2521a6bc53061dbb0c4c0fc64 100644 (file)
 #include "intel_sdvo.h"
 #include "intel_snps_phy.h"
 #include "intel_tc.h"
+#include "intel_tdf.h"
 #include "intel_tv.h"
 #include "intel_vblank.h"
 #include "intel_vdsc.h"
@@ -7233,6 +7234,8 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
 
        intel_atomic_commit_fence_wait(state);
 
+       intel_td_flush(dev_priv);
+
        drm_atomic_helper_wait_for_dependencies(&state->base);
        drm_dp_mst_atomic_wait_for_dependencies(&state->base);
        intel_atomic_global_state_wait_for_dependencies(state);
index 2ea37c0414a9585418d09a6c84b90c3bcb5f5ffc..4923c340a0b6481b86ff9052c4217abaf569f29b 100644 (file)
@@ -65,6 +65,7 @@
 #include "intel_fbc.h"
 #include "intel_frontbuffer.h"
 #include "intel_psr.h"
+#include "intel_tdf.h"
 
 /**
  * frontbuffer_flush - flush frontbuffer
@@ -93,6 +94,7 @@ static void frontbuffer_flush(struct drm_i915_private *i915,
        trace_intel_frontbuffer_flush(i915, frontbuffer_bits, origin);
 
        might_sleep();
+       intel_td_flush(i915);
        intel_drrs_flush(i915, frontbuffer_bits);
        intel_psr_flush(i915, frontbuffer_bits, origin);
        intel_fbc_flush(i915, frontbuffer_bits, origin);
diff --git a/drivers/gpu/drm/i915/display/intel_tdf.h b/drivers/gpu/drm/i915/display/intel_tdf.h
new file mode 100644 (file)
index 0000000..353cde2
--- /dev/null
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#ifndef __INTEL_TDF_H__
+#define __INTEL_TDF_H__
+
+/*
+ * TDF (Transient-Data-Flush) is needed for Xe2+ where special L3:XD caching can
+ * be enabled through various PAT index modes. Idea is to use this caching mode
+ * when for example rendering onto the display surface, with the promise that
+ * KMD will ensure transient cache entries are always flushed by the time we do
+ * the display flip, since display engine is never coherent with CPU/GPU caches.
+ */
+
+struct drm_i915_private;
+
+#ifdef I915
+static inline void intel_td_flush(struct drm_i915_private *i915) {}
+#else
+void intel_td_flush(struct drm_i915_private *i915);
+#endif
+
+#endif
index 8321ec4f9b4621f705333c92dfd895b617751a86..ae579b6c87633751cc8b0388d6730ea342669a13 100644 (file)
@@ -204,7 +204,8 @@ xe-$(CONFIG_DRM_XE_DISPLAY) += \
        display/xe_dsb_buffer.o \
        display/xe_fb_pin.o \
        display/xe_hdcp_gsc.o \
-       display/xe_plane_initial.o
+       display/xe_plane_initial.o \
+       display/xe_tdf.o
 
 # SOC code shared with i915
 xe-$(CONFIG_DRM_XE_DISPLAY) += \
diff --git a/drivers/gpu/drm/xe/display/xe_tdf.c b/drivers/gpu/drm/xe/display/xe_tdf.c
new file mode 100644 (file)
index 0000000..2c0d4e1
--- /dev/null
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#include "xe_device.h"
+#include "intel_display_types.h"
+#include "intel_tdf.h"
+
+void intel_td_flush(struct drm_i915_private *i915)
+{
+       xe_device_td_flush(i915);
+}