From patchwork Wed Jan 17 20:54:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: 'Max Staudt X-Patchwork-Id: 10171581 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id CAAC9603ED for ; Wed, 17 Jan 2018 20:57:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BC92B21C9A for ; Wed, 17 Jan 2018 20:57:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B163422380; Wed, 17 Jan 2018 20:57:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 51BEC21C9A for ; Wed, 17 Jan 2018 20:57:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754885AbeAQU5J (ORCPT ); Wed, 17 Jan 2018 15:57:09 -0500 Received: from mx2.suse.de ([195.135.220.15]:34483 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932377AbeAQU4M (ORCPT ); Wed, 17 Jan 2018 15:56:12 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id B89A2AF7E; Wed, 17 Jan 2018 20:56:06 +0000 (UTC) From: Max Staudt To: b.zolnierkie@samsung.com, linux-fbdev@vger.kernel.org Cc: mstaudt@suse.de, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, tiwai@suse.com, oneukum@suse.com, msrb@suse.com, sndirsch@suse.com, michal@markovi.net, philm@manjaro.org, bernhard.rosenkranzer@linaro.org, kernel.max@enpas.org Subject: [RFC PATCH v3 11/13] bootsplash: sysfs entries to load and unload files Date: Wed, 17 Jan 2018 21:54:33 +0100 Message-Id: <20180117205435.2860-12-mstaudt@suse.de> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20180117205435.2860-1-mstaudt@suse.de> References: <20180117205435.2860-1-mstaudt@suse.de> Sender: linux-fbdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fbdev@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Users can use this to replace their splash screen at runtime by writing a path and filename to /sys/devices/platform/bootsplash.0/load_file and making sure the splash is enabled. Notes: - 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. Writes to /sys/devices/platform/bootsplash.0/drop_splash will cause the current splash theme to be freed and the console to switch to text mode, Signed-off-by: Max Staudt --- .../ABI/testing/sysfs-platform-bootsplash | 32 +++++++++++++ Documentation/bootsplash.rst | 8 ++++ drivers/video/fbdev/core/bootsplash.c | 54 ++++++++++++++++++++++ 3 files changed, 94 insertions(+) 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 };