public inbox for intel-gfx@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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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-30 16:19   ` [PATCH v2 " Ville Syrjala
  2026-04-23 16:53 ` [PATCH 13/16] drm/i915: Introduce the main fb_pin parent interface Ville Syrjala
                   ` (5 subsequent siblings)
  17 siblings, 2 replies; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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:25 ` ✗ Fi.CI.BUILD: failure for drm/i915: Introduce 'fb_pin' parent interface Patchwork
  2026-04-30 18:05 ` ✗ i915.CI.BAT: failure for drm/i915: Introduce 'fb_pin' parent interface (rev2) Patchwork
  17 siblings, 1 reply; 38+ 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] 38+ messages in thread

* ✗ Fi.CI.BUILD: failure 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:25 ` Patchwork
  2026-04-30 18:05 ` ✗ i915.CI.BAT: failure for drm/i915: Introduce 'fb_pin' parent interface (rev2) Patchwork
  17 siblings, 0 replies; 38+ messages in thread
From: Patchwork @ 2026-04-23 17:25 UTC (permalink / raw)
  To: Ville Syrjala; +Cc: intel-gfx

== Series Details ==

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

== Summary ==

Error: make failed
  CALL    scripts/checksyscalls.sh
  DESCEND objtool
  INSTALL libsubcmd_headers
  CC [M]  drivers/gpu/drm/xe/display/xe_fb_pin.o
In file included from ./include/linux/string.h:386,
                 from ./include/linux/bitmap.h:13,
                 from ./include/linux/cpumask.h:11,
                 from ./arch/x86/include/asm/paravirt.h:19,
                 from ./arch/x86/include/asm/irqflags.h:102,
                 from ./include/linux/irqflags.h:18,
                 from ./include/linux/spinlock.h:59,
                 from ./include/linux/kref.h:16,
                 from ./include/drm/drm_gem.h:37,
                 from ./include/drm/ttm/ttm_bo.h:34,
                 from drivers/gpu/drm/xe/display/xe_fb_pin.c:7:
In function ‘memcmp’,
    inlined from ‘xe_fb_pin_reuse_vma’ at drivers/gpu/drm/xe/display/xe_fb_pin.c:484:7:
./include/linux/fortify-string.h:717:25: error: call to ‘__read_overflow’ declared with attribute error: detected read beyond size of object (1st parameter)
  717 |                         __read_overflow();
      |                         ^~~~~~~~~~~~~~~~~
./include/linux/fortify-string.h:719:25: error: call to ‘__read_overflow2’ declared with attribute error: detected read beyond size of object (2nd parameter)
  719 |                         __read_overflow2();
      |                         ^~~~~~~~~~~~~~~~~~
make[6]: *** [scripts/Makefile.build:289: drivers/gpu/drm/xe/display/xe_fb_pin.o] Error 1
make[5]: *** [scripts/Makefile.build:549: drivers/gpu/drm/xe] Error 2
make[4]: *** [scripts/Makefile.build:549: drivers/gpu/drm] Error 2
make[3]: *** [scripts/Makefile.build:549: drivers/gpu] Error 2
make[2]: *** [scripts/Makefile.build:549: drivers] Error 2
make[1]: *** [/home/kbuild2/kernel/Makefile:2105: .] Error 2
make: *** [Makefile:248: __sub-make] Error 2
Build failed, no error log produced



^ permalink raw reply	[flat|nested] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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
  2026-04-30 16:19   ` [PATCH v2 " Ville Syrjala
  1 sibling, 0 replies; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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; 38+ 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] 38+ 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
  2026-04-27 12:08     ` Ville Syrjälä
  0 siblings, 1 reply; 38+ 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] 38+ messages in thread

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

On Fri, Apr 24, 2026 at 04:30:40PM +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>
> >
> > 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.

I'm pretty sure there was a patch floating around for that.
Not sure why it didn't get pushed. Maybe just due to the general
apathy surrounding the xe fb code...

> 
> 
> > -		.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

-- 
Ville Syrjälä
Intel

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

* [PATCH v2 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
@ 2026-04-30 16:19   ` Ville Syrjala
  1 sibling, 0 replies; 38+ messages in thread
From: Ville Syrjala @ 2026-04-30 16:19 UTC (permalink / raw)
  To: intel-gfx; +Cc: intel-xe, Jani Nikula

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.

v2: Fix memcmp() arguments

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 | 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..ac5b814fcca0 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_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;
-	}
-
-	return false;
+	if (old_ggtt_vma && old_obj == new_obj &&
+	    !memcmp(old_view, new_view, sizeof(*new_view))) {
+		refcount_inc(&old_ggtt_vma->ref);
 
-found:
-	refcount_inc(&vma->ref);
-	new_plane_state->ggtt_vma = vma;
+		*out_offset = xe_ggtt_node_addr(old_ggtt_vma->node);
 
-	new_plane_state->surf = xe_ggtt_node_addr(new_plane_state->ggtt_vma->node) +
-		plane->surf_offset(new_plane_state);
+		return old_ggtt_vma;
+	}
 
-	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] 38+ messages in thread

* ✗ i915.CI.BAT: failure for drm/i915: Introduce 'fb_pin' parent interface (rev2)
  2026-04-23 16:53 [PATCH 00/16] drm/i915: Introduce 'fb_pin' parent interface Ville Syrjala
                   ` (16 preceding siblings ...)
  2026-04-23 17:25 ` ✗ Fi.CI.BUILD: failure for drm/i915: Introduce 'fb_pin' parent interface Patchwork
@ 2026-04-30 18:05 ` Patchwork
  17 siblings, 0 replies; 38+ messages in thread
From: Patchwork @ 2026-04-30 18:05 UTC (permalink / raw)
  To: Ville Syrjala; +Cc: intel-gfx

[-- Attachment #1: Type: text/plain, Size: 5978 bytes --]

== Series Details ==

Series: drm/i915: Introduce 'fb_pin' parent interface (rev2)
URL   : https://patchwork.freedesktop.org/series/165376/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_18389 -> Patchwork_165376v2
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with Patchwork_165376v2 absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_165376v2, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
  to document this new failure mode, which will reduce false positives in CI.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/index.html

Participating hosts (41 -> 40)
------------------------------

  Additional (1): bat-adls-6 
  Missing    (2): bat-dg2-13 fi-snb-2520m 

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in Patchwork_165376v2:

### IGT changes ###

#### Possible regressions ####

  * igt@i915_selftest@live:
    - fi-bsw-n3050:       [PASS][1] -> [DMESG-FAIL][2] +1 other test dmesg-fail
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_18389/fi-bsw-n3050/igt@i915_selftest@live.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/fi-bsw-n3050/igt@i915_selftest@live.html

  
Known issues
------------

  Here are the changes found in Patchwork_165376v2 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@dmabuf@all-tests:
    - bat-adls-6:         NOTRUN -> [SKIP][3] ([i915#15931])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/bat-adls-6/igt@dmabuf@all-tests.html

  * igt@gem_lmem_swapping@parallel-random-engines:
    - bat-adls-6:         NOTRUN -> [SKIP][4] ([i915#4613]) +3 other tests skip
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/bat-adls-6/igt@gem_lmem_swapping@parallel-random-engines.html

  * igt@gem_tiled_pread_basic@basic:
    - bat-adls-6:         NOTRUN -> [SKIP][5] ([i915#15656])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/bat-adls-6/igt@gem_tiled_pread_basic@basic.html

  * igt@intel_hwmon@hwmon-read:
    - bat-adls-6:         NOTRUN -> [SKIP][6] ([i915#7707]) +1 other test skip
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/bat-adls-6/igt@intel_hwmon@hwmon-read.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy:
    - bat-adls-6:         NOTRUN -> [SKIP][7] ([i915#4103]) +1 other test skip
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/bat-adls-6/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy.html

  * igt@kms_dsc@dsc-basic:
    - bat-adls-6:         NOTRUN -> [SKIP][8] ([i915#3555] / [i915#3840])
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/bat-adls-6/igt@kms_dsc@dsc-basic.html

  * igt@kms_force_connector_basic@force-load-detect:
    - bat-adls-6:         NOTRUN -> [SKIP][9]
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/bat-adls-6/igt@kms_force_connector_basic@force-load-detect.html

  * igt@kms_pm_backlight@basic-brightness:
    - bat-adls-6:         NOTRUN -> [SKIP][10] ([i915#5354])
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/bat-adls-6/igt@kms_pm_backlight@basic-brightness.html

  * igt@kms_psr@psr-primary-mmap-gtt:
    - bat-adls-6:         NOTRUN -> [SKIP][11] ([i915#1072] / [i915#9732]) +3 other tests skip
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/bat-adls-6/igt@kms_psr@psr-primary-mmap-gtt.html

  * igt@kms_setmode@basic-clone-single-crtc:
    - bat-adls-6:         NOTRUN -> [SKIP][12] ([i915#3555])
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/bat-adls-6/igt@kms_setmode@basic-clone-single-crtc.html

  * igt@prime_vgem@basic-fence-read:
    - bat-adls-6:         NOTRUN -> [SKIP][13] ([i915#3291]) +2 other tests skip
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/bat-adls-6/igt@prime_vgem@basic-fence-read.html

  
#### Possible fixes ####

  * igt@i915_selftest@live@workarounds:
    - bat-mtlp-9:         [DMESG-FAIL][14] ([i915#12061]) -> [PASS][15] +1 other test pass
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_18389/bat-mtlp-9/igt@i915_selftest@live@workarounds.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/bat-mtlp-9/igt@i915_selftest@live@workarounds.html

  
  [i915#1072]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1072
  [i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
  [i915#15656]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15656
  [i915#15931]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15931
  [i915#3291]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3291
  [i915#3555]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3555
  [i915#3840]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3840
  [i915#4103]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4103
  [i915#4613]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4613
  [i915#5354]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5354
  [i915#7707]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7707
  [i915#9732]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9732


Build changes
-------------

  * Linux: CI_DRM_18389 -> Patchwork_165376v2

  CI-20190529: 20190529
  CI_DRM_18389: 6472756e8384e3945f12b6726dd9dc1ac12f3bb4 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_8881: aa5853ef5b379b1e4558218c21ef4caeae112184 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_165376v2: 6472756e8384e3945f12b6726dd9dc1ac12f3bb4 @ git://anongit.freedesktop.org/gfx-ci/linux

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165376v2/index.html

[-- Attachment #2: Type: text/html, Size: 6993 bytes --]

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

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

Thread overview: 38+ 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-30 16:19   ` [PATCH v2 " Ville Syrjala
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-27 12:08     ` Ville Syrjälä
2026-04-23 17:25 ` ✗ Fi.CI.BUILD: failure for drm/i915: Introduce 'fb_pin' parent interface Patchwork
2026-04-30 18:05 ` ✗ i915.CI.BAT: failure for drm/i915: Introduce 'fb_pin' parent interface (rev2) Patchwork

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