event: Add an event for device tree fixups

At present there is a confusing array of functions that handle the
device tree fix-ups needed for booting an OS. We should be able to switch
to using events to clean this up.

As a first step, create a new event type and call it from the standard
place.

Note that this event uses the ofnode interface only, since this can
support live tree which is more efficient when making lots of updates.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2022-07-30 15:52:31 -06:00 committed by Tom Rini
parent 569524741a
commit 98887ab802
4 changed files with 29 additions and 0 deletions

View File

@ -21,6 +21,7 @@
#include <linux/libfdt.h> #include <linux/libfdt.h>
#include <mapmem.h> #include <mapmem.h>
#include <asm/io.h> #include <asm/io.h>
#include <dm/ofnode.h>
#include <tee/optee.h> #include <tee/optee.h>
#ifndef CONFIG_SYS_FDT_PAD #ifndef CONFIG_SYS_FDT_PAD
@ -668,6 +669,16 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
goto err; goto err;
} }
} }
if (CONFIG_IS_ENABLED(EVENT)) {
struct event_ft_fixup fixup;
fixup.tree = oftree_default();
ret = event_notify(EVT_FT_FIXUP, &fixup, sizeof(fixup));
if (ret) {
printf("ERROR: fdt fixup event failed: %d\n", ret);
goto err;
}
}
/* Delete the old LMB reservation */ /* Delete the old LMB reservation */
if (lmb) if (lmb)

View File

@ -35,6 +35,9 @@ const char *const type_name[] = {
/* init hooks */ /* init hooks */
"misc_init_f", "misc_init_f",
/* fdt hooks */
"ft_fixup",
}; };
_Static_assert(ARRAY_SIZE(type_name) == EVT_COUNT, "event type_name size"); _Static_assert(ARRAY_SIZE(type_name) == EVT_COUNT, "event type_name size");

View File

@ -10,6 +10,8 @@
#ifndef __event_h #ifndef __event_h
#define __event_h #define __event_h
#include <dm/ofnode_decl.h>
/** /**
* enum event_t - Types of events supported by U-Boot * enum event_t - Types of events supported by U-Boot
* *
@ -29,6 +31,9 @@ enum event_t {
/* Init hooks */ /* Init hooks */
EVT_MISC_INIT_F, EVT_MISC_INIT_F,
/* Device tree fixups before booting */
EVT_FT_FIXUP,
EVT_COUNT EVT_COUNT
}; };
@ -50,6 +55,15 @@ union event_data {
struct event_dm { struct event_dm {
struct udevice *dev; struct udevice *dev;
} dm; } dm;
/**
* struct event_ft_fixup - FDT fixup before booting
*
* @tree: tree to update
*/
struct event_ft_fixup {
oftree tree;
} ft_fixup;
}; };
/** /**

View File

@ -16,5 +16,6 @@ def test_event_dump(u_boot_console):
out = util.run_and_log(cons, ['scripts/event_dump.py', sandbox]) out = util.run_and_log(cons, ['scripts/event_dump.py', sandbox])
expect = '''.*Event type Id Source location expect = '''.*Event type Id Source location
-------------------- ------------------------------ ------------------------------ -------------------- ------------------------------ ------------------------------
EVT_FT_FIXUP bootmeth_vbe_simple_ft_fixup boot/vbe_simple.c:.*
EVT_MISC_INIT_F sandbox_misc_init_f .*arch/sandbox/cpu/start.c:''' EVT_MISC_INIT_F sandbox_misc_init_f .*arch/sandbox/cpu/start.c:'''
assert re.match(expect, out, re.MULTILINE) is not None assert re.match(expect, out, re.MULTILINE) is not None