From c263e21bcb01f19e6ccb2452fdcc601ff84942db Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 20 Oct 2022 18:23:11 -0600 Subject: vbe: Move OS implementation into a separate file Move this into its own file so it can be built only by U-Boot proper. Signed-off-by: Simon Glass --- boot/vbe_simple_os.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 boot/vbe_simple_os.c (limited to 'boot/vbe_simple_os.c') diff --git a/boot/vbe_simple_os.c b/boot/vbe_simple_os.c new file mode 100644 index 00000000000..7761b9ef656 --- /dev/null +++ b/boot/vbe_simple_os.c @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Verified Boot for Embedded (VBE) loading firmware phases + * + * Copyright 2022 Google LLC + * Written by Simon Glass + */ + +#define LOG_CATEGORY LOGC_BOOT + +#include +#include +#include +#include +#include +#include +#include "vbe_simple.h" + +int vbe_simple_fixup_node(ofnode node, struct simple_state *state) +{ + char *version; + int ret; + + version = strdup(state->fw_version); + if (!version) + return log_msg_ret("dup", -ENOMEM); + + ret = ofnode_write_string(node, "cur-version", version); + if (ret) + return log_msg_ret("ver", ret); + ret = ofnode_write_u32(node, "cur-vernum", state->fw_vernum); + if (ret) + return log_msg_ret("num", ret); + ret = ofnode_write_string(node, "bootloader-version", version_string); + if (ret) + return log_msg_ret("bl", ret); + + return 0; +} + +/** + * bootmeth_vbe_simple_ft_fixup() - Write out all VBE simple data to the DT + * + * @ctx: Context for event + * @event: Event to process + * @return 0 if OK, -ve on error + */ +static int bootmeth_vbe_simple_ft_fixup(void *ctx, struct event *event) +{ + oftree tree = event->data.ft_fixup.tree; + struct udevice *dev; + + /* + * Ideally we would have driver model support for fixups, but that does + * not exist yet. It is a step too far to try to do this before VBE is + * in place. + */ + for (vbe_find_first_device(&dev); dev; vbe_find_next_device(&dev)) { + struct simple_state state; + ofnode node, subnode; + int ret; + + if (strcmp("vbe_simple", dev->driver->name)) + continue; + + /* Check if there is a node to fix up */ + node = oftree_path(tree, "/chosen/fwupd"); + if (!ofnode_valid(node)) + continue; + subnode = ofnode_find_subnode(node, dev->name); + if (!ofnode_valid(subnode)) + continue; + + log_debug("Fixing up: %s\n", dev->name); + ret = device_probe(dev); + if (ret) + return log_msg_ret("probe", ret); + ret = simple_read_state(dev, &state); + if (ret) + return log_msg_ret("read", ret); + + ret = vbe_simple_fixup_node(subnode, &state); + if (ret) + return log_msg_ret("fix", ret); + } + + return 0; +} +EVENT_SPY(EVT_FT_FIXUP, bootmeth_vbe_simple_ft_fixup); -- cgit v1.2.3 From e45d22655aed0c81fa5890f47c1647c6e95bedb6 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 20 Oct 2022 18:23:12 -0600 Subject: vbe: Drop the U-Boot prefix from the version We don't need the U-Boot prefix on the version and in fact it is harmful since pytest gets confused seeing the U-Boot banner bring displayed when the version is printed. Drop the prefix from the string. We could produce an entirely new string from the component parts, but this adds to the rodata size and would break the use of version_string as the only thing which holds this information. Signed-off-by: Simon Glass --- boot/vbe_simple_os.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'boot/vbe_simple_os.c') diff --git a/boot/vbe_simple_os.c b/boot/vbe_simple_os.c index 7761b9ef656..058db6154b0 100644 --- a/boot/vbe_simple_os.c +++ b/boot/vbe_simple_os.c @@ -18,7 +18,7 @@ int vbe_simple_fixup_node(ofnode node, struct simple_state *state) { - char *version; + const char *version, *str; int ret; version = strdup(state->fw_version); @@ -31,7 +31,12 @@ int vbe_simple_fixup_node(ofnode node, struct simple_state *state) ret = ofnode_write_u32(node, "cur-vernum", state->fw_vernum); if (ret) return log_msg_ret("num", ret); - ret = ofnode_write_string(node, "bootloader-version", version_string); + + /* Drop the 'U-Boot ' at the start */ + str = version_string; + if (!strncmp("U-Boot ", str, 7)) + str += 7; + ret = ofnode_write_string(node, "bootloader-version", str); if (ret) return log_msg_ret("bl", ret); -- cgit v1.2.3 From 4218456b3fac98966a320c3f2db36d543a32ec17 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 20 Oct 2022 18:23:13 -0600 Subject: vbe: Add Kconfig options for VPL Enable the various features needed in VPL, by adding Kconfig options. Update the defconfig for sandbox_vpl so that the build for each phase includes what is needed. Drop LZMA for now and make sure partition support is omitted in SPL, since it is not needed. Signed-off-by: Simon Glass --- boot/vbe_simple_os.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'boot/vbe_simple_os.c') diff --git a/boot/vbe_simple_os.c b/boot/vbe_simple_os.c index 058db6154b0..87778bba97e 100644 --- a/boot/vbe_simple_os.c +++ b/boot/vbe_simple_os.c @@ -80,7 +80,7 @@ static int bootmeth_vbe_simple_ft_fixup(void *ctx, struct event *event) ret = device_probe(dev); if (ret) return log_msg_ret("probe", ret); - ret = simple_read_state(dev, &state); + ret = vbe_simple_read_state(dev, &state); if (ret) return log_msg_ret("read", ret); -- cgit v1.2.3 From a56f663f07073713042bb0fd08053aeb667e717b Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 20 Oct 2022 18:23:14 -0600 Subject: vbe: Add info about the VBE device to the fwupd node At present we put the driver in the /chosen node in U-Boot. This is a bit strange, since U-Boot doesn't normally use that node itself. It is better to put it under the bootstd node. To make this work we need to copy create the node under /chosen when fixing up the device tree. Copy over all the properties so that fwupd knows what to do. Update the sandbox device tree accordingly. Signed-off-by: Simon Glass --- boot/vbe_simple_os.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'boot/vbe_simple_os.c') diff --git a/boot/vbe_simple_os.c b/boot/vbe_simple_os.c index 87778bba97e..b2041a95a30 100644 --- a/boot/vbe_simple_os.c +++ b/boot/vbe_simple_os.c @@ -62,24 +62,34 @@ static int bootmeth_vbe_simple_ft_fixup(void *ctx, struct event *event) */ for (vbe_find_first_device(&dev); dev; vbe_find_next_device(&dev)) { struct simple_state state; - ofnode node, subnode; + ofnode node, subnode, chosen; int ret; if (strcmp("vbe_simple", dev->driver->name)) continue; - /* Check if there is a node to fix up */ - node = oftree_path(tree, "/chosen/fwupd"); - if (!ofnode_valid(node)) - continue; - subnode = ofnode_find_subnode(node, dev->name); - if (!ofnode_valid(subnode)) + /* Check if there is a node to fix up, adding if not */ + chosen = oftree_path(tree, "/chosen"); + if (!ofnode_valid(chosen)) continue; + ret = ofnode_add_subnode(chosen, "fwupd", &node); + if (ret && ret != -EEXIST) + return log_msg_ret("fwu", ret); + + ret = ofnode_add_subnode(node, dev->name, &subnode); + if (ret && ret != -EEXIST) + return log_msg_ret("dev", ret); - log_debug("Fixing up: %s\n", dev->name); ret = device_probe(dev); if (ret) return log_msg_ret("probe", ret); + + /* Copy over the vbe properties for fwupd */ + log_debug("Fixing up: %s\n", dev->name); + ret = ofnode_copy_props(dev_ofnode(dev), subnode); + if (ret) + return log_msg_ret("cp", ret); + ret = vbe_simple_read_state(dev, &state); if (ret) return log_msg_ret("read", ret); -- cgit v1.2.3