Message ID | 20191206213936.v6.1.I8c03ae7027508705f6f535ba5137b5e6c5dea840@changeid |
---|---|
State | Accepted |
Commit | 3c10dc95bdd0706ff85ffdc25ecd6381c3d51e4c |
Delegated to: | Bin Meng |
Headers | show |
Series | x86: Add initial support for apollolake | expand |
On Sat, Dec 7, 2019 at 12:45 PM Simon Glass <sjg@chromium.org> wrote: > > SPL and TPL can access information about binman entries using link-time > symbols but this is not available in U-Boot proper. Of course it could be > made available, but the intention is to just read the device tree. > > Add support for this, so that U-Boot can locate entries. > > Signed-off-by: Simon Glass <sjg@chromium.org> > Reviewed-by: Bin Meng <bmeng.cn@gmail.com> > --- > > Changes in v6: None > Changes in v5: > - Fix build errors on some PowerPC boards > > Changes in v4: > - Add comments to functions > > Changes in v3: None > Changes in v2: None > > common/board_r.c | 10 ++++++++++ > include/binman.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ > lib/Kconfig | 10 ++++++++++ > lib/Makefile | 1 + > lib/binman.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 114 insertions(+) > create mode 100644 include/binman.h > create mode 100644 lib/binman.c > applied to u-boot-x86/next, thanks!
On 12/7/19 6:08 PM, Bin Meng wrote: > On Sat, Dec 7, 2019 at 12:45 PM Simon Glass <sjg@chromium.org> wrote: >> >> SPL and TPL can access information about binman entries using link-time >> symbols but this is not available in U-Boot proper. Of course it could be >> made available, but the intention is to just read the device tree. >> >> Add support for this, so that U-Boot can locate entries. ... > applied to u-boot-x86/next, thanks! This patch caused a failure during early boot on Jetson TX2. Can you please take a look, or revert the patch until this can be investigated? Thanks. U-Boot 2020.01-rc4-00256-g3c10dc95bdd0 (Jan 07 2020 - 10:25:00 -0700) SoC: tegra186 Model: NVIDIA P2771-0000-500 Board: NVIDIA P2771-0000 DRAM: 7.8 GiB initcall sequence 00000000fffb7858 failed at call 00000000800955a8 (err=-22) ### ERROR ### Please RESET the board ###
On 1/7/20 10:32 AM, Stephen Warren wrote: > On 12/7/19 6:08 PM, Bin Meng wrote: >> On Sat, Dec 7, 2019 at 12:45 PM Simon Glass <sjg@chromium.org> wrote: >>> >>> SPL and TPL can access information about binman entries using link-time >>> symbols but this is not available in U-Boot proper. Of course it >>> could be >>> made available, but the intention is to just read the device tree. >>> >>> Add support for this, so that U-Boot can locate entries. > ... >> applied to u-boot-x86/next, thanks! > > This patch caused a failure during early boot on Jetson TX2. Can you > please take a look, or revert the patch until this can be investigated? > Thanks. > > U-Boot 2020.01-rc4-00256-g3c10dc95bdd0 (Jan 07 2020 - 10:25:00 -0700) > > SoC: tegra186 > Model: NVIDIA P2771-0000-500 > Board: NVIDIA P2771-0000 > DRAM: 7.8 GiB > initcall sequence 00000000fffb7858 failed at call 00000000800955a8 > (err=-22) > ### ERROR ### Please RESET the board ### Nevermind; I found some strange DT inconsistency introduced long ago that now triggers some issue in this patch. I'll send a patch for this soon.
On Tue, 7 Jan 2020 at 10:57, Stephen Warren <swarren@wwwdotorg.org> wrote: > > On 1/7/20 10:32 AM, Stephen Warren wrote: > > On 12/7/19 6:08 PM, Bin Meng wrote: > >> On Sat, Dec 7, 2019 at 12:45 PM Simon Glass <sjg@chromium.org> wrote: > >>> > >>> SPL and TPL can access information about binman entries using link-time > >>> symbols but this is not available in U-Boot proper. Of course it > >>> could be > >>> made available, but the intention is to just read the device tree. > >>> > >>> Add support for this, so that U-Boot can locate entries. > > ... > >> applied to u-boot-x86/next, thanks! > > > > This patch caused a failure during early boot on Jetson TX2. Can you > > please take a look, or revert the patch until this can be investigated? > > Thanks. > > > > U-Boot 2020.01-rc4-00256-g3c10dc95bdd0 (Jan 07 2020 - 10:25:00 -0700) > > > > SoC: tegra186 > > Model: NVIDIA P2771-0000-500 > > Board: NVIDIA P2771-0000 > > DRAM: 7.8 GiB > > initcall sequence 00000000fffb7858 failed at call 00000000800955a8 > > (err=-22) > > ### ERROR ### Please RESET the board ### > > Nevermind; I found some strange DT inconsistency introduced long ago > that now triggers some issue in this patch. I'll send a patch for this soon. Thanks Stephen. - Simon
Hi, this Patch seems to break init-chain at least on bpi-r64 if BINMAN_FDT not disabled (enabled by default). adding some code for debugging 38 int binman_init(void) 39 { 40 binman = malloc(sizeof(struct binman_info)); 41 printf("%s:%d",__FUNCTION__,__LINE__); 42 if (!binman) 43 return log_msg_ret("space for binman", -ENOMEM); 44 printf("%s:%d",__FUNCTION__,__LINE__); 45 binman->image = ofnode_path("/binman"); 46 printf("%s:%d",__FUNCTION__,__LINE__); 47 if (!ofnode_valid(binman->image)) 48 return log_msg_ret("binman node", -EINVAL); <<<<<<<<<<< this seems to break init-flow 49 50 printf("%s:%d",__FUNCTION__,__LINE__); 51 return 0; 52 } results in this: binman_init:41binman_init:44binman_init:46initcall sequence 000000004ffd2588 failed at call 0000000041e0cdec (err=-22) regards Frank
Hi, a bit more info about this... this line [1] (in my case) breaks the init-chain: return log_msg_ret("binman node", -EINVAL); the binman_init [2] is added to init_sequence_r[] which is executed by initcall_run_list ./common/board_r.c:897: if (initcall_run_list(init_sequence_r)) exiting the binman-function [3] with error-code (return <> 0) exits the full chain (./include/initcall.h) [4] with message initcall sequence %p failed at call %p how to deal with this? - do not select binman as default=y in Kconfig - adding the binman-node [1] to all dts - do not exit with error-code (only print/log message) - do not exit the init-sequence on binman-error [3] - more ideas? in our case we disabled option CONFIG_BINMAN_FDT [5] regards Frank [1] https://gitlab.denx.de/u-boot/u-boot/blob/master/lib/binman.c#L45 [2] https://gitlab.denx.de/u-boot/u-boot/blob/master/common/board_r.c#L722 [3] https://gitlab.denx.de/u-boot/u-boot/blob/master/common/board_r.c#L369 [4] https://gitlab.denx.de/u-boot/u-boot/blob/master/include/initcall.h#L42 [5] http://forum.banana-pi.org/t/bpi-r64-current-u-boot-support/10077/69
Hi Frank, On Fri, 24 Jan 2020 at 11:15, Frank Wunderlich <frank-w@public-files.de> wrote: > > Hi, > > a bit more info about this... Sorry for the delay. Stephen hit this also. > > this line [1] (in my case) breaks the init-chain: > > return log_msg_ret("binman node", -EINVAL); > > the binman_init [2] is added to init_sequence_r[] which is executed by initcall_run_list > > ./common/board_r.c:897: if (initcall_run_list(init_sequence_r)) > > exiting the binman-function [3] with error-code (return <> 0) exits the full chain (./include/initcall.h) [4] with message > > initcall sequence %p failed at call %p > > how to deal with this? > > - do not select binman as default=y in Kconfig Where is it selected by default? bpi-r64 uses binman to build its image so I think BINMAN is on. > - adding the binman-node [1] to all dts Yes, but in fact it should already be there. I see in the Makefile that 64-bit sunxi uses 'cat' instead of 'binman'. It should use binman. > - do not exit with error-code (only print/log message) Not keen on that > - do not exit the init-sequence on binman-error [3] or that > - more ideas? Let's convert bpi-64 as above. > > in our case we disabled option CONFIG_BINMAN_FDT [5] > > regards Frank > > [1] https://gitlab.denx.de/u-boot/u-boot/blob/master/lib/binman.c#L45 > [2] https://gitlab.denx.de/u-boot/u-boot/blob/master/common/board_r.c#L722 > [3] https://gitlab.denx.de/u-boot/u-boot/blob/master/common/board_r.c#L369 > [4] https://gitlab.denx.de/u-boot/u-boot/blob/master/include/initcall.h#L42 > > [5] http://forum.banana-pi.org/t/bpi-r64-current-u-boot-support/10077/69 > Regards, Simon
Am 12. Februar 2020 00:03:18 MEZ schrieb Simon Glass <sjg@chromium.org>: >Hi Frank, > >Sorry for the delay. Stephen hit this also. Hi Simon, good that my mail was not lost 😁 >> >> this line [1] (in my case) breaks the init-chain: >> >> return log_msg_ret("binman node", -EINVAL); >> >> the binman_init [2] is added to init_sequence_r[] which is executed >by initcall_run_list >> >> ./common/board_r.c:897: if (initcall_run_list(init_sequence_r)) >> >> exiting the binman-function [3] with error-code (return <> 0) exits >the full chain (./include/initcall.h) [4] with message >> >> initcall sequence %p failed at call %p >> >> how to deal with this? >> >> - do not select binman as default=y in Kconfig > >Where is it selected by default? https://gitlab.denx.de/u-boot/u-boot/blob/master/lib/Kconfig#L13 >bpi-r64 uses binman to build its image so I think BINMAN is on. > >> - adding the binman-node [1] to all dts > >Yes, but in fact it should already be there. I see in the Makefile >that 64-bit sunxi uses 'cat' instead of 'binman'. It should use >binman. https://gitlab.denx.de/u-boot/u-boot/blob/master/arch/arm/dts/mt7622.dtsi https://gitlab.denx.de/u-boot/u-boot/blob/master/arch/arm/dts/mt7622-rfb.dts I see no binman there >> - do not exit with error-code (only print/log message) > >Not keen on that > >> - do not exit the init-sequence on binman-error [3] > >or that > >> - more ideas? > >Let's convert bpi-64 as above. What do i need to add/change >> >> in our case we disabled option CONFIG_BINMAN_FDT [5] >> >> regards Frank >> >> [1] https://gitlab.denx.de/u-boot/u-boot/blob/master/lib/binman.c#L45 >> [2] >https://gitlab.denx.de/u-boot/u-boot/blob/master/common/board_r.c#L722 >> [3] >https://gitlab.denx.de/u-boot/u-boot/blob/master/common/board_r.c#L369 >> [4] >https://gitlab.denx.de/u-boot/u-boot/blob/master/include/initcall.h#L42 >> >> [5] >http://forum.banana-pi.org/t/bpi-r64-current-u-boot-support/10077/69 >> > >Regards, >Simon Mit freundlichen Grüßen Frank Wunderlich
Hi Frank, On Wed, 12 Feb 2020 at 04:50, Frank Wunderlich <frank-w@public-files.de> wrote: > > Am 12. Februar 2020 00:03:18 MEZ schrieb Simon Glass <sjg@chromium.org>: > >Hi Frank, > > > >Sorry for the delay. Stephen hit this also. > > Hi Simon, > good that my mail was not lost > > >> > >> this line [1] (in my case) breaks the init-chain: > >> > >> return log_msg_ret("binman node", -EINVAL); > >> > >> the binman_init [2] is added to init_sequence_r[] which is executed > >by initcall_run_list > >> > >> ./common/board_r.c:897: if (initcall_run_list(init_sequence_r)) > >> > >> exiting the binman-function [3] with error-code (return <> 0) exits > >the full chain (./include/initcall.h) [4] with message > >> > >> initcall sequence %p failed at call %p > >> > >> how to deal with this? > >> > >> - do not select binman as default=y in Kconfig > > > >Where is it selected by default? > > https://gitlab.denx.de/u-boot/u-boot/blob/master/lib/Kconfig#L13 > > >bpi-r64 uses binman to build its image so I think BINMAN is on. > > > >> - adding the binman-node [1] to all dts > > > >Yes, but in fact it should already be there. I see in the Makefile > >that 64-bit sunxi uses 'cat' instead of 'binman'. It should use > >binman. > > https://gitlab.denx.de/u-boot/u-boot/blob/master/arch/arm/dts/mt7622.dtsi > https://gitlab.denx.de/u-boot/u-boot/blob/master/arch/arm/dts/mt7622-rfb.dts > > I see no binman there > > >> - do not exit with error-code (only print/log message) > > > >Not keen on that > > > >> - do not exit the init-sequence on binman-error [3] > > > >or that > > > >> - more ideas? > > > >Let's convert bpi-64 as above. > > What do i need to add/change This code in the Makefile should do the same thing for ARM64 and 32: ifneq ($(CONFIG_ARCH_SUNXI),) ifeq ($(CONFIG_ARM64),) u-boot-sunxi-with-spl.bin: spl/sunxi-spl.bin u-boot.img u-boot.dtb FORCE $(call if_changed,binman) else u-boot-sunxi-with-spl.bin: spl/sunxi-spl.bin u-boot.itb FORCE $(call if_changed,cat) endif endif To make this work I think you'll need to add a new 'sunxi-itb' entry type into binman as a first step. That is ugly but it will work. Then mksunxi_fit_atf.sh should move into binman, with 'sunxi-itb' becoming a new method that generates the .its from source. I can help with that bit. Regards, Simon
Hi Why not just disable binman_fdt (or not default y)? Your way sounds more complex. As i do not understand it and see no benefit for this board, i would leave it disabled. This leave time for a thoughtful solution Maybe mtk knows a better way... Sunxi sounds wrong because board is not with allwinner soc. Maybe a more generic name as target for boards not yet supported by binman_fdt? Regards Frank Am 12. Februar 2020 18:14:29 MEZ schrieb Simon Glass <sjg@chromium.org>: > >This code in the Makefile should do the same thing for ARM64 and 32: > >ifneq ($(CONFIG_ARCH_SUNXI),) >ifeq ($(CONFIG_ARM64),) >u-boot-sunxi-with-spl.bin: spl/sunxi-spl.bin u-boot.img u-boot.dtb >FORCE >$(call if_changed,binman) >else >u-boot-sunxi-with-spl.bin: spl/sunxi-spl.bin u-boot.itb FORCE >$(call if_changed,cat) >endif >endif > >To make this work I think you'll need to add a new 'sunxi-itb' entry >type into binman as a first step. That is ugly but it will work. > >Then mksunxi_fit_atf.sh should move into binman, with 'sunxi-itb' >becoming a new method that generates the .its from source. I can help >with that bit. > >Regards, >Simon
Hi Frank, On Wed, 12 Feb 2020 at 11:02, Frank Wunderlich <frank-w@public-files.de> wrote: > > Hi > > Why not just disable binman_fdt (or not default y)? Your way sounds more complex. As i do not understand it and see no benefit for this board, i would leave it disabled. This leave time for a thoughtful solution > Maybe mtk knows a better way... > > Sunxi sounds wrong because board is not with allwinner soc. Maybe a more generic name as target for boards not yet supported by binman_fdt? Oh so now I am confused. What U-Boot board name are you referring to? I assumed it was bananapi_m64. Regards, Simon > > Regards Frank > > Am 12. Februar 2020 18:14:29 MEZ schrieb Simon Glass <sjg@chromium.org>: > > > >This code in the Makefile should do the same thing for ARM64 and 32: > > > >ifneq ($(CONFIG_ARCH_SUNXI),) > >ifeq ($(CONFIG_ARM64),) > >u-boot-sunxi-with-spl.bin: spl/sunxi-spl.bin u-boot.img u-boot.dtb > >FORCE > >$(call if_changed,binman) > >else > >u-boot-sunxi-with-spl.bin: spl/sunxi-spl.bin u-boot.itb FORCE > >$(call if_changed,cat) > >endif > >endif > > > >To make this work I think you'll need to add a new 'sunxi-itb' entry > >type into binman as a first step. That is ugly but it will work. > > > >Then mksunxi_fit_atf.sh should move into binman, with 'sunxi-itb' > >becoming a new method that generates the .its from source. I can help > >with that bit. > > > >Regards, > >Simon
Hi, i guess you mean this (board is bananapi R64, not M64): board/mediatek/mt7622/mt7622_rfb.c arch/arm/dts/mt7622.dtsi arch/arm/dts/mt7622-rfb.dts currently i have added CONFIG_BINMAN_FDT=n to configs/mt7622_rfb_defconfig to avoid the Problem regards Frank > Gesendet: Donnerstag, 13. Februar 2020 um 18:40 Uhr > Von: "Simon Glass" <sjg@chromium.org> > Betreff: Re: [BUG] binman: Add a library to access binman entries > > Hi Frank, > > On Wed, 12 Feb 2020 at 11:02, Frank Wunderlich <frank-w@public-files.de> wrote: > > > > Hi > > > > Why not just disable binman_fdt (or not default y)? Your way sounds more complex. As i do not understand it and see no benefit for this board, i would leave it disabled. This leave time for a thoughtful solution > > Maybe mtk knows a better way... > > > > Sunxi sounds wrong because board is not with allwinner soc. Maybe a more generic name as target for boards not yet supported by binman_fdt? > > Oh so now I am confused. What U-Boot board name are you referring to? > I assumed it was bananapi_m64. > > Regards, > Simon
Hi Frank, On Thu, 13 Feb 2020 at 10:51, Frank Wunderlich <frank-w@public-files.de> wrote: > > Hi, > > i guess you mean this (board is bananapi R64, not M64): > > board/mediatek/mt7622/mt7622_rfb.c > arch/arm/dts/mt7622.dtsi > arch/arm/dts/mt7622-rfb.dts > > currently i have added > > CONFIG_BINMAN_FDT=n > > to configs/mt7622_rfb_defconfig to avoid the Problem The problem is that in ARCH_MEDIATEK you have 'select BINMAN'. If binan is used, it expects that you will use it at run time, so enables BINMAN_FDT. If you are not actually using binman, why is it enabled? Regards, Simon
Hi Simon,Ryder The binman-option is introduced by this commit: https://gitlab.denx.de/u-boot/u-boot/commit/cbd2fba1eca11300649052e289685e7404e0b81c add basic support for MT7629 boards @ryder is binman used (mt7629)? R2 and r64 are affected from this issue (boot broken by binman_fdt). Have it disabled in my repo for both boards but upstream is broken. Binman was not active for these 2 till this commit so i guess it is unused.maybe only for mt7629 Regards Frank Am 17. Februar 2020 04:55:50 MEZ schrieb Simon Glass <sjg@chromium.org>: >Hi Frank, > >On Thu, 13 Feb 2020 at 10:51, Frank Wunderlich ><frank-w@public-files.de> wrote: >> >> Hi, >> >> i guess you mean this (board is bananapi R64, not M64): >> >> board/mediatek/mt7622/mt7622_rfb.c >> arch/arm/dts/mt7622.dtsi >> arch/arm/dts/mt7622-rfb.dts >> >> currently i have added >> >> CONFIG_BINMAN_FDT=n >> >> to configs/mt7622_rfb_defconfig to avoid the Problem > >The problem is that in ARCH_MEDIATEK you have 'select BINMAN'. If >binan is used, it expects that you will use it at run time, so enables >BINMAN_FDT. > >If you are not actually using binman, why is it enabled? > >Regards, >Simon
diff --git a/common/board_r.c b/common/board_r.c index 5464172259..9902c51c5e 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -18,6 +18,7 @@ #if defined(CONFIG_CMD_BEDBUG) #include <bedbug/type.h> #endif +#include <binman.h> #include <command.h> #include <console.h> #include <dm.h> @@ -347,6 +348,14 @@ static int initr_manual_reloc_cmdtable(void) } #endif +static int initr_binman(void) +{ + if (!CONFIG_IS_ENABLED(BINMAN_FDT)) + return 0; + + return binman_init(); +} + #if defined(CONFIG_MTD_NOR_FLASH) static int initr_flash(void) { @@ -697,6 +706,7 @@ static init_fnc_t init_sequence_r[] = { #ifdef CONFIG_EFI_LOADER efi_memory_init, #endif + initr_binman, stdio_init_tables, initr_serial, initr_announce, diff --git a/include/binman.h b/include/binman.h new file mode 100644 index 0000000000..b462dc8542 --- /dev/null +++ b/include/binman.h @@ -0,0 +1,45 @@ +/* SPDX-License-Identifier: Intel */ +/* + * Access to binman information at runtime + * + * Copyright 2019 Google LLC + * Written by Simon Glass <sjg@chromium.org> + */ + +#ifndef _BINMAN_H_ +#define _BINMAN_H_ + +/** + *struct binman_entry - information about a binman entry + * + * @image_pos: Position of entry in the image + * @size: Size of entry + */ +struct binman_entry { + u32 image_pos; + u32 size; +}; + +/** + * binman_entry_find() - Find a binman symbol + * + * This searches the binman information in the device tree for a symbol of the + * given name + * + * @name: Path to entry to examine (e.g. "/read-only/u-boot") + * @entry: Returns information about the entry + * @return 0 if OK, -ENOENT if the path is not found, other -ve value if the + * binman information is invalid (missing image-pos or size) + */ +int binman_entry_find(const char *name, struct binman_entry *entry); + +/** + * binman_init() - Set up the binman symbol information + * + * This locates the binary symbol information in the device tree ready for use + * + * @return 0 if OK, -ENOMEM if out of memory, -EINVAL if there is no binman node + */ +int binman_init(void); + +#endif diff --git a/lib/Kconfig b/lib/Kconfig index 965cf7bc03..d040a87d26 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -7,6 +7,16 @@ config BCH This is used by SoC platforms which do not have built-in ELM hardware engine required for BCH ECC correction. +config BINMAN_FDT + bool "Allow access to binman information in the device tree" + depends on BINMAN && OF_CONTROL + default y + help + This enables U-Boot to access information about binman entries, + stored in the device tree in a binman node. Typical uses are to + locate entries in the firmware image. See binman.h for the available + functionality. + config CC_OPTIMIZE_LIBS_FOR_SPEED bool "Optimize libraries for speed" help diff --git a/lib/Makefile b/lib/Makefile index 1fb650cd90..7a713a54dc 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -21,6 +21,7 @@ obj-$(CONFIG_ASN1_DECODER) += asn1_decoder.o obj-y += crypto/ obj-$(CONFIG_AES) += aes.o +obj-$(CONFIG_$(SPL_TPL_)BINMAN_FDT) += binman.o ifndef API_BUILD ifneq ($(CONFIG_UT_UNICODE)$(CONFIG_EFI_LOADER),) diff --git a/lib/binman.c b/lib/binman.c new file mode 100644 index 0000000000..1774bdf2e5 --- /dev/null +++ b/lib/binman.c @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: Intel +/* + * Access to binman information at runtime + * + * Copyright 2019 Google LLC + * Written by Simon Glass <sjg@chromium.org> + */ + +#include <common.h> +#include <binman.h> +#include <dm.h> + +struct binman_info { + ofnode image; +}; + +static struct binman_info *binman; + +int binman_entry_find(const char *name, struct binman_entry *entry) +{ + ofnode node; + int ret; + + node = ofnode_find_subnode(binman->image, name); + if (!ofnode_valid(node)) + return log_msg_ret("no binman node", -ENOENT); + + ret = ofnode_read_u32(node, "image-pos", &entry->image_pos); + if (ret) + return log_msg_ret("bad binman node1", ret); + ret = ofnode_read_u32(node, "size", &entry->size); + if (ret) + return log_msg_ret("bad binman node2", ret); + + return 0; +} + +int binman_init(void) +{ + binman = malloc(sizeof(struct binman_info)); + if (!binman) + return log_msg_ret("space for binman", -ENOMEM); + binman->image = ofnode_path("/binman"); + if (!ofnode_valid(binman->image)) + return log_msg_ret("binman node", -EINVAL); + + return 0; +}