From nobody Sat Feb 7 06:54:43 2026 Received: from delivery.antispam.mailspamprotection.com (delivery.antispam.mailspamprotection.com [185.56.87.11]) (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 4067AEEAB; Sun, 26 Oct 2025 23:03:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.56.87.11 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761519831; cv=pass; b=nYy+fTbB1wJrtGc5b60AWbO9/4dcnFGV32Tqy5xi0WYAOQ3gZoyovcrwcNARucyZR4T56GRbW0HyGRg9JUo8f1oXgS0Uhr5GVEt9VP5vnCNQnE2uXFQmH9PAd8ynh0uvi7rYVGAHbWwQdkXVegmlOLNPBFKZYL4QhM8zPt4iQ8E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761519831; c=relaxed/simple; bh=xoXrhHzPCacrBzsTec8U9Lev82WQujM7eNeHxPp4vjM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=M8EHxs5lDUtq/mw8yJNSPe3c3GhTPLmIVxKQ5Afo95HBUAWUp1Npj8iCHNiz4pNX6Ri/fA+pZiPfMDpjuxWn/JYYYqr9WtkvK9eSEbdLLYb0r8lbwmngBJ7qlkqyhOwybESaZzPdtmRlxskPMtMDLA8dXnGMSm9ktYLgl9vEe1Q= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valla.it; spf=pass smtp.mailfrom=valla.it; dkim=pass (1024-bit key) header.d=antispam.mailspamprotection.com header.i=@antispam.mailspamprotection.com header.b=xsvRJlSS; dkim=pass (1024-bit key) header.d=valla.it header.i=@valla.it header.b=kMm6xi+H; arc=pass smtp.client-ip=185.56.87.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valla.it Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valla.it Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=antispam.mailspamprotection.com header.i=@antispam.mailspamprotection.com header.b="xsvRJlSS"; dkim=pass (1024-bit key) header.d=valla.it header.i=@valla.it header.b="kMm6xi+H" ARC-Seal: i=1; cv=none; a=rsa-sha256; d=outgoing.instance-europe-west4-8rw8.prod.antispam.mailspamprotection.com; s=arckey; t=1761519827; b=xiAZnNdqt2+ridb57NJFimQYPD0WvMHuJSiVd8zck3hzX0vUacJhvk/xy+04vgr5RUvlCrTKsl +Ra6lRpxQP6eIHtOlAQ+Ants4Qc6MlUD4PXkHvv4+puu0Z/rxnlNLahAAgg5L/58VdqBQAgspD 0ATp14f/d/pBCT20fffDVDv44dOUdv9STs93veyNqMzRIDBYrkIphM2q8h5fYfn5paDz2Syru9 ZT/i58F+b+wHJuih7Ab4M9fSANM0t8ZVtsclIz2IeOElWXRvKARa0OLT52X9+SAgcQ2vw2jbPz Fxt2DyfKfQWfO6KvlEePy6llEAHP8kbjyZ0EkEcMobVJPw==; ARC-Authentication-Results: i=1; outgoing.instance-europe-west4-8rw8.prod.antispam.mailspamprotection.com; smtp.remote-ip=35.214.173.214; iprev=pass (214.173.214.35.bc.googleusercontent.com) smtp.remote-ip=35.214.173.214; auth=pass (LOGIN) smtp.auth=esm19.siteground.biz; dkim=pass header.d=valla.it header.s=default header.a=rsa-sha256; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=outgoing.instance-europe-west4-8rw8.prod.antispam.mailspamprotection.com; s=arckey; t=1761519827; bh=xoXrhHzPCacrBzsTec8U9Lev82WQujM7eNeHxPp4vjM=; h=Cc:To:In-Reply-To:References:Message-ID:Content-Transfer-Encoding: Content-Type:MIME-Version:Subject:Date:From:DKIM-Signature:DKIM-Signature; b=bqrUb4CRqg0t8A5lGUECz4UshA11WZB8JrgOp8rhH4DT1o1dTAkkLyn7sOovvxjnv7XtXMcRps tjeVSF/c2ffvky+sNIDAda1RPxRVgvnTC8dVkqJb9Be3FmF4UwhginMCNZtUdAQX1YBe/SQ1UA NGnIZcq58eEphtYv8rJ808bmH4o7B+2y+HtFnNqZSALr/0q1WhgGfykXUCZyhjXKjH8ocuN5+z rihB24L19dO0fbUkafqqUM+AwLkChimQha9pvRLsEHdohzk8DcI3F7eUeO2Li5sq7lGUTOezbK 63mzgD94pvYy5/riGVHJP1K9pbVEp0XfpLPT71LfK1Q6Iw==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=antispam.mailspamprotection.com; s=default; h=CFBL-Feedback-ID:CFBL-Address :Cc:To:Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject :Date:From:Reply-To:List-Unsubscribe; bh=vDeCu2zNom6DtRNTKdjnOneiH6FGRfPsrs+H9zgngrs=; b=xsvRJlSSg0N2dJYM5xHjAtK4fc GyP2q45jcTkaqqMwMFoDbxNSRLTN/2ukPF/9XSmTNXgN46rCAXw7T71xUU+XXxjzrCEkrDQ97mM/P 7FJrMFgFcZ/kBN1+ufMsVFQowGpzoBi62FncwoZ6UAGEhzuYsMN2fc8ZN+0KdNKeSvUY=; Received: from 214.173.214.35.bc.googleusercontent.com ([35.214.173.214] helo=esm19.siteground.biz) by instance-europe-west4-8rw8.prod.antispam.mailspamprotection.com with esmtpsa (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.98.1) (envelope-from ) id 1vD9lx-00000001oAy-1l25; Sun, 26 Oct 2025 23:03:39 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=valla.it; s=default; h=Cc:To:Subject:Date:From:list-help:list-unsubscribe: list-subscribe:list-post:list-owner:list-archive; bh=vDeCu2zNom6DtRNTKdjnOneiH6FGRfPsrs+H9zgngrs=; b=kMm6xi+HlNWb6P1p/qs1iRRoa9 0Be0QjN6xNJIJYETAkSrHGHfHFPEHx/9ZRMK+n5BeJ3r6Os9N1f21IW5EWIc6PtfBiRBBOlAbTrux 1M3Ex7ZxiuSZU9pMujeYVkmfZWx4BicrA7y6+7zWELPwmGmhNPw+5fIlm/u2qler5auE=; Received: from [87.17.42.198] (port=63736 helo=fedora.fritz.box) by esm19.siteground.biz with esmtpsa (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.98.1) (envelope-from ) id 1vD9lq-00000000KNm-3FZw; Sun, 26 Oct 2025 23:03:30 +0000 From: Francesco Valla Date: Mon, 27 Oct 2025 00:03:01 +0100 Subject: [PATCH RFC 1/3] drm: client: add splash client Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251027-drm_client_splash-v1-1-00698933b34a@valla.it> References: <20251027-drm_client_splash-v1-0-00698933b34a@valla.it> In-Reply-To: <20251027-drm_client_splash-v1-0-00698933b34a@valla.it> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Jocelyn Falempe , Javier Martinez Canillas Cc: Sam Ravnborg , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-embedded@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=27400; i=francesco@valla.it; h=from:subject:message-id; bh=xoXrhHzPCacrBzsTec8U9Lev82WQujM7eNeHxPp4vjM=; b=owGbwMvMwCX2aH1OUIzHTgbG02pJDBn/VhyQ72B9NPVSsLxHIuPBkPQ5X8Kf/jR1XvKy+qq4Z sChJ5bWHaUsDGJcDLJiiiwh627c2zPX/FvaBsZHMHNYmUCGMHBxCsBEynUZ/ge9NXJYmKcYeadE 89d2rm5J5hsu6gcal5w7en+FcWSvRCQjw+Y2TiZ9w8orx+b92H+Hf+UGbV+h7wx+2z8I3GYrfiv exQEA X-Developer-Key: i=francesco@valla.it; a=openpgp; fpr=CC70CBC9AA13257C6CCED8669601767CA07CA0EA X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - esm19.siteground.biz X-AntiAbuse: Original Domain - vger.kernel.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - valla.it X-Source: X-Source-Args: X-Source-Dir: X-SGantispam-id: 87388b7331577f2478f5c0ec52ae4422 AntiSpam-DLS: false AntiSpam-DLSP: AntiSpam-DLSRS: AntiSpam-TS: 1.0 CFBL-Address: feedback@antispam.mailspamprotection.com; report=arf CFBL-Feedback-ID: 1vD9lx-00000001oAy-1l25-feedback@antispam.mailspamprotection.com Authentication-Results: outgoing.instance-europe-west4-8rw8.prod.antispam.mailspamprotection.com; iprev=pass (214.173.214.35.bc.googleusercontent.com) smtp.remote-ip=35.214.173.214; auth=pass (LOGIN) smtp.auth=esm19.siteground.biz; dkim=pass header.d=valla.it header.s=default header.a=rsa-sha256; arc=none Add a DRM client that draws a simple splash, with possibility to show: - a colored background - a text message - a progress bar - (optionally) a static splash image The client is not meant to replace a full-featured bootsplash, but rather to remove some complexity (and hopefully boot time) on small embedded platforms or on systems with a limited scope (e.g: recovery or manufacturing images). The text message and the progress bar can be set through sysfs properties; a default value for the former can also be set from the kernel command line using the drm_client_lib.message=3D"<...>" parameter. If enabled, the splash image is loaded as firmware for each DRM device. The splash client expects this image to be a binary dump of the graphic buffer to be shown on the screen connected to the modeset, with the same dimensions (width and height) and color format. Just like the existing DRM clients, the splash can be enable from the kernel command line using drm_client_lib.active=3Dsplash. Signed-off-by: Francesco Valla --- drivers/gpu/drm/clients/Kconfig | 46 +- drivers/gpu/drm/clients/Makefile | 1 + drivers/gpu/drm/clients/drm_client_internal.h | 9 + drivers/gpu/drm/clients/drm_client_setup.c | 8 + drivers/gpu/drm/clients/drm_splash.c | 761 ++++++++++++++++++++++= ++++ 5 files changed, 824 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/clients/Kconfig b/drivers/gpu/drm/clients/Kcon= fig index 6096c623d9d5b1a3d4a40d986c45aad2f8277767..0b23756f2453c9b815d9f242987= d5f386b7a894f 100644 --- a/drivers/gpu/drm/clients/Kconfig +++ b/drivers/gpu/drm/clients/Kconfig @@ -12,6 +12,7 @@ config DRM_CLIENT_LIB config DRM_CLIENT_SELECTION tristate depends on DRM + select DRM_CLIENT_LIB if DRM_CLIENT_SPLASH select DRM_CLIENT_LIB if DRM_CLIENT_LOG select DRM_CLIENT_LIB if DRM_FBDEV_EMULATION help @@ -85,10 +86,46 @@ config DRM_CLIENT_LOG If you only need logs, but no terminal, or if you prefer userspace terminal, say "Y". =20 +config DRM_CLIENT_SPLASH + bool "Display graphical splash" + depends on DRM_CLIENT_SELECTION + select DRM_CLIENT + select DRM_CLIENT_SETUP + select DRM_DRAW + select FONT_SUPPORT + help + This enables a splash drm client, able to display a colored background, + a progress bar, some text and (optionally, if DRM_CLIENT_SPLASH_LOAD_AS= _FW + is set) a graphical image until the userspace is ready to take over. + + Message and progress can be set through sysfs; an initial message can a= lso + be set by using the kernel command line 'drm_client_lib.message=3D' opt= ion. + +config DRM_CLIENT_SPLASH_FOREGROUND_COLOR + hex "Splash foreground color, in RGB" + depends on DRM_CLIENT_SPLASH + default 0xffffff + +config DRM_CLIENT_SPLASH_BACKGROUND_COLOR + hex "Splash background color, in RGB" + depends on DRM_CLIENT_SPLASH + default 0x000000 + +config DRM_CLIENT_SPLASH_LOAD_AS_FW + bool "Load splash image as firmware" + depends on DRM_CLIENT_SPLASH + select FW_LOADER + help + Load image to be used as splash using the firmware loading facility the + kernel provides. + + Even when this option is set, the image loading can be avoided by using + the kernel command line 'drm_client_lib.skip_image=3Dtrue' option. + choice prompt "Default DRM Client" depends on DRM_CLIENT_SELECTION - depends on DRM_FBDEV_EMULATION || DRM_CLIENT_LOG + depends on DRM_FBDEV_EMULATION || DRM_CLIENT_LOG || DRM_CLIENT_SPLASH default DRM_CLIENT_DEFAULT_FBDEV help Selects the default drm client. @@ -111,6 +148,12 @@ config DRM_CLIENT_DEFAULT_LOG screen, but doesn't implement a full terminal. For that you will need a userspace terminal using drm/kms. =20 +config DRM_CLIENT_DEFAULT_SPLASH + bool "splash" + depends on DRM_CLIENT_SPLASH + help + Use splash as default drm client. + endchoice =20 config DRM_CLIENT_DEFAULT @@ -118,6 +161,7 @@ config DRM_CLIENT_DEFAULT depends on DRM_CLIENT default "fbdev" if DRM_CLIENT_DEFAULT_FBDEV default "log" if DRM_CLIENT_DEFAULT_LOG + default "splash" if DRM_CLIENT_DEFAULT_SPLASH default "" =20 endmenu diff --git a/drivers/gpu/drm/clients/Makefile b/drivers/gpu/drm/clients/Mak= efile index c16addbc327f09572aa3142cbf0d1d13f172a9e9..3df02d10cd18a47d7e8d7cee701= 63b0ef0129b51 100644 --- a/drivers/gpu/drm/clients/Makefile +++ b/drivers/gpu/drm/clients/Makefile @@ -5,4 +5,5 @@ subdir-ccflags-y +=3D -I$(src)/.. drm_client_lib-y :=3D drm_client_setup.o drm_client_lib-$(CONFIG_DRM_CLIENT_LOG) +=3D drm_log.o drm_client_lib-$(CONFIG_DRM_FBDEV_EMULATION) +=3D drm_fbdev_client.o +drm_client_lib-$(CONFIG_DRM_CLIENT_SPLASH) +=3D drm_splash.o obj-$(CONFIG_DRM_CLIENT_LIB) +=3D drm_client_lib.o diff --git a/drivers/gpu/drm/clients/drm_client_internal.h b/drivers/gpu/dr= m/clients/drm_client_internal.h index 6dc078bf6503b902cbb3267b64ea42d9f1c23375..48ee0c1c2529882b2bf5dc78678= 8390823e25cd6 100644 --- a/drivers/gpu/drm/clients/drm_client_internal.h +++ b/drivers/gpu/drm/clients/drm_client_internal.h @@ -22,4 +22,13 @@ void drm_log_register(struct drm_device *dev); static inline void drm_log_register(struct drm_device *dev) {} #endif =20 +#ifdef CONFIG_DRM_CLIENT_SPLASH +void drm_splash_register(struct drm_device *dev, + const struct drm_format_info *format); +#else +static inline void drm_splash_register(struct drm_device *dev, + const struct drm_format_info *format) +{} +#endif + #endif diff --git a/drivers/gpu/drm/clients/drm_client_setup.c b/drivers/gpu/drm/c= lients/drm_client_setup.c index 72480db1f00d0b9fcd1fe5aa72a3a31a074393b2..023a142319227c5f7ba887dcd55= af4b04942f9ce 100644 --- a/drivers/gpu/drm/clients/drm_client_setup.c +++ b/drivers/gpu/drm/clients/drm_client_setup.c @@ -56,6 +56,14 @@ void drm_client_setup(struct drm_device *dev, const stru= ct drm_format_info *form return; } #endif + +#ifdef CONFIG_DRM_CLIENT_SPLASH + if (!strcmp(drm_client_default, "splash")) { + drm_splash_register(dev, format); + return; + } +#endif + if (strcmp(drm_client_default, "")) drm_warn(dev, "Unknown DRM client %s\n", drm_client_default); } diff --git a/drivers/gpu/drm/clients/drm_splash.c b/drivers/gpu/drm/clients= /drm_splash.c new file mode 100644 index 0000000000000000000000000000000000000000..308924e917e32d1e6d7686bf6f9= b3a3ff2bafe68 --- /dev/null +++ b/drivers/gpu/drm/clients/drm_splash.c @@ -0,0 +1,761 @@ +// SPDX-License-Identifier: GPL-2.0 or MIT +/* + * Copyright (c) 2025 Francesco Valla + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "drm_client_internal.h" +#include "drm_draw_internal.h" +#include "drm_internal.h" + +// TODO: determine proper size for max message length +#define DRM_SPLASH_MAX_MSG_LEN 128 + +static char *message; +module_param(message, charp, 0400); +MODULE_PARM_DESC(message, "Initial message, up to " __stringify(DRM_SPLASH= _MAX_MSG_LEN) " chars"); + +#ifdef CONFIG_DRM_CLIENT_SPLASH_LOAD_AS_FW +static bool skip_image; +module_param(skip_image, bool, 0400); +MODULE_PARM_DESC(skip_image, "Do not try to load splash image (default: fa= lse)"); +#endif + +/** + * DOC: overview + * + * This is a simple graphic bootsplash. + * Images to be shown are loaded as firmware. + */ + +struct drm_splash_scanout { + int id; + u32 format; + unsigned int width; + unsigned int height; + struct drm_client_buffer *buffer; + + struct mutex lock; + const struct font_desc *font; + bool bg_drawn; + bool message_drawn; + +#ifdef CONFIG_DRM_CLIENT_SPLASH_LOAD_AS_FW + const struct firmware *fw; +#endif +}; + +struct drm_splash { + struct drm_client_dev client; + u32 preferred_format; + struct device dev; + + struct mutex lock; + struct task_struct *thread; + atomic_t pending; + bool initialized; + + char message[DRM_SPLASH_MAX_MSG_LEN]; + u8 progress; + + u32 n_scanout; + struct drm_splash_scanout *scanout; +}; + +static struct drm_splash *client_to_drm_splash(struct drm_client_dev *clie= nt) +{ + return container_of_const(client, struct drm_splash, client); +} + +static struct drm_splash_scanout * +get_scanout_from_tile_group(struct drm_splash *splash, int id) +{ + int j; + + for (j =3D 0; j < splash->n_scanout; j++) + if (splash->scanout[j].id =3D=3D id) + return &splash->scanout[j]; + + return NULL; +} + +static u32 drm_splash_find_usable_format(struct drm_plane *plane, + u32 preferred_format) +{ + int i; + + /* If preferred format is not set, use RGB888 (which offers full colors + * with minimal occupation). + */ + if (preferred_format =3D=3D 0) + preferred_format =3D DRM_FORMAT_RGB888; + + /* Check if the preferred format can be used */ + for (i =3D 0; i < plane->format_count; i++) + if (plane->format_types[i] =3D=3D preferred_format) + return preferred_format; + + /* Otherwise, find the first format that can be converted from XRGB8888 */ + for (i =3D 0; i < plane->format_count; i++) + if (drm_draw_color_from_xrgb8888(0xffffffff, plane->format_types[i]) != =3D 0) + return plane->format_types[i]; + + return DRM_FORMAT_INVALID; +} + +static void drm_splash_blit(struct iosys_map *dst, unsigned int dst_pitch, + const u8 *src, unsigned int src_pitch, + u32 height, u32 width, u32 px_width, u32 color) +{ + switch (px_width) { + case 2: + drm_draw_blit16(dst, dst_pitch, src, src_pitch, height, width, 1, color); + break; + case 3: + drm_draw_blit24(dst, dst_pitch, src, src_pitch, height, width, 1, color); + break; + case 4: + drm_draw_blit32(dst, dst_pitch, src, src_pitch, height, width, 1, color); + break; + default: + WARN_ONCE(1, "Can't blit with pixel width %d\n", px_width); + } +} + +static void drm_splash_fill(struct iosys_map *map, unsigned int dst_pitch, + unsigned int height, unsigned int width, + u32 px_width, u32 color) +{ + switch (px_width) { + case 2: + drm_draw_fill16(map, dst_pitch, height, width, color); + break; + case 3: + drm_draw_fill24(map, dst_pitch, height, width, color); + break; + case 4: + drm_draw_fill32(map, dst_pitch, height, width, color); + break; + default: + WARN_ONCE(1, "Can't fill with pixel width %d\n", px_width); + } +} + +static int drm_splash_fill_solid_color(struct drm_client_buffer *buffer, u= 32 color) +{ + struct drm_client_dev *client =3D buffer->client; + struct drm_framebuffer *fb =3D buffer->fb; + struct drm_rect r =3D DRM_RECT_INIT(0, 0, fb->width, fb->height); + u32 px_width =3D fb->format->cpp[0]; + struct iosys_map map; + int ret; + + ret =3D drm_client_buffer_vmap_local(buffer, &map); + if (ret) { + drm_err(client->dev, "splash: cannot vmap buffer: %d", ret); + return ret; + } + + drm_splash_fill(&map, fb->pitches[0], drm_rect_height(&r), + drm_rect_width(&r), px_width, color); + + drm_client_buffer_vunmap_local(buffer); + + return drm_client_framebuffer_flush(buffer, &r); +} + +#ifdef CONFIG_DRM_CLIENT_SPLASH_LOAD_AS_FW +static int drm_splash_fill_from_data(struct drm_client_buffer *buffer, + const u8 *data, size_t data_len) +{ + struct drm_client_dev *client =3D buffer->client; + struct drm_framebuffer *fb =3D buffer->fb; + struct drm_rect r =3D DRM_RECT_INIT(0, 0, fb->width, fb->height); + struct iosys_map map; + size_t buffer_size; + int ret; + + buffer_size =3D fb->width * fb->height * fb->format->cpp[0]; + if (data_len !=3D buffer_size) { + drm_err(client->dev, + "splash: data size mismatch (expected %zu, got %zu)", + data_len, buffer_size); + return -ENODATA; + } + + ret =3D drm_client_buffer_vmap_local(buffer, &map); + if (ret) { + drm_err(client->dev, "splash: cannot vmap buffer: %d", ret); + return ret; + } + + iosys_map_memcpy_to(&map, 0, data, data_len); + + drm_client_buffer_vunmap_local(buffer); + + return drm_client_framebuffer_flush(buffer, &r); +} +#endif + +static int drm_splash_draw_bar_message(struct drm_splash_scanout *scanout, + const char *msg, + unsigned int progress, + u32 bg_color, + u32 fg_color) +{ + struct drm_framebuffer *fb =3D scanout->buffer->fb; + const struct font_desc *font =3D scanout->font; + size_t font_pitch =3D DIV_ROUND_UP(font->width, 8); + u32 px_width =3D fb->format->cpp[0]; + unsigned int y_padding =3D 2; + struct drm_rect r =3D DRM_RECT_INIT(0, fb->height * 3 / 4 - y_padding, + fb->width, font->height + y_padding); + unsigned int fill_width =3D drm_rect_width(&r) * progress / 100; + struct iosys_map map; + const u8 *src; + size_t i, len; + + /* Clamp len if required */ + len =3D min(strlen(msg), drm_rect_width(&r) / font->width); + + if (drm_client_buffer_vmap_local(scanout->buffer, &map)) + return -1; + + /* Draw progress bar */ + iosys_map_incr(&map, r.y1 * fb->pitches[0]); + drm_splash_fill(&map, fb->pitches[0], drm_rect_height(&r), + drm_rect_width(&r), px_width, bg_color); + drm_splash_fill(&map, fb->pitches[0], drm_rect_height(&r), + fill_width, px_width, fg_color); + + /* Center the message horizontally */ + iosys_map_incr(&map, y_padding * fb->pitches[0]); + iosys_map_incr(&map, (drm_rect_width(&r) - (font->width * len)) * px_widt= h / 2); + + /* Write message */ + for (i =3D 0; i < len; i++) { + unsigned int ch_x; + + src =3D drm_draw_get_char_bitmap(font, msg[i], font_pitch); + + /* Use background color over fill bar, foreground otherwise */ + ch_x =3D (drm_rect_width(&r) - font->width * len) / 2 + i * font->width; + drm_splash_blit(&map, fb->pitches[0], src, font_pitch, + font->height, font->width, px_width, + (fill_width > ch_x) ? bg_color : fg_color); + iosys_map_incr(&map, font->width * px_width); + } + + drm_client_buffer_vunmap_local(scanout->buffer); + drm_client_framebuffer_flush(scanout->buffer, &r); + + return 0; +} + +static int drm_splash_draw_scanout(struct drm_splash_scanout *scanout, + const char *msg, unsigned int progress) +{ + u32 bg_color =3D drm_draw_color_from_xrgb8888(CONFIG_DRM_CLIENT_SPLASH_BA= CKGROUND_COLOR, + scanout->format); + u32 fg_color =3D drm_draw_color_from_xrgb8888(CONFIG_DRM_CLIENT_SPLASH_FO= REGROUND_COLOR, + scanout->format); + int ret =3D -ENOENT; + + if (!scanout->buffer) + return -ENODEV; + +#ifdef CONFIG_DRM_CLIENT_SPLASH_LOAD_AS_FW + if (!skip_image) { + const struct firmware *fw =3D NULL; + + scoped_guard(mutex, &scanout->lock) { + fw =3D scanout->fw; + scanout->fw =3D NULL; + } + + if (fw) { + ret =3D drm_splash_fill_from_data(scanout->buffer, + fw->data, fw->size); + release_firmware(fw); + + if (ret =3D=3D 0) + scanout->bg_drawn =3D true; + } + } +#endif + + /* If no firmware has been used to fill the screen (either by choice of + * because it's unavailable) fill the screen with the background color. + * + */ + if (!scanout->bg_drawn) { + drm_splash_fill_solid_color(scanout->buffer, bg_color); + scanout->bg_drawn =3D true; + } + + /* If message is empty and no previous message was shown, there is + * nothing to do + */ + if (scanout->message_drawn || strlen(msg) !=3D 0 || progress !=3D 0) { + ret =3D drm_splash_draw_bar_message(scanout, msg, progress, + bg_color, fg_color); + if (ret) + return ret; + + scanout->message_drawn =3D true; + } + + return 0; +} + +static int drm_splash_render_thread(void *data) +{ + struct drm_splash *splash =3D data; + struct drm_client_dev *client =3D &splash->client; + char buf[sizeof(splash->message)]; + unsigned int progress; + + while (!kthread_should_stop()) { + unsigned int draw_count =3D 0; + int j, ret; + + /* Copy message and progress to be drawn, to avoid locking for + * too much time and/or showing different contents on different + * screens. + */ + scoped_guard(mutex, &splash->lock) { + strscpy(buf, splash->message); + progress =3D splash->progress; + } + + for (j =3D 0; j < splash->n_scanout; j++) { + ret =3D drm_splash_draw_scanout(&splash->scanout[j], buf, + progress); + if (ret) { + drm_err(client->dev, + "splash: failed to fill scanout %d: %d", + j, ret); + continue; + } + + draw_count++; + } + + if (draw_count > 0) { + ret =3D drm_client_modeset_commit(client); + /* If commit returns EBUSY, another master showed up. + * This means that the splash is no more required. + */ + if (ret =3D=3D -EBUSY) { + drm_info(client->dev, + "splash: not master anymore, exiting"); + break; + } + } + + /* If no changes arrived in the mean time, wait to be awaken by + * a sysfs write, a firmware callback or a stop command. + */ + if (atomic_xchg(&splash->pending, 0) =3D=3D 0) + set_current_state(TASK_UNINTERRUPTIBLE); + + schedule(); + } + + return 0; +} + +static inline void drm_splash_wake_render_thread(struct drm_splash *splash) +{ + atomic_set(&splash->pending, 1); + wake_up_process(splash->thread); +} + +static int drm_splash_init_client(struct drm_splash *splash) +{ + struct drm_client_dev *client =3D &splash->client; + struct drm_mode_set *modeset; + unsigned int modeset_mask =3D 0; + unsigned int fb_count =3D 0; + int j; + + if (drm_client_modeset_probe(client, 0, 0)) + return -1; + + j =3D 0; + drm_client_for_each_modeset(modeset, client) { + struct drm_splash_scanout *tmp; + struct drm_splash_scanout *scanout; + u32 format; + int id =3D -1; + + /* Skip modesets without a mode */ + if (!modeset->mode) + continue; + + if (modeset->connectors[0]->has_tile) { + struct drm_splash_scanout *tiled; + int new_id =3D modeset->connectors[0]->tile_group->id; + + /* Tiled modesets contribute to a single framebuffer, + * check if this tiled group has already been seen. + */ + tiled =3D get_scanout_from_tile_group(splash, new_id); + if (tiled !=3D NULL) { + if (!modeset->x) + tiled->width +=3D modeset->mode->vdisplay; + if (!modeset->y) + tiled->height +=3D modeset->mode->hdisplay; + modeset->fb =3D tiled->buffer->fb; + continue; + } + + /* New tile group, save its ID for later */ + id =3D new_id; + } + + format =3D drm_splash_find_usable_format(modeset->crtc->primary, + splash->preferred_format); + if (format =3D=3D DRM_FORMAT_INVALID) { + drm_warn(client->dev, + "splash: can't find a usable format for modeset"); + continue; + } + + tmp =3D krealloc(splash->scanout, + (splash->n_scanout + 1) * sizeof(*splash->scanout), + GFP_KERNEL); + if (!tmp) { + drm_warn(client->dev, + "splash: can't reallocate the scanout array"); + break; + } + + splash->scanout =3D tmp; + scanout =3D &splash->scanout[splash->n_scanout]; + splash->n_scanout++; + + memset(scanout, 0, sizeof(*scanout)); + scanout->id =3D id; + scanout->format =3D format; + scanout->width =3D modeset->mode->hdisplay; + scanout->height =3D modeset->mode->vdisplay; + mutex_init(&scanout->lock); + + modeset_mask |=3D BIT(j); + j++; + } + + /* Now that all sensible modesets have been collected, allocate buffers */ + j =3D 0; + drm_client_for_each_modeset(modeset, client) { + struct drm_splash_scanout *scanout; + + if (!(modeset_mask & BIT(j))) + continue; + + scanout =3D &splash->scanout[j]; + j++; + + scanout->buffer =3D drm_client_framebuffer_create(client, + scanout->width, + scanout->height, + scanout->format); + if (IS_ERR(scanout->buffer)) { + drm_warn(client->dev, + "splash: can't create framebuffer %d %d %p4cc", + scanout->width, scanout->height, &scanout->format); + continue; + } + + drm_info(client->dev, "splash: created framebuffer %d %d %p4cc", + scanout->width, scanout->height, &scanout->format); + + scanout->font =3D get_default_font(scanout->width, scanout->height, + NULL, NULL); + if (!scanout->font) { + drm_warn(client->dev, + "splash: failed to get default font"); + } + + modeset->fb =3D scanout->buffer->fb; + fb_count++; + } + + return (fb_count =3D=3D 0) ? -ENODEV : 0; +} + +static void drm_splash_free_scanout(struct drm_client_dev *client) +{ + struct drm_splash *splash =3D client_to_drm_splash(client); + int i; + + if (splash->n_scanout) { + for (i =3D 0; i < splash->n_scanout; i++) { + drm_client_framebuffer_delete(splash->scanout[i].buffer); +#ifdef CONFIG_DRM_CLIENT_SPLASH_LOAD_AS_FW + if (splash->scanout[i].fw) + release_firmware(splash->scanout[i].fw); +#endif + mutex_destroy(&splash->scanout[i].lock); + } + splash->n_scanout =3D 0; + kfree(splash->scanout); + splash->scanout =3D NULL; + } +} + +#ifdef CONFIG_DRM_CLIENT_SPLASH_LOAD_AS_FW +static void drm_splash_fw_callback(const struct firmware *fw, void *contex= t) +{ + struct drm_splash_scanout *scanout =3D context; + struct drm_client_dev *client =3D scanout->buffer->client; + struct drm_splash *splash =3D client_to_drm_splash(client); + + if (!fw || !fw->data) { + drm_err(client->dev, "splash: no firmware"); + return; + } + + /* Assign new firmware to the scanout */ + scoped_guard(mutex, &scanout->lock) { + if (scanout->fw) + release_firmware(scanout->fw); + scanout->fw =3D fw; + } + + /* Wake the render thread */ + drm_dbg(client->dev, "splash: firmware loaded, wake up drawing thread"); + drm_splash_wake_render_thread(splash); +} + +static int drm_splash_kick_fw_load(struct drm_splash *splash, + struct task_struct *thread) +{ + struct drm_client_dev *client =3D &splash->client; + int j; + + for (j =3D 0; j < splash->n_scanout; j++) { + struct drm_splash_scanout *scanout =3D &splash->scanout[j]; + char *fw_name =3D kasprintf(GFP_KERNEL, + "drm_splash_%ux%u_%.4s.raw", + scanout->width, scanout->height, + (const char *)&scanout->format); + if (!fw_name) + return -ENOMEM; + + drm_dbg(client->dev, "splash: request firmware %s", fw_name); + request_firmware_nowait(THIS_MODULE, FW_ACTION_NOUEVENT, fw_name, + &splash->dev, GFP_KERNEL, + scanout, drm_splash_fw_callback); + kfree(fw_name); + } + + return 0; +} +#endif /* CONFIG_DRM_CLIENT_SPLASH_LOAD_AS_FW */ + +static int drm_splash_client_hotplug(struct drm_client_dev *client) +{ + struct drm_splash *splash =3D client_to_drm_splash(client); + int ret; + + guard(mutex)(&splash->lock); + + /* The modesets that get a splash are defined at first hotplug event */ + if (splash->initialized) + return 0; + + ret =3D drm_splash_init_client(splash); + if (ret =3D=3D -ENODEV) { + drm_info(client->dev, "splash: no modeset found"); + return 0; + } else if (ret) { + drm_err(client->dev, + "splash: failed to init client: %d", ret); + return ret; + } + + /* Create the render thread, waken later */ + splash->thread =3D kthread_create(drm_splash_render_thread, + splash, "drm_splash_%s", + client->dev->unique); + if (IS_ERR(splash->thread)) { + ret =3D PTR_ERR(splash->thread); + drm_err(client->dev, "splash: failed to create render thread: %d", ret); + drm_splash_free_scanout(client); + return ret; + } + +#ifdef CONFIG_DRM_CLIENT_SPLASH_LOAD_AS_FW + if (!skip_image) { + ret =3D drm_splash_kick_fw_load(splash, splash->thread); + if (ret) { + drm_err(client->dev, "splash: failed to kick fw load: %d", ret); + kthread_stop(splash->thread); + drm_splash_free_scanout(client); + return ret; + } + } +#endif + + /* Wake the render thread to show initial contents */ + drm_splash_wake_render_thread(splash); + + splash->initialized =3D true; + + return 0; +} + +static void drm_splash_client_unregister(struct drm_client_dev *client) +{ + struct drm_splash *splash =3D client_to_drm_splash(client); + struct drm_device *dev =3D client->dev; + + kthread_stop(splash->thread); + device_del(&splash->dev); + drm_splash_free_scanout(client); + drm_client_release(client); + put_device(&splash->dev); + kfree(splash); + drm_dbg(dev, "Unregistered with drm splash"); +} + +static const struct drm_client_funcs drm_splash_client_funcs =3D { + .owner =3D THIS_MODULE, + .hotplug =3D drm_splash_client_hotplug, + .unregister =3D drm_splash_client_unregister, +}; + +static ssize_t progress_store(struct device *device, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct drm_splash *splash =3D dev_get_drvdata(device); + u8 progress; + int ret; + + ret =3D kstrtou8(buf, 0, &progress); + if (ret) + return ret; + + if (ret > 100) + return -ERANGE; + + scoped_guard(mutex, &splash->lock) + splash->progress =3D progress; + + drm_splash_wake_render_thread(splash); + + return count; +} +DEVICE_ATTR_WO(progress); + +static ssize_t message_store(struct device *device, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct drm_splash *splash =3D dev_get_drvdata(device); + size_t len =3D min(count, sizeof(splash->message)); + + scoped_guard(mutex, &splash->lock) + strscpy(splash->message, buf, len); + + drm_splash_wake_render_thread(splash); + + return count; +} +DEVICE_ATTR_WO(message); + +static ssize_t stop_store(struct device *device, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct drm_splash *splash =3D dev_get_drvdata(device); + unsigned long val; + int ret; + + ret =3D kstrtoul(buf, 0, &val); + if (ret) + return ret; + + if (val !=3D 0) + kthread_stop(splash->thread); + + return count; +} +DEVICE_ATTR_WO(stop); + +static struct attribute *drm_splash_attrs[] =3D { + &dev_attr_message.attr, + &dev_attr_progress.attr, + &dev_attr_stop.attr, + NULL +}; +ATTRIBUTE_GROUPS(drm_splash); + +/** + * drm_splash_register() - Register a drm device to drm_splash + * @dev: the drm device to register. + * @format: drm device preferred format. + */ +void drm_splash_register(struct drm_device *dev, + const struct drm_format_info *format) +{ + struct drm_splash *splash; + int ret; + + splash =3D kzalloc(sizeof(*splash), GFP_KERNEL); + if (!splash) + goto err_warn; + + mutex_init(&splash->lock); + if (format && format->num_planes =3D=3D 1) + splash->preferred_format =3D format->format; + + if (message) + strscpy(splash->message, message); + + if (drm_client_init(dev, &splash->client, "drm_splash", + &drm_splash_client_funcs)) + goto err_free; + + device_initialize(&splash->dev); + splash->dev.parent =3D dev->dev; + splash->dev.groups =3D drm_splash_groups; + dev_set_name(&splash->dev, "drm_splash"); + dev_set_drvdata(&splash->dev, splash); + ret =3D device_add(&splash->dev); + if (ret) + goto err_free; + + drm_client_register(&splash->client); + drm_dbg(dev, "Registered with drm splash"); + + return; + +err_free: + kfree(splash); +err_warn: + drm_warn(dev, "Failed to register with drm splash"); +} --=20 2.51.0 From nobody Sat Feb 7 06:54:43 2026 Received: from delivery.antispam.mailspamprotection.com (delivery.antispam.mailspamprotection.com [185.56.87.12]) (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 43F871FFC49; Sun, 26 Oct 2025 23:03:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.56.87.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761519830; cv=pass; b=QIFjxYwnh8ZRLvf4cpYfcGAlzMr+CX+S1fiS3l7xtnrO+WZiCVSPXmDn2KGxxgZRM2IWfgrTEDjd3rMHleOXsLAKZKgDCtLbm9Vhe2KCFY0dcUjrkZ5hb4A6bvEEqj7Mh150G2oNzFYNMP3qUK832heoDuWzsmxojzzppxQOHuY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761519830; c=relaxed/simple; bh=X85Z4DhxPeHwX9zmh4XP31D3/HzYWiFyWUzUtKstvdU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=l+yFYeMKq3Gy2GtKNJHEXYg7fpFIpi85sQrQct8Lpad4tY61cAJFK3FScZqKRNTCi1aTm6okzhkOjWW1stzbvvvgxjonikh9V33S+v2d6si7A4rTgwdhzwLM4+37ZomZhUR/q3jsARbJvT6Jdt5FEVC6kepiNWzxVp9I4nmsiAY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valla.it; spf=pass smtp.mailfrom=valla.it; dkim=pass (1024-bit key) header.d=antispam.mailspamprotection.com header.i=@antispam.mailspamprotection.com header.b=Zg2YUXJw; dkim=pass (1024-bit key) header.d=valla.it header.i=@valla.it header.b=XxFpk6Kn; arc=pass smtp.client-ip=185.56.87.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valla.it Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valla.it Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=antispam.mailspamprotection.com header.i=@antispam.mailspamprotection.com header.b="Zg2YUXJw"; dkim=pass (1024-bit key) header.d=valla.it header.i=@valla.it header.b="XxFpk6Kn" ARC-Seal: i=1; cv=none; a=rsa-sha256; d=outgoing.instance-europe-west4-4x87.prod.antispam.mailspamprotection.com; s=arckey; t=1761519828; b=KYKkKC/Bii56pqhCNUkm0nSELnxGh/bvupnGQ6PmwXMH2WtDzFnrojHlOXYJGiGLT5MbURl9t4 g+9KVsbi00Pu652HTTKnrRQ7RbcNTnKR+ZmLLZ9LWvtmOzLxfBVUnZo5ABtssBeSYtB6yosuhA 7Cf5P7VBm9215q/J6gWKCeWzQLWRSmNOauLmZudF54pyvh1SRptm7wZGJKRBkU+1vD8SgWkS6U Cdc2kKAWyTebFqtm7rIRsItSt16/UcZ8j34gLliwMmGzbGxL7N8v/z1iw8MatN35ifW2YrSwzm M/OPaZ3FCHlXC876nBl8Z0aHCwGfE5TewHrRpRfDmxFO6Q==; ARC-Authentication-Results: i=1; outgoing.instance-europe-west4-4x87.prod.antispam.mailspamprotection.com; smtp.remote-ip=35.214.173.214; iprev=pass (214.173.214.35.bc.googleusercontent.com) smtp.remote-ip=35.214.173.214; auth=pass (LOGIN) smtp.auth=esm19.siteground.biz; dkim=pass header.d=valla.it header.s=default header.a=rsa-sha256; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=outgoing.instance-europe-west4-4x87.prod.antispam.mailspamprotection.com; s=arckey; t=1761519828; bh=X85Z4DhxPeHwX9zmh4XP31D3/HzYWiFyWUzUtKstvdU=; h=Cc:To:In-Reply-To:References:Message-ID:Content-Transfer-Encoding: Content-Type:MIME-Version:Subject:Date:From:DKIM-Signature:DKIM-Signature; b=uQRCl5mX2JS7Eq2kykJHfGv9Pk6rxiVfG+jWEjX6qrTOs4BWCB/+0tmh8MWn/UnPrOItVrpeDX j2eI5qFZ3cJERMts/Tj77+NlpoQUfS1c9vuhIZTVo4OLe6lcOylZ+TYsJKacC7NZHJg3/pAIvT oefpplgFB/xDMqYF7t3+kFaiaTkW06UxXAwBaCpeI+b2HCYFqsFH1R9G1VHz+4iy8w45AaDz36 uiL0L8VKJMy95YvGKJABJz8GPbp6eGzqppn6GkzlpuVirMZ1lYKaY+K7gOQI0Mw9uRIy1pmiZA lscsFXS2SKl7LuVLQ2DFz0umjqFffp8r6dvdQzorzz1YIw==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=antispam.mailspamprotection.com; s=default; h=CFBL-Feedback-ID:CFBL-Address :Cc:To:Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject :Date:From:Reply-To:List-Unsubscribe; bh=9y3uMz1ds+GG7HsxTvljl2MUtAE+FKu5xxJF3oOFGCE=; b=Zg2YUXJwHjfvXHybSZA1bKjyKS 9HNaLDZojLYSqDKFBwB3whzsrgwJ9Qpcb+aWRnvwaJJbr5nzQwa42x1NP3QiZ31i6zybVfAFmGYx4 H+cqUtQ3MwXXMP1MszyciCJ4YAvul2rVzO+zKZ+cQthF4OW4rdXOWC+EG7bcfsaphC3Q=; Received: from 214.173.214.35.bc.googleusercontent.com ([35.214.173.214] helo=esm19.siteground.biz) by instance-europe-west4-4x87.prod.antispam.mailspamprotection.com with esmtpsa (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.98.1) (envelope-from ) id 1vD9lx-00000002wA9-43f2; Sun, 26 Oct 2025 23:03:39 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=valla.it; s=default; h=Cc:To:Subject:Date:From:list-help:list-unsubscribe: list-subscribe:list-post:list-owner:list-archive; bh=9y3uMz1ds+GG7HsxTvljl2MUtAE+FKu5xxJF3oOFGCE=; b=XxFpk6Kneh75XeaOaazc0LK8i9 dGxhpLI4WxmTA9hAjbjEJzFxdzy5JFZR/Zeq+tnwKW4nX5CW8WO+QwichOHs0NRgdrtFQhLeQQgXA u/HDY6pi4RoIbSJBYy23BDRfERUqA/yGgllGiPcFbUWqid2WAeJNNbYZ1QRwCnud0ZIw=; Received: from [87.17.42.198] (port=63736 helo=fedora.fritz.box) by esm19.siteground.biz with esmtpsa (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.98.1) (envelope-from ) id 1vD9lr-00000000KNm-2ji4; Sun, 26 Oct 2025 23:03:31 +0000 From: Francesco Valla Date: Mon, 27 Oct 2025 00:03:02 +0100 Subject: [PATCH RFC 2/3] MAINTAINERS: add entry for DRM splash client Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251027-drm_client_splash-v1-2-00698933b34a@valla.it> References: <20251027-drm_client_splash-v1-0-00698933b34a@valla.it> In-Reply-To: <20251027-drm_client_splash-v1-0-00698933b34a@valla.it> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Jocelyn Falempe , Javier Martinez Canillas Cc: Sam Ravnborg , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-embedded@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=845; i=francesco@valla.it; h=from:subject:message-id; bh=X85Z4DhxPeHwX9zmh4XP31D3/HzYWiFyWUzUtKstvdU=; b=owGbwMvMwCX2aH1OUIzHTgbG02pJDBn/Vhxk+pHU/d87/HulnfLb337npd7c6isK8fLyqTpxe 9/0tZcOd5SyMIhxMciKKbKErLtxb89c829pGxgfwcxhZQIZwsDFKQAT+W/IyLD7y7EJr/U/qRw0 ZPXTM/R+eflv3OfLr3ynTpt3/Pe5c0EOjAz7Dx9o2M5wPL34ZlBy3ZyaeIMjCeq2f3rO/W3UfJP 51pQXAA== X-Developer-Key: i=francesco@valla.it; a=openpgp; fpr=CC70CBC9AA13257C6CCED8669601767CA07CA0EA X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - esm19.siteground.biz X-AntiAbuse: Original Domain - vger.kernel.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - valla.it X-Source: X-Source-Args: X-Source-Dir: X-SGantispam-id: 175d9e30c1866352aadcb781a5fda938 AntiSpam-DLS: false AntiSpam-DLSP: AntiSpam-DLSRS: AntiSpam-TS: 1.0 CFBL-Address: feedback@antispam.mailspamprotection.com; report=arf CFBL-Feedback-ID: 1vD9lx-00000002wA9-43f2-feedback@antispam.mailspamprotection.com Authentication-Results: outgoing.instance-europe-west4-4x87.prod.antispam.mailspamprotection.com; iprev=pass (214.173.214.35.bc.googleusercontent.com) smtp.remote-ip=35.214.173.214; auth=pass (LOGIN) smtp.auth=esm19.siteground.biz; dkim=pass header.d=valla.it header.s=default header.a=rsa-sha256; arc=none Add myself as maintainer for the DRM splash client. Signed-off-by: Francesco Valla --- MAINTAINERS | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 3da2c26a796b82b9de4143c1591a9b1d44d42194..b365a6199dd427b0c66452cbc41= 9d1fc0618c502 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8643,6 +8643,13 @@ T: git https://gitlab.freedesktop.org/drm/misc/kerne= l.git F: drivers/gpu/drm/drm_privacy_screen* F: include/drm/drm_privacy_screen* =20 +DRM SPLASH +M: Francesco Valla +L: dri-devel@lists.freedesktop.org +S: Maintained +T: git https://gitlab.freedesktop.org/drm/misc/kernel.git +F: drivers/gpu/drm/clients/drm_splash.c + DRM TTM SUBSYSTEM M: Christian Koenig M: Huang Rui --=20 2.51.0 From nobody Sat Feb 7 06:54:43 2026 Received: from delivery.antispam.mailspamprotection.com (delivery.antispam.mailspamprotection.com [185.56.87.11]) (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 3642423EABC; Sun, 26 Oct 2025 23:03:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.56.87.11 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761519831; cv=pass; b=j0XjVBnTi8sojlQL5xLAxi30Gqp1KYRVYM6xJh+ZI7HFQJBF6W1q2qDh+U1vLQWM5/NCPT5Seswfs/mMD1shFMC8q7ClbuZmoBv+VUGVsZzUECeyOK1/Vlmvhol0IkA8D4EFWhSNYUEYSj3FrcAM3mw9I+pXkTrGNaECIoIXo4g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761519831; c=relaxed/simple; bh=tSRixNkLhCUmU1E1Uy9yxAjJii9EPv9NuRcTEhUazSM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lXPa+3NT3YMOhIn5lH7dsYFQ7dtBsqYmyMUXW3cZ/n0vdLz2V1YxTm4ucwaTxqTR0YacpNMbJDU7jjUEJ66Q8dXcg73uD6jP19MOEi+kPAIFTVUdy0KmIWAKc4HW5rXagMj1YkR1Zx0ApJEFKZXyfljXUJyJQPZHGAsY26C9rmo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valla.it; spf=pass smtp.mailfrom=valla.it; dkim=pass (1024-bit key) header.d=antispam.mailspamprotection.com header.i=@antispam.mailspamprotection.com header.b=l0UefmQU; dkim=pass (1024-bit key) header.d=valla.it header.i=@valla.it header.b=bkyePVvY; arc=pass smtp.client-ip=185.56.87.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valla.it Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valla.it Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=antispam.mailspamprotection.com header.i=@antispam.mailspamprotection.com header.b="l0UefmQU"; dkim=pass (1024-bit key) header.d=valla.it header.i=@valla.it header.b="bkyePVvY" ARC-Seal: i=1; cv=none; a=rsa-sha256; d=outgoing.instance-europe-west4-4x87.prod.antispam.mailspamprotection.com; s=arckey; t=1761519829; b=yr+JFNhGBdFwQfakR0gIhpgbDR2DvAVaM1HjX0UDFHdcIqKPMMX7/aX0SwXrqqgkwuaH3bnHwE YRhineQ/W8ApSEou4vh39OaoJse7YCIebssRgsmXgzTfAba7cBshAZdaAlCpFCGT4UJHjUAyV+ GvzzCAvqbCzQuiARLRNH1PYwRIVDHSdEFQ8379fQZWFS3uUjseQsNT0eH+CKSA7ckL5GqLGDkl +qTJmHLblL8GSAUdtaKUoTbgdyQihDhLb1DndgMfA1KiLSOXL1LgBfa4+yW2ipR3AXt6oTrUZG xPbTXxA3OByVB7NMuUKqbPX8aZmJq/Z48nRI0HcLStdU7Q==; ARC-Authentication-Results: i=1; outgoing.instance-europe-west4-4x87.prod.antispam.mailspamprotection.com; smtp.remote-ip=35.214.173.214; iprev=pass (214.173.214.35.bc.googleusercontent.com) smtp.remote-ip=35.214.173.214; auth=pass (LOGIN) smtp.auth=esm19.siteground.biz; dkim=pass header.d=valla.it header.s=default header.a=rsa-sha256; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=outgoing.instance-europe-west4-4x87.prod.antispam.mailspamprotection.com; s=arckey; t=1761519829; bh=tSRixNkLhCUmU1E1Uy9yxAjJii9EPv9NuRcTEhUazSM=; h=Cc:To:In-Reply-To:References:Message-ID:Content-Transfer-Encoding: Content-Type:MIME-Version:Subject:Date:From:DKIM-Signature:DKIM-Signature; b=FaB4tLwD8bWZltLZj9xcOaWk0Ap9/d9NOw/byzCAMfUMzME7Sp6M30I8DOQxXVsbqEyK8B8EHs TJk7a9MUH0h13sqhGRuujMwCqNGB5TDyl69CH6Yn/g7dieC0CyyN5Ea31oXQNKPbFjq4N7iHJI sgGS4x15JJdSNGvgG4GolP0cQkIbdlIkyAd7LxMRiVJABN9ZK4k7MeES6w+aQdhbvVS0HzIU7u zR0skE1CcwZAsbnfpyAVlL8XZtZ8Nn7j06xW6N/9iOVT0NwuQHjrvNyyQ4hV5edjop6vCYeQJc gm6yazzuLSDMl6tOcAmYrmPpXVXTkEVt9O8Qhtt/BYAeaQ==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=antispam.mailspamprotection.com; s=default; h=CFBL-Feedback-ID:CFBL-Address :Cc:To:Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject :Date:From:Reply-To:List-Unsubscribe; bh=JWB6QTvpgPfu9uLg/5WttzxYcN0yMoWXBCd3a+bQgKo=; b=l0UefmQU7CUZr4Bsf5ZLmYyJvC 93gDYsnkQ8sn8rzP2AoXYOxh3aC5PktcT0QG9GBnVZZaepnEO+FEiCIo85tUyqEXIHlqepOJLF2d+ eTam5PPBuRG6KwZmVjLq8nr9ShdvUAfkP5zRWjZg7zwT+xariTCN1RgyV1RsRt2LDAxA=; Received: from 214.173.214.35.bc.googleusercontent.com ([35.214.173.214] helo=esm19.siteground.biz) by instance-europe-west4-4x87.prod.antispam.mailspamprotection.com with esmtpsa (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.98.1) (envelope-from ) id 1vD9ly-00000002wBt-3K2Y; Sun, 26 Oct 2025 23:03:40 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=valla.it; s=default; h=Cc:To:Subject:Date:From:list-help:list-unsubscribe: list-subscribe:list-post:list-owner:list-archive; bh=JWB6QTvpgPfu9uLg/5WttzxYcN0yMoWXBCd3a+bQgKo=; b=bkyePVvYy8jjGA4QRC03eqSlwN iUW+HaYTcxdxuWtbQEtjFhZLT0tNzzgtJQTH+i2D4EeVx+tFh2uNcoEGPR3d0doAS7AhEsDISrhr4 xh2SReiC3JkiQPg/KW4EW9KAX+XCXMWL0/7tNpU4eY936Ndx6MD8+VsQ221PwyfJ/A+M=; Received: from [87.17.42.198] (port=63736 helo=fedora.fritz.box) by esm19.siteground.biz with esmtpsa (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.98.1) (envelope-from ) id 1vD9ls-00000000KNm-1zj3; Sun, 26 Oct 2025 23:03:32 +0000 From: Francesco Valla Date: Mon, 27 Oct 2025 00:03:03 +0100 Subject: [PATCH RFC 3/3] drm: docs: remove bootsplash from TODO Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251027-drm_client_splash-v1-3-00698933b34a@valla.it> References: <20251027-drm_client_splash-v1-0-00698933b34a@valla.it> In-Reply-To: <20251027-drm_client_splash-v1-0-00698933b34a@valla.it> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Jocelyn Falempe , Javier Martinez Canillas Cc: Sam Ravnborg , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, linux-embedded@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1227; i=francesco@valla.it; h=from:subject:message-id; bh=tSRixNkLhCUmU1E1Uy9yxAjJii9EPv9NuRcTEhUazSM=; b=owGbwMvMwCX2aH1OUIzHTgbG02pJDBn/VhxMPK7UHncreNrkNzMDXycvXXJ2zgyT+7sWcr07/ H9Fuu2T+x2lLAxiXAyyYoosIetu3Nsz1/xb2gbGRzBzWJlAhjBwcQrARKI3MzIsyrd8U1UZxblQ 1+jdmktOM9v2GMrpibOHMaeuuhq00TWe4Z/J7V+pv7f//V9tLj0xuc9M5PPfW5uYjtdeDOhYL7X iwHV+AA== X-Developer-Key: i=francesco@valla.it; a=openpgp; fpr=CC70CBC9AA13257C6CCED8669601767CA07CA0EA X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - esm19.siteground.biz X-AntiAbuse: Original Domain - vger.kernel.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - valla.it X-Source: X-Source-Args: X-Source-Dir: X-SGantispam-id: 6185ed05db714419c33ff6120ab25f26 AntiSpam-DLS: false AntiSpam-DLSP: AntiSpam-DLSRS: AntiSpam-TS: 1.0 CFBL-Address: feedback@antispam.mailspamprotection.com; report=arf CFBL-Feedback-ID: 1vD9ly-00000002wBt-3K2Y-feedback@antispam.mailspamprotection.com Authentication-Results: outgoing.instance-europe-west4-4x87.prod.antispam.mailspamprotection.com; iprev=pass (214.173.214.35.bc.googleusercontent.com) smtp.remote-ip=35.214.173.214; auth=pass (LOGIN) smtp.auth=esm19.siteground.biz; dkim=pass header.d=valla.it header.s=default header.a=rsa-sha256; arc=none Now that a splash client exists, remove the bootsplash task from the TODO list for the DRM subsystem. Signed-off-by: Francesco Valla --- Documentation/gpu/todo.rst | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/Documentation/gpu/todo.rst b/Documentation/gpu/todo.rst index b5f58b4274b1d38e26b229b88a8b4f4ba3433179..b1a6d587c286f060d549a12cf8e= 771f753b712bc 100644 --- a/Documentation/gpu/todo.rst +++ b/Documentation/gpu/todo.rst @@ -717,23 +717,6 @@ See drivers/gpu/drm/amd/display/TODO for tasks. =20 Contact: Harry Wentland, Alex Deucher =20 -Bootsplash -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D - -There is support in place now for writing internal DRM clients making it -possible to pick up the bootsplash work that was rejected because it was w= ritten -for fbdev. - -- [v6,8/8] drm/client: Hack: Add bootsplash example - https://patchwork.freedesktop.org/patch/306579/ - -- [RFC PATCH v2 00/13] Kernel based bootsplash - https://lore.kernel.org/r/20171213194755.3409-1-mstaudt@suse.de - -Contact: Sam Ravnborg - -Level: Advanced - Brightness handling on devices with multiple internal panels =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 --=20 2.51.0