On 18/08/2026 14:28, Thomas Zimmermann wrote:
Set the panic type and QR version in draw_panic_plane() as a single
point of truth. Pass the values into the individual drawing functions.

In the test case, always create a QR code with version 40 (i.e., the
highest supported version).

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <[email protected]>


Signed-off-by: Thomas Zimmermann <[email protected]>
---
  drivers/gpu/drm/drm_panic.c            | 39 ++++++++++++++++----------
  drivers/gpu/drm/tests/drm_panic_test.c |  2 +-
  2 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/drm_panic.c b/drivers/gpu/drm/drm_panic.c
index ede620b27515..12c39217cbcb 100644
--- a/drivers/gpu/drm/drm_panic.c
+++ b/drivers/gpu/drm/drm_panic.c
@@ -657,7 +657,7 @@ static void drm_panic_qr_exit(void)
        stream.workspace = NULL;
  }
-static int drm_panic_get_qr_code_url(u8 **qr_image)
+static int drm_panic_get_qr_code_url(u8 **qr_image, unsigned int qr_version)
  {
        struct kmsg_dump_iter iter;
        char url[256];
@@ -672,7 +672,7 @@ static int drm_panic_get_qr_code_url(u8 **qr_image)
                return -EINVAL;
        url_len = ret;
- max_qr_data_size = drm_panic_qr_max_data_size(panic_qr_version, url_len);
+       max_qr_data_size = drm_panic_qr_max_data_size(qr_version, url_len);
        max_kmsg_size = min(MAX_ZLIB_RATIO * max_qr_data_size, sizeof(qrbuf1));
/* get kmsg to buffer 1 */
@@ -718,11 +718,11 @@ static int drm_panic_get_qr_code_url(u8 **qr_image)
                                     qrbuf1, sizeof(qrbuf1));
  }
-static int drm_panic_get_qr_code_raw(u8 **qr_image)
+static int drm_panic_get_qr_code_raw(u8 **qr_image, unsigned int qr_version)
  {
        struct kmsg_dump_iter iter;
        size_t kmsg_len;
-       size_t max_kmsg_size = min(drm_panic_qr_max_data_size(panic_qr_version, 
0),
+       size_t max_kmsg_size = min(drm_panic_qr_max_data_size(qr_version, 0),
                                   sizeof(qrbuf1));
kmsg_dump_rewind(&iter);
@@ -735,19 +735,20 @@ static int drm_panic_get_qr_code_raw(u8 **qr_image)
                                     qrbuf2, sizeof(qrbuf2));
  }
-static int drm_panic_get_qr_code(u8 **qr_image)
+static int drm_panic_get_qr_code(u8 **qr_image, unsigned int qr_version)
  {
        if (strlen(CONFIG_DRM_PANIC_SCREEN_QR_CODE_URL) > 0)
-               return drm_panic_get_qr_code_url(qr_image);
+               return drm_panic_get_qr_code_url(qr_image, qr_version);
        else
-               return drm_panic_get_qr_code_raw(qr_image);
+               return drm_panic_get_qr_code_raw(qr_image, 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)
+                                     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;
@@ -774,7 +775,7 @@ static int _draw_panic_screen_qr_code(struct 
drm_scanout_buffer *sb,
max_qr_size = min(3 * sb->width / 4, 3 * sb->height / 4); - qr_width = drm_panic_get_qr_code(&qr_image);
+       qr_width = drm_panic_get_qr_code(&qr_image, qr_version);
        if (qr_width <= 0)
                return -ENOSPC;
@@ -816,9 +817,11 @@ 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, u32 fg_color, u32 bg_color)
+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))
+       if (_draw_panic_screen_qr_code(sb, fg_color, bg_color, qr_version))
                draw_panic_screen_user(sb, fg_color, bg_color);
        return 0;
  }
@@ -891,17 +894,18 @@ 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, u32 fg_color, u32 bg_color)
+static int draw_panic_dispatch(struct drm_scanout_buffer *sb, enum 
drm_panic_type panic_type,
+                              u32 fg_color, u32 bg_color, unsigned int 
qr_version)
  {
        int ret;
- switch (drm_panic_type) {
+       switch (panic_type) {
        case DRM_PANIC_TYPE_KMSG:
                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, fg_color, bg_color);
+               ret = draw_panic_screen_qr_code(sb, fg_color, bg_color, 
qr_version);
                break;
  #endif
        case DRM_PANIC_TYPE_USER:
@@ -951,6 +955,11 @@ static void draw_panic_plane(struct drm_plane *plane, 
const char *description)
  #else
        u32 bg_color = 0x00000000;
  #endif
+#if IS_ENABLED(CONFIG_DRM_PANIC_SCREEN_QR_CODE)
+       unsigned int qr_version = panic_qr_version;
+#else
+       unsigned int qr_version = 0;
+#endif
if (!drm_panic_trylock(plane->dev, flags))
                return;
@@ -966,7 +975,7 @@ static void draw_panic_plane(struct drm_plane *plane, const 
char *description)
drm_panic_set_description(description); - ret = draw_panic_dispatch(&sb, fg_color, bg_color);
+       ret = draw_panic_dispatch(&sb, drm_panic_type, fg_color, bg_color, 
qr_version);
        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 969a096ec840..196496238d23 100644
--- a/drivers/gpu/drm/tests/drm_panic_test.c
+++ b/drivers/gpu/drm/tests/drm_panic_test.c
@@ -58,7 +58,7 @@ static int draw_panic_screen_kmsg_default(struct 
drm_scanout_buffer *sb)
  #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);
+       return draw_panic_screen_qr_code(sb, 0x00ffffff, 0x00000000, 40);
  }
  #endif


Reply via email to