Move the panic handling to the display parent interface, making display
more independent of i915 and xe driver implementations.

Signed-off-by: Jani Nikula <[email protected]>
---
 drivers/gpu/drm/i915/display/i9xx_plane.c        |  1 -
 drivers/gpu/drm/i915/display/intel_fb.c          |  3 +--
 drivers/gpu/drm/i915/display/intel_panic.h       | 14 --------------
 drivers/gpu/drm/i915/display/intel_parent.c      | 15 +++++++++++++++
 drivers/gpu/drm/i915/display/intel_parent.h      |  6 ++++++
 drivers/gpu/drm/i915/display/intel_plane.c       |  5 ++---
 .../gpu/drm/i915/display/skl_universal_plane.c   |  1 -
 drivers/gpu/drm/i915/i915_driver.c               |  2 ++
 drivers/gpu/drm/i915/i915_panic.c                | 16 ++++++++++++----
 drivers/gpu/drm/i915/i915_panic.h                |  9 +++++++++
 drivers/gpu/drm/xe/display/xe_display.c          |  2 ++
 drivers/gpu/drm/xe/display/xe_panic.c            | 16 +++++++++-------
 drivers/gpu/drm/xe/display/xe_panic.h            |  9 +++++++++
 include/drm/intel/display_parent_interface.h     | 11 +++++++++++
 14 files changed, 78 insertions(+), 32 deletions(-)
 delete mode 100644 drivers/gpu/drm/i915/display/intel_panic.h
 create mode 100644 drivers/gpu/drm/i915/i915_panic.h
 create mode 100644 drivers/gpu/drm/xe/display/xe_panic.h

diff --git a/drivers/gpu/drm/i915/display/i9xx_plane.c 
b/drivers/gpu/drm/i915/display/i9xx_plane.c
index 45730ae05591..b1fecf178906 100644
--- a/drivers/gpu/drm/i915/display/i9xx_plane.c
+++ b/drivers/gpu/drm/i915/display/i9xx_plane.c
@@ -22,7 +22,6 @@
 #include "intel_fb.h"
 #include "intel_fbc.h"
 #include "intel_frontbuffer.h"
-#include "intel_panic.h"
 #include "intel_plane.h"
 #include "intel_sprite.h"
 
diff --git a/drivers/gpu/drm/i915/display/intel_fb.c 
b/drivers/gpu/drm/i915/display/intel_fb.c
index 5b8e02ca2faf..b9bd9b6dfe94 100644
--- a/drivers/gpu/drm/i915/display/intel_fb.c
+++ b/drivers/gpu/drm/i915/display/intel_fb.c
@@ -20,7 +20,6 @@
 #include "intel_fb.h"
 #include "intel_fb_bo.h"
 #include "intel_frontbuffer.h"
-#include "intel_panic.h"
 #include "intel_parent.h"
 #include "intel_plane.h"
 
@@ -2217,7 +2216,7 @@ int intel_framebuffer_init(struct intel_framebuffer 
*intel_fb,
        int ret;
        int i;
 
-       intel_fb->panic = intel_panic_alloc();
+       intel_fb->panic = intel_parent_panic_alloc(display);
        if (!intel_fb->panic)
                return -ENOMEM;
 
diff --git a/drivers/gpu/drm/i915/display/intel_panic.h 
b/drivers/gpu/drm/i915/display/intel_panic.h
deleted file mode 100644
index afb472e924aa..000000000000
--- a/drivers/gpu/drm/i915/display/intel_panic.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/* Copyright © 2025 Intel Corporation */
-
-#ifndef __INTEL_PANIC_H__
-#define __INTEL_PANIC_H__
-
-struct drm_scanout_buffer;
-struct intel_panic;
-
-struct intel_panic *intel_panic_alloc(void);
-int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer 
*sb);
-void intel_panic_finish(struct intel_panic *panic);
-
-#endif /* __INTEL_PANIC_H__ */
diff --git a/drivers/gpu/drm/i915/display/intel_parent.c 
b/drivers/gpu/drm/i915/display/intel_parent.c
index 1d7bee7d2ccd..d1c2194767e7 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.c
+++ b/drivers/gpu/drm/i915/display/intel_parent.c
@@ -47,6 +47,21 @@ void intel_parent_hdcp_gsc_context_free(struct intel_display 
*display,
        display->parent->hdcp->gsc_context_free(gsc_context);
 }
 
+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)
+{
+       return display->parent->panic->setup(panic, sb);
+}
+
+void intel_parent_panic_finish(struct intel_display *display, struct 
intel_panic *panic)
+{
+       display->parent->panic->finish(panic);
+}
+
 bool intel_parent_irq_enabled(struct intel_display *display)
 {
        return display->parent->irq->enabled(display->drm);
diff --git a/drivers/gpu/drm/i915/display/intel_parent.h 
b/drivers/gpu/drm/i915/display/intel_parent.h
index 1bb584d850e5..8cd811d14fb1 100644
--- a/drivers/gpu/drm/i915/display/intel_parent.h
+++ b/drivers/gpu/drm/i915/display/intel_parent.h
@@ -7,8 +7,10 @@
 #include <linux/types.h>
 
 struct dma_fence;
+struct drm_scanout_buffer;
 struct intel_display;
 struct intel_hdcp_gsc_context;
+struct intel_panic;
 struct intel_stolen_node;
 
 ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display,
@@ -23,6 +25,10 @@ void intel_parent_hdcp_gsc_context_free(struct intel_display 
*display,
 bool intel_parent_irq_enabled(struct intel_display *display);
 void intel_parent_irq_synchronize(struct intel_display *display);
 
+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);
+void intel_parent_panic_finish(struct intel_display *display, struct 
intel_panic *panic);
+
 bool intel_parent_rps_available(struct intel_display *display);
 void intel_parent_rps_boost_if_not_started(struct intel_display *display, 
struct dma_fence *fence);
 void intel_parent_rps_mark_interactive(struct intel_display *display, bool 
interactive);
diff --git a/drivers/gpu/drm/i915/display/intel_plane.c 
b/drivers/gpu/drm/i915/display/intel_plane.c
index ca9449589161..3dc2ed52147f 100644
--- a/drivers/gpu/drm/i915/display/intel_plane.c
+++ b/drivers/gpu/drm/i915/display/intel_plane.c
@@ -55,7 +55,6 @@
 #include "intel_fb.h"
 #include "intel_fb_pin.h"
 #include "intel_fbdev.h"
-#include "intel_panic.h"
 #include "intel_parent.h"
 #include "intel_plane.h"
 #include "intel_psr.h"
@@ -1344,7 +1343,7 @@ static void intel_panic_flush(struct drm_plane *_plane)
        const struct intel_crtc_state *crtc_state = 
to_intel_crtc_state(crtc->base.state);
        const struct intel_framebuffer *fb = 
to_intel_framebuffer(plane_state->hw.fb);
 
-       intel_panic_finish(fb->panic);
+       intel_parent_panic_finish(display, fb->panic);
 
        if (crtc_state->enable_psr2_sel_fetch) {
                /* Force a full update for psr2 */
@@ -1425,7 +1424,7 @@ static int intel_get_scanout_buffer(struct drm_plane 
*plane,
                                return -EOPNOTSUPP;
                }
                sb->private = fb;
-               ret = intel_panic_setup(fb->panic, sb);
+               ret = intel_parent_panic_setup(display, fb->panic, sb);
                if (ret)
                        return ret;
        }
diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c 
b/drivers/gpu/drm/i915/display/skl_universal_plane.c
index 40148d225410..b3d41705448a 100644
--- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
+++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
@@ -21,7 +21,6 @@
 #include "intel_fb.h"
 #include "intel_fbc.h"
 #include "intel_frontbuffer.h"
-#include "intel_panic.h"
 #include "intel_parent.h"
 #include "intel_plane.h"
 #include "intel_psr.h"
diff --git a/drivers/gpu/drm/i915/i915_driver.c 
b/drivers/gpu/drm/i915/i915_driver.c
index 0300a1df8bd2..a341e2d46551 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -102,6 +102,7 @@
 #include "i915_ioctl.h"
 #include "i915_irq.h"
 #include "i915_memcpy.h"
+#include "i915_panic.h"
 #include "i915_perf.h"
 #include "i915_query.h"
 #include "i915_reg.h"
@@ -768,6 +769,7 @@ static bool has_auxccs(struct drm_device *drm)
 
 static const struct intel_display_parent_interface parent = {
        .hdcp = &i915_display_hdcp_interface,
+       .panic = &i915_display_panic_interface,
        .rpm = &i915_display_rpm_interface,
        .irq = &i915_display_irq_interface,
        .rps = &i915_display_rps_interface,
diff --git a/drivers/gpu/drm/i915/i915_panic.c 
b/drivers/gpu/drm/i915/i915_panic.c
index 028ff83b2519..728be077e8e8 100644
--- a/drivers/gpu/drm/i915/i915_panic.c
+++ b/drivers/gpu/drm/i915/i915_panic.c
@@ -2,18 +2,20 @@
 /* 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 "display/intel_panic.h"
 #include "gem/i915_gem_object.h"
 
-struct intel_panic *intel_panic_alloc(void)
+#include "i915_panic.h"
+
+static struct intel_panic *intel_panic_alloc(void)
 {
        return i915_gem_object_alloc_panic();
 }
 
-int intel_panic_setup(struct intel_panic *panic, struct drm_scanout_buffer *sb)
+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);
@@ -21,7 +23,13 @@ int intel_panic_setup(struct intel_panic *panic, struct 
drm_scanout_buffer *sb)
        return i915_gem_object_panic_setup(panic, sb, obj, fb->panic_tiling);
 }
 
-void intel_panic_finish(struct intel_panic *panic)
+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
new file mode 100644
index 000000000000..743d8c861c42
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_panic.h
@@ -0,0 +1,9 @@
+/* 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__ */
diff --git a/drivers/gpu/drm/xe/display/xe_display.c 
b/drivers/gpu/drm/xe/display/xe_display.c
index 9fb5c2f3ddd8..56796cedbd06 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -38,6 +38,7 @@
 #include "xe_display_rpm.h"
 #include "xe_hdcp_gsc.h"
 #include "xe_module.h"
+#include "xe_panic.h"
 #include "xe_stolen.h"
 
 /* Ensure drm and display members are placed properly. */
@@ -537,6 +538,7 @@ static const struct intel_display_irq_interface 
xe_display_irq_interface = {
 
 static const struct intel_display_parent_interface parent = {
        .hdcp = &xe_display_hdcp_interface,
+       .panic = &xe_display_panic_interface,
        .rpm = &xe_display_rpm_interface,
        .irq = &xe_display_irq_interface,
        .stolen = &xe_display_stolen_interface,
diff --git a/drivers/gpu/drm/xe/display/xe_panic.c 
b/drivers/gpu/drm/xe/display/xe_panic.c
index df663286092a..e078494dc8ba 100644
--- a/drivers/gpu/drm/xe/display/xe_panic.c
+++ b/drivers/gpu/drm/xe/display/xe_panic.c
@@ -3,11 +3,12 @@
 
 #include <drm/drm_cache.h>
 #include <drm/drm_panic.h>
+#include <drm/intel/display_parent_interface.h>
 
 #include "intel_display_types.h"
 #include "intel_fb.h"
-#include "intel_panic.h"
 #include "xe_bo.h"
+#include "xe_panic.h"
 #include "xe_res_cursor.h"
 
 struct intel_panic {
@@ -74,7 +75,7 @@ static void xe_panic_page_set_pixel(struct drm_scanout_buffer 
*sb, unsigned int
                iosys_map_wr(&panic->vmap, offset, u32, color);
 }
 
-struct intel_panic *intel_panic_alloc(void)
+static struct intel_panic *xe_panic_alloc(void)
 {
        struct intel_panic *panic;
 
@@ -83,7 +84,7 @@ struct intel_panic *intel_panic_alloc(void)
        return panic;
 }
 
-int intel_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 intel_framebuffer *fb = (struct intel_framebuffer *)sb->private;
        struct xe_bo *bo = gem_to_xe_bo(intel_fb_bo(&fb->base));
@@ -96,7 +97,8 @@ int intel_panic_setup(struct intel_panic *panic, struct 
drm_scanout_buffer *sb)
        return 0;
 }
 
-void intel_panic_finish(struct intel_panic *panic)
-{
-       xe_panic_kunmap(panic);
-}
+const struct intel_display_panic_interface xe_display_panic_interface = {
+       .alloc = xe_panic_alloc,
+       .setup = xe_panic_setup,
+       .finish = xe_panic_kunmap,
+};
diff --git a/drivers/gpu/drm/xe/display/xe_panic.h 
b/drivers/gpu/drm/xe/display/xe_panic.h
new file mode 100644
index 000000000000..3054b511011b
--- /dev/null
+++ b/drivers/gpu/drm/xe/display/xe_panic.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: MIT */
+/* Copyright © 2025 Intel Corporation */
+
+#ifndef __XE_PANIC_H__
+#define __XE_PANIC_H__
+
+extern const struct intel_display_panic_interface xe_display_panic_interface;
+
+#endif
diff --git a/include/drm/intel/display_parent_interface.h 
b/include/drm/intel/display_parent_interface.h
index 9733c508ad4c..477ee9e735f9 100644
--- a/include/drm/intel/display_parent_interface.h
+++ b/include/drm/intel/display_parent_interface.h
@@ -8,7 +8,9 @@
 
 struct dma_fence;
 struct drm_device;
+struct drm_scanout_buffer;
 struct intel_hdcp_gsc_context;
+struct intel_panic;
 struct intel_stolen_node;
 struct ref_tracker;
 
@@ -42,6 +44,12 @@ struct intel_display_irq_interface {
        void (*synchronize)(struct drm_device *drm);
 };
 
+struct intel_display_panic_interface {
+       struct intel_panic *(*alloc)(void);
+       int (*setup)(struct intel_panic *panic, struct drm_scanout_buffer *sb);
+       void (*finish)(struct intel_panic *panic);
+};
+
 struct intel_display_rps_interface {
        void (*boost_if_not_started)(struct dma_fence *fence);
        void (*mark_interactive)(struct drm_device *drm, bool interactive);
@@ -86,6 +94,9 @@ struct intel_display_parent_interface {
        /** @irq: IRQ interface */
        const struct intel_display_irq_interface *irq;
 
+       /** @panic: Panic interface */
+       const struct intel_display_panic_interface *panic;
+
        /** @rpm: RPS interface. Optional. */
        const struct intel_display_rps_interface *rps;
 
-- 
2.47.3

Reply via email to