diff options
| -rw-r--r-- | doc/driver-model/README.txt | 4 | ||||
| -rw-r--r-- | drivers/clk/at91/pmc.c | 3 | ||||
| -rw-r--r-- | drivers/core/root.c | 2 | ||||
| -rw-r--r-- | drivers/core/util.c | 25 | ||||
| -rw-r--r-- | drivers/pinctrl/pinctrl-uclass.c | 3 | ||||
| -rw-r--r-- | include/dm/util.h | 26 | ||||
| -rw-r--r-- | scripts/Makefile.spl | 7 | ||||
| -rwxr-xr-x | tools/dtoc/dtoc.py | 2 | 
8 files changed, 68 insertions, 4 deletions
| diff --git a/doc/driver-model/README.txt b/doc/driver-model/README.txt index fea324e25ee..0853477578a 100644 --- a/doc/driver-model/README.txt +++ b/doc/driver-model/README.txt @@ -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 diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c index c73156a0df1..fcd693a2f6f 100644 --- a/drivers/clk/at91/pmc.c +++ b/drivers/clk/at91/pmc.c @@ -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 diff --git a/drivers/core/root.c b/drivers/core/root.c index 175fd3fb252..93ab5682968 100644 --- a/drivers/core/root.c +++ b/drivers/core/root.c @@ -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"); diff --git a/drivers/core/util.c b/drivers/core/util.c index e01dd06d282..bd4de7acd69 100644 --- a/drivers/core/util.c +++ b/drivers/core/util.c @@ -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; +} diff --git a/drivers/pinctrl/pinctrl-uclass.c b/drivers/pinctrl/pinctrl-uclass.c index 49afe91c24e..9efad0623a3 100644 --- a/drivers/pinctrl/pinctrl-uclass.c +++ b/drivers/pinctrl/pinctrl-uclass.c @@ -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 diff --git a/include/dm/util.h b/include/dm/util.h index 15daa3d19f1..32060ab30eb 100644 --- a/include/dm/util.h +++ b/include/dm/util.h @@ -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 diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl index b52f9963f7d..5370648e853 100644 --- a/scripts/Makefile.spl +++ b/scripts/Makefile.spl @@ -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))) diff --git a/tools/dtoc/dtoc.py b/tools/dtoc/dtoc.py index 6df7b0da13a..bf67ec80ca1 100755 --- a/tools/dtoc/dtoc.py +++ b/tools/dtoc/dtoc.py @@ -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 | 
