linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/1] platform/x86: Add Slim Bootloader firmware update support
@ 2020-04-23 22:42 Jithu Joseph
  2020-04-23 22:42 ` [PATCH v2 1/1] platform/x86: Add Slim Bootloader firmware update signaling driver Jithu Joseph
  2020-04-24 11:08 ` [PATCH v2 0/1] platform/x86: Add Slim Bootloader firmware update support Andy Shevchenko
  0 siblings, 2 replies; 5+ messages in thread
From: Jithu Joseph @ 2020-04-23 22:42 UTC (permalink / raw)
  To: dvhart, andy
  Cc: platform-driver-x86, linux-kernel, maurice.ma, ravi.p.rangarajan,
	sean.v.kelley, kuo-lang.tseng, Jithu Joseph

v1 Upstream submission is available here:
https://lore.kernel.org/lkml/20200420194405.8281-1-jithu.joseph@intel.com

v2 primarily addresses review comments from Andy Shevchenko to v1. 

Changes in v2
 - Rebased on top of tag: v5.7-rc2
 - Added ABI documentation file
 - Changed the ordering of SBL entry in Makefile and Kconfig
 - Replaced kstrtobool() with kstrtouint() for user input processing
 - Added DocLink: tag to annottate weblink in commit message
 - Minor edits to commit message in p1/1
 - Style related changes

From v1 submission:

Slim Bootloader(SBL) [see link below] is a small open-source boot
firmware, designed for running on certain Intel platforms. SBL can be
thought-of as fulfilling the role of a minimal BIOS
implementation, i.e initializing the hardware and booting
Operating System.

This driver creates sysfs interfaces which allows user space entities
to trigger update of SBL firmware.

Acknowledgment: Initial draft of the driver code was authored by
Maurice Ma <maurice.ma@intel.com>

DocLink: https://slimbootloader.github.io

Jithu Joseph (1):
  platform/x86: Add Slim Bootloader firmware update signaling driver

 .../ABI/testing/sysfs-platform-sbl-fwu-wmi    |  12 ++
 MAINTAINERS                                   |   7 +
 drivers/platform/x86/Kconfig                  |  10 ++
 drivers/platform/x86/Makefile                 |   1 +
 drivers/platform/x86/sbl_fwu_wmi.c            | 144 ++++++++++++++++++
 5 files changed, 174 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-platform-sbl-fwu-wmi
 create mode 100644 drivers/platform/x86/sbl_fwu_wmi.c


base-commit: ae83d0b416db002fe95601e7f97f64b59514d936
-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/1] platform/x86: Add Slim Bootloader firmware update signaling driver
  2020-04-23 22:42 [PATCH v2 0/1] platform/x86: Add Slim Bootloader firmware update support Jithu Joseph
@ 2020-04-23 22:42 ` Jithu Joseph
  2020-04-24 11:08 ` [PATCH v2 0/1] platform/x86: Add Slim Bootloader firmware update support Andy Shevchenko
  1 sibling, 0 replies; 5+ messages in thread
From: Jithu Joseph @ 2020-04-23 22:42 UTC (permalink / raw)
  To: dvhart, andy
  Cc: platform-driver-x86, linux-kernel, maurice.ma, ravi.p.rangarajan,
	sean.v.kelley, kuo-lang.tseng, Jithu Joseph

Slim Bootloader(SBL) is a small open-source boot firmware,
designed for running on certain Intel platforms. SBL can be
thought-of as fulfilling the role of a minimal BIOS
implementation, i.e initializing the hardware and booting
Operating System.

Since SBL is not UEFI compliant, firmware update cannot be triggered
using standard UEFI runtime services. Further considering performance
impact, SBL doesn't look for a firmware update image on every reset
and does so only when firmware update signal is asserted.

SBL exposes an ACPI-WMI device which comes up in sysfs as
/sys/bus/wmi/44FADEB1xxx and this driver adds a
"firmware_update_request" device attribute. This attribute normally
has a value of 0 and userspace can signal SBL to update firmware,
on next reboot, by writing a value of 1 like:

echo 1 > /sys/bus/wmi/devices/44FADEB1xxx/firmware_update_request

This driver only implements a signaling mechanism, the actual firmware
update process and various details like firmware update image format,
firmware image location etc are defined by SBL and are not in the
scope of this driver.

DocLink: https://slimbootloader.github.io/security/firmware-update.html

Signed-off-by: Jithu Joseph <jithu.joseph@intel.com>
---
 .../ABI/testing/sysfs-platform-sbl-fwu-wmi    |  12 ++
 MAINTAINERS                                   |   7 +
 drivers/platform/x86/Kconfig                  |  10 ++
 drivers/platform/x86/Makefile                 |   1 +
 drivers/platform/x86/sbl_fwu_wmi.c            | 144 ++++++++++++++++++
 5 files changed, 174 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-platform-sbl-fwu-wmi
 create mode 100644 drivers/platform/x86/sbl_fwu_wmi.c

diff --git a/Documentation/ABI/testing/sysfs-platform-sbl-fwu-wmi b/Documentation/ABI/testing/sysfs-platform-sbl-fwu-wmi
new file mode 100644
index 000000000000..5aa618987cad
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-platform-sbl-fwu-wmi
@@ -0,0 +1,12 @@
+What:		/sys/bus/wmi/devices/44FADEB1-B204-40F2-8581-394BBDC1B651/firmware_update_request
+Date:		April 2020
+KernelVersion:	5.7
+Contact:	"Jithu Joseph" <jithu.joseph@intel.com>
+Description:
+		Allow user space entities to trigger update of Slim
+		Bootloader (SBL). This attribute normally has a value
+		of 0 and userspace can signal SBL to update firmware,
+		on next reboot, by writing a value of 1.
+		There are two available states:
+		    * 0 -> Skip firmware update while rebooting
+		    * 1 -> Attempt firmware update on next reboot
diff --git a/MAINTAINERS b/MAINTAINERS
index b816a453b10e..fb613308dc4e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -15454,6 +15454,13 @@ T:	git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git dev
 F:	include/linux/srcu*.h
 F:	kernel/rcu/srcu*.c
 
+SLIM BOOTLOADER (SBL) FIRMWARE UPDATE WMI DRIVER
+M:	Jithu Joseph <jithu.joseph@intel.com>
+R:	Maurice Ma <maurice.ma@intel.com>
+S:	Maintained
+W:	https://slimbootloader.github.io/security/firmware-update.html
+F:	drivers/platform/x86/sbl_fwu_wmi.c
+
 SMACK SECURITY MODULE
 M:	Casey Schaufler <casey@schaufler-ca.com>
 L:	linux-security-module@vger.kernel.org
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
index 0ad7ad8cf8e1..69cfc2904265 100644
--- a/drivers/platform/x86/Kconfig
+++ b/drivers/platform/x86/Kconfig
@@ -104,6 +104,16 @@ config PEAQ_WMI
 	help
 	 Say Y here if you want to support WMI-based hotkeys on PEAQ 2-in-1s.
 
+config SBL_FWU_WMI
+	tristate "WMI driver for Slim Bootloader firmware update signaling"
+	depends on ACPI_WMI
+	help
+	  Say Y here if you want to be able to use the WMI interface to signal
+	  Slim Bootloader to trigger update on next reboot.
+
+	  To compile this driver as a module, choose M here: the module will
+	  be called sbl-fwu-wmi.
+
 config XIAOMI_WMI
 	tristate "Xiaomi WMI key driver"
 	depends on ACPI_WMI
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
index 53408d965874..65455c2214c9 100644
--- a/drivers/platform/x86/Makefile
+++ b/drivers/platform/x86/Makefile
@@ -14,6 +14,7 @@ obj-$(CONFIG_HUAWEI_WMI)		+= huawei-wmi.o
 obj-$(CONFIG_INTEL_WMI_THUNDERBOLT)	+= intel-wmi-thunderbolt.o
 obj-$(CONFIG_MXM_WMI)			+= mxm-wmi.o
 obj-$(CONFIG_PEAQ_WMI)			+= peaq-wmi.o
+obj-$(CONFIG_SBL_FWU_WMI)		+= sbl_fwu_wmi.o
 obj-$(CONFIG_XIAOMI_WMI)		+= xiaomi-wmi.o
 
 # Acer
diff --git a/drivers/platform/x86/sbl_fwu_wmi.c b/drivers/platform/x86/sbl_fwu_wmi.c
new file mode 100644
index 000000000000..4563245d32bd
--- /dev/null
+++ b/drivers/platform/x86/sbl_fwu_wmi.c
@@ -0,0 +1,144 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Slim Bootloader(SBL) firmware update signaling driver
+ *
+ * Slim Bootloader is a small, open-source, non UEFI compliant, boot firmware
+ * optimized for running on certain Intel platforms.
+ *
+ * SBL exposes an ACPI-WMI device via /sys/bus/wmi/<SBL_FWU_WMI_GUID>.
+ * This driver further adds "firmware_update_request" device attribute.
+ * This attribute normally has a value of 0 and userspace can signal SBL
+ * to update firmware, on next reboot, by writing a value of 1.
+ *
+ * More details of SBL firmware update process is available at:
+ * https://slimbootloader.github.io/security/firmware-update.html
+ */
+
+#include <linux/acpi.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/sysfs.h>
+#include <linux/wmi.h>
+
+#define SBL_FWU_WMI_GUID  "44FADEB1-B204-40F2-8581-394BBDC1B651"
+
+static int get_fwu_request(struct device *dev, u32 *out)
+{
+	struct acpi_buffer result = {ACPI_ALLOCATE_BUFFER, NULL};
+	union acpi_object *obj;
+	acpi_status status;
+
+	status = wmi_query_block(SBL_FWU_WMI_GUID, 0, &result);
+	if (ACPI_FAILURE(status)) {
+		dev_err(dev, "wmi_query_block failed\n");
+		return -ENODEV;
+	}
+
+	obj = (union acpi_object *)result.pointer;
+	if (!obj || obj->type != ACPI_TYPE_INTEGER) {
+		dev_warn(dev, "wmi_query_block returned invalid value\n");
+		kfree(obj);
+		return -EINVAL;
+	}
+
+	*out = obj->integer.value;
+	kfree(obj);
+
+	return 0;
+}
+
+static int set_fwu_request(struct device *dev, u32 in)
+{
+	struct acpi_buffer input;
+	acpi_status status;
+	u32 value;
+
+	value = in;
+	input.length = sizeof(u32);
+	input.pointer = &value;
+
+	status = wmi_set_block(SBL_FWU_WMI_GUID, 0, &input);
+	if (ACPI_FAILURE(status)) {
+		dev_err(dev, "wmi_set_block failed\n");
+		return -ENODEV;
+	}
+
+	return 0;
+}
+
+static ssize_t firmware_update_request_show(struct device *dev,
+					    struct device_attribute *attr,
+					    char *buf)
+{
+	u32 val;
+	int ret;
+
+	ret = get_fwu_request(dev, &val);
+	if (ret)
+		return ret;
+
+	return sprintf(buf, "%d\n", val);
+}
+
+static ssize_t firmware_update_request_store(struct device *dev,
+					     struct device_attribute *attr,
+					     const char *buf, size_t count)
+{
+	unsigned int val;
+	int ret;
+
+	ret = kstrtouint(buf, 0, &val);
+	if (ret)
+		return ret;
+
+	/* May later be extended to support values other than 0 and 1 */
+	if (val > 1)
+		return -ERANGE;
+
+	ret = set_fwu_request(dev, val);
+	if (ret)
+		return ret;
+
+	return count;
+}
+static DEVICE_ATTR_RW(firmware_update_request);
+
+static struct attribute *firmware_update_attrs[] = {
+	&dev_attr_firmware_update_request.attr,
+	NULL
+};
+ATTRIBUTE_GROUPS(firmware_update);
+
+static int sbl_fwu_wmi_probe(struct wmi_device *wdev, const void *context)
+{
+	dev_info(&wdev->dev, "Slim Bootloader signaling driver attached\n");
+	return 0;
+}
+
+static int sbl_fwu_wmi_remove(struct wmi_device *wdev)
+{
+	dev_info(&wdev->dev, "Slim Bootloader signaling driver removed\n");
+	return 0;
+}
+
+static const struct wmi_device_id sbl_fwu_wmi_id_table[] = {
+	{ .guid_string = SBL_FWU_WMI_GUID },
+	{}
+};
+MODULE_DEVICE_TABLE(wmi, sbl_fwu_wmi_id_table);
+
+static struct wmi_driver sbl_fwu_wmi_driver = {
+	.driver = {
+		.name = "sbl-fwu-wmi",
+		.dev_groups = firmware_update_groups,
+	},
+	.probe = sbl_fwu_wmi_probe,
+	.remove = sbl_fwu_wmi_remove,
+	.id_table = sbl_fwu_wmi_id_table,
+};
+module_wmi_driver(sbl_fwu_wmi_driver);
+
+MODULE_AUTHOR("Jithu Joseph <jithu.joseph@intel.com>");
+MODULE_DESCRIPTION("Slim Bootloader firmware update signaling driver");
+MODULE_LICENSE("GPL v2");
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 0/1] platform/x86: Add Slim Bootloader firmware update support
  2020-04-23 22:42 [PATCH v2 0/1] platform/x86: Add Slim Bootloader firmware update support Jithu Joseph
  2020-04-23 22:42 ` [PATCH v2 1/1] platform/x86: Add Slim Bootloader firmware update signaling driver Jithu Joseph
@ 2020-04-24 11:08 ` Andy Shevchenko
  2020-04-27 10:03   ` Andy Shevchenko
  1 sibling, 1 reply; 5+ messages in thread
From: Andy Shevchenko @ 2020-04-24 11:08 UTC (permalink / raw)
  To: Jithu Joseph
  Cc: Darren Hart, Andy Shevchenko, Platform Driver,
	Linux Kernel Mailing List, maurice.ma, ravi.p.rangarajan,
	Sean V Kelley, kuo-lang.tseng

On Fri, Apr 24, 2020 at 1:49 AM Jithu Joseph <jithu.joseph@intel.com> wrote:
>
> v1 Upstream submission is available here:
> https://lore.kernel.org/lkml/20200420194405.8281-1-jithu.joseph@intel.com
>

Pushed to my review and testing queue, thanks!

> v2 primarily addresses review comments from Andy Shevchenko to v1.
>
> Changes in v2
>  - Rebased on top of tag: v5.7-rc2
>  - Added ABI documentation file
>  - Changed the ordering of SBL entry in Makefile and Kconfig
>  - Replaced kstrtobool() with kstrtouint() for user input processing
>  - Added DocLink: tag to annottate weblink in commit message
>  - Minor edits to commit message in p1/1
>  - Style related changes
>
> From v1 submission:
>
> Slim Bootloader(SBL) [see link below] is a small open-source boot
> firmware, designed for running on certain Intel platforms. SBL can be
> thought-of as fulfilling the role of a minimal BIOS
> implementation, i.e initializing the hardware and booting
> Operating System.
>
> This driver creates sysfs interfaces which allows user space entities
> to trigger update of SBL firmware.
>
> Acknowledgment: Initial draft of the driver code was authored by
> Maurice Ma <maurice.ma@intel.com>
>
> DocLink: https://slimbootloader.github.io
>
> Jithu Joseph (1):
>   platform/x86: Add Slim Bootloader firmware update signaling driver
>
>  .../ABI/testing/sysfs-platform-sbl-fwu-wmi    |  12 ++
>  MAINTAINERS                                   |   7 +
>  drivers/platform/x86/Kconfig                  |  10 ++
>  drivers/platform/x86/Makefile                 |   1 +
>  drivers/platform/x86/sbl_fwu_wmi.c            | 144 ++++++++++++++++++
>  5 files changed, 174 insertions(+)
>  create mode 100644 Documentation/ABI/testing/sysfs-platform-sbl-fwu-wmi
>  create mode 100644 drivers/platform/x86/sbl_fwu_wmi.c
>
>
> base-commit: ae83d0b416db002fe95601e7f97f64b59514d936
> --
> 2.17.1
>


-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 0/1] platform/x86: Add Slim Bootloader firmware update support
  2020-04-24 11:08 ` [PATCH v2 0/1] platform/x86: Add Slim Bootloader firmware update support Andy Shevchenko
@ 2020-04-27 10:03   ` Andy Shevchenko
  2020-04-27 19:57     ` Jithu Joseph
  0 siblings, 1 reply; 5+ messages in thread
From: Andy Shevchenko @ 2020-04-27 10:03 UTC (permalink / raw)
  To: Jithu Joseph
  Cc: Darren Hart, Andy Shevchenko, Platform Driver,
	Linux Kernel Mailing List, maurice.ma, ravi.p.rangarajan,
	Sean V Kelley, kuo-lang.tseng

On Fri, Apr 24, 2020 at 2:08 PM Andy Shevchenko
<andy.shevchenko@gmail.com> wrote:
>
> On Fri, Apr 24, 2020 at 1:49 AM Jithu Joseph <jithu.joseph@intel.com> wrote:
> >
> > v1 Upstream submission is available here:
> > https://lore.kernel.org/lkml/20200420194405.8281-1-jithu.joseph@intel.com
> >
>
> Pushed to my review and testing queue, thanks!

One question, though.

We use a bit different template for module names

vendor-...-wmi

(yes, with exception to TBT)

I would like to rename sbl_fwu_wmi to something like this:

intel-wmi-sbl-fw-update

What do you think?

-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 0/1] platform/x86: Add Slim Bootloader firmware update support
  2020-04-27 10:03   ` Andy Shevchenko
@ 2020-04-27 19:57     ` Jithu Joseph
  0 siblings, 0 replies; 5+ messages in thread
From: Jithu Joseph @ 2020-04-27 19:57 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Darren Hart, Andy Shevchenko, Platform Driver,
	Linux Kernel Mailing List, maurice.ma, ravi.p.rangarajan,
	Sean V Kelley, kuo-lang.tseng, jithu.joseph

On Mon, 2020-04-27 at 13:03 +0300, Andy Shevchenko wrote:
> 
> 
> We use a bit different template for module names
> 
> vendor-...-wmi
> 
> (yes, with exception to TBT)
> 
> I would like to rename sbl_fwu_wmi to something like this:
> 
> intel-wmi-sbl-fw-update
> 
> What do you think?

Yes I think it is better to rename this driver to intel-wmi-sbl-fw-
update as you suggested, given many drivers follow vendor-wmi-*
pattern. Thanks for pointing this out.

I will send v3 which addresses this.

Thanks
Jithu


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-04-27 20:02 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-23 22:42 [PATCH v2 0/1] platform/x86: Add Slim Bootloader firmware update support Jithu Joseph
2020-04-23 22:42 ` [PATCH v2 1/1] platform/x86: Add Slim Bootloader firmware update signaling driver Jithu Joseph
2020-04-24 11:08 ` [PATCH v2 0/1] platform/x86: Add Slim Bootloader firmware update support Andy Shevchenko
2020-04-27 10:03   ` Andy Shevchenko
2020-04-27 19:57     ` Jithu Joseph

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).