public inbox for intel-xe@lists.freedesktop.org
 help / color / mirror / Atom feed
* [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface
@ 2026-04-23 16:53 Ville Syrjala
  2026-04-23 16:53 ` [PATCH 01/16] drm/i915: Introduce intel_parent_fb_pin_get_map() Ville Syrjala
                   ` (17 more replies)
  0 siblings, 18 replies; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Abstract the fb pin/unpin stuff under a new 'fb_pin' parent
interface. The interface is fairly low level so that the i915/xe
side doesn't need access to any display specific data structures.

There are perhaps some needless extra layers on the i915/xe side
afterwards, but we can clean those out later. There are also some
rough corners left in the initial fb code, but I'll be following
up with a separate series to fix/clean up that whole thing.

Ville Syrjälä (16):
  drm/i915: Introduce intel_parent_fb_pin_get_map()
  drm/i915: Move intel_fb_pin_params to the parent interface
  drm/i915: Move the i915_dpt_offset()==0 assert
  drm/i915: Reorganize intel_plane_pin_fb() a bit
  drm/i915: Introduce i915_fb_pin_dpt_(un)pin()
  drm/i915: Introduce i915_fb_pin_ggtt_(un)pin()
  drm/xe: Move the FORCE_WC assert into __xe_pin_fb_vma()
  drm/xe: Kill the fbdev vma reuse hack
  drm/xe: Reorganize intel_plane_pin_fb() a bit
  drm/xe: Introduce xe_fb_pin_dpt_(un)pin()
  drm/xe: Introduce xe_fb_pin_ggtt_(un)pin()
  drm/xe: Restructure reuse_vma()
  drm/i915: Introduce the main fb_pin parent interface
  drm/i915/fbdev: Use intel_parent_fb_pin_ggtt_(un)pin()
  drm/xe: Use xe_fb_pin_ggtt_pin() for the initial FB pin
  drm/i915: Consolidate the intel_plane_(un)pin_fb() implementations

 drivers/gpu/drm/i915/display/intel_cursor.c   |   1 -
 drivers/gpu/drm/i915/display/intel_fb_pin.h   |  40 ----
 drivers/gpu/drm/i915/display/intel_fbdev.c    |  22 +-
 drivers/gpu/drm/i915/display/intel_fbdev.h    |   4 +-
 drivers/gpu/drm/i915/display/intel_parent.c   |  60 +++++
 drivers/gpu/drm/i915/display/intel_parent.h   |  34 +++
 drivers/gpu/drm/i915/display/intel_plane.c    | 122 ++++++++++-
 drivers/gpu/drm/i915/display/intel_plane.h    |   3 +
 drivers/gpu/drm/i915/i915_driver.c            |   2 +
 drivers/gpu/drm/i915/i915_fb_pin.c            | 205 +++++++-----------
 drivers/gpu/drm/i915/i915_fb_pin.h            |   9 +
 drivers/gpu/drm/xe/display/xe_display.c       |   2 +
 drivers/gpu/drm/xe/display/xe_fb_pin.c        | 145 +++++++------
 drivers/gpu/drm/xe/display/xe_fb_pin.h        |  21 ++
 drivers/gpu/drm/xe/display/xe_initial_plane.c |  18 +-
 include/drm/intel/display_parent_interface.h  |  42 ++++
 16 files changed, 472 insertions(+), 258 deletions(-)
 delete mode 100644 drivers/gpu/drm/i915/display/intel_fb_pin.h
 create mode 100644 drivers/gpu/drm/i915/i915_fb_pin.h
 create mode 100644 drivers/gpu/drm/xe/display/xe_fb_pin.h

-- 
2.52.0


^ permalink raw reply	[flat|nested] 36+ messages in thread

* [PATCH 01/16] drm/i915: Introduce intel_parent_fb_pin_get_map()
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24  9:14   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 02/16] drm/i915: Move intel_fb_pin_params to the parent interface Ville Syrjala
                   ` (16 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Introduce the "fb_pin" parent interface, as the first trivial step
move the *_get_map() stuff there.

The whole "fb_pin" as an interface might not really make sense,
and perhaps this (and other stuff) should just be collected into
some kind of "bo" interface. But let's go with "fb_pin" for now
to match where things are implemented, and possibly restructure
it later.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_fb_pin.h  | 1 -
 drivers/gpu/drm/i915/display/intel_fbdev.c   | 7 +++++--
 drivers/gpu/drm/i915/display/intel_fbdev.h   | 4 ++--
 drivers/gpu/drm/i915/display/intel_parent.c  | 7 +++++++
 drivers/gpu/drm/i915/display/intel_parent.h  | 5 +++++
 drivers/gpu/drm/i915/display/intel_plane.c   | 4 ++--
 drivers/gpu/drm/i915/i915_driver.c           | 2 ++
 drivers/gpu/drm/i915/i915_fb_pin.c           | 8 +++++++-
 drivers/gpu/drm/i915/i915_fb_pin.h           | 9 +++++++++
 drivers/gpu/drm/xe/display/xe_display.c      | 2 ++
 drivers/gpu/drm/xe/display/xe_fb_pin.c       | 8 +++++++-
 drivers/gpu/drm/xe/display/xe_fb_pin.h       | 9 +++++++++
 include/drm/intel/display_parent_interface.h | 8 ++++++++
 13 files changed, 65 insertions(+), 9 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/i915_fb_pin.h
 create mode 100644 drivers/gpu/drm/xe/display/xe_fb_pin.h

diff --git a/drivers/gpu/drm/i915/display/intel_fb_pin.h b/drivers/gpu/drm/i915/display/intel_fb_pin.h
index 5825503c38ea..805e23067004 100644
--- a/drivers/gpu/drm/i915/display/intel_fb_pin.h
+++ b/drivers/gpu/drm/i915/display/intel_fb_pin.h
@@ -35,6 +35,5 @@ void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id);
 int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 		       const struct intel_plane_state *old_plane_state);
 void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state);
-void intel_fb_get_map(struct i915_vma *vma, struct iosys_map *map);
 
 #endif
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
index 9ab0ac49abb7..ce4082da30e8 100644
--- a/drivers/gpu/drm/i915/display/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
@@ -55,6 +55,7 @@
 #include "intel_fb_pin.h"
 #include "intel_fbdev.h"
 #include "intel_frontbuffer.h"
+#include "intel_parent.h"
 #include "intel_plane.h"
 
 struct intel_fbdev {
@@ -563,7 +564,9 @@ struct i915_vma *intel_fbdev_vma_pointer(struct intel_fbdev *fbdev)
 	return fbdev ? fbdev->vma : NULL;
 }
 
-void intel_fbdev_get_map(struct intel_fbdev *fbdev, struct iosys_map *map)
+void intel_fbdev_get_map(struct intel_display *display, struct iosys_map *map)
 {
-	intel_fb_get_map(fbdev->vma, map);
+	struct intel_fbdev *fbdev = display->fbdev.fbdev;
+
+	intel_parent_fb_pin_get_map(display, fbdev->vma, map);
 }
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.h b/drivers/gpu/drm/i915/display/intel_fbdev.h
index 150cc5f45bb3..edaf5d16a456 100644
--- a/drivers/gpu/drm/i915/display/intel_fbdev.h
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.h
@@ -23,7 +23,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
 void intel_fbdev_setup(struct intel_display *display);
 struct intel_framebuffer *intel_fbdev_framebuffer(struct intel_fbdev *fbdev);
 struct i915_vma *intel_fbdev_vma_pointer(struct intel_fbdev *fbdev);
-void intel_fbdev_get_map(struct intel_fbdev *fbdev, struct iosys_map *map);
+void intel_fbdev_get_map(struct intel_display *display, struct iosys_map *map);
 #else
 #define INTEL_FBDEV_DRIVER_OPS \
 	.fbdev_probe = NULL
@@ -40,7 +40,7 @@ static inline struct i915_vma *intel_fbdev_vma_pointer(struct intel_fbdev *fbdev
 	return NULL;
 }
 
-static inline void intel_fbdev_get_map(struct intel_fbdev *fbdev, struct iosys_map *map)
+static inline void intel_fbdev_get_map(struct intel_display *display, struct iosys_map *map)
 {
 }
 #endif
diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c
index 67b21a42d354..070cc60f49b3 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.c
+++ b/drivers/gpu/drm/i915/display/intel_parent.c
@@ -52,6 +52,13 @@ void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dp
 		display->parent->dpt->resume(dpt);
 }
 
+/* fb_pin */
+void intel_parent_fb_pin_get_map(struct intel_display *display,
+				 struct i915_vma *vma, struct iosys_map *map)
+{
+	return display->parent->fb_pin->get_map(vma, map);
+}
+
 /* frontbuffer */
 struct intel_frontbuffer *intel_parent_frontbuffer_get(struct intel_display *display, struct drm_gem_object *obj)
 {
diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h
index 5f0c835b9416..2b9e829e7f47 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.h
+++ b/drivers/gpu/drm/i915/display/intel_parent.h
@@ -18,6 +18,7 @@ struct intel_frontbuffer;
 struct intel_hdcp_gsc_context;
 struct intel_panic;
 struct intel_stolen_node;
+struct iosys_map;
 
 /* dpt */
 struct intel_dpt *intel_parent_dpt_create(struct intel_display *display,
@@ -26,6 +27,10 @@ void intel_parent_dpt_destroy(struct intel_display *display, struct intel_dpt *d
 void intel_parent_dpt_suspend(struct intel_display *display, struct intel_dpt *dpt);
 void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dpt);
 
+/* fb_pin */
+void intel_parent_fb_pin_get_map(struct intel_display *display,
+				 struct i915_vma *vma, struct iosys_map *map);
+
 /* frontbuffer */
 struct intel_frontbuffer *intel_parent_frontbuffer_get(struct intel_display *display, struct drm_gem_object *obj);
 void intel_parent_frontbuffer_ref(struct intel_display *display, struct intel_frontbuffer *front);
diff --git a/drivers/gpu/drm/i915/display/intel_plane.c b/drivers/gpu/drm/i915/display/intel_plane.c
index c2b58d3b9c23..e50e1a15410a 100644
--- a/drivers/gpu/drm/i915/display/intel_plane.c
+++ b/drivers/gpu/drm/i915/display/intel_plane.c
@@ -1404,7 +1404,7 @@ static void intel_panic_flush(struct drm_plane *_plane)
 	if (fb == intel_fbdev_framebuffer(display->fbdev.fbdev)) {
 		struct iosys_map map;
 
-		intel_fbdev_get_map(display->fbdev.fbdev, &map);
+		intel_fbdev_get_map(display, &map);
 		drm_clflush_virt_range(map.vaddr, fb->base.pitches[0] * fb->base.height);
 		return;
 	}
@@ -1462,7 +1462,7 @@ static int intel_get_scanout_buffer(struct drm_plane *plane,
 		return -ENODEV;
 
 	if (fb == intel_fbdev_framebuffer(display->fbdev.fbdev)) {
-		intel_fbdev_get_map(display->fbdev.fbdev, &sb->map[0]);
+		intel_fbdev_get_map(display, &sb->map[0]);
 	} else {
 		int ret;
 		/* Can't disable tiling if DPT is in use */
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index d31819758f3d..c23436be5973 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -99,6 +99,7 @@
 #include "i915_drv.h"
 #include "i915_dsb_buffer.h"
 #include "i915_edram.h"
+#include "i915_fb_pin.h"
 #include "i915_file_private.h"
 #include "i915_getparam.h"
 #include "i915_gmch.h"
@@ -769,6 +770,7 @@ static const struct intel_display_parent_interface parent = {
 	.bo = &i915_display_bo_interface,
 	.dpt = &i915_display_dpt_interface,
 	.dsb = &i915_display_dsb_interface,
+	.fb_pin = &i915_display_fb_pin_interface,
 	.frontbuffer = &i915_display_frontbuffer_interface,
 	.hdcp = &i915_display_hdcp_interface,
 	.initial_plane = &i915_display_initial_plane_interface,
diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
index b0e121462ca3..b800b55530a5 100644
--- a/drivers/gpu/drm/i915/i915_fb_pin.c
+++ b/drivers/gpu/drm/i915/i915_fb_pin.c
@@ -8,6 +8,7 @@
  */
 
 #include <drm/drm_print.h>
+#include <drm/intel/display_parent_interface.h>
 
 #include "display/intel_display_core.h"
 #include "display/intel_display_types.h"
@@ -18,6 +19,7 @@
 #include "gem/i915_gem_domain.h"
 #include "gem/i915_gem_object.h"
 
+#include "i915_fb_pin.h"
 #include "i915_dpt.h"
 #include "i915_drv.h"
 #include "i915_vma.h"
@@ -352,7 +354,11 @@ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
 	}
 }
 
-void intel_fb_get_map(struct i915_vma *vma, struct iosys_map *map)
+static void i915_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
 {
 	iosys_map_set_vaddr_iomem(map, i915_vma_get_iomap(vma));
 }
+
+const struct intel_display_fb_pin_interface i915_display_fb_pin_interface = {
+	.get_map = i915_fb_pin_get_map,
+};
diff --git a/drivers/gpu/drm/i915/i915_fb_pin.h b/drivers/gpu/drm/i915/i915_fb_pin.h
new file mode 100644
index 000000000000..18c6c0b61ab8
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_fb_pin.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: MIT */
+/* Copyright © 2026 Intel Corporation */
+
+#ifndef __I915_FB_PIN_H__
+#define __I915_FB_PIN_H__
+
+extern const struct intel_display_fb_pin_interface i915_display_fb_pin_interface;
+
+#endif /* __I915_FB_PIN_H__ */
diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 0747044f7c2a..aa73023b7398 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -40,6 +40,7 @@
 #include "xe_display_pcode.h"
 #include "xe_display_rpm.h"
 #include "xe_dsb_buffer.h"
+#include "xe_fb_pin.h"
 #include "xe_frontbuffer.h"
 #include "xe_hdcp_gsc.h"
 #include "xe_initial_plane.h"
@@ -553,6 +554,7 @@ static bool has_auxccs(struct drm_device *drm)
 static const struct intel_display_parent_interface parent = {
 	.bo = &xe_display_bo_interface,
 	.dsb = &xe_display_dsb_interface,
+	.fb_pin = &xe_display_fb_pin_interface,
 	.frontbuffer = &xe_display_frontbuffer_interface,
 	.hdcp = &xe_display_hdcp_interface,
 	.initial_plane = &xe_display_initial_plane_interface,
diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index 948446346c53..afb6cdda537e 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -3,6 +3,7 @@
  * Copyright © 2021 Intel Corporation
  */
 
+#include <drm/intel/display_parent_interface.h>
 #include <drm/ttm/ttm_bo.h>
 
 #include "intel_display_core.h"
@@ -13,6 +14,7 @@
 #include "xe_bo.h"
 #include "xe_device.h"
 #include "xe_display_vma.h"
+#include "xe_fb_pin.h"
 #include "xe_ggtt.h"
 #include "xe_pat.h"
 #include "xe_pm.h"
@@ -498,7 +500,11 @@ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
 	old_plane_state->ggtt_vma = NULL;
 }
 
-void intel_fb_get_map(struct i915_vma *vma, struct iosys_map *map)
+static void xe_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
 {
 	*map = vma->bo->vmap;
 }
+
+const struct intel_display_fb_pin_interface xe_display_fb_pin_interface = {
+	.get_map = xe_fb_pin_get_map,
+};
diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.h b/drivers/gpu/drm/xe/display/xe_fb_pin.h
new file mode 100644
index 000000000000..8a42d4009f5d
--- /dev/null
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: MIT */
+/* Copyright © 2026 Intel Corporation */
+
+#ifndef __XE_FB_PIN_H__
+#define __XE_FB_PIN_H__
+
+extern const struct intel_display_fb_pin_interface xe_display_fb_pin_interface;
+
+#endif /* __XE_FB_PIN_H__ */
diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
index 270dc028bec2..ee2e9572bfca 100644
--- a/include/drm/intel/display_parent_interface.h
+++ b/include/drm/intel/display_parent_interface.h
@@ -24,6 +24,7 @@ struct intel_hdcp_gsc_context;
 struct intel_initial_plane_config;
 struct intel_panic;
 struct intel_stolen_node;
+struct iosys_map;
 struct ref_tracker;
 struct seq_file;
 struct vm_area_struct;
@@ -69,6 +70,10 @@ struct intel_display_dsb_interface {
 	void (*flush_map)(struct intel_dsb_buffer *dsb_buf);
 };
 
+struct intel_display_fb_pin_interface {
+	void (*get_map)(struct i915_vma *vma, struct iosys_map *map);
+};
+
 struct intel_display_frontbuffer_interface {
 	struct intel_frontbuffer *(*get)(struct drm_gem_object *obj);
 	void (*ref)(struct intel_frontbuffer *front);
@@ -211,6 +216,9 @@ struct intel_display_parent_interface {
 	/** @dsb: DSB buffer interface */
 	const struct intel_display_dsb_interface *dsb;
 
+	/** @fb_pin: Framebuffer pin interface */
+	const struct intel_display_fb_pin_interface *fb_pin;
+
 	/** @frontbuffer: Frontbuffer interface */
 	const struct intel_display_frontbuffer_interface *frontbuffer;
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 02/16] drm/i915: Move intel_fb_pin_params to the parent interface
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
  2026-04-23 16:53 ` [PATCH 01/16] drm/i915: Introduce intel_parent_fb_pin_get_map() Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24  9:19   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 03/16] drm/i915: Move the i915_dpt_offset()==0 assert Ville Syrjala
                   ` (15 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

strut intel_fb_pin_params will be an important part of the fb_pin
interface, so move the definition to the parent interface file.

Or maybe we should have a separate header for this kind of stuff
since the users of the parent interface will need the struct
definition but not the parent interface vfunc struct definitions?

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_fb_pin.h  | 12 +-----------
 drivers/gpu/drm/i915/display/intel_fbdev.c   |  1 +
 include/drm/intel/display_parent_interface.h | 12 ++++++++++++
 3 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_fb_pin.h b/drivers/gpu/drm/i915/display/intel_fb_pin.h
index 805e23067004..84530f20d7d1 100644
--- a/drivers/gpu/drm/i915/display/intel_fb_pin.h
+++ b/drivers/gpu/drm/i915/display/intel_fb_pin.h
@@ -10,21 +10,11 @@
 
 struct drm_gem_object;
 struct i915_vma;
+struct intel_fb_pin_params;
 struct intel_plane_state;
 struct i915_gtt_view;
 struct iosys_map;
 
-struct intel_fb_pin_params {
-	const struct i915_gtt_view *view;
-	unsigned int alignment;
-	unsigned int phys_alignment;
-	unsigned int vtd_guard;
-	bool needs_cpu_lmem_access;
-	bool needs_low_address;
-	bool needs_physical;
-	bool needs_fence;
-};
-
 struct i915_vma *
 intel_fb_pin_to_ggtt(struct drm_gem_object *obj,
 		     const struct intel_fb_pin_params *pin_params,
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
index ce4082da30e8..aa2701795caa 100644
--- a/drivers/gpu/drm/i915/display/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
@@ -38,6 +38,7 @@
 #include <linux/vga_switcheroo.h>
 
 #include <drm/clients/drm_client_setup.h>
+#include <drm/intel/display_parent_interface.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_helper.h>
diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
index ee2e9572bfca..b363d6a85dfe 100644
--- a/include/drm/intel/display_parent_interface.h
+++ b/include/drm/intel/display_parent_interface.h
@@ -16,6 +16,7 @@ struct drm_mode_fb_cmd2;
 struct drm_plane_state;
 struct drm_scanout_buffer;
 struct fb_info;
+struct i915_gtt_view;
 struct i915_vma;
 struct intel_dpt;
 struct intel_dsb_buffer;
@@ -29,6 +30,17 @@ struct ref_tracker;
 struct seq_file;
 struct vm_area_struct;
 
+struct intel_fb_pin_params {
+	const struct i915_gtt_view *view;
+	unsigned int alignment;
+	unsigned int phys_alignment;
+	unsigned int vtd_guard;
+	bool needs_cpu_lmem_access;
+	bool needs_low_address;
+	bool needs_physical;
+	bool needs_fence;
+};
+
 /* Keep struct definitions sorted */
 
 struct intel_display_bo_interface {
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 03/16] drm/i915: Move the i915_dpt_offset()==0 assert
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
  2026-04-23 16:53 ` [PATCH 01/16] drm/i915: Introduce intel_parent_fb_pin_get_map() Ville Syrjala
  2026-04-23 16:53 ` [PATCH 02/16] drm/i915: Move intel_fb_pin_params to the parent interface Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24  9:19   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 04/16] drm/i915: Reorganize intel_plane_pin_fb() a bit Ville Syrjala
                   ` (14 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Move the i915_dpt_offset() check into the lower level
intel_fb_pin_to_dpt() function. Clears out some of the unnecessary
junk from the higher level code, making it easier to introduce
the new fb_pin parent interface.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_fb_pin.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
index b800b55530a5..400ad8768c11 100644
--- a/drivers/gpu/drm/i915/i915_fb_pin.c
+++ b/drivers/gpu/drm/i915/i915_fb_pin.c
@@ -101,6 +101,12 @@ intel_fb_pin_to_dpt(struct drm_gem_object *_obj, struct intel_dpt *dpt,
 	i915_gem_object_flush_if_display(obj);
 
 	i915_vma_get(vma);
+
+	/*
+	 * The DPT object contains only one vma, and there is no VT-d
+	 * guard, so the VMA's offset within the DPT is always 0.
+	 */
+	drm_WARN_ON(&i915->drm, i915_dpt_offset(vma));
 err:
 	atomic_dec(&i915->pending_fb_pin);
 
@@ -255,7 +261,6 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
 		       const struct intel_plane_state *old_plane_state)
 {
 	struct intel_display *display = to_intel_display(plane_state);
-	struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev);
 	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
 	const struct intel_framebuffer *fb =
 		to_intel_framebuffer(plane_state->hw.fb);
@@ -304,12 +309,6 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
 		plane_state->dpt_vma = vma;
 
 		WARN_ON(plane_state->ggtt_vma == plane_state->dpt_vma);
-
-		/*
-		 * The DPT object contains only one vma, and there is no VT-d
-		 * guard, so the VMA's offset within the DPT is always 0.
-		 */
-		drm_WARN_ON(&i915->drm, i915_dpt_offset(plane_state->dpt_vma));
 	}
 
 	/*
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 04/16] drm/i915: Reorganize intel_plane_pin_fb() a bit
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (2 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 03/16] drm/i915: Move the i915_dpt_offset()==0 assert Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24  9:55   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 05/16] drm/i915: Introduce i915_fb_pin_dpt_(un)pin() Ville Syrjala
                   ` (13 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Move most of the plane state stuff out from the inner parts
of intel_plane_pin_fb(). The plan is to take those inner parts and
abstract them into the new fb_pin parent interface, and we don't
want any plane_state stuff there.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_fb_pin.c | 67 +++++++++++++++---------------
 1 file changed, 33 insertions(+), 34 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
index 400ad8768c11..bc2e185b4573 100644
--- a/drivers/gpu/drm/i915/i915_fb_pin.c
+++ b/drivers/gpu/drm/i915/i915_fb_pin.c
@@ -264,7 +264,10 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
 	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
 	const struct intel_framebuffer *fb =
 		to_intel_framebuffer(plane_state->hw.fb);
-	struct i915_vma *vma;
+	struct i915_vma *ggtt_vma = NULL;
+	struct i915_vma *dpt_vma = NULL;
+	int fence_id = -1;
+	u32 offset;
 
 	if (!intel_fb_uses_dpt(&fb->base)) {
 		struct intel_fb_pin_params pin_params = {
@@ -277,15 +280,25 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
 			.needs_physical = intel_plane_needs_physical(plane),
 			.needs_fence = intel_plane_needs_fence(display),
 		};
-		int fence_id = -1;
 
-		vma = intel_fb_pin_to_ggtt(intel_fb_bo(&fb->base), &pin_params,
-					   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
-		if (IS_ERR(vma))
-			return PTR_ERR(vma);
+		ggtt_vma = intel_fb_pin_to_ggtt(intel_fb_bo(&fb->base), &pin_params,
+						intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
+		if (IS_ERR(ggtt_vma))
+			return PTR_ERR(ggtt_vma);
 
-		plane_state->ggtt_vma = vma;
-		plane_state->fence_id = fence_id;
+		/*
+		 * Pre-populate the dma address before we enter the vblank
+		 * evade critical section as i915_gem_object_get_dma_address()
+		 * will trigger might_sleep() even if it won't actually sleep,
+		 * which is the case when the fb has already been pinned.
+		 */
+		if (intel_plane_needs_physical(plane)) {
+			struct drm_i915_gem_object *obj = to_intel_bo(intel_fb_bo(&fb->base));
+
+			offset = i915_gem_object_get_dma_address(obj, 0);
+		} else {
+			offset = i915_ggtt_offset(ggtt_vma);
+		}
 	} else {
 		struct intel_fb_pin_params pin_params = {
 			.view = &plane_state->view.gtt,
@@ -293,39 +306,25 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
 			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
 		};
 
-		vma = i915_dpt_pin_to_ggtt(fb->dpt, pin_params.alignment / 512);
-		if (IS_ERR(vma))
-			return PTR_ERR(vma);
+		ggtt_vma = i915_dpt_pin_to_ggtt(fb->dpt, pin_params.alignment / 512);
+		if (IS_ERR(ggtt_vma))
+			return PTR_ERR(ggtt_vma);
 
-		plane_state->ggtt_vma = vma;
-
-		vma = intel_fb_pin_to_dpt(intel_fb_bo(&fb->base), fb->dpt, &pin_params);
-		if (IS_ERR(vma)) {
+		dpt_vma = intel_fb_pin_to_dpt(intel_fb_bo(&fb->base), fb->dpt, &pin_params);
+		if (IS_ERR(dpt_vma)) {
 			i915_dpt_unpin_from_ggtt(fb->dpt);
-			plane_state->ggtt_vma = NULL;
-			return PTR_ERR(vma);
+			return PTR_ERR(dpt_vma);
 		}
 
-		plane_state->dpt_vma = vma;
+		WARN_ON(ggtt_vma == dpt_vma);
 
-		WARN_ON(plane_state->ggtt_vma == plane_state->dpt_vma);
+		offset = i915_ggtt_offset(ggtt_vma);
 	}
 
-	/*
-	 * Pre-populate the dma address before we enter the vblank
-	 * evade critical section as i915_gem_object_get_dma_address()
-	 * will trigger might_sleep() even if it won't actually sleep,
-	 * which is the case when the fb has already been pinned.
-	 */
-	if (intel_plane_needs_physical(plane)) {
-		struct drm_i915_gem_object *obj = to_intel_bo(intel_fb_bo(&fb->base));
-
-		plane_state->surf = i915_gem_object_get_dma_address(obj, 0) +
-			plane->surf_offset(plane_state);
-	} else {
-		plane_state->surf = i915_ggtt_offset(plane_state->ggtt_vma) +
-			plane->surf_offset(plane_state);
-	}
+	plane_state->dpt_vma = dpt_vma;
+	plane_state->ggtt_vma = ggtt_vma;
+	plane_state->fence_id = fence_id;
+	plane_state->surf = offset + plane->surf_offset(plane_state);
 
 	return 0;
 }
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 05/16] drm/i915: Introduce i915_fb_pin_dpt_(un)pin()
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (3 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 04/16] drm/i915: Reorganize intel_plane_pin_fb() a bit Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24  9:56   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 06/16] drm/i915: Introduce i915_fb_pin_ggtt_(un)pin() Ville Syrjala
                   ` (12 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Extract the inner DPT parts of intel_plane_(un)pin() into the
i915_fb_pin_dpt_(un)pin(). These will become part of the new
fb_pin parent interface.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_fb_pin.c | 76 ++++++++++++++++++++++--------
 1 file changed, 56 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
index bc2e185b4573..0019f570d843 100644
--- a/drivers/gpu/drm/i915/i915_fb_pin.c
+++ b/drivers/gpu/drm/i915/i915_fb_pin.c
@@ -257,6 +257,49 @@ intel_plane_fb_vtd_guard(const struct intel_plane_state *plane_state)
 				       plane_state->hw.rotation);
 }
 
+static int i915_fb_pin_dpt_pin(struct drm_gem_object *obj, struct intel_dpt *dpt,
+			       const struct intel_fb_pin_params *pin_params,
+			       struct i915_vma **out_dpt_vma,
+			       struct i915_vma **out_ggtt_vma,
+			       u32 *out_offset)
+{
+	struct i915_vma *ggtt_vma, *dpt_vma;
+
+	WARN_ON(!dpt);
+
+	ggtt_vma = i915_dpt_pin_to_ggtt(dpt, pin_params->alignment / 512);
+	if (IS_ERR(ggtt_vma))
+		return PTR_ERR(ggtt_vma);
+
+	dpt_vma = intel_fb_pin_to_dpt(obj, dpt, pin_params);
+	if (IS_ERR(dpt_vma)) {
+		i915_dpt_unpin_from_ggtt(dpt);
+		return PTR_ERR(dpt_vma);
+	}
+
+	drm_WARN_ON(obj->dev, ggtt_vma == dpt_vma);
+
+	*out_ggtt_vma = ggtt_vma;
+	*out_dpt_vma = dpt_vma;
+
+	*out_offset = i915_ggtt_offset(ggtt_vma);
+
+	return 0;
+}
+
+static void i915_fb_pin_dpt_unpin(struct intel_dpt *dpt,
+				  struct i915_vma *dpt_vma,
+				  struct i915_vma *ggtt_vma)
+{
+	WARN_ON(!dpt);
+	WARN_ON(!!dpt_vma != !!ggtt_vma);
+
+	if (dpt_vma)
+		intel_fb_unpin_vma(dpt_vma, -1);
+	if (ggtt_vma)
+		i915_dpt_unpin_from_ggtt(dpt);
+}
+
 int intel_plane_pin_fb(struct intel_plane_state *plane_state,
 		       const struct intel_plane_state *old_plane_state)
 {
@@ -268,6 +311,7 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
 	struct i915_vma *dpt_vma = NULL;
 	int fence_id = -1;
 	u32 offset;
+	int ret;
 
 	if (!intel_fb_uses_dpt(&fb->base)) {
 		struct intel_fb_pin_params pin_params = {
@@ -306,19 +350,11 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
 			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
 		};
 
-		ggtt_vma = i915_dpt_pin_to_ggtt(fb->dpt, pin_params.alignment / 512);
-		if (IS_ERR(ggtt_vma))
-			return PTR_ERR(ggtt_vma);
-
-		dpt_vma = intel_fb_pin_to_dpt(intel_fb_bo(&fb->base), fb->dpt, &pin_params);
-		if (IS_ERR(dpt_vma)) {
-			i915_dpt_unpin_from_ggtt(fb->dpt);
-			return PTR_ERR(dpt_vma);
-		}
-
-		WARN_ON(ggtt_vma == dpt_vma);
-
-		offset = i915_ggtt_offset(ggtt_vma);
+		ret = i915_fb_pin_dpt_pin(intel_fb_bo(&fb->base), fb->dpt,
+					  &pin_params, &dpt_vma,
+					  &ggtt_vma, &offset);
+		if (ret)
+			return ret;
 	}
 
 	plane_state->dpt_vma = dpt_vma;
@@ -333,22 +369,22 @@ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
 {
 	const struct intel_framebuffer *fb =
 		to_intel_framebuffer(old_plane_state->hw.fb);
-	struct i915_vma *vma;
 
 	if (!intel_fb_uses_dpt(&fb->base)) {
+		struct i915_vma *vma;
+
 		vma = fetch_and_zero(&old_plane_state->ggtt_vma);
 		if (vma) {
 			intel_fb_unpin_vma(vma, old_plane_state->fence_id);
 			old_plane_state->fence_id = -1;
 		}
 	} else {
-		vma = fetch_and_zero(&old_plane_state->dpt_vma);
-		if (vma)
-			intel_fb_unpin_vma(vma, -1);
+		i915_fb_pin_dpt_unpin(fb->dpt,
+				      old_plane_state->dpt_vma,
+				      old_plane_state->ggtt_vma);
 
-		vma = fetch_and_zero(&old_plane_state->ggtt_vma);
-		if (vma)
-			i915_dpt_unpin_from_ggtt(fb->dpt);
+		old_plane_state->dpt_vma = NULL;
+		old_plane_state->ggtt_vma = NULL;
 	}
 }
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 06/16] drm/i915: Introduce i915_fb_pin_ggtt_(un)pin()
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (4 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 05/16] drm/i915: Introduce i915_fb_pin_dpt_(un)pin() Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24  9:59   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 07/16] drm/xe: Move the FORCE_WC assert into __xe_pin_fb_vma() Ville Syrjala
                   ` (11 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Extract the inner DPT parts of intel_plane_(un)pin() into the
i915_fb_pin_ggtt_(un)pin(). These will become part of the new
fb_pin parent interface.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_fb_pin.c | 68 +++++++++++++++++++-----------
 1 file changed, 44 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
index 0019f570d843..e14d2c1fb81f 100644
--- a/drivers/gpu/drm/i915/i915_fb_pin.c
+++ b/drivers/gpu/drm/i915/i915_fb_pin.c
@@ -257,6 +257,41 @@ intel_plane_fb_vtd_guard(const struct intel_plane_state *plane_state)
 				       plane_state->hw.rotation);
 }
 
+static int i915_fb_pin_ggtt_pin(struct drm_gem_object *obj,
+				const struct intel_fb_pin_params *pin_params,
+				struct i915_vma **out_ggtt_vma,
+				u32 *out_offset,
+				int *out_fence_id)
+{
+	struct i915_vma *ggtt_vma;
+
+	ggtt_vma = intel_fb_pin_to_ggtt(obj, pin_params, out_fence_id);
+	if (IS_ERR(ggtt_vma))
+		return PTR_ERR(ggtt_vma);
+
+	*out_ggtt_vma = ggtt_vma;
+
+	/*
+	 * Pre-populate the dma address before we enter the vblank
+	 * evade critical section as i915_gem_object_get_dma_address()
+	 * will trigger might_sleep() even if it won't actually sleep,
+	 * which is the case when the fb has already been pinned.
+	 */
+	if (pin_params->needs_physical)
+		*out_offset = i915_gem_object_get_dma_address(to_intel_bo(obj), 0);
+	else
+		*out_offset = i915_ggtt_offset(ggtt_vma);
+
+	return 0;
+}
+
+static void i915_fb_pin_ggtt_unpin(struct i915_vma *ggtt_vma,
+				   int fence_id)
+{
+	if (ggtt_vma)
+		intel_fb_unpin_vma(ggtt_vma, fence_id);
+}
+
 static int i915_fb_pin_dpt_pin(struct drm_gem_object *obj, struct intel_dpt *dpt,
 			       const struct intel_fb_pin_params *pin_params,
 			       struct i915_vma **out_dpt_vma,
@@ -325,24 +360,11 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
 			.needs_fence = intel_plane_needs_fence(display),
 		};
 
-		ggtt_vma = intel_fb_pin_to_ggtt(intel_fb_bo(&fb->base), &pin_params,
-						intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
-		if (IS_ERR(ggtt_vma))
-			return PTR_ERR(ggtt_vma);
-
-		/*
-		 * Pre-populate the dma address before we enter the vblank
-		 * evade critical section as i915_gem_object_get_dma_address()
-		 * will trigger might_sleep() even if it won't actually sleep,
-		 * which is the case when the fb has already been pinned.
-		 */
-		if (intel_plane_needs_physical(plane)) {
-			struct drm_i915_gem_object *obj = to_intel_bo(intel_fb_bo(&fb->base));
-
-			offset = i915_gem_object_get_dma_address(obj, 0);
-		} else {
-			offset = i915_ggtt_offset(ggtt_vma);
-		}
+		ret = i915_fb_pin_ggtt_pin(intel_fb_bo(&fb->base),
+					   &pin_params, &ggtt_vma, &offset,
+					   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
+		if (ret)
+			return ret;
 	} else {
 		struct intel_fb_pin_params pin_params = {
 			.view = &plane_state->view.gtt,
@@ -371,13 +393,11 @@ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
 		to_intel_framebuffer(old_plane_state->hw.fb);
 
 	if (!intel_fb_uses_dpt(&fb->base)) {
-		struct i915_vma *vma;
+		i915_fb_pin_ggtt_unpin(old_plane_state->ggtt_vma,
+				       old_plane_state->fence_id);
 
-		vma = fetch_and_zero(&old_plane_state->ggtt_vma);
-		if (vma) {
-			intel_fb_unpin_vma(vma, old_plane_state->fence_id);
-			old_plane_state->fence_id = -1;
-		}
+		old_plane_state->ggtt_vma = NULL;
+		old_plane_state->fence_id = -1;
 	} else {
 		i915_fb_pin_dpt_unpin(fb->dpt,
 				      old_plane_state->dpt_vma,
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 07/16] drm/xe: Move the FORCE_WC assert into __xe_pin_fb_vma()
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (5 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 06/16] drm/i915: Introduce i915_fb_pin_ggtt_(un)pin() Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24 10:02   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 08/16] drm/xe: Kill the fbdev vma reuse hack Ville Syrjala
                   ` (10 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

No need to bother the higher level pinning code with the
FORCE_WC assert. Move it into the lower level function.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/xe/display/xe_fb_pin.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index afb6cdda537e..487c092cd000 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -329,6 +329,9 @@ static struct i915_vma *__xe_pin_fb_vma(struct drm_gem_object *obj, bool is_dpt,
 	struct drm_exec exec;
 	int ret = 0;
 
+	/* We reject creating !SCANOUT fb's, so this is weird.. */
+	drm_WARN_ON(bo->ttm.base.dev, !(bo->flags & XE_BO_FLAG_FORCE_WC));
+
 	if (!vma)
 		return ERR_PTR(-ENODEV);
 
@@ -466,7 +469,6 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 {
 	struct drm_framebuffer *fb = new_plane_state->hw.fb;
 	struct drm_gem_object *obj = intel_fb_bo(fb);
-	struct xe_bo *bo = gem_to_xe_bo(obj);
 	struct i915_vma *vma;
 	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
 	struct intel_fb_pin_params pin_params = {
@@ -478,9 +480,6 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 	if (reuse_vma(new_plane_state, old_plane_state))
 		return 0;
 
-	/* We reject creating !SCANOUT fb's, so this is weird.. */
-	drm_WARN_ON(bo->ttm.base.dev, !(bo->flags & XE_BO_FLAG_FORCE_WC));
-
 	vma = __xe_pin_fb_vma(obj, intel_fb_uses_dpt(fb), &pin_params);
 
 	if (IS_ERR(vma))
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 08/16] drm/xe: Kill the fbdev vma reuse hack
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (6 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 07/16] drm/xe: Move the FORCE_WC assert into __xe_pin_fb_vma() Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24 10:06   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 09/16] drm/xe: Reorganize intel_plane_pin_fb() a bit Ville Syrjala
                   ` (9 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

This fbdev vma reuse hacks is a massive layering violation. It
really does not belong in the fb pinning code. And it's in the
way of properly abstracting this stuff, so kill it.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/xe/display/xe_fb_pin.c | 10 ----------
 1 file changed, 10 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index 487c092cd000..bbeb5c2a6c51 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -10,7 +10,6 @@
 #include "intel_display_types.h"
 #include "intel_fb.h"
 #include "intel_fb_pin.h"
-#include "intel_fbdev.h"
 #include "xe_bo.h"
 #include "xe_device.h"
 #include "xe_display_vma.h"
@@ -432,10 +431,7 @@ void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
 static bool reuse_vma(struct intel_plane_state *new_plane_state,
 		      const struct intel_plane_state *old_plane_state)
 {
-	struct intel_framebuffer *fb = to_intel_framebuffer(new_plane_state->hw.fb);
 	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
-	struct xe_device *xe = to_xe_device(fb->base.dev);
-	struct intel_display *display = xe->display;
 	struct i915_vma *vma;
 
 	if (old_plane_state->hw.fb == new_plane_state->hw.fb &&
@@ -446,12 +442,6 @@ static bool reuse_vma(struct intel_plane_state *new_plane_state,
 		goto found;
 	}
 
-	if (fb == intel_fbdev_framebuffer(display->fbdev.fbdev)) {
-		vma = intel_fbdev_vma_pointer(display->fbdev.fbdev);
-		if (vma)
-			goto found;
-	}
-
 	return false;
 
 found:
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 09/16] drm/xe: Reorganize intel_plane_pin_fb() a bit
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (7 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 08/16] drm/xe: Kill the fbdev vma reuse hack Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24 10:07   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 10/16] drm/xe: Introduce xe_fb_pin_dpt_(un)pin() Ville Syrjala
                   ` (8 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Move most of the plane state stuff out from the inner parts
of intel_plane_pin_fb(). The plan is to take those inner parts and
abstract them into the new fb_pin parent interface, and we don't
want any plane_state stuff there.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/xe/display/xe_fb_pin.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index bbeb5c2a6c51..9774089ee75c 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -459,26 +459,30 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 {
 	struct drm_framebuffer *fb = new_plane_state->hw.fb;
 	struct drm_gem_object *obj = intel_fb_bo(fb);
-	struct i915_vma *vma;
 	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
 	struct intel_fb_pin_params pin_params = {
 		.view = &new_plane_state->view.gtt,
 		.alignment = plane->min_alignment(plane, fb, 0),
 		.needs_cpu_lmem_access = intel_fb_needs_cpu_access(fb),
 	};
+	struct i915_vma *ggtt_vma = NULL;
+	struct i915_vma *dpt_vma = NULL;
+	int fence_id = -1;
+	u32 offset;
 
 	if (reuse_vma(new_plane_state, old_plane_state))
 		return 0;
 
-	vma = __xe_pin_fb_vma(obj, intel_fb_uses_dpt(fb), &pin_params);
+	ggtt_vma = __xe_pin_fb_vma(obj, intel_fb_uses_dpt(fb), &pin_params);
+	if (IS_ERR(ggtt_vma))
+		return PTR_ERR(ggtt_vma);
 
-	if (IS_ERR(vma))
-		return PTR_ERR(vma);
+	offset = xe_ggtt_node_addr(ggtt_vma->node);
 
-	new_plane_state->ggtt_vma = vma;
-
-	new_plane_state->surf = xe_ggtt_node_addr(new_plane_state->ggtt_vma->node) +
-		plane->surf_offset(new_plane_state);
+	new_plane_state->dpt_vma = dpt_vma;
+	new_plane_state->ggtt_vma = ggtt_vma;
+	new_plane_state->fence_id = fence_id;
+	new_plane_state->surf = offset + plane->surf_offset(new_plane_state);
 
 	return 0;
 }
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 10/16] drm/xe: Introduce xe_fb_pin_dpt_(un)pin()
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (8 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 09/16] drm/xe: Reorganize intel_plane_pin_fb() a bit Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24 10:12   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 11/16] drm/xe: Introduce xe_fb_pin_ggtt_(un)pin() Ville Syrjala
                   ` (7 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Extract the inner DPT parts of intel_plane_(un)pin() into the
xe_fb_pin_dpt_(un)pin(). These will become part of the new
fb_pin parent interface.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/xe/display/xe_fb_pin.c | 69 ++++++++++++++++++++++----
 1 file changed, 59 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index 9774089ee75c..46f6ae6acc4e 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -428,6 +428,36 @@ void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
 	__xe_unpin_fb_vma(vma);
 }
 
+static int xe_fb_pin_dpt_pin(struct drm_gem_object *obj, struct intel_dpt *dpt,
+			     const struct intel_fb_pin_params *pin_params,
+			     struct i915_vma **out_dpt_vma,
+			     struct i915_vma **out_ggtt_vma,
+			     u32 *out_offset)
+{
+	struct i915_vma *ggtt_vma;
+
+	WARN_ON(dpt);
+
+	ggtt_vma = __xe_pin_fb_vma(obj, true, pin_params);
+	if (IS_ERR(ggtt_vma))
+		return PTR_ERR(ggtt_vma);
+
+	*out_dpt_vma = NULL; /* not used on xe */
+	*out_ggtt_vma = ggtt_vma;
+	*out_offset = xe_ggtt_node_addr(ggtt_vma->node);
+
+	return 0;
+}
+
+static void xe_fb_pin_dpt_unpin(struct intel_dpt *dpt,
+				struct i915_vma *dpt_vma,
+				struct i915_vma *ggtt_vma)
+{
+	WARN_ON(dpt || dpt_vma);
+
+	__xe_unpin_fb_vma(ggtt_vma);
+}
+
 static bool reuse_vma(struct intel_plane_state *new_plane_state,
 		      const struct intel_plane_state *old_plane_state)
 {
@@ -457,27 +487,35 @@ static bool reuse_vma(struct intel_plane_state *new_plane_state,
 int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 		       const struct intel_plane_state *old_plane_state)
 {
-	struct drm_framebuffer *fb = new_plane_state->hw.fb;
-	struct drm_gem_object *obj = intel_fb_bo(fb);
+	struct intel_framebuffer *fb = to_intel_framebuffer(new_plane_state->hw.fb);
+	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
 	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
 	struct intel_fb_pin_params pin_params = {
 		.view = &new_plane_state->view.gtt,
-		.alignment = plane->min_alignment(plane, fb, 0),
-		.needs_cpu_lmem_access = intel_fb_needs_cpu_access(fb),
+		.alignment = plane->min_alignment(plane, &fb->base, 0),
+		.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
 	};
 	struct i915_vma *ggtt_vma = NULL;
 	struct i915_vma *dpt_vma = NULL;
 	int fence_id = -1;
 	u32 offset;
+	int ret;
 
 	if (reuse_vma(new_plane_state, old_plane_state))
 		return 0;
 
-	ggtt_vma = __xe_pin_fb_vma(obj, intel_fb_uses_dpt(fb), &pin_params);
-	if (IS_ERR(ggtt_vma))
-		return PTR_ERR(ggtt_vma);
+	if (!intel_fb_uses_dpt(&fb->base)) {
+		ggtt_vma = __xe_pin_fb_vma(obj, false, &pin_params);
+		if (IS_ERR(ggtt_vma))
+			return PTR_ERR(ggtt_vma);
 
-	offset = xe_ggtt_node_addr(ggtt_vma->node);
+		offset = xe_ggtt_node_addr(ggtt_vma->node);
+	} else {
+		ret = xe_fb_pin_dpt_pin(obj, fb->dpt, &pin_params,
+					&dpt_vma, &ggtt_vma, &offset);
+		if (ret)
+			return ret;
+	}
 
 	new_plane_state->dpt_vma = dpt_vma;
 	new_plane_state->ggtt_vma = ggtt_vma;
@@ -489,8 +527,19 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 
 void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
 {
-	__xe_unpin_fb_vma(old_plane_state->ggtt_vma);
-	old_plane_state->ggtt_vma = NULL;
+	const struct intel_framebuffer *fb = to_intel_framebuffer(old_plane_state->hw.fb);
+
+	if (!intel_fb_uses_dpt(&fb->base)) {
+		__xe_unpin_fb_vma(old_plane_state->ggtt_vma);
+
+		old_plane_state->ggtt_vma = NULL;
+	} else {
+		xe_fb_pin_dpt_unpin(fb->dpt, old_plane_state->dpt_vma,
+				    old_plane_state->ggtt_vma);
+
+		old_plane_state->dpt_vma = NULL;
+		old_plane_state->ggtt_vma = NULL;
+	}
 }
 
 static void xe_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 11/16] drm/xe: Introduce xe_fb_pin_ggtt_(un)pin()
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (9 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 10/16] drm/xe: Introduce xe_fb_pin_dpt_(un)pin() Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24 10:13   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 12/16] drm/xe: Restructure reuse_vma() Ville Syrjala
                   ` (6 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Extract the inner DPT parts of intel_plane_(un)pin() into the
xe_fb_pin_ggtt_(un)pin(). These will become part of the new
fb_pin parent interface.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/xe/display/xe_fb_pin.c | 41 ++++++++++++++++++++++----
 1 file changed, 35 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index 46f6ae6acc4e..bdd6a4da0997 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -428,6 +428,34 @@ void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
 	__xe_unpin_fb_vma(vma);
 }
 
+static int xe_fb_pin_ggtt_pin(struct drm_gem_object *obj,
+			      const struct intel_fb_pin_params *pin_params,
+			      struct i915_vma **out_ggtt_vma,
+			      u32 *out_offset,
+			      int *out_fence_id)
+{
+	struct i915_vma *ggtt_vma;
+
+	ggtt_vma = __xe_pin_fb_vma(obj, false, pin_params);
+	if (IS_ERR(ggtt_vma))
+		return PTR_ERR(ggtt_vma);
+
+	*out_ggtt_vma = ggtt_vma;
+	*out_offset = xe_ggtt_node_addr(ggtt_vma->node);
+	if (out_fence_id)
+		*out_fence_id = -1;
+
+	return 0;
+}
+
+static void xe_fb_pin_ggtt_unpin(struct i915_vma *ggtt_vma,
+				 int fence_id)
+{
+	WARN_ON(fence_id >= 0);
+
+	__xe_unpin_fb_vma(ggtt_vma);
+}
+
 static int xe_fb_pin_dpt_pin(struct drm_gem_object *obj, struct intel_dpt *dpt,
 			     const struct intel_fb_pin_params *pin_params,
 			     struct i915_vma **out_dpt_vma,
@@ -505,11 +533,10 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 		return 0;
 
 	if (!intel_fb_uses_dpt(&fb->base)) {
-		ggtt_vma = __xe_pin_fb_vma(obj, false, &pin_params);
-		if (IS_ERR(ggtt_vma))
-			return PTR_ERR(ggtt_vma);
-
-		offset = xe_ggtt_node_addr(ggtt_vma->node);
+		ret = xe_fb_pin_ggtt_pin(obj, &pin_params,
+					 &ggtt_vma, &offset, NULL);
+		if (ret)
+			return ret;
 	} else {
 		ret = xe_fb_pin_dpt_pin(obj, fb->dpt, &pin_params,
 					&dpt_vma, &ggtt_vma, &offset);
@@ -530,9 +557,11 @@ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
 	const struct intel_framebuffer *fb = to_intel_framebuffer(old_plane_state->hw.fb);
 
 	if (!intel_fb_uses_dpt(&fb->base)) {
-		__xe_unpin_fb_vma(old_plane_state->ggtt_vma);
+		xe_fb_pin_ggtt_unpin(old_plane_state->ggtt_vma,
+				     old_plane_state->fence_id);
 
 		old_plane_state->ggtt_vma = NULL;
+		old_plane_state->fence_id = -1;
 	} else {
 		xe_fb_pin_dpt_unpin(fb->dpt, old_plane_state->dpt_vma,
 				    old_plane_state->ggtt_vma);
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 12/16] drm/xe: Restructure reuse_vma()
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (10 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 11/16] drm/xe: Introduce xe_fb_pin_ggtt_(un)pin() Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24 10:30   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 13/16] drm/i915: Introduce the main fb_pin parent interface Ville Syrjala
                   ` (5 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Restructure reuse_vma() into a form that doesn't need the plane
state structs, and rename the result to xe_fb_pin_reuse_vma().
This will become the new fb_pin parent interface.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/xe/display/xe_fb_pin.c | 48 ++++++++++++++------------
 1 file changed, 25 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index bdd6a4da0997..cd287efded28 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -486,36 +486,31 @@ static void xe_fb_pin_dpt_unpin(struct intel_dpt *dpt,
 	__xe_unpin_fb_vma(ggtt_vma);
 }
 
-static bool reuse_vma(struct intel_plane_state *new_plane_state,
-		      const struct intel_plane_state *old_plane_state)
+static struct i915_vma *
+xe_fb_pin_reuse_vma(struct i915_vma *old_ggtt_vma,
+		    struct drm_gem_object *old_obj,
+		    const struct i915_gtt_view *old_view,
+		    struct drm_gem_object *new_obj,
+		    const struct i915_gtt_view *new_view,
+		    u32 *out_offset)
 {
-	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
-	struct i915_vma *vma;
+	if (old_ggtt_vma && old_obj == new_obj &&
+	    !memcmp(&old_view, &new_view, sizeof(*new_view))) {
+		refcount_inc(&old_ggtt_vma->ref);
 
-	if (old_plane_state->hw.fb == new_plane_state->hw.fb &&
-	    !memcmp(&old_plane_state->view.gtt,
-		    &new_plane_state->view.gtt,
-		    sizeof(new_plane_state->view.gtt))) {
-		vma = old_plane_state->ggtt_vma;
-		goto found;
+		*out_offset = xe_ggtt_node_addr(old_ggtt_vma->node);
+
+		return old_ggtt_vma;
 	}
 
-	return false;
-
-found:
-	refcount_inc(&vma->ref);
-	new_plane_state->ggtt_vma = vma;
-
-	new_plane_state->surf = xe_ggtt_node_addr(new_plane_state->ggtt_vma->node) +
-		plane->surf_offset(new_plane_state);
-
-	return true;
+	return NULL;
 }
 
 int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 		       const struct intel_plane_state *old_plane_state)
 {
-	struct intel_framebuffer *fb = to_intel_framebuffer(new_plane_state->hw.fb);
+	const struct intel_framebuffer *fb = to_intel_framebuffer(new_plane_state->hw.fb);
+	const struct intel_framebuffer *old_fb = to_intel_framebuffer(old_plane_state->hw.fb);
 	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
 	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
 	struct intel_fb_pin_params pin_params = {
@@ -529,8 +524,14 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 	u32 offset;
 	int ret;
 
-	if (reuse_vma(new_plane_state, old_plane_state))
-		return 0;
+	ggtt_vma = xe_fb_pin_reuse_vma(old_plane_state->ggtt_vma,
+				       intel_fb_bo(&old_fb->base),
+				       &old_plane_state->view.gtt,
+				       intel_fb_bo(&fb->base),
+				       &new_plane_state->view.gtt,
+				       &offset);
+	if (ggtt_vma)
+		goto got_vma;
 
 	if (!intel_fb_uses_dpt(&fb->base)) {
 		ret = xe_fb_pin_ggtt_pin(obj, &pin_params,
@@ -544,6 +545,7 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 			return ret;
 	}
 
+got_vma:
 	new_plane_state->dpt_vma = dpt_vma;
 	new_plane_state->ggtt_vma = ggtt_vma;
 	new_plane_state->fence_id = fence_id;
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 13/16] drm/i915: Introduce the main fb_pin parent interface
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (11 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 12/16] drm/xe: Restructure reuse_vma() Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24 10:48   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 14/16] drm/i915/fbdev: Use intel_parent_fb_pin_ggtt_(un)pin() Ville Syrjala
                   ` (4 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Introduce the main part of the new fb_pin parent interface:
- intel_parent_fb_pin_ggtt_(un)pin()
- intel_parent_fb_pin_dpt_(un)pin()
- intel_parent_fb_pin_reuse_vma()

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_parent.c  | 53 ++++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_parent.h  | 29 +++++++++++
 drivers/gpu/drm/i915/i915_fb_pin.c           | 29 +++++++----
 drivers/gpu/drm/xe/display/xe_fb_pin.c       | 40 +++++++++------
 include/drm/intel/display_parent_interface.h | 22 ++++++++
 5 files changed, 148 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c
index 070cc60f49b3..a5816561be40 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.c
+++ b/drivers/gpu/drm/i915/display/intel_parent.c
@@ -53,6 +53,59 @@ void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dp
 }
 
 /* fb_pin */
+int intel_parent_fb_pin_ggtt_pin(struct intel_display *display,
+				 struct drm_gem_object *obj,
+				 const struct intel_fb_pin_params *pin_params,
+				 struct i915_vma **out_ggtt_vma,
+				 u32 *out_offset,
+				 int *out_fence_id)
+{
+	return display->parent->fb_pin->ggtt_pin(obj, pin_params,
+						 out_ggtt_vma, out_offset, out_fence_id);
+}
+
+void intel_parent_fb_pin_ggtt_unpin(struct intel_display *display,
+				    struct i915_vma *ggtt_vma,
+				    int fence_id)
+{
+	return display->parent->fb_pin->ggtt_unpin(ggtt_vma, fence_id);
+}
+
+int intel_parent_fb_pin_dpt_pin(struct intel_display *display,
+				struct drm_gem_object *obj,
+				struct intel_dpt *dpt,
+				const struct intel_fb_pin_params *pin_params,
+				struct i915_vma **out_dpt_vma,
+				struct i915_vma **out_ggtt_vma,
+				u32 *out_offset)
+{
+	return display->parent->fb_pin->dpt_pin(obj, dpt, pin_params,
+						out_dpt_vma, out_ggtt_vma, out_offset);
+}
+
+void intel_parent_fb_pin_dpt_unpin(struct intel_display *display,
+				   struct intel_dpt *dpt,
+				   struct i915_vma *dpt_vma,
+				   struct i915_vma *ggtt_vma)
+{
+	return display->parent->fb_pin->dpt_unpin(dpt, dpt_vma, ggtt_vma);
+}
+
+struct i915_vma *intel_parent_fb_pin_reuse_vma(struct intel_display *display,
+					       struct i915_vma *old_ggtt_vma,
+					       struct drm_gem_object *old_obj,
+					       const struct i915_gtt_view *old_view,
+					       struct drm_gem_object *new_obj,
+					       const struct i915_gtt_view *new_view,
+					       u32 *out_offset)
+{
+	if (!display->parent->fb_pin->reuse_vma)
+		return NULL;
+
+	return display->parent->fb_pin->reuse_vma(old_ggtt_vma, old_obj, old_view,
+						  new_obj, new_view, out_offset);
+}
+
 void intel_parent_fb_pin_get_map(struct intel_display *display,
 				 struct i915_vma *vma, struct iosys_map *map)
 {
diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h
index 2b9e829e7f47..27e35f891a6b 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.h
+++ b/drivers/gpu/drm/i915/display/intel_parent.h
@@ -11,9 +11,11 @@ struct dma_fence;
 struct drm_file;
 struct drm_gem_object;
 struct drm_scanout_buffer;
+struct i915_gtt_view;
 struct i915_vma;
 struct intel_display;
 struct intel_dpt;
+struct intel_fb_pin_params;
 struct intel_frontbuffer;
 struct intel_hdcp_gsc_context;
 struct intel_panic;
@@ -28,6 +30,33 @@ void intel_parent_dpt_suspend(struct intel_display *display, struct intel_dpt *d
 void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dpt);
 
 /* fb_pin */
+int intel_parent_fb_pin_ggtt_pin(struct intel_display *display,
+				 struct drm_gem_object *obj,
+				 const struct intel_fb_pin_params *pin_params,
+				 struct i915_vma **out_ggtt_vma,
+				 u32 *out_offset,
+				 int *out_fence_id);
+void intel_parent_fb_pin_ggtt_unpin(struct intel_display *display,
+				    struct i915_vma *ggtt_vma,
+				    int fence_id);
+int intel_parent_fb_pin_dpt_pin(struct intel_display *display,
+				struct drm_gem_object *obj,
+				struct intel_dpt *dpt,
+				const struct intel_fb_pin_params *pin_params,
+				struct i915_vma **out_dpt_vma,
+				struct i915_vma **out_ggtt_vma,
+				u32 *out_offset);
+void intel_parent_fb_pin_dpt_unpin(struct intel_display *display,
+				   struct intel_dpt *dpt,
+				   struct i915_vma *dpt_vma,
+				   struct i915_vma *ggtt_vma);
+struct i915_vma *intel_parent_fb_pin_reuse_vma(struct intel_display *display,
+					       struct i915_vma *old_ggtt_vma,
+					       struct drm_gem_object *old_obj,
+					       const struct i915_gtt_view *old_view,
+					       struct drm_gem_object *new_obj,
+					       const struct i915_gtt_view *new_view,
+					       u32 *out_offset);
 void intel_parent_fb_pin_get_map(struct intel_display *display,
 				 struct i915_vma *vma, struct iosys_map *map);
 
diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
index e14d2c1fb81f..1f08e364d569 100644
--- a/drivers/gpu/drm/i915/i915_fb_pin.c
+++ b/drivers/gpu/drm/i915/i915_fb_pin.c
@@ -14,6 +14,7 @@
 #include "display/intel_display_types.h"
 #include "display/intel_fb.h"
 #include "display/intel_fb_pin.h"
+#include "display/intel_parent.h"
 #include "display/intel_plane.h"
 
 #include "gem/i915_gem_domain.h"
@@ -360,9 +361,9 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
 			.needs_fence = intel_plane_needs_fence(display),
 		};
 
-		ret = i915_fb_pin_ggtt_pin(intel_fb_bo(&fb->base),
-					   &pin_params, &ggtt_vma, &offset,
-					   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
+		ret = intel_parent_fb_pin_ggtt_pin(display, intel_fb_bo(&fb->base),
+						   &pin_params, &ggtt_vma, &offset,
+						   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
 		if (ret)
 			return ret;
 	} else {
@@ -372,9 +373,9 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
 			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
 		};
 
-		ret = i915_fb_pin_dpt_pin(intel_fb_bo(&fb->base), fb->dpt,
-					  &pin_params, &dpt_vma,
-					  &ggtt_vma, &offset);
+		ret = intel_parent_fb_pin_dpt_pin(display, intel_fb_bo(&fb->base),
+						  fb->dpt, &pin_params,
+						  &dpt_vma, &ggtt_vma, &offset);
 		if (ret)
 			return ret;
 	}
@@ -389,19 +390,21 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
 
 void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
 {
+	struct intel_display *display = to_intel_display(old_plane_state);
 	const struct intel_framebuffer *fb =
 		to_intel_framebuffer(old_plane_state->hw.fb);
 
 	if (!intel_fb_uses_dpt(&fb->base)) {
-		i915_fb_pin_ggtt_unpin(old_plane_state->ggtt_vma,
-				       old_plane_state->fence_id);
+		intel_parent_fb_pin_ggtt_unpin(display,
+					       old_plane_state->ggtt_vma,
+					       old_plane_state->fence_id);
 
 		old_plane_state->ggtt_vma = NULL;
 		old_plane_state->fence_id = -1;
 	} else {
-		i915_fb_pin_dpt_unpin(fb->dpt,
-				      old_plane_state->dpt_vma,
-				      old_plane_state->ggtt_vma);
+		intel_parent_fb_pin_dpt_unpin(display, fb->dpt,
+					      old_plane_state->dpt_vma,
+					      old_plane_state->ggtt_vma);
 
 		old_plane_state->dpt_vma = NULL;
 		old_plane_state->ggtt_vma = NULL;
@@ -414,5 +417,9 @@ static void i915_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
 }
 
 const struct intel_display_fb_pin_interface i915_display_fb_pin_interface = {
+	.ggtt_pin = i915_fb_pin_ggtt_pin,
+	.ggtt_unpin = i915_fb_pin_ggtt_unpin,
+	.dpt_pin = i915_fb_pin_dpt_pin,
+	.dpt_unpin = i915_fb_pin_dpt_unpin,
 	.get_map = i915_fb_pin_get_map,
 };
diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index cd287efded28..e2b6ce3686a3 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -10,6 +10,7 @@
 #include "intel_display_types.h"
 #include "intel_fb.h"
 #include "intel_fb_pin.h"
+#include "intel_parent.h"
 #include "xe_bo.h"
 #include "xe_device.h"
 #include "xe_display_vma.h"
@@ -509,6 +510,7 @@ xe_fb_pin_reuse_vma(struct i915_vma *old_ggtt_vma,
 int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 		       const struct intel_plane_state *old_plane_state)
 {
+	struct intel_display *display = to_intel_display(new_plane_state);
 	const struct intel_framebuffer *fb = to_intel_framebuffer(new_plane_state->hw.fb);
 	const struct intel_framebuffer *old_fb = to_intel_framebuffer(old_plane_state->hw.fb);
 	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
@@ -524,23 +526,25 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 	u32 offset;
 	int ret;
 
-	ggtt_vma = xe_fb_pin_reuse_vma(old_plane_state->ggtt_vma,
-				       intel_fb_bo(&old_fb->base),
-				       &old_plane_state->view.gtt,
-				       intel_fb_bo(&fb->base),
-				       &new_plane_state->view.gtt,
-				       &offset);
+	ggtt_vma = intel_parent_fb_pin_reuse_vma(display,
+						 old_plane_state->ggtt_vma,
+						 intel_fb_bo(&old_fb->base),
+						 &old_plane_state->view.gtt,
+						 intel_fb_bo(&fb->base),
+						 &new_plane_state->view.gtt,
+						 &offset);
 	if (ggtt_vma)
 		goto got_vma;
 
 	if (!intel_fb_uses_dpt(&fb->base)) {
-		ret = xe_fb_pin_ggtt_pin(obj, &pin_params,
-					 &ggtt_vma, &offset, NULL);
+		ret = intel_parent_fb_pin_ggtt_pin(display, obj, &pin_params,
+						   &ggtt_vma, &offset, NULL);
 		if (ret)
 			return ret;
 	} else {
-		ret = xe_fb_pin_dpt_pin(obj, fb->dpt, &pin_params,
-					&dpt_vma, &ggtt_vma, &offset);
+		ret = intel_parent_fb_pin_dpt_pin(display, obj, fb->dpt,
+						  &pin_params, &dpt_vma,
+						  &ggtt_vma, &offset);
 		if (ret)
 			return ret;
 	}
@@ -556,17 +560,20 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 
 void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
 {
+	struct intel_display *display = to_intel_display(old_plane_state);
 	const struct intel_framebuffer *fb = to_intel_framebuffer(old_plane_state->hw.fb);
 
 	if (!intel_fb_uses_dpt(&fb->base)) {
-		xe_fb_pin_ggtt_unpin(old_plane_state->ggtt_vma,
-				     old_plane_state->fence_id);
+		intel_parent_fb_pin_ggtt_unpin(display,
+					       old_plane_state->ggtt_vma,
+					       old_plane_state->fence_id);
 
 		old_plane_state->ggtt_vma = NULL;
 		old_plane_state->fence_id = -1;
 	} else {
-		xe_fb_pin_dpt_unpin(fb->dpt, old_plane_state->dpt_vma,
-				    old_plane_state->ggtt_vma);
+		intel_parent_fb_pin_dpt_unpin(display, fb->dpt,
+					      old_plane_state->dpt_vma,
+					      old_plane_state->ggtt_vma);
 
 		old_plane_state->dpt_vma = NULL;
 		old_plane_state->ggtt_vma = NULL;
@@ -579,5 +586,10 @@ static void xe_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
 }
 
 const struct intel_display_fb_pin_interface xe_display_fb_pin_interface = {
+	.ggtt_pin = xe_fb_pin_ggtt_pin,
+	.ggtt_unpin = xe_fb_pin_ggtt_unpin,
+	.dpt_pin = xe_fb_pin_dpt_pin,
+	.dpt_unpin = xe_fb_pin_dpt_unpin,
+	.reuse_vma = xe_fb_pin_reuse_vma,
 	.get_map = xe_fb_pin_get_map,
 };
diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
index b363d6a85dfe..39991afeb173 100644
--- a/include/drm/intel/display_parent_interface.h
+++ b/include/drm/intel/display_parent_interface.h
@@ -83,6 +83,28 @@ struct intel_display_dsb_interface {
 };
 
 struct intel_display_fb_pin_interface {
+	int (*ggtt_pin)(struct drm_gem_object *obj,
+			const struct intel_fb_pin_params *pin_params,
+			struct i915_vma **out_ggtt_vma,
+			u32 *out_offset,
+			int *out_fence_id);
+	void (*ggtt_unpin)(struct i915_vma *ggtt_vma,
+			   int fence_id);
+	int (*dpt_pin)(struct drm_gem_object *obj,
+		       struct intel_dpt *dpt,
+		       const struct intel_fb_pin_params *pin_params,
+		       struct i915_vma **out_dpt_vma,
+		       struct i915_vma **out_ggtt_vma,
+		       u32 *out_offset);
+	void (*dpt_unpin)(struct intel_dpt *dpt,
+			  struct i915_vma *dpt_vma,
+			  struct i915_vma *ggtt_vma);
+	struct i915_vma *(*reuse_vma)(struct i915_vma *old_ggtt_vma,
+				      struct drm_gem_object *old_obj,
+				      const struct i915_gtt_view *old_view,
+				      struct drm_gem_object *new_obj,
+				      const struct i915_gtt_view *new_view,
+				      u32 *out_offset);
 	void (*get_map)(struct i915_vma *vma, struct iosys_map *map);
 };
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 14/16] drm/i915/fbdev: Use intel_parent_fb_pin_ggtt_(un)pin()
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (12 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 13/16] drm/i915: Introduce the main fb_pin parent interface Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24 12:54   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 15/16] drm/xe: Use xe_fb_pin_ggtt_pin() for the initial FB pin Ville Syrjala
                   ` (3 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Replace the intel_fb_pin_to_ggtt() and intel_fb_unpin_vma() with the
new abstract parent interface (intel_parent_fb_pin_ggtt_(un)pin()).

xe no longer needs intel_fb_unpin_vma(), and in i915 it now
becomes and internal function to i915_fb_pin.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_fb_pin.h |  2 --
 drivers/gpu/drm/i915/display/intel_fbdev.c  | 14 +++++++-------
 drivers/gpu/drm/i915/i915_fb_pin.c          |  2 +-
 drivers/gpu/drm/xe/display/xe_fb_pin.c      |  5 -----
 4 files changed, 8 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_fb_pin.h b/drivers/gpu/drm/i915/display/intel_fb_pin.h
index 84530f20d7d1..6ff17d3e2cf5 100644
--- a/drivers/gpu/drm/i915/display/intel_fb_pin.h
+++ b/drivers/gpu/drm/i915/display/intel_fb_pin.h
@@ -20,8 +20,6 @@ intel_fb_pin_to_ggtt(struct drm_gem_object *obj,
 		     const struct intel_fb_pin_params *pin_params,
 		     int *out_fence_id);
 
-void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id);
-
 int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
 		       const struct intel_plane_state *old_plane_state);
 void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state);
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
index aa2701795caa..8463f88149a5 100644
--- a/drivers/gpu/drm/i915/display/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
@@ -53,7 +53,6 @@
 #include "intel_display_rpm.h"
 #include "intel_display_types.h"
 #include "intel_fb.h"
-#include "intel_fb_pin.h"
 #include "intel_fbdev.h"
 #include "intel_frontbuffer.h"
 #include "intel_parent.h"
@@ -133,6 +132,7 @@ static int intel_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma)
 static void intel_fbdev_fb_destroy(struct fb_info *info)
 {
 	struct drm_fb_helper *fb_helper = info->par;
+	struct intel_display *display = to_intel_display(fb_helper->client.dev);
 	struct intel_fbdev *ifbdev = to_intel_fbdev(fb_helper);
 
 	drm_fb_helper_fini(fb_helper);
@@ -142,7 +142,7 @@ static void intel_fbdev_fb_destroy(struct fb_info *info)
 	 * the info->screen_base mmaping. Leaking the VMA is simpler than
 	 * trying to rectify all the possible error paths leading here.
 	 */
-	intel_fb_unpin_vma(ifbdev->vma, -1);
+	intel_parent_fb_pin_ggtt_unpin(display, ifbdev->vma, -1);
 	drm_framebuffer_remove(fb_helper->fb);
 
 	drm_client_release(&fb_helper->client);
@@ -274,6 +274,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
 	struct i915_vma *vma;
 	bool prealloc = false;
 	struct drm_gem_object *obj;
+	u32 offset;
 	int ret;
 
 	ifbdev->fb = NULL;
@@ -321,11 +322,10 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
 						       DRM_MODE_ROTATE_0);
 	pin_params.needs_low_address = intel_plane_needs_low_address(display);
 
-	vma = intel_fb_pin_to_ggtt(obj, &pin_params, NULL);
-	if (IS_ERR(vma)) {
-		ret = PTR_ERR(vma);
+	ret = intel_parent_fb_pin_ggtt_pin(display, obj, &pin_params,
+					   &vma, &offset, NULL);
+	if (ret)
 		goto out_unlock;
-	}
 
 	helper->funcs = &intel_fb_helper_funcs;
 	helper->fb = &fb->base;
@@ -356,7 +356,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
 	return 0;
 
 out_unpin:
-	intel_fb_unpin_vma(vma, -1);
+	intel_parent_fb_pin_ggtt_unpin(display, vma, -1);
 out_unlock:
 	intel_display_rpm_put(display, wakeref);
 
diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
index 1f08e364d569..cedefee46fbf 100644
--- a/drivers/gpu/drm/i915/i915_fb_pin.c
+++ b/drivers/gpu/drm/i915/i915_fb_pin.c
@@ -222,7 +222,7 @@ intel_fb_pin_to_ggtt(struct drm_gem_object *_obj,
 	return vma;
 }
 
-void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
+static void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
 {
 	if (fence_id >= 0)
 		i915_vma_unpin_fence(vma);
diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index e2b6ce3686a3..c3171625d150 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -424,11 +424,6 @@ intel_fb_pin_to_ggtt(struct drm_gem_object *obj,
 	return __xe_pin_fb_vma(obj, false, pin_params);
 }
 
-void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
-{
-	__xe_unpin_fb_vma(vma);
-}
-
 static int xe_fb_pin_ggtt_pin(struct drm_gem_object *obj,
 			      const struct intel_fb_pin_params *pin_params,
 			      struct i915_vma **out_ggtt_vma,
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 15/16] drm/xe: Use xe_fb_pin_ggtt_pin() for the initial FB pin
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (13 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 14/16] drm/i915/fbdev: Use intel_parent_fb_pin_ggtt_(un)pin() Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24 12:58   ` Jani Nikula
  2026-04-23 16:53 ` [PATCH 16/16] drm/i915: Consolidate the intel_plane_(un)pin_fb() implementations Ville Syrjala
                   ` (2 subsequent siblings)
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Use xe_fb_pin_ggtt_pin() instead of intel_fb_pin_to_ggtt() for
the initial FB pin. We want to get rid of intel_fb_pin_to_ggtt()
and just use the new fb_pin parent interface.

This still isn't quite the final solution since we bypass the
actual parent interface and call the implementation directly.
But sorting that out will require more cleanup to the initial
FB code.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/xe/display/xe_fb_pin.c        | 21 +++++--------------
 drivers/gpu/drm/xe/display/xe_fb_pin.h        | 12 +++++++++++
 drivers/gpu/drm/xe/display/xe_initial_plane.c | 18 ++++++++++------
 3 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index c3171625d150..c92c30ceba36 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -413,22 +413,11 @@ static void __xe_unpin_fb_vma(struct i915_vma *vma)
 	kfree(vma);
 }
 
-struct i915_vma *
-intel_fb_pin_to_ggtt(struct drm_gem_object *obj,
-		     const struct intel_fb_pin_params *pin_params,
-		     int *out_fence_id)
-{
-	if (out_fence_id)
-		*out_fence_id = -1;
-
-	return __xe_pin_fb_vma(obj, false, pin_params);
-}
-
-static int xe_fb_pin_ggtt_pin(struct drm_gem_object *obj,
-			      const struct intel_fb_pin_params *pin_params,
-			      struct i915_vma **out_ggtt_vma,
-			      u32 *out_offset,
-			      int *out_fence_id)
+int xe_fb_pin_ggtt_pin(struct drm_gem_object *obj,
+		       const struct intel_fb_pin_params *pin_params,
+		       struct i915_vma **out_ggtt_vma,
+		       u32 *out_offset,
+		       int *out_fence_id)
 {
 	struct i915_vma *ggtt_vma;
 
diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.h b/drivers/gpu/drm/xe/display/xe_fb_pin.h
index 8a42d4009f5d..20dd8a99a25f 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.h
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.h
@@ -4,6 +4,18 @@
 #ifndef __XE_FB_PIN_H__
 #define __XE_FB_PIN_H__
 
+#include <linux/types.h>
+
+struct drm_gem_object;
+struct i915_vma;
+struct intel_fb_pin_params;
+
+int xe_fb_pin_ggtt_pin(struct drm_gem_object *obj,
+		       const struct intel_fb_pin_params *pin_params,
+		       struct i915_vma **out_ggtt_vma,
+		       u32 *out_offset,
+		       int *out_fence_id);
+
 extern const struct intel_display_fb_pin_interface xe_display_fb_pin_interface;
 
 #endif /* __XE_FB_PIN_H__ */
diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c
index 8e3c0c4b81fe..02b46cc3b6df 100644
--- a/drivers/gpu/drm/xe/display/xe_initial_plane.c
+++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c
@@ -7,12 +7,16 @@
 
 #include "regs/xe_gtt_defs.h"
 
-#include "intel_display_types.h"
+/* FIXME move intel_remapped_info_size() & co. */
 #include "intel_fb.h"
-#include "intel_fb_pin.h"
+
+/* FIXME move intel_initial_plane_config */
+#include "intel_display_types.h"
+
 #include "xe_bo.h"
 #include "xe_display_bo.h"
 #include "xe_display_vma.h"
+#include "xe_fb_pin.h"
 #include "xe_ggtt.h"
 #include "xe_mmio.h"
 #include "xe_vram_types.h"
@@ -137,14 +141,16 @@ xe_initial_plane_setup(struct drm_plane_state *_plane_state,
 	struct intel_fb_pin_params pin_params = {
 		.view = &plane_state->view.gtt,
 	};
+	u32 offset;
+	int ret;
 
-	vma = intel_fb_pin_to_ggtt(intel_fb_bo(fb), &pin_params, NULL);
-	if (IS_ERR(vma))
-		return PTR_ERR(vma);
+	ret = xe_fb_pin_ggtt_pin(intel_fb_bo(fb), &pin_params, &vma, &offset, NULL);
+	if (ret)
+		return ret;
 
 	plane_state->ggtt_vma = vma;
 
-	plane_state->surf = xe_ggtt_node_addr(plane_state->ggtt_vma->node);
+	plane_state->surf = offset;
 
 	plane_config->vma = vma;
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 16/16] drm/i915: Consolidate the intel_plane_(un)pin_fb() implementations
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (14 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 15/16] drm/xe: Use xe_fb_pin_ggtt_pin() for the initial FB pin Ville Syrjala
@ 2026-04-23 16:53 ` Ville Syrjala
  2026-04-24 13:30   ` Jani Nikula
  2026-04-23 17:01 ` ✗ CI.checkpatch: warning for drm/i915: Introduce 'fb_pin' parent interface Patchwork
  2026-04-23 17:02 ` ✓ CI.KUnit: success " Patchwork
  17 siblings, 1 reply; 36+ messages in thread
From: Ville Syrjala @ 2026-04-23 16:53 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe

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

Currently i915 and each implement their own versions of
intel_plane_(un)pin(). Now that we have the fb_pin parent
interface we can consolidate this to a single implementation.

The result is a mixture of the i915 and xe implementations.
The reuse_vma() hack comes from xe (and i915 doesn't implement
that part of the parent interface, and the pin_params are
taken from i915 since the platforms supported by i915 need
more things.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_cursor.c |   1 -
 drivers/gpu/drm/i915/display/intel_fb_pin.h |  27 -----
 drivers/gpu/drm/i915/display/intel_plane.c  | 118 +++++++++++++++++++-
 drivers/gpu/drm/i915/display/intel_plane.h  |   3 +
 drivers/gpu/drm/i915/i915_fb_pin.c          | 116 +------------------
 drivers/gpu/drm/xe/display/xe_fb_pin.c      |  82 +-------------
 6 files changed, 126 insertions(+), 221 deletions(-)
 delete mode 100644 drivers/gpu/drm/i915/display/intel_fb_pin.h

diff --git a/drivers/gpu/drm/i915/display/intel_cursor.c b/drivers/gpu/drm/i915/display/intel_cursor.c
index 18d1014de361..52347668f27d 100644
--- a/drivers/gpu/drm/i915/display/intel_cursor.c
+++ b/drivers/gpu/drm/i915/display/intel_cursor.c
@@ -21,7 +21,6 @@
 #include "intel_display_utils.h"
 #include "intel_display_wa.h"
 #include "intel_fb.h"
-#include "intel_fb_pin.h"
 #include "intel_frontbuffer.h"
 #include "intel_plane.h"
 #include "intel_psr.h"
diff --git a/drivers/gpu/drm/i915/display/intel_fb_pin.h b/drivers/gpu/drm/i915/display/intel_fb_pin.h
deleted file mode 100644
index 6ff17d3e2cf5..000000000000
--- a/drivers/gpu/drm/i915/display/intel_fb_pin.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright © 2021 Intel Corporation
- */
-
-#ifndef __INTEL_FB_PIN_H__
-#define __INTEL_FB_PIN_H__
-
-#include <linux/types.h>
-
-struct drm_gem_object;
-struct i915_vma;
-struct intel_fb_pin_params;
-struct intel_plane_state;
-struct i915_gtt_view;
-struct iosys_map;
-
-struct i915_vma *
-intel_fb_pin_to_ggtt(struct drm_gem_object *obj,
-		     const struct intel_fb_pin_params *pin_params,
-		     int *out_fence_id);
-
-int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
-		       const struct intel_plane_state *old_plane_state);
-void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state);
-
-#endif
diff --git a/drivers/gpu/drm/i915/display/intel_plane.c b/drivers/gpu/drm/i915/display/intel_plane.c
index e50e1a15410a..f132fa955d21 100644
--- a/drivers/gpu/drm/i915/display/intel_plane.c
+++ b/drivers/gpu/drm/i915/display/intel_plane.c
@@ -44,6 +44,7 @@
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_panic.h>
 #include <drm/drm_print.h>
+#include <drm/intel/display_parent_interface.h>
 
 #include "i9xx_plane_regs.h"
 #include "intel_cdclk.h"
@@ -53,7 +54,6 @@
 #include "intel_display_trace.h"
 #include "intel_display_types.h"
 #include "intel_fb.h"
-#include "intel_fb_pin.h"
 #include "intel_fbdev.h"
 #include "intel_parent.h"
 #include "intel_plane.h"
@@ -1191,6 +1191,122 @@ int intel_plane_check_src_coordinates(struct intel_plane_state *plane_state)
 	return 0;
 }
 
+static unsigned int
+intel_plane_fb_min_alignment(const struct intel_plane_state *plane_state)
+{
+	const struct intel_framebuffer *fb = to_intel_framebuffer(plane_state->hw.fb);
+
+	return fb->min_alignment;
+}
+
+static unsigned int
+intel_plane_fb_min_phys_alignment(const struct intel_plane_state *plane_state)
+{
+	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
+	const struct drm_framebuffer *fb = plane_state->hw.fb;
+
+	if (!intel_plane_needs_physical(plane))
+		return 0;
+
+	return plane->min_alignment(plane, fb, 0);
+}
+
+static unsigned int
+intel_plane_fb_vtd_guard(const struct intel_plane_state *plane_state)
+{
+	return intel_fb_view_vtd_guard(plane_state->hw.fb,
+				       &plane_state->view,
+				       plane_state->hw.rotation);
+}
+
+int intel_plane_pin_fb(struct intel_plane_state *plane_state,
+		       const struct intel_plane_state *old_plane_state)
+{
+	struct intel_display *display = to_intel_display(plane_state);
+	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
+	const struct intel_framebuffer *fb =
+		to_intel_framebuffer(plane_state->hw.fb);
+	const struct intel_framebuffer *old_fb =
+		to_intel_framebuffer(old_plane_state->hw.fb);
+	struct i915_vma *ggtt_vma = NULL;
+	struct i915_vma *dpt_vma = NULL;
+	int fence_id = -1;
+	u32 offset = 0;
+	int ret;
+
+	/* hack for xe since it can't keep track of vmas properly */
+	ggtt_vma = intel_parent_fb_pin_reuse_vma(display,
+						 old_plane_state->ggtt_vma,
+						 intel_fb_bo(&old_fb->base),
+						 &old_plane_state->view.gtt,
+						 intel_fb_bo(&fb->base),
+						 &plane_state->view.gtt,
+						 &offset);
+	if (ggtt_vma)
+		goto got_vma;
+
+	if (!intel_fb_uses_dpt(&fb->base)) {
+		struct intel_fb_pin_params pin_params = {
+			.view = &plane_state->view.gtt,
+			.alignment = intel_plane_fb_min_alignment(plane_state),
+			.phys_alignment = intel_plane_fb_min_phys_alignment(plane_state),
+			.vtd_guard = intel_plane_fb_vtd_guard(plane_state),
+			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
+			.needs_low_address = intel_plane_needs_low_address(display),
+			.needs_physical = intel_plane_needs_physical(plane),
+			.needs_fence = intel_plane_needs_fence(display),
+		};
+
+		ret = intel_parent_fb_pin_ggtt_pin(display, intel_fb_bo(&fb->base),
+						   &pin_params, &ggtt_vma, &offset,
+						   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
+	} else {
+		struct intel_fb_pin_params pin_params = {
+			.view = &plane_state->view.gtt,
+			.alignment = intel_plane_fb_min_alignment(plane_state),
+			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
+		};
+
+		ret = intel_parent_fb_pin_dpt_pin(display, intel_fb_bo(&fb->base),
+						  fb->dpt, &pin_params,
+						  &dpt_vma, &ggtt_vma, &offset);
+	}
+	if (ret)
+		return ret;
+
+got_vma:
+	plane_state->dpt_vma = dpt_vma;
+	plane_state->ggtt_vma = ggtt_vma;
+	plane_state->fence_id = fence_id;
+
+	plane_state->surf = offset + plane->surf_offset(plane_state);
+
+	return 0;
+}
+
+void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
+{
+	struct intel_display *display = to_intel_display(old_plane_state);
+	const struct intel_framebuffer *fb =
+		to_intel_framebuffer(old_plane_state->hw.fb);
+
+	if (!intel_fb_uses_dpt(&fb->base)) {
+		intel_parent_fb_pin_ggtt_unpin(display,
+					       old_plane_state->ggtt_vma,
+					       old_plane_state->fence_id);
+
+		old_plane_state->ggtt_vma = NULL;
+		old_plane_state->fence_id = -1;
+	} else {
+		intel_parent_fb_pin_dpt_unpin(display, fb->dpt,
+					      old_plane_state->dpt_vma,
+					      old_plane_state->ggtt_vma);
+
+		old_plane_state->dpt_vma = NULL;
+		old_plane_state->ggtt_vma = NULL;
+	}
+}
+
 static int add_dma_resv_fences(struct dma_resv *resv,
 			       struct drm_plane_state *new_plane_state)
 {
diff --git a/drivers/gpu/drm/i915/display/intel_plane.h b/drivers/gpu/drm/i915/display/intel_plane.h
index 7b5456f56f42..a6338bba72d9 100644
--- a/drivers/gpu/drm/i915/display/intel_plane.h
+++ b/drivers/gpu/drm/i915/display/intel_plane.h
@@ -92,5 +92,8 @@ int intel_plane_atomic_check(struct intel_atomic_state *state);
 bool intel_plane_format_mod_supported_async(struct drm_plane *plane,
 					    u32 format,
 					    u64 modifier);
+int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
+		       const struct intel_plane_state *old_plane_state);
+void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state);
 
 #endif /* __INTEL_PLANE_H__ */
diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
index cedefee46fbf..1034cb767e9f 100644
--- a/drivers/gpu/drm/i915/i915_fb_pin.c
+++ b/drivers/gpu/drm/i915/i915_fb_pin.c
@@ -3,20 +3,9 @@
  * Copyright © 2021 Intel Corporation
  */
 
-/**
- * DOC: display pinning helpers
- */
-
 #include <drm/drm_print.h>
 #include <drm/intel/display_parent_interface.h>
 
-#include "display/intel_display_core.h"
-#include "display/intel_display_types.h"
-#include "display/intel_fb.h"
-#include "display/intel_fb_pin.h"
-#include "display/intel_parent.h"
-#include "display/intel_plane.h"
-
 #include "gem/i915_gem_domain.h"
 #include "gem/i915_gem_object.h"
 
@@ -114,7 +103,7 @@ intel_fb_pin_to_dpt(struct drm_gem_object *_obj, struct intel_dpt *dpt,
 	return vma;
 }
 
-struct i915_vma *
+static struct i915_vma *
 intel_fb_pin_to_ggtt(struct drm_gem_object *_obj,
 		     const struct intel_fb_pin_params *pin_params,
 		     int *out_fence_id)
@@ -230,34 +219,6 @@ static void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
 	i915_vma_put(vma);
 }
 
-static unsigned int
-intel_plane_fb_min_alignment(const struct intel_plane_state *plane_state)
-{
-	const struct intel_framebuffer *fb = to_intel_framebuffer(plane_state->hw.fb);
-
-	return fb->min_alignment;
-}
-
-static unsigned int
-intel_plane_fb_min_phys_alignment(const struct intel_plane_state *plane_state)
-{
-	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
-	const struct drm_framebuffer *fb = plane_state->hw.fb;
-
-	if (!intel_plane_needs_physical(plane))
-		return 0;
-
-	return plane->min_alignment(plane, fb, 0);
-}
-
-static unsigned int
-intel_plane_fb_vtd_guard(const struct intel_plane_state *plane_state)
-{
-	return intel_fb_view_vtd_guard(plane_state->hw.fb,
-				       &plane_state->view,
-				       plane_state->hw.rotation);
-}
-
 static int i915_fb_pin_ggtt_pin(struct drm_gem_object *obj,
 				const struct intel_fb_pin_params *pin_params,
 				struct i915_vma **out_ggtt_vma,
@@ -336,81 +297,6 @@ static void i915_fb_pin_dpt_unpin(struct intel_dpt *dpt,
 		i915_dpt_unpin_from_ggtt(dpt);
 }
 
-int intel_plane_pin_fb(struct intel_plane_state *plane_state,
-		       const struct intel_plane_state *old_plane_state)
-{
-	struct intel_display *display = to_intel_display(plane_state);
-	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
-	const struct intel_framebuffer *fb =
-		to_intel_framebuffer(plane_state->hw.fb);
-	struct i915_vma *ggtt_vma = NULL;
-	struct i915_vma *dpt_vma = NULL;
-	int fence_id = -1;
-	u32 offset;
-	int ret;
-
-	if (!intel_fb_uses_dpt(&fb->base)) {
-		struct intel_fb_pin_params pin_params = {
-			.view = &plane_state->view.gtt,
-			.alignment = intel_plane_fb_min_alignment(plane_state),
-			.phys_alignment = intel_plane_fb_min_phys_alignment(plane_state),
-			.vtd_guard = intel_plane_fb_vtd_guard(plane_state),
-			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
-			.needs_low_address = intel_plane_needs_low_address(display),
-			.needs_physical = intel_plane_needs_physical(plane),
-			.needs_fence = intel_plane_needs_fence(display),
-		};
-
-		ret = intel_parent_fb_pin_ggtt_pin(display, intel_fb_bo(&fb->base),
-						   &pin_params, &ggtt_vma, &offset,
-						   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
-		if (ret)
-			return ret;
-	} else {
-		struct intel_fb_pin_params pin_params = {
-			.view = &plane_state->view.gtt,
-			.alignment = intel_plane_fb_min_alignment(plane_state),
-			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
-		};
-
-		ret = intel_parent_fb_pin_dpt_pin(display, intel_fb_bo(&fb->base),
-						  fb->dpt, &pin_params,
-						  &dpt_vma, &ggtt_vma, &offset);
-		if (ret)
-			return ret;
-	}
-
-	plane_state->dpt_vma = dpt_vma;
-	plane_state->ggtt_vma = ggtt_vma;
-	plane_state->fence_id = fence_id;
-	plane_state->surf = offset + plane->surf_offset(plane_state);
-
-	return 0;
-}
-
-void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
-{
-	struct intel_display *display = to_intel_display(old_plane_state);
-	const struct intel_framebuffer *fb =
-		to_intel_framebuffer(old_plane_state->hw.fb);
-
-	if (!intel_fb_uses_dpt(&fb->base)) {
-		intel_parent_fb_pin_ggtt_unpin(display,
-					       old_plane_state->ggtt_vma,
-					       old_plane_state->fence_id);
-
-		old_plane_state->ggtt_vma = NULL;
-		old_plane_state->fence_id = -1;
-	} else {
-		intel_parent_fb_pin_dpt_unpin(display, fb->dpt,
-					      old_plane_state->dpt_vma,
-					      old_plane_state->ggtt_vma);
-
-		old_plane_state->dpt_vma = NULL;
-		old_plane_state->ggtt_vma = NULL;
-	}
-}
-
 static void i915_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
 {
 	iosys_map_set_vaddr_iomem(map, i915_vma_get_iomap(vma));
diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index c92c30ceba36..19f4d45f5acb 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -6,11 +6,12 @@
 #include <drm/intel/display_parent_interface.h>
 #include <drm/ttm/ttm_bo.h>
 
-#include "intel_display_core.h"
-#include "intel_display_types.h"
+/* FIXME move the types to parent interface? */
+#include "i915_gtt_view_types.h"
+
+/* FIXME move intel_remapped_info_size() & co. to parent interface? */
 #include "intel_fb.h"
-#include "intel_fb_pin.h"
-#include "intel_parent.h"
+
 #include "xe_bo.h"
 #include "xe_device.h"
 #include "xe_display_vma.h"
@@ -491,79 +492,6 @@ xe_fb_pin_reuse_vma(struct i915_vma *old_ggtt_vma,
 	return NULL;
 }
 
-int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
-		       const struct intel_plane_state *old_plane_state)
-{
-	struct intel_display *display = to_intel_display(new_plane_state);
-	const struct intel_framebuffer *fb = to_intel_framebuffer(new_plane_state->hw.fb);
-	const struct intel_framebuffer *old_fb = to_intel_framebuffer(old_plane_state->hw.fb);
-	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
-	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
-	struct intel_fb_pin_params pin_params = {
-		.view = &new_plane_state->view.gtt,
-		.alignment = plane->min_alignment(plane, &fb->base, 0),
-		.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
-	};
-	struct i915_vma *ggtt_vma = NULL;
-	struct i915_vma *dpt_vma = NULL;
-	int fence_id = -1;
-	u32 offset;
-	int ret;
-
-	ggtt_vma = intel_parent_fb_pin_reuse_vma(display,
-						 old_plane_state->ggtt_vma,
-						 intel_fb_bo(&old_fb->base),
-						 &old_plane_state->view.gtt,
-						 intel_fb_bo(&fb->base),
-						 &new_plane_state->view.gtt,
-						 &offset);
-	if (ggtt_vma)
-		goto got_vma;
-
-	if (!intel_fb_uses_dpt(&fb->base)) {
-		ret = intel_parent_fb_pin_ggtt_pin(display, obj, &pin_params,
-						   &ggtt_vma, &offset, NULL);
-		if (ret)
-			return ret;
-	} else {
-		ret = intel_parent_fb_pin_dpt_pin(display, obj, fb->dpt,
-						  &pin_params, &dpt_vma,
-						  &ggtt_vma, &offset);
-		if (ret)
-			return ret;
-	}
-
-got_vma:
-	new_plane_state->dpt_vma = dpt_vma;
-	new_plane_state->ggtt_vma = ggtt_vma;
-	new_plane_state->fence_id = fence_id;
-	new_plane_state->surf = offset + plane->surf_offset(new_plane_state);
-
-	return 0;
-}
-
-void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
-{
-	struct intel_display *display = to_intel_display(old_plane_state);
-	const struct intel_framebuffer *fb = to_intel_framebuffer(old_plane_state->hw.fb);
-
-	if (!intel_fb_uses_dpt(&fb->base)) {
-		intel_parent_fb_pin_ggtt_unpin(display,
-					       old_plane_state->ggtt_vma,
-					       old_plane_state->fence_id);
-
-		old_plane_state->ggtt_vma = NULL;
-		old_plane_state->fence_id = -1;
-	} else {
-		intel_parent_fb_pin_dpt_unpin(display, fb->dpt,
-					      old_plane_state->dpt_vma,
-					      old_plane_state->ggtt_vma);
-
-		old_plane_state->dpt_vma = NULL;
-		old_plane_state->ggtt_vma = NULL;
-	}
-}
-
 static void xe_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
 {
 	*map = vma->bo->vmap;
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* ✗ CI.checkpatch: warning for drm/i915: Introduce 'fb_pin' parent interface
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (15 preceding siblings ...)
  2026-04-23 16:53 ` [PATCH 16/16] drm/i915: Consolidate the intel_plane_(un)pin_fb() implementations Ville Syrjala
@ 2026-04-23 17:01 ` Patchwork
  2026-04-23 17:02 ` ✓ CI.KUnit: success " Patchwork
  17 siblings, 0 replies; 36+ messages in thread
From: Patchwork @ 2026-04-23 17:01 UTC (permalink / raw)
  To: Ville Syrjala; +Cc: intel-xe

== Series Details ==

Series: drm/i915: Introduce 'fb_pin' parent interface
URL   : https://patchwork.freedesktop.org/series/165375/
State : warning

== Summary ==

+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
1f57ba1afceae32108bd24770069f764d940a0e4
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 5b6d72673d7f106cfb3c6d560569d252ad5e900a
Author: Ville Syrjälä <ville.syrjala@linux.intel.com>
Date:   Thu Apr 23 19:53:45 2026 +0300

    drm/i915: Consolidate the intel_plane_(un)pin_fb() implementations
    
    Currently i915 and each implement their own versions of
    intel_plane_(un)pin(). Now that we have the fb_pin parent
    interface we can consolidate this to a single implementation.
    
    The result is a mixture of the i915 and xe implementations.
    The reuse_vma() hack comes from xe (and i915 doesn't implement
    that part of the parent interface, and the pin_params are
    taken from i915 since the platforms supported by i915 need
    more things.
    
    Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
+ /mt/dim checkpatch ecb61ba4a1f619b6944f4d0741b4d8a0910f460c drm-intel
262062016afd drm/i915: Introduce intel_parent_fb_pin_get_map()
-:194: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#194: 
new file mode 100644

total: 0 errors, 1 warnings, 0 checks, 210 lines checked
81029742724d drm/i915: Move intel_fb_pin_params to the parent interface
d58fbaf7ff89 drm/i915: Move the i915_dpt_offset()==0 assert
40e53510efb1 drm/i915: Reorganize intel_plane_pin_fb() a bit
-:43: WARNING:LONG_LINE: line length of 104 exceeds 100 columns
#43: FILE: drivers/gpu/drm/i915/i915_fb_pin.c:285:
+						intel_plane_uses_fence(plane_state) ? &fence_id : NULL);

total: 0 errors, 1 warnings, 0 checks, 94 lines checked
a1109ab4e774 drm/i915: Introduce i915_fb_pin_dpt_(un)pin()
8a1e9a424645 drm/i915: Introduce i915_fb_pin_ggtt_(un)pin()
fec2d7ea2214 drm/xe: Move the FORCE_WC assert into __xe_pin_fb_vma()
4b02e76fc115 drm/xe: Kill the fbdev vma reuse hack
d23d915a8094 drm/xe: Reorganize intel_plane_pin_fb() a bit
cf3c3010a9b7 drm/xe: Introduce xe_fb_pin_dpt_(un)pin()
f56f277f9ddb drm/xe: Introduce xe_fb_pin_ggtt_(un)pin()
798d5b2d7063 drm/xe: Restructure reuse_vma()
1bf934097f28 drm/i915: Introduce the main fb_pin parent interface
-:151: WARNING:LONG_LINE: line length of 107 exceeds 100 columns
#151: FILE: drivers/gpu/drm/i915/i915_fb_pin.c:366:
+						   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);

total: 0 errors, 1 warnings, 0 checks, 280 lines checked
867a9c240ce4 drm/i915/fbdev: Use intel_parent_fb_pin_ggtt_(un)pin()
dcee7ec11d8e drm/xe: Use xe_fb_pin_ggtt_pin() for the initial FB pin
5b6d72673d7f drm/i915: Consolidate the intel_plane_(un)pin_fb() implementations
-:35: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#35: 
deleted file mode 100644

-:159: WARNING:LONG_LINE: line length of 107 exceeds 100 columns
#159: FILE: drivers/gpu/drm/i915/display/intel_plane.c:1262:
+						   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);

total: 0 errors, 2 warnings, 0 checks, 389 lines checked



^ permalink raw reply	[flat|nested] 36+ messages in thread

* ✓ CI.KUnit: success for drm/i915: Introduce 'fb_pin' parent interface
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (16 preceding siblings ...)
  2026-04-23 17:01 ` ✗ CI.checkpatch: warning for drm/i915: Introduce 'fb_pin' parent interface Patchwork
@ 2026-04-23 17:02 ` Patchwork
  17 siblings, 0 replies; 36+ messages in thread
From: Patchwork @ 2026-04-23 17:02 UTC (permalink / raw)
  To: Ville Syrjala; +Cc: intel-xe

== Series Details ==

Series: drm/i915: Introduce 'fb_pin' parent interface
URL   : https://patchwork.freedesktop.org/series/165375/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[17:01:06] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[17:01:11] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[17:01:42] Starting KUnit Kernel (1/1)...
[17:01:42] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[17:01:42] ================== guc_buf (11 subtests) ===================
[17:01:42] [PASSED] test_smallest
[17:01:42] [PASSED] test_largest
[17:01:42] [PASSED] test_granular
[17:01:42] [PASSED] test_unique
[17:01:42] [PASSED] test_overlap
[17:01:42] [PASSED] test_reusable
[17:01:42] [PASSED] test_too_big
[17:01:42] [PASSED] test_flush
[17:01:42] [PASSED] test_lookup
[17:01:42] [PASSED] test_data
[17:01:42] [PASSED] test_class
[17:01:42] ===================== [PASSED] guc_buf =====================
[17:01:42] =================== guc_dbm (7 subtests) ===================
[17:01:42] [PASSED] test_empty
[17:01:42] [PASSED] test_default
[17:01:42] ======================== test_size  ========================
[17:01:42] [PASSED] 4
[17:01:42] [PASSED] 8
[17:01:42] [PASSED] 32
[17:01:42] [PASSED] 256
[17:01:42] ==================== [PASSED] test_size ====================
[17:01:42] ======================= test_reuse  ========================
[17:01:42] [PASSED] 4
[17:01:42] [PASSED] 8
[17:01:42] [PASSED] 32
[17:01:42] [PASSED] 256
[17:01:42] =================== [PASSED] test_reuse ====================
[17:01:42] =================== test_range_overlap  ====================
[17:01:42] [PASSED] 4
[17:01:42] [PASSED] 8
[17:01:42] [PASSED] 32
[17:01:42] [PASSED] 256
[17:01:42] =============== [PASSED] test_range_overlap ================
[17:01:42] =================== test_range_compact  ====================
[17:01:42] [PASSED] 4
[17:01:42] [PASSED] 8
[17:01:42] [PASSED] 32
[17:01:42] [PASSED] 256
[17:01:42] =============== [PASSED] test_range_compact ================
[17:01:42] ==================== test_range_spare  =====================
[17:01:42] [PASSED] 4
[17:01:42] [PASSED] 8
[17:01:42] [PASSED] 32
[17:01:42] [PASSED] 256
[17:01:42] ================ [PASSED] test_range_spare =================
[17:01:42] ===================== [PASSED] guc_dbm =====================
[17:01:42] =================== guc_idm (6 subtests) ===================
[17:01:42] [PASSED] bad_init
[17:01:42] [PASSED] no_init
[17:01:42] [PASSED] init_fini
[17:01:42] [PASSED] check_used
[17:01:42] [PASSED] check_quota
[17:01:42] [PASSED] check_all
[17:01:42] ===================== [PASSED] guc_idm =====================
[17:01:42] ================== no_relay (3 subtests) ===================
[17:01:42] [PASSED] xe_drops_guc2pf_if_not_ready
[17:01:42] [PASSED] xe_drops_guc2vf_if_not_ready
[17:01:42] [PASSED] xe_rejects_send_if_not_ready
[17:01:42] ==================== [PASSED] no_relay =====================
[17:01:42] ================== pf_relay (14 subtests) ==================
[17:01:42] [PASSED] pf_rejects_guc2pf_too_short
[17:01:42] [PASSED] pf_rejects_guc2pf_too_long
[17:01:42] [PASSED] pf_rejects_guc2pf_no_payload
[17:01:42] [PASSED] pf_fails_no_payload
[17:01:42] [PASSED] pf_fails_bad_origin
[17:01:42] [PASSED] pf_fails_bad_type
[17:01:42] [PASSED] pf_txn_reports_error
[17:01:42] [PASSED] pf_txn_sends_pf2guc
[17:01:42] [PASSED] pf_sends_pf2guc
[17:01:42] [SKIPPED] pf_loopback_nop
[17:01:42] [SKIPPED] pf_loopback_echo
[17:01:42] [SKIPPED] pf_loopback_fail
[17:01:42] [SKIPPED] pf_loopback_busy
[17:01:42] [SKIPPED] pf_loopback_retry
[17:01:42] ==================== [PASSED] pf_relay =====================
[17:01:42] ================== vf_relay (3 subtests) ===================
[17:01:42] [PASSED] vf_rejects_guc2vf_too_short
[17:01:42] [PASSED] vf_rejects_guc2vf_too_long
[17:01:42] [PASSED] vf_rejects_guc2vf_no_payload
[17:01:42] ==================== [PASSED] vf_relay =====================
[17:01:42] ================ pf_gt_config (9 subtests) =================
[17:01:42] [PASSED] fair_contexts_1vf
[17:01:42] [PASSED] fair_doorbells_1vf
[17:01:42] [PASSED] fair_ggtt_1vf
[17:01:42] ====================== fair_vram_1vf  ======================
[17:01:42] [PASSED] 3.50 GiB
[17:01:42] [PASSED] 11.5 GiB
[17:01:42] [PASSED] 15.5 GiB
[17:01:42] [PASSED] 31.5 GiB
[17:01:42] [PASSED] 63.5 GiB
[17:01:42] [PASSED] 1.91 GiB
[17:01:42] ================== [PASSED] fair_vram_1vf ==================
[17:01:42] ================ fair_vram_1vf_admin_only  =================
[17:01:42] [PASSED] 3.50 GiB
[17:01:42] [PASSED] 11.5 GiB
[17:01:42] [PASSED] 15.5 GiB
[17:01:42] [PASSED] 31.5 GiB
[17:01:42] [PASSED] 63.5 GiB
[17:01:42] [PASSED] 1.91 GiB
[17:01:42] ============ [PASSED] fair_vram_1vf_admin_only =============
[17:01:42] ====================== fair_contexts  ======================
[17:01:42] [PASSED] 1 VF
[17:01:42] [PASSED] 2 VFs
[17:01:42] [PASSED] 3 VFs
[17:01:42] [PASSED] 4 VFs
[17:01:42] [PASSED] 5 VFs
[17:01:42] [PASSED] 6 VFs
[17:01:42] [PASSED] 7 VFs
[17:01:42] [PASSED] 8 VFs
[17:01:42] [PASSED] 9 VFs
[17:01:42] [PASSED] 10 VFs
[17:01:42] [PASSED] 11 VFs
[17:01:42] [PASSED] 12 VFs
[17:01:42] [PASSED] 13 VFs
[17:01:42] [PASSED] 14 VFs
[17:01:42] [PASSED] 15 VFs
[17:01:42] [PASSED] 16 VFs
[17:01:42] [PASSED] 17 VFs
[17:01:42] [PASSED] 18 VFs
[17:01:42] [PASSED] 19 VFs
[17:01:42] [PASSED] 20 VFs
[17:01:42] [PASSED] 21 VFs
[17:01:42] [PASSED] 22 VFs
[17:01:42] [PASSED] 23 VFs
[17:01:42] [PASSED] 24 VFs
[17:01:42] [PASSED] 25 VFs
[17:01:42] [PASSED] 26 VFs
[17:01:42] [PASSED] 27 VFs
[17:01:42] [PASSED] 28 VFs
[17:01:42] [PASSED] 29 VFs
[17:01:42] [PASSED] 30 VFs
[17:01:42] [PASSED] 31 VFs
[17:01:42] [PASSED] 32 VFs
[17:01:42] [PASSED] 33 VFs
[17:01:42] [PASSED] 34 VFs
[17:01:42] [PASSED] 35 VFs
[17:01:42] [PASSED] 36 VFs
[17:01:42] [PASSED] 37 VFs
[17:01:42] [PASSED] 38 VFs
[17:01:42] [PASSED] 39 VFs
[17:01:42] [PASSED] 40 VFs
[17:01:42] [PASSED] 41 VFs
[17:01:42] [PASSED] 42 VFs
[17:01:42] [PASSED] 43 VFs
[17:01:42] [PASSED] 44 VFs
[17:01:42] [PASSED] 45 VFs
[17:01:42] [PASSED] 46 VFs
[17:01:42] [PASSED] 47 VFs
[17:01:42] [PASSED] 48 VFs
[17:01:42] [PASSED] 49 VFs
[17:01:42] [PASSED] 50 VFs
[17:01:42] [PASSED] 51 VFs
[17:01:42] [PASSED] 52 VFs
[17:01:42] [PASSED] 53 VFs
[17:01:42] [PASSED] 54 VFs
[17:01:42] [PASSED] 55 VFs
[17:01:42] [PASSED] 56 VFs
[17:01:42] [PASSED] 57 VFs
[17:01:42] [PASSED] 58 VFs
[17:01:42] [PASSED] 59 VFs
[17:01:42] [PASSED] 60 VFs
[17:01:42] [PASSED] 61 VFs
[17:01:42] [PASSED] 62 VFs
[17:01:42] [PASSED] 63 VFs
[17:01:42] ================== [PASSED] fair_contexts ==================
[17:01:42] ===================== fair_doorbells  ======================
[17:01:42] [PASSED] 1 VF
[17:01:42] [PASSED] 2 VFs
[17:01:42] [PASSED] 3 VFs
[17:01:42] [PASSED] 4 VFs
[17:01:42] [PASSED] 5 VFs
[17:01:42] [PASSED] 6 VFs
[17:01:42] [PASSED] 7 VFs
[17:01:42] [PASSED] 8 VFs
[17:01:42] [PASSED] 9 VFs
[17:01:42] [PASSED] 10 VFs
[17:01:42] [PASSED] 11 VFs
[17:01:42] [PASSED] 12 VFs
[17:01:42] [PASSED] 13 VFs
[17:01:42] [PASSED] 14 VFs
[17:01:42] [PASSED] 15 VFs
[17:01:42] [PASSED] 16 VFs
[17:01:42] [PASSED] 17 VFs
[17:01:42] [PASSED] 18 VFs
[17:01:42] [PASSED] 19 VFs
[17:01:42] [PASSED] 20 VFs
[17:01:42] [PASSED] 21 VFs
[17:01:42] [PASSED] 22 VFs
[17:01:42] [PASSED] 23 VFs
[17:01:42] [PASSED] 24 VFs
[17:01:42] [PASSED] 25 VFs
[17:01:42] [PASSED] 26 VFs
[17:01:42] [PASSED] 27 VFs
[17:01:42] [PASSED] 28 VFs
[17:01:42] [PASSED] 29 VFs
[17:01:42] [PASSED] 30 VFs
[17:01:42] [PASSED] 31 VFs
[17:01:42] [PASSED] 32 VFs
[17:01:42] [PASSED] 33 VFs
[17:01:42] [PASSED] 34 VFs
[17:01:42] [PASSED] 35 VFs
[17:01:42] [PASSED] 36 VFs
[17:01:42] [PASSED] 37 VFs
[17:01:42] [PASSED] 38 VFs
[17:01:42] [PASSED] 39 VFs
[17:01:42] [PASSED] 40 VFs
[17:01:42] [PASSED] 41 VFs
[17:01:42] [PASSED] 42 VFs
[17:01:42] [PASSED] 43 VFs
[17:01:42] [PASSED] 44 VFs
[17:01:42] [PASSED] 45 VFs
[17:01:42] [PASSED] 46 VFs
[17:01:42] [PASSED] 47 VFs
[17:01:42] [PASSED] 48 VFs
[17:01:42] [PASSED] 49 VFs
[17:01:42] [PASSED] 50 VFs
[17:01:42] [PASSED] 51 VFs
[17:01:42] [PASSED] 52 VFs
[17:01:42] [PASSED] 53 VFs
[17:01:42] [PASSED] 54 VFs
[17:01:42] [PASSED] 55 VFs
[17:01:42] [PASSED] 56 VFs
[17:01:42] [PASSED] 57 VFs
[17:01:42] [PASSED] 58 VFs
[17:01:42] [PASSED] 59 VFs
[17:01:42] [PASSED] 60 VFs
[17:01:42] [PASSED] 61 VFs
[17:01:42] [PASSED] 62 VFs
[17:01:42] [PASSED] 63 VFs
[17:01:42] ================= [PASSED] fair_doorbells ==================
[17:01:42] ======================== fair_ggtt  ========================
[17:01:42] [PASSED] 1 VF
[17:01:42] [PASSED] 2 VFs
[17:01:42] [PASSED] 3 VFs
[17:01:42] [PASSED] 4 VFs
[17:01:42] [PASSED] 5 VFs
[17:01:42] [PASSED] 6 VFs
[17:01:42] [PASSED] 7 VFs
[17:01:42] [PASSED] 8 VFs
[17:01:42] [PASSED] 9 VFs
[17:01:42] [PASSED] 10 VFs
[17:01:42] [PASSED] 11 VFs
[17:01:42] [PASSED] 12 VFs
[17:01:42] [PASSED] 13 VFs
[17:01:42] [PASSED] 14 VFs
[17:01:42] [PASSED] 15 VFs
[17:01:42] [PASSED] 16 VFs
[17:01:42] [PASSED] 17 VFs
[17:01:42] [PASSED] 18 VFs
[17:01:42] [PASSED] 19 VFs
[17:01:42] [PASSED] 20 VFs
[17:01:42] [PASSED] 21 VFs
[17:01:42] [PASSED] 22 VFs
[17:01:42] [PASSED] 23 VFs
[17:01:42] [PASSED] 24 VFs
[17:01:42] [PASSED] 25 VFs
[17:01:42] [PASSED] 26 VFs
[17:01:42] [PASSED] 27 VFs
[17:01:42] [PASSED] 28 VFs
[17:01:42] [PASSED] 29 VFs
[17:01:42] [PASSED] 30 VFs
[17:01:42] [PASSED] 31 VFs
[17:01:42] [PASSED] 32 VFs
[17:01:42] [PASSED] 33 VFs
[17:01:42] [PASSED] 34 VFs
[17:01:42] [PASSED] 35 VFs
[17:01:42] [PASSED] 36 VFs
[17:01:42] [PASSED] 37 VFs
[17:01:42] [PASSED] 38 VFs
[17:01:42] [PASSED] 39 VFs
[17:01:42] [PASSED] 40 VFs
[17:01:42] [PASSED] 41 VFs
[17:01:42] [PASSED] 42 VFs
[17:01:42] [PASSED] 43 VFs
[17:01:42] [PASSED] 44 VFs
[17:01:42] [PASSED] 45 VFs
[17:01:42] [PASSED] 46 VFs
[17:01:42] [PASSED] 47 VFs
[17:01:42] [PASSED] 48 VFs
[17:01:42] [PASSED] 49 VFs
[17:01:42] [PASSED] 50 VFs
[17:01:42] [PASSED] 51 VFs
[17:01:42] [PASSED] 52 VFs
[17:01:42] [PASSED] 53 VFs
[17:01:42] [PASSED] 54 VFs
[17:01:42] [PASSED] 55 VFs
[17:01:42] [PASSED] 56 VFs
[17:01:42] [PASSED] 57 VFs
[17:01:42] [PASSED] 58 VFs
[17:01:42] [PASSED] 59 VFs
[17:01:42] [PASSED] 60 VFs
[17:01:42] [PASSED] 61 VFs
[17:01:42] [PASSED] 62 VFs
[17:01:42] [PASSED] 63 VFs
[17:01:42] ==================== [PASSED] fair_ggtt ====================
[17:01:42] ======================== fair_vram  ========================
[17:01:42] [PASSED] 1 VF
[17:01:42] [PASSED] 2 VFs
[17:01:42] [PASSED] 3 VFs
[17:01:42] [PASSED] 4 VFs
[17:01:42] [PASSED] 5 VFs
[17:01:42] [PASSED] 6 VFs
[17:01:42] [PASSED] 7 VFs
[17:01:42] [PASSED] 8 VFs
[17:01:42] [PASSED] 9 VFs
[17:01:42] [PASSED] 10 VFs
[17:01:42] [PASSED] 11 VFs
[17:01:42] [PASSED] 12 VFs
[17:01:42] [PASSED] 13 VFs
[17:01:42] [PASSED] 14 VFs
[17:01:42] [PASSED] 15 VFs
[17:01:42] [PASSED] 16 VFs
[17:01:42] [PASSED] 17 VFs
[17:01:42] [PASSED] 18 VFs
[17:01:42] [PASSED] 19 VFs
[17:01:42] [PASSED] 20 VFs
[17:01:42] [PASSED] 21 VFs
[17:01:42] [PASSED] 22 VFs
[17:01:42] [PASSED] 23 VFs
[17:01:42] [PASSED] 24 VFs
[17:01:42] [PASSED] 25 VFs
[17:01:42] [PASSED] 26 VFs
[17:01:42] [PASSED] 27 VFs
[17:01:42] [PASSED] 28 VFs
[17:01:42] [PASSED] 29 VFs
[17:01:42] [PASSED] 30 VFs
[17:01:42] [PASSED] 31 VFs
[17:01:42] [PASSED] 32 VFs
[17:01:42] [PASSED] 33 VFs
[17:01:42] [PASSED] 34 VFs
[17:01:42] [PASSED] 35 VFs
[17:01:42] [PASSED] 36 VFs
[17:01:42] [PASSED] 37 VFs
[17:01:42] [PASSED] 38 VFs
[17:01:42] [PASSED] 39 VFs
[17:01:42] [PASSED] 40 VFs
[17:01:42] [PASSED] 41 VFs
[17:01:42] [PASSED] 42 VFs
[17:01:42] [PASSED] 43 VFs
[17:01:42] [PASSED] 44 VFs
[17:01:42] [PASSED] 45 VFs
[17:01:42] [PASSED] 46 VFs
[17:01:42] [PASSED] 47 VFs
[17:01:42] [PASSED] 48 VFs
[17:01:42] [PASSED] 49 VFs
[17:01:42] [PASSED] 50 VFs
[17:01:42] [PASSED] 51 VFs
[17:01:42] [PASSED] 52 VFs
[17:01:42] [PASSED] 53 VFs
[17:01:42] [PASSED] 54 VFs
[17:01:42] [PASSED] 55 VFs
[17:01:42] [PASSED] 56 VFs
[17:01:42] [PASSED] 57 VFs
[17:01:42] [PASSED] 58 VFs
[17:01:42] [PASSED] 59 VFs
[17:01:42] [PASSED] 60 VFs
[17:01:42] [PASSED] 61 VFs
[17:01:42] [PASSED] 62 VFs
[17:01:42] [PASSED] 63 VFs
[17:01:42] ==================== [PASSED] fair_vram ====================
[17:01:42] ================== [PASSED] pf_gt_config ===================
[17:01:42] ===================== lmtt (1 subtest) =====================
[17:01:42] ======================== test_ops  =========================
[17:01:42] [PASSED] 2-level
[17:01:42] [PASSED] multi-level
[17:01:42] ==================== [PASSED] test_ops =====================
[17:01:42] ====================== [PASSED] lmtt =======================
[17:01:42] ================= pf_service (11 subtests) =================
[17:01:42] [PASSED] pf_negotiate_any
[17:01:42] [PASSED] pf_negotiate_base_match
[17:01:42] [PASSED] pf_negotiate_base_newer
[17:01:42] [PASSED] pf_negotiate_base_next
[17:01:42] [SKIPPED] pf_negotiate_base_older
[17:01:42] [PASSED] pf_negotiate_base_prev
[17:01:42] [PASSED] pf_negotiate_latest_match
[17:01:42] [PASSED] pf_negotiate_latest_newer
[17:01:42] [PASSED] pf_negotiate_latest_next
[17:01:42] [SKIPPED] pf_negotiate_latest_older
[17:01:42] [SKIPPED] pf_negotiate_latest_prev
[17:01:42] =================== [PASSED] pf_service ====================
[17:01:42] ================= xe_guc_g2g (2 subtests) ==================
[17:01:42] ============== xe_live_guc_g2g_kunit_default  ==============
[17:01:42] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[17:01:42] ============== xe_live_guc_g2g_kunit_allmem  ===============
[17:01:42] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[17:01:42] =================== [SKIPPED] xe_guc_g2g ===================
[17:01:42] =================== xe_mocs (2 subtests) ===================
[17:01:42] ================ xe_live_mocs_kernel_kunit  ================
[17:01:42] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[17:01:42] ================ xe_live_mocs_reset_kunit  =================
[17:01:42] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[17:01:42] ==================== [SKIPPED] xe_mocs =====================
[17:01:42] ================= xe_migrate (2 subtests) ==================
[17:01:42] ================= xe_migrate_sanity_kunit  =================
[17:01:42] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[17:01:42] ================== xe_validate_ccs_kunit  ==================
[17:01:42] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[17:01:42] =================== [SKIPPED] xe_migrate ===================
[17:01:42] ================== xe_dma_buf (1 subtest) ==================
[17:01:42] ==================== xe_dma_buf_kunit  =====================
[17:01:42] ================ [SKIPPED] xe_dma_buf_kunit ================
[17:01:42] =================== [SKIPPED] xe_dma_buf ===================
[17:01:42] ================= xe_bo_shrink (1 subtest) =================
[17:01:42] =================== xe_bo_shrink_kunit  ====================
[17:01:42] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[17:01:42] ================== [SKIPPED] xe_bo_shrink ==================
[17:01:42] ==================== xe_bo (2 subtests) ====================
[17:01:42] ================== xe_ccs_migrate_kunit  ===================
[17:01:42] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[17:01:42] ==================== xe_bo_evict_kunit  ====================
[17:01:42] =============== [SKIPPED] xe_bo_evict_kunit ================
[17:01:42] ===================== [SKIPPED] xe_bo ======================
[17:01:42] ==================== args (13 subtests) ====================
[17:01:42] [PASSED] count_args_test
[17:01:42] [PASSED] call_args_example
[17:01:42] [PASSED] call_args_test
[17:01:42] [PASSED] drop_first_arg_example
[17:01:42] [PASSED] drop_first_arg_test
[17:01:42] [PASSED] first_arg_example
[17:01:42] [PASSED] first_arg_test
[17:01:42] [PASSED] last_arg_example
[17:01:42] [PASSED] last_arg_test
[17:01:42] [PASSED] pick_arg_example
[17:01:42] [PASSED] if_args_example
[17:01:42] [PASSED] if_args_test
[17:01:42] [PASSED] sep_comma_example
[17:01:42] ====================== [PASSED] args =======================
[17:01:42] =================== xe_pci (3 subtests) ====================
[17:01:42] ==================== check_graphics_ip  ====================
[17:01:42] [PASSED] 12.00 Xe_LP
[17:01:42] [PASSED] 12.10 Xe_LP+
[17:01:42] [PASSED] 12.55 Xe_HPG
[17:01:42] [PASSED] 12.60 Xe_HPC
[17:01:42] [PASSED] 12.70 Xe_LPG
[17:01:42] [PASSED] 12.71 Xe_LPG
[17:01:42] [PASSED] 12.74 Xe_LPG+
[17:01:42] [PASSED] 20.01 Xe2_HPG
[17:01:42] [PASSED] 20.02 Xe2_HPG
[17:01:42] [PASSED] 20.04 Xe2_LPG
[17:01:42] [PASSED] 30.00 Xe3_LPG
[17:01:42] [PASSED] 30.01 Xe3_LPG
[17:01:42] [PASSED] 30.03 Xe3_LPG
[17:01:42] [PASSED] 30.04 Xe3_LPG
[17:01:42] [PASSED] 30.05 Xe3_LPG
[17:01:42] [PASSED] 35.10 Xe3p_LPG
[17:01:42] [PASSED] 35.11 Xe3p_XPC
[17:01:42] ================ [PASSED] check_graphics_ip ================
[17:01:42] ===================== check_media_ip  ======================
[17:01:42] [PASSED] 12.00 Xe_M
[17:01:42] [PASSED] 12.55 Xe_HPM
[17:01:42] [PASSED] 13.00 Xe_LPM+
[17:01:42] [PASSED] 13.01 Xe2_HPM
[17:01:42] [PASSED] 20.00 Xe2_LPM
[17:01:42] [PASSED] 30.00 Xe3_LPM
[17:01:42] [PASSED] 30.02 Xe3_LPM
[17:01:42] [PASSED] 35.00 Xe3p_LPM
[17:01:42] [PASSED] 35.03 Xe3p_HPM
[17:01:42] ================= [PASSED] check_media_ip ==================
[17:01:42] =================== check_platform_desc  ===================
[17:01:42] [PASSED] 0x9A60 (TIGERLAKE)
[17:01:42] [PASSED] 0x9A68 (TIGERLAKE)
[17:01:42] [PASSED] 0x9A70 (TIGERLAKE)
[17:01:42] [PASSED] 0x9A40 (TIGERLAKE)
[17:01:42] [PASSED] 0x9A49 (TIGERLAKE)
[17:01:42] [PASSED] 0x9A59 (TIGERLAKE)
[17:01:42] [PASSED] 0x9A78 (TIGERLAKE)
[17:01:42] [PASSED] 0x9AC0 (TIGERLAKE)
[17:01:42] [PASSED] 0x9AC9 (TIGERLAKE)
[17:01:42] [PASSED] 0x9AD9 (TIGERLAKE)
[17:01:42] [PASSED] 0x9AF8 (TIGERLAKE)
[17:01:42] [PASSED] 0x4C80 (ROCKETLAKE)
[17:01:42] [PASSED] 0x4C8A (ROCKETLAKE)
[17:01:42] [PASSED] 0x4C8B (ROCKETLAKE)
[17:01:42] [PASSED] 0x4C8C (ROCKETLAKE)
[17:01:42] [PASSED] 0x4C90 (ROCKETLAKE)
[17:01:42] [PASSED] 0x4C9A (ROCKETLAKE)
[17:01:42] [PASSED] 0x4680 (ALDERLAKE_S)
[17:01:42] [PASSED] 0x4682 (ALDERLAKE_S)
[17:01:42] [PASSED] 0x4688 (ALDERLAKE_S)
[17:01:42] [PASSED] 0x468A (ALDERLAKE_S)
[17:01:42] [PASSED] 0x468B (ALDERLAKE_S)
[17:01:42] [PASSED] 0x4690 (ALDERLAKE_S)
[17:01:42] [PASSED] 0x4692 (ALDERLAKE_S)
[17:01:42] [PASSED] 0x4693 (ALDERLAKE_S)
[17:01:42] [PASSED] 0x46A0 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46A1 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46A2 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46A3 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46A6 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46A8 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46AA (ALDERLAKE_P)
[17:01:42] [PASSED] 0x462A (ALDERLAKE_P)
[17:01:42] [PASSED] 0x4626 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x4628 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46B0 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46B1 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46B2 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46B3 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46C0 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46C1 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46C2 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46C3 (ALDERLAKE_P)
[17:01:42] [PASSED] 0x46D0 (ALDERLAKE_N)
[17:01:42] [PASSED] 0x46D1 (ALDERLAKE_N)
[17:01:42] [PASSED] 0x46D2 (ALDERLAKE_N)
[17:01:42] [PASSED] 0x46D3 (ALDERLAKE_N)
[17:01:42] [PASSED] 0x46D4 (ALDERLAKE_N)
[17:01:42] [PASSED] 0xA721 (ALDERLAKE_P)
[17:01:42] [PASSED] 0xA7A1 (ALDERLAKE_P)
[17:01:42] [PASSED] 0xA7A9 (ALDERLAKE_P)
[17:01:42] [PASSED] 0xA7AC (ALDERLAKE_P)
[17:01:42] [PASSED] 0xA7AD (ALDERLAKE_P)
[17:01:42] [PASSED] 0xA720 (ALDERLAKE_P)
[17:01:42] [PASSED] 0xA7A0 (ALDERLAKE_P)
[17:01:42] [PASSED] 0xA7A8 (ALDERLAKE_P)
[17:01:42] [PASSED] 0xA7AA (ALDERLAKE_P)
[17:01:42] [PASSED] 0xA7AB (ALDERLAKE_P)
[17:01:42] [PASSED] 0xA780 (ALDERLAKE_S)
[17:01:42] [PASSED] 0xA781 (ALDERLAKE_S)
[17:01:42] [PASSED] 0xA782 (ALDERLAKE_S)
[17:01:42] [PASSED] 0xA783 (ALDERLAKE_S)
[17:01:42] [PASSED] 0xA788 (ALDERLAKE_S)
[17:01:42] [PASSED] 0xA789 (ALDERLAKE_S)
[17:01:42] [PASSED] 0xA78A (ALDERLAKE_S)
[17:01:42] [PASSED] 0xA78B (ALDERLAKE_S)
[17:01:42] [PASSED] 0x4905 (DG1)
[17:01:42] [PASSED] 0x4906 (DG1)
[17:01:42] [PASSED] 0x4907 (DG1)
[17:01:42] [PASSED] 0x4908 (DG1)
[17:01:42] [PASSED] 0x4909 (DG1)
[17:01:42] [PASSED] 0x56C0 (DG2)
[17:01:42] [PASSED] 0x56C2 (DG2)
[17:01:42] [PASSED] 0x56C1 (DG2)
[17:01:42] [PASSED] 0x7D51 (METEORLAKE)
[17:01:42] [PASSED] 0x7DD1 (METEORLAKE)
[17:01:42] [PASSED] 0x7D41 (METEORLAKE)
[17:01:42] [PASSED] 0x7D67 (METEORLAKE)
[17:01:42] [PASSED] 0xB640 (METEORLAKE)
[17:01:42] [PASSED] 0x56A0 (DG2)
[17:01:42] [PASSED] 0x56A1 (DG2)
[17:01:42] [PASSED] 0x56A2 (DG2)
[17:01:42] [PASSED] 0x56BE (DG2)
[17:01:42] [PASSED] 0x56BF (DG2)
[17:01:42] [PASSED] 0x5690 (DG2)
[17:01:42] [PASSED] 0x5691 (DG2)
[17:01:42] [PASSED] 0x5692 (DG2)
[17:01:42] [PASSED] 0x56A5 (DG2)
[17:01:42] [PASSED] 0x56A6 (DG2)
[17:01:42] [PASSED] 0x56B0 (DG2)
[17:01:42] [PASSED] 0x56B1 (DG2)
[17:01:42] [PASSED] 0x56BA (DG2)
[17:01:42] [PASSED] 0x56BB (DG2)
[17:01:42] [PASSED] 0x56BC (DG2)
[17:01:42] [PASSED] 0x56BD (DG2)
[17:01:42] [PASSED] 0x5693 (DG2)
[17:01:42] [PASSED] 0x5694 (DG2)
[17:01:42] [PASSED] 0x5695 (DG2)
[17:01:42] [PASSED] 0x56A3 (DG2)
[17:01:42] [PASSED] 0x56A4 (DG2)
[17:01:42] [PASSED] 0x56B2 (DG2)
[17:01:42] [PASSED] 0x56B3 (DG2)
[17:01:42] [PASSED] 0x5696 (DG2)
[17:01:42] [PASSED] 0x5697 (DG2)
[17:01:42] [PASSED] 0xB69 (PVC)
[17:01:42] [PASSED] 0xB6E (PVC)
[17:01:42] [PASSED] 0xBD4 (PVC)
[17:01:42] [PASSED] 0xBD5 (PVC)
[17:01:42] [PASSED] 0xBD6 (PVC)
[17:01:42] [PASSED] 0xBD7 (PVC)
[17:01:42] [PASSED] 0xBD8 (PVC)
[17:01:42] [PASSED] 0xBD9 (PVC)
[17:01:42] [PASSED] 0xBDA (PVC)
[17:01:42] [PASSED] 0xBDB (PVC)
[17:01:42] [PASSED] 0xBE0 (PVC)
[17:01:42] [PASSED] 0xBE1 (PVC)
[17:01:42] [PASSED] 0xBE5 (PVC)
[17:01:42] [PASSED] 0x7D40 (METEORLAKE)
[17:01:42] [PASSED] 0x7D45 (METEORLAKE)
[17:01:42] [PASSED] 0x7D55 (METEORLAKE)
[17:01:42] [PASSED] 0x7D60 (METEORLAKE)
[17:01:42] [PASSED] 0x7DD5 (METEORLAKE)
[17:01:42] [PASSED] 0x6420 (LUNARLAKE)
[17:01:42] [PASSED] 0x64A0 (LUNARLAKE)
[17:01:42] [PASSED] 0x64B0 (LUNARLAKE)
[17:01:42] [PASSED] 0xE202 (BATTLEMAGE)
[17:01:42] [PASSED] 0xE209 (BATTLEMAGE)
[17:01:42] [PASSED] 0xE20B (BATTLEMAGE)
[17:01:42] [PASSED] 0xE20C (BATTLEMAGE)
[17:01:42] [PASSED] 0xE20D (BATTLEMAGE)
[17:01:42] [PASSED] 0xE210 (BATTLEMAGE)
[17:01:42] [PASSED] 0xE211 (BATTLEMAGE)
[17:01:42] [PASSED] 0xE212 (BATTLEMAGE)
[17:01:42] [PASSED] 0xE216 (BATTLEMAGE)
[17:01:42] [PASSED] 0xE220 (BATTLEMAGE)
[17:01:42] [PASSED] 0xE221 (BATTLEMAGE)
[17:01:42] [PASSED] 0xE222 (BATTLEMAGE)
[17:01:42] [PASSED] 0xE223 (BATTLEMAGE)
[17:01:42] [PASSED] 0xB080 (PANTHERLAKE)
[17:01:42] [PASSED] 0xB081 (PANTHERLAKE)
[17:01:42] [PASSED] 0xB082 (PANTHERLAKE)
[17:01:42] [PASSED] 0xB083 (PANTHERLAKE)
[17:01:42] [PASSED] 0xB084 (PANTHERLAKE)
[17:01:42] [PASSED] 0xB085 (PANTHERLAKE)
[17:01:42] [PASSED] 0xB086 (PANTHERLAKE)
[17:01:42] [PASSED] 0xB087 (PANTHERLAKE)
[17:01:42] [PASSED] 0xB08F (PANTHERLAKE)
[17:01:42] [PASSED] 0xB090 (PANTHERLAKE)
[17:01:42] [PASSED] 0xB0A0 (PANTHERLAKE)
[17:01:42] [PASSED] 0xB0B0 (PANTHERLAKE)
[17:01:42] [PASSED] 0xFD80 (PANTHERLAKE)
[17:01:42] [PASSED] 0xFD81 (PANTHERLAKE)
[17:01:42] [PASSED] 0xD740 (NOVALAKE_S)
[17:01:42] [PASSED] 0xD741 (NOVALAKE_S)
[17:01:42] [PASSED] 0xD742 (NOVALAKE_S)
[17:01:42] [PASSED] 0xD743 (NOVALAKE_S)
[17:01:42] [PASSED] 0xD744 (NOVALAKE_S)
[17:01:42] [PASSED] 0xD745 (NOVALAKE_S)
[17:01:42] [PASSED] 0x674C (CRESCENTISLAND)
[17:01:42] [PASSED] 0xD750 (NOVALAKE_P)
[17:01:42] [PASSED] 0xD751 (NOVALAKE_P)
[17:01:42] [PASSED] 0xD752 (NOVALAKE_P)
[17:01:42] [PASSED] 0xD753 (NOVALAKE_P)
[17:01:42] [PASSED] 0xD754 (NOVALAKE_P)
[17:01:42] [PASSED] 0xD755 (NOVALAKE_P)
[17:01:42] [PASSED] 0xD756 (NOVALAKE_P)
[17:01:42] [PASSED] 0xD757 (NOVALAKE_P)
[17:01:42] [PASSED] 0xD75F (NOVALAKE_P)
[17:01:42] =============== [PASSED] check_platform_desc ===============
[17:01:42] ===================== [PASSED] xe_pci ======================
[17:01:42] =================== xe_rtp (2 subtests) ====================
[17:01:42] =============== xe_rtp_process_to_sr_tests  ================
[17:01:42] [PASSED] coalesce-same-reg
[17:01:42] [PASSED] no-match-no-add
[17:01:42] [PASSED] match-or
[17:01:42] [PASSED] match-or-xfail
[17:01:42] [PASSED] no-match-no-add-multiple-rules
[17:01:42] [PASSED] two-regs-two-entries
[17:01:42] [PASSED] clr-one-set-other
[17:01:42] [PASSED] set-field
[17:01:42] [PASSED] conflict-duplicate
stty: 'standard input': Inappropriate ioctl for device
[17:01:42] [PASSED] conflict-not-disjoint
[17:01:42] [PASSED] conflict-reg-type
[17:01:42] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[17:01:42] ================== xe_rtp_process_tests  ===================
[17:01:42] [PASSED] active1
[17:01:42] [PASSED] active2
[17:01:42] [PASSED] active-inactive
[17:01:42] [PASSED] inactive-active
[17:01:42] [PASSED] inactive-1st_or_active-inactive
[17:01:42] [PASSED] inactive-2nd_or_active-inactive
[17:01:42] [PASSED] inactive-last_or_active-inactive
[17:01:42] [PASSED] inactive-no_or_active-inactive
[17:01:42] ============== [PASSED] xe_rtp_process_tests ===============
[17:01:42] ===================== [PASSED] xe_rtp ======================
[17:01:42] ==================== xe_wa (1 subtest) =====================
[17:01:42] ======================== xe_wa_gt  =========================
[17:01:42] [PASSED] TIGERLAKE B0
[17:01:42] [PASSED] DG1 A0
[17:01:42] [PASSED] DG1 B0
[17:01:42] [PASSED] ALDERLAKE_S A0
[17:01:42] [PASSED] ALDERLAKE_S B0
[17:01:42] [PASSED] ALDERLAKE_S C0
[17:01:42] [PASSED] ALDERLAKE_S D0
[17:01:42] [PASSED] ALDERLAKE_P A0
[17:01:42] [PASSED] ALDERLAKE_P B0
[17:01:42] [PASSED] ALDERLAKE_P C0
[17:01:42] [PASSED] ALDERLAKE_S RPLS D0
[17:01:42] [PASSED] ALDERLAKE_P RPLU E0
[17:01:42] [PASSED] DG2 G10 C0
[17:01:42] [PASSED] DG2 G11 B1
[17:01:42] [PASSED] DG2 G12 A1
[17:01:42] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[17:01:42] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[17:01:42] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[17:01:42] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[17:01:42] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[17:01:42] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[17:01:42] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[17:01:42] ==================== [PASSED] xe_wa_gt =====================
[17:01:42] ====================== [PASSED] xe_wa ======================
[17:01:42] ============================================================
[17:01:42] Testing complete. Ran 597 tests: passed: 579, skipped: 18
[17:01:42] Elapsed time: 35.827s total, 4.306s configuring, 30.903s building, 0.595s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[17:01:42] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[17:01:44] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[17:02:08] Starting KUnit Kernel (1/1)...
[17:02:08] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[17:02:08] ============ drm_test_pick_cmdline (2 subtests) ============
[17:02:08] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[17:02:08] =============== drm_test_pick_cmdline_named  ===============
[17:02:08] [PASSED] NTSC
[17:02:08] [PASSED] NTSC-J
[17:02:08] [PASSED] PAL
[17:02:08] [PASSED] PAL-M
[17:02:08] =========== [PASSED] drm_test_pick_cmdline_named ===========
[17:02:08] ============== [PASSED] drm_test_pick_cmdline ==============
[17:02:08] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[17:02:08] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[17:02:08] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[17:02:08] =========== drm_validate_clone_mode (2 subtests) ===========
[17:02:08] ============== drm_test_check_in_clone_mode  ===============
[17:02:08] [PASSED] in_clone_mode
[17:02:08] [PASSED] not_in_clone_mode
[17:02:08] ========== [PASSED] drm_test_check_in_clone_mode ===========
[17:02:08] =============== drm_test_check_valid_clones  ===============
[17:02:08] [PASSED] not_in_clone_mode
[17:02:08] [PASSED] valid_clone
[17:02:08] [PASSED] invalid_clone
[17:02:08] =========== [PASSED] drm_test_check_valid_clones ===========
[17:02:08] ============= [PASSED] drm_validate_clone_mode =============
[17:02:08] ============= drm_validate_modeset (1 subtest) =============
[17:02:08] [PASSED] drm_test_check_connector_changed_modeset
[17:02:08] ============== [PASSED] drm_validate_modeset ===============
[17:02:08] ====== drm_test_bridge_get_current_state (2 subtests) ======
[17:02:08] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[17:02:08] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[17:02:08] ======== [PASSED] drm_test_bridge_get_current_state ========
[17:02:08] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[17:02:08] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[17:02:08] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[17:02:08] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[17:02:08] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[17:02:08] ============== drm_bridge_alloc (2 subtests) ===============
[17:02:08] [PASSED] drm_test_drm_bridge_alloc_basic
[17:02:08] [PASSED] drm_test_drm_bridge_alloc_get_put
[17:02:08] ================ [PASSED] drm_bridge_alloc =================
[17:02:08] ============= drm_cmdline_parser (40 subtests) =============
[17:02:08] [PASSED] drm_test_cmdline_force_d_only
[17:02:08] [PASSED] drm_test_cmdline_force_D_only_dvi
[17:02:08] [PASSED] drm_test_cmdline_force_D_only_hdmi
[17:02:08] [PASSED] drm_test_cmdline_force_D_only_not_digital
[17:02:08] [PASSED] drm_test_cmdline_force_e_only
[17:02:08] [PASSED] drm_test_cmdline_res
[17:02:08] [PASSED] drm_test_cmdline_res_vesa
[17:02:08] [PASSED] drm_test_cmdline_res_vesa_rblank
[17:02:08] [PASSED] drm_test_cmdline_res_rblank
[17:02:08] [PASSED] drm_test_cmdline_res_bpp
[17:02:08] [PASSED] drm_test_cmdline_res_refresh
[17:02:08] [PASSED] drm_test_cmdline_res_bpp_refresh
[17:02:08] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[17:02:08] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[17:02:08] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[17:02:08] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[17:02:08] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[17:02:08] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[17:02:08] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[17:02:08] [PASSED] drm_test_cmdline_res_margins_force_on
[17:02:08] [PASSED] drm_test_cmdline_res_vesa_margins
[17:02:08] [PASSED] drm_test_cmdline_name
[17:02:08] [PASSED] drm_test_cmdline_name_bpp
[17:02:08] [PASSED] drm_test_cmdline_name_option
[17:02:08] [PASSED] drm_test_cmdline_name_bpp_option
[17:02:08] [PASSED] drm_test_cmdline_rotate_0
[17:02:08] [PASSED] drm_test_cmdline_rotate_90
[17:02:08] [PASSED] drm_test_cmdline_rotate_180
[17:02:08] [PASSED] drm_test_cmdline_rotate_270
[17:02:08] [PASSED] drm_test_cmdline_hmirror
[17:02:08] [PASSED] drm_test_cmdline_vmirror
[17:02:08] [PASSED] drm_test_cmdline_margin_options
[17:02:08] [PASSED] drm_test_cmdline_multiple_options
[17:02:08] [PASSED] drm_test_cmdline_bpp_extra_and_option
[17:02:08] [PASSED] drm_test_cmdline_extra_and_option
[17:02:08] [PASSED] drm_test_cmdline_freestanding_options
[17:02:08] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[17:02:08] [PASSED] drm_test_cmdline_panel_orientation
[17:02:08] ================ drm_test_cmdline_invalid  =================
[17:02:08] [PASSED] margin_only
[17:02:08] [PASSED] interlace_only
[17:02:08] [PASSED] res_missing_x
[17:02:08] [PASSED] res_missing_y
[17:02:08] [PASSED] res_bad_y
[17:02:08] [PASSED] res_missing_y_bpp
[17:02:08] [PASSED] res_bad_bpp
[17:02:08] [PASSED] res_bad_refresh
[17:02:08] [PASSED] res_bpp_refresh_force_on_off
[17:02:08] [PASSED] res_invalid_mode
[17:02:08] [PASSED] res_bpp_wrong_place_mode
[17:02:08] [PASSED] name_bpp_refresh
[17:02:08] [PASSED] name_refresh
[17:02:08] [PASSED] name_refresh_wrong_mode
[17:02:08] [PASSED] name_refresh_invalid_mode
[17:02:08] [PASSED] rotate_multiple
[17:02:08] [PASSED] rotate_invalid_val
[17:02:08] [PASSED] rotate_truncated
[17:02:08] [PASSED] invalid_option
[17:02:08] [PASSED] invalid_tv_option
[17:02:08] [PASSED] truncated_tv_option
[17:02:08] ============ [PASSED] drm_test_cmdline_invalid =============
[17:02:08] =============== drm_test_cmdline_tv_options  ===============
[17:02:08] [PASSED] NTSC
[17:02:08] [PASSED] NTSC_443
[17:02:08] [PASSED] NTSC_J
[17:02:08] [PASSED] PAL
[17:02:08] [PASSED] PAL_M
[17:02:08] [PASSED] PAL_N
[17:02:08] [PASSED] SECAM
[17:02:08] [PASSED] MONO_525
[17:02:08] [PASSED] MONO_625
[17:02:08] =========== [PASSED] drm_test_cmdline_tv_options ===========
[17:02:08] =============== [PASSED] drm_cmdline_parser ================
[17:02:08] ========== drmm_connector_hdmi_init (20 subtests) ==========
[17:02:08] [PASSED] drm_test_connector_hdmi_init_valid
[17:02:08] [PASSED] drm_test_connector_hdmi_init_bpc_8
[17:02:08] [PASSED] drm_test_connector_hdmi_init_bpc_10
[17:02:08] [PASSED] drm_test_connector_hdmi_init_bpc_12
[17:02:08] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[17:02:08] [PASSED] drm_test_connector_hdmi_init_bpc_null
[17:02:08] [PASSED] drm_test_connector_hdmi_init_formats_empty
[17:02:08] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[17:02:08] === drm_test_connector_hdmi_init_formats_yuv420_allowed  ===
[17:02:08] [PASSED] supported_formats=0x9 yuv420_allowed=1
[17:02:08] [PASSED] supported_formats=0x9 yuv420_allowed=0
[17:02:08] [PASSED] supported_formats=0x5 yuv420_allowed=1
[17:02:08] [PASSED] supported_formats=0x5 yuv420_allowed=0
[17:02:08] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[17:02:08] [PASSED] drm_test_connector_hdmi_init_null_ddc
[17:02:08] [PASSED] drm_test_connector_hdmi_init_null_product
[17:02:08] [PASSED] drm_test_connector_hdmi_init_null_vendor
[17:02:08] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[17:02:08] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[17:02:08] [PASSED] drm_test_connector_hdmi_init_product_valid
[17:02:08] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[17:02:08] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[17:02:08] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[17:02:08] ========= drm_test_connector_hdmi_init_type_valid  =========
[17:02:08] [PASSED] HDMI-A
[17:02:08] [PASSED] HDMI-B
[17:02:08] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[17:02:08] ======== drm_test_connector_hdmi_init_type_invalid  ========
[17:02:08] [PASSED] Unknown
[17:02:08] [PASSED] VGA
[17:02:08] [PASSED] DVI-I
[17:02:08] [PASSED] DVI-D
[17:02:08] [PASSED] DVI-A
[17:02:08] [PASSED] Composite
[17:02:08] [PASSED] SVIDEO
[17:02:08] [PASSED] LVDS
[17:02:08] [PASSED] Component
[17:02:08] [PASSED] DIN
[17:02:08] [PASSED] DP
[17:02:08] [PASSED] TV
[17:02:08] [PASSED] eDP
[17:02:08] [PASSED] Virtual
[17:02:08] [PASSED] DSI
[17:02:08] [PASSED] DPI
[17:02:08] [PASSED] Writeback
[17:02:08] [PASSED] SPI
[17:02:08] [PASSED] USB
[17:02:08] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[17:02:08] ============ [PASSED] drmm_connector_hdmi_init =============
[17:02:08] ============= drmm_connector_init (3 subtests) =============
[17:02:08] [PASSED] drm_test_drmm_connector_init
[17:02:08] [PASSED] drm_test_drmm_connector_init_null_ddc
[17:02:08] ========= drm_test_drmm_connector_init_type_valid  =========
[17:02:08] [PASSED] Unknown
[17:02:08] [PASSED] VGA
[17:02:08] [PASSED] DVI-I
[17:02:08] [PASSED] DVI-D
[17:02:08] [PASSED] DVI-A
[17:02:08] [PASSED] Composite
[17:02:08] [PASSED] SVIDEO
[17:02:08] [PASSED] LVDS
[17:02:08] [PASSED] Component
[17:02:08] [PASSED] DIN
[17:02:08] [PASSED] DP
[17:02:08] [PASSED] HDMI-A
[17:02:08] [PASSED] HDMI-B
[17:02:08] [PASSED] TV
[17:02:08] [PASSED] eDP
[17:02:08] [PASSED] Virtual
[17:02:08] [PASSED] DSI
[17:02:08] [PASSED] DPI
[17:02:08] [PASSED] Writeback
[17:02:08] [PASSED] SPI
[17:02:08] [PASSED] USB
[17:02:08] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[17:02:08] =============== [PASSED] drmm_connector_init ===============
[17:02:08] ========= drm_connector_dynamic_init (6 subtests) ==========
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_init
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_init_properties
[17:02:08] ===== drm_test_drm_connector_dynamic_init_type_valid  ======
[17:02:08] [PASSED] Unknown
[17:02:08] [PASSED] VGA
[17:02:08] [PASSED] DVI-I
[17:02:08] [PASSED] DVI-D
[17:02:08] [PASSED] DVI-A
[17:02:08] [PASSED] Composite
[17:02:08] [PASSED] SVIDEO
[17:02:08] [PASSED] LVDS
[17:02:08] [PASSED] Component
[17:02:08] [PASSED] DIN
[17:02:08] [PASSED] DP
[17:02:08] [PASSED] HDMI-A
[17:02:08] [PASSED] HDMI-B
[17:02:08] [PASSED] TV
[17:02:08] [PASSED] eDP
[17:02:08] [PASSED] Virtual
[17:02:08] [PASSED] DSI
[17:02:08] [PASSED] DPI
[17:02:08] [PASSED] Writeback
[17:02:08] [PASSED] SPI
[17:02:08] [PASSED] USB
[17:02:08] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[17:02:08] ======== drm_test_drm_connector_dynamic_init_name  =========
[17:02:08] [PASSED] Unknown
[17:02:08] [PASSED] VGA
[17:02:08] [PASSED] DVI-I
[17:02:08] [PASSED] DVI-D
[17:02:08] [PASSED] DVI-A
[17:02:08] [PASSED] Composite
[17:02:08] [PASSED] SVIDEO
[17:02:08] [PASSED] LVDS
[17:02:08] [PASSED] Component
[17:02:08] [PASSED] DIN
[17:02:08] [PASSED] DP
[17:02:08] [PASSED] HDMI-A
[17:02:08] [PASSED] HDMI-B
[17:02:08] [PASSED] TV
[17:02:08] [PASSED] eDP
[17:02:08] [PASSED] Virtual
[17:02:08] [PASSED] DSI
[17:02:08] [PASSED] DPI
[17:02:08] [PASSED] Writeback
[17:02:08] [PASSED] SPI
[17:02:08] [PASSED] USB
[17:02:08] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[17:02:08] =========== [PASSED] drm_connector_dynamic_init ============
[17:02:08] ==== drm_connector_dynamic_register_early (4 subtests) =====
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[17:02:08] ====== [PASSED] drm_connector_dynamic_register_early =======
[17:02:08] ======= drm_connector_dynamic_register (7 subtests) ========
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[17:02:08] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[17:02:08] ========= [PASSED] drm_connector_dynamic_register ==========
[17:02:08] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[17:02:08] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[17:02:08] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[17:02:08] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[17:02:08] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[17:02:08] ========== drm_test_get_tv_mode_from_name_valid  ===========
[17:02:08] [PASSED] NTSC
[17:02:08] [PASSED] NTSC-443
[17:02:08] [PASSED] NTSC-J
[17:02:08] [PASSED] PAL
[17:02:08] [PASSED] PAL-M
[17:02:08] [PASSED] PAL-N
[17:02:08] [PASSED] SECAM
[17:02:08] [PASSED] Mono
[17:02:08] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[17:02:08] [PASSED] drm_test_get_tv_mode_from_name_truncated
[17:02:08] ============ [PASSED] drm_get_tv_mode_from_name ============
[17:02:08] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[17:02:08] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[17:02:08] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[17:02:08] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[17:02:08] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[17:02:08] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[17:02:08] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[17:02:08] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid  =
[17:02:08] [PASSED] VIC 96
[17:02:08] [PASSED] VIC 97
[17:02:08] [PASSED] VIC 101
[17:02:08] [PASSED] VIC 102
[17:02:08] [PASSED] VIC 106
[17:02:08] [PASSED] VIC 107
[17:02:08] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[17:02:08] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[17:02:08] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[17:02:08] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[17:02:08] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[17:02:08] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[17:02:08] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[17:02:08] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[17:02:08] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name  ====
[17:02:08] [PASSED] Automatic
[17:02:08] [PASSED] Full
[17:02:08] [PASSED] Limited 16:235
[17:02:08] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[17:02:08] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[17:02:08] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[17:02:08] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[17:02:08] === drm_test_drm_hdmi_connector_get_output_format_name  ====
[17:02:08] [PASSED] RGB
[17:02:08] [PASSED] YUV 4:2:0
[17:02:08] [PASSED] YUV 4:2:2
[17:02:08] [PASSED] YUV 4:4:4
[17:02:08] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[17:02:08] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[17:02:08] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[17:02:08] ============= drm_damage_helper (21 subtests) ==============
[17:02:08] [PASSED] drm_test_damage_iter_no_damage
[17:02:08] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[17:02:08] [PASSED] drm_test_damage_iter_no_damage_src_moved
[17:02:08] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[17:02:08] [PASSED] drm_test_damage_iter_no_damage_not_visible
[17:02:08] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[17:02:08] [PASSED] drm_test_damage_iter_no_damage_no_fb
[17:02:08] [PASSED] drm_test_damage_iter_simple_damage
[17:02:08] [PASSED] drm_test_damage_iter_single_damage
[17:02:08] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[17:02:08] [PASSED] drm_test_damage_iter_single_damage_outside_src
[17:02:08] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[17:02:08] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[17:02:08] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[17:02:08] [PASSED] drm_test_damage_iter_single_damage_src_moved
[17:02:08] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[17:02:08] [PASSED] drm_test_damage_iter_damage
[17:02:08] [PASSED] drm_test_damage_iter_damage_one_intersect
[17:02:08] [PASSED] drm_test_damage_iter_damage_one_outside
[17:02:08] [PASSED] drm_test_damage_iter_damage_src_moved
[17:02:08] [PASSED] drm_test_damage_iter_damage_not_visible
[17:02:08] ================ [PASSED] drm_damage_helper ================
[17:02:08] ============== drm_dp_mst_helper (3 subtests) ==============
[17:02:08] ============== drm_test_dp_mst_calc_pbn_mode  ==============
[17:02:08] [PASSED] Clock 154000 BPP 30 DSC disabled
[17:02:08] [PASSED] Clock 234000 BPP 30 DSC disabled
[17:02:08] [PASSED] Clock 297000 BPP 24 DSC disabled
[17:02:08] [PASSED] Clock 332880 BPP 24 DSC enabled
[17:02:08] [PASSED] Clock 324540 BPP 24 DSC enabled
[17:02:08] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[17:02:08] ============== drm_test_dp_mst_calc_pbn_div  ===============
[17:02:08] [PASSED] Link rate 2000000 lane count 4
[17:02:08] [PASSED] Link rate 2000000 lane count 2
[17:02:08] [PASSED] Link rate 2000000 lane count 1
[17:02:08] [PASSED] Link rate 1350000 lane count 4
[17:02:08] [PASSED] Link rate 1350000 lane count 2
[17:02:08] [PASSED] Link rate 1350000 lane count 1
[17:02:08] [PASSED] Link rate 1000000 lane count 4
[17:02:08] [PASSED] Link rate 1000000 lane count 2
[17:02:08] [PASSED] Link rate 1000000 lane count 1
[17:02:08] [PASSED] Link rate 810000 lane count 4
[17:02:08] [PASSED] Link rate 810000 lane count 2
[17:02:08] [PASSED] Link rate 810000 lane count 1
[17:02:08] [PASSED] Link rate 540000 lane count 4
[17:02:08] [PASSED] Link rate 540000 lane count 2
[17:02:08] [PASSED] Link rate 540000 lane count 1
[17:02:08] [PASSED] Link rate 270000 lane count 4
[17:02:08] [PASSED] Link rate 270000 lane count 2
[17:02:08] [PASSED] Link rate 270000 lane count 1
[17:02:08] [PASSED] Link rate 162000 lane count 4
[17:02:08] [PASSED] Link rate 162000 lane count 2
[17:02:08] [PASSED] Link rate 162000 lane count 1
[17:02:08] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[17:02:08] ========= drm_test_dp_mst_sideband_msg_req_decode  =========
[17:02:08] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[17:02:08] [PASSED] DP_POWER_UP_PHY with port number
[17:02:08] [PASSED] DP_POWER_DOWN_PHY with port number
[17:02:08] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[17:02:08] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[17:02:08] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[17:02:08] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[17:02:08] [PASSED] DP_QUERY_PAYLOAD with port number
[17:02:08] [PASSED] DP_QUERY_PAYLOAD with VCPI
[17:02:08] [PASSED] DP_REMOTE_DPCD_READ with port number
[17:02:08] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[17:02:08] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[17:02:08] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[17:02:08] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[17:02:08] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[17:02:08] [PASSED] DP_REMOTE_I2C_READ with port number
[17:02:08] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[17:02:08] [PASSED] DP_REMOTE_I2C_READ with transactions array
[17:02:08] [PASSED] DP_REMOTE_I2C_WRITE with port number
[17:02:08] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[17:02:08] [PASSED] DP_REMOTE_I2C_WRITE with data array
[17:02:08] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[17:02:08] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[17:02:08] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[17:02:08] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[17:02:08] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[17:02:08] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[17:02:08] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[17:02:08] ================ [PASSED] drm_dp_mst_helper ================
[17:02:08] ================== drm_exec (7 subtests) ===================
[17:02:08] [PASSED] sanitycheck
[17:02:08] [PASSED] test_lock
[17:02:08] [PASSED] test_lock_unlock
[17:02:08] [PASSED] test_duplicates
[17:02:08] [PASSED] test_prepare
[17:02:08] [PASSED] test_prepare_array
[17:02:08] [PASSED] test_multiple_loops
[17:02:08] ==================== [PASSED] drm_exec =====================
[17:02:08] =========== drm_format_helper_test (17 subtests) ===========
[17:02:08] ============== drm_test_fb_xrgb8888_to_gray8  ==============
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[17:02:08] ============= drm_test_fb_xrgb8888_to_rgb332  ==============
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[17:02:08] ============= drm_test_fb_xrgb8888_to_rgb565  ==============
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[17:02:08] ============ drm_test_fb_xrgb8888_to_xrgb1555  =============
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[17:02:08] ============ drm_test_fb_xrgb8888_to_argb1555  =============
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[17:02:08] ============ drm_test_fb_xrgb8888_to_rgba5551  =============
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[17:02:08] ============= drm_test_fb_xrgb8888_to_rgb888  ==============
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[17:02:08] ============= drm_test_fb_xrgb8888_to_bgr888  ==============
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[17:02:08] ============ drm_test_fb_xrgb8888_to_argb8888  =============
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[17:02:08] =========== drm_test_fb_xrgb8888_to_xrgb2101010  ===========
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[17:02:08] =========== drm_test_fb_xrgb8888_to_argb2101010  ===========
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[17:02:08] ============== drm_test_fb_xrgb8888_to_mono  ===============
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[17:02:08] ==================== drm_test_fb_swab  =====================
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ================ [PASSED] drm_test_fb_swab =================
[17:02:08] ============ drm_test_fb_xrgb8888_to_xbgr8888  =============
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[17:02:08] ============ drm_test_fb_xrgb8888_to_abgr8888  =============
[17:02:08] [PASSED] single_pixel_source_buffer
[17:02:08] [PASSED] single_pixel_clip_rectangle
[17:02:08] [PASSED] well_known_colors
[17:02:08] [PASSED] destination_pitch
[17:02:08] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[17:02:08] ================= drm_test_fb_clip_offset  =================
[17:02:08] [PASSED] pass through
[17:02:08] [PASSED] horizontal offset
[17:02:08] [PASSED] vertical offset
[17:02:08] [PASSED] horizontal and vertical offset
[17:02:08] [PASSED] horizontal offset (custom pitch)
[17:02:08] [PASSED] vertical offset (custom pitch)
[17:02:08] [PASSED] horizontal and vertical offset (custom pitch)
[17:02:08] ============= [PASSED] drm_test_fb_clip_offset =============
[17:02:08] =================== drm_test_fb_memcpy  ====================
[17:02:08] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[17:02:08] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[17:02:08] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[17:02:08] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[17:02:08] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[17:02:08] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[17:02:08] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[17:02:08] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[17:02:08] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[17:02:08] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[17:02:08] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[17:02:08] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[17:02:08] =============== [PASSED] drm_test_fb_memcpy ================
[17:02:08] ============= [PASSED] drm_format_helper_test ==============
[17:02:08] ================= drm_format (18 subtests) =================
[17:02:08] [PASSED] drm_test_format_block_width_invalid
[17:02:08] [PASSED] drm_test_format_block_width_one_plane
[17:02:08] [PASSED] drm_test_format_block_width_two_plane
[17:02:08] [PASSED] drm_test_format_block_width_three_plane
[17:02:08] [PASSED] drm_test_format_block_width_tiled
[17:02:08] [PASSED] drm_test_format_block_height_invalid
[17:02:08] [PASSED] drm_test_format_block_height_one_plane
[17:02:08] [PASSED] drm_test_format_block_height_two_plane
[17:02:08] [PASSED] drm_test_format_block_height_three_plane
[17:02:08] [PASSED] drm_test_format_block_height_tiled
[17:02:08] [PASSED] drm_test_format_min_pitch_invalid
[17:02:08] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[17:02:08] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[17:02:08] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[17:02:08] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[17:02:08] [PASSED] drm_test_format_min_pitch_two_plane
[17:02:08] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[17:02:08] [PASSED] drm_test_format_min_pitch_tiled
[17:02:08] =================== [PASSED] drm_format ====================
[17:02:08] ============== drm_framebuffer (10 subtests) ===============
[17:02:08] ========== drm_test_framebuffer_check_src_coords  ==========
[17:02:08] [PASSED] Success: source fits into fb
[17:02:08] [PASSED] Fail: overflowing fb with x-axis coordinate
[17:02:08] [PASSED] Fail: overflowing fb with y-axis coordinate
[17:02:08] [PASSED] Fail: overflowing fb with source width
[17:02:08] [PASSED] Fail: overflowing fb with source height
[17:02:08] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[17:02:08] [PASSED] drm_test_framebuffer_cleanup
[17:02:08] =============== drm_test_framebuffer_create  ===============
[17:02:08] [PASSED] ABGR8888 normal sizes
[17:02:08] [PASSED] ABGR8888 max sizes
[17:02:08] [PASSED] ABGR8888 pitch greater than min required
[17:02:08] [PASSED] ABGR8888 pitch less than min required
[17:02:08] [PASSED] ABGR8888 Invalid width
[17:02:08] [PASSED] ABGR8888 Invalid buffer handle
[17:02:08] [PASSED] No pixel format
[17:02:08] [PASSED] ABGR8888 Width 0
[17:02:08] [PASSED] ABGR8888 Height 0
[17:02:08] [PASSED] ABGR8888 Out of bound height * pitch combination
[17:02:08] [PASSED] ABGR8888 Large buffer offset
[17:02:08] [PASSED] ABGR8888 Buffer offset for inexistent plane
[17:02:08] [PASSED] ABGR8888 Invalid flag
[17:02:08] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[17:02:08] [PASSED] ABGR8888 Valid buffer modifier
[17:02:08] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[17:02:08] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[17:02:08] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[17:02:08] [PASSED] NV12 Normal sizes
[17:02:08] [PASSED] NV12 Max sizes
[17:02:08] [PASSED] NV12 Invalid pitch
[17:02:08] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[17:02:08] [PASSED] NV12 different  modifier per-plane
[17:02:08] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[17:02:08] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[17:02:08] [PASSED] NV12 Modifier for inexistent plane
[17:02:08] [PASSED] NV12 Handle for inexistent plane
[17:02:08] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[17:02:08] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[17:02:08] [PASSED] YVU420 Normal sizes
[17:02:08] [PASSED] YVU420 Max sizes
[17:02:08] [PASSED] YVU420 Invalid pitch
[17:02:08] [PASSED] YVU420 Different pitches
[17:02:08] [PASSED] YVU420 Different buffer offsets/pitches
[17:02:08] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[17:02:08] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[17:02:08] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[17:02:08] [PASSED] YVU420 Valid modifier
[17:02:08] [PASSED] YVU420 Different modifiers per plane
[17:02:08] [PASSED] YVU420 Modifier for inexistent plane
[17:02:08] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[17:02:08] [PASSED] X0L2 Normal sizes
[17:02:08] [PASSED] X0L2 Max sizes
[17:02:08] [PASSED] X0L2 Invalid pitch
[17:02:08] [PASSED] X0L2 Pitch greater than minimum required
[17:02:08] [PASSED] X0L2 Handle for inexistent plane
[17:02:08] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[17:02:08] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[17:02:08] [PASSED] X0L2 Valid modifier
[17:02:08] [PASSED] X0L2 Modifier for inexistent plane
[17:02:08] =========== [PASSED] drm_test_framebuffer_create ===========
[17:02:08] [PASSED] drm_test_framebuffer_free
[17:02:08] [PASSED] drm_test_framebuffer_init
[17:02:08] [PASSED] drm_test_framebuffer_init_bad_format
[17:02:08] [PASSED] drm_test_framebuffer_init_dev_mismatch
[17:02:08] [PASSED] drm_test_framebuffer_lookup
[17:02:08] [PASSED] drm_test_framebuffer_lookup_inexistent
[17:02:08] [PASSED] drm_test_framebuffer_modifiers_not_supported
[17:02:08] ================= [PASSED] drm_framebuffer =================
[17:02:08] ================ drm_gem_shmem (8 subtests) ================
[17:02:08] [PASSED] drm_gem_shmem_test_obj_create
[17:02:08] [PASSED] drm_gem_shmem_test_obj_create_private
[17:02:08] [PASSED] drm_gem_shmem_test_pin_pages
[17:02:08] [PASSED] drm_gem_shmem_test_vmap
[17:02:08] [PASSED] drm_gem_shmem_test_get_sg_table
[17:02:08] [PASSED] drm_gem_shmem_test_get_pages_sgt
[17:02:08] [PASSED] drm_gem_shmem_test_madvise
[17:02:08] [PASSED] drm_gem_shmem_test_purge
[17:02:08] ================== [PASSED] drm_gem_shmem ==================
[17:02:08] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[17:02:08] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[17:02:08] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[17:02:08] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[17:02:08] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[17:02:08] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[17:02:08] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[17:02:08] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420  =======
[17:02:08] [PASSED] Automatic
[17:02:08] [PASSED] Full
[17:02:08] [PASSED] Limited 16:235
[17:02:08] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[17:02:08] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[17:02:08] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[17:02:08] [PASSED] drm_test_check_disable_connector
[17:02:08] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[17:02:08] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[17:02:08] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[17:02:08] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[17:02:08] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[17:02:08] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[17:02:08] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[17:02:08] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[17:02:08] [PASSED] drm_test_check_output_bpc_dvi
[17:02:08] [PASSED] drm_test_check_output_bpc_format_vic_1
[17:02:08] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[17:02:08] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[17:02:08] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[17:02:08] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[17:02:08] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[17:02:08] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[17:02:08] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[17:02:08] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[17:02:08] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[17:02:08] [PASSED] drm_test_check_broadcast_rgb_value
[17:02:08] [PASSED] drm_test_check_bpc_8_value
[17:02:08] [PASSED] drm_test_check_bpc_10_value
[17:02:08] [PASSED] drm_test_check_bpc_12_value
[17:02:08] [PASSED] drm_test_check_format_value
[17:02:08] [PASSED] drm_test_check_tmds_char_value
[17:02:08] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[17:02:08] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[17:02:08] [PASSED] drm_test_check_mode_valid
[17:02:08] [PASSED] drm_test_check_mode_valid_reject
[17:02:08] [PASSED] drm_test_check_mode_valid_reject_rate
[17:02:08] [PASSED] drm_test_check_mode_valid_reject_max_clock
[17:02:08] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[17:02:08] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) =
[17:02:08] [PASSED] drm_test_check_infoframes
[17:02:08] [PASSED] drm_test_check_reject_avi_infoframe
[17:02:08] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8
[17:02:08] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10
[17:02:08] [PASSED] drm_test_check_reject_audio_infoframe
[17:02:08] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes ===
[17:02:08] ================= drm_managed (2 subtests) =================
[17:02:08] [PASSED] drm_test_managed_release_action
[17:02:08] [PASSED] drm_test_managed_run_action
[17:02:08] =================== [PASSED] drm_managed ===================
[17:02:08] =================== drm_mm (6 subtests) ====================
[17:02:08] [PASSED] drm_test_mm_init
[17:02:08] [PASSED] drm_test_mm_debug
[17:02:08] [PASSED] drm_test_mm_align32
[17:02:08] [PASSED] drm_test_mm_align64
[17:02:08] [PASSED] drm_test_mm_lowest
[17:02:08] [PASSED] drm_test_mm_highest
[17:02:08] ===================== [PASSED] drm_mm ======================
[17:02:08] ============= drm_modes_analog_tv (5 subtests) =============
[17:02:08] [PASSED] drm_test_modes_analog_tv_mono_576i
[17:02:08] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[17:02:08] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[17:02:08] [PASSED] drm_test_modes_analog_tv_pal_576i
[17:02:08] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[17:02:08] =============== [PASSED] drm_modes_analog_tv ===============
[17:02:08] ============== drm_plane_helper (2 subtests) ===============
[17:02:08] =============== drm_test_check_plane_state  ================
[17:02:08] [PASSED] clipping_simple
[17:02:08] [PASSED] clipping_rotate_reflect
[17:02:08] [PASSED] positioning_simple
[17:02:08] [PASSED] upscaling
[17:02:08] [PASSED] downscaling
[17:02:08] [PASSED] rounding1
[17:02:08] [PASSED] rounding2
[17:02:08] [PASSED] rounding3
[17:02:08] [PASSED] rounding4
[17:02:08] =========== [PASSED] drm_test_check_plane_state ============
[17:02:08] =========== drm_test_check_invalid_plane_state  ============
[17:02:08] [PASSED] positioning_invalid
[17:02:08] [PASSED] upscaling_invalid
[17:02:08] [PASSED] downscaling_invalid
[17:02:08] ======= [PASSED] drm_test_check_invalid_plane_state ========
[17:02:08] ================ [PASSED] drm_plane_helper =================
[17:02:08] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[17:02:08] ====== drm_test_connector_helper_tv_get_modes_check  =======
[17:02:08] [PASSED] None
[17:02:08] [PASSED] PAL
[17:02:08] [PASSED] NTSC
[17:02:08] [PASSED] Both, NTSC Default
[17:02:08] [PASSED] Both, PAL Default
[17:02:08] [PASSED] Both, NTSC Default, with PAL on command-line
[17:02:08] [PASSED] Both, PAL Default, with NTSC on command-line
[17:02:08] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[17:02:08] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[17:02:08] ================== drm_rect (9 subtests) ===================
[17:02:08] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[17:02:08] [PASSED] drm_test_rect_clip_scaled_not_clipped
[17:02:08] [PASSED] drm_test_rect_clip_scaled_clipped
[17:02:08] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[17:02:08] ================= drm_test_rect_intersect  =================
[17:02:08] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[17:02:08] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[17:02:08] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[17:02:08] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[17:02:08] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[17:02:08] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[17:02:08] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[17:02:08] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[17:02:08] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[17:02:08] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[17:02:08] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[17:02:08] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[17:02:08] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[17:02:08] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[17:02:08] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[17:02:08] ============= [PASSED] drm_test_rect_intersect =============
[17:02:08] ================ drm_test_rect_calc_hscale  ================
[17:02:08] [PASSED] normal use
[17:02:08] [PASSED] out of max range
[17:02:08] [PASSED] out of min range
[17:02:08] [PASSED] zero dst
[17:02:08] [PASSED] negative src
[17:02:08] [PASSED] negative dst
[17:02:08] ============ [PASSED] drm_test_rect_calc_hscale ============
[17:02:08] ================ drm_test_rect_calc_vscale  ================
[17:02:08] [PASSED] normal use
[17:02:08] [PASSED] out of max range
[17:02:08] [PASSED] out of min range
[17:02:08] [PASSED] zero dst
[17:02:08] [PASSED] negative src
[17:02:08] [PASSED] negative dst
stty: 'standard input': Inappropriate ioctl for device
[17:02:08] ============ [PASSED] drm_test_rect_calc_vscale ============
[17:02:08] ================== drm_test_rect_rotate  ===================
[17:02:08] [PASSED] reflect-x
[17:02:08] [PASSED] reflect-y
[17:02:08] [PASSED] rotate-0
[17:02:08] [PASSED] rotate-90
[17:02:08] [PASSED] rotate-180
[17:02:08] [PASSED] rotate-270
[17:02:08] ============== [PASSED] drm_test_rect_rotate ===============
[17:02:08] ================ drm_test_rect_rotate_inv  =================
[17:02:08] [PASSED] reflect-x
[17:02:08] [PASSED] reflect-y
[17:02:08] [PASSED] rotate-0
[17:02:08] [PASSED] rotate-90
[17:02:08] [PASSED] rotate-180
[17:02:08] [PASSED] rotate-270
[17:02:08] ============ [PASSED] drm_test_rect_rotate_inv =============
[17:02:08] ==================== [PASSED] drm_rect =====================
[17:02:08] ============ drm_sysfb_modeset_test (1 subtest) ============
[17:02:08] ============ drm_test_sysfb_build_fourcc_list  =============
[17:02:08] [PASSED] no native formats
[17:02:08] [PASSED] XRGB8888 as native format
[17:02:08] [PASSED] remove duplicates
[17:02:08] [PASSED] convert alpha formats
[17:02:08] [PASSED] random formats
[17:02:08] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[17:02:08] ============= [PASSED] drm_sysfb_modeset_test ==============
[17:02:08] ================== drm_fixp (2 subtests) ===================
[17:02:08] [PASSED] drm_test_int2fixp
[17:02:08] [PASSED] drm_test_sm2fixp
[17:02:08] ==================== [PASSED] drm_fixp =====================
[17:02:08] ============================================================
[17:02:08] Testing complete. Ran 621 tests: passed: 621
[17:02:08] Elapsed time: 25.614s total, 1.690s configuring, 23.707s building, 0.181s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[17:02:08] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[17:02:10] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[17:02:19] Starting KUnit Kernel (1/1)...
[17:02:19] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[17:02:19] ================= ttm_device (5 subtests) ==================
[17:02:19] [PASSED] ttm_device_init_basic
[17:02:19] [PASSED] ttm_device_init_multiple
[17:02:19] [PASSED] ttm_device_fini_basic
[17:02:19] [PASSED] ttm_device_init_no_vma_man
[17:02:19] ================== ttm_device_init_pools  ==================
[17:02:19] [PASSED] No DMA allocations, no DMA32 required
[17:02:19] [PASSED] DMA allocations, DMA32 required
[17:02:19] [PASSED] No DMA allocations, DMA32 required
[17:02:19] [PASSED] DMA allocations, no DMA32 required
[17:02:19] ============== [PASSED] ttm_device_init_pools ==============
[17:02:19] =================== [PASSED] ttm_device ====================
[17:02:19] ================== ttm_pool (8 subtests) ===================
[17:02:19] ================== ttm_pool_alloc_basic  ===================
[17:02:19] [PASSED] One page
[17:02:19] [PASSED] More than one page
[17:02:19] [PASSED] Above the allocation limit
[17:02:19] [PASSED] One page, with coherent DMA mappings enabled
[17:02:19] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[17:02:19] ============== [PASSED] ttm_pool_alloc_basic ===============
[17:02:19] ============== ttm_pool_alloc_basic_dma_addr  ==============
[17:02:19] [PASSED] One page
[17:02:19] [PASSED] More than one page
[17:02:19] [PASSED] Above the allocation limit
[17:02:19] [PASSED] One page, with coherent DMA mappings enabled
[17:02:19] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[17:02:19] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[17:02:19] [PASSED] ttm_pool_alloc_order_caching_match
[17:02:19] [PASSED] ttm_pool_alloc_caching_mismatch
[17:02:19] [PASSED] ttm_pool_alloc_order_mismatch
[17:02:19] [PASSED] ttm_pool_free_dma_alloc
[17:02:19] [PASSED] ttm_pool_free_no_dma_alloc
[17:02:19] [PASSED] ttm_pool_fini_basic
[17:02:19] ==================== [PASSED] ttm_pool =====================
[17:02:19] ================ ttm_resource (8 subtests) =================
[17:02:19] ================= ttm_resource_init_basic  =================
[17:02:19] [PASSED] Init resource in TTM_PL_SYSTEM
[17:02:19] [PASSED] Init resource in TTM_PL_VRAM
[17:02:19] [PASSED] Init resource in a private placement
[17:02:19] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[17:02:19] ============= [PASSED] ttm_resource_init_basic =============
[17:02:19] [PASSED] ttm_resource_init_pinned
[17:02:19] [PASSED] ttm_resource_fini_basic
[17:02:19] [PASSED] ttm_resource_manager_init_basic
[17:02:19] [PASSED] ttm_resource_manager_usage_basic
[17:02:19] [PASSED] ttm_resource_manager_set_used_basic
[17:02:19] [PASSED] ttm_sys_man_alloc_basic
[17:02:19] [PASSED] ttm_sys_man_free_basic
[17:02:19] ================== [PASSED] ttm_resource ===================
[17:02:19] =================== ttm_tt (15 subtests) ===================
[17:02:19] ==================== ttm_tt_init_basic  ====================
[17:02:19] [PASSED] Page-aligned size
[17:02:19] [PASSED] Extra pages requested
[17:02:19] ================ [PASSED] ttm_tt_init_basic ================
[17:02:19] [PASSED] ttm_tt_init_misaligned
[17:02:19] [PASSED] ttm_tt_fini_basic
[17:02:19] [PASSED] ttm_tt_fini_sg
[17:02:19] [PASSED] ttm_tt_fini_shmem
[17:02:19] [PASSED] ttm_tt_create_basic
[17:02:19] [PASSED] ttm_tt_create_invalid_bo_type
[17:02:19] [PASSED] ttm_tt_create_ttm_exists
[17:02:19] [PASSED] ttm_tt_create_failed
[17:02:19] [PASSED] ttm_tt_destroy_basic
[17:02:19] [PASSED] ttm_tt_populate_null_ttm
[17:02:19] [PASSED] ttm_tt_populate_populated_ttm
[17:02:19] [PASSED] ttm_tt_unpopulate_basic
[17:02:19] [PASSED] ttm_tt_unpopulate_empty_ttm
[17:02:19] [PASSED] ttm_tt_swapin_basic
[17:02:19] ===================== [PASSED] ttm_tt ======================
[17:02:19] =================== ttm_bo (14 subtests) ===================
[17:02:19] =========== ttm_bo_reserve_optimistic_no_ticket  ===========
[17:02:19] [PASSED] Cannot be interrupted and sleeps
[17:02:19] [PASSED] Cannot be interrupted, locks straight away
[17:02:19] [PASSED] Can be interrupted, sleeps
[17:02:19] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[17:02:19] [PASSED] ttm_bo_reserve_locked_no_sleep
[17:02:19] [PASSED] ttm_bo_reserve_no_wait_ticket
[17:02:19] [PASSED] ttm_bo_reserve_double_resv
[17:02:19] [PASSED] ttm_bo_reserve_interrupted
[17:02:19] [PASSED] ttm_bo_reserve_deadlock
[17:02:19] [PASSED] ttm_bo_unreserve_basic
[17:02:19] [PASSED] ttm_bo_unreserve_pinned
[17:02:19] [PASSED] ttm_bo_unreserve_bulk
[17:02:19] [PASSED] ttm_bo_fini_basic
[17:02:19] [PASSED] ttm_bo_fini_shared_resv
[17:02:19] [PASSED] ttm_bo_pin_basic
[17:02:19] [PASSED] ttm_bo_pin_unpin_resource
[17:02:19] [PASSED] ttm_bo_multiple_pin_one_unpin
[17:02:19] ===================== [PASSED] ttm_bo ======================
[17:02:19] ============== ttm_bo_validate (22 subtests) ===============
[17:02:19] ============== ttm_bo_init_reserved_sys_man  ===============
[17:02:19] [PASSED] Buffer object for userspace
[17:02:19] [PASSED] Kernel buffer object
[17:02:19] [PASSED] Shared buffer object
[17:02:19] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[17:02:19] ============== ttm_bo_init_reserved_mock_man  ==============
[17:02:19] [PASSED] Buffer object for userspace
[17:02:19] [PASSED] Kernel buffer object
[17:02:19] [PASSED] Shared buffer object
[17:02:19] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[17:02:19] [PASSED] ttm_bo_init_reserved_resv
[17:02:19] ================== ttm_bo_validate_basic  ==================
[17:02:19] [PASSED] Buffer object for userspace
[17:02:19] [PASSED] Kernel buffer object
[17:02:19] [PASSED] Shared buffer object
[17:02:19] ============== [PASSED] ttm_bo_validate_basic ==============
[17:02:19] [PASSED] ttm_bo_validate_invalid_placement
[17:02:19] ============= ttm_bo_validate_same_placement  ==============
[17:02:19] [PASSED] System manager
[17:02:19] [PASSED] VRAM manager
[17:02:19] ========= [PASSED] ttm_bo_validate_same_placement ==========
[17:02:19] [PASSED] ttm_bo_validate_failed_alloc
[17:02:19] [PASSED] ttm_bo_validate_pinned
[17:02:19] [PASSED] ttm_bo_validate_busy_placement
[17:02:19] ================ ttm_bo_validate_multihop  =================
[17:02:19] [PASSED] Buffer object for userspace
[17:02:19] [PASSED] Kernel buffer object
[17:02:19] [PASSED] Shared buffer object
[17:02:19] ============ [PASSED] ttm_bo_validate_multihop =============
[17:02:19] ========== ttm_bo_validate_no_placement_signaled  ==========
[17:02:19] [PASSED] Buffer object in system domain, no page vector
[17:02:19] [PASSED] Buffer object in system domain with an existing page vector
[17:02:19] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[17:02:19] ======== ttm_bo_validate_no_placement_not_signaled  ========
[17:02:19] [PASSED] Buffer object for userspace
[17:02:19] [PASSED] Kernel buffer object
[17:02:19] [PASSED] Shared buffer object
[17:02:19] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[17:02:19] [PASSED] ttm_bo_validate_move_fence_signaled
[17:02:19] ========= ttm_bo_validate_move_fence_not_signaled  =========
[17:02:19] [PASSED] Waits for GPU
[17:02:19] [PASSED] Tries to lock straight away
[17:02:19] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[17:02:19] [PASSED] ttm_bo_validate_swapout
[17:02:19] [PASSED] ttm_bo_validate_happy_evict
[17:02:19] [PASSED] ttm_bo_validate_all_pinned_evict
[17:02:19] [PASSED] ttm_bo_validate_allowed_only_evict
[17:02:19] [PASSED] ttm_bo_validate_deleted_evict
[17:02:19] [PASSED] ttm_bo_validate_busy_domain_evict
[17:02:19] [PASSED] ttm_bo_validate_evict_gutting
[17:02:19] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[17:02:19] ================= [PASSED] ttm_bo_validate =================
[17:02:19] ============================================================
[17:02:19] Testing complete. Ran 102 tests: passed: 102
[17:02:19] Elapsed time: 11.466s total, 1.727s configuring, 9.523s building, 0.180s running

+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 01/16] drm/i915: Introduce intel_parent_fb_pin_get_map()
  2026-04-23 16:53 ` [PATCH 01/16] drm/i915: Introduce intel_parent_fb_pin_get_map() Ville Syrjala
@ 2026-04-24  9:14   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24  9:14 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Introduce the "fb_pin" parent interface, as the first trivial step
> move the *_get_map() stuff there.
>
> The whole "fb_pin" as an interface might not really make sense,
> and perhaps this (and other stuff) should just be collected into
> some kind of "bo" interface. But let's go with "fb_pin" for now
> to match where things are implemented, and possibly restructure
> it later.

Yeah, I've also come to the conclusion that trying to always get things
like this right in advance is somewhat of a waste of time. You'll only
see things clearly once everything is in place.

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_fb_pin.h  | 1 -
>  drivers/gpu/drm/i915/display/intel_fbdev.c   | 7 +++++--
>  drivers/gpu/drm/i915/display/intel_fbdev.h   | 4 ++--
>  drivers/gpu/drm/i915/display/intel_parent.c  | 7 +++++++
>  drivers/gpu/drm/i915/display/intel_parent.h  | 5 +++++
>  drivers/gpu/drm/i915/display/intel_plane.c   | 4 ++--
>  drivers/gpu/drm/i915/i915_driver.c           | 2 ++
>  drivers/gpu/drm/i915/i915_fb_pin.c           | 8 +++++++-
>  drivers/gpu/drm/i915/i915_fb_pin.h           | 9 +++++++++
>  drivers/gpu/drm/xe/display/xe_display.c      | 2 ++
>  drivers/gpu/drm/xe/display/xe_fb_pin.c       | 8 +++++++-
>  drivers/gpu/drm/xe/display/xe_fb_pin.h       | 9 +++++++++
>  include/drm/intel/display_parent_interface.h | 8 ++++++++
>  13 files changed, 65 insertions(+), 9 deletions(-)
>  create mode 100644 drivers/gpu/drm/i915/i915_fb_pin.h
>  create mode 100644 drivers/gpu/drm/xe/display/xe_fb_pin.h
>
> diff --git a/drivers/gpu/drm/i915/display/intel_fb_pin.h b/drivers/gpu/drm/i915/display/intel_fb_pin.h
> index 5825503c38ea..805e23067004 100644
> --- a/drivers/gpu/drm/i915/display/intel_fb_pin.h
> +++ b/drivers/gpu/drm/i915/display/intel_fb_pin.h
> @@ -35,6 +35,5 @@ void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id);
>  int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  		       const struct intel_plane_state *old_plane_state);
>  void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state);
> -void intel_fb_get_map(struct i915_vma *vma, struct iosys_map *map);
>  
>  #endif
> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
> index 9ab0ac49abb7..ce4082da30e8 100644
> --- a/drivers/gpu/drm/i915/display/intel_fbdev.c
> +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
> @@ -55,6 +55,7 @@
>  #include "intel_fb_pin.h"
>  #include "intel_fbdev.h"
>  #include "intel_frontbuffer.h"
> +#include "intel_parent.h"
>  #include "intel_plane.h"
>  
>  struct intel_fbdev {
> @@ -563,7 +564,9 @@ struct i915_vma *intel_fbdev_vma_pointer(struct intel_fbdev *fbdev)
>  	return fbdev ? fbdev->vma : NULL;
>  }
>  
> -void intel_fbdev_get_map(struct intel_fbdev *fbdev, struct iosys_map *map)
> +void intel_fbdev_get_map(struct intel_display *display, struct iosys_map *map)
>  {
> -	intel_fb_get_map(fbdev->vma, map);
> +	struct intel_fbdev *fbdev = display->fbdev.fbdev;
> +
> +	intel_parent_fb_pin_get_map(display, fbdev->vma, map);
>  }
> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.h b/drivers/gpu/drm/i915/display/intel_fbdev.h
> index 150cc5f45bb3..edaf5d16a456 100644
> --- a/drivers/gpu/drm/i915/display/intel_fbdev.h
> +++ b/drivers/gpu/drm/i915/display/intel_fbdev.h
> @@ -23,7 +23,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
>  void intel_fbdev_setup(struct intel_display *display);
>  struct intel_framebuffer *intel_fbdev_framebuffer(struct intel_fbdev *fbdev);
>  struct i915_vma *intel_fbdev_vma_pointer(struct intel_fbdev *fbdev);
> -void intel_fbdev_get_map(struct intel_fbdev *fbdev, struct iosys_map *map);
> +void intel_fbdev_get_map(struct intel_display *display, struct iosys_map *map);
>  #else
>  #define INTEL_FBDEV_DRIVER_OPS \
>  	.fbdev_probe = NULL
> @@ -40,7 +40,7 @@ static inline struct i915_vma *intel_fbdev_vma_pointer(struct intel_fbdev *fbdev
>  	return NULL;
>  }
>  
> -static inline void intel_fbdev_get_map(struct intel_fbdev *fbdev, struct iosys_map *map)
> +static inline void intel_fbdev_get_map(struct intel_display *display, struct iosys_map *map)
>  {
>  }
>  #endif
> diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c
> index 67b21a42d354..070cc60f49b3 100644
> --- a/drivers/gpu/drm/i915/display/intel_parent.c
> +++ b/drivers/gpu/drm/i915/display/intel_parent.c
> @@ -52,6 +52,13 @@ void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dp
>  		display->parent->dpt->resume(dpt);
>  }
>  
> +/* fb_pin */
> +void intel_parent_fb_pin_get_map(struct intel_display *display,
> +				 struct i915_vma *vma, struct iosys_map *map)
> +{
> +	return display->parent->fb_pin->get_map(vma, map);
> +}
> +
>  /* frontbuffer */
>  struct intel_frontbuffer *intel_parent_frontbuffer_get(struct intel_display *display, struct drm_gem_object *obj)
>  {
> diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h
> index 5f0c835b9416..2b9e829e7f47 100644
> --- a/drivers/gpu/drm/i915/display/intel_parent.h
> +++ b/drivers/gpu/drm/i915/display/intel_parent.h
> @@ -18,6 +18,7 @@ struct intel_frontbuffer;
>  struct intel_hdcp_gsc_context;
>  struct intel_panic;
>  struct intel_stolen_node;
> +struct iosys_map;
>  
>  /* dpt */
>  struct intel_dpt *intel_parent_dpt_create(struct intel_display *display,
> @@ -26,6 +27,10 @@ void intel_parent_dpt_destroy(struct intel_display *display, struct intel_dpt *d
>  void intel_parent_dpt_suspend(struct intel_display *display, struct intel_dpt *dpt);
>  void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dpt);
>  
> +/* fb_pin */
> +void intel_parent_fb_pin_get_map(struct intel_display *display,
> +				 struct i915_vma *vma, struct iosys_map *map);
> +
>  /* frontbuffer */
>  struct intel_frontbuffer *intel_parent_frontbuffer_get(struct intel_display *display, struct drm_gem_object *obj);
>  void intel_parent_frontbuffer_ref(struct intel_display *display, struct intel_frontbuffer *front);
> diff --git a/drivers/gpu/drm/i915/display/intel_plane.c b/drivers/gpu/drm/i915/display/intel_plane.c
> index c2b58d3b9c23..e50e1a15410a 100644
> --- a/drivers/gpu/drm/i915/display/intel_plane.c
> +++ b/drivers/gpu/drm/i915/display/intel_plane.c
> @@ -1404,7 +1404,7 @@ static void intel_panic_flush(struct drm_plane *_plane)
>  	if (fb == intel_fbdev_framebuffer(display->fbdev.fbdev)) {
>  		struct iosys_map map;
>  
> -		intel_fbdev_get_map(display->fbdev.fbdev, &map);
> +		intel_fbdev_get_map(display, &map);
>  		drm_clflush_virt_range(map.vaddr, fb->base.pitches[0] * fb->base.height);
>  		return;
>  	}
> @@ -1462,7 +1462,7 @@ static int intel_get_scanout_buffer(struct drm_plane *plane,
>  		return -ENODEV;
>  
>  	if (fb == intel_fbdev_framebuffer(display->fbdev.fbdev)) {
> -		intel_fbdev_get_map(display->fbdev.fbdev, &sb->map[0]);
> +		intel_fbdev_get_map(display, &sb->map[0]);
>  	} else {
>  		int ret;
>  		/* Can't disable tiling if DPT is in use */
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index d31819758f3d..c23436be5973 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -99,6 +99,7 @@
>  #include "i915_drv.h"
>  #include "i915_dsb_buffer.h"
>  #include "i915_edram.h"
> +#include "i915_fb_pin.h"
>  #include "i915_file_private.h"
>  #include "i915_getparam.h"
>  #include "i915_gmch.h"
> @@ -769,6 +770,7 @@ static const struct intel_display_parent_interface parent = {
>  	.bo = &i915_display_bo_interface,
>  	.dpt = &i915_display_dpt_interface,
>  	.dsb = &i915_display_dsb_interface,
> +	.fb_pin = &i915_display_fb_pin_interface,
>  	.frontbuffer = &i915_display_frontbuffer_interface,
>  	.hdcp = &i915_display_hdcp_interface,
>  	.initial_plane = &i915_display_initial_plane_interface,
> diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
> index b0e121462ca3..b800b55530a5 100644
> --- a/drivers/gpu/drm/i915/i915_fb_pin.c
> +++ b/drivers/gpu/drm/i915/i915_fb_pin.c
> @@ -8,6 +8,7 @@
>   */
>  
>  #include <drm/drm_print.h>
> +#include <drm/intel/display_parent_interface.h>
>  
>  #include "display/intel_display_core.h"
>  #include "display/intel_display_types.h"
> @@ -18,6 +19,7 @@
>  #include "gem/i915_gem_domain.h"
>  #include "gem/i915_gem_object.h"
>  
> +#include "i915_fb_pin.h"
>  #include "i915_dpt.h"
>  #include "i915_drv.h"
>  #include "i915_vma.h"
> @@ -352,7 +354,11 @@ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
>  	}
>  }
>  
> -void intel_fb_get_map(struct i915_vma *vma, struct iosys_map *map)
> +static void i915_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
>  {
>  	iosys_map_set_vaddr_iomem(map, i915_vma_get_iomap(vma));
>  }
> +
> +const struct intel_display_fb_pin_interface i915_display_fb_pin_interface = {
> +	.get_map = i915_fb_pin_get_map,
> +};
> diff --git a/drivers/gpu/drm/i915/i915_fb_pin.h b/drivers/gpu/drm/i915/i915_fb_pin.h
> new file mode 100644
> index 000000000000..18c6c0b61ab8
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/i915_fb_pin.h
> @@ -0,0 +1,9 @@
> +/* SPDX-License-Identifier: MIT */
> +/* Copyright © 2026 Intel Corporation */
> +
> +#ifndef __I915_FB_PIN_H__
> +#define __I915_FB_PIN_H__
> +
> +extern const struct intel_display_fb_pin_interface i915_display_fb_pin_interface;
> +
> +#endif /* __I915_FB_PIN_H__ */
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 0747044f7c2a..aa73023b7398 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -40,6 +40,7 @@
>  #include "xe_display_pcode.h"
>  #include "xe_display_rpm.h"
>  #include "xe_dsb_buffer.h"
> +#include "xe_fb_pin.h"
>  #include "xe_frontbuffer.h"
>  #include "xe_hdcp_gsc.h"
>  #include "xe_initial_plane.h"
> @@ -553,6 +554,7 @@ static bool has_auxccs(struct drm_device *drm)
>  static const struct intel_display_parent_interface parent = {
>  	.bo = &xe_display_bo_interface,
>  	.dsb = &xe_display_dsb_interface,
> +	.fb_pin = &xe_display_fb_pin_interface,
>  	.frontbuffer = &xe_display_frontbuffer_interface,
>  	.hdcp = &xe_display_hdcp_interface,
>  	.initial_plane = &xe_display_initial_plane_interface,
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index 948446346c53..afb6cdda537e 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -3,6 +3,7 @@
>   * Copyright © 2021 Intel Corporation
>   */
>  
> +#include <drm/intel/display_parent_interface.h>
>  #include <drm/ttm/ttm_bo.h>
>  
>  #include "intel_display_core.h"
> @@ -13,6 +14,7 @@
>  #include "xe_bo.h"
>  #include "xe_device.h"
>  #include "xe_display_vma.h"
> +#include "xe_fb_pin.h"
>  #include "xe_ggtt.h"
>  #include "xe_pat.h"
>  #include "xe_pm.h"
> @@ -498,7 +500,11 @@ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
>  	old_plane_state->ggtt_vma = NULL;
>  }
>  
> -void intel_fb_get_map(struct i915_vma *vma, struct iosys_map *map)
> +static void xe_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
>  {
>  	*map = vma->bo->vmap;
>  }
> +
> +const struct intel_display_fb_pin_interface xe_display_fb_pin_interface = {
> +	.get_map = xe_fb_pin_get_map,
> +};
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.h b/drivers/gpu/drm/xe/display/xe_fb_pin.h
> new file mode 100644
> index 000000000000..8a42d4009f5d
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.h
> @@ -0,0 +1,9 @@
> +/* SPDX-License-Identifier: MIT */
> +/* Copyright © 2026 Intel Corporation */
> +
> +#ifndef __XE_FB_PIN_H__
> +#define __XE_FB_PIN_H__
> +
> +extern const struct intel_display_fb_pin_interface xe_display_fb_pin_interface;
> +
> +#endif /* __XE_FB_PIN_H__ */
> diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
> index 270dc028bec2..ee2e9572bfca 100644
> --- a/include/drm/intel/display_parent_interface.h
> +++ b/include/drm/intel/display_parent_interface.h
> @@ -24,6 +24,7 @@ struct intel_hdcp_gsc_context;
>  struct intel_initial_plane_config;
>  struct intel_panic;
>  struct intel_stolen_node;
> +struct iosys_map;
>  struct ref_tracker;
>  struct seq_file;
>  struct vm_area_struct;
> @@ -69,6 +70,10 @@ struct intel_display_dsb_interface {
>  	void (*flush_map)(struct intel_dsb_buffer *dsb_buf);
>  };
>  
> +struct intel_display_fb_pin_interface {
> +	void (*get_map)(struct i915_vma *vma, struct iosys_map *map);
> +};
> +
>  struct intel_display_frontbuffer_interface {
>  	struct intel_frontbuffer *(*get)(struct drm_gem_object *obj);
>  	void (*ref)(struct intel_frontbuffer *front);
> @@ -211,6 +216,9 @@ struct intel_display_parent_interface {
>  	/** @dsb: DSB buffer interface */
>  	const struct intel_display_dsb_interface *dsb;
>  
> +	/** @fb_pin: Framebuffer pin interface */
> +	const struct intel_display_fb_pin_interface *fb_pin;
> +
>  	/** @frontbuffer: Frontbuffer interface */
>  	const struct intel_display_frontbuffer_interface *frontbuffer;

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 02/16] drm/i915: Move intel_fb_pin_params to the parent interface
  2026-04-23 16:53 ` [PATCH 02/16] drm/i915: Move intel_fb_pin_params to the parent interface Ville Syrjala
@ 2026-04-24  9:19   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24  9:19 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> strut intel_fb_pin_params will be an important part of the fb_pin
> interface, so move the definition to the parent interface file.
>
> Or maybe we should have a separate header for this kind of stuff
> since the users of the parent interface will need the struct
> definition but not the parent interface vfunc struct definitions?

Yeah, another hard one. I've tried to keep the interface definition
clear of other type definitions, and in particular to use types that are
readily available in generic drm headers. Or opaque pointers.

I think let's see how bad it gets. We're bound to need a few structs
specific to this interface, like struct intel_fb_pin_params. If it's
just a few structs, and they don't need to include the world for their
definition, let's just keep them here. But if it starts to look like
there'll be plenty, and they need a bunch of dependencies, let's split
them out. It's not a big deal to do that later.

Reviewed-by: Jani Nikula <jani.nikula@intel.com>


>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_fb_pin.h  | 12 +-----------
>  drivers/gpu/drm/i915/display/intel_fbdev.c   |  1 +
>  include/drm/intel/display_parent_interface.h | 12 ++++++++++++
>  3 files changed, 14 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_fb_pin.h b/drivers/gpu/drm/i915/display/intel_fb_pin.h
> index 805e23067004..84530f20d7d1 100644
> --- a/drivers/gpu/drm/i915/display/intel_fb_pin.h
> +++ b/drivers/gpu/drm/i915/display/intel_fb_pin.h
> @@ -10,21 +10,11 @@
>  
>  struct drm_gem_object;
>  struct i915_vma;
> +struct intel_fb_pin_params;
>  struct intel_plane_state;
>  struct i915_gtt_view;
>  struct iosys_map;
>  
> -struct intel_fb_pin_params {
> -	const struct i915_gtt_view *view;
> -	unsigned int alignment;
> -	unsigned int phys_alignment;
> -	unsigned int vtd_guard;
> -	bool needs_cpu_lmem_access;
> -	bool needs_low_address;
> -	bool needs_physical;
> -	bool needs_fence;
> -};
> -
>  struct i915_vma *
>  intel_fb_pin_to_ggtt(struct drm_gem_object *obj,
>  		     const struct intel_fb_pin_params *pin_params,
> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
> index ce4082da30e8..aa2701795caa 100644
> --- a/drivers/gpu/drm/i915/display/intel_fbdev.c
> +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
> @@ -38,6 +38,7 @@
>  #include <linux/vga_switcheroo.h>
>  
>  #include <drm/clients/drm_client_setup.h>
> +#include <drm/intel/display_parent_interface.h>
>  #include <drm/drm_crtc.h>
>  #include <drm/drm_crtc_helper.h>
>  #include <drm/drm_fb_helper.h>
> diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
> index ee2e9572bfca..b363d6a85dfe 100644
> --- a/include/drm/intel/display_parent_interface.h
> +++ b/include/drm/intel/display_parent_interface.h
> @@ -16,6 +16,7 @@ struct drm_mode_fb_cmd2;
>  struct drm_plane_state;
>  struct drm_scanout_buffer;
>  struct fb_info;
> +struct i915_gtt_view;
>  struct i915_vma;
>  struct intel_dpt;
>  struct intel_dsb_buffer;
> @@ -29,6 +30,17 @@ struct ref_tracker;
>  struct seq_file;
>  struct vm_area_struct;
>  
> +struct intel_fb_pin_params {
> +	const struct i915_gtt_view *view;
> +	unsigned int alignment;
> +	unsigned int phys_alignment;
> +	unsigned int vtd_guard;
> +	bool needs_cpu_lmem_access;
> +	bool needs_low_address;
> +	bool needs_physical;
> +	bool needs_fence;
> +};
> +
>  /* Keep struct definitions sorted */
>  
>  struct intel_display_bo_interface {

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 03/16] drm/i915: Move the i915_dpt_offset()==0 assert
  2026-04-23 16:53 ` [PATCH 03/16] drm/i915: Move the i915_dpt_offset()==0 assert Ville Syrjala
@ 2026-04-24  9:19   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24  9:19 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Move the i915_dpt_offset() check into the lower level
> intel_fb_pin_to_dpt() function. Clears out some of the unnecessary
> junk from the higher level code, making it easier to introduce
> the new fb_pin parent interface.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> ---
>  drivers/gpu/drm/i915/i915_fb_pin.c | 13 ++++++-------
>  1 file changed, 6 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
> index b800b55530a5..400ad8768c11 100644
> --- a/drivers/gpu/drm/i915/i915_fb_pin.c
> +++ b/drivers/gpu/drm/i915/i915_fb_pin.c
> @@ -101,6 +101,12 @@ intel_fb_pin_to_dpt(struct drm_gem_object *_obj, struct intel_dpt *dpt,
>  	i915_gem_object_flush_if_display(obj);
>  
>  	i915_vma_get(vma);
> +
> +	/*
> +	 * The DPT object contains only one vma, and there is no VT-d
> +	 * guard, so the VMA's offset within the DPT is always 0.
> +	 */
> +	drm_WARN_ON(&i915->drm, i915_dpt_offset(vma));
>  err:
>  	atomic_dec(&i915->pending_fb_pin);
>  
> @@ -255,7 +261,6 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
>  		       const struct intel_plane_state *old_plane_state)
>  {
>  	struct intel_display *display = to_intel_display(plane_state);
> -	struct drm_i915_private *i915 = to_i915(plane_state->uapi.plane->dev);
>  	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
>  	const struct intel_framebuffer *fb =
>  		to_intel_framebuffer(plane_state->hw.fb);
> @@ -304,12 +309,6 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
>  		plane_state->dpt_vma = vma;
>  
>  		WARN_ON(plane_state->ggtt_vma == plane_state->dpt_vma);
> -
> -		/*
> -		 * The DPT object contains only one vma, and there is no VT-d
> -		 * guard, so the VMA's offset within the DPT is always 0.
> -		 */
> -		drm_WARN_ON(&i915->drm, i915_dpt_offset(plane_state->dpt_vma));
>  	}
>  
>  	/*

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 04/16] drm/i915: Reorganize intel_plane_pin_fb() a bit
  2026-04-23 16:53 ` [PATCH 04/16] drm/i915: Reorganize intel_plane_pin_fb() a bit Ville Syrjala
@ 2026-04-24  9:55   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24  9:55 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Move most of the plane state stuff out from the inner parts
> of intel_plane_pin_fb(). The plan is to take those inner parts and
> abstract them into the new fb_pin parent interface, and we don't
> want any plane_state stuff there.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> ---
>  drivers/gpu/drm/i915/i915_fb_pin.c | 67 +++++++++++++++---------------
>  1 file changed, 33 insertions(+), 34 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
> index 400ad8768c11..bc2e185b4573 100644
> --- a/drivers/gpu/drm/i915/i915_fb_pin.c
> +++ b/drivers/gpu/drm/i915/i915_fb_pin.c
> @@ -264,7 +264,10 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
>  	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
>  	const struct intel_framebuffer *fb =
>  		to_intel_framebuffer(plane_state->hw.fb);
> -	struct i915_vma *vma;
> +	struct i915_vma *ggtt_vma = NULL;
> +	struct i915_vma *dpt_vma = NULL;
> +	int fence_id = -1;
> +	u32 offset;
>  
>  	if (!intel_fb_uses_dpt(&fb->base)) {
>  		struct intel_fb_pin_params pin_params = {
> @@ -277,15 +280,25 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
>  			.needs_physical = intel_plane_needs_physical(plane),
>  			.needs_fence = intel_plane_needs_fence(display),
>  		};
> -		int fence_id = -1;
>  
> -		vma = intel_fb_pin_to_ggtt(intel_fb_bo(&fb->base), &pin_params,
> -					   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
> -		if (IS_ERR(vma))
> -			return PTR_ERR(vma);
> +		ggtt_vma = intel_fb_pin_to_ggtt(intel_fb_bo(&fb->base), &pin_params,
> +						intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
> +		if (IS_ERR(ggtt_vma))
> +			return PTR_ERR(ggtt_vma);
>  
> -		plane_state->ggtt_vma = vma;
> -		plane_state->fence_id = fence_id;
> +		/*
> +		 * Pre-populate the dma address before we enter the vblank
> +		 * evade critical section as i915_gem_object_get_dma_address()
> +		 * will trigger might_sleep() even if it won't actually sleep,
> +		 * which is the case when the fb has already been pinned.
> +		 */
> +		if (intel_plane_needs_physical(plane)) {
> +			struct drm_i915_gem_object *obj = to_intel_bo(intel_fb_bo(&fb->base));
> +
> +			offset = i915_gem_object_get_dma_address(obj, 0);
> +		} else {
> +			offset = i915_ggtt_offset(ggtt_vma);
> +		}
>  	} else {
>  		struct intel_fb_pin_params pin_params = {
>  			.view = &plane_state->view.gtt,
> @@ -293,39 +306,25 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
>  			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
>  		};
>  
> -		vma = i915_dpt_pin_to_ggtt(fb->dpt, pin_params.alignment / 512);
> -		if (IS_ERR(vma))
> -			return PTR_ERR(vma);
> +		ggtt_vma = i915_dpt_pin_to_ggtt(fb->dpt, pin_params.alignment / 512);
> +		if (IS_ERR(ggtt_vma))
> +			return PTR_ERR(ggtt_vma);
>  
> -		plane_state->ggtt_vma = vma;
> -
> -		vma = intel_fb_pin_to_dpt(intel_fb_bo(&fb->base), fb->dpt, &pin_params);
> -		if (IS_ERR(vma)) {
> +		dpt_vma = intel_fb_pin_to_dpt(intel_fb_bo(&fb->base), fb->dpt, &pin_params);
> +		if (IS_ERR(dpt_vma)) {
>  			i915_dpt_unpin_from_ggtt(fb->dpt);
> -			plane_state->ggtt_vma = NULL;
> -			return PTR_ERR(vma);
> +			return PTR_ERR(dpt_vma);
>  		}
>  
> -		plane_state->dpt_vma = vma;
> +		WARN_ON(ggtt_vma == dpt_vma);
>  
> -		WARN_ON(plane_state->ggtt_vma == plane_state->dpt_vma);
> +		offset = i915_ggtt_offset(ggtt_vma);
>  	}
>  
> -	/*
> -	 * Pre-populate the dma address before we enter the vblank
> -	 * evade critical section as i915_gem_object_get_dma_address()
> -	 * will trigger might_sleep() even if it won't actually sleep,
> -	 * which is the case when the fb has already been pinned.
> -	 */
> -	if (intel_plane_needs_physical(plane)) {
> -		struct drm_i915_gem_object *obj = to_intel_bo(intel_fb_bo(&fb->base));
> -
> -		plane_state->surf = i915_gem_object_get_dma_address(obj, 0) +
> -			plane->surf_offset(plane_state);
> -	} else {
> -		plane_state->surf = i915_ggtt_offset(plane_state->ggtt_vma) +
> -			plane->surf_offset(plane_state);
> -	}
> +	plane_state->dpt_vma = dpt_vma;
> +	plane_state->ggtt_vma = ggtt_vma;
> +	plane_state->fence_id = fence_id;
> +	plane_state->surf = offset + plane->surf_offset(plane_state);
>  
>  	return 0;
>  }

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 05/16] drm/i915: Introduce i915_fb_pin_dpt_(un)pin()
  2026-04-23 16:53 ` [PATCH 05/16] drm/i915: Introduce i915_fb_pin_dpt_(un)pin() Ville Syrjala
@ 2026-04-24  9:56   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24  9:56 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Extract the inner DPT parts of intel_plane_(un)pin() into the
> i915_fb_pin_dpt_(un)pin(). These will become part of the new
> fb_pin parent interface.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> ---
>  drivers/gpu/drm/i915/i915_fb_pin.c | 76 ++++++++++++++++++++++--------
>  1 file changed, 56 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
> index bc2e185b4573..0019f570d843 100644
> --- a/drivers/gpu/drm/i915/i915_fb_pin.c
> +++ b/drivers/gpu/drm/i915/i915_fb_pin.c
> @@ -257,6 +257,49 @@ intel_plane_fb_vtd_guard(const struct intel_plane_state *plane_state)
>  				       plane_state->hw.rotation);
>  }
>  
> +static int i915_fb_pin_dpt_pin(struct drm_gem_object *obj, struct intel_dpt *dpt,
> +			       const struct intel_fb_pin_params *pin_params,
> +			       struct i915_vma **out_dpt_vma,
> +			       struct i915_vma **out_ggtt_vma,
> +			       u32 *out_offset)
> +{
> +	struct i915_vma *ggtt_vma, *dpt_vma;
> +
> +	WARN_ON(!dpt);
> +
> +	ggtt_vma = i915_dpt_pin_to_ggtt(dpt, pin_params->alignment / 512);
> +	if (IS_ERR(ggtt_vma))
> +		return PTR_ERR(ggtt_vma);
> +
> +	dpt_vma = intel_fb_pin_to_dpt(obj, dpt, pin_params);
> +	if (IS_ERR(dpt_vma)) {
> +		i915_dpt_unpin_from_ggtt(dpt);
> +		return PTR_ERR(dpt_vma);
> +	}
> +
> +	drm_WARN_ON(obj->dev, ggtt_vma == dpt_vma);
> +
> +	*out_ggtt_vma = ggtt_vma;
> +	*out_dpt_vma = dpt_vma;
> +
> +	*out_offset = i915_ggtt_offset(ggtt_vma);
> +
> +	return 0;
> +}
> +
> +static void i915_fb_pin_dpt_unpin(struct intel_dpt *dpt,
> +				  struct i915_vma *dpt_vma,
> +				  struct i915_vma *ggtt_vma)
> +{
> +	WARN_ON(!dpt);
> +	WARN_ON(!!dpt_vma != !!ggtt_vma);
> +
> +	if (dpt_vma)
> +		intel_fb_unpin_vma(dpt_vma, -1);
> +	if (ggtt_vma)
> +		i915_dpt_unpin_from_ggtt(dpt);
> +}
> +
>  int intel_plane_pin_fb(struct intel_plane_state *plane_state,
>  		       const struct intel_plane_state *old_plane_state)
>  {
> @@ -268,6 +311,7 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
>  	struct i915_vma *dpt_vma = NULL;
>  	int fence_id = -1;
>  	u32 offset;
> +	int ret;
>  
>  	if (!intel_fb_uses_dpt(&fb->base)) {
>  		struct intel_fb_pin_params pin_params = {
> @@ -306,19 +350,11 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
>  			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
>  		};
>  
> -		ggtt_vma = i915_dpt_pin_to_ggtt(fb->dpt, pin_params.alignment / 512);
> -		if (IS_ERR(ggtt_vma))
> -			return PTR_ERR(ggtt_vma);
> -
> -		dpt_vma = intel_fb_pin_to_dpt(intel_fb_bo(&fb->base), fb->dpt, &pin_params);
> -		if (IS_ERR(dpt_vma)) {
> -			i915_dpt_unpin_from_ggtt(fb->dpt);
> -			return PTR_ERR(dpt_vma);
> -		}
> -
> -		WARN_ON(ggtt_vma == dpt_vma);
> -
> -		offset = i915_ggtt_offset(ggtt_vma);
> +		ret = i915_fb_pin_dpt_pin(intel_fb_bo(&fb->base), fb->dpt,
> +					  &pin_params, &dpt_vma,
> +					  &ggtt_vma, &offset);
> +		if (ret)
> +			return ret;
>  	}
>  
>  	plane_state->dpt_vma = dpt_vma;
> @@ -333,22 +369,22 @@ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
>  {
>  	const struct intel_framebuffer *fb =
>  		to_intel_framebuffer(old_plane_state->hw.fb);
> -	struct i915_vma *vma;
>  
>  	if (!intel_fb_uses_dpt(&fb->base)) {
> +		struct i915_vma *vma;
> +
>  		vma = fetch_and_zero(&old_plane_state->ggtt_vma);
>  		if (vma) {
>  			intel_fb_unpin_vma(vma, old_plane_state->fence_id);
>  			old_plane_state->fence_id = -1;
>  		}
>  	} else {
> -		vma = fetch_and_zero(&old_plane_state->dpt_vma);
> -		if (vma)
> -			intel_fb_unpin_vma(vma, -1);
> +		i915_fb_pin_dpt_unpin(fb->dpt,
> +				      old_plane_state->dpt_vma,
> +				      old_plane_state->ggtt_vma);
>  
> -		vma = fetch_and_zero(&old_plane_state->ggtt_vma);
> -		if (vma)
> -			i915_dpt_unpin_from_ggtt(fb->dpt);
> +		old_plane_state->dpt_vma = NULL;
> +		old_plane_state->ggtt_vma = NULL;
>  	}
>  }

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 06/16] drm/i915: Introduce i915_fb_pin_ggtt_(un)pin()
  2026-04-23 16:53 ` [PATCH 06/16] drm/i915: Introduce i915_fb_pin_ggtt_(un)pin() Ville Syrjala
@ 2026-04-24  9:59   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24  9:59 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Extract the inner DPT parts of intel_plane_(un)pin() into the
> i915_fb_pin_ggtt_(un)pin(). These will become part of the new
> fb_pin parent interface.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> ---
>  drivers/gpu/drm/i915/i915_fb_pin.c | 68 +++++++++++++++++++-----------
>  1 file changed, 44 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
> index 0019f570d843..e14d2c1fb81f 100644
> --- a/drivers/gpu/drm/i915/i915_fb_pin.c
> +++ b/drivers/gpu/drm/i915/i915_fb_pin.c
> @@ -257,6 +257,41 @@ intel_plane_fb_vtd_guard(const struct intel_plane_state *plane_state)
>  				       plane_state->hw.rotation);
>  }
>  
> +static int i915_fb_pin_ggtt_pin(struct drm_gem_object *obj,
> +				const struct intel_fb_pin_params *pin_params,
> +				struct i915_vma **out_ggtt_vma,
> +				u32 *out_offset,
> +				int *out_fence_id)
> +{
> +	struct i915_vma *ggtt_vma;
> +
> +	ggtt_vma = intel_fb_pin_to_ggtt(obj, pin_params, out_fence_id);
> +	if (IS_ERR(ggtt_vma))
> +		return PTR_ERR(ggtt_vma);
> +
> +	*out_ggtt_vma = ggtt_vma;
> +
> +	/*
> +	 * Pre-populate the dma address before we enter the vblank
> +	 * evade critical section as i915_gem_object_get_dma_address()
> +	 * will trigger might_sleep() even if it won't actually sleep,
> +	 * which is the case when the fb has already been pinned.
> +	 */
> +	if (pin_params->needs_physical)
> +		*out_offset = i915_gem_object_get_dma_address(to_intel_bo(obj), 0);
> +	else
> +		*out_offset = i915_ggtt_offset(ggtt_vma);
> +
> +	return 0;
> +}
> +
> +static void i915_fb_pin_ggtt_unpin(struct i915_vma *ggtt_vma,
> +				   int fence_id)
> +{
> +	if (ggtt_vma)
> +		intel_fb_unpin_vma(ggtt_vma, fence_id);
> +}
> +
>  static int i915_fb_pin_dpt_pin(struct drm_gem_object *obj, struct intel_dpt *dpt,
>  			       const struct intel_fb_pin_params *pin_params,
>  			       struct i915_vma **out_dpt_vma,
> @@ -325,24 +360,11 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
>  			.needs_fence = intel_plane_needs_fence(display),
>  		};
>  
> -		ggtt_vma = intel_fb_pin_to_ggtt(intel_fb_bo(&fb->base), &pin_params,
> -						intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
> -		if (IS_ERR(ggtt_vma))
> -			return PTR_ERR(ggtt_vma);
> -
> -		/*
> -		 * Pre-populate the dma address before we enter the vblank
> -		 * evade critical section as i915_gem_object_get_dma_address()
> -		 * will trigger might_sleep() even if it won't actually sleep,
> -		 * which is the case when the fb has already been pinned.
> -		 */
> -		if (intel_plane_needs_physical(plane)) {
> -			struct drm_i915_gem_object *obj = to_intel_bo(intel_fb_bo(&fb->base));
> -
> -			offset = i915_gem_object_get_dma_address(obj, 0);
> -		} else {
> -			offset = i915_ggtt_offset(ggtt_vma);
> -		}
> +		ret = i915_fb_pin_ggtt_pin(intel_fb_bo(&fb->base),
> +					   &pin_params, &ggtt_vma, &offset,
> +					   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
> +		if (ret)
> +			return ret;
>  	} else {
>  		struct intel_fb_pin_params pin_params = {
>  			.view = &plane_state->view.gtt,
> @@ -371,13 +393,11 @@ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
>  		to_intel_framebuffer(old_plane_state->hw.fb);
>  
>  	if (!intel_fb_uses_dpt(&fb->base)) {
> -		struct i915_vma *vma;
> +		i915_fb_pin_ggtt_unpin(old_plane_state->ggtt_vma,
> +				       old_plane_state->fence_id);
>  
> -		vma = fetch_and_zero(&old_plane_state->ggtt_vma);
> -		if (vma) {
> -			intel_fb_unpin_vma(vma, old_plane_state->fence_id);
> -			old_plane_state->fence_id = -1;
> -		}
> +		old_plane_state->ggtt_vma = NULL;
> +		old_plane_state->fence_id = -1;
>  	} else {
>  		i915_fb_pin_dpt_unpin(fb->dpt,
>  				      old_plane_state->dpt_vma,

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 07/16] drm/xe: Move the FORCE_WC assert into __xe_pin_fb_vma()
  2026-04-23 16:53 ` [PATCH 07/16] drm/xe: Move the FORCE_WC assert into __xe_pin_fb_vma() Ville Syrjala
@ 2026-04-24 10:02   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24 10:02 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> No need to bother the higher level pinning code with the
> FORCE_WC assert. Move it into the lower level function.

Might mention that this introduces the check also to the
intel_fb_pin_to_ggtt() path.

Reviewed-by: Jani Nikula <jani.nikula@intel.com>


>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/xe/display/xe_fb_pin.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index afb6cdda537e..487c092cd000 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -329,6 +329,9 @@ static struct i915_vma *__xe_pin_fb_vma(struct drm_gem_object *obj, bool is_dpt,
>  	struct drm_exec exec;
>  	int ret = 0;
>  
> +	/* We reject creating !SCANOUT fb's, so this is weird.. */
> +	drm_WARN_ON(bo->ttm.base.dev, !(bo->flags & XE_BO_FLAG_FORCE_WC));
> +
>  	if (!vma)
>  		return ERR_PTR(-ENODEV);
>  
> @@ -466,7 +469,6 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  {
>  	struct drm_framebuffer *fb = new_plane_state->hw.fb;
>  	struct drm_gem_object *obj = intel_fb_bo(fb);
> -	struct xe_bo *bo = gem_to_xe_bo(obj);
>  	struct i915_vma *vma;
>  	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
>  	struct intel_fb_pin_params pin_params = {
> @@ -478,9 +480,6 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  	if (reuse_vma(new_plane_state, old_plane_state))
>  		return 0;
>  
> -	/* We reject creating !SCANOUT fb's, so this is weird.. */
> -	drm_WARN_ON(bo->ttm.base.dev, !(bo->flags & XE_BO_FLAG_FORCE_WC));
> -
>  	vma = __xe_pin_fb_vma(obj, intel_fb_uses_dpt(fb), &pin_params);
>  
>  	if (IS_ERR(vma))

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 08/16] drm/xe: Kill the fbdev vma reuse hack
  2026-04-23 16:53 ` [PATCH 08/16] drm/xe: Kill the fbdev vma reuse hack Ville Syrjala
@ 2026-04-24 10:06   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24 10:06 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> This fbdev vma reuse hacks is a massive layering violation. It
> really does not belong in the fb pinning code. And it's in the
> way of properly abstracting this stuff, so kill it.

Might mention what the fallout is. Need to create a new vma etc.

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/xe/display/xe_fb_pin.c | 10 ----------
>  1 file changed, 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index 487c092cd000..bbeb5c2a6c51 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -10,7 +10,6 @@
>  #include "intel_display_types.h"
>  #include "intel_fb.h"
>  #include "intel_fb_pin.h"
> -#include "intel_fbdev.h"
>  #include "xe_bo.h"
>  #include "xe_device.h"
>  #include "xe_display_vma.h"
> @@ -432,10 +431,7 @@ void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
>  static bool reuse_vma(struct intel_plane_state *new_plane_state,
>  		      const struct intel_plane_state *old_plane_state)
>  {
> -	struct intel_framebuffer *fb = to_intel_framebuffer(new_plane_state->hw.fb);
>  	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
> -	struct xe_device *xe = to_xe_device(fb->base.dev);
> -	struct intel_display *display = xe->display;
>  	struct i915_vma *vma;
>  
>  	if (old_plane_state->hw.fb == new_plane_state->hw.fb &&
> @@ -446,12 +442,6 @@ static bool reuse_vma(struct intel_plane_state *new_plane_state,
>  		goto found;
>  	}
>  
> -	if (fb == intel_fbdev_framebuffer(display->fbdev.fbdev)) {
> -		vma = intel_fbdev_vma_pointer(display->fbdev.fbdev);
> -		if (vma)
> -			goto found;
> -	}
> -
>  	return false;
>  
>  found:

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 09/16] drm/xe: Reorganize intel_plane_pin_fb() a bit
  2026-04-23 16:53 ` [PATCH 09/16] drm/xe: Reorganize intel_plane_pin_fb() a bit Ville Syrjala
@ 2026-04-24 10:07   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24 10:07 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Move most of the plane state stuff out from the inner parts
> of intel_plane_pin_fb(). The plan is to take those inner parts and
> abstract them into the new fb_pin parent interface, and we don't
> want any plane_state stuff there.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> ---
>  drivers/gpu/drm/xe/display/xe_fb_pin.c | 20 ++++++++++++--------
>  1 file changed, 12 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index bbeb5c2a6c51..9774089ee75c 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -459,26 +459,30 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  {
>  	struct drm_framebuffer *fb = new_plane_state->hw.fb;
>  	struct drm_gem_object *obj = intel_fb_bo(fb);
> -	struct i915_vma *vma;
>  	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
>  	struct intel_fb_pin_params pin_params = {
>  		.view = &new_plane_state->view.gtt,
>  		.alignment = plane->min_alignment(plane, fb, 0),
>  		.needs_cpu_lmem_access = intel_fb_needs_cpu_access(fb),
>  	};
> +	struct i915_vma *ggtt_vma = NULL;
> +	struct i915_vma *dpt_vma = NULL;
> +	int fence_id = -1;
> +	u32 offset;
>  
>  	if (reuse_vma(new_plane_state, old_plane_state))
>  		return 0;
>  
> -	vma = __xe_pin_fb_vma(obj, intel_fb_uses_dpt(fb), &pin_params);
> +	ggtt_vma = __xe_pin_fb_vma(obj, intel_fb_uses_dpt(fb), &pin_params);
> +	if (IS_ERR(ggtt_vma))
> +		return PTR_ERR(ggtt_vma);
>  
> -	if (IS_ERR(vma))
> -		return PTR_ERR(vma);
> +	offset = xe_ggtt_node_addr(ggtt_vma->node);
>  
> -	new_plane_state->ggtt_vma = vma;
> -
> -	new_plane_state->surf = xe_ggtt_node_addr(new_plane_state->ggtt_vma->node) +
> -		plane->surf_offset(new_plane_state);
> +	new_plane_state->dpt_vma = dpt_vma;
> +	new_plane_state->ggtt_vma = ggtt_vma;
> +	new_plane_state->fence_id = fence_id;
> +	new_plane_state->surf = offset + plane->surf_offset(new_plane_state);
>  
>  	return 0;
>  }

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 10/16] drm/xe: Introduce xe_fb_pin_dpt_(un)pin()
  2026-04-23 16:53 ` [PATCH 10/16] drm/xe: Introduce xe_fb_pin_dpt_(un)pin() Ville Syrjala
@ 2026-04-24 10:12   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24 10:12 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Extract the inner DPT parts of intel_plane_(un)pin() into the
> xe_fb_pin_dpt_(un)pin(). These will become part of the new
> fb_pin parent interface.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> ---
>  drivers/gpu/drm/xe/display/xe_fb_pin.c | 69 ++++++++++++++++++++++----
>  1 file changed, 59 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index 9774089ee75c..46f6ae6acc4e 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -428,6 +428,36 @@ void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
>  	__xe_unpin_fb_vma(vma);
>  }
>  
> +static int xe_fb_pin_dpt_pin(struct drm_gem_object *obj, struct intel_dpt *dpt,
> +			     const struct intel_fb_pin_params *pin_params,
> +			     struct i915_vma **out_dpt_vma,
> +			     struct i915_vma **out_ggtt_vma,
> +			     u32 *out_offset)
> +{
> +	struct i915_vma *ggtt_vma;
> +
> +	WARN_ON(dpt);
> +
> +	ggtt_vma = __xe_pin_fb_vma(obj, true, pin_params);
> +	if (IS_ERR(ggtt_vma))
> +		return PTR_ERR(ggtt_vma);
> +
> +	*out_dpt_vma = NULL; /* not used on xe */
> +	*out_ggtt_vma = ggtt_vma;
> +	*out_offset = xe_ggtt_node_addr(ggtt_vma->node);
> +
> +	return 0;
> +}
> +
> +static void xe_fb_pin_dpt_unpin(struct intel_dpt *dpt,
> +				struct i915_vma *dpt_vma,
> +				struct i915_vma *ggtt_vma)
> +{
> +	WARN_ON(dpt || dpt_vma);
> +
> +	__xe_unpin_fb_vma(ggtt_vma);
> +}
> +
>  static bool reuse_vma(struct intel_plane_state *new_plane_state,
>  		      const struct intel_plane_state *old_plane_state)
>  {
> @@ -457,27 +487,35 @@ static bool reuse_vma(struct intel_plane_state *new_plane_state,
>  int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  		       const struct intel_plane_state *old_plane_state)
>  {
> -	struct drm_framebuffer *fb = new_plane_state->hw.fb;
> -	struct drm_gem_object *obj = intel_fb_bo(fb);
> +	struct intel_framebuffer *fb = to_intel_framebuffer(new_plane_state->hw.fb);
> +	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
>  	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
>  	struct intel_fb_pin_params pin_params = {
>  		.view = &new_plane_state->view.gtt,
> -		.alignment = plane->min_alignment(plane, fb, 0),
> -		.needs_cpu_lmem_access = intel_fb_needs_cpu_access(fb),
> +		.alignment = plane->min_alignment(plane, &fb->base, 0),
> +		.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
>  	};
>  	struct i915_vma *ggtt_vma = NULL;
>  	struct i915_vma *dpt_vma = NULL;
>  	int fence_id = -1;
>  	u32 offset;
> +	int ret;
>  
>  	if (reuse_vma(new_plane_state, old_plane_state))
>  		return 0;
>  
> -	ggtt_vma = __xe_pin_fb_vma(obj, intel_fb_uses_dpt(fb), &pin_params);
> -	if (IS_ERR(ggtt_vma))
> -		return PTR_ERR(ggtt_vma);
> +	if (!intel_fb_uses_dpt(&fb->base)) {
> +		ggtt_vma = __xe_pin_fb_vma(obj, false, &pin_params);
> +		if (IS_ERR(ggtt_vma))
> +			return PTR_ERR(ggtt_vma);
>  
> -	offset = xe_ggtt_node_addr(ggtt_vma->node);
> +		offset = xe_ggtt_node_addr(ggtt_vma->node);
> +	} else {
> +		ret = xe_fb_pin_dpt_pin(obj, fb->dpt, &pin_params,
> +					&dpt_vma, &ggtt_vma, &offset);
> +		if (ret)
> +			return ret;
> +	}
>  
>  	new_plane_state->dpt_vma = dpt_vma;
>  	new_plane_state->ggtt_vma = ggtt_vma;
> @@ -489,8 +527,19 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  
>  void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
>  {
> -	__xe_unpin_fb_vma(old_plane_state->ggtt_vma);
> -	old_plane_state->ggtt_vma = NULL;
> +	const struct intel_framebuffer *fb = to_intel_framebuffer(old_plane_state->hw.fb);
> +
> +	if (!intel_fb_uses_dpt(&fb->base)) {
> +		__xe_unpin_fb_vma(old_plane_state->ggtt_vma);
> +
> +		old_plane_state->ggtt_vma = NULL;
> +	} else {
> +		xe_fb_pin_dpt_unpin(fb->dpt, old_plane_state->dpt_vma,
> +				    old_plane_state->ggtt_vma);
> +
> +		old_plane_state->dpt_vma = NULL;
> +		old_plane_state->ggtt_vma = NULL;
> +	}
>  }
>  
>  static void xe_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 11/16] drm/xe: Introduce xe_fb_pin_ggtt_(un)pin()
  2026-04-23 16:53 ` [PATCH 11/16] drm/xe: Introduce xe_fb_pin_ggtt_(un)pin() Ville Syrjala
@ 2026-04-24 10:13   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24 10:13 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Extract the inner DPT parts of intel_plane_(un)pin() into the
> xe_fb_pin_ggtt_(un)pin(). These will become part of the new
> fb_pin parent interface.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> ---
>  drivers/gpu/drm/xe/display/xe_fb_pin.c | 41 ++++++++++++++++++++++----
>  1 file changed, 35 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index 46f6ae6acc4e..bdd6a4da0997 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -428,6 +428,34 @@ void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
>  	__xe_unpin_fb_vma(vma);
>  }
>  
> +static int xe_fb_pin_ggtt_pin(struct drm_gem_object *obj,
> +			      const struct intel_fb_pin_params *pin_params,
> +			      struct i915_vma **out_ggtt_vma,
> +			      u32 *out_offset,
> +			      int *out_fence_id)
> +{
> +	struct i915_vma *ggtt_vma;
> +
> +	ggtt_vma = __xe_pin_fb_vma(obj, false, pin_params);
> +	if (IS_ERR(ggtt_vma))
> +		return PTR_ERR(ggtt_vma);
> +
> +	*out_ggtt_vma = ggtt_vma;
> +	*out_offset = xe_ggtt_node_addr(ggtt_vma->node);
> +	if (out_fence_id)
> +		*out_fence_id = -1;
> +
> +	return 0;
> +}
> +
> +static void xe_fb_pin_ggtt_unpin(struct i915_vma *ggtt_vma,
> +				 int fence_id)
> +{
> +	WARN_ON(fence_id >= 0);
> +
> +	__xe_unpin_fb_vma(ggtt_vma);
> +}
> +
>  static int xe_fb_pin_dpt_pin(struct drm_gem_object *obj, struct intel_dpt *dpt,
>  			     const struct intel_fb_pin_params *pin_params,
>  			     struct i915_vma **out_dpt_vma,
> @@ -505,11 +533,10 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  		return 0;
>  
>  	if (!intel_fb_uses_dpt(&fb->base)) {
> -		ggtt_vma = __xe_pin_fb_vma(obj, false, &pin_params);
> -		if (IS_ERR(ggtt_vma))
> -			return PTR_ERR(ggtt_vma);
> -
> -		offset = xe_ggtt_node_addr(ggtt_vma->node);
> +		ret = xe_fb_pin_ggtt_pin(obj, &pin_params,
> +					 &ggtt_vma, &offset, NULL);
> +		if (ret)
> +			return ret;
>  	} else {
>  		ret = xe_fb_pin_dpt_pin(obj, fb->dpt, &pin_params,
>  					&dpt_vma, &ggtt_vma, &offset);
> @@ -530,9 +557,11 @@ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
>  	const struct intel_framebuffer *fb = to_intel_framebuffer(old_plane_state->hw.fb);
>  
>  	if (!intel_fb_uses_dpt(&fb->base)) {
> -		__xe_unpin_fb_vma(old_plane_state->ggtt_vma);
> +		xe_fb_pin_ggtt_unpin(old_plane_state->ggtt_vma,
> +				     old_plane_state->fence_id);
>  
>  		old_plane_state->ggtt_vma = NULL;
> +		old_plane_state->fence_id = -1;
>  	} else {
>  		xe_fb_pin_dpt_unpin(fb->dpt, old_plane_state->dpt_vma,
>  				    old_plane_state->ggtt_vma);

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 12/16] drm/xe: Restructure reuse_vma()
  2026-04-23 16:53 ` [PATCH 12/16] drm/xe: Restructure reuse_vma() Ville Syrjala
@ 2026-04-24 10:30   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24 10:30 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Restructure reuse_vma() into a form that doesn't need the plane
> state structs, and rename the result to xe_fb_pin_reuse_vma().
> This will become the new fb_pin parent interface.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> ---
>  drivers/gpu/drm/xe/display/xe_fb_pin.c | 48 ++++++++++++++------------
>  1 file changed, 25 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index bdd6a4da0997..cd287efded28 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -486,36 +486,31 @@ static void xe_fb_pin_dpt_unpin(struct intel_dpt *dpt,
>  	__xe_unpin_fb_vma(ggtt_vma);
>  }
>  
> -static bool reuse_vma(struct intel_plane_state *new_plane_state,
> -		      const struct intel_plane_state *old_plane_state)
> +static struct i915_vma *
> +xe_fb_pin_reuse_vma(struct i915_vma *old_ggtt_vma,
> +		    struct drm_gem_object *old_obj,
> +		    const struct i915_gtt_view *old_view,
> +		    struct drm_gem_object *new_obj,
> +		    const struct i915_gtt_view *new_view,
> +		    u32 *out_offset)
>  {
> -	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
> -	struct i915_vma *vma;
> +	if (old_ggtt_vma && old_obj == new_obj &&
> +	    !memcmp(&old_view, &new_view, sizeof(*new_view))) {
> +		refcount_inc(&old_ggtt_vma->ref);
>  
> -	if (old_plane_state->hw.fb == new_plane_state->hw.fb &&
> -	    !memcmp(&old_plane_state->view.gtt,
> -		    &new_plane_state->view.gtt,
> -		    sizeof(new_plane_state->view.gtt))) {
> -		vma = old_plane_state->ggtt_vma;
> -		goto found;
> +		*out_offset = xe_ggtt_node_addr(old_ggtt_vma->node);
> +
> +		return old_ggtt_vma;
>  	}
>  
> -	return false;
> -
> -found:
> -	refcount_inc(&vma->ref);
> -	new_plane_state->ggtt_vma = vma;
> -
> -	new_plane_state->surf = xe_ggtt_node_addr(new_plane_state->ggtt_vma->node) +
> -		plane->surf_offset(new_plane_state);
> -
> -	return true;
> +	return NULL;
>  }
>  
>  int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  		       const struct intel_plane_state *old_plane_state)
>  {
> -	struct intel_framebuffer *fb = to_intel_framebuffer(new_plane_state->hw.fb);
> +	const struct intel_framebuffer *fb = to_intel_framebuffer(new_plane_state->hw.fb);
> +	const struct intel_framebuffer *old_fb = to_intel_framebuffer(old_plane_state->hw.fb);
>  	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
>  	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
>  	struct intel_fb_pin_params pin_params = {
> @@ -529,8 +524,14 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  	u32 offset;
>  	int ret;
>  
> -	if (reuse_vma(new_plane_state, old_plane_state))
> -		return 0;
> +	ggtt_vma = xe_fb_pin_reuse_vma(old_plane_state->ggtt_vma,
> +				       intel_fb_bo(&old_fb->base),
> +				       &old_plane_state->view.gtt,
> +				       intel_fb_bo(&fb->base),
> +				       &new_plane_state->view.gtt,
> +				       &offset);
> +	if (ggtt_vma)
> +		goto got_vma;
>  
>  	if (!intel_fb_uses_dpt(&fb->base)) {
>  		ret = xe_fb_pin_ggtt_pin(obj, &pin_params,
> @@ -544,6 +545,7 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  			return ret;
>  	}
>  
> +got_vma:
>  	new_plane_state->dpt_vma = dpt_vma;
>  	new_plane_state->ggtt_vma = ggtt_vma;
>  	new_plane_state->fence_id = fence_id;

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 13/16] drm/i915: Introduce the main fb_pin parent interface
  2026-04-23 16:53 ` [PATCH 13/16] drm/i915: Introduce the main fb_pin parent interface Ville Syrjala
@ 2026-04-24 10:48   ` Jani Nikula
  2026-04-24 10:55     ` Ville Syrjälä
  0 siblings, 1 reply; 36+ messages in thread
From: Jani Nikula @ 2026-04-24 10:48 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Introduce the main part of the new fb_pin parent interface:
> - intel_parent_fb_pin_ggtt_(un)pin()
> - intel_parent_fb_pin_dpt_(un)pin()
> - intel_parent_fb_pin_reuse_vma()
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

This does introduce the silly intermediate step where i915 and xe
specific code calls the generic parent interface. But I'm not sure if
it's even feasible to do this some other route.

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> ---
>  drivers/gpu/drm/i915/display/intel_parent.c  | 53 ++++++++++++++++++++
>  drivers/gpu/drm/i915/display/intel_parent.h  | 29 +++++++++++
>  drivers/gpu/drm/i915/i915_fb_pin.c           | 29 +++++++----
>  drivers/gpu/drm/xe/display/xe_fb_pin.c       | 40 +++++++++------
>  include/drm/intel/display_parent_interface.h | 22 ++++++++
>  5 files changed, 148 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c
> index 070cc60f49b3..a5816561be40 100644
> --- a/drivers/gpu/drm/i915/display/intel_parent.c
> +++ b/drivers/gpu/drm/i915/display/intel_parent.c
> @@ -53,6 +53,59 @@ void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dp
>  }
>  
>  /* fb_pin */
> +int intel_parent_fb_pin_ggtt_pin(struct intel_display *display,
> +				 struct drm_gem_object *obj,
> +				 const struct intel_fb_pin_params *pin_params,
> +				 struct i915_vma **out_ggtt_vma,
> +				 u32 *out_offset,
> +				 int *out_fence_id)
> +{
> +	return display->parent->fb_pin->ggtt_pin(obj, pin_params,
> +						 out_ggtt_vma, out_offset, out_fence_id);
> +}
> +
> +void intel_parent_fb_pin_ggtt_unpin(struct intel_display *display,
> +				    struct i915_vma *ggtt_vma,
> +				    int fence_id)
> +{
> +	return display->parent->fb_pin->ggtt_unpin(ggtt_vma, fence_id);
> +}
> +
> +int intel_parent_fb_pin_dpt_pin(struct intel_display *display,
> +				struct drm_gem_object *obj,
> +				struct intel_dpt *dpt,
> +				const struct intel_fb_pin_params *pin_params,
> +				struct i915_vma **out_dpt_vma,
> +				struct i915_vma **out_ggtt_vma,
> +				u32 *out_offset)
> +{
> +	return display->parent->fb_pin->dpt_pin(obj, dpt, pin_params,
> +						out_dpt_vma, out_ggtt_vma, out_offset);
> +}
> +
> +void intel_parent_fb_pin_dpt_unpin(struct intel_display *display,
> +				   struct intel_dpt *dpt,
> +				   struct i915_vma *dpt_vma,
> +				   struct i915_vma *ggtt_vma)
> +{
> +	return display->parent->fb_pin->dpt_unpin(dpt, dpt_vma, ggtt_vma);
> +}
> +
> +struct i915_vma *intel_parent_fb_pin_reuse_vma(struct intel_display *display,
> +					       struct i915_vma *old_ggtt_vma,
> +					       struct drm_gem_object *old_obj,
> +					       const struct i915_gtt_view *old_view,
> +					       struct drm_gem_object *new_obj,
> +					       const struct i915_gtt_view *new_view,
> +					       u32 *out_offset)
> +{
> +	if (!display->parent->fb_pin->reuse_vma)
> +		return NULL;
> +
> +	return display->parent->fb_pin->reuse_vma(old_ggtt_vma, old_obj, old_view,
> +						  new_obj, new_view, out_offset);
> +}
> +
>  void intel_parent_fb_pin_get_map(struct intel_display *display,
>  				 struct i915_vma *vma, struct iosys_map *map)
>  {
> diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h
> index 2b9e829e7f47..27e35f891a6b 100644
> --- a/drivers/gpu/drm/i915/display/intel_parent.h
> +++ b/drivers/gpu/drm/i915/display/intel_parent.h
> @@ -11,9 +11,11 @@ struct dma_fence;
>  struct drm_file;
>  struct drm_gem_object;
>  struct drm_scanout_buffer;
> +struct i915_gtt_view;
>  struct i915_vma;
>  struct intel_display;
>  struct intel_dpt;
> +struct intel_fb_pin_params;
>  struct intel_frontbuffer;
>  struct intel_hdcp_gsc_context;
>  struct intel_panic;
> @@ -28,6 +30,33 @@ void intel_parent_dpt_suspend(struct intel_display *display, struct intel_dpt *d
>  void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dpt);
>  
>  /* fb_pin */
> +int intel_parent_fb_pin_ggtt_pin(struct intel_display *display,
> +				 struct drm_gem_object *obj,
> +				 const struct intel_fb_pin_params *pin_params,
> +				 struct i915_vma **out_ggtt_vma,
> +				 u32 *out_offset,
> +				 int *out_fence_id);
> +void intel_parent_fb_pin_ggtt_unpin(struct intel_display *display,
> +				    struct i915_vma *ggtt_vma,
> +				    int fence_id);
> +int intel_parent_fb_pin_dpt_pin(struct intel_display *display,
> +				struct drm_gem_object *obj,
> +				struct intel_dpt *dpt,
> +				const struct intel_fb_pin_params *pin_params,
> +				struct i915_vma **out_dpt_vma,
> +				struct i915_vma **out_ggtt_vma,
> +				u32 *out_offset);
> +void intel_parent_fb_pin_dpt_unpin(struct intel_display *display,
> +				   struct intel_dpt *dpt,
> +				   struct i915_vma *dpt_vma,
> +				   struct i915_vma *ggtt_vma);
> +struct i915_vma *intel_parent_fb_pin_reuse_vma(struct intel_display *display,
> +					       struct i915_vma *old_ggtt_vma,
> +					       struct drm_gem_object *old_obj,
> +					       const struct i915_gtt_view *old_view,
> +					       struct drm_gem_object *new_obj,
> +					       const struct i915_gtt_view *new_view,
> +					       u32 *out_offset);
>  void intel_parent_fb_pin_get_map(struct intel_display *display,
>  				 struct i915_vma *vma, struct iosys_map *map);
>  
> diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
> index e14d2c1fb81f..1f08e364d569 100644
> --- a/drivers/gpu/drm/i915/i915_fb_pin.c
> +++ b/drivers/gpu/drm/i915/i915_fb_pin.c
> @@ -14,6 +14,7 @@
>  #include "display/intel_display_types.h"
>  #include "display/intel_fb.h"
>  #include "display/intel_fb_pin.h"
> +#include "display/intel_parent.h"
>  #include "display/intel_plane.h"
>  
>  #include "gem/i915_gem_domain.h"
> @@ -360,9 +361,9 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
>  			.needs_fence = intel_plane_needs_fence(display),
>  		};
>  
> -		ret = i915_fb_pin_ggtt_pin(intel_fb_bo(&fb->base),
> -					   &pin_params, &ggtt_vma, &offset,
> -					   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
> +		ret = intel_parent_fb_pin_ggtt_pin(display, intel_fb_bo(&fb->base),
> +						   &pin_params, &ggtt_vma, &offset,
> +						   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
>  		if (ret)
>  			return ret;
>  	} else {
> @@ -372,9 +373,9 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
>  			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
>  		};
>  
> -		ret = i915_fb_pin_dpt_pin(intel_fb_bo(&fb->base), fb->dpt,
> -					  &pin_params, &dpt_vma,
> -					  &ggtt_vma, &offset);
> +		ret = intel_parent_fb_pin_dpt_pin(display, intel_fb_bo(&fb->base),
> +						  fb->dpt, &pin_params,
> +						  &dpt_vma, &ggtt_vma, &offset);
>  		if (ret)
>  			return ret;
>  	}
> @@ -389,19 +390,21 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
>  
>  void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
>  {
> +	struct intel_display *display = to_intel_display(old_plane_state);
>  	const struct intel_framebuffer *fb =
>  		to_intel_framebuffer(old_plane_state->hw.fb);
>  
>  	if (!intel_fb_uses_dpt(&fb->base)) {
> -		i915_fb_pin_ggtt_unpin(old_plane_state->ggtt_vma,
> -				       old_plane_state->fence_id);
> +		intel_parent_fb_pin_ggtt_unpin(display,
> +					       old_plane_state->ggtt_vma,
> +					       old_plane_state->fence_id);
>  
>  		old_plane_state->ggtt_vma = NULL;
>  		old_plane_state->fence_id = -1;
>  	} else {
> -		i915_fb_pin_dpt_unpin(fb->dpt,
> -				      old_plane_state->dpt_vma,
> -				      old_plane_state->ggtt_vma);
> +		intel_parent_fb_pin_dpt_unpin(display, fb->dpt,
> +					      old_plane_state->dpt_vma,
> +					      old_plane_state->ggtt_vma);
>  
>  		old_plane_state->dpt_vma = NULL;
>  		old_plane_state->ggtt_vma = NULL;
> @@ -414,5 +417,9 @@ static void i915_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
>  }
>  
>  const struct intel_display_fb_pin_interface i915_display_fb_pin_interface = {
> +	.ggtt_pin = i915_fb_pin_ggtt_pin,
> +	.ggtt_unpin = i915_fb_pin_ggtt_unpin,
> +	.dpt_pin = i915_fb_pin_dpt_pin,
> +	.dpt_unpin = i915_fb_pin_dpt_unpin,
>  	.get_map = i915_fb_pin_get_map,
>  };
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index cd287efded28..e2b6ce3686a3 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -10,6 +10,7 @@
>  #include "intel_display_types.h"
>  #include "intel_fb.h"
>  #include "intel_fb_pin.h"
> +#include "intel_parent.h"
>  #include "xe_bo.h"
>  #include "xe_device.h"
>  #include "xe_display_vma.h"
> @@ -509,6 +510,7 @@ xe_fb_pin_reuse_vma(struct i915_vma *old_ggtt_vma,
>  int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  		       const struct intel_plane_state *old_plane_state)
>  {
> +	struct intel_display *display = to_intel_display(new_plane_state);
>  	const struct intel_framebuffer *fb = to_intel_framebuffer(new_plane_state->hw.fb);
>  	const struct intel_framebuffer *old_fb = to_intel_framebuffer(old_plane_state->hw.fb);
>  	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
> @@ -524,23 +526,25 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  	u32 offset;
>  	int ret;
>  
> -	ggtt_vma = xe_fb_pin_reuse_vma(old_plane_state->ggtt_vma,
> -				       intel_fb_bo(&old_fb->base),
> -				       &old_plane_state->view.gtt,
> -				       intel_fb_bo(&fb->base),
> -				       &new_plane_state->view.gtt,
> -				       &offset);
> +	ggtt_vma = intel_parent_fb_pin_reuse_vma(display,
> +						 old_plane_state->ggtt_vma,
> +						 intel_fb_bo(&old_fb->base),
> +						 &old_plane_state->view.gtt,
> +						 intel_fb_bo(&fb->base),
> +						 &new_plane_state->view.gtt,
> +						 &offset);
>  	if (ggtt_vma)
>  		goto got_vma;
>  
>  	if (!intel_fb_uses_dpt(&fb->base)) {
> -		ret = xe_fb_pin_ggtt_pin(obj, &pin_params,
> -					 &ggtt_vma, &offset, NULL);
> +		ret = intel_parent_fb_pin_ggtt_pin(display, obj, &pin_params,
> +						   &ggtt_vma, &offset, NULL);
>  		if (ret)
>  			return ret;
>  	} else {
> -		ret = xe_fb_pin_dpt_pin(obj, fb->dpt, &pin_params,
> -					&dpt_vma, &ggtt_vma, &offset);
> +		ret = intel_parent_fb_pin_dpt_pin(display, obj, fb->dpt,
> +						  &pin_params, &dpt_vma,
> +						  &ggtt_vma, &offset);
>  		if (ret)
>  			return ret;
>  	}
> @@ -556,17 +560,20 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  
>  void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
>  {
> +	struct intel_display *display = to_intel_display(old_plane_state);
>  	const struct intel_framebuffer *fb = to_intel_framebuffer(old_plane_state->hw.fb);
>  
>  	if (!intel_fb_uses_dpt(&fb->base)) {
> -		xe_fb_pin_ggtt_unpin(old_plane_state->ggtt_vma,
> -				     old_plane_state->fence_id);
> +		intel_parent_fb_pin_ggtt_unpin(display,
> +					       old_plane_state->ggtt_vma,
> +					       old_plane_state->fence_id);
>  
>  		old_plane_state->ggtt_vma = NULL;
>  		old_plane_state->fence_id = -1;
>  	} else {
> -		xe_fb_pin_dpt_unpin(fb->dpt, old_plane_state->dpt_vma,
> -				    old_plane_state->ggtt_vma);
> +		intel_parent_fb_pin_dpt_unpin(display, fb->dpt,
> +					      old_plane_state->dpt_vma,
> +					      old_plane_state->ggtt_vma);
>  
>  		old_plane_state->dpt_vma = NULL;
>  		old_plane_state->ggtt_vma = NULL;
> @@ -579,5 +586,10 @@ static void xe_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
>  }
>  
>  const struct intel_display_fb_pin_interface xe_display_fb_pin_interface = {
> +	.ggtt_pin = xe_fb_pin_ggtt_pin,
> +	.ggtt_unpin = xe_fb_pin_ggtt_unpin,
> +	.dpt_pin = xe_fb_pin_dpt_pin,
> +	.dpt_unpin = xe_fb_pin_dpt_unpin,
> +	.reuse_vma = xe_fb_pin_reuse_vma,
>  	.get_map = xe_fb_pin_get_map,
>  };
> diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
> index b363d6a85dfe..39991afeb173 100644
> --- a/include/drm/intel/display_parent_interface.h
> +++ b/include/drm/intel/display_parent_interface.h
> @@ -83,6 +83,28 @@ struct intel_display_dsb_interface {
>  };
>  
>  struct intel_display_fb_pin_interface {
> +	int (*ggtt_pin)(struct drm_gem_object *obj,
> +			const struct intel_fb_pin_params *pin_params,
> +			struct i915_vma **out_ggtt_vma,
> +			u32 *out_offset,
> +			int *out_fence_id);
> +	void (*ggtt_unpin)(struct i915_vma *ggtt_vma,
> +			   int fence_id);
> +	int (*dpt_pin)(struct drm_gem_object *obj,
> +		       struct intel_dpt *dpt,
> +		       const struct intel_fb_pin_params *pin_params,
> +		       struct i915_vma **out_dpt_vma,
> +		       struct i915_vma **out_ggtt_vma,
> +		       u32 *out_offset);
> +	void (*dpt_unpin)(struct intel_dpt *dpt,
> +			  struct i915_vma *dpt_vma,
> +			  struct i915_vma *ggtt_vma);
> +	struct i915_vma *(*reuse_vma)(struct i915_vma *old_ggtt_vma,
> +				      struct drm_gem_object *old_obj,
> +				      const struct i915_gtt_view *old_view,
> +				      struct drm_gem_object *new_obj,
> +				      const struct i915_gtt_view *new_view,
> +				      u32 *out_offset);
>  	void (*get_map)(struct i915_vma *vma, struct iosys_map *map);
>  };

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 13/16] drm/i915: Introduce the main fb_pin parent interface
  2026-04-24 10:48   ` Jani Nikula
@ 2026-04-24 10:55     ` Ville Syrjälä
  0 siblings, 0 replies; 36+ messages in thread
From: Ville Syrjälä @ 2026-04-24 10:55 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx, intel-xe

On Fri, Apr 24, 2026 at 01:48:02PM +0300, Jani Nikula wrote:
> On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >
> > Introduce the main part of the new fb_pin parent interface:
> > - intel_parent_fb_pin_ggtt_(un)pin()
> > - intel_parent_fb_pin_dpt_(un)pin()
> > - intel_parent_fb_pin_reuse_vma()
> >
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> This does introduce the silly intermediate step where i915 and xe
> specific code calls the generic parent interface. But I'm not sure if
> it's even feasible to do this some other route.

Yeah. I had all in one lump initially, but the result was a mess.
So in the end I figured it's cleaner to separate this non-functional
part out, even if calling the parent interface in the core driver
code is silly.

> 
> Reviewed-by: Jani Nikula <jani.nikula@intel.com>
> 
> > ---
> >  drivers/gpu/drm/i915/display/intel_parent.c  | 53 ++++++++++++++++++++
> >  drivers/gpu/drm/i915/display/intel_parent.h  | 29 +++++++++++
> >  drivers/gpu/drm/i915/i915_fb_pin.c           | 29 +++++++----
> >  drivers/gpu/drm/xe/display/xe_fb_pin.c       | 40 +++++++++------
> >  include/drm/intel/display_parent_interface.h | 22 ++++++++
> >  5 files changed, 148 insertions(+), 25 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c
> > index 070cc60f49b3..a5816561be40 100644
> > --- a/drivers/gpu/drm/i915/display/intel_parent.c
> > +++ b/drivers/gpu/drm/i915/display/intel_parent.c
> > @@ -53,6 +53,59 @@ void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dp
> >  }
> >  
> >  /* fb_pin */
> > +int intel_parent_fb_pin_ggtt_pin(struct intel_display *display,
> > +				 struct drm_gem_object *obj,
> > +				 const struct intel_fb_pin_params *pin_params,
> > +				 struct i915_vma **out_ggtt_vma,
> > +				 u32 *out_offset,
> > +				 int *out_fence_id)
> > +{
> > +	return display->parent->fb_pin->ggtt_pin(obj, pin_params,
> > +						 out_ggtt_vma, out_offset, out_fence_id);
> > +}
> > +
> > +void intel_parent_fb_pin_ggtt_unpin(struct intel_display *display,
> > +				    struct i915_vma *ggtt_vma,
> > +				    int fence_id)
> > +{
> > +	return display->parent->fb_pin->ggtt_unpin(ggtt_vma, fence_id);
> > +}
> > +
> > +int intel_parent_fb_pin_dpt_pin(struct intel_display *display,
> > +				struct drm_gem_object *obj,
> > +				struct intel_dpt *dpt,
> > +				const struct intel_fb_pin_params *pin_params,
> > +				struct i915_vma **out_dpt_vma,
> > +				struct i915_vma **out_ggtt_vma,
> > +				u32 *out_offset)
> > +{
> > +	return display->parent->fb_pin->dpt_pin(obj, dpt, pin_params,
> > +						out_dpt_vma, out_ggtt_vma, out_offset);
> > +}
> > +
> > +void intel_parent_fb_pin_dpt_unpin(struct intel_display *display,
> > +				   struct intel_dpt *dpt,
> > +				   struct i915_vma *dpt_vma,
> > +				   struct i915_vma *ggtt_vma)
> > +{
> > +	return display->parent->fb_pin->dpt_unpin(dpt, dpt_vma, ggtt_vma);
> > +}
> > +
> > +struct i915_vma *intel_parent_fb_pin_reuse_vma(struct intel_display *display,
> > +					       struct i915_vma *old_ggtt_vma,
> > +					       struct drm_gem_object *old_obj,
> > +					       const struct i915_gtt_view *old_view,
> > +					       struct drm_gem_object *new_obj,
> > +					       const struct i915_gtt_view *new_view,
> > +					       u32 *out_offset)
> > +{
> > +	if (!display->parent->fb_pin->reuse_vma)
> > +		return NULL;
> > +
> > +	return display->parent->fb_pin->reuse_vma(old_ggtt_vma, old_obj, old_view,
> > +						  new_obj, new_view, out_offset);
> > +}
> > +
> >  void intel_parent_fb_pin_get_map(struct intel_display *display,
> >  				 struct i915_vma *vma, struct iosys_map *map)
> >  {
> > diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h
> > index 2b9e829e7f47..27e35f891a6b 100644
> > --- a/drivers/gpu/drm/i915/display/intel_parent.h
> > +++ b/drivers/gpu/drm/i915/display/intel_parent.h
> > @@ -11,9 +11,11 @@ struct dma_fence;
> >  struct drm_file;
> >  struct drm_gem_object;
> >  struct drm_scanout_buffer;
> > +struct i915_gtt_view;
> >  struct i915_vma;
> >  struct intel_display;
> >  struct intel_dpt;
> > +struct intel_fb_pin_params;
> >  struct intel_frontbuffer;
> >  struct intel_hdcp_gsc_context;
> >  struct intel_panic;
> > @@ -28,6 +30,33 @@ void intel_parent_dpt_suspend(struct intel_display *display, struct intel_dpt *d
> >  void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dpt);
> >  
> >  /* fb_pin */
> > +int intel_parent_fb_pin_ggtt_pin(struct intel_display *display,
> > +				 struct drm_gem_object *obj,
> > +				 const struct intel_fb_pin_params *pin_params,
> > +				 struct i915_vma **out_ggtt_vma,
> > +				 u32 *out_offset,
> > +				 int *out_fence_id);
> > +void intel_parent_fb_pin_ggtt_unpin(struct intel_display *display,
> > +				    struct i915_vma *ggtt_vma,
> > +				    int fence_id);
> > +int intel_parent_fb_pin_dpt_pin(struct intel_display *display,
> > +				struct drm_gem_object *obj,
> > +				struct intel_dpt *dpt,
> > +				const struct intel_fb_pin_params *pin_params,
> > +				struct i915_vma **out_dpt_vma,
> > +				struct i915_vma **out_ggtt_vma,
> > +				u32 *out_offset);
> > +void intel_parent_fb_pin_dpt_unpin(struct intel_display *display,
> > +				   struct intel_dpt *dpt,
> > +				   struct i915_vma *dpt_vma,
> > +				   struct i915_vma *ggtt_vma);
> > +struct i915_vma *intel_parent_fb_pin_reuse_vma(struct intel_display *display,
> > +					       struct i915_vma *old_ggtt_vma,
> > +					       struct drm_gem_object *old_obj,
> > +					       const struct i915_gtt_view *old_view,
> > +					       struct drm_gem_object *new_obj,
> > +					       const struct i915_gtt_view *new_view,
> > +					       u32 *out_offset);
> >  void intel_parent_fb_pin_get_map(struct intel_display *display,
> >  				 struct i915_vma *vma, struct iosys_map *map);
> >  
> > diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
> > index e14d2c1fb81f..1f08e364d569 100644
> > --- a/drivers/gpu/drm/i915/i915_fb_pin.c
> > +++ b/drivers/gpu/drm/i915/i915_fb_pin.c
> > @@ -14,6 +14,7 @@
> >  #include "display/intel_display_types.h"
> >  #include "display/intel_fb.h"
> >  #include "display/intel_fb_pin.h"
> > +#include "display/intel_parent.h"
> >  #include "display/intel_plane.h"
> >  
> >  #include "gem/i915_gem_domain.h"
> > @@ -360,9 +361,9 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
> >  			.needs_fence = intel_plane_needs_fence(display),
> >  		};
> >  
> > -		ret = i915_fb_pin_ggtt_pin(intel_fb_bo(&fb->base),
> > -					   &pin_params, &ggtt_vma, &offset,
> > -					   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
> > +		ret = intel_parent_fb_pin_ggtt_pin(display, intel_fb_bo(&fb->base),
> > +						   &pin_params, &ggtt_vma, &offset,
> > +						   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
> >  		if (ret)
> >  			return ret;
> >  	} else {
> > @@ -372,9 +373,9 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
> >  			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
> >  		};
> >  
> > -		ret = i915_fb_pin_dpt_pin(intel_fb_bo(&fb->base), fb->dpt,
> > -					  &pin_params, &dpt_vma,
> > -					  &ggtt_vma, &offset);
> > +		ret = intel_parent_fb_pin_dpt_pin(display, intel_fb_bo(&fb->base),
> > +						  fb->dpt, &pin_params,
> > +						  &dpt_vma, &ggtt_vma, &offset);
> >  		if (ret)
> >  			return ret;
> >  	}
> > @@ -389,19 +390,21 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state,
> >  
> >  void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
> >  {
> > +	struct intel_display *display = to_intel_display(old_plane_state);
> >  	const struct intel_framebuffer *fb =
> >  		to_intel_framebuffer(old_plane_state->hw.fb);
> >  
> >  	if (!intel_fb_uses_dpt(&fb->base)) {
> > -		i915_fb_pin_ggtt_unpin(old_plane_state->ggtt_vma,
> > -				       old_plane_state->fence_id);
> > +		intel_parent_fb_pin_ggtt_unpin(display,
> > +					       old_plane_state->ggtt_vma,
> > +					       old_plane_state->fence_id);
> >  
> >  		old_plane_state->ggtt_vma = NULL;
> >  		old_plane_state->fence_id = -1;
> >  	} else {
> > -		i915_fb_pin_dpt_unpin(fb->dpt,
> > -				      old_plane_state->dpt_vma,
> > -				      old_plane_state->ggtt_vma);
> > +		intel_parent_fb_pin_dpt_unpin(display, fb->dpt,
> > +					      old_plane_state->dpt_vma,
> > +					      old_plane_state->ggtt_vma);
> >  
> >  		old_plane_state->dpt_vma = NULL;
> >  		old_plane_state->ggtt_vma = NULL;
> > @@ -414,5 +417,9 @@ static void i915_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
> >  }
> >  
> >  const struct intel_display_fb_pin_interface i915_display_fb_pin_interface = {
> > +	.ggtt_pin = i915_fb_pin_ggtt_pin,
> > +	.ggtt_unpin = i915_fb_pin_ggtt_unpin,
> > +	.dpt_pin = i915_fb_pin_dpt_pin,
> > +	.dpt_unpin = i915_fb_pin_dpt_unpin,
> >  	.get_map = i915_fb_pin_get_map,
> >  };
> > diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> > index cd287efded28..e2b6ce3686a3 100644
> > --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> > +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> > @@ -10,6 +10,7 @@
> >  #include "intel_display_types.h"
> >  #include "intel_fb.h"
> >  #include "intel_fb_pin.h"
> > +#include "intel_parent.h"
> >  #include "xe_bo.h"
> >  #include "xe_device.h"
> >  #include "xe_display_vma.h"
> > @@ -509,6 +510,7 @@ xe_fb_pin_reuse_vma(struct i915_vma *old_ggtt_vma,
> >  int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
> >  		       const struct intel_plane_state *old_plane_state)
> >  {
> > +	struct intel_display *display = to_intel_display(new_plane_state);
> >  	const struct intel_framebuffer *fb = to_intel_framebuffer(new_plane_state->hw.fb);
> >  	const struct intel_framebuffer *old_fb = to_intel_framebuffer(old_plane_state->hw.fb);
> >  	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
> > @@ -524,23 +526,25 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
> >  	u32 offset;
> >  	int ret;
> >  
> > -	ggtt_vma = xe_fb_pin_reuse_vma(old_plane_state->ggtt_vma,
> > -				       intel_fb_bo(&old_fb->base),
> > -				       &old_plane_state->view.gtt,
> > -				       intel_fb_bo(&fb->base),
> > -				       &new_plane_state->view.gtt,
> > -				       &offset);
> > +	ggtt_vma = intel_parent_fb_pin_reuse_vma(display,
> > +						 old_plane_state->ggtt_vma,
> > +						 intel_fb_bo(&old_fb->base),
> > +						 &old_plane_state->view.gtt,
> > +						 intel_fb_bo(&fb->base),
> > +						 &new_plane_state->view.gtt,
> > +						 &offset);
> >  	if (ggtt_vma)
> >  		goto got_vma;
> >  
> >  	if (!intel_fb_uses_dpt(&fb->base)) {
> > -		ret = xe_fb_pin_ggtt_pin(obj, &pin_params,
> > -					 &ggtt_vma, &offset, NULL);
> > +		ret = intel_parent_fb_pin_ggtt_pin(display, obj, &pin_params,
> > +						   &ggtt_vma, &offset, NULL);
> >  		if (ret)
> >  			return ret;
> >  	} else {
> > -		ret = xe_fb_pin_dpt_pin(obj, fb->dpt, &pin_params,
> > -					&dpt_vma, &ggtt_vma, &offset);
> > +		ret = intel_parent_fb_pin_dpt_pin(display, obj, fb->dpt,
> > +						  &pin_params, &dpt_vma,
> > +						  &ggtt_vma, &offset);
> >  		if (ret)
> >  			return ret;
> >  	}
> > @@ -556,17 +560,20 @@ int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
> >  
> >  void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
> >  {
> > +	struct intel_display *display = to_intel_display(old_plane_state);
> >  	const struct intel_framebuffer *fb = to_intel_framebuffer(old_plane_state->hw.fb);
> >  
> >  	if (!intel_fb_uses_dpt(&fb->base)) {
> > -		xe_fb_pin_ggtt_unpin(old_plane_state->ggtt_vma,
> > -				     old_plane_state->fence_id);
> > +		intel_parent_fb_pin_ggtt_unpin(display,
> > +					       old_plane_state->ggtt_vma,
> > +					       old_plane_state->fence_id);
> >  
> >  		old_plane_state->ggtt_vma = NULL;
> >  		old_plane_state->fence_id = -1;
> >  	} else {
> > -		xe_fb_pin_dpt_unpin(fb->dpt, old_plane_state->dpt_vma,
> > -				    old_plane_state->ggtt_vma);
> > +		intel_parent_fb_pin_dpt_unpin(display, fb->dpt,
> > +					      old_plane_state->dpt_vma,
> > +					      old_plane_state->ggtt_vma);
> >  
> >  		old_plane_state->dpt_vma = NULL;
> >  		old_plane_state->ggtt_vma = NULL;
> > @@ -579,5 +586,10 @@ static void xe_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
> >  }
> >  
> >  const struct intel_display_fb_pin_interface xe_display_fb_pin_interface = {
> > +	.ggtt_pin = xe_fb_pin_ggtt_pin,
> > +	.ggtt_unpin = xe_fb_pin_ggtt_unpin,
> > +	.dpt_pin = xe_fb_pin_dpt_pin,
> > +	.dpt_unpin = xe_fb_pin_dpt_unpin,
> > +	.reuse_vma = xe_fb_pin_reuse_vma,
> >  	.get_map = xe_fb_pin_get_map,
> >  };
> > diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
> > index b363d6a85dfe..39991afeb173 100644
> > --- a/include/drm/intel/display_parent_interface.h
> > +++ b/include/drm/intel/display_parent_interface.h
> > @@ -83,6 +83,28 @@ struct intel_display_dsb_interface {
> >  };
> >  
> >  struct intel_display_fb_pin_interface {
> > +	int (*ggtt_pin)(struct drm_gem_object *obj,
> > +			const struct intel_fb_pin_params *pin_params,
> > +			struct i915_vma **out_ggtt_vma,
> > +			u32 *out_offset,
> > +			int *out_fence_id);
> > +	void (*ggtt_unpin)(struct i915_vma *ggtt_vma,
> > +			   int fence_id);
> > +	int (*dpt_pin)(struct drm_gem_object *obj,
> > +		       struct intel_dpt *dpt,
> > +		       const struct intel_fb_pin_params *pin_params,
> > +		       struct i915_vma **out_dpt_vma,
> > +		       struct i915_vma **out_ggtt_vma,
> > +		       u32 *out_offset);
> > +	void (*dpt_unpin)(struct intel_dpt *dpt,
> > +			  struct i915_vma *dpt_vma,
> > +			  struct i915_vma *ggtt_vma);
> > +	struct i915_vma *(*reuse_vma)(struct i915_vma *old_ggtt_vma,
> > +				      struct drm_gem_object *old_obj,
> > +				      const struct i915_gtt_view *old_view,
> > +				      struct drm_gem_object *new_obj,
> > +				      const struct i915_gtt_view *new_view,
> > +				      u32 *out_offset);
> >  	void (*get_map)(struct i915_vma *vma, struct iosys_map *map);
> >  };
> 
> -- 
> Jani Nikula, Intel

-- 
Ville Syrjälä
Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 14/16] drm/i915/fbdev: Use intel_parent_fb_pin_ggtt_(un)pin()
  2026-04-23 16:53 ` [PATCH 14/16] drm/i915/fbdev: Use intel_parent_fb_pin_ggtt_(un)pin() Ville Syrjala
@ 2026-04-24 12:54   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24 12:54 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Replace the intel_fb_pin_to_ggtt() and intel_fb_unpin_vma() with the
> new abstract parent interface (intel_parent_fb_pin_ggtt_(un)pin()).
>
> xe no longer needs intel_fb_unpin_vma(), and in i915 it now
> becomes and internal function to i915_fb_pin.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> ---
>  drivers/gpu/drm/i915/display/intel_fb_pin.h |  2 --
>  drivers/gpu/drm/i915/display/intel_fbdev.c  | 14 +++++++-------
>  drivers/gpu/drm/i915/i915_fb_pin.c          |  2 +-
>  drivers/gpu/drm/xe/display/xe_fb_pin.c      |  5 -----
>  4 files changed, 8 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_fb_pin.h b/drivers/gpu/drm/i915/display/intel_fb_pin.h
> index 84530f20d7d1..6ff17d3e2cf5 100644
> --- a/drivers/gpu/drm/i915/display/intel_fb_pin.h
> +++ b/drivers/gpu/drm/i915/display/intel_fb_pin.h
> @@ -20,8 +20,6 @@ intel_fb_pin_to_ggtt(struct drm_gem_object *obj,
>  		     const struct intel_fb_pin_params *pin_params,
>  		     int *out_fence_id);
>  
> -void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id);
> -
>  int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
>  		       const struct intel_plane_state *old_plane_state);
>  void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state);
> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
> index aa2701795caa..8463f88149a5 100644
> --- a/drivers/gpu/drm/i915/display/intel_fbdev.c
> +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
> @@ -53,7 +53,6 @@
>  #include "intel_display_rpm.h"
>  #include "intel_display_types.h"
>  #include "intel_fb.h"
> -#include "intel_fb_pin.h"
>  #include "intel_fbdev.h"
>  #include "intel_frontbuffer.h"
>  #include "intel_parent.h"
> @@ -133,6 +132,7 @@ static int intel_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma)
>  static void intel_fbdev_fb_destroy(struct fb_info *info)
>  {
>  	struct drm_fb_helper *fb_helper = info->par;
> +	struct intel_display *display = to_intel_display(fb_helper->client.dev);
>  	struct intel_fbdev *ifbdev = to_intel_fbdev(fb_helper);
>  
>  	drm_fb_helper_fini(fb_helper);
> @@ -142,7 +142,7 @@ static void intel_fbdev_fb_destroy(struct fb_info *info)
>  	 * the info->screen_base mmaping. Leaking the VMA is simpler than
>  	 * trying to rectify all the possible error paths leading here.
>  	 */
> -	intel_fb_unpin_vma(ifbdev->vma, -1);
> +	intel_parent_fb_pin_ggtt_unpin(display, ifbdev->vma, -1);
>  	drm_framebuffer_remove(fb_helper->fb);
>  
>  	drm_client_release(&fb_helper->client);
> @@ -274,6 +274,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
>  	struct i915_vma *vma;
>  	bool prealloc = false;
>  	struct drm_gem_object *obj;
> +	u32 offset;
>  	int ret;
>  
>  	ifbdev->fb = NULL;
> @@ -321,11 +322,10 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
>  						       DRM_MODE_ROTATE_0);
>  	pin_params.needs_low_address = intel_plane_needs_low_address(display);
>  
> -	vma = intel_fb_pin_to_ggtt(obj, &pin_params, NULL);
> -	if (IS_ERR(vma)) {
> -		ret = PTR_ERR(vma);
> +	ret = intel_parent_fb_pin_ggtt_pin(display, obj, &pin_params,
> +					   &vma, &offset, NULL);
> +	if (ret)
>  		goto out_unlock;
> -	}
>  
>  	helper->funcs = &intel_fb_helper_funcs;
>  	helper->fb = &fb->base;
> @@ -356,7 +356,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
>  	return 0;
>  
>  out_unpin:
> -	intel_fb_unpin_vma(vma, -1);
> +	intel_parent_fb_pin_ggtt_unpin(display, vma, -1);
>  out_unlock:
>  	intel_display_rpm_put(display, wakeref);
>  
> diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
> index 1f08e364d569..cedefee46fbf 100644
> --- a/drivers/gpu/drm/i915/i915_fb_pin.c
> +++ b/drivers/gpu/drm/i915/i915_fb_pin.c
> @@ -222,7 +222,7 @@ intel_fb_pin_to_ggtt(struct drm_gem_object *_obj,
>  	return vma;
>  }
>  
> -void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
> +static void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
>  {
>  	if (fence_id >= 0)
>  		i915_vma_unpin_fence(vma);
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index e2b6ce3686a3..c3171625d150 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -424,11 +424,6 @@ intel_fb_pin_to_ggtt(struct drm_gem_object *obj,
>  	return __xe_pin_fb_vma(obj, false, pin_params);
>  }
>  
> -void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
> -{
> -	__xe_unpin_fb_vma(vma);
> -}
> -
>  static int xe_fb_pin_ggtt_pin(struct drm_gem_object *obj,
>  			      const struct intel_fb_pin_params *pin_params,
>  			      struct i915_vma **out_ggtt_vma,

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 15/16] drm/xe: Use xe_fb_pin_ggtt_pin() for the initial FB pin
  2026-04-23 16:53 ` [PATCH 15/16] drm/xe: Use xe_fb_pin_ggtt_pin() for the initial FB pin Ville Syrjala
@ 2026-04-24 12:58   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24 12:58 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Use xe_fb_pin_ggtt_pin() instead of intel_fb_pin_to_ggtt() for
> the initial FB pin. We want to get rid of intel_fb_pin_to_ggtt()
> and just use the new fb_pin parent interface.
>
> This still isn't quite the final solution since we bypass the
> actual parent interface and call the implementation directly.
> But sorting that out will require more cleanup to the initial
> FB code.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> ---
>  drivers/gpu/drm/xe/display/xe_fb_pin.c        | 21 +++++--------------
>  drivers/gpu/drm/xe/display/xe_fb_pin.h        | 12 +++++++++++
>  drivers/gpu/drm/xe/display/xe_initial_plane.c | 18 ++++++++++------
>  3 files changed, 29 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index c3171625d150..c92c30ceba36 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -413,22 +413,11 @@ static void __xe_unpin_fb_vma(struct i915_vma *vma)
>  	kfree(vma);
>  }
>  
> -struct i915_vma *
> -intel_fb_pin_to_ggtt(struct drm_gem_object *obj,
> -		     const struct intel_fb_pin_params *pin_params,
> -		     int *out_fence_id)
> -{
> -	if (out_fence_id)
> -		*out_fence_id = -1;
> -
> -	return __xe_pin_fb_vma(obj, false, pin_params);
> -}
> -
> -static int xe_fb_pin_ggtt_pin(struct drm_gem_object *obj,
> -			      const struct intel_fb_pin_params *pin_params,
> -			      struct i915_vma **out_ggtt_vma,
> -			      u32 *out_offset,
> -			      int *out_fence_id)
> +int xe_fb_pin_ggtt_pin(struct drm_gem_object *obj,
> +		       const struct intel_fb_pin_params *pin_params,
> +		       struct i915_vma **out_ggtt_vma,
> +		       u32 *out_offset,
> +		       int *out_fence_id)
>  {
>  	struct i915_vma *ggtt_vma;
>  
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.h b/drivers/gpu/drm/xe/display/xe_fb_pin.h
> index 8a42d4009f5d..20dd8a99a25f 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.h
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.h
> @@ -4,6 +4,18 @@
>  #ifndef __XE_FB_PIN_H__
>  #define __XE_FB_PIN_H__
>  
> +#include <linux/types.h>
> +
> +struct drm_gem_object;
> +struct i915_vma;
> +struct intel_fb_pin_params;
> +
> +int xe_fb_pin_ggtt_pin(struct drm_gem_object *obj,
> +		       const struct intel_fb_pin_params *pin_params,
> +		       struct i915_vma **out_ggtt_vma,
> +		       u32 *out_offset,
> +		       int *out_fence_id);
> +
>  extern const struct intel_display_fb_pin_interface xe_display_fb_pin_interface;
>  
>  #endif /* __XE_FB_PIN_H__ */
> diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c
> index 8e3c0c4b81fe..02b46cc3b6df 100644
> --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c
> +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c
> @@ -7,12 +7,16 @@
>  
>  #include "regs/xe_gtt_defs.h"
>  
> -#include "intel_display_types.h"
> +/* FIXME move intel_remapped_info_size() & co. */
>  #include "intel_fb.h"
> -#include "intel_fb_pin.h"
> +
> +/* FIXME move intel_initial_plane_config */
> +#include "intel_display_types.h"
> +
>  #include "xe_bo.h"
>  #include "xe_display_bo.h"
>  #include "xe_display_vma.h"
> +#include "xe_fb_pin.h"
>  #include "xe_ggtt.h"
>  #include "xe_mmio.h"
>  #include "xe_vram_types.h"
> @@ -137,14 +141,16 @@ xe_initial_plane_setup(struct drm_plane_state *_plane_state,
>  	struct intel_fb_pin_params pin_params = {
>  		.view = &plane_state->view.gtt,
>  	};
> +	u32 offset;
> +	int ret;
>  
> -	vma = intel_fb_pin_to_ggtt(intel_fb_bo(fb), &pin_params, NULL);
> -	if (IS_ERR(vma))
> -		return PTR_ERR(vma);
> +	ret = xe_fb_pin_ggtt_pin(intel_fb_bo(fb), &pin_params, &vma, &offset, NULL);
> +	if (ret)
> +		return ret;
>  
>  	plane_state->ggtt_vma = vma;
>  
> -	plane_state->surf = xe_ggtt_node_addr(plane_state->ggtt_vma->node);
> +	plane_state->surf = offset;
>  
>  	plane_config->vma = vma;

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 16/16] drm/i915: Consolidate the intel_plane_(un)pin_fb() implementations
  2026-04-23 16:53 ` [PATCH 16/16] drm/i915: Consolidate the intel_plane_(un)pin_fb() implementations Ville Syrjala
@ 2026-04-24 13:30   ` Jani Nikula
  0 siblings, 0 replies; 36+ messages in thread
From: Jani Nikula @ 2026-04-24 13:30 UTC (permalink / raw)
  To: Ville Syrjala, intel-gfx; +Cc: intel-xe

On Thu, 23 Apr 2026, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Currently i915 and each implement their own versions of

and xe?

> intel_plane_(un)pin(). Now that we have the fb_pin parent
> interface we can consolidate this to a single implementation.
>
> The result is a mixture of the i915 and xe implementations.
> The reuse_vma() hack comes from xe (and i915 doesn't implement
> that part of the parent interface, and the pin_params are
> taken from i915 since the platforms supported by i915 need
> more things.

One somewhat complicated and spread out comment inline. Other than that,

Reviewed-by: Jani Nikula <jani.nikula@intel.com>

> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_cursor.c |   1 -
>  drivers/gpu/drm/i915/display/intel_fb_pin.h |  27 -----
>  drivers/gpu/drm/i915/display/intel_plane.c  | 118 +++++++++++++++++++-
>  drivers/gpu/drm/i915/display/intel_plane.h  |   3 +
>  drivers/gpu/drm/i915/i915_fb_pin.c          | 116 +------------------
>  drivers/gpu/drm/xe/display/xe_fb_pin.c      |  82 +-------------
>  6 files changed, 126 insertions(+), 221 deletions(-)
>  delete mode 100644 drivers/gpu/drm/i915/display/intel_fb_pin.h
>
> diff --git a/drivers/gpu/drm/i915/display/intel_cursor.c b/drivers/gpu/drm/i915/display/intel_cursor.c
> index 18d1014de361..52347668f27d 100644
> --- a/drivers/gpu/drm/i915/display/intel_cursor.c
> +++ b/drivers/gpu/drm/i915/display/intel_cursor.c
> @@ -21,7 +21,6 @@
>  #include "intel_display_utils.h"
>  #include "intel_display_wa.h"
>  #include "intel_fb.h"
> -#include "intel_fb_pin.h"
>  #include "intel_frontbuffer.h"
>  #include "intel_plane.h"
>  #include "intel_psr.h"
> diff --git a/drivers/gpu/drm/i915/display/intel_fb_pin.h b/drivers/gpu/drm/i915/display/intel_fb_pin.h
> deleted file mode 100644
> index 6ff17d3e2cf5..000000000000
> --- a/drivers/gpu/drm/i915/display/intel_fb_pin.h
> +++ /dev/null
> @@ -1,27 +0,0 @@
> -/* SPDX-License-Identifier: MIT */
> -/*
> - * Copyright © 2021 Intel Corporation
> - */
> -
> -#ifndef __INTEL_FB_PIN_H__
> -#define __INTEL_FB_PIN_H__
> -
> -#include <linux/types.h>
> -
> -struct drm_gem_object;
> -struct i915_vma;
> -struct intel_fb_pin_params;
> -struct intel_plane_state;
> -struct i915_gtt_view;
> -struct iosys_map;
> -
> -struct i915_vma *
> -intel_fb_pin_to_ggtt(struct drm_gem_object *obj,
> -		     const struct intel_fb_pin_params *pin_params,
> -		     int *out_fence_id);
> -
> -int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
> -		       const struct intel_plane_state *old_plane_state);
> -void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state);
> -
> -#endif
> diff --git a/drivers/gpu/drm/i915/display/intel_plane.c b/drivers/gpu/drm/i915/display/intel_plane.c
> index e50e1a15410a..f132fa955d21 100644
> --- a/drivers/gpu/drm/i915/display/intel_plane.c
> +++ b/drivers/gpu/drm/i915/display/intel_plane.c
> @@ -44,6 +44,7 @@
>  #include <drm/drm_gem_atomic_helper.h>
>  #include <drm/drm_panic.h>
>  #include <drm/drm_print.h>
> +#include <drm/intel/display_parent_interface.h>
>  
>  #include "i9xx_plane_regs.h"
>  #include "intel_cdclk.h"
> @@ -53,7 +54,6 @@
>  #include "intel_display_trace.h"
>  #include "intel_display_types.h"
>  #include "intel_fb.h"
> -#include "intel_fb_pin.h"
>  #include "intel_fbdev.h"
>  #include "intel_parent.h"
>  #include "intel_plane.h"
> @@ -1191,6 +1191,122 @@ int intel_plane_check_src_coordinates(struct intel_plane_state *plane_state)
>  	return 0;
>  }
>  
> +static unsigned int
> +intel_plane_fb_min_alignment(const struct intel_plane_state *plane_state)
> +{
> +	const struct intel_framebuffer *fb = to_intel_framebuffer(plane_state->hw.fb);
> +
> +	return fb->min_alignment;

(1)

> +}
> +
> +static unsigned int
> +intel_plane_fb_min_phys_alignment(const struct intel_plane_state *plane_state)
> +{
> +	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
> +	const struct drm_framebuffer *fb = plane_state->hw.fb;
> +
> +	if (!intel_plane_needs_physical(plane))
> +		return 0;
> +
> +	return plane->min_alignment(plane, fb, 0);
> +}
> +
> +static unsigned int
> +intel_plane_fb_vtd_guard(const struct intel_plane_state *plane_state)
> +{
> +	return intel_fb_view_vtd_guard(plane_state->hw.fb,
> +				       &plane_state->view,
> +				       plane_state->hw.rotation);
> +}
> +
> +int intel_plane_pin_fb(struct intel_plane_state *plane_state,
> +		       const struct intel_plane_state *old_plane_state)
> +{
> +	struct intel_display *display = to_intel_display(plane_state);
> +	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
> +	const struct intel_framebuffer *fb =
> +		to_intel_framebuffer(plane_state->hw.fb);
> +	const struct intel_framebuffer *old_fb =
> +		to_intel_framebuffer(old_plane_state->hw.fb);
> +	struct i915_vma *ggtt_vma = NULL;
> +	struct i915_vma *dpt_vma = NULL;
> +	int fence_id = -1;
> +	u32 offset = 0;
> +	int ret;
> +
> +	/* hack for xe since it can't keep track of vmas properly */
> +	ggtt_vma = intel_parent_fb_pin_reuse_vma(display,
> +						 old_plane_state->ggtt_vma,
> +						 intel_fb_bo(&old_fb->base),
> +						 &old_plane_state->view.gtt,
> +						 intel_fb_bo(&fb->base),
> +						 &plane_state->view.gtt,
> +						 &offset);
> +	if (ggtt_vma)
> +		goto got_vma;
> +
> +	if (!intel_fb_uses_dpt(&fb->base)) {
> +		struct intel_fb_pin_params pin_params = {
> +			.view = &plane_state->view.gtt,
> +			.alignment = intel_plane_fb_min_alignment(plane_state),

So this is equal to i915, and uses (1) above.

> +			.phys_alignment = intel_plane_fb_min_phys_alignment(plane_state),
> +			.vtd_guard = intel_plane_fb_vtd_guard(plane_state),
> +			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
> +			.needs_low_address = intel_plane_needs_low_address(display),
> +			.needs_physical = intel_plane_needs_physical(plane),
> +			.needs_fence = intel_plane_needs_fence(display),
> +		};
> +
> +		ret = intel_parent_fb_pin_ggtt_pin(display, intel_fb_bo(&fb->base),
> +						   &pin_params, &ggtt_vma, &offset,
> +						   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
> +	} else {
> +		struct intel_fb_pin_params pin_params = {
> +			.view = &plane_state->view.gtt,
> +			.alignment = intel_plane_fb_min_alignment(plane_state),
> +			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
> +		};
> +
> +		ret = intel_parent_fb_pin_dpt_pin(display, intel_fb_bo(&fb->base),
> +						  fb->dpt, &pin_params,
> +						  &dpt_vma, &ggtt_vma, &offset);
> +	}
> +	if (ret)
> +		return ret;
> +
> +got_vma:
> +	plane_state->dpt_vma = dpt_vma;
> +	plane_state->ggtt_vma = ggtt_vma;
> +	plane_state->fence_id = fence_id;
> +
> +	plane_state->surf = offset + plane->surf_offset(plane_state);
> +
> +	return 0;
> +}
> +
> +void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
> +{
> +	struct intel_display *display = to_intel_display(old_plane_state);
> +	const struct intel_framebuffer *fb =
> +		to_intel_framebuffer(old_plane_state->hw.fb);
> +
> +	if (!intel_fb_uses_dpt(&fb->base)) {
> +		intel_parent_fb_pin_ggtt_unpin(display,
> +					       old_plane_state->ggtt_vma,
> +					       old_plane_state->fence_id);
> +
> +		old_plane_state->ggtt_vma = NULL;
> +		old_plane_state->fence_id = -1;
> +	} else {
> +		intel_parent_fb_pin_dpt_unpin(display, fb->dpt,
> +					      old_plane_state->dpt_vma,
> +					      old_plane_state->ggtt_vma);
> +
> +		old_plane_state->dpt_vma = NULL;
> +		old_plane_state->ggtt_vma = NULL;
> +	}
> +}
> +
>  static int add_dma_resv_fences(struct dma_resv *resv,
>  			       struct drm_plane_state *new_plane_state)
>  {
> diff --git a/drivers/gpu/drm/i915/display/intel_plane.h b/drivers/gpu/drm/i915/display/intel_plane.h
> index 7b5456f56f42..a6338bba72d9 100644
> --- a/drivers/gpu/drm/i915/display/intel_plane.h
> +++ b/drivers/gpu/drm/i915/display/intel_plane.h
> @@ -92,5 +92,8 @@ int intel_plane_atomic_check(struct intel_atomic_state *state);
>  bool intel_plane_format_mod_supported_async(struct drm_plane *plane,
>  					    u32 format,
>  					    u64 modifier);
> +int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
> +		       const struct intel_plane_state *old_plane_state);
> +void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state);
>  
>  #endif /* __INTEL_PLANE_H__ */
> diff --git a/drivers/gpu/drm/i915/i915_fb_pin.c b/drivers/gpu/drm/i915/i915_fb_pin.c
> index cedefee46fbf..1034cb767e9f 100644
> --- a/drivers/gpu/drm/i915/i915_fb_pin.c
> +++ b/drivers/gpu/drm/i915/i915_fb_pin.c
> @@ -3,20 +3,9 @@
>   * Copyright © 2021 Intel Corporation
>   */
>  
> -/**
> - * DOC: display pinning helpers
> - */
> -
>  #include <drm/drm_print.h>
>  #include <drm/intel/display_parent_interface.h>
>  
> -#include "display/intel_display_core.h"
> -#include "display/intel_display_types.h"
> -#include "display/intel_fb.h"
> -#include "display/intel_fb_pin.h"
> -#include "display/intel_parent.h"
> -#include "display/intel_plane.h"
> -
>  #include "gem/i915_gem_domain.h"
>  #include "gem/i915_gem_object.h"
>  
> @@ -114,7 +103,7 @@ intel_fb_pin_to_dpt(struct drm_gem_object *_obj, struct intel_dpt *dpt,
>  	return vma;
>  }
>  
> -struct i915_vma *
> +static struct i915_vma *
>  intel_fb_pin_to_ggtt(struct drm_gem_object *_obj,
>  		     const struct intel_fb_pin_params *pin_params,
>  		     int *out_fence_id)
> @@ -230,34 +219,6 @@ static void intel_fb_unpin_vma(struct i915_vma *vma, int fence_id)
>  	i915_vma_put(vma);
>  }
>  
> -static unsigned int
> -intel_plane_fb_min_alignment(const struct intel_plane_state *plane_state)
> -{
> -	const struct intel_framebuffer *fb = to_intel_framebuffer(plane_state->hw.fb);
> -
> -	return fb->min_alignment;
> -}
> -
> -static unsigned int
> -intel_plane_fb_min_phys_alignment(const struct intel_plane_state *plane_state)
> -{
> -	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
> -	const struct drm_framebuffer *fb = plane_state->hw.fb;
> -
> -	if (!intel_plane_needs_physical(plane))
> -		return 0;
> -
> -	return plane->min_alignment(plane, fb, 0);
> -}
> -
> -static unsigned int
> -intel_plane_fb_vtd_guard(const struct intel_plane_state *plane_state)
> -{
> -	return intel_fb_view_vtd_guard(plane_state->hw.fb,
> -				       &plane_state->view,
> -				       plane_state->hw.rotation);
> -}
> -
>  static int i915_fb_pin_ggtt_pin(struct drm_gem_object *obj,
>  				const struct intel_fb_pin_params *pin_params,
>  				struct i915_vma **out_ggtt_vma,
> @@ -336,81 +297,6 @@ static void i915_fb_pin_dpt_unpin(struct intel_dpt *dpt,
>  		i915_dpt_unpin_from_ggtt(dpt);
>  }
>  
> -int intel_plane_pin_fb(struct intel_plane_state *plane_state,
> -		       const struct intel_plane_state *old_plane_state)
> -{
> -	struct intel_display *display = to_intel_display(plane_state);
> -	struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
> -	const struct intel_framebuffer *fb =
> -		to_intel_framebuffer(plane_state->hw.fb);
> -	struct i915_vma *ggtt_vma = NULL;
> -	struct i915_vma *dpt_vma = NULL;
> -	int fence_id = -1;
> -	u32 offset;
> -	int ret;
> -
> -	if (!intel_fb_uses_dpt(&fb->base)) {
> -		struct intel_fb_pin_params pin_params = {
> -			.view = &plane_state->view.gtt,
> -			.alignment = intel_plane_fb_min_alignment(plane_state),
> -			.phys_alignment = intel_plane_fb_min_phys_alignment(plane_state),
> -			.vtd_guard = intel_plane_fb_vtd_guard(plane_state),
> -			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
> -			.needs_low_address = intel_plane_needs_low_address(display),
> -			.needs_physical = intel_plane_needs_physical(plane),
> -			.needs_fence = intel_plane_needs_fence(display),
> -		};
> -
> -		ret = intel_parent_fb_pin_ggtt_pin(display, intel_fb_bo(&fb->base),
> -						   &pin_params, &ggtt_vma, &offset,
> -						   intel_plane_uses_fence(plane_state) ? &fence_id : NULL);
> -		if (ret)
> -			return ret;
> -	} else {
> -		struct intel_fb_pin_params pin_params = {
> -			.view = &plane_state->view.gtt,
> -			.alignment = intel_plane_fb_min_alignment(plane_state),
> -			.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
> -		};
> -
> -		ret = intel_parent_fb_pin_dpt_pin(display, intel_fb_bo(&fb->base),
> -						  fb->dpt, &pin_params,
> -						  &dpt_vma, &ggtt_vma, &offset);
> -		if (ret)
> -			return ret;
> -	}
> -
> -	plane_state->dpt_vma = dpt_vma;
> -	plane_state->ggtt_vma = ggtt_vma;
> -	plane_state->fence_id = fence_id;
> -	plane_state->surf = offset + plane->surf_offset(plane_state);
> -
> -	return 0;
> -}
> -
> -void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
> -{
> -	struct intel_display *display = to_intel_display(old_plane_state);
> -	const struct intel_framebuffer *fb =
> -		to_intel_framebuffer(old_plane_state->hw.fb);
> -
> -	if (!intel_fb_uses_dpt(&fb->base)) {
> -		intel_parent_fb_pin_ggtt_unpin(display,
> -					       old_plane_state->ggtt_vma,
> -					       old_plane_state->fence_id);
> -
> -		old_plane_state->ggtt_vma = NULL;
> -		old_plane_state->fence_id = -1;
> -	} else {
> -		intel_parent_fb_pin_dpt_unpin(display, fb->dpt,
> -					      old_plane_state->dpt_vma,
> -					      old_plane_state->ggtt_vma);
> -
> -		old_plane_state->dpt_vma = NULL;
> -		old_plane_state->ggtt_vma = NULL;
> -	}
> -}
> -
>  static void i915_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
>  {
>  	iosys_map_set_vaddr_iomem(map, i915_vma_get_iomap(vma));
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index c92c30ceba36..19f4d45f5acb 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -6,11 +6,12 @@
>  #include <drm/intel/display_parent_interface.h>
>  #include <drm/ttm/ttm_bo.h>
>  
> -#include "intel_display_core.h"
> -#include "intel_display_types.h"
> +/* FIXME move the types to parent interface? */
> +#include "i915_gtt_view_types.h"
> +
> +/* FIXME move intel_remapped_info_size() & co. to parent interface? */
>  #include "intel_fb.h"
> -#include "intel_fb_pin.h"
> -#include "intel_parent.h"
> +
>  #include "xe_bo.h"
>  #include "xe_device.h"
>  #include "xe_display_vma.h"
> @@ -491,79 +492,6 @@ xe_fb_pin_reuse_vma(struct i915_vma *old_ggtt_vma,
>  	return NULL;
>  }
>  
> -int intel_plane_pin_fb(struct intel_plane_state *new_plane_state,
> -		       const struct intel_plane_state *old_plane_state)
> -{
> -	struct intel_display *display = to_intel_display(new_plane_state);
> -	const struct intel_framebuffer *fb = to_intel_framebuffer(new_plane_state->hw.fb);
> -	const struct intel_framebuffer *old_fb = to_intel_framebuffer(old_plane_state->hw.fb);
> -	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
> -	struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
> -	struct intel_fb_pin_params pin_params = {
> -		.view = &new_plane_state->view.gtt,
> -		.alignment = plane->min_alignment(plane, &fb->base, 0),

However xe had something different here.

Basically fb->min_alignment is initialized to intel_fb_min_alignment(),
which does call plane->min_alignment() for all planes, and works it out
from there.

Could or should we have switched xe to use fb->min_alignment here as an
intermediate step? It kind of sticks out as a change in this patch.


> -		.needs_cpu_lmem_access = intel_fb_needs_cpu_access(&fb->base),
> -	};
> -	struct i915_vma *ggtt_vma = NULL;
> -	struct i915_vma *dpt_vma = NULL;
> -	int fence_id = -1;
> -	u32 offset;
> -	int ret;
> -
> -	ggtt_vma = intel_parent_fb_pin_reuse_vma(display,
> -						 old_plane_state->ggtt_vma,
> -						 intel_fb_bo(&old_fb->base),
> -						 &old_plane_state->view.gtt,
> -						 intel_fb_bo(&fb->base),
> -						 &new_plane_state->view.gtt,
> -						 &offset);
> -	if (ggtt_vma)
> -		goto got_vma;
> -
> -	if (!intel_fb_uses_dpt(&fb->base)) {
> -		ret = intel_parent_fb_pin_ggtt_pin(display, obj, &pin_params,
> -						   &ggtt_vma, &offset, NULL);
> -		if (ret)
> -			return ret;
> -	} else {
> -		ret = intel_parent_fb_pin_dpt_pin(display, obj, fb->dpt,
> -						  &pin_params, &dpt_vma,
> -						  &ggtt_vma, &offset);
> -		if (ret)
> -			return ret;
> -	}
> -
> -got_vma:
> -	new_plane_state->dpt_vma = dpt_vma;
> -	new_plane_state->ggtt_vma = ggtt_vma;
> -	new_plane_state->fence_id = fence_id;
> -	new_plane_state->surf = offset + plane->surf_offset(new_plane_state);
> -
> -	return 0;
> -}
> -
> -void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state)
> -{
> -	struct intel_display *display = to_intel_display(old_plane_state);
> -	const struct intel_framebuffer *fb = to_intel_framebuffer(old_plane_state->hw.fb);
> -
> -	if (!intel_fb_uses_dpt(&fb->base)) {
> -		intel_parent_fb_pin_ggtt_unpin(display,
> -					       old_plane_state->ggtt_vma,
> -					       old_plane_state->fence_id);
> -
> -		old_plane_state->ggtt_vma = NULL;
> -		old_plane_state->fence_id = -1;
> -	} else {
> -		intel_parent_fb_pin_dpt_unpin(display, fb->dpt,
> -					      old_plane_state->dpt_vma,
> -					      old_plane_state->ggtt_vma);
> -
> -		old_plane_state->dpt_vma = NULL;
> -		old_plane_state->ggtt_vma = NULL;
> -	}
> -}
> -
>  static void xe_fb_pin_get_map(struct i915_vma *vma, struct iosys_map *map)
>  {
>  	*map = vma->bo->vmap;

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 36+ messages in thread

end of thread, other threads:[~2026-04-24 13:30 UTC | newest]

Thread overview: 36+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
2026-04-23 16:53 ` [PATCH 01/16] drm/i915: Introduce intel_parent_fb_pin_get_map() Ville Syrjala
2026-04-24  9:14   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 02/16] drm/i915: Move intel_fb_pin_params to the parent interface Ville Syrjala
2026-04-24  9:19   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 03/16] drm/i915: Move the i915_dpt_offset()==0 assert Ville Syrjala
2026-04-24  9:19   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 04/16] drm/i915: Reorganize intel_plane_pin_fb() a bit Ville Syrjala
2026-04-24  9:55   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 05/16] drm/i915: Introduce i915_fb_pin_dpt_(un)pin() Ville Syrjala
2026-04-24  9:56   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 06/16] drm/i915: Introduce i915_fb_pin_ggtt_(un)pin() Ville Syrjala
2026-04-24  9:59   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 07/16] drm/xe: Move the FORCE_WC assert into __xe_pin_fb_vma() Ville Syrjala
2026-04-24 10:02   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 08/16] drm/xe: Kill the fbdev vma reuse hack Ville Syrjala
2026-04-24 10:06   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 09/16] drm/xe: Reorganize intel_plane_pin_fb() a bit Ville Syrjala
2026-04-24 10:07   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 10/16] drm/xe: Introduce xe_fb_pin_dpt_(un)pin() Ville Syrjala
2026-04-24 10:12   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 11/16] drm/xe: Introduce xe_fb_pin_ggtt_(un)pin() Ville Syrjala
2026-04-24 10:13   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 12/16] drm/xe: Restructure reuse_vma() Ville Syrjala
2026-04-24 10:30   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 13/16] drm/i915: Introduce the main fb_pin parent interface Ville Syrjala
2026-04-24 10:48   ` Jani Nikula
2026-04-24 10:55     ` Ville Syrjälä
2026-04-23 16:53 ` [PATCH 14/16] drm/i915/fbdev: Use intel_parent_fb_pin_ggtt_(un)pin() Ville Syrjala
2026-04-24 12:54   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 15/16] drm/xe: Use xe_fb_pin_ggtt_pin() for the initial FB pin Ville Syrjala
2026-04-24 12:58   ` Jani Nikula
2026-04-23 16:53 ` [PATCH 16/16] drm/i915: Consolidate the intel_plane_(un)pin_fb() implementations Ville Syrjala
2026-04-24 13:30   ` Jani Nikula
2026-04-23 17:01 ` ✗ CI.checkpatch: warning for drm/i915: Introduce 'fb_pin' parent interface Patchwork
2026-04-23 17:02 ` ✓ CI.KUnit: success " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox