[U-Boot] [PATCH v2 16/19] lib: fdtdec: Add function re-setup the fdt more effeciently
Simon Glass
sjg at chromium.org
Thu Oct 11 03:13:11 UTC 2018
Hi Jean-Jacques,
On 5 October 2018 at 10:45, Jean-Jacques Hiblot <jjhiblot at ti.com> wrote:
> In some cases it may be useful to be able to change the fdt we have been
> using and use another one instead. For example, the TI platforms uses an
> EEPROM to store board information and, based on the type of board,
> different dtbs are used by the SPL. When DM_I2C is used, a first dtb must
> be used before the I2C is initialized and only then the final dtb can be
> selected.
> To speed up the process and reduce memory usage, introduce a new function
> fdtdec_setup_best_match() that re-use the DTBs loaded in memory by
> fdtdec_setup() to select the best match.
>
> Signed-off-by: Jean-Jacques Hiblot <jjhiblot at ti.com>
> ---
>
> Changes in v2: None
>
> include/asm-generic/global_data.h | 4 ++++
> include/fdtdec.h | 17 +++++++++++++++++
> lib/fdtdec.c | 38 +++++++++++++++++++++++++++++++++++++-
> 3 files changed, 58 insertions(+), 1 deletion(-)
>
> diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
> index c83fc01..49287fa 100644
> --- a/include/asm-generic/global_data.h
> +++ b/include/asm-generic/global_data.h
> @@ -77,6 +77,10 @@ typedef struct global_data {
> #ifdef CONFIG_OF_LIVE
> struct device_node *of_root;
> #endif
> +
> +#if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
> + const void *multi_dtb_fit;
comment please
> +#endif
> struct jt_funcs *jt; /* jump table */
> char env_buf[32]; /* buffer for env_get() before reloc. */
> #ifdef CONFIG_TRACE
> diff --git a/include/fdtdec.h b/include/fdtdec.h
> index 83be064..2cb3da2 100644
> --- a/include/fdtdec.h
> +++ b/include/fdtdec.h
> @@ -996,6 +996,23 @@ int fdtdec_setup_memory_banksize(void);
> */
> int fdtdec_setup(void);
>
> +#if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
> +/**
> + * fdtdec_resetup() - Set up the device tree ready for use again.
Please remove .
> + *
> + * The main difference with fdtdec_setup() is that it returns if the fdt has
> + * changed because a better match has been found.
> + * This is typically used for boards that rely on a DM driver to detect the
> + * board type.
> + *
> + * @param rescan Return a flag indicating that fdt has changed and rescaning the
> + * fdt is required.
This should be bool I think.
also 'rescanning'
Who actually calls this function and when is it permitted to call it?
I think then needs a bit more info in the comment.
Also I think you should mention it in the docs, perhaps README.fdt-control
Finally this calls either fdtdec_setup() or fdtdec_prepare() but I am
not not why it calls one or the other. Please add more docs/comments.
> + *
> + * @return 0 if OK, -ve on error
> + */
> +int fdtdec_resetup(int *rescan);
> +#endif
> +
> /**
> * Board-specific FDT initialization. Returns the address to a device tree blob.
> * Called when CONFIG_OF_BOARD is defined, or if CONFIG_OF_SEPARATE is defined
> diff --git a/lib/fdtdec.c b/lib/fdtdec.c
> index 74196ce..3b80bd4 100644
> --- a/lib/fdtdec.c
> +++ b/lib/fdtdec.c
> @@ -1353,14 +1353,50 @@ int fdtdec_setup(void)
> * If so, pick the most relevant
> */
> fdt_blob = locate_dtb_in_fit(gd->fdt_blob);
> - if (fdt_blob)
> + if (fdt_blob) {
> + gd->multi_dtb_fit = gd->fdt_blob;
> gd->fdt_blob = fdt_blob;
> + }
> +
> # endif
> #endif
>
> return fdtdec_prepare_fdt();
> }
>
> +#if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
> +int fdtdec_resetup(int *rescan)
> +{
> + void *fdt_blob;
> +
> + /*
> + * If the current DTB is part of a compressed FIT image,
> + * try to locate the best match from the uncompressed
> + * FIT image stillpresent there. Save the time and space
is still present ? This doesn't make sense.
> + * required to uncompress it again.
> + */
> + if (gd->multi_dtb_fit) {
> + fdt_blob = locate_dtb_in_fit(gd->multi_dtb_fit);
> +
> + if (fdt_blob == gd->fdt_blob) {
> + /*
> + * The best match did not change. no need to tear down
> + * the DM and rescan the fdt.
> + */
> + *rescan = 0;
> + return 0;
> + }
> +
> + *rescan = 1;
> + gd->fdt_blob = fdt_blob;
> + return fdtdec_prepare_fdt();
> + }
> +
> + *rescan = 1;
> + return fdtdec_setup();
> +}
> +#endif
> +
> #ifdef CONFIG_NR_DRAM_BANKS
> int fdtdec_decode_ram_size(const void *blob, const char *area, int board_id,
> phys_addr_t *basep, phys_size_t *sizep, bd_t *bd)
> --
> 2.7.4
>
Regards,
Simon
More information about the U-Boot
mailing list