diff --git a/Documentation/ABI/testing/sysfs-platform-bootsplash b/Documentation/ABI/testing/sysfs-platform-bootsplash index 742c7b035ded..f8f4b259220e 100644 --- a/Documentation/ABI/testing/sysfs-platform-bootsplash +++ b/Documentation/ABI/testing/sysfs-platform-bootsplash @@ -9,3 +9,35 @@ Description: 1: Splash is shown whenever fbcon would show a text console (i.e. no graphical application is running), and a splash file is loaded. + +What: /sys/devices/platform/bootsplash.0/drop_splash +Date: Oct 2017 +KernelVersion: 4.14 +Contact: Max Staudt +Description: + Can only be set. + + Any value written will cause the current splash theme file + to be unloaded and the text console to be redrawn. + +What: /sys/devices/platform/bootsplash.0/load_file +Date: Oct 2017 +KernelVersion: 4.14 +Contact: Max Staudt +Description: + Can only be set. + + Any value written will cause the splash to be disabled and + internal memory structures to be freed. + + A firmware path written will cause a new theme file to be + loaded and the current bootsplash to be replaced. + The current enabled/disabled status is not touched. + If the splash is already active, it will be redrawn. + + The path has to be a path in /lib/firmware since + request_firmware() is used to fetch the data. + + When setting the splash from the shell, echo -n has to be + used as any trailing '\n' newline will be interpreted as + part of the path. diff --git a/Documentation/bootsplash.rst b/Documentation/bootsplash.rst index 611f0c558925..b35aba5093e8 100644 --- a/Documentation/bootsplash.rst +++ b/Documentation/bootsplash.rst @@ -67,6 +67,14 @@ sysfs run-time configuration a splash theme file is also loaded. +``/sys/devices/platform/bootsplash.0/drop_splash`` + Unload splash data and free memory. + +``/sys/devices/platform/bootsplash.0/load_file`` + Load a splash file from ``/lib/firmware/``. + Note that trailing newlines will be interpreted as part of the file name. + + Kconfig ======= diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c index 13fcaabbc2ca..16cb0493629d 100644 --- a/drivers/video/fbdev/core/bootsplash.c +++ b/drivers/video/fbdev/core/bootsplash.c @@ -251,11 +251,65 @@ static ssize_t splash_store_enabled(struct device *device, return count; } +static ssize_t splash_store_drop_splash(struct device *device, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct splash_file_priv *fp; + + if (!buf || !count || !splash_state.file) + return count; + + mutex_lock(&splash_state.data_lock); + fp = splash_state.file; + splash_state.file = NULL; + mutex_unlock(&splash_state.data_lock); + + /* Redraw the text console */ + schedule_work(&splash_state.work_redraw_vc); + + bootsplash_free_file(fp); + + return count; +} + +static ssize_t splash_store_load_file(struct device *device, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct splash_file_priv *fp, *fp_old; + + if (!count) + return 0; + + fp = bootsplash_load_firmware(&splash_state.splash_device->dev, + buf); + + if (!fp) + return -ENXIO; + + mutex_lock(&splash_state.data_lock); + fp_old = splash_state.file; + splash_state.splash_fb = NULL; + splash_state.file = fp; + mutex_unlock(&splash_state.data_lock); + + /* Update the splash or text console */ + schedule_work(&splash_state.work_redraw_vc); + + bootsplash_free_file(fp_old); + return count; +} + static DEVICE_ATTR(enabled, 0644, splash_show_enabled, splash_store_enabled); +static DEVICE_ATTR(drop_splash, 0200, NULL, splash_store_drop_splash); +static DEVICE_ATTR(load_file, 0200, NULL, splash_store_load_file); static struct attribute *splash_dev_attrs[] = { &dev_attr_enabled.attr, + &dev_attr_drop_splash.attr, + &dev_attr_load_file.attr, NULL };