[U-Boot] FDT howto

Simon Glass sjg at chromium.org
Sat Mar 2 15:59:08 CET 2013


Hi Jagan,

On Fri, Mar 1, 2013 at 11:44 PM, Jagan Teki <jagannadh.teki at gmail.com> wrote:
> Hi Simon,
>
> On Sat, Mar 2, 2013 at 6:30 AM, Simon Glass <sjg at chromium.org> wrote:
>> Hi Jagan,
>>
>> On Fri, Mar 1, 2013 at 1:21 PM, Jagan Teki <jagannadh.teki at gmail.com> wrote:
>>> Hi Simon,
>>>
>>> On Sat, Mar 2, 2013 at 1:54 AM, Simon Glass <sjg at chromium.org> wrote:
>>>> Hi Jagan,
>>>>
>>>> On Fri, Mar 1, 2013 at 11:14 AM, Jagan Teki <jagannadh.teki at gmail.com> wrote:
>>>>> Hi Simon,
>>>>>
>>>>> On Fri, Mar 1, 2013 at 10:07 AM, Simon Glass <sjg at chromium.org> wrote:
>>>>>> Hi Jagan,
>>>>>>
>>>>>> On Thu, Feb 28, 2013 at 12:29 PM, Jagan Teki <jagannadh.teki at gmail.com> wrote:
>>>>>>> Hi Simon,
>>>>>>>
>>>>>>> On Thu, Feb 28, 2013 at 7:22 PM, Simon Glass <sjg at chromium.org> wrote:
>>>>>>>> Hi Jagan,
>>>>>>>>
>>>>>>>> On Thu, Feb 28, 2013 at 3:14 AM, Jagan Teki <jagannadh.teki at gmail.com> wrote:
>>>>>>>>> Hi Simon,
>>>>>>>>>
>>>>>>>>> On Mon, Feb 25, 2013 at 4:40 AM, Simon Glass <sjg at chromium.org> wrote:
>>>>>>>>>> Hi Jagan,
>>>>>>>>>>
>>>>>>>>>> On Sun, Feb 24, 2013 at 10:58 AM, Jagan Teki <jagannadh.teki at gmail.com> wrote:
>>>>>>>>>>> Hi Simon,
>>>>>>>>>>>
>>>>>>>>>>> On Sun, Feb 24, 2013 at 11:55 PM, Jagan Teki <jagannadh.teki at gmail.com> wrote:
>>>>>>>>>>>> Hi Simon,
>>>>>>>>>>>>
>>>>>>>>>>>> On Sun, Feb 24, 2013 at 11:50 PM, Simon Glass <sjg at chromium.org> wrote:
>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Sun, Feb 24, 2013 at 9:55 AM, Jagan Teki <jagannadh.teki at gmail.com> wrote:
>>>>>>>>>>>>>> Hi Simon,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Sun, Feb 24, 2013 at 11:18 PM, Simon Glass <sjg at chromium.org> wrote:
>>>>>>>>>>>>>>> Hi Jegan,
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Sun, Feb 24, 2013 at 9:45 AM, Jagan Teki <jagannadh.teki at gmail.com> wrote:
>>>>>>>>>>>>>>>> Hi Simon,
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On Sun, Feb 24, 2013 at 11:08 PM, Simon Glass <sjg at chromium.org> wrote:
>>>>>>>>>>>>>>>>> Hi Jagan,
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Sun, Feb 24, 2013 at 8:19 AM, Jagan Teki <jagannadh.teki at gmail.com> wrote:
>>>>>>>>>>>>>>>>>> Hi Simon,
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Thanks for your response, please find my below comments.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> On Sun, Feb 24, 2013 at 9:24 PM, Simon Glass <sjg at chromium.org> wrote:
>>>>>>>>>>>>>>>>>>> Hi Jagan,
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> On Thu, Feb 21, 2013 at 9:03 AM, Jagan Teki <jagannadh.teki at gmail.com> wrote:
>>>>>>>>>>>>>>>>>>>> Hi All,
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> I am planning to use devicetree on u-boot.
>>>>>>>>>>>>>>>>>>>> I have an experience to work with devicetree on Linux.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> For u-boot, I have read doc from doc/README.fdt-control.
>>>>>>>>>>>>>>>>>>>> I see some dts usages on tegra boards.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> I have lot of confusions with the concept itself.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Is Linux and u-boot devicetree concept and build system are same?
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> I don't really understand this question sorry. U-Boot and Linux use
>>>>>>>>>>>>>>>>>>> the device tree mainly for run-time configuration of drivers, so that
>>>>>>>>>>>>>>>>>>> the same driver code can operate on different boards.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> I am some how confusing the fdt usage in u-boot.
>>>>>>>>>>>>>>>>>> Because when compared to Linux, u-boot fdt setup mandatory to require
>>>>>>>>>>>>>>>>>> the CONFIG_DEFAULT_DEVICE_TREE
>>>>>>>>>>>>>>>>>> on the config file [from your previous comments].
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> is this the only difference when compared to Linux i guess..is it?
>>>>>>>>>>>>>>>>>> Linux defconfig file does need to hot-code
>>>>>>>>>>>>>>>>>> the dts.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Yes - that is a difference. Linux provides a way to build .dts files
>>>>>>>>>>>>>>>>> but it is not mandatory. At present it is mandatory with U-Boot, and
>>>>>>>>>>>>>>>>> only one file is built. It can easily be ignored though.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Ok.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Suppose I have 4 boards J1, J2, J3 & J4 on my soc "emb".of vendor "vast"
>>>>>>>>>>>>>>>>>>>>    For this requirement I have
>>>>>>>>>>>>>>>>>>>>    board/vast/dts/J1.dts
>>>>>>>>>>>>>>>>>>>>    board/vast/dts/J2.dts
>>>>>>>>>>>>>>>>>>>>    board/vast/dts/J3.dts
>>>>>>>>>>>>>>>>>>>>    board/vast/dts/J4.dts
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>    include/configs/emb_common.h ==> single configuration of all SOC
>>>>>>>>>>>>>>>>>>>> needed definitions
>>>>>>>>>>>>>>>>>>>>    like defconfig in Linux.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>    do I need any more files?
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> That's enough for the basics I think.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Is dtsi file require to add it on arch folder along with above.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> If your architecture is not one of those already supported (like arm
>>>>>>>>>>>>>>>>> tegra/exynos and x86) then yes you need to add this file in
>>>>>>>>>>>>>>>>> arch/<arch>/dts. What architecture are you using?
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> My architecture is armv7, may be for me dtsi not required as arm is
>>>>>>>>>>>>>>>> existing architecture
>>>>>>>>>>>>>>>> to support fdt on u-boot.. is it?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Which sub-arch? If it is tegra/exynos5250 then you might be OK. For
>>>>>>>>>>>>>>> something else, you should get the kernel's .dtsi file for that chip.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I am having armv7, xilinx zynq soc..but i coun't get any .dtsi on kernel source.
>>>>>>>>>>>>>> may be I will create new one.
>>>>>>>>>>>>>
>>>>>>>>>>>>> OK, well if the kernel doesn't have FDT support yet then yes you will
>>>>>>>>>>>>> need to create a new one.
>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>    In emb_common.h i am defining
>>>>>>>>>>>>>>>>>>>>    CONFIG_OF_SEPARATE is it sufficient?
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> And CONFIG_OF_CONTROL
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>    My plan is to build u-boot and then build the dtb with specific
>>>>>>>>>>>>>>>>>>>> board and then combine.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> That's fine, and is how we do things on Chromium also. U-Boot tries to
>>>>>>>>>>>>>>>>>>> build an FDT even with CONFIG_OF_SEPARATE, so you need to put a
>>>>>>>>>>>>>>>>>>> default device tree file in your emb_common.h file that it can find.
>>>>>>>>>>>>>>>>>>> But you can ignore it, and for flashing your boards just use
>>>>>>>>>>>>>>>>>>> u-boot.bin plus whatever .dtb you want to select.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> So I will add the fdt support and then build the u-boot.
>>>>>>>>>>>>>>>>>> Is there any separate u-boot build command to build dts file.
>>>>>>>>>>>>>>>>>> My plan is to combine both u-boot and dtb.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> You can run dtc yourself if you like - see Makefile/dts for how it is
>>>>>>>>>>>>>>>>> done there. Once you have the .dtb binary, the easiest thing is to add
>>>>>>>>>>>>>>>>> it to the end of u-boot.bin, as described in README.fdt-control.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thanks, I tried with above setup for adding dts.
>>>>>>>>>>>>>>>> I have added simple dts file on my board.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> I got the below build error
>>>>>>>>>>>>>>>> /proj/mypc/u-boot/include/asm/gpio.h:1:27: fatal error:
>>>>>>>>>>>>>>>> asm/arch/gpio.h: No such file or directory
>>>>>>>>>>>>>>>> compilation terminated.
>>>>>>>>>>>>>>>> make[1]: *** No rule to make target `.depend.fdtdec', needed by
>>>>>>>>>>>>>>>> `.depend'.  Stop.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> is gpio.h is mandatory for fdt build?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Yes because basic GPIO support is included. You can create one for
>>>>>>>>>>>>>>> your sub-arch and make it #include <asm-generic/gpio.h> as a starting
>>>>>>>>>>>>>>> point.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Should I create an empty gpio.h file..it still asking some gpio
>>>>>>>>>>>>>> definitions right..
>>>>>>>>>>>>>
>>>>>>>>>>>>> It might be OK if you just have "#include <asm-generic/gpio.h>" in that file.
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks.
>>>>>>>>>>>>
>>>>>>>>>>>> Finally I have created u-boot-dtb.bin.
>>>>>>>>>>>> for building dtb separately I have used
>>>>>>>>>>>> $ make DEVICE_TREE=zynq .. it creates a u-boot.dtb
>>>>>>>>>>>>
>>>>>>>>>>>> is there any option for building separate name, for example I need to
>>>>>>>>>>>> create zynq.dtb
>>>>>>>>>>
>>>>>>>>>> No - but  you can just use 'mv' in a script external to the U-Boot build system.
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Some how I am able to create a fdt build on my target.
>>>>>>>>>>> But what is this gpio mandatory, because currently my target currently
>>>>>>>>>>> need a GPIO setup.
>>>>>>>>>>> Add ing gpio.h/ with equivalent definitions is an extra overhead is
>>>>>>>>>>> it? please explain.
>>>>>>>>>>
>>>>>>>>>> It is just a header file - unless you actually use the GPIO functions,
>>>>>>>>>> you can compile with -ffunction-sections and you won't get the GPIO
>>>>>>>>>> code included. Anyway, the overhead is small, if any.
>>>>>>>>>
>>>>>>>>> OK, Thanks for your information.
>>>>>>>>>
>>>>>>>>> I have few quires regarding getting details from devicetree nodes.
>>>>>>>>> 1) In case of drivers, I think we need add the MACROS on
>>>>>>>>>     // lib/fdtdec.c
>>>>>>>>>     static const char * const compat_names[COMPAT_COUNT] = {
>>>>>>>>>     is it?
>>>>>>>>
>>>>>>>> Yes that's what is normally done. At present it mostly just provides a
>>>>>>>> way to register existing FDT use in U-Boot.
>>>>>>>
>>>>>>> OK.
>>>>>>>
>>>>>>>>
>>>>>>>>> 2) What is the procedure for DDR base and size information getting
>>>>>>>>>      memory {
>>>>>>>>>                 reg = <0x00000000 0x40000000>;
>>>>>>>>>         };
>>>>>>>>>     I need to get the above details from memory node of dts and
>>>>>>>>> updated while doing
>>>>>>>>>     dram_init()
>>>>>>>>>     is it possible in u-boot right now?
>>>>>>>>
>>>>>>>> There is no particular support for dram_init(). You could call
>>>>>>>> fdtdec_decode_region() to get the information.
>>>>>>>
>>>>>>> Actually we may get the info through memory node using
>>>>>>> fdtdec_decode_region() for
>>>>>>> dram_init(), but the problem seems like other than this the SDRAM base
>>>>>>> and SDSIZE are using in
>>>>>>> CONFIG_SYS_MEMTEST_START and CONFIG_SYS_MEMTEST_END.
>>>>>>>
>>>>>>> As these are part of configuration macros, I don't clear how we can
>>>>>>> get the base,sizes from dts and assign these
>>>>>>> areas..any suggestions..?
>>>>>>
>>>>>> Well this is because configuration has traditionally been done with
>>>>>> CONFIG defines instead of device tree. CONFIG_OF_CONTROL is a
>>>>>> relatively new feature in U-Boot.
>>>>>>
>>>>>> If you are wanting to control the memtest area from device tree, you
>>>>>> might consider adding something to the '/config' node, since this is
>>>>>> where we tend to put general configuration. You probably can't test
>>>>>> all of memory, so you need to select the region.
>>>>>
>>>>> Thanks for your information.
>>>>>
>>>>> I am able to get the memory information using fdtdec_decode_region().
>>>>>
>>>>> So my CONFIG_SYS_SDRAM_BASE and CONFIG_SYS_SDRAM_SIZE dependencies
>>>>> on board file got resolved. but there is a dependency for
>>>>> CONFIG_SYS_SDRAM_BASE on
>>>>> arch/arm/lib/board.c.
>>>>>
>>>>> I have some thinking about this dependency to remove can we declare
>>>>> ram_base like ram_size
>>>>> so-that in ddr_init we can assign this value.. is my thinking valid..???'
>>>>
>>>> Yes that sounds reasonable. For that you could perhaps use the memory
>>>> {} node, like:
>>>>
>>>>         memory {
>>>>                 reg = <0x40000000 0x80000000>;
>>>>         };
>>>
>>> I will confirm my logic here for better clarification.
>>>
>>> typedef struct  global_data {
>>>    phys_size_t     ram_size;       /* RAM size */
>>> + phys_size_t     ram_base;       /* RAM base */
>>> } gd_t;
>>>
>>> in boards files:
>>> ---
>>>
>>> int ddr_init() {
>>> //
>>> get the memory info from dts store it on start and size
>>> //
>>> gd->ram_start = start;
>>> gd->ram_size = size;
>>>
>>>  gd->bd->bi_dram[0].start = start;
>>>  gd->bd->bi_dram[0].size = size;
>>> }
>>>
>>> Please comment.
>>
>> That sounds reasonable. I suppose you could cope with multiple memory
>> regions also - I'm not sure what the device tree syntax is for that.
>
> This is the syntax for above example:
> memory {
>      reg = <0x0 0x40000000>;
> };

My question was how can you handle multiple regions in device tree. Is it:

memory {
     /* 256MB at 0, 256MB at 512MB */
     reg = <0x0 0x10000000   0x20000000 0x10000000>;
};

or something else. If you can't find out you could ask on devicetree-discuss.

>
> Any side effect in my previous code [snip] w.r.t multiple bank supports.
>
> Moving CONFIG_SYS_SDRAM_BASE: to ram_start is that a good idea?, as lot
> of boards were using it..

Actually I don't see this symbol being used anywhere, although I agree
it appears in board config files.

board/emk/top860/top860.c
98:		memctl->memc_br2 = CONFIG_SYS_DRAM_BASE | BR_MS_UPMA | BR_V;

include/configs/trizepsiv.h
194:#define CONFIG_SYS_DRAM_BASE		0xa0000000

include/configs/pxa255_idp.h
273:#define CONFIG_SYS_DRAM_BASE		0xa0000000

include/configs/lubbock.h
127:#define CONFIG_SYS_LOAD_ADDR	(CONFIG_SYS_DRAM_BASE + 0x8000) /*
default load address */
158:#define CONFIG_SYS_DRAM_BASE		0xa0000000

include/configs/TOP860.h
76:#define	CONFIG_SYS_DRAM_BASE	0x00000000	/* DRAM in final mapping */

include/configs/colibri_pxa270.h
127:#define	CONFIG_SYS_DRAM_BASE		0xa0000000	/* CS0 */

include/configs/palmtc.h
145:#define	CONFIG_SYS_DRAM_BASE		0xa0000000	/* CS0 */
151:#define	CONFIG_SYS_LOAD_ADDR		CONFIG_SYS_DRAM_BASE

include/configs/balloon3.h
116:#define	CONFIG_SYS_DRAM_BASE		0xa0000000	/* CS0 */

include/configs/vpac270.h
182:#define	CONFIG_SYS_DRAM_BASE		0xa0000000	/* CS0 */

include/configs/xaeniax.h
157:#define CONFIG_SYS_DRAM_BASE		0xa0000000

include/configs/palmld.h
143:#define	CONFIG_SYS_DRAM_BASE		0xa0000000	/* CS0 */
149:#define	CONFIG_SYS_LOAD_ADDR		CONFIG_SYS_DRAM_BASE

include/configs/zipitz2.h
172:#define	CONFIG_SYS_DRAM_BASE		0xa0000000	/* CS0 */
178:#define	CONFIG_SYS_LOAD_ADDR		CONFIG_SYS_DRAM_BASE


>
> I am planning code fdtdec_get_memory_region() to move the these memory detection
> code, so-that it should be a generic for u-boot if the use is using
> fdt. any comments.

Sounds good. Then you probably want to try to fit this into the
generic board support, patches are here:

http://patchwork.ozlabs.org/patch/219174/

Regards,
Simon

>
> Thanks,
> Jagan.
>
>>
>> Regards,
>> Simon
>>
>>>
>>> Thanks,
>>> Jagan.
>>>
>>>>
>>>> Regards,
>>>> Simon
>>>>
>>>>>
>>>>> Any suggestions..
>>>>>
>>>>> Thanks,
>>>>> Jagan.
>>>>>
>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>>>  3) and same case for chosen also..are these implemented currently.
>>>>>>>>
>>>>>>>> The bootargs environment variable is placed in the kernel FDT when
>>>>>>>> booting the kernel. But 'chosen' is not used in the U-Boot FDT. This
>>>>>>>> is support instead for a '/config' node - see e.g.
>>>>>>>> fdtdec_get_config_int().
>>>>>>>
>>>>>>> OK, thank you.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Jagan.
>>>>>>
>>>>>> Regards,
>>>>>> Simon


More information about the U-Boot mailing list