[U-Boot] [PATCH 06/17] dm: Add callback to modify the device tree

Simon Glass sjg at chromium.org
Mon Dec 5 07:24:06 CET 2016


Hi,

On 1 December 2016 at 01:39, Stefan Roese <sr at denx.de> wrote:
> (Adding Simon and Maxim to Cc)
>
> On 23.11.2016 16:12, Mario Six wrote:
>>
>> Certain boards come in different variations by way of utilizing daughter
>> boards, for example. These boards might contain additional chips, which
>> are added to the main board's busses, e.g. I2C.
>>
>> The device tree support for such boards would either, quite naturally,
>> employ the overlay mechanism to add such chips to the tree, or would use
>> one large default device tree, and delete the devices that are actually
>> not present.
>>
>> Regardless of approach, even on the U-Boot level, a modification of the
>> device tree is a prerequisite to have such modular families of boards
>> supported properly.
>>
>> Therefore, we add an option to make the U-Boot device tree (the actual
>> copy later used by the driver model) writeable, and add a callback
>> method that allows boards to modify the device tree at an early stage,
>> at which, hopefully, also the application of device tree overlays will
>> be possible.
>>
>> Signed-off-by: Mario Six <mario.six at gdsys.cc>
>
>
> I didn't follow DT overlay lately closely especially not in U-Boot.
> Simon, Maxim could you please take a look at this patch and comment
> on its necessity?
>
>
>> ---
>>  common/board_f.c                  |  3 +++
>>  dts/Kconfig                       | 10 ++++++++++
>>  include/asm-generic/global_data.h |  4 ++++
>>  include/common.h                  |  1 +
>>  4 files changed, 18 insertions(+)
>>
>> diff --git a/common/board_f.c b/common/board_f.c
>> index 4b74835..cda5aae 100644
>> --- a/common/board_f.c
>> +++ b/common/board_f.c
>> @@ -1034,6 +1034,9 @@ static init_fnc_t init_sequence_f[] = {
>>  #ifdef CONFIG_SYS_EXTBDINFO
>>         setup_board_extra,
>>  #endif
>> +#ifdef CONFIG_OF_BOARD_FIXUP
>> +       board_fix_fdt,
>> +#endif

Can you add documentation for this somewhere? E.g. in the driver model readme?

>>         INIT_FUNC_WATCHDOG_RESET
>>         reloc_fdt,
>>         setup_reloc,
>> diff --git a/dts/Kconfig b/dts/Kconfig
>> index 4b7d8b1..3f64eda 100644
>> --- a/dts/Kconfig
>> +++ b/dts/Kconfig
>> @@ -14,6 +14,16 @@ config OF_CONTROL
>>           This feature provides for run-time configuration of U-Boot
>>           via a flattened device tree.
>>
>> +config OF_BOARD_FIXUP
>> +       bool "Board-specific manipulation of Device Tree"
>> +       help
>> +         In certain circumstances it is necessary to be able to modify
>> +         U-Boot's device tree (e.g. to delete device from it). This
>> option
>> +         make the Device Tree writeable and provides a board-specific
>> +         "board_fix_fdt" callback (called during pre-relocation time),
>> which
>> +         enables the board initialization to modifiy the Device Tree. The
>> +         modified copy is subsequently used by U-Boot after relocation.
>> +
>>  config SPL_OF_CONTROL
>>         bool "Enable run-time configuration via Device Tree in SPL"
>>         depends on SPL && OF_CONTROL
>> diff --git a/include/asm-generic/global_data.h
>> b/include/asm-generic/global_data.h
>> index e02863d..f566186 100644
>> --- a/include/asm-generic/global_data.h
>> +++ b/include/asm-generic/global_data.h
>> @@ -69,7 +69,11 @@ typedef struct global_data {
>>         struct udevice  *timer;         /* Timer instance for Driver Model
>> */
>>  #endif
>>
>> +#ifdef CONFIG_OF_BOARD_FIXUP
>> +       void *fdt_blob;                 /* Our device tree, NULL if none
>> */
>> +#else
>>         const void *fdt_blob;           /* Our device tree, NULL if none
>> */
>> +#endif

Can we keep it as const and just use a cast when it needs to change?
You could add a function which returns a writable pointer.


>>         void *new_fdt;                  /* Relocated FDT */
>>         unsigned long fdt_size;         /* Space reserved for relocated
>> FDT */
>>         struct jt_funcs *jt;            /* jump table */
>> diff --git a/include/common.h b/include/common.h
>> index a8d833b..293ce23 100644
>> --- a/include/common.h
>> +++ b/include/common.h
>> @@ -502,6 +502,7 @@ extern ssize_t spi_write (uchar *, int, uchar *, int);
>>
>>  /* $(BOARD)/$(BOARD).c */
>>  int board_early_init_f (void);
>> +int board_fix_fdt (void);

Comment please. Perhaps it should pass a writable fdt pointer?

>>  int board_late_init (void);
>>  int board_postclk_init (void); /* after clocks/timebase, before
>> env/serial */
>>  int board_early_init_r (void);

There have been discussions about moving to a live tree (hierarchical
format) in U-Boot post-relocation. What do you think? It might make
these changes easier or more efficient.

Regards,
Simon


More information about the U-Boot mailing list