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).

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
 
-- 
2.55.0

Reply via email to