From: "Màxim Pedraza Padilla" <maximpedraza@gmail.com>
To: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Zimmermann <tzimmermann@suse.de>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Ard Biesheuvel <ardb@kernel.org>,
Jonathan Corbet <corbet@lwn.net>
Cc: Francesco Valla <francesco@valla.it>,
Mario Limonciello <mario.limonciello@amd.com>,
Javier Martinez Canillas <javierm@redhat.com>,
Jocelyn Falempe <jfalempe@redhat.com>,
Sam Ravnborg <sam@ravnborg.org>,
Ilias Apalodimas <ilias.apalodimas@linaro.org>,
Shuah Khan <skhan@linuxfoundation.org>,
Randy Dunlap <rdunlap@infradead.org>,
dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org,
linux-efi@vger.kernel.org, linux-doc@vger.kernel.org,
linux-embedded@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH RFC v4 00/13] Add splash DRM client
Date: Thu, 1 Oct 2026 21:58:34 +0200 [thread overview]
Message-ID: <20261001195847.141192-1-maximpedraza@gmail.com> (raw)
This is the fourth version of Francesco's splash client, which I have
taken over with his agreement [1]. It also supersedes my "Boot logo
supplied by the device tree" series [2]: Thomas pointed out that fbdev
is not the place for it and that the device tree support belongs here
[3], and he was right.
The client draws a splash from the moment the display driver registers
until userspace takes the display over. On top of what v3 did, the image
can now come from the device tree, be placed and turned, and every part
of that can be set from the command line. Patch 13 documents it all and
adds it to the DRM client documentation.
Why this is in the kernel
-------------------------
Maxime asked in v1 why this should not be left to userspace or to the
bootloader. The cases it is for are the ones neither covers:
- Nothing initialises the display before the kernel does. U-Boot's
Falcon mode, meant to cut boot time, starts the kernel from the SPL
and never runs U-Boot proper, where display support lives: there is
no bootloader splash to hand over, and the device tree is the only
thing that reaches the kernel. Userspace comes seconds later.
- One kernel image for several products. An image built into the
kernel, with CONFIG_EXTRA_FIRMWARE, means one kernel per logo, or
every logo in every product's kernel, all of them staying in memory
for good. Francesco described exactly this case in v2: one board
support package for a family of devices, each with its own logo and
background, picked by the bootloader.
- A splash handed over from the bootloader does not always survive the
native driver taking over the display.
Where the image comes from
--------------------------
In this order: a BMP named on the command line, the device tree, the
EFI BGRT, and "drm_splash.bmp" loaded as firmware; with none of them,
only the background is drawn.
The device tree node lives under /chosen (patch 6) and carries the BMP
either in the node, which dtc fills in with /incbin/, or in a reserved
memory region the bootloader loaded it into. The region keeps the image
out of the device tree, so that it can be changed from userspace by
updating a partition, as Francesco suggested. A node is only there if
someone put it there for that board, so it goes before the BGRT.
The command line wins over everything else, each parameter for its own
part only, as console= wins over stdout-path: splash_bmp (or "none"),
splash_color, splash_pos, splash_offset and splash_rotation. Without it
a BMP loaded as firmware could be neither placed nor turned, and it lets
a placement be tried without rebuilding a device tree.
Placement uses a position with -1 centring an axis, plus an offset, in
screen pixels. A rotation turns the image and not the screen, counter
clockwise as for panels and as DRM_MODE_ROTATE_* count. A device tree
image is placed as its node says, a BGRT image at the table offsets, and
anything else is centred; placement given on the command line applies
whatever the source.
BGRT images with the ACPI 6.2 orientation bits set are no longer skipped
but turned (patch 11). I took the meaning of the bits and of the offsets
from Plymouth, the main user of the BGRT, so that the kernel and
Plymouth put the image in the same place and the handover does not
jump. I have not found the specification text to check against;
corrections are welcome.
Changes since v3
----------------
Fixes to Francesco's patches, folded in and listed in the commit notes;
most of them were also in sashiko's review of v3 [4]:
- the render thread stayed in TASK_UNINTERRUPTIBLE for good when the
BMP firmware was missing (hung task warning), could miss a wake up,
and kthread_stop() was called on a thread that had already exited
(use-after-free), never existed or failed to start;
- a use-after-free on unbind: the image was released after
drm_client_release(), which frees the client;
- a use-after-free in the firmware callback when the device goes away
first, as the request cannot be cancelled; unregister now waits;
- the BMP bounds check could overflow and let a crafted bitmap offset
read 4 GiB away;
- the 24 bit blitters read a byte past the image;
- buffers went to the wrong modesets when one was skipped, tiled
groups dereferenced a buffer before creating it and swapped width
and height, a failed dumb buffer left an ERR_PTR behind, and the
modeset list was walked without modeset_mutex;
- the BGRT symbols are exported (Mario's report [5]), GPL only;
- the DRM_CLIENT_DEFAULT entry is indented with tabs (patch 1).
Additions: the device tree source and its binding, placement, rotation,
the background colour following the image, BGRT orientation, the
command line parameters, and the documentation.
Testing
-------
- QEMU versatilepb (pl111, 16 bpp): 39 cases for the device tree
source (inline and region, invalid nodes, placement, clamping,
rotations, rows with and without padding, backgrounds), plus 17 for
the command line and the order of the sources, each compared pixel
by pixel.
- QEMU virt arm64 (virtio-gpu, 32 bpp) and x86-64 with OVMF for the
BGRT, including forced orientation bits.
- KASAN on arm64, with the BMP loaded as firmware and the driver
unbound afterwards: v3 reports the out-of-bounds read, the
use-after-frees and hangs on unbind; this version reports nothing.
The firmware callback race was reproduced with the sysfs fallback,
and a BMP with a crafted bitmap offset oopses v3 and is rejected
here.
- An AM335x board (tilcdc, 800x480 panel of which only the bottom 297
lines are visible, 16 bpp), booting over TFTP and NFS: 27 cases,
plus 9 with the BMP loaded as firmware from an initramfs, checked
by reading the scanout buffer back through /dev/mem.
- W=1 and sparse clean; every patch builds on its own on arm and
x86-64; checkpatch --strict clean apart from a quoted modpost line
and the MAINTAINERS reminder answered by the next patch;
dt_binding_check clean for the binding.
Not tested: tiled displays (I have none), a BGRT with orientation bits
from real firmware, the modeset fix with a skipped modeset ahead of a
used one, and Falcon mode with this series.
Open questions
--------------
- Rob: how the image should be described, a BMP in a property or raw
pixels described like simple-framebuffer [6]. The binding here uses
the BMP; the client would need a second drawing path for the other.
- Once the binding settles I will send the dt-schema change that lets
the node live under /chosen; until then dtbs_check flags it.
- The splash is a DRM client, so a device using it has no fbdev
emulation and no /dev/fb0. That rules it out where userspace still
draws through fbdev.
To Francesco: I listed you as maintainer of the binding too, next to me,
as co-maintainer of the client that reads it. Say if you would rather
not be.
Based on drm-misc-next as of 2026-10-01 (7c4bda20eb0f).
[1] https://lore.kernel.org/all/aryqYhHqFk3cXh9d@bywater/
[2] https://lore.kernel.org/all/20260923201035.51007-1-maximpedraza@gmail.com/
[3] https://lore.kernel.org/all/64e273d4-2660-437d-8871-e2bfa3c377c9@suse.de/
[4] https://sashiko.dev/#/patchset/20260510-drm_client_splash-v3-0-a9aee9f0b2fc%40valla.it
[5] https://lore.kernel.org/dri-devel/5d7067de-97b7-4232-9cf6-e4b978696482@amd.com/
[6] https://lore.kernel.org/all/CAEUXW=Gh6wMk1i=x_KT0eSdkHeHs8Hkxkj4hfsuTRyY6=aphpw@mail.gmail.com/
v3: https://lore.kernel.org/r/20260510-drm_client_splash-v3-0-a9aee9f0b2fc@valla.it
v2: https://lore.kernel.org/r/20260106-drm_client_splash-v2-0-6e86a7434b59@valla.it
v1: https://lore.kernel.org/r/20251027-drm_client_splash-v1-0-00698933b34a@valla.it
Màxim
Francesco Valla (3):
drm: client: add splash client
MAINTAINERS: add entry for DRM splash client
drm: docs: remove bootsplash from TODO
Màxim Pedraza Padilla (10):
drm/clients: Kconfig: indent DRM_CLIENT_DEFAULT with tabs
efi: bgrt: export the BGRT table and image size
dt-bindings: display: add a boot logo node under /chosen
drm/client: splash: add a device tree image source
drm/client: splash: place the device tree image where it asks
drm/client: splash: turn the device tree image as it asks
drm/client: splash: take the background colour from the image source
drm/client: splash: turn the BGRT image on panels mounted turned
drm/client: splash: prefer what the command line asks for
drm/client: splash: document the image sources and parameters
.../bindings/display/boot-logo.yaml | 151 ++
Documentation/gpu/drm-client.rst | 6 +
Documentation/gpu/todo.rst | 17 -
MAINTAINERS | 9 +
drivers/firmware/efi/efi-bgrt.c | 3 +
drivers/gpu/drm/clients/Kconfig | 91 +-
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 | 1471 +++++++++++++++++
10 files changed, 1743 insertions(+), 23 deletions(-)
create mode 100644 Documentation/devicetree/bindings/display/boot-logo.yaml
create mode 100644 drivers/gpu/drm/clients/drm_splash.c
base-commit: 7c4bda20eb0f150315d19f1b51058820e75d3f3d
--
2.39.5
next reply other threads:[~2026-10-01 19:58 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-01 19:58 Màxim Pedraza Padilla [this message]
2026-10-01 19:58 ` [PATCH RFC v4 01/13] drm/clients: Kconfig: indent DRM_CLIENT_DEFAULT with tabs Màxim Pedraza Padilla
2026-10-01 19:58 ` [PATCH RFC v4 02/13] efi: bgrt: export the BGRT table and image size Màxim Pedraza Padilla
2026-10-01 19:58 ` [PATCH RFC v4 03/13] drm: client: add splash client Màxim Pedraza Padilla
2026-10-01 19:58 ` [PATCH RFC v4 04/13] MAINTAINERS: add entry for DRM " Màxim Pedraza Padilla
2026-10-01 19:58 ` [PATCH RFC v4 05/13] drm: docs: remove bootsplash from TODO Màxim Pedraza Padilla
2026-10-01 19:58 ` [PATCH RFC v4 06/13] dt-bindings: display: add a boot logo node under /chosen Màxim Pedraza Padilla
2026-10-01 19:58 ` [PATCH RFC v4 07/13] drm/client: splash: add a device tree image source Màxim Pedraza Padilla
2026-10-01 19:58 ` [PATCH RFC v4 08/13] drm/client: splash: place the device tree image where it asks Màxim Pedraza Padilla
2026-10-01 19:58 ` [PATCH RFC v4 09/13] drm/client: splash: turn the device tree image as " Màxim Pedraza Padilla
2026-10-01 19:58 ` [PATCH RFC v4 10/13] drm/client: splash: take the background colour from the image source Màxim Pedraza Padilla
2026-10-01 19:58 ` [PATCH RFC v4 11/13] drm/client: splash: turn the BGRT image on panels mounted turned Màxim Pedraza Padilla
2026-10-01 19:58 ` [PATCH RFC v4 12/13] drm/client: splash: prefer what the command line asks for Màxim Pedraza Padilla
2026-10-01 19:58 ` [PATCH RFC v4 13/13] drm/client: splash: document the image sources and parameters Màxim Pedraza Padilla
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261001195847.141192-1-maximpedraza@gmail.com \
--to=maximpedraza@gmail.com \
--cc=airlied@gmail.com \
--cc=ardb@kernel.org \
--cc=conor+dt@kernel.org \
--cc=corbet@lwn.net \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=francesco@valla.it \
--cc=ilias.apalodimas@linaro.org \
--cc=javierm@redhat.com \
--cc=jfalempe@redhat.com \
--cc=krzk+dt@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-efi@vger.kernel.org \
--cc=linux-embedded@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mario.limonciello@amd.com \
--cc=mripard@kernel.org \
--cc=rdunlap@infradead.org \
--cc=robh@kernel.org \
--cc=sam@ravnborg.org \
--cc=simona@ffwll.ch \
--cc=skhan@linuxfoundation.org \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®