mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
dm: allow limiting pre-reloc markings to spl or tpl
Right now the u-boot,dm-pre-reloc flag will make each marked node always appear in both spl and tpl. But systems needing an additional tpl might have special constraints for each, like the spl needing to be very tiny. So introduce two additional flags to mark nodes for only spl or tpl environments and introduce a function dm_fdt_pre_reloc to automate the necessary checks in code instances checking for pre-relocation flags. The behaviour of the original flag stays untouched and still marks a node for both spl and tpl. Signed-off-by: Heiko Stuebner <heiko@sntech.de> Reviewed-by: Simon Glass <sjg@chromium.org> Tested-by: Kever Yang <kever.yang@rock-chips.com>
This commit is contained in:
parent
2adb981207
commit
27326c7ee2
8 changed files with 68 additions and 4 deletions
|
@ -825,6 +825,10 @@ drivers marked with DM_FLAG_PRE_RELOC or the device tree
|
|||
'u-boot,dm-pre-reloc' flag are initialised prior to relocation. This helps
|
||||
to reduce the driver model overhead.
|
||||
|
||||
It is possible to limit this to specific relocation steps, by using
|
||||
the more specialized 'u-boot,dm-spl' and 'u-boot,dm-tpl' flags
|
||||
in the devicetree.
|
||||
|
||||
Then post relocation we throw that away and re-init driver model again.
|
||||
For drivers which require some sort of continuity between pre- and
|
||||
post-relocation devices, we can provide access to the pre-relocation
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <dm/device.h>
|
||||
#include <dm/lists.h>
|
||||
#include <dm/root.h>
|
||||
#include <dm/util.h>
|
||||
#include "pmc.h"
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
@ -56,7 +57,7 @@ int at91_clk_sub_device_bind(struct udevice *dev, const char *drv_name)
|
|||
offset > 0;
|
||||
offset = fdt_next_subnode(fdt, offset)) {
|
||||
if (pre_reloc_only &&
|
||||
!fdt_getprop(fdt, offset, "u-boot,dm-pre-reloc", NULL))
|
||||
!dm_fdt_pre_reloc(fdt, offset))
|
||||
continue;
|
||||
/*
|
||||
* If this node has "compatible" property, this is not
|
||||
|
|
|
@ -205,7 +205,7 @@ int dm_scan_fdt_node(struct udevice *parent, const void *blob, int offset,
|
|||
offset > 0;
|
||||
offset = fdt_next_subnode(blob, offset)) {
|
||||
if (pre_reloc_only &&
|
||||
!fdt_getprop(blob, offset, "u-boot,dm-pre-reloc", NULL))
|
||||
!dm_fdt_pre_reloc(blob, offset))
|
||||
continue;
|
||||
if (!fdtdec_get_is_enabled(blob, offset)) {
|
||||
dm_dbg(" - ignoring disabled device\n");
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <libfdt.h>
|
||||
#include <vsprintf.h>
|
||||
|
||||
void dm_warn(const char *fmt, ...)
|
||||
|
@ -35,3 +36,27 @@ int list_count_items(struct list_head *head)
|
|||
|
||||
return count;
|
||||
}
|
||||
|
||||
int dm_fdt_pre_reloc(const void *blob, int offset)
|
||||
{
|
||||
if (fdt_getprop(blob, offset, "u-boot,dm-pre-reloc", NULL))
|
||||
return 1;
|
||||
|
||||
#ifdef CONFIG_TPL_BUILD
|
||||
if (fdt_getprop(blob, offset, "u-boot,dm-tpl", NULL))
|
||||
return 1;
|
||||
#elif defined(CONFIG_SPL_BUILD)
|
||||
if (fdt_getprop(blob, offset, "u-boot,dm-spl", NULL))
|
||||
return 1;
|
||||
#else
|
||||
/*
|
||||
* In regular builds individual spl and tpl handling both
|
||||
* count as handled pre-relocation for later second init.
|
||||
*/
|
||||
if (fdt_getprop(blob, offset, "u-boot,dm-spl", NULL) ||
|
||||
fdt_getprop(blob, offset, "u-boot,dm-tpl", NULL))
|
||||
return 1;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <dm/lists.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <dm/uclass.h>
|
||||
#include <dm/util.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
|
@ -131,7 +132,7 @@ static int pinconfig_post_bind(struct udevice *dev)
|
|||
offset > 0;
|
||||
offset = fdt_next_subnode(fdt, offset)) {
|
||||
if (pre_reloc_only &&
|
||||
!fdt_getprop(fdt, offset, "u-boot,dm-pre-reloc", NULL))
|
||||
!dm_fdt_pre_reloc(fdt, offset))
|
||||
continue;
|
||||
/*
|
||||
* If this node has "compatible" property, this is not
|
||||
|
|
|
@ -48,4 +48,30 @@ static inline void dm_dump_devres(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Check if a dt node should be or was bound before relocation.
|
||||
*
|
||||
* Devicetree nodes can be marked as needed to be bound
|
||||
* in the loader stages via special devicetree properties.
|
||||
*
|
||||
* Before relocation this function can be used to check if nodes
|
||||
* are required in either SPL or TPL stages.
|
||||
*
|
||||
* After relocation and jumping into the real U-Boot binary
|
||||
* it is possible to determine if a node was bound in one of
|
||||
* SPL/TPL stages.
|
||||
*
|
||||
* There are 3 settings currently in use
|
||||
* -
|
||||
* - u-boot,dm-pre-reloc: legacy and indicates any of TPL or SPL
|
||||
* Existing platforms only use it to indicate nodes needee in
|
||||
* SPL. Should probably be replaced by u-boot,dm-spl for
|
||||
* existing platforms.
|
||||
* @blob: devicetree
|
||||
* @offset: node offset
|
||||
*
|
||||
* Returns true if node is needed in SPL/TL, false otherwise.
|
||||
*/
|
||||
int dm_fdt_pre_reloc(const void *blob, int offset);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -215,8 +215,13 @@ $(obj)/$(SPL_BIN)-pad.bin: $(obj)/$(SPL_BIN)
|
|||
# 'u-boot,dm-pre-reloc' property and thus are not needed by SPL. The second
|
||||
# pass removes various unused properties from the remaining nodes.
|
||||
# The output is typically a much smaller device tree file.
|
||||
ifeq ($(CONFIG_TPL_BUILD),y)
|
||||
fdtgrep_props := -b u-boot,dm-pre-reloc -b u-boot,dm-tpl
|
||||
else
|
||||
fdtgrep_props := -b u-boot,dm-pre-reloc -b u-boot,dm-spl
|
||||
endif
|
||||
quiet_cmd_fdtgrep = FDTGREP $@
|
||||
cmd_fdtgrep = $(objtree)/tools/fdtgrep -b u-boot,dm-pre-reloc -RT $< \
|
||||
cmd_fdtgrep = $(objtree)/tools/fdtgrep $(fdtgrep_props) -RT $< \
|
||||
-n /chosen -O dtb | \
|
||||
$(objtree)/tools/fdtgrep -r -O dtb - -o $@ \
|
||||
$(addprefix -P ,$(subst $\",,$(CONFIG_OF_SPL_REMOVE_PROPS)))
|
||||
|
|
|
@ -30,6 +30,8 @@ PROP_IGNORE_LIST = [
|
|||
"status",
|
||||
'phandle',
|
||||
'u-boot,dm-pre-reloc',
|
||||
'u-boot,dm-tpl',
|
||||
'u-boot,dm-spl',
|
||||
]
|
||||
|
||||
# C type declarations for the tyues we support
|
||||
|
|
Loading…
Reference in a new issue