On failed output of QR codes and kmsg buffers, fall back to a user message. QR-code output already did this internally, but now formally support it in drm_panic_dispatch(). Streamlines the existing logic.
Also pass module parameter drm_panic_type as a parameter to drm_panic_dispatch(). This simpifies the implementation. It will later allow for moving the function into a helper library. Signed-off-by: Thomas Zimmermann <[email protected]> --- drivers/gpu/drm/drm_panic.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/drm_panic.c b/drivers/gpu/drm/drm_panic.c index 12c39217cbcb..0960750bfce2 100644 --- a/drivers/gpu/drm/drm_panic.c +++ b/drivers/gpu/drm/drm_panic.c @@ -746,9 +746,9 @@ static int drm_panic_get_qr_code(u8 **qr_image, unsigned int qr_version) /* * 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, - u32 fg_color, u32 bg_color, - unsigned int qr_version) +static int draw_panic_screen_qr_code(struct drm_scanout_buffer *sb, + u32 fg_color, u32 bg_color, + unsigned int qr_version) { 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; @@ -816,15 +816,6 @@ static int _draw_panic_screen_qr_code(struct drm_scanout_buffer *sb, drm_panic_blit(sb, &r_qr, qr_image, qr_pitch, scale, fg_color); return 0; } - -static int draw_panic_screen_qr_code(struct drm_scanout_buffer *sb, - u32 fg_color, u32 bg_color, - unsigned int qr_version) -{ - if (_draw_panic_screen_qr_code(sb, fg_color, bg_color, qr_version)) - draw_panic_screen_user(sb, fg_color, bg_color); - return 0; -} #else static void drm_panic_qr_init(void) {}; static void drm_panic_qr_exit(void) {}; @@ -899,13 +890,22 @@ static int draw_panic_dispatch(struct drm_scanout_buffer *sb, enum drm_panic_typ { int ret; +retry: switch (panic_type) { case DRM_PANIC_TYPE_KMSG: ret = draw_panic_screen_kmsg(sb, fg_color, bg_color); + if (ret) { + panic_type = DRM_PANIC_TYPE_USER; + goto retry; + } break; #if IS_ENABLED(CONFIG_DRM_PANIC_SCREEN_QR_CODE) case DRM_PANIC_TYPE_QR: ret = draw_panic_screen_qr_code(sb, fg_color, bg_color, qr_version); + if (ret) { + panic_type = DRM_PANIC_TYPE_USER; + goto retry; + } break; #endif case DRM_PANIC_TYPE_USER: -- 2.55.0
