[U-Boot] [PATCH] spl: make CONFIG_OF_EMBED pass dts through fdtgrep
Goldschmidt Simon
sgoldschmidt at de.pepperl-fuchs.com
Wed Nov 22 09:16:57 UTC 2017
Hi Lukasz
> > Building spl with CONFIG_OF_EMBED enabled results in an error message
> ^^^^^^^^^^^^^^^ - is the CONFIG_OF_EMBED a standard
> feature for SPL?
Well, it's not really a standard feature I want to use in my final
product. But if I want to debug SPL or U-Boot on my socfpga (using
ARM's DS-5 for Altera), I need the device tree to be included in the
binary that the debugger downloads to the target.
That's what CONFIG_OF_EMBED is for, right? I even need this to debug
U-Boot, as the standard procedure for my target is to first start SPL
via the debugger, halt at a specific hardware breakpoint and the load
U-Boot which I want to debug.
> > on my board: "SPL image too big". This is because the fdtgrep build
> > step is only executed for CONFIG_OF_SEPARATE.
>
> So the problem is with not enough runs of dtb stripping?
No, the problem that the dtb is not stripped at all for CONFIG_OF_EMBED.
The only thing that is stripped is 'spl/u-boot-spl.dtb' which is only
created for CONFIG_OF_SEPARATE.
>
> >
> > Fix this by moving the fdtgrep build step ('cmd_fdtgreo') from
> > scripts/Makefile.spl to dts/Makefile so that the reduced dtb is
> > available for all kinds of spl builds.
>
> Ok.
>
> >
> > The resulting variable name for the embedded device tree blob changes,
> > too, which is why common.h and fdtdec.c have tiny changes.
> >
> > Signed-off-by: Simon Goldschmidt <sgoldschmidt at de.pepperl-fuchs.com>
> > ---
> > dts/Makefile | 35 +++++++++++++++++++++++++++++++----
> > include/common.h | 1 +
> > lib/fdtdec.c | 4 ++++
> > scripts/Makefile.spl | 20 ++------------------
> > 4 files changed, 38 insertions(+), 22 deletions(-)
> >
> > diff --git a/dts/Makefile b/dts/Makefile index 3a93dafb51..c9b2a89441
> > 100644
> > --- a/dts/Makefile
> > +++ b/dts/Makefile
> > @@ -22,10 +22,29 @@ DTB := $(ARCH_PATH)/$(DEVICE_TREE).dtb
> > dtb_depends += $(DTB:.dtb=.dts) endif
> >
> > +# Pass the original device tree file through fdtgrep twice. The
> > first pass +# removes any unwanted nodes (i.e. those which don't have
> > the +# '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 $(fdtgrep_props) -RT $<
> > \
> > + -n /chosen -n /config -O dtb | \
> > + $(objtree)/tools/fdtgrep -r -O dtb - -o $@ \
> > + $(addprefix -P ,$(subst
> > $\",,$(CONFIG_OF_SPL_REMOVE_PROPS))) +
> > +$(obj)/dt-spl.dtb: $(DTB) $(objtree)/tools/fdtgrep FORCE
> > + $(call if_changed,fdtgrep)
> > +
> > $(obj)/dt.dtb: $(DTB) FORCE
> > $(call if_changed,shipped)
> >
> > -targets += dt.dtb
> > +targets += dt.dtb dt-spl.dtb
> >
> > $(DTB): $(dtb_depends)
> > ifeq ($(EXT_DTB),)
> > @@ -42,14 +61,22 @@ endif
> > arch-dtbs:
> > $(Q)$(MAKE) $(build)=$(ARCH_PATH) dtbs
> >
> > -.SECONDARY: $(obj)/dt.dtb.S
> > +.SECONDARY: $(obj)/dt.dtb.S $(obj)/dt-spl.dtb.S
> >
> > +
> > +ifeq ($(CONFIG_SPL_BUILD),y)
> > +obj-$(CONFIG_OF_EMBED) := dt-spl.dtb.o # support "out-of-tree" build
> > +for dtb-spl
> > +$(obj)/dt-spl.dtb.o: $(obj)/dt-spl.dtb.S FORCE
> > + $(call if_changed_dep,as_o_S)
> > +else
> > obj-$(CONFIG_OF_EMBED) := dt.dtb.o
> > +endif
> >
> > -dtbs: $(obj)/dt.dtb
> > +dtbs: $(obj)/dt.dtb $(obj)/dt-spl.dtb
> > @:
> >
> > -clean-files := dt.dtb.S
> > +clean-files := dt.dtb.S dt-spl.dtb.S
> >
> > # Let clean descend into dts directories
> > subdir-
> > += ../arch/arm/dts ../arch/microblaze/dts ../arch/mips/dts
> > +../arch/sandbox/dts ../arch/x86/dts
> > diff --git a/include/common.h b/include/common.h index
> > e14e1daa88..6e24545178 100644 --- a/include/common.h
> > +++ b/include/common.h
> > @@ -201,6 +201,7 @@ int last_stage_init(void); extern ulong
> > monitor_flash_len; int mac_read_from_eeprom(void);
> > extern u8 __dtb_dt_begin[]; /* embedded device tree blob */
> > +extern u8 __dtb_dt_spl_begin[]; /* embedded device tree blob
> > for SPL/TPL */ int set_cpu_clk_info(void); int mdm_init(void); int
> > print_cpuinfo(void); diff --git a/lib/fdtdec.c b/lib/fdtdec.c index
> > 45f3fe7baf..0eb0b92261 100644
> > --- a/lib/fdtdec.c
> > +++ b/lib/fdtdec.c
> > @@ -1266,7 +1266,11 @@ int fdtdec_setup(void) # endif # ifdef
> > CONFIG_OF_EMBED
> > /* Get a pointer to the FDT */
> > +# ifdef CONFIG_SPL_BUILD
> > + gd->fdt_blob = __dtb_dt_spl_begin;
> > +# else
> > gd->fdt_blob = __dtb_dt_begin;
> > +# endif
> > # elif defined CONFIG_OF_SEPARATE
> > # ifdef CONFIG_SPL_BUILD
> > /* FDT is at end of BSS unless it is in a different memory region */
> > diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl index
> > 49b27ac926..d3c176d775 100644
> > --- a/scripts/Makefile.spl
> > +++ b/scripts/Makefile.spl
> > @@ -238,24 +238,8 @@ $(obj)/$(SPL_BIN)-pad.bin: $(obj)/$(SPL_BIN)
> > @bss_size_str=$(shell $(NM) $< | awk 'BEGIN {size = 0} /__bss_size/
> > {size = $$1} END {print "ibase=16; " toupper(size)}'
> > | bc); \ dd if=/dev/zero of=$@ bs=1 count=$${bss_size_str}
> > 2>/dev/null; -# Pass the original device tree file through fdtgrep
> > 2>twice. The first pass
> > -# removes any unwanted nodes (i.e. those which don't have the -#
> > '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 $(fdtgrep_props) -RT $<
> > \
> > - -n /chosen -n /config -O dtb | \
> > - $(objtree)/tools/fdtgrep -r -O dtb - -o $@ \
> > - $(addprefix -P ,$(subst
> > $\",,$(CONFIG_OF_SPL_REMOVE_PROPS))) -
> > -$(obj)/$(SPL_BIN).dtb: dts/dt.dtb $(objtree)/tools/fdtgrep FORCE
> > - $(call if_changed,fdtgrep)
> > +$(obj)/$(SPL_BIN).dtb: dts/dt-spl.dtb FORCE
> > + $(call if_changed,copy)
> >
> > pythonpath = PYTHONPATH=tools
> >
Best regards,
Simon Goldschmidt
More information about the U-Boot
mailing list