* [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