From: patrick.rudolph@9elements.com
To: linux-kernel@vger.kernel.org
Cc: Patrick Rudolph <patrick.rudolph@9elements.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Ben Zhang <benzh@chromium.org>,
Filipe Brandenburger <filbranden@chromium.org>,
Duncan Laurie <dlaurie@chromium.org>,
Thomas Gleixner <tglx@linutronix.de>,
Stephen Boyd <swboyd@chromium.org>,
Samuel Holland <samuel@sholland.org>,
Julius Werner <jwerner@chromium.org>
Subject: [PATCH 2/2] firmware: coreboot: Export active CBFS partition
Date: Tue, 8 Oct 2019 13:53:26 +0200 [thread overview]
Message-ID: <20191008115342.28483-2-patrick.rudolph@9elements.com> (raw)
In-Reply-To: <20191008115342.28483-1-patrick.rudolph@9elements.com>
From: Patrick Rudolph <patrick.rudolph@9elements.com>
Expose the name of the active CBFS partition under
/sys/firmware/cbfs_active_partition
In case of Google's VBOOT[1] that currently can be one of:
"FW_MAIN_A", "FW_MAIN_B" or "COREBOOT"
Will be used by fwupd[2] to determinde the active partition in the
VBOOT A/B partition update scheme.
[1]: https://doc.coreboot.org/security/vboot/index.html
[2]: https://fwupd.org/
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
---
drivers/firmware/google/Kconfig | 10 ++
drivers/firmware/google/Makefile | 1 +
drivers/firmware/google/bootmedia-coreboot.c | 115 +++++++++++++++++++
drivers/firmware/google/coreboot_table.h | 13 +++
4 files changed, 139 insertions(+)
create mode 100644 drivers/firmware/google/bootmedia-coreboot.c
diff --git a/drivers/firmware/google/Kconfig b/drivers/firmware/google/Kconfig
index 5fbbd7b8fef6..f58b723d77de 100644
--- a/drivers/firmware/google/Kconfig
+++ b/drivers/firmware/google/Kconfig
@@ -82,4 +82,14 @@ config GOOGLE_FMAP
the coreboot table. If found, this binary file is exported to userland
in the file /sys/firmware/fmap.
+config GOOGLE_BOOTMEDIA
+ tristate "Coreboot bootmedia params access"
+ depends on GOOGLE_COREBOOT_TABLE
+ depends on GOOGLE_FMAP
+ help
+ This option enables the kernel to search for a boot media params
+ table, providing the active CBFS partition. If found, the name of
+ the partition is exported to userland in the file
+ /sys/firmware/cbfs_active_partition.
+
endif # GOOGLE_FIRMWARE
diff --git a/drivers/firmware/google/Makefile b/drivers/firmware/google/Makefile
index 6d31fe167700..e47c59376566 100644
--- a/drivers/firmware/google/Makefile
+++ b/drivers/firmware/google/Makefile
@@ -7,6 +7,7 @@ obj-$(CONFIG_GOOGLE_MEMCONSOLE) += memconsole.o
obj-$(CONFIG_GOOGLE_MEMCONSOLE_COREBOOT) += memconsole-coreboot.o
obj-$(CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY) += memconsole-x86-legacy.o
obj-$(CONFIG_GOOGLE_FMAP) += fmap-coreboot.o
+obj-$(CONFIG_GOOGLE_BOOTMEDIA) += bootmedia-coreboot.o
vpd-sysfs-y := vpd.o vpd_decode.o
obj-$(CONFIG_GOOGLE_VPD) += vpd-sysfs.o
diff --git a/drivers/firmware/google/bootmedia-coreboot.c b/drivers/firmware/google/bootmedia-coreboot.c
new file mode 100644
index 000000000000..09c0caedaf05
--- /dev/null
+++ b/drivers/firmware/google/bootmedia-coreboot.c
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * bootmedia-coreboot.c
+ *
+ * Exports the active VBOOT partition name through boot media params.
+ *
+ * Copyright 2012-2013 David Herrmann <dh.herrmann@gmail.com>
+ * Copyright 2017 Google Inc.
+ * Copyright 2019 Patrick Rudolph <patrick.rudolph@9elements.com>
+ */
+
+#include <linux/device.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/string.h>
+#include <linux/slab.h>
+
+#include "coreboot_table.h"
+#include "fmap-coreboot.h"
+
+#define CB_TAG_BOOT_MEDIA_PARAMS 0x30
+
+/* The current CBFS partition */
+static char *name;
+
+static ssize_t cbfs_active_partition_read(struct file *filp,
+ struct kobject *kobp,
+ struct bin_attribute *bin_attr,
+ char *buf,
+ loff_t pos, size_t count)
+{
+ if (!name)
+ return -ENODEV;
+
+ return memory_read_from_buffer(buf, count, &pos, name, strlen(name));
+}
+
+static int bmp_probe(struct coreboot_device *dev)
+{
+ struct lb_boot_media_params *b = &dev->bmp;
+ const char *tmp;
+
+ /* Sanity checks on the data we got */
+ if ((b->cbfs_offset == ~0) ||
+ b->cbfs_size == 0 ||
+ ((b->cbfs_offset + b->cbfs_size) > b->boot_media_size)) {
+ pr_warn("coreboot: Boot media params contains invalid data\n");
+ return -ENODEV;
+ }
+
+ tmp = coreboot_fmap_region_to_name(b->cbfs_offset, b->cbfs_size);
+ if (!tmp) {
+ pr_warn("coreboot: Active CBFS region not found in FMAP\n");
+ return -ENODEV;
+ }
+
+ name = devm_kmalloc(&dev->dev, strlen(tmp) + 2, GFP_KERNEL);
+ if (!name) {
+ kfree(tmp);
+ return -ENODEV;
+ }
+ snprintf(name, strlen(tmp) + 2, "%s\n", tmp);
+
+ kfree(tmp);
+
+ return 0;
+}
+
+static int bmp_remove(struct coreboot_device *dev)
+{
+ struct platform_device *pdev = dev_get_drvdata(&dev->dev);
+
+ platform_device_unregister(pdev);
+
+ return 0;
+}
+
+static struct coreboot_driver bmp_driver = {
+ .probe = bmp_probe,
+ .remove = bmp_remove,
+ .drv = {
+ .name = "bootmediaparams",
+ },
+ .tag = CB_TAG_BOOT_MEDIA_PARAMS,
+};
+
+static struct bin_attribute cbfs_partition_bin_attr = {
+ .attr = {.name = "cbfs_active_partition", .mode = 0444},
+ .read = cbfs_active_partition_read,
+};
+
+static int __init coreboot_bmp_init(void)
+{
+ int err;
+
+ err = sysfs_create_bin_file(firmware_kobj, &cbfs_partition_bin_attr);
+ if (err)
+ return err;
+
+ return coreboot_driver_register(&bmp_driver);
+}
+
+static void coreboot_bmp_exit(void)
+{
+ coreboot_driver_unregister(&bmp_driver);
+ sysfs_remove_bin_file(firmware_kobj, &cbfs_partition_bin_attr);
+}
+
+module_init(coreboot_bmp_init);
+module_exit(coreboot_bmp_exit);
+
+MODULE_AUTHOR("9elements Agency GmbH");
+MODULE_LICENSE("GPL");
diff --git a/drivers/firmware/google/coreboot_table.h b/drivers/firmware/google/coreboot_table.h
index 7b7b4a6eedda..a03e039425b8 100644
--- a/drivers/firmware/google/coreboot_table.h
+++ b/drivers/firmware/google/coreboot_table.h
@@ -59,6 +59,18 @@ struct lb_framebuffer {
u8 reserved_mask_size;
};
+/* coreboot table with TAG 0x30 */
+struct lb_boot_media_params {
+ u32 tag;
+ u32 size;
+
+ /* offsets are relative to start of boot media */
+ u64 fmap_offset;
+ u64 cbfs_offset;
+ u64 cbfs_size;
+ u64 boot_media_size;
+};
+
/* A device, additionally with information from coreboot. */
struct coreboot_device {
struct device dev;
@@ -66,6 +78,7 @@ struct coreboot_device {
struct coreboot_table_entry entry;
struct lb_cbmem_ref cbmem_ref;
struct lb_framebuffer framebuffer;
+ struct lb_boot_media_params bmp;
};
};
--
2.21.0
next prev parent reply other threads:[~2019-10-08 11:54 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-08 11:53 [PATCH 1/2] firmware: coreboot: Export the binary FMAP patrick.rudolph
2019-10-08 11:53 ` patrick.rudolph [this message]
2019-10-08 22:47 ` [PATCH 2/2] firmware: coreboot: Export active CBFS partition Stephen Boyd
2019-10-09 21:19 ` Julius Werner
2019-10-10 9:46 ` patrick.rudolph
2019-10-10 14:09 ` Stephen Boyd
2019-10-10 18:37 ` Julius Werner
2019-10-16 20:12 ` Stephen Boyd
2019-10-19 2:14 ` Julius Werner
2019-10-11 0:03 ` Samuel Holland
2019-10-08 12:03 ` [PATCH 1/2] firmware: coreboot: Export the binary FMAP Greg Kroah-Hartman
2019-10-08 22:47 ` Stephen Boyd
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=20191008115342.28483-2-patrick.rudolph@9elements.com \
--to=patrick.rudolph@9elements.com \
--cc=benzh@chromium.org \
--cc=dlaurie@chromium.org \
--cc=filbranden@chromium.org \
--cc=gregkh@linuxfoundation.org \
--cc=jwerner@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=samuel@sholland.org \
--cc=swboyd@chromium.org \
--cc=tglx@linutronix.de \
/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.