From nobody Fri Oct 3 02:03:25 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BC6B92EF675 for ; Mon, 8 Sep 2025 09:03:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757322241; cv=none; b=jR9Leq4Qae+Akh8WmByXT65ADhDE98p9z+WEkP0yf+0dVSepqVccS7CNWEO/93gOTyUbrz9mm3pJtzBUeFB7AcSXrvSQSGshjeAAWK+KOqwKmjN18RBxMye6A8It3OLOUSoYf73BWtyKssOi5kepemqSqPOeIiTRVFcTOLV9jL0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757322241; c=relaxed/simple; bh=vPVI36ukM/Jq0am/HgD0hAXC6elfkRj6PkYOhAkPO4s=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=A7XydlZXg2K/jWvUFFTClerKglHKAzZNWg5im9EAiF7QVifetSJqlKUZ/ztV97Gb1bGvUZu3nbHgMqn7zH4Y5htFi+rHeHFkkUbw40UJA5+siqlauA/57+N/ZryAC+b4MPqWYjLlfCWGkgXD6cWMw/NS9pvvLvrNqO6rMD3mQgY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=S9LLqOB6; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="S9LLqOB6" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1757322238; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bZiAhmyFaEKVq6s3K9ByIEa1k2zTn1HXQWc3GKVxQxE=; b=S9LLqOB6V8f3SQUBR2TIxqVZJx/xDx5U1N6iZQM8eWpP5ZXQUoX63QLVDIRaY8G7KujoNc 8t3SdhroOys5BcNiqB9zGlpm1P+aSrJzKenGGbZU9n0XsTIYDM+bDbdtJUGxP0w3H291ac AIabZlMxQI6r/BuvkUTWepPaPjKH5K0= Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-92-cOzpdao8PPSI8vZdUIlqNA-1; Mon, 08 Sep 2025 05:03:55 -0400 X-MC-Unique: cOzpdao8PPSI8vZdUIlqNA-1 X-Mimecast-MFC-AGG-ID: cOzpdao8PPSI8vZdUIlqNA_1757322233 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 63C411800343; Mon, 8 Sep 2025 09:03:53 +0000 (UTC) Received: from hydra.redhat.com (unknown [10.44.33.69]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 565781800452; Mon, 8 Sep 2025 09:03:50 +0000 (UTC) From: Jocelyn Falempe To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jocelyn Falempe , Javier Martinez Canillas , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: [PATCH v2 1/3] drm/panic: Rename draw_panic_static_* to draw_panic_screen_* Date: Mon, 8 Sep 2025 11:00:29 +0200 Message-ID: <20250908090341.762049-2-jfalempe@redhat.com> In-Reply-To: <20250908090341.762049-1-jfalempe@redhat.com> References: <20250908090341.762049-1-jfalempe@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" I called them "static" because the panic screen is drawn only once, but this can be confused with the static meaning in C. Also remove some unnecessary braces in draw_panic_dispatch(). No functionnal change. Signed-off-by: Jocelyn Falempe --- drivers/gpu/drm/drm_panic.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/drm_panic.c b/drivers/gpu/drm/drm_panic.c index 1d6312fa1429..1e06e3a18d09 100644 --- a/drivers/gpu/drm/drm_panic.c +++ b/drivers/gpu/drm/drm_panic.c @@ -437,7 +437,7 @@ static void drm_panic_logo_draw(struct drm_scanout_buff= er *sb, struct drm_rect * fg_color); } =20 -static void draw_panic_static_user(struct drm_scanout_buffer *sb) +static void draw_panic_screen_user(struct drm_scanout_buffer *sb) { u32 fg_color =3D drm_draw_color_from_xrgb8888(CONFIG_DRM_PANIC_FOREGROUND= _COLOR, sb->format->format); @@ -506,7 +506,7 @@ static int draw_line_with_wrap(struct drm_scanout_buffe= r *sb, const struct font_ * Draw the kmsg buffer to the screen, starting from the youngest message = at the bottom, * and going up until reaching the top of the screen. */ -static void draw_panic_static_kmsg(struct drm_scanout_buffer *sb) +static void draw_panic_screen_kmsg(struct drm_scanout_buffer *sb) { u32 fg_color =3D drm_draw_color_from_xrgb8888(CONFIG_DRM_PANIC_FOREGROUND= _COLOR, sb->format->format); @@ -694,7 +694,7 @@ static int drm_panic_get_qr_code(u8 **qr_image) /* * Draw the panic message at the center of the screen, with a QR Code */ -static int _draw_panic_static_qr_code(struct drm_scanout_buffer *sb) +static int _draw_panic_screen_qr_code(struct drm_scanout_buffer *sb) { u32 fg_color =3D drm_draw_color_from_xrgb8888(CONFIG_DRM_PANIC_FOREGROUND= _COLOR, sb->format->format); @@ -759,15 +759,15 @@ static int _draw_panic_static_qr_code(struct drm_scan= out_buffer *sb) return 0; } =20 -static void draw_panic_static_qr_code(struct drm_scanout_buffer *sb) +static void draw_panic_screen_qr_code(struct drm_scanout_buffer *sb) { - if (_draw_panic_static_qr_code(sb)) - draw_panic_static_user(sb); + if (_draw_panic_screen_qr_code(sb)) + draw_panic_screen_user(sb); } #else -static void draw_panic_static_qr_code(struct drm_scanout_buffer *sb) +static void draw_panic_screen_qr_code(struct drm_scanout_buffer *sb) { - draw_panic_static_user(sb); + draw_panic_screen_user(sb); } =20 static void drm_panic_qr_init(void) {}; @@ -790,13 +790,12 @@ static bool drm_panic_is_format_supported(const struc= t drm_format_info *format) =20 static void draw_panic_dispatch(struct drm_scanout_buffer *sb) { - if (!strcmp(drm_panic_screen, "kmsg")) { - draw_panic_static_kmsg(sb); - } else if (!strcmp(drm_panic_screen, "qr_code")) { - draw_panic_static_qr_code(sb); - } else { - draw_panic_static_user(sb); - } + if (!strcmp(drm_panic_screen, "kmsg")) + draw_panic_screen_kmsg(sb); + else if (!strcmp(drm_panic_screen, "qr_code")) + draw_panic_screen_qr_code(sb); + else + draw_panic_screen_user(sb); } =20 static void drm_panic_set_description(const char *description) --=20 2.51.0 From nobody Fri Oct 3 02:03:25 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EC38C2E88B6 for ; Mon, 8 Sep 2025 09:04:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757322246; cv=none; b=KYNTzkXunIDJYXxTfdnzlFjL4MF8gWnljRDKAzz9Z+lkbRQW9hwklE/l7CXzuHRGz8cm6VW28Xra7Aw2L1ldugh2wYOmBrzu6nPGhFY8JNfj2Dkgt9XIdTC/a80GRjC2YoUBx7WA7cxiyFKNm39p/Eis2xs6llG+H4kubRkPASQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757322246; c=relaxed/simple; bh=pv+nHeguLuoKGL0Qj7WUIoNQZdnHGYVkEPZeryV8nYU=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FhhciBMCG/09I9ouQEaOYEpmuKObtDCQhoFNkbUsoA4EI/leNmrheLdTaiEDfMIE+bBWyHrf7hpwURAVSp5mqDFjxPKZUlp9SKSEErLJSDmPfMSMfCa+tiRZ4Imjv03OgRd0P3wyKKFyhHFa9LlCMnBvTTnf2uS0ccThJglq9K0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=YjNM86RL; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="YjNM86RL" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1757322243; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lhsjo8wyowZi6zz6knSbZ4Ze8J5T+YaMaavlwVLTizw=; b=YjNM86RLRyLNwUwuxIi9Nbb9EAVu4Tk7omKkt8b4FdMxQlshliX59D4cOYDIN87DboOIUL 7HdRH5v1olpGjIjJJIm+bXVMcij+HGMUPzucVR6BnVix3kn53si+0OTg8LeMgycLXt+2wT PcvDcyiiAJPONYm+f3FlzUz8xevqyYU= Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-670-nq0UE2iSONqRfa4CCdC34A-1; Mon, 08 Sep 2025 05:03:58 -0400 X-MC-Unique: nq0UE2iSONqRfa4CCdC34A-1 X-Mimecast-MFC-AGG-ID: nq0UE2iSONqRfa4CCdC34A_1757322237 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 3394819541B2; Mon, 8 Sep 2025 09:03:57 +0000 (UTC) Received: from hydra.redhat.com (unknown [10.44.33.69]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 1950C1800452; Mon, 8 Sep 2025 09:03:53 +0000 (UTC) From: Jocelyn Falempe To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jocelyn Falempe , Javier Martinez Canillas , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: [PATCH v2 2/3] drm/panic: Add kunit tests for drm_panic Date: Mon, 8 Sep 2025 11:00:30 +0200 Message-ID: <20250908090341.762049-3-jfalempe@redhat.com> In-Reply-To: <20250908090341.762049-1-jfalempe@redhat.com> References: <20250908090341.762049-1-jfalempe@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" Add kunit tests for drm_panic. They check that drawing the panic screen doesn't crash, but they don't check the correctness of the resulting image. Signed-off-by: Jocelyn Falempe --- v2: * Add a few checks, and more comments in the kunit tests. (Maxime Ripard). MAINTAINERS | 1 + drivers/gpu/drm/drm_panic.c | 4 + drivers/gpu/drm/tests/drm_panic_test.c | 198 +++++++++++++++++++++++++ 3 files changed, 203 insertions(+) create mode 100644 drivers/gpu/drm/tests/drm_panic_test.c diff --git a/MAINTAINERS b/MAINTAINERS index 402fe14091f1..e9be893d6741 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8480,6 +8480,7 @@ T: git https://gitlab.freedesktop.org/drm/misc/kernel= .git F: drivers/gpu/drm/drm_draw.c F: drivers/gpu/drm/drm_draw_internal.h F: drivers/gpu/drm/drm_panic*.c +F: drivers/gpu/drm/tests/drm_panic_test.c F: include/drm/drm_panic* =20 DRM PANIC QR CODE diff --git a/drivers/gpu/drm/drm_panic.c b/drivers/gpu/drm/drm_panic.c index 1e06e3a18d09..d89812ff1935 100644 --- a/drivers/gpu/drm/drm_panic.c +++ b/drivers/gpu/drm/drm_panic.c @@ -986,3 +986,7 @@ void drm_panic_exit(void) { drm_panic_qr_exit(); } + +#ifdef CONFIG_DRM_KUNIT_TEST +#include "tests/drm_panic_test.c" +#endif diff --git a/drivers/gpu/drm/tests/drm_panic_test.c b/drivers/gpu/drm/tests= /drm_panic_test.c new file mode 100644 index 000000000000..d5d20dd2aa7c --- /dev/null +++ b/drivers/gpu/drm/tests/drm_panic_test.c @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: GPL-2.0 or MIT +/* + * Copyright (c) 2025 Red Hat. + * Author: Jocelyn Falempe + * + * KUNIT tests for drm panic + */ + +#include +#include + +#include + +#include +#include + +/* Check the framebuffer color only if the panic colors are the default */ +#if (CONFIG_DRM_PANIC_BACKGROUND_COLOR =3D=3D 0 && \ + CONFIG_DRM_PANIC_FOREGROUND_COLOR =3D=3D 0xffffff) +#define DRM_PANIC_CHECK_COLOR +#endif + +struct drm_test_mode { + const int width; + const int height; + const u32 format; + void (*draw_screen)(struct drm_scanout_buffer *sb); + const char *fname; +}; + +/* + * Run all tests for the 3 panic screens: user, kmsg and qr_code + */ +#define DRM_TEST_MODE_LIST(func) \ + DRM_PANIC_TEST_MODE(1024, 768, DRM_FORMAT_XRGB8888, func) \ + DRM_PANIC_TEST_MODE(300, 200, DRM_FORMAT_XRGB8888, func) \ + DRM_PANIC_TEST_MODE(1920, 1080, DRM_FORMAT_XRGB8888, func) \ + DRM_PANIC_TEST_MODE(1024, 768, DRM_FORMAT_RGB565, func) \ + DRM_PANIC_TEST_MODE(1024, 768, DRM_FORMAT_RGB888, func) \ + +#define DRM_PANIC_TEST_MODE(w, h, f, name) { \ + .width =3D w, \ + .height =3D h, \ + .format =3D f, \ + .draw_screen =3D draw_panic_screen_##name, \ + .fname =3D #name, \ + }, \ + +static const struct drm_test_mode drm_test_modes_cases[] =3D { + DRM_TEST_MODE_LIST(user) + DRM_TEST_MODE_LIST(kmsg) + DRM_TEST_MODE_LIST(qr_code) +}; +#undef DRM_PANIC_TEST_MODE + +static int drm_test_panic_init(struct kunit *test) +{ + struct drm_scanout_buffer *priv; + + priv =3D kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, priv); + + test->priv =3D priv; + + drm_panic_set_description("Kunit testing"); + + return 0; +} + +/* + * Test drawing the panic screen, using a memory mapped framebuffer + * Set the whole buffer to 0xa5, and then check that all pixels have been + * written. + */ +static void drm_test_panic_screen_user_map(struct kunit *test) +{ + struct drm_scanout_buffer *sb =3D test->priv; + const struct drm_test_mode *params =3D test->param_value; + char *fb; + int fb_size; + + sb->format =3D drm_format_info(params->format); + fb_size =3D params->width * params->height * sb->format->cpp[0]; + + fb =3D vmalloc(fb_size); + KUNIT_ASSERT_NOT_NULL(test, fb); + + memset(fb, 0xa5, fb_size); + + iosys_map_set_vaddr(&sb->map[0], fb); + sb->width =3D params->width; + sb->height =3D params->height; + sb->pitch[0] =3D params->width * sb->format->cpp[0]; + + params->draw_screen(sb); + +#ifdef DRM_PANIC_CHECK_COLOR + { + int i; + + for (i =3D 0; i < fb_size; i++) + KUNIT_ASSERT_TRUE(test, fb[i] =3D=3D 0 || fb[i] =3D=3D 0xff); + } +#endif + vfree(fb); +} + +/* + * Test drawing the panic screen, using a list of pages framebuffer + * No checks are performed + */ +static void drm_test_panic_screen_user_page(struct kunit *test) +{ + struct drm_scanout_buffer *sb =3D test->priv; + const struct drm_test_mode *params =3D test->param_value; + int fb_size; + struct page **pages; + int i; + int npages; + + sb->format =3D drm_format_info(params->format); + fb_size =3D params->width * params->height * sb->format->cpp[0]; + npages =3D DIV_ROUND_UP(fb_size, PAGE_SIZE); + + pages =3D kmalloc_array(npages, sizeof(struct page *), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, pages); + + for (i =3D 0; i < npages; i++) { + pages[i] =3D alloc_page(GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, pages[i]); + } + sb->pages =3D pages; + sb->width =3D params->width; + sb->height =3D params->height; + sb->pitch[0] =3D params->width * sb->format->cpp[0]; + + params->draw_screen(sb); + + for (i =3D 0; i < npages; i++) + __free_page(pages[i]); + kfree(pages); +} + +static void drm_test_panic_set_pixel(struct drm_scanout_buffer *sb, + unsigned int x, + unsigned int y, + u32 color) +{ + struct kunit *test =3D (struct kunit *) sb->private; + + KUNIT_ASSERT_TRUE(test, x < sb->width && y < sb->height); +} + +/* + * Test drawing the panic screen, using the set_pixel callback + * Check that all calls to set_pixel() are within the framebuffer + */ +static void drm_test_panic_screen_user_set_pixel(struct kunit *test) +{ + struct drm_scanout_buffer *sb =3D test->priv; + const struct drm_test_mode *params =3D test->param_value; + + sb->format =3D drm_format_info(params->format); + sb->set_pixel =3D drm_test_panic_set_pixel; + sb->width =3D params->width; + sb->height =3D params->height; + sb->private =3D test; + + params->draw_screen(sb); +} + +static void drm_test_panic_desc(const struct drm_test_mode *t, char *desc) +{ + sprintf(desc, "Panic screen %s, mode: %d x %d \t%p4cc", + t->fname, t->width, t->height, &t->format); +} + +KUNIT_ARRAY_PARAM(drm_test_panic_screen_user_map, drm_test_modes_cases, dr= m_test_panic_desc); +KUNIT_ARRAY_PARAM(drm_test_panic_screen_user_page, drm_test_modes_cases, d= rm_test_panic_desc); +KUNIT_ARRAY_PARAM(drm_test_panic_screen_user_set_pixel, drm_test_modes_cas= es, drm_test_panic_desc); + +static struct kunit_case drm_panic_screen_user_test[] =3D { + KUNIT_CASE_PARAM(drm_test_panic_screen_user_map, + drm_test_panic_screen_user_map_gen_params), + KUNIT_CASE_PARAM(drm_test_panic_screen_user_page, + drm_test_panic_screen_user_page_gen_params), + KUNIT_CASE_PARAM(drm_test_panic_screen_user_set_pixel, + drm_test_panic_screen_user_set_pixel_gen_params), + { } +}; + +static struct kunit_suite drm_panic_suite =3D { + .name =3D "drm_panic", + .init =3D drm_test_panic_init, + .test_cases =3D drm_panic_screen_user_test, +}; + +kunit_test_suite(drm_panic_suite); --=20 2.51.0 From nobody Fri Oct 3 02:03:25 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 97CC02E8B9C for ; Mon, 8 Sep 2025 09:04:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757322248; cv=none; b=QKE0MbIgNMQYVsmrdR3UWl/IH18xkTOh2KB1cQW0zHdJzjyZBSYkRtALfsQUsP4HtDiMZ3TYOobEZICa/ZjvRg8KW2nOAbBP/xQK/aoJDTt09QfXwrdptYSPgiSuS1zyadNJEQ8FUccmWdzRvceyhcSw+H2wtGicPPlTmEqqyDM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757322248; c=relaxed/simple; bh=4qTBeYnqKEVhqScAd1e45oMNK9JjxoUSZ/jPPPA/9k4=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QCO5Ce+LDDoOMmsFFXUgGCI7hYQDZMlaTYLC1LLtefJj40MsFp1n8MYumFPsY5WFrWb8FJbmYGmKFOV/nH892dpanWLo0ctjwvnV0vhHhXKIAKzt6Fpj/TN02nSMB3RYFTUqdyueeyyGycnVrlqKhBaP7VU2ka7LlolCjOsPfdU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=fRZyswX9; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="fRZyswX9" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1757322245; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=maQua4pP1jg8Dto/w8MesCMtmzns93M95sjmnulnRnE=; b=fRZyswX9zAmT/dVWs7N68A1yXKXbQJ8bMPFaSmbkuaK9QyLqID2WdTd/OhX9NQ6N2gSmAb x3rX3eUSnQ6oQke9rdkZJTADR4dzMnnlQ0eonxkwJLF4IR0Of1SvO3m08WLn+Ihm8amR7c ek4hn64aJvdMFGTQKOWG5WnySsmSQyo= Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-220-74vPeKKrN6GyMtZW-6XA9Q-1; Mon, 08 Sep 2025 05:04:02 -0400 X-MC-Unique: 74vPeKKrN6GyMtZW-6XA9Q-1 X-Mimecast-MFC-AGG-ID: 74vPeKKrN6GyMtZW-6XA9Q_1757322241 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id D6E90180057E; Mon, 8 Sep 2025 09:04:00 +0000 (UTC) Received: from hydra.redhat.com (unknown [10.44.33.69]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id D882D1800452; Mon, 8 Sep 2025 09:03:57 +0000 (UTC) From: Jocelyn Falempe To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jocelyn Falempe , Javier Martinez Canillas , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: [PATCH v2 3/3] drm/panic: Add a drm_panic/draw_test in debugfs Date: Mon, 8 Sep 2025 11:00:31 +0200 Message-ID: <20250908090341.762049-4-jfalempe@redhat.com> In-Reply-To: <20250908090341.762049-1-jfalempe@redhat.com> References: <20250908090341.762049-1-jfalempe@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" This adds a new drm_panic/draw_test file in debugfs. This file allows to test the panic screen rendering at different resolution and pixel format. It's useful only for kernel developers that want to create or customize a panic screen. If you want to check the result at 1024x768 using XRGB8888: cd /sys/kernel/debug/drm_panic/ exec 3<> draw_test echo 1024x768:XR24 >&3 cat <&3 > ~/panic_screen.raw exec 3<&- Signed-off-by: Jocelyn Falempe --- v2: * Use debugfs instead of sending the framebuffer through the kunit logs. (= Thomas Zimmermann). drivers/gpu/drm/Kconfig | 2 + drivers/gpu/drm/drm_panic.c | 117 ++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index f7ea8e895c0c..0d3146070d9c 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig @@ -83,6 +83,8 @@ config DRM_PANIC_DEBUG Add dri/[device]/drm_panic_plane_x in the kernel debugfs, to force the panic handler to write the panic message to this plane scanout buffer. This is unsafe and should not be enabled on a production build. + Also adds a drm_panic/draw_test file in debugfs, to easily test the + panic screen rendering. If in doubt, say "N". =20 config DRM_PANIC_SCREEN diff --git a/drivers/gpu/drm/drm_panic.c b/drivers/gpu/drm/drm_panic.c index d89812ff1935..0c01d6067eab 100644 --- a/drivers/gpu/drm/drm_panic.c +++ b/drivers/gpu/drm/drm_panic.c @@ -873,6 +873,7 @@ static void drm_panic(struct kmsg_dumper *dumper, struc= t kmsg_dump_detail *detai */ #ifdef CONFIG_DRM_PANIC_DEBUG #include +#include =20 static ssize_t debugfs_trigger_write(struct file *file, const char __user = *user_buf, size_t count, loff_t *ppos) @@ -901,8 +902,122 @@ static void debugfs_register_plane(struct drm_plane *= plane, int index) debugfs_create_file(fname, 0200, plane->dev->debugfs_root, plane, &dbg_drm_panic_ops); } + +/* + * Draw test interface + * This can be used to check the panic screen at any resolution/pixel form= at. + * The framebuffer memory is freed when the file is closed, so use this sh + * script to write the parameters and read the result without closing the = file. + * cd /sys/kernel/debug/drm_panic/ + * exec 3<> draw_test + * echo 1024x768:XR24 >&3 + * cat <&3 > ~/panic_screen.raw + * exec 3<&- + */ +static ssize_t debugfs_drawtest_write(struct file *file, const char __user= *user_buf, + size_t count, loff_t *ppos) +{ + struct drm_scanout_buffer *sb =3D (struct drm_scanout_buffer *) file->pri= vate_data; + size_t fb_size; + void *fb; + char buf[64]; + int width; + int height; + char cc1, cc2, cc3, cc4; + u32 drm_format; + + if (count >=3D sizeof(buf)) + return -EINVAL; + + if (copy_from_user(buf, user_buf, count)) + return -EFAULT; + + if (sscanf(buf, "%dx%d:%c%c%c%c", &width, &height, &cc1, &cc2, &cc3, &cc4= ) !=3D 6) { + pr_err("Invalid format. Expected: x:\n"); + return -EINVAL; + } + + drm_format =3D fourcc_code(cc1, cc2, cc3, cc4); + sb->format =3D drm_format_info(drm_format); + if (!sb->format) + return -EINVAL; + + drm_panic_set_description("Test drawing from debugfs"); + + sb->width =3D width; + sb->height =3D height; + sb->pitch[0] =3D width * sb->format->cpp[0]; + + if (sb->map[0].vaddr) + vfree(sb->map[0].vaddr); + + fb_size =3D height * sb->pitch[0]; + fb =3D vmalloc(fb_size); + iosys_map_set_vaddr(&sb->map[0], fb); + + draw_panic_dispatch(sb); + + drm_panic_clear_description(); + return count; +} + +static ssize_t debugfs_drawtest_read(struct file *file, char __user *user_= buf, + size_t count, loff_t *ppos) +{ + struct drm_scanout_buffer *sb =3D (struct drm_scanout_buffer *) file->pri= vate_data; + int fb_size =3D sb->height * sb->pitch[0]; + + if (!sb->map[0].vaddr) + return 0; + return simple_read_from_buffer(user_buf, count, ppos, sb->map[0].vaddr, f= b_size); +} + +static int debugfs_drawtest_open(struct inode *inode, struct file *file) +{ + struct drm_scanout_buffer *sb =3D kzalloc(sizeof(*sb), GFP_KERNEL); + + if (!sb) + return -ENOMEM; + + file->private_data =3D sb; + return 0; +} + +static int debugfs_drawtest_release(struct inode *inode, struct file *file) +{ + struct drm_scanout_buffer *sb =3D (struct drm_scanout_buffer *) file->pri= vate_data; + + vfree(sb->map[0].vaddr); + kfree(sb); + return 0; +} + +static const struct file_operations dbg_drm_panic_test_ops =3D { + .owner =3D THIS_MODULE, + .write =3D debugfs_drawtest_write, + .read =3D debugfs_drawtest_read, + .open =3D debugfs_drawtest_open, + .release =3D debugfs_drawtest_release, +}; + +static struct dentry *drm_panic_debugfs_dir; + +static void debugfs_register_drawtest(void) +{ + drm_panic_debugfs_dir =3D debugfs_create_dir("drm_panic", NULL); + debugfs_create_file("draw_test", 0600, drm_panic_debugfs_dir, + NULL, &dbg_drm_panic_test_ops); +} + +static void debugfs_unregister_drawtest(void) +{ + debugfs_remove(drm_panic_debugfs_dir); +} + #else static void debugfs_register_plane(struct drm_plane *plane, int index) {} +static void debugfs_register_drawtest(void) {} +static void debugfs_unregister_drawtest(void) {} #endif /* CONFIG_DRM_PANIC_DEBUG */ =20 /** @@ -977,6 +1092,7 @@ void drm_panic_unregister(struct drm_device *dev) void __init drm_panic_init(void) { drm_panic_qr_init(); + debugfs_register_drawtest(); } =20 /** @@ -985,6 +1101,7 @@ void __init drm_panic_init(void) void drm_panic_exit(void) { drm_panic_qr_exit(); + debugfs_unregister_drawtest(); } =20 #ifdef CONFIG_DRM_KUNIT_TEST --=20 2.51.0