From: James Bottomley <James.Bottomley@HansenPartnership.com>
To: linux-efi@vger.kernel.org
Cc: "Kweh, Hock Leong" <hock.leong.kweh@intel.com>,
LKML <linux-kernel@vger.kernel.org>,
Andy Lutomirski <luto@amacapital.net>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Peter Jones <pjones@redhat.com>
Subject: [RFC 3/3] efi: add capsule update capability via sysfs
Date: Wed, 29 Apr 2015 16:12:10 -0700 [thread overview]
Message-ID: <1430349130.2189.43.camel@HansenPartnership.com> (raw)
In-Reply-To: <1430348859.2189.37.camel@HansenPartnership.com>
From: James Bottomley <JBottomley@Odin.com>
The firmware update should be applied simply by doing
cat fw_file > /sys/firmware/capsule/update
With a properly formatted fw_file. Any error will be returned on close of
stdout. util-linux returns errors correctly from closing stdout, but firmware
shippers should check whatever utilities package they use correctly captures
the error return on close.
Signed-off-by: James Bottomley <JBottomley@Odin.com>
---
drivers/firmware/efi/Makefile | 2 +-
drivers/firmware/efi/capsule.c | 78 ++++++++++++++++++++++++++++++++++++++++++
drivers/firmware/efi/capsule.h | 2 ++
drivers/firmware/efi/efi.c | 8 +++++
4 files changed, 89 insertions(+), 1 deletion(-)
create mode 100644 drivers/firmware/efi/capsule.c
create mode 100644 drivers/firmware/efi/capsule.h
diff --git a/drivers/firmware/efi/Makefile b/drivers/firmware/efi/Makefile
index d8be608..698846e 100644
--- a/drivers/firmware/efi/Makefile
+++ b/drivers/firmware/efi/Makefile
@@ -1,7 +1,7 @@
#
# Makefile for linux kernel
#
-obj-$(CONFIG_EFI) += efi.o vars.o reboot.o
+obj-$(CONFIG_EFI) += efi.o vars.o reboot.o capsule.o
obj-$(CONFIG_EFI_VARS) += efivars.o
obj-$(CONFIG_EFI_VARS_PSTORE) += efi-pstore.o
obj-$(CONFIG_UEFI_CPER) += cper.o
diff --git a/drivers/firmware/efi/capsule.c b/drivers/firmware/efi/capsule.c
new file mode 100644
index 0000000..1fd78e7
--- /dev/null
+++ b/drivers/firmware/efi/capsule.c
@@ -0,0 +1,78 @@
+#include <linux/efi.h>
+#include <linux/slab.h>
+#include <linux/transaction_helper.h>
+
+#include "capsule.h"
+
+static struct kset *capsule_kset;
+static struct transaction_buf *capsule_buf;
+
+static int capsule_data_write(struct file *file, struct kobject *kobj,
+ struct bin_attribute *attr,
+ char *buffer, loff_t offset, size_t count)
+{
+ if (!capsule_buf) {
+ capsule_buf = kmalloc(sizeof(*capsule_buf), GFP_KERNEL);
+ if (!capsule_buf)
+ return -ENOMEM;
+ transaction_init(capsule_buf);
+ }
+
+ return transaction_write(capsule_buf, buffer, offset, count);
+}
+
+static int capsule_data_flush(struct file *file, struct kobject *kobj,
+ struct bin_attribute *attr, fl_owner_t id)
+{
+ efi_capsule_header_t *hdr[1];
+ int retval = -EINVAL;
+
+ void *data = transaction_map(capsule_buf, PAGE_KERNEL_RO);
+
+ hdr[0] = data;
+ if (hdr[0]->headersize > capsule_buf->size)
+ goto out;
+
+ retval = efi.update_capsule(hdr, 1, 0);
+
+ out:
+ transaction_free(capsule_buf);
+ kfree(capsule_buf);
+ capsule_buf = NULL;
+
+ return retval;
+}
+
+
+static const struct bin_attribute capsule_update_attr = {
+ .attr = { .name = "update", .mode = 0600 },
+ .size = 0,
+ .write = capsule_data_write,
+ .flush = capsule_data_flush,
+};
+
+__init int efi_capsule_init(struct kobject *efi_kobj)
+{
+
+ int err;
+
+ /* FIXME: check that UEFI actually supports capsule here */
+
+ capsule_kset = kset_create_and_add("capsule", NULL, efi_kobj);
+ if (!capsule_kset) {
+ printk(KERN_ERR "UEFI capsule: failed to register subsystem\n");
+ return -ENOMEM;
+ }
+
+ err = sysfs_create_bin_file(&capsule_kset->kobj, &capsule_update_attr);
+ if (err)
+ return err;
+
+ return 0;
+}
+
+void efi_capsule_remove(struct kobject *efi_kobj)
+{
+ sysfs_remove_bin_file(&capsule_kset->kobj, &capsule_update_attr);
+ kset_unregister(capsule_kset);
+}
diff --git a/drivers/firmware/efi/capsule.h b/drivers/firmware/efi/capsule.h
new file mode 100644
index 0000000..cc38f7d
--- /dev/null
+++ b/drivers/firmware/efi/capsule.h
@@ -0,0 +1,2 @@
+int efi_capsule_init(struct kobject *efi_kobj);
+void efi_capsule_remove(struct kobject *efi_kobj);
diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
index 3061bb8..92da61e 100644
--- a/drivers/firmware/efi/efi.c
+++ b/drivers/firmware/efi/efi.c
@@ -25,6 +25,8 @@
#include <linux/io.h>
#include <linux/platform_device.h>
+#include "capsule.h"
+
struct efi __read_mostly efi = {
.mps = EFI_INVALID_TABLE_ADDR,
.acpi = EFI_INVALID_TABLE_ADDR,
@@ -219,8 +221,14 @@ static int __init efisubsys_init(void)
goto err_remove_group;
}
+ error = efi_capsule_init(efi_kobj);
+ if (error)
+ goto err_remove_capsule;
+
return 0;
+err_remove_capsule:
+ efi_capsule_remove(efi_kobj);
err_remove_group:
sysfs_remove_group(efi_kobj, &efi_subsys_attr_group);
err_unregister:
--
2.1.4
next prev parent reply other threads:[~2015-04-29 23:12 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-29 23:07 [RFC 0/3] Add capsule update using error on close semantics James Bottomley
[not found] ` <1430348859.2189.37.camel-d9PhHud1JfjCXq6kfMZ53/egYHeGw8Jk@public.gmane.org>
2015-04-29 23:09 ` [RFC 1/3] sysfs,kernfs: add flush operation James Bottomley
2015-04-29 23:09 ` James Bottomley
2015-04-30 13:11 ` Greg Kroah-Hartman
2015-04-30 14:52 ` James Bottomley
2015-04-29 23:10 ` [RFC 2/3] firmware_class: split out transaction helpers James Bottomley
2015-04-29 23:10 ` James Bottomley
[not found] ` <1430349052.2189.41.camel-d9PhHud1JfjCXq6kfMZ53/egYHeGw8Jk@public.gmane.org>
2015-04-30 13:11 ` Greg Kroah-Hartman
2015-04-30 13:11 ` Greg Kroah-Hartman
2015-04-30 14:39 ` James Bottomley
2015-08-27 14:47 ` Matt Fleming
2015-08-27 16:25 ` James Bottomley
[not found] ` <1440692717.2196.123.camel-d9PhHud1JfjCXq6kfMZ53/egYHeGw8Jk@public.gmane.org>
2015-08-27 19:43 ` Matt Fleming
2015-08-27 19:43 ` Matt Fleming
2015-04-29 23:12 ` James Bottomley [this message]
[not found] ` <1430349130.2189.43.camel-d9PhHud1JfjCXq6kfMZ53/egYHeGw8Jk@public.gmane.org>
2015-04-29 23:25 ` [RFC 3/3] efi: add capsule update capability via sysfs Andy Lutomirski
2015-04-29 23:25 ` Andy Lutomirski
[not found] ` <CALCETrV8bRj_CmCwZfHSV8bMF-vv0sab_7v5t0rpdhx2ib=wPw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-04-29 23:36 ` James Bottomley
2015-04-29 23:36 ` James Bottomley
[not found] ` <1430350592.2189.50.camel-d9PhHud1JfjCXq6kfMZ53/egYHeGw8Jk@public.gmane.org>
2015-04-29 23:39 ` Andy Lutomirski
2015-04-29 23:39 ` Andy Lutomirski
2015-04-30 9:30 ` [RFC 0/3] Add capsule update using error on close semantics Kweh, Hock Leong
2015-04-30 9:30 ` Kweh, Hock Leong
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=1430349130.2189.43.camel@HansenPartnership.com \
--to=james.bottomley@hansenpartnership.com \
--cc=gregkh@linuxfoundation.org \
--cc=hock.leong.kweh@intel.com \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@amacapital.net \
--cc=pjones@redhat.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.