From ab4238d54813561d3ad0e50684504d67e4c5ba96 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 7 Mar 2022 12:25:56 +0100 Subject: [PATCH 1/2] ply-utils: Reintroduce ply_string_has_prefix helper ply_string_has_prefix was dropped in commit c7965ea19abf ("ply-utils: Drop unused ply_string_has_prefix helper"). We have a need for this helper again, so reintroduce it. Signed-off-by: Hans de Goede --- src/libply/ply-utils.c | 9 +++++++++ src/libply/ply-utils.h | 1 + 2 files changed, 10 insertions(+) diff --git a/src/libply/ply-utils.c b/src/libply/ply-utils.c index f90ac40a..f457579c 100644 --- a/src/libply/ply-utils.c +++ b/src/libply/ply-utils.c @@ -459,6 +459,15 @@ ply_free_string_array (char **array) free (array); } +bool +ply_string_has_prefix (const char *str, const char *prefix) +{ + if (str == NULL || prefix == NULL) + return false; + + return strncmp (str, prefix, strlen (prefix)) == 0; +} + double ply_get_timestamp (void) { diff --git a/src/libply/ply-utils.h b/src/libply/ply-utils.h index 47bb3f24..7572cca2 100644 --- a/src/libply/ply-utils.h +++ b/src/libply/ply-utils.h @@ -85,6 +85,7 @@ bool ply_fd_has_data (int fd); bool ply_set_fd_as_blocking (int fd); char **ply_copy_string_array (const char *const *array); void ply_free_string_array (char **array); +bool ply_string_has_prefix (const char *str, const char *prefix); double ply_get_timestamp (void); void ply_save_errno (void); From 83b385061ccbf5a46ea77f7f12c1c7bfc72a09f2 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 28 Feb 2022 16:07:11 +0100 Subject: [PATCH 2/2] ply-device-manager: Treat SimpleDRM drm devices as fbdev devices Simple-framebuffer devices driven by simpledrm lack information like panel-rotation info and physical size, causing the splash to briefly render on its side / without HiDPI scaling, switching to the correct rendering when the native driver loads. To avoid this treat simpledrm devices as fbdev devices and only use them after the timeout. Also adds 2 exceptions to this: 1. If nomodeset is passed on the kernel commandline then no native drivers will load, so in this case it is best to immediately use SimpleDRM devices when they are detected. 2. On some devics the firmware leave the panel black at boot. In this case it is desirable to show the splash to the user ASAP so that there is some visual feedback that the device is booting. Add a support for a "plymouth.use-simpledrm" kernel cmdline option to show the splash immediately on SimpleDRM devices rather then waiting for the native driver to load. Closes #167 Signed-off-by: Hans de Goede --- src/libply-splash-core/ply-device-manager.c | 39 +++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c index bb548ef8..82b89f35 100644 --- a/src/libply-splash-core/ply-device-manager.c +++ b/src/libply-splash-core/ply-device-manager.c @@ -405,6 +405,40 @@ on_drm_udev_add_or_change (ply_device_manager_t *manager, } } +static bool +verify_drm_device (struct udev_device *device) +{ + const char *id_path; + + /* + * Simple-framebuffer devices driven by simpledrm lack information + * like panel-rotation info and physical size, causing the splash + * to briefly render on its side / without HiDPI scaling, switching + * to the correct rendering when the native driver loads. + * To avoid this treat simpledrm devices as fbdev devices and only + * use them after the timeout. + */ + id_path = udev_device_get_property_value (device, "ID_PATH"); + if (!ply_string_has_prefix (id_path, "platform-simple-framebuffer")) + return true; /* Not a SimpleDRM device */ + + /* + * With nomodeset, no native drivers will load, so SimpleDRM devices + * should be used immediately. + */ + if (ply_kernel_command_line_has_argument ("nomodeset")) + return true; + + /* + * Some firmwares leave the panel black at boot. Allow enabling SimpleDRM + * use from the cmdline to show something to the user ASAP. + */ + if (ply_kernel_command_line_has_argument ("plymouth.use-simpledrm")) + return true; + + return false; +} + static bool verify_add_or_change (ply_device_manager_t *manager, const char *action, @@ -423,6 +457,11 @@ verify_add_or_change (ply_device_manager_t *manager, ply_trace ("ignoring since we're already using text splash for local console"); return false; } + + if (!verify_drm_device (device)) { + ply_trace ("ignoring since we only handle SimpleDRM devices after timeout"); + return false; + } } else { ply_trace ("ignoring since we only handle subsystem %s devices after timeout", subsystem); return false;