Hi, On Thu, Aug 21, 2025 at 11:49:07AM +0200, Jocelyn Falempe wrote: > This is a bit hacky, but very handy if you want to customize the > panic screen. > It allows to dump the generated images to the logs, and then a python > script can convert it to .png files. It makes it easy to check how > the panic screen will look on different resolutions, without having > to crash a VM. > To not pollute the logs, it uses a monochrome framebuffer, compress > it with zlib, and base64 encode it. > > Signed-off-by: Jocelyn Falempe <jfale...@redhat.com> > --- > drivers/gpu/drm/Kconfig.debug | 14 ++++ > drivers/gpu/drm/tests/drm_panic_test.c | 111 +++++++++++++++++++++++++ > scripts/kunitpanic2png.py | 53 ++++++++++++ > 3 files changed, 178 insertions(+) > create mode 100755 scripts/kunitpanic2png.py > > diff --git a/drivers/gpu/drm/Kconfig.debug b/drivers/gpu/drm/Kconfig.debug > index 05dc43c0b8c5..d8ae85132d32 100644 > --- a/drivers/gpu/drm/Kconfig.debug > +++ b/drivers/gpu/drm/Kconfig.debug > @@ -84,6 +84,20 @@ config DRM_KUNIT_TEST > > If in doubt, say "N". > > +config DRM_PANIC_KUNIT_TEST_DUMP > + bool "Enable screen dump to logs in KUnit tests for drm_panic" > + default n > + depends on DRM && DRM_PANIC && DRM_KUNIT_TEST > + select ZLIB_DEFLATE > + help > + This allows to dump the panic screen to the KUnit tests logs. > + It's possible with a small python script to write pngs from the logs. > + > + This is only to help developers customizing the drm_panic screen, > + checking the result for different resolutions. > + > + If in doubt, say "N" > + > config DRM_TTM_KUNIT_TEST > tristate "KUnit tests for TTM" if !KUNIT_ALL_TESTS > default n > diff --git a/drivers/gpu/drm/tests/drm_panic_test.c > b/drivers/gpu/drm/tests/drm_panic_test.c > index 46ff3e5e0e5d..8cddb845aea9 100644 > --- a/drivers/gpu/drm/tests/drm_panic_test.c > +++ b/drivers/gpu/drm/tests/drm_panic_test.c > @@ -115,24 +115,135 @@ static void drm_test_panic_screen_user_page(struct > kunit *test) > kfree(pages); > } > > +#ifdef CONFIG_DRM_PANIC_KUNIT_TEST_DUMP > +#include <linux/base64.h> > +#include <linux/delay.h> > +#include <linux/zlib.h> > + > +#define LINE_LEN 128 > + > +#define COMPR_LEVEL 6 > +#define WINDOW_BITS 12 > +#define MEM_LEVEL 4 > + > +static int compress_image(u8 *src, int size, u8 *dst) > +{ > + struct z_stream_s stream; > + > + stream.workspace = kmalloc(zlib_deflate_workspacesize(WINDOW_BITS, > MEM_LEVEL), > + GFP_KERNEL); > + > + if (zlib_deflateInit2(&stream, COMPR_LEVEL, Z_DEFLATED, WINDOW_BITS, > + MEM_LEVEL, Z_DEFAULT_STRATEGY) != Z_OK) > + return -EINVAL; > + > + stream.next_in = src; > + stream.avail_in = size; > + stream.total_in = 0; > + stream.next_out = dst; > + stream.avail_out = size; > + stream.total_out = 0; > + > + if (zlib_deflate(&stream, Z_FINISH) != Z_STREAM_END) > + return -EINVAL; > + > + if (zlib_deflateEnd(&stream) != Z_OK) > + return -EINVAL; > + > + kfree(stream.workspace); > + > + return stream.total_out; > +} > + > +static void dump_image(u8 *fb, unsigned int width, unsigned int height) > +{ > + int len = 0; > + char *dst; > + char *compressed; > + int sent = 0; > + int stride = DIV_ROUND_UP(width, 8); > + int size = stride * height; > + > + compressed = vzalloc(size); > + if (!compressed) > + return; > + len = compress_image(fb, size, compressed); > + if (len < 0) { > + pr_err("Compression failed %d", len); > + return; > + } > + > + dst = vzalloc(4 * DIV_ROUND_UP(len, 3) + 1); > + if (!dst) > + return; > + > + len = base64_encode(compressed, len, dst); > + > + pr_info("KUNIT PANIC IMAGE DUMP START %dx%d", width, height); > + while (len > 0) { > + char save = dst[sent + LINE_LEN]; > + > + dst[sent + LINE_LEN] = 0; > + pr_info("%s", dst + sent); > + dst[sent + LINE_LEN] = save; > + sent += LINE_LEN; > + len -= LINE_LEN; > + } > + pr_info("KUNIT PANIC IMAGE DUMP END");
The kunit test output format is defined, and we should probably use a diagnostic line for this: https://docs.kernel.org/dev-tools/ktap.html#diagnostic-lines We should probably cc the kunit maintainers about this too. Maxime
signature.asc
Description: PGP signature