Skip to content

Commit 8f4eca6

Browse files
author
Jocelyn Falempe
committed
drm/panic: Simplify logo handling
Move logo rectangle initialisation, and logo drawing in separate functions, so they can be re-used by different panic screens. It prepares the introduction of the QR code panic screen. Signed-off-by: Jocelyn Falempe <[email protected]> Reviewed-by: Thomas Zimmermann <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 4b570ac commit 8f4eca6

File tree

1 file changed

+33
-25
lines changed

1 file changed

+33
-25
lines changed

drivers/gpu/drm/drm_panic.c

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ static struct drm_panic_line panic_msg[] = {
8585
PANIC_LINE(""), /* will be replaced by the panic description */
8686
};
8787

88-
#define PANIC_MSG_LINES ARRAY_SIZE(panic_msg)
88+
static const size_t panic_msg_lines = ARRAY_SIZE(panic_msg);
8989

9090
static const struct drm_panic_line logo_ascii[] = {
9191
PANIC_LINE(" .--. _"),
@@ -97,7 +97,7 @@ static const struct drm_panic_line logo_ascii[] = {
9797
PANIC_LINE(" \\___)=(___/"),
9898
};
9999

100-
#define PANIC_LOGO_LINES ARRAY_SIZE(logo_ascii)
100+
static const size_t logo_ascii_lines = ARRAY_SIZE(logo_ascii);
101101

102102
#if defined(CONFIG_LOGO) && !defined(MODULE)
103103
static const struct linux_logo *logo_mono;
@@ -496,31 +496,44 @@ static void draw_txt_rectangle(struct drm_scanout_buffer *sb,
496496
}
497497
}
498498

499+
static void drm_panic_logo_rect(struct drm_rect *rect, const struct font_desc *font)
500+
{
501+
if (logo_mono) {
502+
drm_rect_init(rect, 0, 0, logo_mono->width, logo_mono->height);
503+
} else {
504+
int logo_width = get_max_line_len(logo_ascii, logo_ascii_lines) * font->width;
505+
506+
drm_rect_init(rect, 0, 0, logo_width, logo_ascii_lines * font->height);
507+
}
508+
}
509+
510+
static void drm_panic_logo_draw(struct drm_scanout_buffer *sb, struct drm_rect *rect,
511+
const struct font_desc *font, u32 fg_color)
512+
{
513+
if (logo_mono)
514+
drm_panic_blit(sb, rect, logo_mono->data,
515+
DIV_ROUND_UP(drm_rect_width(rect), 8), 1, fg_color);
516+
else
517+
draw_txt_rectangle(sb, font, logo_ascii, logo_ascii_lines, false, rect,
518+
fg_color);
519+
}
520+
499521
static void draw_panic_static_user(struct drm_scanout_buffer *sb)
500522
{
501523
u32 fg_color = convert_from_xrgb8888(CONFIG_DRM_PANIC_FOREGROUND_COLOR, sb->format->format);
502524
u32 bg_color = convert_from_xrgb8888(CONFIG_DRM_PANIC_BACKGROUND_COLOR, sb->format->format);
503525
const struct font_desc *font = get_default_font(sb->width, sb->height, NULL, NULL);
504526
struct drm_rect r_screen, r_logo, r_msg;
505-
unsigned int logo_width, logo_height;
506527
unsigned int msg_width, msg_height;
507528

508529
if (!font)
509530
return;
510531

511532
r_screen = DRM_RECT_INIT(0, 0, sb->width, sb->height);
533+
drm_panic_logo_rect(&r_logo, font);
512534

513-
if (logo_mono) {
514-
logo_width = logo_mono->width;
515-
logo_height = logo_mono->height;
516-
} else {
517-
logo_width = get_max_line_len(logo_ascii, PANIC_LOGO_LINES) * font->width;
518-
logo_height = PANIC_LOGO_LINES * font->height;
519-
}
520-
r_logo = DRM_RECT_INIT(0, 0, logo_width, logo_height);
521-
522-
msg_width = min(get_max_line_len(panic_msg, PANIC_MSG_LINES) * font->width, sb->width);
523-
msg_height = min(PANIC_MSG_LINES * font->height, sb->height);
535+
msg_width = min(get_max_line_len(panic_msg, panic_msg_lines) * font->width, sb->width);
536+
msg_height = min(panic_msg_lines * font->height, sb->height);
524537
r_msg = DRM_RECT_INIT(0, 0, msg_width, msg_height);
525538

526539
/* Center the panic message */
@@ -529,15 +542,10 @@ static void draw_panic_static_user(struct drm_scanout_buffer *sb)
529542
/* Fill with the background color, and draw text on top */
530543
drm_panic_fill(sb, &r_screen, bg_color);
531544

532-
if (!drm_rect_overlap(&r_logo, &r_msg)) {
533-
if (logo_mono)
534-
drm_panic_blit(sb, &r_logo, logo_mono->data, DIV_ROUND_UP(logo_width, 8),
535-
fg_color);
536-
else
537-
draw_txt_rectangle(sb, font, logo_ascii, PANIC_LOGO_LINES, false, &r_logo,
538-
fg_color);
539-
}
540-
draw_txt_rectangle(sb, font, panic_msg, PANIC_MSG_LINES, true, &r_msg, fg_color);
545+
if (!drm_rect_overlap(&r_logo, &r_msg))
546+
drm_panic_logo_draw(sb, &r_logo, font, fg_color);
547+
548+
draw_txt_rectangle(sb, font, panic_msg, panic_msg_lines, true, &r_msg, fg_color);
541549
}
542550

543551
/*
@@ -647,7 +655,7 @@ static void drm_panic_set_description(const char *description)
647655
u32 len;
648656

649657
if (description) {
650-
struct drm_panic_line *desc_line = &panic_msg[PANIC_MSG_LINES - 1];
658+
struct drm_panic_line *desc_line = &panic_msg[panic_msg_lines - 1];
651659

652660
desc_line->txt = description;
653661
len = strlen(description);
@@ -660,7 +668,7 @@ static void drm_panic_set_description(const char *description)
660668

661669
static void drm_panic_clear_description(void)
662670
{
663-
struct drm_panic_line *desc_line = &panic_msg[PANIC_MSG_LINES - 1];
671+
struct drm_panic_line *desc_line = &panic_msg[panic_msg_lines - 1];
664672

665673
desc_line->len = 0;
666674
desc_line->txt = NULL;

0 commit comments

Comments
 (0)