u-boot/boot/vbe_simple_os.c
Tom Rini d678a59d2d Revert "Merge patch series "arm: dts: am62-beagleplay: Fix Beagleplay Ethernet""
When bringing in the series 'arm: dts: am62-beagleplay: Fix Beagleplay
Ethernet"' I failed to notice that b4 noticed it was based on next and
so took that as the base commit and merged that part of next to master.

This reverts commit c8ffd1356d, reversing
changes made to 2ee6f3a5f7.

Reported-by: Jonas Karlman <jonas@kwiboo.se>
Signed-off-by: Tom Rini <trini@konsulko.com>
2024-05-19 08:16:36 -06:00

111 lines
2.7 KiB
C

// SPDX-License-Identifier: GPL-2.0
/*
* Verified Boot for Embedded (VBE) loading firmware phases
*
* Copyright 2022 Google LLC
* Written by Simon Glass <sjg@chromium.org>
*/
#define LOG_CATEGORY LOGC_BOOT
#include <dm.h>
#include <bootflow.h>
#include <vbe.h>
#include <version_string.h>
#include <dm/device-internal.h>
#include "vbe_simple.h"
int vbe_simple_fixup_node(ofnode node, struct simple_state *state)
{
const char *version, *str;
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);
/* 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);
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, chosen;
int ret;
if (strcmp("vbe_simple", dev->driver->name))
continue;
/* Check if there is a node to fix up, adding if not */
chosen = oftree_path(tree, "/chosen");
if (!ofnode_valid(chosen))
continue;
ret = device_probe(dev);
if (ret) {
/*
* This should become an error when VBE is updated to
* only bind this device when a node exists
*/
log_debug("VBE device '%s' failed to probe (err=%d)",
dev->name, ret);
return 0;
}
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);
/* Copy over the vbe properties for fwupd */
log_debug("Fixing up: %s\n", dev->name);
ret = ofnode_copy_props(subnode, dev_ofnode(dev));
if (ret)
return log_msg_ret("cp", ret);
ret = vbe_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_FULL(EVT_FT_FIXUP, bootmeth_vbe_simple_ft_fixup);