Signed-off-by: Thomas Zimmermann <[email protected]>
---
drivers/gpu/drm/drm_panic.c | 54 +++++++++++++++-----------
drivers/gpu/drm/tests/drm_panic_test.c | 26 +++++++++----
2 files changed, 49 insertions(+), 31 deletions(-)
diff --git a/drivers/gpu/drm/drm_panic.c b/drivers/gpu/drm/drm_panic.c
index 594235661710..ede620b27515 100644
--- a/drivers/gpu/drm/drm_panic.c
+++ b/drivers/gpu/drm/drm_panic.c
@@ -478,12 +478,8 @@ static void drm_panic_logo_draw(struct drm_scanout_buffer
*sb, struct drm_rect *
fg_color);
}
-static int draw_panic_screen_user(struct drm_scanout_buffer *sb)
+static int draw_panic_screen_user(struct drm_scanout_buffer *sb, u32 fg_color,
u32 bg_color)
{
- u32 fg_color =
drm_draw_color_from_xrgb8888(CONFIG_DRM_PANIC_FOREGROUND_COLOR,
- sb->format->format);
- u32 bg_color =
drm_draw_color_from_xrgb8888(CONFIG_DRM_PANIC_BACKGROUND_COLOR,
- sb->format->format);
const struct font_desc *font = get_default_font(sb->width, sb->height,
NULL, NULL);
struct drm_rect r_screen, r_logo, r_msg;
unsigned int msg_width, msg_height;
@@ -491,6 +487,9 @@ static int draw_panic_screen_user(struct drm_scanout_buffer
*sb)
if (!font)
return -EINVAL;
+ fg_color = drm_draw_color_from_xrgb8888(fg_color, sb->format->format);
+ bg_color = drm_draw_color_from_xrgb8888(bg_color, sb->format->format);
+
r_screen = DRM_RECT_INIT(0, 0, sb->width, sb->height);
drm_panic_logo_rect(&r_logo, font);
@@ -549,12 +548,8 @@ static int draw_line_with_wrap(struct drm_scanout_buffer *sb, const struct font_
* Draw the kmsg buffer to the screen, starting from the youngest message at
the bottom,
* and going up until reaching the top of the screen.
*/
-static int draw_panic_screen_kmsg(struct drm_scanout_buffer *sb)
+static int draw_panic_screen_kmsg(struct drm_scanout_buffer *sb, u32 fg_color,
u32 bg_color)
{
- u32 fg_color =
drm_draw_color_from_xrgb8888(CONFIG_DRM_PANIC_FOREGROUND_COLOR,
- sb->format->format);
- u32 bg_color =
drm_draw_color_from_xrgb8888(CONFIG_DRM_PANIC_BACKGROUND_COLOR,
- sb->format->format);
const struct font_desc *font = get_default_font(sb->width, sb->height,
NULL, NULL);
struct drm_rect r_screen = DRM_RECT_INIT(0, 0, sb->width, sb->height);
struct kmsg_dump_iter iter;
@@ -566,6 +561,9 @@ static int draw_panic_screen_kmsg(struct drm_scanout_buffer
*sb)
if (!font || font->width > sb->width)
return -EINVAL;
+ fg_color = drm_draw_color_from_xrgb8888(fg_color, sb->format->format);
+ bg_color = drm_draw_color_from_xrgb8888(bg_color, sb->format->format);
+
yoffset = sb->height - font->height - (sb->height % font->height) / 2;
/* Fill with the background color, and draw text on top */
@@ -748,12 +746,9 @@ static int drm_panic_get_qr_code(u8 **qr_image)
/*
* Draw the panic message at the center of the screen, with a QR Code
*/
-static int _draw_panic_screen_qr_code(struct drm_scanout_buffer *sb)
+static int _draw_panic_screen_qr_code(struct drm_scanout_buffer *sb,
+ u32 fg_color, u32 bg_color)
{
- u32 fg_color =
drm_draw_color_from_xrgb8888(CONFIG_DRM_PANIC_FOREGROUND_COLOR,
- sb->format->format);
- u32 bg_color =
drm_draw_color_from_xrgb8888(CONFIG_DRM_PANIC_BACKGROUND_COLOR,
- sb->format->format);
const struct font_desc *font = get_default_font(sb->width, sb->height,
NULL, NULL);
struct drm_rect r_screen, r_logo, r_msg, r_qr, r_qr_canvas;
unsigned int max_qr_size, scale;
@@ -766,6 +761,9 @@ static int _draw_panic_screen_qr_code(struct
drm_scanout_buffer *sb)
if (!font)
return -EINVAL;
+ fg_color = drm_draw_color_from_xrgb8888(fg_color, sb->format->format);
+ bg_color = drm_draw_color_from_xrgb8888(bg_color, sb->format->format);
+
r_screen = DRM_RECT_INIT(0, 0, sb->width, sb->height);
drm_panic_logo_rect(&r_logo, font);
@@ -818,10 +816,10 @@ static int _draw_panic_screen_qr_code(struct
drm_scanout_buffer *sb)
return 0;
}
-static int draw_panic_screen_qr_code(struct drm_scanout_buffer *sb)
+static int draw_panic_screen_qr_code(struct drm_scanout_buffer *sb, u32
fg_color, u32 bg_color)
{
- if (_draw_panic_screen_qr_code(sb))
- draw_panic_screen_user(sb);
+ if (_draw_panic_screen_qr_code(sb, fg_color, bg_color))
+ draw_panic_screen_user(sb, fg_color, bg_color);
return 0;
}
#else
@@ -893,22 +891,22 @@ static bool drm_panic_is_format_supported(const struct
drm_format_info *format)
return drm_draw_can_convert_from_xrgb8888(format->format);
}
-static int draw_panic_dispatch(struct drm_scanout_buffer *sb)
+static int draw_panic_dispatch(struct drm_scanout_buffer *sb, u32 fg_color,
u32 bg_color)
{
int ret;
switch (drm_panic_type) {
case DRM_PANIC_TYPE_KMSG:
- ret = draw_panic_screen_kmsg(sb);
+ ret = draw_panic_screen_kmsg(sb, fg_color, bg_color);
break;
#if IS_ENABLED(CONFIG_DRM_PANIC_SCREEN_QR_CODE)
case DRM_PANIC_TYPE_QR:
- ret = draw_panic_screen_qr_code(sb);
+ ret = draw_panic_screen_qr_code(sb, fg_color, bg_color);
break;
#endif
case DRM_PANIC_TYPE_USER:
default:
- ret = draw_panic_screen_user(sb);
+ ret = draw_panic_screen_user(sb, fg_color, bg_color);
}
return ret;
@@ -943,6 +941,16 @@ static void draw_panic_plane(struct drm_plane *plane,
const char *description)
struct drm_scanout_buffer sb = { };
int ret;
unsigned long flags;
+#if defined(CONFIG_DRM_PANIC_FOREGROUND_COLOR)
+ u32 fg_color = CONFIG_DRM_PANIC_FOREGROUND_COLOR;
+#else
+ u32 fg_color = 0x00ffffff;
+#endif
+#if defined(CONFIG_DRM_PANIC_BACKGROUND_COLOR)
+ u32 bg_color = CONFIG_DRM_PANIC_BACKGROUND_COLOR;
+#else
+ u32 bg_color = 0x00000000;
+#endif
if (!drm_panic_trylock(plane->dev, flags))
return;
@@ -958,7 +966,7 @@ static void draw_panic_plane(struct drm_plane *plane, const
char *description)
drm_panic_set_description(description);
- ret = draw_panic_dispatch(&sb);
+ ret = draw_panic_dispatch(&sb, fg_color, bg_color);
if (!ret) {
/*
* Only flush if we have a panic screen to display. Otherwise
diff --git a/drivers/gpu/drm/tests/drm_panic_test.c
b/drivers/gpu/drm/tests/drm_panic_test.c
index fdd77b0cc54c..969a096ec840 100644
--- a/drivers/gpu/drm/tests/drm_panic_test.c
+++ b/drivers/gpu/drm/tests/drm_panic_test.c
@@ -14,17 +14,10 @@
#include <linux/units.h>
#include <linux/vmalloc.h>
-/* Check the framebuffer color only if the panic colors are the default */
-#if (CONFIG_DRM_PANIC_BACKGROUND_COLOR == 0 && \
- CONFIG_DRM_PANIC_FOREGROUND_COLOR == 0xffffff)
-
static void drm_panic_check_color_byte(struct kunit *test, u8 b)
{
KUNIT_EXPECT_TRUE(test, (b == 0 || b == 0xff));
}
-#else
-static void drm_panic_check_color_byte(struct kunit *test, u8 b) {}
-#endif
struct drm_test_mode {
const int width;
@@ -48,10 +41,27 @@ struct drm_test_mode {
.width = w, \
.height = h, \
.format = f, \
- .draw_screen = draw_panic_screen_##name, \
+ .draw_screen = draw_panic_screen_ ## name ## _default, \
.fname = #name, \
}, \
+static int draw_panic_screen_user_default(struct drm_scanout_buffer *sb)
+{
+ return draw_panic_screen_user(sb, 0x00ffffff, 0x00000000);
+}
+
+static int draw_panic_screen_kmsg_default(struct drm_scanout_buffer *sb)
+{
+ return draw_panic_screen_kmsg(sb, 0x00ffffff, 0x00000000);
+}
+
+#if IS_ENABLED(CONFIG_DRM_PANIC_SCREEN_QR_CODE)
+static int draw_panic_screen_qr_code_default(struct drm_scanout_buffer *sb)
+{
+ return draw_panic_screen_qr_code(sb, 0x00ffffff, 0x00000000);
+}
+#endif
+
static const struct drm_test_mode drm_test_modes_cases[] = {
DRM_TEST_MODE_LIST(user)
DRM_TEST_MODE_LIST(kmsg)