diff --git a/drivers/gpu/drm/drm_panic.c b/drivers/gpu/drm/drm_panic.c index cc33a2b4bb52..834653d288a9 100644 --- a/drivers/gpu/drm/drm_panic.c +++ b/drivers/gpu/drm/drm_panic.c @@ -480,12 +480,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; @@ -493,6 +489,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); @@ -551,12 +550,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; @@ -568,6 +563,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 */ @@ -742,12 +740,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; @@ -760,6 +755,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); @@ -814,10 +812,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)) - return draw_panic_screen_user(sb); + if (_draw_panic_screen_qr_code(sb, fg_color, bg_color)) + return draw_panic_screen_user(sb, fg_color, bg_color); return 0; } #else @@ -889,22 +887,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; @@ -939,6 +937,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; @@ -954,7 +962,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 #include -/* 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)