drm/mgag200: Add drm_panic support
authorJocelyn Falempe <jfalempe@redhat.com>
Tue, 9 Apr 2024 16:30:46 +0000 (18:30 +0200)
committerJocelyn Falempe <jfalempe@redhat.com>
Mon, 15 Apr 2024 14:13:50 +0000 (16:13 +0200)
Add support for the drm_panic module, which displays a message to
the screen when a kernel panic occurs.

v5:
 * Also check that the plane is visible and primary. (Thomas Zimmermann)

v7:
 * use drm_for_each_primary_visible_plane()

v8:
 * Replace get_scanout_buffer() logic with drm_panic_set_buffer()
   (Thomas Zimmermann)

v9:
 * Revert to using get_scanout_buffer() (Sima)
 * move get_scanout_buffer() to plane helper functions (Thomas Zimmermann)

v12:
 * Use array for map and pitch in struct drm_scanout_buffer
   to support multi-planar format later. (Thomas Zimmermann)

Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20240409163432.352518-8-jfalempe@redhat.com
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/mgag200/mgag200_drv.h
drivers/gpu/drm/mgag200/mgag200_mode.c

index 765e49fd891112705e23e025b300824c3141c083..58a0e62eaf183c924b251e411e3f4ff93de9fabb 100644 (file)
@@ -366,6 +366,7 @@ struct drm_crtc_state;
 struct drm_display_mode;
 struct drm_plane;
 struct drm_atomic_state;
+struct drm_scanout_buffer;
 
 extern const uint32_t mgag200_primary_plane_formats[];
 extern const size_t   mgag200_primary_plane_formats_size;
@@ -379,12 +380,16 @@ void mgag200_primary_plane_helper_atomic_enable(struct drm_plane *plane,
                                                struct drm_atomic_state *state);
 void mgag200_primary_plane_helper_atomic_disable(struct drm_plane *plane,
                                                 struct drm_atomic_state *old_state);
+int mgag200_primary_plane_helper_get_scanout_buffer(struct drm_plane *plane,
+                                                   struct drm_scanout_buffer *sb);
+
 #define MGAG200_PRIMARY_PLANE_HELPER_FUNCS \
        DRM_GEM_SHADOW_PLANE_HELPER_FUNCS, \
        .atomic_check = mgag200_primary_plane_helper_atomic_check, \
        .atomic_update = mgag200_primary_plane_helper_atomic_update, \
        .atomic_enable = mgag200_primary_plane_helper_atomic_enable, \
-       .atomic_disable = mgag200_primary_plane_helper_atomic_disable
+       .atomic_disable = mgag200_primary_plane_helper_atomic_disable, \
+       .get_scanout_buffer = mgag200_primary_plane_helper_get_scanout_buffer
 
 #define MGAG200_PRIMARY_PLANE_FUNCS \
        .update_plane = drm_atomic_helper_update_plane, \
index e17cb4c5f7741c619e4da79fb4f0a14b44d4381f..fc54851d3384d17c31f1482331a2e4c2893dd457 100644 (file)
@@ -21,6 +21,7 @@
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_panic.h>
 #include <drm/drm_print.h>
 
 #include "mgag200_drv.h"
@@ -546,6 +547,23 @@ void mgag200_primary_plane_helper_atomic_disable(struct drm_plane *plane,
        msleep(20);
 }
 
+int mgag200_primary_plane_helper_get_scanout_buffer(struct drm_plane *plane,
+                                                   struct drm_scanout_buffer *sb)
+{
+       struct mga_device *mdev = to_mga_device(plane->dev);
+       struct iosys_map map = IOSYS_MAP_INIT_VADDR_IOMEM(mdev->vram);
+
+       if (plane->state && plane->state->fb) {
+               sb->format = plane->state->fb->format;
+               sb->width = plane->state->fb->width;
+               sb->height = plane->state->fb->height;
+               sb->pitch[0] = plane->state->fb->pitches[0];
+               sb->map[0] = map;
+               return 0;
+       }
+       return -ENODEV;
+}
+
 /*
  * CRTC
  */