Intel-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer
@ 2026-06-02 10:09 Jani Nikula
  2026-06-02 10:09 ` [PATCH 1/6] drm/i915/panic: split out i915_gem_panic.[ch] Jani Nikula
                   ` (6 more replies)
  0 siblings, 7 replies; 14+ messages in thread
From: Jani Nikula @ 2026-06-02 10:09 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: jani.nikula, Jocelyn Falempe

Having i915 and xe panic code depend on struct intel_framebuffer is a
bit annoying. Break that dependency by storing the tiling function
pointer in struct intel_panic, and storing intel_panic pointer in struct
drm_scanout_buffer .private member. Do a bunch of cleanups first to make
it easier.


Cc: Jocelyn Falempe <jfalempe@redhat.com>

Jani Nikula (6):
  drm/i915/panic: split out i915_gem_panic.[ch]
  drm/i915/panic: squash i915_panic.c into i915_gem_panic.c
  drm/i915/panic: remove the extra layer from panic hooks
  drm/{i915,xe}/panic: pass obj to panic setup
  drm/xe/panic: store fb bo in struct intel_panic
  drm/{i915,xe}/panic: drop dependency on struct intel_framebuffer

 drivers/gpu/drm/i915/Makefile                 |   4 +-
 .../drm/i915/display/intel_display_types.h    |   1 -
 drivers/gpu/drm/i915/display/intel_parent.c   |   6 +-
 drivers/gpu/drm/i915/display/intel_parent.h   |   4 +-
 drivers/gpu/drm/i915/display/intel_plane.c    |   8 +-
 drivers/gpu/drm/i915/gem/i915_gem_object.h    |   7 -
 drivers/gpu/drm/i915/gem/i915_gem_pages.c     | 128 ---------------
 drivers/gpu/drm/i915/gem/i915_gem_panic.c     | 147 ++++++++++++++++++
 drivers/gpu/drm/i915/gem/i915_gem_panic.h     |  11 ++
 drivers/gpu/drm/i915/i915_driver.c            |   2 +-
 drivers/gpu/drm/i915/i915_panic.c             |  35 -----
 drivers/gpu/drm/i915/i915_panic.h             |   9 --
 drivers/gpu/drm/xe/display/xe_panic.c         |  26 ++--
 include/drm/intel/display_parent_interface.h  |   4 +-
 14 files changed, 191 insertions(+), 201 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_panic.c
 create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_panic.h
 delete mode 100644 drivers/gpu/drm/i915/i915_panic.c
 delete mode 100644 drivers/gpu/drm/i915/i915_panic.h

-- 
2.47.3


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

* [PATCH 1/6] drm/i915/panic: split out i915_gem_panic.[ch]
  2026-06-02 10:09 [PATCH 0/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer Jani Nikula
@ 2026-06-02 10:09 ` Jani Nikula
  2026-06-08  8:19   ` Jocelyn Falempe
  2026-06-02 10:09 ` [PATCH 2/6] drm/i915/panic: squash i915_panic.c into i915_gem_panic.c Jani Nikula
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: Jani Nikula @ 2026-06-02 10:09 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: jani.nikula, Jocelyn Falempe

The panic handling is a bit special and isolated part of
i915_gem_pages.c. Split it out to i915_gem_panic.[ch].

Cc: Jocelyn Falempe <jfalempe@redhat.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/Makefile              |   1 +
 drivers/gpu/drm/i915/gem/i915_gem_object.h |   7 --
 drivers/gpu/drm/i915/gem/i915_gem_pages.c  | 128 -------------------
 drivers/gpu/drm/i915/gem/i915_gem_panic.c  | 135 +++++++++++++++++++++
 drivers/gpu/drm/i915/gem/i915_gem_panic.h  |  18 +++
 drivers/gpu/drm/i915/i915_panic.c          |   2 +-
 6 files changed, 155 insertions(+), 136 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_panic.c
 create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_panic.h

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 07802a7f4ce5..091b6647c383 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -167,6 +167,7 @@ gem-y += \
 	gem/i915_gem_object.o \
 	gem/i915_gem_object_frontbuffer.o \
 	gem/i915_gem_pages.o \
+	gem/i915_gem_panic.o \
 	gem/i915_gem_phys.o \
 	gem/i915_gem_pm.o \
 	gem/i915_gem_region.o \
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
index 8878539c10ed..2c5d20e4dbaf 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
@@ -17,8 +17,6 @@
 #include "i915_vma_types.h"
 
 enum intel_region_id;
-struct drm_scanout_buffer;
-struct intel_panic;
 
 #define obj_to_i915(obj__) to_i915((obj__)->base.dev)
 
@@ -693,11 +691,6 @@ i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj)
 int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj);
 int i915_gem_object_truncate(struct drm_i915_gem_object *obj);
 
-struct intel_panic *i915_gem_object_alloc_panic(void);
-int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
-				struct drm_gem_object *_obj, bool panic_tiling);
-void i915_gem_object_panic_finish(struct intel_panic *panic);
-
 /**
  * i915_gem_object_pin_map - return a contiguous mapping of the entire object
  * @obj: the object to map into kernel address space
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
index df35bdb755e4..59e3d4de7d3c 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
@@ -6,11 +6,8 @@
 #include <linux/vmalloc.h>
 
 #include <drm/drm_cache.h>
-#include <drm/drm_panic.h>
 #include <drm/drm_print.h>
 
-#include "display/intel_fb.h"
-#include "display/intel_display_types.h"
 #include "gt/intel_gt.h"
 #include "gt/intel_tlb.h"
 
@@ -359,131 +356,6 @@ static void *i915_gem_object_map_pfn(struct drm_i915_gem_object *obj,
 	return vaddr ?: ERR_PTR(-ENOMEM);
 }
 
-struct intel_panic {
-	struct page **pages;
-	int page;
-	void *vaddr;
-};
-
-static void i915_panic_kunmap(struct intel_panic *panic)
-{
-	if (panic->vaddr) {
-		drm_clflush_virt_range(panic->vaddr, PAGE_SIZE);
-		kunmap_local(panic->vaddr);
-		panic->vaddr = NULL;
-	}
-}
-
-static struct page **i915_gem_object_panic_pages(struct drm_i915_gem_object *obj)
-{
-	unsigned long n_pages = obj->base.size >> PAGE_SHIFT, i;
-	struct page *page;
-	struct page **pages;
-	struct sgt_iter iter;
-
-	/* For a 3840x2160 32 bits Framebuffer, this should require ~64K */
-	pages = kmalloc_objs(*pages, n_pages, GFP_ATOMIC);
-	if (!pages)
-		return NULL;
-
-	i = 0;
-	for_each_sgt_page(page, iter, obj->mm.pages)
-		pages[i++] = page;
-	return pages;
-}
-
-static void i915_gem_object_panic_map_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
-						unsigned int y, u32 color)
-{
-	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
-	unsigned int offset = fb->panic_tiling(sb->width, x, y);
-
-	iosys_map_wr(&sb->map[0], offset, u32, color);
-}
-
-/*
- * The scanout buffer pages are not mapped, so for each pixel,
- * use kmap_local_page_try_from_panic() to map the page, and write the pixel.
- * Try to keep the map from the previous pixel, to avoid too much map/unmap.
- */
-static void i915_gem_object_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
-						 unsigned int y, u32 color)
-{
-	unsigned int new_page;
-	unsigned int offset;
-	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
-	struct intel_panic *panic = fb->panic;
-
-	if (fb->panic_tiling)
-		offset = fb->panic_tiling(sb->width, x, y);
-	else
-		offset = y * sb->pitch[0] + x * sb->format->cpp[0];
-
-	new_page = offset >> PAGE_SHIFT;
-	offset = offset % PAGE_SIZE;
-	if (new_page != panic->page) {
-		i915_panic_kunmap(panic);
-		panic->page = new_page;
-		panic->vaddr =
-			kmap_local_page_try_from_panic(panic->pages[panic->page]);
-	}
-	if (panic->vaddr) {
-		u32 *pix = panic->vaddr + offset;
-		*pix = color;
-	}
-}
-
-struct intel_panic *i915_gem_object_alloc_panic(void)
-{
-	struct intel_panic *panic;
-
-	panic = kzalloc_obj(*panic);
-
-	return panic;
-}
-
-/*
- * Setup the gem framebuffer for drm_panic access.
- * Use current vaddr if it exists, or setup a list of pages.
- * pfn is not supported yet.
- */
-int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
-				struct drm_gem_object *_obj, bool panic_tiling)
-{
-	enum i915_map_type has_type;
-	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
-	void *ptr;
-
-	ptr = page_unpack_bits(obj->mm.mapping, &has_type);
-	if (ptr) {
-		if (i915_gem_object_has_iomem(obj))
-			iosys_map_set_vaddr_iomem(&sb->map[0], (void __iomem *)ptr);
-		else
-			iosys_map_set_vaddr(&sb->map[0], ptr);
-
-		if (panic_tiling)
-			sb->set_pixel = i915_gem_object_panic_map_set_pixel;
-		return 0;
-	}
-	if (i915_gem_object_has_struct_page(obj)) {
-		panic->pages = i915_gem_object_panic_pages(obj);
-		if (!panic->pages)
-			return -ENOMEM;
-		panic->page = -1;
-		sb->set_pixel = i915_gem_object_panic_page_set_pixel;
-		return 0;
-	}
-	return -EOPNOTSUPP;
-}
-
-void i915_gem_object_panic_finish(struct intel_panic *panic)
-{
-	i915_panic_kunmap(panic);
-	panic->page = -1;
-	kfree(panic->pages);
-	panic->pages = NULL;
-}
-
 /* get, pin, and map the pages of the object into kernel space */
 void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
 			      enum i915_map_type type)
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.c b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
new file mode 100644
index 000000000000..7407c5668c71
--- /dev/null
+++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
@@ -0,0 +1,135 @@
+// SPDX-License-Identifier: MIT
+/* Copyright © 2026 Intel Corporation */
+
+#include <drm/drm_cache.h>
+#include <drm/drm_panic.h>
+
+#include "display/intel_fb.h"
+#include "display/intel_display_types.h"
+#include "i915_gem_object.h"
+#include "i915_gem_panic.h"
+
+struct intel_panic {
+	struct page **pages;
+	int page;
+	void *vaddr;
+};
+
+static void i915_panic_kunmap(struct intel_panic *panic)
+{
+	if (panic->vaddr) {
+		drm_clflush_virt_range(panic->vaddr, PAGE_SIZE);
+		kunmap_local(panic->vaddr);
+		panic->vaddr = NULL;
+	}
+}
+
+static struct page **i915_gem_object_panic_pages(struct drm_i915_gem_object *obj)
+{
+	unsigned long n_pages = obj->base.size >> PAGE_SHIFT, i;
+	struct page *page;
+	struct page **pages;
+	struct sgt_iter iter;
+
+	/* For a 3840x2160 32 bits Framebuffer, this should require ~64K */
+	pages = kmalloc_objs(*pages, n_pages, GFP_ATOMIC);
+	if (!pages)
+		return NULL;
+
+	i = 0;
+	for_each_sgt_page(page, iter, obj->mm.pages)
+		pages[i++] = page;
+	return pages;
+}
+
+static void i915_gem_object_panic_map_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
+						unsigned int y, u32 color)
+{
+	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
+	unsigned int offset = fb->panic_tiling(sb->width, x, y);
+
+	iosys_map_wr(&sb->map[0], offset, u32, color);
+}
+
+/*
+ * The scanout buffer pages are not mapped, so for each pixel,
+ * use kmap_local_page_try_from_panic() to map the page, and write the pixel.
+ * Try to keep the map from the previous pixel, to avoid too much map/unmap.
+ */
+static void i915_gem_object_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
+						 unsigned int y, u32 color)
+{
+	unsigned int new_page;
+	unsigned int offset;
+	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
+	struct intel_panic *panic = fb->panic;
+
+	if (fb->panic_tiling)
+		offset = fb->panic_tiling(sb->width, x, y);
+	else
+		offset = y * sb->pitch[0] + x * sb->format->cpp[0];
+
+	new_page = offset >> PAGE_SHIFT;
+	offset = offset % PAGE_SIZE;
+	if (new_page != panic->page) {
+		i915_panic_kunmap(panic);
+		panic->page = new_page;
+		panic->vaddr =
+			kmap_local_page_try_from_panic(panic->pages[panic->page]);
+	}
+	if (panic->vaddr) {
+		u32 *pix = panic->vaddr + offset;
+		*pix = color;
+	}
+}
+
+struct intel_panic *i915_gem_object_alloc_panic(void)
+{
+	struct intel_panic *panic;
+
+	panic = kzalloc_obj(*panic);
+
+	return panic;
+}
+
+/*
+ * Setup the gem framebuffer for drm_panic access.
+ * Use current vaddr if it exists, or setup a list of pages.
+ * pfn is not supported yet.
+ */
+int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
+				struct drm_gem_object *_obj, bool panic_tiling)
+{
+	enum i915_map_type has_type;
+	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
+	void *ptr;
+
+	ptr = page_unpack_bits(obj->mm.mapping, &has_type);
+	if (ptr) {
+		if (i915_gem_object_has_iomem(obj))
+			iosys_map_set_vaddr_iomem(&sb->map[0], (void __iomem *)ptr);
+		else
+			iosys_map_set_vaddr(&sb->map[0], ptr);
+
+		if (panic_tiling)
+			sb->set_pixel = i915_gem_object_panic_map_set_pixel;
+		return 0;
+	}
+	if (i915_gem_object_has_struct_page(obj)) {
+		panic->pages = i915_gem_object_panic_pages(obj);
+		if (!panic->pages)
+			return -ENOMEM;
+		panic->page = -1;
+		sb->set_pixel = i915_gem_object_panic_page_set_pixel;
+		return 0;
+	}
+	return -EOPNOTSUPP;
+}
+
+void i915_gem_object_panic_finish(struct intel_panic *panic)
+{
+	i915_panic_kunmap(panic);
+	panic->page = -1;
+	kfree(panic->pages);
+	panic->pages = NULL;
+}
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.h b/drivers/gpu/drm/i915/gem/i915_gem_panic.h
new file mode 100644
index 000000000000..91ab6722d37c
--- /dev/null
+++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: MIT */
+/* Copyright © 2026 Intel Corporation */
+
+#ifndef __I915_GEM_PANIC_H__
+#define __I915_GEM_PANIC_H__
+
+#include <linux/types.h>
+
+struct drm_gem_object;
+struct drm_scanout_buffer;
+struct intel_panic;
+
+struct intel_panic *i915_gem_object_alloc_panic(void);
+int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
+				struct drm_gem_object *_obj, bool panic_tiling);
+void i915_gem_object_panic_finish(struct intel_panic *panic);
+
+#endif /* __I915_GEM_PANIC_H__ */
diff --git a/drivers/gpu/drm/i915/i915_panic.c b/drivers/gpu/drm/i915/i915_panic.c
index 728be077e8e8..412db72797d8 100644
--- a/drivers/gpu/drm/i915/i915_panic.c
+++ b/drivers/gpu/drm/i915/i915_panic.c
@@ -6,7 +6,7 @@
 
 #include "display/intel_display_types.h"
 #include "display/intel_fb.h"
-#include "gem/i915_gem_object.h"
+#include "gem/i915_gem_panic.h"
 
 #include "i915_panic.h"
 
-- 
2.47.3


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

* [PATCH 2/6] drm/i915/panic: squash i915_panic.c into i915_gem_panic.c
  2026-06-02 10:09 [PATCH 0/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer Jani Nikula
  2026-06-02 10:09 ` [PATCH 1/6] drm/i915/panic: split out i915_gem_panic.[ch] Jani Nikula
@ 2026-06-02 10:09 ` Jani Nikula
  2026-06-08  8:20   ` Jocelyn Falempe
  2026-06-02 10:09 ` [PATCH 3/6] drm/i915/panic: remove the extra layer from panic hooks Jani Nikula
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: Jani Nikula @ 2026-06-02 10:09 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: jani.nikula, Jocelyn Falempe

Having two small files for panic handling is a bit too much. Merge
i915_panic.c into i915_gem_panic.c. This is just code movement, cleanups
will follow.

Cc: Jocelyn Falempe <jfalempe@redhat.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/Makefile             |  3 +-
 drivers/gpu/drm/i915/gem/i915_gem_panic.c | 33 ++++++++++++++++++---
 drivers/gpu/drm/i915/gem/i915_gem_panic.h |  9 +-----
 drivers/gpu/drm/i915/i915_driver.c        |  2 +-
 drivers/gpu/drm/i915/i915_panic.c         | 35 -----------------------
 drivers/gpu/drm/i915/i915_panic.h         |  9 ------
 6 files changed, 32 insertions(+), 59 deletions(-)
 delete mode 100644 drivers/gpu/drm/i915/i915_panic.c
 delete mode 100644 drivers/gpu/drm/i915/i915_panic.h

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 091b6647c383..1fd7a1a5f315 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -83,8 +83,7 @@ i915-y += \
 	i915_fb_pin.o \
 	i915_hdcp_gsc.o \
 	i915_initial_plane.o \
-	i915_overlay.o \
-	i915_panic.o
+	i915_overlay.o
 
 # "Graphics Technology" (aka we talk to the gpu)
 gt-y += \
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.c b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
index 7407c5668c71..14ea45dcdd8f 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_panic.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
@@ -3,6 +3,7 @@
 
 #include <drm/drm_cache.h>
 #include <drm/drm_panic.h>
+#include <drm/intel/display_parent_interface.h>
 
 #include "display/intel_fb.h"
 #include "display/intel_display_types.h"
@@ -83,7 +84,7 @@ static void i915_gem_object_panic_page_set_pixel(struct drm_scanout_buffer *sb,
 	}
 }
 
-struct intel_panic *i915_gem_object_alloc_panic(void)
+static struct intel_panic *i915_gem_object_alloc_panic(void)
 {
 	struct intel_panic *panic;
 
@@ -97,8 +98,8 @@ struct intel_panic *i915_gem_object_alloc_panic(void)
  * Use current vaddr if it exists, or setup a list of pages.
  * pfn is not supported yet.
  */
-int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
-				struct drm_gem_object *_obj, bool panic_tiling)
+static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
+				       struct drm_gem_object *_obj, bool panic_tiling)
 {
 	enum i915_map_type has_type;
 	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
@@ -126,10 +127,34 @@ int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_bu
 	return -EOPNOTSUPP;
 }
 
-void i915_gem_object_panic_finish(struct intel_panic *panic)
+static void i915_gem_object_panic_finish(struct intel_panic *panic)
 {
 	i915_panic_kunmap(panic);
 	panic->page = -1;
 	kfree(panic->pages);
 	panic->pages = NULL;
 }
+
+static struct intel_panic *intel_panic_alloc(void)
+{
+	return i915_gem_object_alloc_panic();
+}
+
+static int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb)
+{
+	struct intel_framebuffer *fb = sb->private;
+	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
+
+	return i915_gem_object_panic_setup(panic, sb, obj, fb->panic_tiling);
+}
+
+static void intel_panic_finish(struct intel_panic *panic)
+{
+	return i915_gem_object_panic_finish(panic);
+}
+
+const struct intel_display_panic_interface i915_display_panic_interface = {
+	.alloc = intel_panic_alloc,
+	.setup = intel_panic_setup,
+	.finish = intel_panic_finish,
+};
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.h b/drivers/gpu/drm/i915/gem/i915_gem_panic.h
index 91ab6722d37c..82c3aca6f1f3 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_panic.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.h
@@ -6,13 +6,6 @@
 
 #include <linux/types.h>
 
-struct drm_gem_object;
-struct drm_scanout_buffer;
-struct intel_panic;
-
-struct intel_panic *i915_gem_object_alloc_panic(void);
-int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
-				struct drm_gem_object *_obj, bool panic_tiling);
-void i915_gem_object_panic_finish(struct intel_panic *panic);
+extern const struct intel_display_panic_interface i915_display_panic_interface;
 
 #endif /* __I915_GEM_PANIC_H__ */
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 60d5e06675ab..8294899a52d4 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -80,6 +80,7 @@
 #include "gem/i915_gem_ioctls.h"
 #include "gem/i915_gem_mman.h"
 #include "gem/i915_gem_object_frontbuffer.h"
+#include "gem/i915_gem_panic.h"
 #include "gem/i915_gem_pm.h"
 #include "gt/intel_gt.h"
 #include "gt/intel_gt_pm.h"
@@ -112,7 +113,6 @@
 #include "i915_irq.h"
 #include "i915_memcpy.h"
 #include "i915_overlay.h"
-#include "i915_panic.h"
 #include "i915_perf.h"
 #include "i915_query.h"
 #include "i915_reg.h"
diff --git a/drivers/gpu/drm/i915/i915_panic.c b/drivers/gpu/drm/i915/i915_panic.c
deleted file mode 100644
index 412db72797d8..000000000000
--- a/drivers/gpu/drm/i915/i915_panic.c
+++ /dev/null
@@ -1,35 +0,0 @@
-// SPDX-License-Identifier: MIT
-/* Copyright © 2025 Intel Corporation */
-
-#include <drm/drm_panic.h>
-#include <drm/intel/display_parent_interface.h>
-
-#include "display/intel_display_types.h"
-#include "display/intel_fb.h"
-#include "gem/i915_gem_panic.h"
-
-#include "i915_panic.h"
-
-static struct intel_panic *intel_panic_alloc(void)
-{
-	return i915_gem_object_alloc_panic();
-}
-
-static int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb)
-{
-	struct intel_framebuffer *fb = sb->private;
-	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
-
-	return i915_gem_object_panic_setup(panic, sb, obj, fb->panic_tiling);
-}
-
-static void intel_panic_finish(struct intel_panic *panic)
-{
-	return i915_gem_object_panic_finish(panic);
-}
-
-const struct intel_display_panic_interface i915_display_panic_interface = {
-	.alloc = intel_panic_alloc,
-	.setup = intel_panic_setup,
-	.finish = intel_panic_finish,
-};
diff --git a/drivers/gpu/drm/i915/i915_panic.h b/drivers/gpu/drm/i915/i915_panic.h
deleted file mode 100644
index 743d8c861c42..000000000000
--- a/drivers/gpu/drm/i915/i915_panic.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/* Copyright © 2025 Intel Corporation */
-
-#ifndef __I915_PANIC_H__
-#define __I915_PANIC_H__
-
-extern const struct intel_display_panic_interface i915_display_panic_interface;
-
-#endif /* __I915_PANIC_H__ */
-- 
2.47.3


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

* [PATCH 3/6] drm/i915/panic: remove the extra layer from panic hooks
  2026-06-02 10:09 [PATCH 0/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer Jani Nikula
  2026-06-02 10:09 ` [PATCH 1/6] drm/i915/panic: split out i915_gem_panic.[ch] Jani Nikula
  2026-06-02 10:09 ` [PATCH 2/6] drm/i915/panic: squash i915_panic.c into i915_gem_panic.c Jani Nikula
@ 2026-06-02 10:09 ` Jani Nikula
  2026-06-08  8:21   ` Jocelyn Falempe
  2026-06-02 10:09 ` [PATCH 4/6] drm/{i915,xe}/panic: pass obj to panic setup Jani Nikula
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: Jani Nikula @ 2026-06-02 10:09 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: jani.nikula, Jocelyn Falempe

The extra layer in the panic hooks is useless. Remove it.

Cc: Jocelyn Falempe <jfalempe@redhat.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_panic.c | 30 ++++++-----------------
 1 file changed, 7 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.c b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
index 14ea45dcdd8f..bb26a0ece176 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_panic.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
@@ -98,9 +98,11 @@ static struct intel_panic *i915_gem_object_alloc_panic(void)
  * Use current vaddr if it exists, or setup a list of pages.
  * pfn is not supported yet.
  */
-static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
-				       struct drm_gem_object *_obj, bool panic_tiling)
+static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb)
 {
+	struct intel_framebuffer *fb = sb->private;
+	struct drm_gem_object *_obj = intel_fb_bo(&fb->base);
+	bool panic_tiling = fb->panic_tiling;
 	enum i915_map_type has_type;
 	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
 	void *ptr;
@@ -135,26 +137,8 @@ static void i915_gem_object_panic_finish(struct intel_panic *panic)
 	panic->pages = NULL;
 }
 
-static struct intel_panic *intel_panic_alloc(void)
-{
-	return i915_gem_object_alloc_panic();
-}
-
-static int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb)
-{
-	struct intel_framebuffer *fb = sb->private;
-	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
-
-	return i915_gem_object_panic_setup(panic, sb, obj, fb->panic_tiling);
-}
-
-static void intel_panic_finish(struct intel_panic *panic)
-{
-	return i915_gem_object_panic_finish(panic);
-}
-
 const struct intel_display_panic_interface i915_display_panic_interface = {
-	.alloc = intel_panic_alloc,
-	.setup = intel_panic_setup,
-	.finish = intel_panic_finish,
+	.alloc = i915_gem_object_alloc_panic,
+	.setup = i915_gem_object_panic_setup,
+	.finish = i915_gem_object_panic_finish,
 };
-- 
2.47.3


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

* [PATCH 4/6] drm/{i915,xe}/panic: pass obj to panic setup
  2026-06-02 10:09 [PATCH 0/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer Jani Nikula
                   ` (2 preceding siblings ...)
  2026-06-02 10:09 ` [PATCH 3/6] drm/i915/panic: remove the extra layer from panic hooks Jani Nikula
@ 2026-06-02 10:09 ` Jani Nikula
  2026-06-08  8:22   ` Jocelyn Falempe
  2026-06-02 10:09 ` [PATCH 5/6] drm/xe/panic: store fb bo in struct intel_panic Jani Nikula
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: Jani Nikula @ 2026-06-02 10:09 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: jani.nikula, Jocelyn Falempe

Start reducing i915 and xe core dependency on struct intel_framebuffer
by passing the fb obj from display.

Cc: Jocelyn Falempe <jfalempe@redhat.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/display/intel_parent.c  | 5 +++--
 drivers/gpu/drm/i915/display/intel_parent.h  | 3 ++-
 drivers/gpu/drm/i915/display/intel_plane.c   | 2 +-
 drivers/gpu/drm/i915/gem/i915_gem_panic.c    | 5 ++---
 drivers/gpu/drm/xe/display/xe_panic.c        | 6 +++---
 include/drm/intel/display_parent_interface.h | 3 ++-
 6 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c
index a5816561be40..0b2bc2d38442 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.c
+++ b/drivers/gpu/drm/i915/display/intel_parent.c
@@ -251,9 +251,10 @@ struct intel_panic *intel_parent_panic_alloc(struct intel_display *display)
 	return display->parent->panic->alloc();
 }
 
-int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic, struct drm_scanout_buffer *sb)
+int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic,
+			     struct drm_scanout_buffer *sb, struct drm_gem_object *obj)
 {
-	return display->parent->panic->setup(panic, sb);
+	return display->parent->panic->setup(panic, sb, obj);
 }
 
 void intel_parent_panic_finish(struct intel_display *display, struct intel_panic *panic)
diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h
index 27e35f891a6b..4197d1b1af61 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.h
+++ b/drivers/gpu/drm/i915/display/intel_parent.h
@@ -105,7 +105,8 @@ void intel_parent_overlay_cleanup(struct intel_display *display);
 
 /* panic */
 struct intel_panic *intel_parent_panic_alloc(struct intel_display *display);
-int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic, struct drm_scanout_buffer *sb);
+int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic,
+			     struct drm_scanout_buffer *sb, struct drm_gem_object *obj);
 void intel_parent_panic_finish(struct intel_display *display, struct intel_panic *panic);
 
 /* pc8 */
diff --git a/drivers/gpu/drm/i915/display/intel_plane.c b/drivers/gpu/drm/i915/display/intel_plane.c
index f55a6a2f7dd1..75eae994433d 100644
--- a/drivers/gpu/drm/i915/display/intel_plane.c
+++ b/drivers/gpu/drm/i915/display/intel_plane.c
@@ -1590,7 +1590,7 @@ static int intel_get_scanout_buffer(struct drm_plane *plane,
 				return -EOPNOTSUPP;
 		}
 		sb->private = fb;
-		ret = intel_parent_panic_setup(display, fb->panic, sb);
+		ret = intel_parent_panic_setup(display, fb->panic, sb, obj);
 		if (ret)
 			return ret;
 	}
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.c b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
index bb26a0ece176..001ccfbf7ab7 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_panic.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
@@ -5,7 +5,6 @@
 #include <drm/drm_panic.h>
 #include <drm/intel/display_parent_interface.h>
 
-#include "display/intel_fb.h"
 #include "display/intel_display_types.h"
 #include "i915_gem_object.h"
 #include "i915_gem_panic.h"
@@ -98,10 +97,10 @@ static struct intel_panic *i915_gem_object_alloc_panic(void)
  * Use current vaddr if it exists, or setup a list of pages.
  * pfn is not supported yet.
  */
-static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb)
+static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
+				       struct drm_gem_object *_obj)
 {
 	struct intel_framebuffer *fb = sb->private;
-	struct drm_gem_object *_obj = intel_fb_bo(&fb->base);
 	bool panic_tiling = fb->panic_tiling;
 	enum i915_map_type has_type;
 	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
diff --git a/drivers/gpu/drm/xe/display/xe_panic.c b/drivers/gpu/drm/xe/display/xe_panic.c
index bebb21d617f0..d7f456eec597 100644
--- a/drivers/gpu/drm/xe/display/xe_panic.c
+++ b/drivers/gpu/drm/xe/display/xe_panic.c
@@ -84,10 +84,10 @@ static struct intel_panic *xe_panic_alloc(void)
 	return panic;
 }
 
-static int xe_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb)
+static int xe_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
+			  struct drm_gem_object *obj)
 {
-	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
-	struct xe_bo *bo = gem_to_xe_bo(intel_fb_bo(&fb->base));
+	struct xe_bo *bo = gem_to_xe_bo(obj);
 
 	if (xe_bo_is_vram(bo) && !xe_bo_is_visible_vram(bo))
 		return -ENODEV;
diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
index 39991afeb173..b0362e231d84 100644
--- a/include/drm/intel/display_parent_interface.h
+++ b/include/drm/intel/display_parent_interface.h
@@ -167,7 +167,8 @@ struct intel_display_overlay_interface {
 
 struct intel_display_panic_interface {
 	struct intel_panic *(*alloc)(void);
-	int (*setup)(struct intel_panic *panic, struct drm_scanout_buffer *sb);
+	int (*setup)(struct intel_panic *panic, struct drm_scanout_buffer *sb,
+		     struct drm_gem_object *obj);
 	void (*finish)(struct intel_panic *panic);
 };
 
-- 
2.47.3


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

* [PATCH 5/6] drm/xe/panic: store fb bo in struct intel_panic
  2026-06-02 10:09 [PATCH 0/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer Jani Nikula
                   ` (3 preceding siblings ...)
  2026-06-02 10:09 ` [PATCH 4/6] drm/{i915,xe}/panic: pass obj to panic setup Jani Nikula
@ 2026-06-02 10:09 ` Jani Nikula
  2026-06-08  8:22   ` Jocelyn Falempe
  2026-06-02 10:09 ` [PATCH 6/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer Jani Nikula
  2026-06-02 10:54 ` ✗ i915.CI.BAT: failure for drm/{i915, xe}/panic: " Patchwork
  6 siblings, 1 reply; 14+ messages in thread
From: Jani Nikula @ 2026-06-02 10:09 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: jani.nikula, Jocelyn Falempe

Drop the dependency on intel_fb_bo() and intel_fb.h by storing the fb bo
passed in the setup hook to struct intel_panic.

Cc: Jocelyn Falempe <jfalempe@redhat.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/xe/display/xe_panic.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_panic.c b/drivers/gpu/drm/xe/display/xe_panic.c
index d7f456eec597..4b86760ec00a 100644
--- a/drivers/gpu/drm/xe/display/xe_panic.c
+++ b/drivers/gpu/drm/xe/display/xe_panic.c
@@ -6,7 +6,6 @@
 #include <drm/intel/display_parent_interface.h>
 
 #include "intel_display_types.h"
-#include "intel_fb.h"
 #include "xe_bo.h"
 #include "xe_panic.h"
 #include "xe_res_cursor.h"
@@ -16,6 +15,8 @@ struct intel_panic {
 	struct iosys_map vmap;
 
 	int page;
+
+	struct xe_bo *bo;
 };
 
 static void xe_panic_kunmap(struct intel_panic *panic)
@@ -38,7 +39,7 @@ static void xe_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int
 {
 	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
 	struct intel_panic *panic = fb->panic;
-	struct xe_bo *bo = gem_to_xe_bo(intel_fb_bo(&fb->base));
+	struct xe_bo *bo = panic->bo;
 	unsigned int new_page;
 	unsigned int offset;
 
@@ -93,6 +94,8 @@ static int xe_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *
 		return -ENODEV;
 
 	panic->page = -1;
+	panic->bo = bo;
+
 	sb->set_pixel = xe_panic_page_set_pixel;
 	return 0;
 }
-- 
2.47.3


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

* [PATCH 6/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer
  2026-06-02 10:09 [PATCH 0/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer Jani Nikula
                   ` (4 preceding siblings ...)
  2026-06-02 10:09 ` [PATCH 5/6] drm/xe/panic: store fb bo in struct intel_panic Jani Nikula
@ 2026-06-02 10:09 ` Jani Nikula
  2026-06-08  8:23   ` [PATCH 6/6] drm/{i915,xe}/panic: " Jocelyn Falempe
  2026-06-02 10:54 ` ✗ i915.CI.BAT: failure for drm/{i915, xe}/panic: " Patchwork
  6 siblings, 1 reply; 14+ messages in thread
From: Jani Nikula @ 2026-06-02 10:09 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: jani.nikula, Jocelyn Falempe

Store tiling function pointer in struct intel_panic instead of struct
intel_framebuffer, and store struct intel_panic pointer instead of
struct intel_framebuffer pointer in struct drm_scanout_buffer private
member.

To make this happen, pass the tiling function pointer to panic setup
hook, and initialize sb->private in the hook for clarity.

This allows us to drop the dependency on struct intel_framebuffer from
i915 and xe panic code.

Note: It would be less verbose to have a typedef for the tiling function
pointer. However, there isn't a nice location for it that wouldn't also
increase header interdependencies.

Cc: Jocelyn Falempe <jfalempe@redhat.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 .../drm/i915/display/intel_display_types.h    |  1 -
 drivers/gpu/drm/i915/display/intel_parent.c   |  5 ++--
 drivers/gpu/drm/i915/display/intel_parent.h   |  3 ++-
 drivers/gpu/drm/i915/display/intel_plane.c    |  8 +++---
 drivers/gpu/drm/i915/gem/i915_gem_panic.c     | 26 +++++++++++--------
 drivers/gpu/drm/xe/display/xe_panic.c         | 15 ++++++-----
 include/drm/intel/display_parent_interface.h  |  3 ++-
 7 files changed, 35 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index c21e0c0ef0b1..234fae44fb16 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -150,7 +150,6 @@ struct intel_framebuffer {
 	unsigned int min_alignment;
 	unsigned int vtd_guard;
 
-	unsigned int (*panic_tiling)(unsigned int x, unsigned int y, unsigned int width);
 	struct intel_panic *panic;
 };
 
diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c
index 0b2bc2d38442..a5e41ea66921 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.c
+++ b/drivers/gpu/drm/i915/display/intel_parent.c
@@ -252,9 +252,10 @@ struct intel_panic *intel_parent_panic_alloc(struct intel_display *display)
 }
 
 int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic,
-			     struct drm_scanout_buffer *sb, struct drm_gem_object *obj)
+			     struct drm_scanout_buffer *sb, struct drm_gem_object *obj,
+			     unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width))
 {
-	return display->parent->panic->setup(panic, sb, obj);
+	return display->parent->panic->setup(panic, sb, obj, tiling);
 }
 
 void intel_parent_panic_finish(struct intel_display *display, struct intel_panic *panic)
diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h
index 4197d1b1af61..595d4148b8eb 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.h
+++ b/drivers/gpu/drm/i915/display/intel_parent.h
@@ -106,7 +106,8 @@ void intel_parent_overlay_cleanup(struct intel_display *display);
 /* panic */
 struct intel_panic *intel_parent_panic_alloc(struct intel_display *display);
 int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic,
-			     struct drm_scanout_buffer *sb, struct drm_gem_object *obj);
+			     struct drm_scanout_buffer *sb, struct drm_gem_object *obj,
+			     unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width));
 void intel_parent_panic_finish(struct intel_display *display, struct intel_panic *panic);
 
 /* pc8 */
diff --git a/drivers/gpu/drm/i915/display/intel_plane.c b/drivers/gpu/drm/i915/display/intel_plane.c
index 75eae994433d..e2745b3be105 100644
--- a/drivers/gpu/drm/i915/display/intel_plane.c
+++ b/drivers/gpu/drm/i915/display/intel_plane.c
@@ -1580,17 +1580,17 @@ static int intel_get_scanout_buffer(struct drm_plane *plane,
 	if (fb == intel_fbdev_framebuffer(display->fbdev.fbdev)) {
 		intel_fbdev_get_map(display, &sb->map[0]);
 	} else {
+		unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width) = NULL;
 		int ret;
 		/* Can't disable tiling if DPT is in use */
 		if (intel_fb_uses_dpt(&fb->base)) {
 			if (fb->base.format->cpp[0] != 4)
 				return -EOPNOTSUPP;
-			fb->panic_tiling = intel_get_tiling_func(fb->base.modifier);
-			if (!fb->panic_tiling)
+			tiling = intel_get_tiling_func(fb->base.modifier);
+			if (!tiling)
 				return -EOPNOTSUPP;
 		}
-		sb->private = fb;
-		ret = intel_parent_panic_setup(display, fb->panic, sb, obj);
+		ret = intel_parent_panic_setup(display, fb->panic, sb, obj, tiling);
 		if (ret)
 			return ret;
 	}
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.c b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
index 001ccfbf7ab7..91389d36f101 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_panic.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
@@ -5,7 +5,6 @@
 #include <drm/drm_panic.h>
 #include <drm/intel/display_parent_interface.h>
 
-#include "display/intel_display_types.h"
 #include "i915_gem_object.h"
 #include "i915_gem_panic.h"
 
@@ -13,6 +12,8 @@ struct intel_panic {
 	struct page **pages;
 	int page;
 	void *vaddr;
+
+	unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width);
 };
 
 static void i915_panic_kunmap(struct intel_panic *panic)
@@ -45,8 +46,8 @@ static struct page **i915_gem_object_panic_pages(struct drm_i915_gem_object *obj
 static void i915_gem_object_panic_map_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
 						unsigned int y, u32 color)
 {
-	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
-	unsigned int offset = fb->panic_tiling(sb->width, x, y);
+	struct intel_panic *panic = sb->private;
+	unsigned int offset = panic->tiling(sb->width, x, y);
 
 	iosys_map_wr(&sb->map[0], offset, u32, color);
 }
@@ -59,13 +60,12 @@ static void i915_gem_object_panic_map_set_pixel(struct drm_scanout_buffer *sb, u
 static void i915_gem_object_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
 						 unsigned int y, u32 color)
 {
+	struct intel_panic *panic = sb->private;
 	unsigned int new_page;
 	unsigned int offset;
-	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
-	struct intel_panic *panic = fb->panic;
 
-	if (fb->panic_tiling)
-		offset = fb->panic_tiling(sb->width, x, y);
+	if (panic->tiling)
+		offset = panic->tiling(sb->width, x, y);
 	else
 		offset = y * sb->pitch[0] + x * sb->format->cpp[0];
 
@@ -98,14 +98,15 @@ static struct intel_panic *i915_gem_object_alloc_panic(void)
  * pfn is not supported yet.
  */
 static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
-				       struct drm_gem_object *_obj)
+				       struct drm_gem_object *_obj,
+				       unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width))
 {
-	struct intel_framebuffer *fb = sb->private;
-	bool panic_tiling = fb->panic_tiling;
 	enum i915_map_type has_type;
 	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
 	void *ptr;
 
+	sb->private = panic;
+
 	ptr = page_unpack_bits(obj->mm.mapping, &has_type);
 	if (ptr) {
 		if (i915_gem_object_has_iomem(obj))
@@ -113,8 +114,10 @@ static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_sca
 		else
 			iosys_map_set_vaddr(&sb->map[0], ptr);
 
-		if (panic_tiling)
+		if (tiling) {
+			panic->tiling = tiling;
 			sb->set_pixel = i915_gem_object_panic_map_set_pixel;
+		}
 		return 0;
 	}
 	if (i915_gem_object_has_struct_page(obj)) {
@@ -122,6 +125,7 @@ static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_sca
 		if (!panic->pages)
 			return -ENOMEM;
 		panic->page = -1;
+		panic->tiling = tiling;
 		sb->set_pixel = i915_gem_object_panic_page_set_pixel;
 		return 0;
 	}
diff --git a/drivers/gpu/drm/xe/display/xe_panic.c b/drivers/gpu/drm/xe/display/xe_panic.c
index 4b86760ec00a..12c6fb99015d 100644
--- a/drivers/gpu/drm/xe/display/xe_panic.c
+++ b/drivers/gpu/drm/xe/display/xe_panic.c
@@ -5,7 +5,6 @@
 #include <drm/drm_panic.h>
 #include <drm/intel/display_parent_interface.h>
 
-#include "intel_display_types.h"
 #include "xe_bo.h"
 #include "xe_panic.h"
 #include "xe_res_cursor.h"
@@ -17,6 +16,7 @@ struct intel_panic {
 	int page;
 
 	struct xe_bo *bo;
+	unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width);
 };
 
 static void xe_panic_kunmap(struct intel_panic *panic)
@@ -37,14 +37,13 @@ static void xe_panic_kunmap(struct intel_panic *panic)
 static void xe_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
 				    unsigned int y, u32 color)
 {
-	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
-	struct intel_panic *panic = fb->panic;
+	struct intel_panic *panic = sb->private;
 	struct xe_bo *bo = panic->bo;
 	unsigned int new_page;
 	unsigned int offset;
 
-	if (fb->panic_tiling)
-		offset = fb->panic_tiling(sb->width, x, y);
+	if (panic->tiling)
+		offset = panic->tiling(sb->width, x, y);
 	else
 		offset = y * sb->pitch[0] + x * sb->format->cpp[0];
 
@@ -86,7 +85,8 @@ static struct intel_panic *xe_panic_alloc(void)
 }
 
 static int xe_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
-			  struct drm_gem_object *obj)
+			  struct drm_gem_object *obj,
+			  unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width))
 {
 	struct xe_bo *bo = gem_to_xe_bo(obj);
 
@@ -95,8 +95,11 @@ static int xe_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *
 
 	panic->page = -1;
 	panic->bo = bo;
+	panic->tiling = tiling;
 
+	sb->private = panic;
 	sb->set_pixel = xe_panic_page_set_pixel;
+
 	return 0;
 }
 
diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
index b0362e231d84..de395df9ca30 100644
--- a/include/drm/intel/display_parent_interface.h
+++ b/include/drm/intel/display_parent_interface.h
@@ -168,7 +168,8 @@ struct intel_display_overlay_interface {
 struct intel_display_panic_interface {
 	struct intel_panic *(*alloc)(void);
 	int (*setup)(struct intel_panic *panic, struct drm_scanout_buffer *sb,
-		     struct drm_gem_object *obj);
+		     struct drm_gem_object *obj,
+		     unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width));
 	void (*finish)(struct intel_panic *panic);
 };
 
-- 
2.47.3


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

* ✗ i915.CI.BAT: failure for drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer
  2026-06-02 10:09 [PATCH 0/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer Jani Nikula
                   ` (5 preceding siblings ...)
  2026-06-02 10:09 ` [PATCH 6/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer Jani Nikula
@ 2026-06-02 10:54 ` Patchwork
  6 siblings, 0 replies; 14+ messages in thread
From: Patchwork @ 2026-06-02 10:54 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

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

== Series Details ==

Series: drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer
URL   : https://patchwork.freedesktop.org/series/167731/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_18602 -> Patchwork_167731v1
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with Patchwork_167731v1 absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_167731v1, 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_167731v1/index.html

Participating hosts (42 -> 39)
------------------------------

  Missing    (3): bat-dg2-13 fi-snb-2520m bat-adls-6 

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

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

### IGT changes ###

#### Possible regressions ####

  * igt@kms_flip@basic-flip-vs-wf_vblank:
    - fi-bsw-n3050:       [PASS][1] -> [DMESG-WARN][2] +5 other tests dmesg-warn
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_18602/fi-bsw-n3050/igt@kms_flip@basic-flip-vs-wf_vblank.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_167731v1/fi-bsw-n3050/igt@kms_flip@basic-flip-vs-wf_vblank.html

  


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

  * Linux: CI_DRM_18602 -> Patchwork_167731v1

  CI-20190529: 20190529
  CI_DRM_18602: 51691efbd097f015d1f412ed410d399f2d9b672f @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_8945: d34395a7ede75d0b83edac965e27c0512bc0fe6e @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_167731v1: 51691efbd097f015d1f412ed410d399f2d9b672f @ git://anongit.freedesktop.org/gfx-ci/linux

== Logs ==

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

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

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

* Re: [PATCH 1/6] drm/i915/panic: split out i915_gem_panic.[ch]
  2026-06-02 10:09 ` [PATCH 1/6] drm/i915/panic: split out i915_gem_panic.[ch] Jani Nikula
@ 2026-06-08  8:19   ` Jocelyn Falempe
  0 siblings, 0 replies; 14+ messages in thread
From: Jocelyn Falempe @ 2026-06-08  8:19 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx, intel-xe

On 02/06/2026 12:09, Jani Nikula wrote:
> The panic handling is a bit special and isolated part of
> i915_gem_pages.c. Split it out to i915_gem_panic.[ch].

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
> 
> Cc: Jocelyn Falempe <jfalempe@redhat.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/i915/Makefile              |   1 +
>   drivers/gpu/drm/i915/gem/i915_gem_object.h |   7 --
>   drivers/gpu/drm/i915/gem/i915_gem_pages.c  | 128 -------------------
>   drivers/gpu/drm/i915/gem/i915_gem_panic.c  | 135 +++++++++++++++++++++
>   drivers/gpu/drm/i915/gem/i915_gem_panic.h  |  18 +++
>   drivers/gpu/drm/i915/i915_panic.c          |   2 +-
>   6 files changed, 155 insertions(+), 136 deletions(-)
>   create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_panic.c
>   create mode 100644 drivers/gpu/drm/i915/gem/i915_gem_panic.h
> 
> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
> index 07802a7f4ce5..091b6647c383 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -167,6 +167,7 @@ gem-y += \
>   	gem/i915_gem_object.o \
>   	gem/i915_gem_object_frontbuffer.o \
>   	gem/i915_gem_pages.o \
> +	gem/i915_gem_panic.o \
>   	gem/i915_gem_phys.o \
>   	gem/i915_gem_pm.o \
>   	gem/i915_gem_region.o \
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
> index 8878539c10ed..2c5d20e4dbaf 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
> @@ -17,8 +17,6 @@
>   #include "i915_vma_types.h"
>   
>   enum intel_region_id;
> -struct drm_scanout_buffer;
> -struct intel_panic;
>   
>   #define obj_to_i915(obj__) to_i915((obj__)->base.dev)
>   
> @@ -693,11 +691,6 @@ i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj)
>   int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj);
>   int i915_gem_object_truncate(struct drm_i915_gem_object *obj);
>   
> -struct intel_panic *i915_gem_object_alloc_panic(void);
> -int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> -				struct drm_gem_object *_obj, bool panic_tiling);
> -void i915_gem_object_panic_finish(struct intel_panic *panic);
> -
>   /**
>    * i915_gem_object_pin_map - return a contiguous mapping of the entire object
>    * @obj: the object to map into kernel address space
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
> index df35bdb755e4..59e3d4de7d3c 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
> @@ -6,11 +6,8 @@
>   #include <linux/vmalloc.h>
>   
>   #include <drm/drm_cache.h>
> -#include <drm/drm_panic.h>
>   #include <drm/drm_print.h>
>   
> -#include "display/intel_fb.h"
> -#include "display/intel_display_types.h"
>   #include "gt/intel_gt.h"
>   #include "gt/intel_tlb.h"
>   
> @@ -359,131 +356,6 @@ static void *i915_gem_object_map_pfn(struct drm_i915_gem_object *obj,
>   	return vaddr ?: ERR_PTR(-ENOMEM);
>   }
>   
> -struct intel_panic {
> -	struct page **pages;
> -	int page;
> -	void *vaddr;
> -};
> -
> -static void i915_panic_kunmap(struct intel_panic *panic)
> -{
> -	if (panic->vaddr) {
> -		drm_clflush_virt_range(panic->vaddr, PAGE_SIZE);
> -		kunmap_local(panic->vaddr);
> -		panic->vaddr = NULL;
> -	}
> -}
> -
> -static struct page **i915_gem_object_panic_pages(struct drm_i915_gem_object *obj)
> -{
> -	unsigned long n_pages = obj->base.size >> PAGE_SHIFT, i;
> -	struct page *page;
> -	struct page **pages;
> -	struct sgt_iter iter;
> -
> -	/* For a 3840x2160 32 bits Framebuffer, this should require ~64K */
> -	pages = kmalloc_objs(*pages, n_pages, GFP_ATOMIC);
> -	if (!pages)
> -		return NULL;
> -
> -	i = 0;
> -	for_each_sgt_page(page, iter, obj->mm.pages)
> -		pages[i++] = page;
> -	return pages;
> -}
> -
> -static void i915_gem_object_panic_map_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
> -						unsigned int y, u32 color)
> -{
> -	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
> -	unsigned int offset = fb->panic_tiling(sb->width, x, y);
> -
> -	iosys_map_wr(&sb->map[0], offset, u32, color);
> -}
> -
> -/*
> - * The scanout buffer pages are not mapped, so for each pixel,
> - * use kmap_local_page_try_from_panic() to map the page, and write the pixel.
> - * Try to keep the map from the previous pixel, to avoid too much map/unmap.
> - */
> -static void i915_gem_object_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
> -						 unsigned int y, u32 color)
> -{
> -	unsigned int new_page;
> -	unsigned int offset;
> -	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
> -	struct intel_panic *panic = fb->panic;
> -
> -	if (fb->panic_tiling)
> -		offset = fb->panic_tiling(sb->width, x, y);
> -	else
> -		offset = y * sb->pitch[0] + x * sb->format->cpp[0];
> -
> -	new_page = offset >> PAGE_SHIFT;
> -	offset = offset % PAGE_SIZE;
> -	if (new_page != panic->page) {
> -		i915_panic_kunmap(panic);
> -		panic->page = new_page;
> -		panic->vaddr =
> -			kmap_local_page_try_from_panic(panic->pages[panic->page]);
> -	}
> -	if (panic->vaddr) {
> -		u32 *pix = panic->vaddr + offset;
> -		*pix = color;
> -	}
> -}
> -
> -struct intel_panic *i915_gem_object_alloc_panic(void)
> -{
> -	struct intel_panic *panic;
> -
> -	panic = kzalloc_obj(*panic);
> -
> -	return panic;
> -}
> -
> -/*
> - * Setup the gem framebuffer for drm_panic access.
> - * Use current vaddr if it exists, or setup a list of pages.
> - * pfn is not supported yet.
> - */
> -int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> -				struct drm_gem_object *_obj, bool panic_tiling)
> -{
> -	enum i915_map_type has_type;
> -	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
> -	void *ptr;
> -
> -	ptr = page_unpack_bits(obj->mm.mapping, &has_type);
> -	if (ptr) {
> -		if (i915_gem_object_has_iomem(obj))
> -			iosys_map_set_vaddr_iomem(&sb->map[0], (void __iomem *)ptr);
> -		else
> -			iosys_map_set_vaddr(&sb->map[0], ptr);
> -
> -		if (panic_tiling)
> -			sb->set_pixel = i915_gem_object_panic_map_set_pixel;
> -		return 0;
> -	}
> -	if (i915_gem_object_has_struct_page(obj)) {
> -		panic->pages = i915_gem_object_panic_pages(obj);
> -		if (!panic->pages)
> -			return -ENOMEM;
> -		panic->page = -1;
> -		sb->set_pixel = i915_gem_object_panic_page_set_pixel;
> -		return 0;
> -	}
> -	return -EOPNOTSUPP;
> -}
> -
> -void i915_gem_object_panic_finish(struct intel_panic *panic)
> -{
> -	i915_panic_kunmap(panic);
> -	panic->page = -1;
> -	kfree(panic->pages);
> -	panic->pages = NULL;
> -}
> -
>   /* get, pin, and map the pages of the object into kernel space */
>   void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
>   			      enum i915_map_type type)
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.c b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> new file mode 100644
> index 000000000000..7407c5668c71
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> @@ -0,0 +1,135 @@
> +// SPDX-License-Identifier: MIT
> +/* Copyright © 2026 Intel Corporation */
> +
> +#include <drm/drm_cache.h>
> +#include <drm/drm_panic.h>
> +
> +#include "display/intel_fb.h"
> +#include "display/intel_display_types.h"
> +#include "i915_gem_object.h"
> +#include "i915_gem_panic.h"
> +
> +struct intel_panic {
> +	struct page **pages;
> +	int page;
> +	void *vaddr;
> +};
> +
> +static void i915_panic_kunmap(struct intel_panic *panic)
> +{
> +	if (panic->vaddr) {
> +		drm_clflush_virt_range(panic->vaddr, PAGE_SIZE);
> +		kunmap_local(panic->vaddr);
> +		panic->vaddr = NULL;
> +	}
> +}
> +
> +static struct page **i915_gem_object_panic_pages(struct drm_i915_gem_object *obj)
> +{
> +	unsigned long n_pages = obj->base.size >> PAGE_SHIFT, i;
> +	struct page *page;
> +	struct page **pages;
> +	struct sgt_iter iter;
> +
> +	/* For a 3840x2160 32 bits Framebuffer, this should require ~64K */
> +	pages = kmalloc_objs(*pages, n_pages, GFP_ATOMIC);
> +	if (!pages)
> +		return NULL;
> +
> +	i = 0;
> +	for_each_sgt_page(page, iter, obj->mm.pages)
> +		pages[i++] = page;
> +	return pages;
> +}
> +
> +static void i915_gem_object_panic_map_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
> +						unsigned int y, u32 color)
> +{
> +	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
> +	unsigned int offset = fb->panic_tiling(sb->width, x, y);
> +
> +	iosys_map_wr(&sb->map[0], offset, u32, color);
> +}
> +
> +/*
> + * The scanout buffer pages are not mapped, so for each pixel,
> + * use kmap_local_page_try_from_panic() to map the page, and write the pixel.
> + * Try to keep the map from the previous pixel, to avoid too much map/unmap.
> + */
> +static void i915_gem_object_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
> +						 unsigned int y, u32 color)
> +{
> +	unsigned int new_page;
> +	unsigned int offset;
> +	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
> +	struct intel_panic *panic = fb->panic;
> +
> +	if (fb->panic_tiling)
> +		offset = fb->panic_tiling(sb->width, x, y);
> +	else
> +		offset = y * sb->pitch[0] + x * sb->format->cpp[0];
> +
> +	new_page = offset >> PAGE_SHIFT;
> +	offset = offset % PAGE_SIZE;
> +	if (new_page != panic->page) {
> +		i915_panic_kunmap(panic);
> +		panic->page = new_page;
> +		panic->vaddr =
> +			kmap_local_page_try_from_panic(panic->pages[panic->page]);
> +	}
> +	if (panic->vaddr) {
> +		u32 *pix = panic->vaddr + offset;
> +		*pix = color;
> +	}
> +}
> +
> +struct intel_panic *i915_gem_object_alloc_panic(void)
> +{
> +	struct intel_panic *panic;
> +
> +	panic = kzalloc_obj(*panic);
> +
> +	return panic;
> +}
> +
> +/*
> + * Setup the gem framebuffer for drm_panic access.
> + * Use current vaddr if it exists, or setup a list of pages.
> + * pfn is not supported yet.
> + */
> +int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> +				struct drm_gem_object *_obj, bool panic_tiling)
> +{
> +	enum i915_map_type has_type;
> +	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
> +	void *ptr;
> +
> +	ptr = page_unpack_bits(obj->mm.mapping, &has_type);
> +	if (ptr) {
> +		if (i915_gem_object_has_iomem(obj))
> +			iosys_map_set_vaddr_iomem(&sb->map[0], (void __iomem *)ptr);
> +		else
> +			iosys_map_set_vaddr(&sb->map[0], ptr);
> +
> +		if (panic_tiling)
> +			sb->set_pixel = i915_gem_object_panic_map_set_pixel;
> +		return 0;
> +	}
> +	if (i915_gem_object_has_struct_page(obj)) {
> +		panic->pages = i915_gem_object_panic_pages(obj);
> +		if (!panic->pages)
> +			return -ENOMEM;
> +		panic->page = -1;
> +		sb->set_pixel = i915_gem_object_panic_page_set_pixel;
> +		return 0;
> +	}
> +	return -EOPNOTSUPP;
> +}
> +
> +void i915_gem_object_panic_finish(struct intel_panic *panic)
> +{
> +	i915_panic_kunmap(panic);
> +	panic->page = -1;
> +	kfree(panic->pages);
> +	panic->pages = NULL;
> +}
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.h b/drivers/gpu/drm/i915/gem/i915_gem_panic.h
> new file mode 100644
> index 000000000000..91ab6722d37c
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.h
> @@ -0,0 +1,18 @@
> +/* SPDX-License-Identifier: MIT */
> +/* Copyright © 2026 Intel Corporation */
> +
> +#ifndef __I915_GEM_PANIC_H__
> +#define __I915_GEM_PANIC_H__
> +
> +#include <linux/types.h>
> +
> +struct drm_gem_object;
> +struct drm_scanout_buffer;
> +struct intel_panic;
> +
> +struct intel_panic *i915_gem_object_alloc_panic(void);
> +int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> +				struct drm_gem_object *_obj, bool panic_tiling);
> +void i915_gem_object_panic_finish(struct intel_panic *panic);
> +
> +#endif /* __I915_GEM_PANIC_H__ */
> diff --git a/drivers/gpu/drm/i915/i915_panic.c b/drivers/gpu/drm/i915/i915_panic.c
> index 728be077e8e8..412db72797d8 100644
> --- a/drivers/gpu/drm/i915/i915_panic.c
> +++ b/drivers/gpu/drm/i915/i915_panic.c
> @@ -6,7 +6,7 @@
>   
>   #include "display/intel_display_types.h"
>   #include "display/intel_fb.h"
> -#include "gem/i915_gem_object.h"
> +#include "gem/i915_gem_panic.h"
>   
>   #include "i915_panic.h"
>   


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

* Re: [PATCH 2/6] drm/i915/panic: squash i915_panic.c into i915_gem_panic.c
  2026-06-02 10:09 ` [PATCH 2/6] drm/i915/panic: squash i915_panic.c into i915_gem_panic.c Jani Nikula
@ 2026-06-08  8:20   ` Jocelyn Falempe
  0 siblings, 0 replies; 14+ messages in thread
From: Jocelyn Falempe @ 2026-06-08  8:20 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx, intel-xe

On 02/06/2026 12:09, Jani Nikula wrote:
> Having two small files for panic handling is a bit too much. Merge
> i915_panic.c into i915_gem_panic.c. This is just code movement, cleanups
> will follow.
> 

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>

> Cc: Jocelyn Falempe <jfalempe@redhat.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/i915/Makefile             |  3 +-
>   drivers/gpu/drm/i915/gem/i915_gem_panic.c | 33 ++++++++++++++++++---
>   drivers/gpu/drm/i915/gem/i915_gem_panic.h |  9 +-----
>   drivers/gpu/drm/i915/i915_driver.c        |  2 +-
>   drivers/gpu/drm/i915/i915_panic.c         | 35 -----------------------
>   drivers/gpu/drm/i915/i915_panic.h         |  9 ------
>   6 files changed, 32 insertions(+), 59 deletions(-)
>   delete mode 100644 drivers/gpu/drm/i915/i915_panic.c
>   delete mode 100644 drivers/gpu/drm/i915/i915_panic.h
> 
> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
> index 091b6647c383..1fd7a1a5f315 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -83,8 +83,7 @@ i915-y += \
>   	i915_fb_pin.o \
>   	i915_hdcp_gsc.o \
>   	i915_initial_plane.o \
> -	i915_overlay.o \
> -	i915_panic.o
> +	i915_overlay.o
>   
>   # "Graphics Technology" (aka we talk to the gpu)
>   gt-y += \
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.c b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> index 7407c5668c71..14ea45dcdd8f 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> @@ -3,6 +3,7 @@
>   
>   #include <drm/drm_cache.h>
>   #include <drm/drm_panic.h>
> +#include <drm/intel/display_parent_interface.h>
>   
>   #include "display/intel_fb.h"
>   #include "display/intel_display_types.h"
> @@ -83,7 +84,7 @@ static void i915_gem_object_panic_page_set_pixel(struct drm_scanout_buffer *sb,
>   	}
>   }
>   
> -struct intel_panic *i915_gem_object_alloc_panic(void)
> +static struct intel_panic *i915_gem_object_alloc_panic(void)
>   {
>   	struct intel_panic *panic;
>   
> @@ -97,8 +98,8 @@ struct intel_panic *i915_gem_object_alloc_panic(void)
>    * Use current vaddr if it exists, or setup a list of pages.
>    * pfn is not supported yet.
>    */
> -int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> -				struct drm_gem_object *_obj, bool panic_tiling)
> +static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> +				       struct drm_gem_object *_obj, bool panic_tiling)
>   {
>   	enum i915_map_type has_type;
>   	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
> @@ -126,10 +127,34 @@ int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_bu
>   	return -EOPNOTSUPP;
>   }
>   
> -void i915_gem_object_panic_finish(struct intel_panic *panic)
> +static void i915_gem_object_panic_finish(struct intel_panic *panic)
>   {
>   	i915_panic_kunmap(panic);
>   	panic->page = -1;
>   	kfree(panic->pages);
>   	panic->pages = NULL;
>   }
> +
> +static struct intel_panic *intel_panic_alloc(void)
> +{
> +	return i915_gem_object_alloc_panic();
> +}
> +
> +static int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb)
> +{
> +	struct intel_framebuffer *fb = sb->private;
> +	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
> +
> +	return i915_gem_object_panic_setup(panic, sb, obj, fb->panic_tiling);
> +}
> +
> +static void intel_panic_finish(struct intel_panic *panic)
> +{
> +	return i915_gem_object_panic_finish(panic);
> +}
> +
> +const struct intel_display_panic_interface i915_display_panic_interface = {
> +	.alloc = intel_panic_alloc,
> +	.setup = intel_panic_setup,
> +	.finish = intel_panic_finish,
> +};
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.h b/drivers/gpu/drm/i915/gem/i915_gem_panic.h
> index 91ab6722d37c..82c3aca6f1f3 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_panic.h
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.h
> @@ -6,13 +6,6 @@
>   
>   #include <linux/types.h>
>   
> -struct drm_gem_object;
> -struct drm_scanout_buffer;
> -struct intel_panic;
> -
> -struct intel_panic *i915_gem_object_alloc_panic(void);
> -int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> -				struct drm_gem_object *_obj, bool panic_tiling);
> -void i915_gem_object_panic_finish(struct intel_panic *panic);
> +extern const struct intel_display_panic_interface i915_display_panic_interface;
>   
>   #endif /* __I915_GEM_PANIC_H__ */
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index 60d5e06675ab..8294899a52d4 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -80,6 +80,7 @@
>   #include "gem/i915_gem_ioctls.h"
>   #include "gem/i915_gem_mman.h"
>   #include "gem/i915_gem_object_frontbuffer.h"
> +#include "gem/i915_gem_panic.h"
>   #include "gem/i915_gem_pm.h"
>   #include "gt/intel_gt.h"
>   #include "gt/intel_gt_pm.h"
> @@ -112,7 +113,6 @@
>   #include "i915_irq.h"
>   #include "i915_memcpy.h"
>   #include "i915_overlay.h"
> -#include "i915_panic.h"
>   #include "i915_perf.h"
>   #include "i915_query.h"
>   #include "i915_reg.h"
> diff --git a/drivers/gpu/drm/i915/i915_panic.c b/drivers/gpu/drm/i915/i915_panic.c
> deleted file mode 100644
> index 412db72797d8..000000000000
> --- a/drivers/gpu/drm/i915/i915_panic.c
> +++ /dev/null
> @@ -1,35 +0,0 @@
> -// SPDX-License-Identifier: MIT
> -/* Copyright © 2025 Intel Corporation */
> -
> -#include <drm/drm_panic.h>
> -#include <drm/intel/display_parent_interface.h>
> -
> -#include "display/intel_display_types.h"
> -#include "display/intel_fb.h"
> -#include "gem/i915_gem_panic.h"
> -
> -#include "i915_panic.h"
> -
> -static struct intel_panic *intel_panic_alloc(void)
> -{
> -	return i915_gem_object_alloc_panic();
> -}
> -
> -static int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb)
> -{
> -	struct intel_framebuffer *fb = sb->private;
> -	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
> -
> -	return i915_gem_object_panic_setup(panic, sb, obj, fb->panic_tiling);
> -}
> -
> -static void intel_panic_finish(struct intel_panic *panic)
> -{
> -	return i915_gem_object_panic_finish(panic);
> -}
> -
> -const struct intel_display_panic_interface i915_display_panic_interface = {
> -	.alloc = intel_panic_alloc,
> -	.setup = intel_panic_setup,
> -	.finish = intel_panic_finish,
> -};
> diff --git a/drivers/gpu/drm/i915/i915_panic.h b/drivers/gpu/drm/i915/i915_panic.h
> deleted file mode 100644
> index 743d8c861c42..000000000000
> --- a/drivers/gpu/drm/i915/i915_panic.h
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -/* SPDX-License-Identifier: MIT */
> -/* Copyright © 2025 Intel Corporation */
> -
> -#ifndef __I915_PANIC_H__
> -#define __I915_PANIC_H__
> -
> -extern const struct intel_display_panic_interface i915_display_panic_interface;
> -
> -#endif /* __I915_PANIC_H__ */


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

* Re: [PATCH 3/6] drm/i915/panic: remove the extra layer from panic hooks
  2026-06-02 10:09 ` [PATCH 3/6] drm/i915/panic: remove the extra layer from panic hooks Jani Nikula
@ 2026-06-08  8:21   ` Jocelyn Falempe
  0 siblings, 0 replies; 14+ messages in thread
From: Jocelyn Falempe @ 2026-06-08  8:21 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx, intel-xe

On 02/06/2026 12:09, Jani Nikula wrote:
> The extra layer in the panic hooks is useless. Remove it.
> 

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>

> Cc: Jocelyn Falempe <jfalempe@redhat.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/i915/gem/i915_gem_panic.c | 30 ++++++-----------------
>   1 file changed, 7 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.c b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> index 14ea45dcdd8f..bb26a0ece176 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> @@ -98,9 +98,11 @@ static struct intel_panic *i915_gem_object_alloc_panic(void)
>    * Use current vaddr if it exists, or setup a list of pages.
>    * pfn is not supported yet.
>    */
> -static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> -				       struct drm_gem_object *_obj, bool panic_tiling)
> +static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb)
>   {
> +	struct intel_framebuffer *fb = sb->private;
> +	struct drm_gem_object *_obj = intel_fb_bo(&fb->base);
> +	bool panic_tiling = fb->panic_tiling;
>   	enum i915_map_type has_type;
>   	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
>   	void *ptr;
> @@ -135,26 +137,8 @@ static void i915_gem_object_panic_finish(struct intel_panic *panic)
>   	panic->pages = NULL;
>   }
>   
> -static struct intel_panic *intel_panic_alloc(void)
> -{
> -	return i915_gem_object_alloc_panic();
> -}
> -
> -static int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb)
> -{
> -	struct intel_framebuffer *fb = sb->private;
> -	struct drm_gem_object *obj = intel_fb_bo(&fb->base);
> -
> -	return i915_gem_object_panic_setup(panic, sb, obj, fb->panic_tiling);
> -}
> -
> -static void intel_panic_finish(struct intel_panic *panic)
> -{
> -	return i915_gem_object_panic_finish(panic);
> -}
> -
>   const struct intel_display_panic_interface i915_display_panic_interface = {
> -	.alloc = intel_panic_alloc,
> -	.setup = intel_panic_setup,
> -	.finish = intel_panic_finish,
> +	.alloc = i915_gem_object_alloc_panic,
> +	.setup = i915_gem_object_panic_setup,
> +	.finish = i915_gem_object_panic_finish,
>   };


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

* Re: [PATCH 4/6] drm/{i915,xe}/panic: pass obj to panic setup
  2026-06-02 10:09 ` [PATCH 4/6] drm/{i915,xe}/panic: pass obj to panic setup Jani Nikula
@ 2026-06-08  8:22   ` Jocelyn Falempe
  0 siblings, 0 replies; 14+ messages in thread
From: Jocelyn Falempe @ 2026-06-08  8:22 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx, intel-xe

On 02/06/2026 12:09, Jani Nikula wrote:
> Start reducing i915 and xe core dependency on struct intel_framebuffer
> by passing the fb obj from display.
> 

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>

> Cc: Jocelyn Falempe <jfalempe@redhat.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/i915/display/intel_parent.c  | 5 +++--
>   drivers/gpu/drm/i915/display/intel_parent.h  | 3 ++-
>   drivers/gpu/drm/i915/display/intel_plane.c   | 2 +-
>   drivers/gpu/drm/i915/gem/i915_gem_panic.c    | 5 ++---
>   drivers/gpu/drm/xe/display/xe_panic.c        | 6 +++---
>   include/drm/intel/display_parent_interface.h | 3 ++-
>   6 files changed, 13 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c
> index a5816561be40..0b2bc2d38442 100644
> --- a/drivers/gpu/drm/i915/display/intel_parent.c
> +++ b/drivers/gpu/drm/i915/display/intel_parent.c
> @@ -251,9 +251,10 @@ struct intel_panic *intel_parent_panic_alloc(struct intel_display *display)
>   	return display->parent->panic->alloc();
>   }
>   
> -int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic, struct drm_scanout_buffer *sb)
> +int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic,
> +			     struct drm_scanout_buffer *sb, struct drm_gem_object *obj)
>   {
> -	return display->parent->panic->setup(panic, sb);
> +	return display->parent->panic->setup(panic, sb, obj);
>   }
>   
>   void intel_parent_panic_finish(struct intel_display *display, struct intel_panic *panic)
> diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h
> index 27e35f891a6b..4197d1b1af61 100644
> --- a/drivers/gpu/drm/i915/display/intel_parent.h
> +++ b/drivers/gpu/drm/i915/display/intel_parent.h
> @@ -105,7 +105,8 @@ void intel_parent_overlay_cleanup(struct intel_display *display);
>   
>   /* panic */
>   struct intel_panic *intel_parent_panic_alloc(struct intel_display *display);
> -int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic, struct drm_scanout_buffer *sb);
> +int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic,
> +			     struct drm_scanout_buffer *sb, struct drm_gem_object *obj);
>   void intel_parent_panic_finish(struct intel_display *display, struct intel_panic *panic);
>   
>   /* pc8 */
> diff --git a/drivers/gpu/drm/i915/display/intel_plane.c b/drivers/gpu/drm/i915/display/intel_plane.c
> index f55a6a2f7dd1..75eae994433d 100644
> --- a/drivers/gpu/drm/i915/display/intel_plane.c
> +++ b/drivers/gpu/drm/i915/display/intel_plane.c
> @@ -1590,7 +1590,7 @@ static int intel_get_scanout_buffer(struct drm_plane *plane,
>   				return -EOPNOTSUPP;
>   		}
>   		sb->private = fb;
> -		ret = intel_parent_panic_setup(display, fb->panic, sb);
> +		ret = intel_parent_panic_setup(display, fb->panic, sb, obj);
>   		if (ret)
>   			return ret;
>   	}
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.c b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> index bb26a0ece176..001ccfbf7ab7 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> @@ -5,7 +5,6 @@
>   #include <drm/drm_panic.h>
>   #include <drm/intel/display_parent_interface.h>
>   
> -#include "display/intel_fb.h"
>   #include "display/intel_display_types.h"
>   #include "i915_gem_object.h"
>   #include "i915_gem_panic.h"
> @@ -98,10 +97,10 @@ static struct intel_panic *i915_gem_object_alloc_panic(void)
>    * Use current vaddr if it exists, or setup a list of pages.
>    * pfn is not supported yet.
>    */
> -static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb)
> +static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> +				       struct drm_gem_object *_obj)
>   {
>   	struct intel_framebuffer *fb = sb->private;
> -	struct drm_gem_object *_obj = intel_fb_bo(&fb->base);
>   	bool panic_tiling = fb->panic_tiling;
>   	enum i915_map_type has_type;
>   	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
> diff --git a/drivers/gpu/drm/xe/display/xe_panic.c b/drivers/gpu/drm/xe/display/xe_panic.c
> index bebb21d617f0..d7f456eec597 100644
> --- a/drivers/gpu/drm/xe/display/xe_panic.c
> +++ b/drivers/gpu/drm/xe/display/xe_panic.c
> @@ -84,10 +84,10 @@ static struct intel_panic *xe_panic_alloc(void)
>   	return panic;
>   }
>   
> -static int xe_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb)
> +static int xe_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> +			  struct drm_gem_object *obj)
>   {
> -	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
> -	struct xe_bo *bo = gem_to_xe_bo(intel_fb_bo(&fb->base));
> +	struct xe_bo *bo = gem_to_xe_bo(obj);
>   
>   	if (xe_bo_is_vram(bo) && !xe_bo_is_visible_vram(bo))
>   		return -ENODEV;
> diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
> index 39991afeb173..b0362e231d84 100644
> --- a/include/drm/intel/display_parent_interface.h
> +++ b/include/drm/intel/display_parent_interface.h
> @@ -167,7 +167,8 @@ struct intel_display_overlay_interface {
>   
>   struct intel_display_panic_interface {
>   	struct intel_panic *(*alloc)(void);
> -	int (*setup)(struct intel_panic *panic, struct drm_scanout_buffer *sb);
> +	int (*setup)(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> +		     struct drm_gem_object *obj);
>   	void (*finish)(struct intel_panic *panic);
>   };
>   


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

* Re: [PATCH 5/6] drm/xe/panic: store fb bo in struct intel_panic
  2026-06-02 10:09 ` [PATCH 5/6] drm/xe/panic: store fb bo in struct intel_panic Jani Nikula
@ 2026-06-08  8:22   ` Jocelyn Falempe
  0 siblings, 0 replies; 14+ messages in thread
From: Jocelyn Falempe @ 2026-06-08  8:22 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx, intel-xe

On 02/06/2026 12:09, Jani Nikula wrote:
> Drop the dependency on intel_fb_bo() and intel_fb.h by storing the fb bo
> passed in the setup hook to struct intel_panic.

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>

> 
> Cc: Jocelyn Falempe <jfalempe@redhat.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/xe/display/xe_panic.c | 7 +++++--
>   1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_panic.c b/drivers/gpu/drm/xe/display/xe_panic.c
> index d7f456eec597..4b86760ec00a 100644
> --- a/drivers/gpu/drm/xe/display/xe_panic.c
> +++ b/drivers/gpu/drm/xe/display/xe_panic.c
> @@ -6,7 +6,6 @@
>   #include <drm/intel/display_parent_interface.h>
>   
>   #include "intel_display_types.h"
> -#include "intel_fb.h"
>   #include "xe_bo.h"
>   #include "xe_panic.h"
>   #include "xe_res_cursor.h"
> @@ -16,6 +15,8 @@ struct intel_panic {
>   	struct iosys_map vmap;
>   
>   	int page;
> +
> +	struct xe_bo *bo;
>   };
>   
>   static void xe_panic_kunmap(struct intel_panic *panic)
> @@ -38,7 +39,7 @@ static void xe_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int
>   {
>   	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
>   	struct intel_panic *panic = fb->panic;
> -	struct xe_bo *bo = gem_to_xe_bo(intel_fb_bo(&fb->base));
> +	struct xe_bo *bo = panic->bo;
>   	unsigned int new_page;
>   	unsigned int offset;
>   
> @@ -93,6 +94,8 @@ static int xe_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *
>   		return -ENODEV;
>   
>   	panic->page = -1;
> +	panic->bo = bo;
> +
>   	sb->set_pixel = xe_panic_page_set_pixel;
>   	return 0;
>   }


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

* Re: [PATCH 6/6] drm/{i915,xe}/panic: drop dependency on struct intel_framebuffer
  2026-06-02 10:09 ` [PATCH 6/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer Jani Nikula
@ 2026-06-08  8:23   ` Jocelyn Falempe
  0 siblings, 0 replies; 14+ messages in thread
From: Jocelyn Falempe @ 2026-06-08  8:23 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx, intel-xe

On 02/06/2026 12:09, Jani Nikula wrote:
> Store tiling function pointer in struct intel_panic instead of struct
> intel_framebuffer, and store struct intel_panic pointer instead of
> struct intel_framebuffer pointer in struct drm_scanout_buffer private
> member.
> 
> To make this happen, pass the tiling function pointer to panic setup
> hook, and initialize sb->private in the hook for clarity.
> 
> This allows us to drop the dependency on struct intel_framebuffer from
> i915 and xe panic code.
> 
> Note: It would be less verbose to have a typedef for the tiling function
> pointer. However, there isn't a nice location for it that wouldn't also
> increase header interdependencies.

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>

> 
> Cc: Jocelyn Falempe <jfalempe@redhat.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   .../drm/i915/display/intel_display_types.h    |  1 -
>   drivers/gpu/drm/i915/display/intel_parent.c   |  5 ++--
>   drivers/gpu/drm/i915/display/intel_parent.h   |  3 ++-
>   drivers/gpu/drm/i915/display/intel_plane.c    |  8 +++---
>   drivers/gpu/drm/i915/gem/i915_gem_panic.c     | 26 +++++++++++--------
>   drivers/gpu/drm/xe/display/xe_panic.c         | 15 ++++++-----
>   include/drm/intel/display_parent_interface.h  |  3 ++-
>   7 files changed, 35 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index c21e0c0ef0b1..234fae44fb16 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -150,7 +150,6 @@ struct intel_framebuffer {
>   	unsigned int min_alignment;
>   	unsigned int vtd_guard;
>   
> -	unsigned int (*panic_tiling)(unsigned int x, unsigned int y, unsigned int width);
>   	struct intel_panic *panic;
>   };
>   
> diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c
> index 0b2bc2d38442..a5e41ea66921 100644
> --- a/drivers/gpu/drm/i915/display/intel_parent.c
> +++ b/drivers/gpu/drm/i915/display/intel_parent.c
> @@ -252,9 +252,10 @@ struct intel_panic *intel_parent_panic_alloc(struct intel_display *display)
>   }
>   
>   int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic,
> -			     struct drm_scanout_buffer *sb, struct drm_gem_object *obj)
> +			     struct drm_scanout_buffer *sb, struct drm_gem_object *obj,
> +			     unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width))
>   {
> -	return display->parent->panic->setup(panic, sb, obj);
> +	return display->parent->panic->setup(panic, sb, obj, tiling);
>   }
>   
>   void intel_parent_panic_finish(struct intel_display *display, struct intel_panic *panic)
> diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h
> index 4197d1b1af61..595d4148b8eb 100644
> --- a/drivers/gpu/drm/i915/display/intel_parent.h
> +++ b/drivers/gpu/drm/i915/display/intel_parent.h
> @@ -106,7 +106,8 @@ void intel_parent_overlay_cleanup(struct intel_display *display);
>   /* panic */
>   struct intel_panic *intel_parent_panic_alloc(struct intel_display *display);
>   int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic,
> -			     struct drm_scanout_buffer *sb, struct drm_gem_object *obj);
> +			     struct drm_scanout_buffer *sb, struct drm_gem_object *obj,
> +			     unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width));
>   void intel_parent_panic_finish(struct intel_display *display, struct intel_panic *panic);
>   
>   /* pc8 */
> diff --git a/drivers/gpu/drm/i915/display/intel_plane.c b/drivers/gpu/drm/i915/display/intel_plane.c
> index 75eae994433d..e2745b3be105 100644
> --- a/drivers/gpu/drm/i915/display/intel_plane.c
> +++ b/drivers/gpu/drm/i915/display/intel_plane.c
> @@ -1580,17 +1580,17 @@ static int intel_get_scanout_buffer(struct drm_plane *plane,
>   	if (fb == intel_fbdev_framebuffer(display->fbdev.fbdev)) {
>   		intel_fbdev_get_map(display, &sb->map[0]);
>   	} else {
> +		unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width) = NULL;
>   		int ret;
>   		/* Can't disable tiling if DPT is in use */
>   		if (intel_fb_uses_dpt(&fb->base)) {
>   			if (fb->base.format->cpp[0] != 4)
>   				return -EOPNOTSUPP;
> -			fb->panic_tiling = intel_get_tiling_func(fb->base.modifier);
> -			if (!fb->panic_tiling)
> +			tiling = intel_get_tiling_func(fb->base.modifier);
> +			if (!tiling)
>   				return -EOPNOTSUPP;
>   		}
> -		sb->private = fb;
> -		ret = intel_parent_panic_setup(display, fb->panic, sb, obj);
> +		ret = intel_parent_panic_setup(display, fb->panic, sb, obj, tiling);
>   		if (ret)
>   			return ret;
>   	}
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_panic.c b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> index 001ccfbf7ab7..91389d36f101 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_panic.c
> @@ -5,7 +5,6 @@
>   #include <drm/drm_panic.h>
>   #include <drm/intel/display_parent_interface.h>
>   
> -#include "display/intel_display_types.h"
>   #include "i915_gem_object.h"
>   #include "i915_gem_panic.h"
>   
> @@ -13,6 +12,8 @@ struct intel_panic {
>   	struct page **pages;
>   	int page;
>   	void *vaddr;
> +
> +	unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width);
>   };
>   
>   static void i915_panic_kunmap(struct intel_panic *panic)
> @@ -45,8 +46,8 @@ static struct page **i915_gem_object_panic_pages(struct drm_i915_gem_object *obj
>   static void i915_gem_object_panic_map_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
>   						unsigned int y, u32 color)
>   {
> -	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
> -	unsigned int offset = fb->panic_tiling(sb->width, x, y);
> +	struct intel_panic *panic = sb->private;
> +	unsigned int offset = panic->tiling(sb->width, x, y);
>   
>   	iosys_map_wr(&sb->map[0], offset, u32, color);
>   }
> @@ -59,13 +60,12 @@ static void i915_gem_object_panic_map_set_pixel(struct drm_scanout_buffer *sb, u
>   static void i915_gem_object_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
>   						 unsigned int y, u32 color)
>   {
> +	struct intel_panic *panic = sb->private;
>   	unsigned int new_page;
>   	unsigned int offset;
> -	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
> -	struct intel_panic *panic = fb->panic;
>   
> -	if (fb->panic_tiling)
> -		offset = fb->panic_tiling(sb->width, x, y);
> +	if (panic->tiling)
> +		offset = panic->tiling(sb->width, x, y);
>   	else
>   		offset = y * sb->pitch[0] + x * sb->format->cpp[0];
>   
> @@ -98,14 +98,15 @@ static struct intel_panic *i915_gem_object_alloc_panic(void)
>    * pfn is not supported yet.
>    */
>   static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> -				       struct drm_gem_object *_obj)
> +				       struct drm_gem_object *_obj,
> +				       unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width))
>   {
> -	struct intel_framebuffer *fb = sb->private;
> -	bool panic_tiling = fb->panic_tiling;
>   	enum i915_map_type has_type;
>   	struct drm_i915_gem_object *obj = to_intel_bo(_obj);
>   	void *ptr;
>   
> +	sb->private = panic;
> +
>   	ptr = page_unpack_bits(obj->mm.mapping, &has_type);
>   	if (ptr) {
>   		if (i915_gem_object_has_iomem(obj))
> @@ -113,8 +114,10 @@ static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_sca
>   		else
>   			iosys_map_set_vaddr(&sb->map[0], ptr);
>   
> -		if (panic_tiling)
> +		if (tiling) {
> +			panic->tiling = tiling;
>   			sb->set_pixel = i915_gem_object_panic_map_set_pixel;
> +		}
>   		return 0;
>   	}
>   	if (i915_gem_object_has_struct_page(obj)) {
> @@ -122,6 +125,7 @@ static int i915_gem_object_panic_setup(struct intel_panic *panic, struct drm_sca
>   		if (!panic->pages)
>   			return -ENOMEM;
>   		panic->page = -1;
> +		panic->tiling = tiling;
>   		sb->set_pixel = i915_gem_object_panic_page_set_pixel;
>   		return 0;
>   	}
> diff --git a/drivers/gpu/drm/xe/display/xe_panic.c b/drivers/gpu/drm/xe/display/xe_panic.c
> index 4b86760ec00a..12c6fb99015d 100644
> --- a/drivers/gpu/drm/xe/display/xe_panic.c
> +++ b/drivers/gpu/drm/xe/display/xe_panic.c
> @@ -5,7 +5,6 @@
>   #include <drm/drm_panic.h>
>   #include <drm/intel/display_parent_interface.h>
>   
> -#include "intel_display_types.h"
>   #include "xe_bo.h"
>   #include "xe_panic.h"
>   #include "xe_res_cursor.h"
> @@ -17,6 +16,7 @@ struct intel_panic {
>   	int page;
>   
>   	struct xe_bo *bo;
> +	unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width);
>   };
>   
>   static void xe_panic_kunmap(struct intel_panic *panic)
> @@ -37,14 +37,13 @@ static void xe_panic_kunmap(struct intel_panic *panic)
>   static void xe_panic_page_set_pixel(struct drm_scanout_buffer *sb, unsigned int x,
>   				    unsigned int y, u32 color)
>   {
> -	struct intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
> -	struct intel_panic *panic = fb->panic;
> +	struct intel_panic *panic = sb->private;
>   	struct xe_bo *bo = panic->bo;
>   	unsigned int new_page;
>   	unsigned int offset;
>   
> -	if (fb->panic_tiling)
> -		offset = fb->panic_tiling(sb->width, x, y);
> +	if (panic->tiling)
> +		offset = panic->tiling(sb->width, x, y);
>   	else
>   		offset = y * sb->pitch[0] + x * sb->format->cpp[0];
>   
> @@ -86,7 +85,8 @@ static struct intel_panic *xe_panic_alloc(void)
>   }
>   
>   static int xe_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> -			  struct drm_gem_object *obj)
> +			  struct drm_gem_object *obj,
> +			  unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width))
>   {
>   	struct xe_bo *bo = gem_to_xe_bo(obj);
>   
> @@ -95,8 +95,11 @@ static int xe_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *
>   
>   	panic->page = -1;
>   	panic->bo = bo;
> +	panic->tiling = tiling;
>   
> +	sb->private = panic;
>   	sb->set_pixel = xe_panic_page_set_pixel;
> +
>   	return 0;
>   }
>   
> diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h
> index b0362e231d84..de395df9ca30 100644
> --- a/include/drm/intel/display_parent_interface.h
> +++ b/include/drm/intel/display_parent_interface.h
> @@ -168,7 +168,8 @@ struct intel_display_overlay_interface {
>   struct intel_display_panic_interface {
>   	struct intel_panic *(*alloc)(void);
>   	int (*setup)(struct intel_panic *panic, struct drm_scanout_buffer *sb,
> -		     struct drm_gem_object *obj);
> +		     struct drm_gem_object *obj,
> +		     unsigned int (*tiling)(unsigned int x, unsigned int y, unsigned int width));
>   	void (*finish)(struct intel_panic *panic);
>   };
>   


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

end of thread, other threads:[~2026-06-08  8:23 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-02 10:09 [PATCH 0/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer Jani Nikula
2026-06-02 10:09 ` [PATCH 1/6] drm/i915/panic: split out i915_gem_panic.[ch] Jani Nikula
2026-06-08  8:19   ` Jocelyn Falempe
2026-06-02 10:09 ` [PATCH 2/6] drm/i915/panic: squash i915_panic.c into i915_gem_panic.c Jani Nikula
2026-06-08  8:20   ` Jocelyn Falempe
2026-06-02 10:09 ` [PATCH 3/6] drm/i915/panic: remove the extra layer from panic hooks Jani Nikula
2026-06-08  8:21   ` Jocelyn Falempe
2026-06-02 10:09 ` [PATCH 4/6] drm/{i915,xe}/panic: pass obj to panic setup Jani Nikula
2026-06-08  8:22   ` Jocelyn Falempe
2026-06-02 10:09 ` [PATCH 5/6] drm/xe/panic: store fb bo in struct intel_panic Jani Nikula
2026-06-08  8:22   ` Jocelyn Falempe
2026-06-02 10:09 ` [PATCH 6/6] drm/{i915, xe}/panic: drop dependency on struct intel_framebuffer Jani Nikula
2026-06-08  8:23   ` [PATCH 6/6] drm/{i915,xe}/panic: " Jocelyn Falempe
2026-06-02 10:54 ` ✗ i915.CI.BAT: failure for drm/{i915, xe}/panic: " Patchwork

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