[U-Boot] [RFC PATCH v2 2/6] fdt: Add support for embedded device tree (CONFIG_OF_EMBED)

Simon Glass
2011-09-14T17:45:59Z

Hi Jason,

On Wed, Sep 14, 2011 at 9:11 AM, Jason <u-boot@lakedaemon.net> wrote:
> Simon,
>
> On Wed, Sep 14, 2011 at 08:47:25AM -0700, Simon Glass wrote:
>> On Wed, Sep 14, 2011 at 6:47 AM, Jason <u-boot@lakedaemon.net> wrote:
>> > On Tue, Sep 13, 2011 at 02:06:56PM -0700, Simon Glass wrote:
>> >> On Tue, Sep 13, 2011 at 7:37 AM, Jason <u-boot@lakedaemon.net> wrote:
>> >> > Added the remote, thanks. ?Once we figure out the mach-types thing, I'll
>> >> > try using the Marvell integrated RTC driver as a real-world example of a
>> >> > conversion to fdt. ?I'll probably have questions ;-)
>> >>
>> >> That sounds great. I've tried to make it fair straightforward - with
>> >> an option for building an fdt into U-Boot itself (i.e. don't define
>> >> CONFIG_OF_SEPARATE). This should allow you to use your current dev
>> >> flow.
>> >
>> > Okay, I have an initial version that compiles, but doesn't work. ?Which,
>> > surprisingly, is progress. ?;-) ?I'll post the patch a little bit later
>> > after I make sure I'm not missing something dumb.
>>
>> A few hints:
>>
>> - define CONFIG_OF_EMBED to start with, since it will embed the fdt
>> inside U-Boot which is a good check that all is well. You can move to
>> the more useful CONFIG_OF_SEPARATE when you get that working
>> - there is a check in board.c that the fdt is accessible - if it is
>> dying early then it might be that (early board panic patch is still in
>> flight)
>
> Frustrating morning. ?Mainly due to the fact that I've been working with
> device trees all of two days.
>
> Here's what I did:
> 1.) applied your patches against v2011.09-rc1 (to get mvrtc.c)
> 2.) applied my dreamplug support patch
> 3.) modified drivers/rtc/mvrtc.c for OF support
> 4.) compile
> 5.) run, then 'date' fails like so:
>
> find_alias_node: rtc0
> fdt_decode_next_alias failed.
> Error decoding fdt for mvrtc.
> ## Get date failed

I don't actually see an alias in your fdt. And actually I left it out
of mine, so that is understandable. For i2c I have:

...
aliases {
i2c0 = "/i2c at 0x7000d000";
i2c1 = "/i2c at 0x7000c000";
i2c2 = "/i2c at 0x7000c400";
i2c3 = "/i2c at 0x7000c500";
};

find_next_alias is explains this (omited from the patch sorry):

/**
* Find the next numbered alias for a peripheral. This is used to enumerate
* all the peripherals of a certain type.
*
* Do the first call with *upto = 0. Assuming /aliases/<name>0 exists then
* this function will return a pointer to the node the alias points to, and
* then update *upto to 1. Next time you call this function, the next node
* will be returned.
*
* All nodes returned will match the compatible ID, as it is assumed that
* all peripherals use the same driver.
*
* @param blob FDT blob to use
* @param name Root name of alias to search for
* @param id Compatible ID to look for
* @return offset of next compatible node, or -FDT_ERR_NOTFOUND if no more
*/

So I think you need to add a /alias node and try again. I can submit a
new patch set with this and a couple of other things I want to change,
but it would be good if you can get to the end first, in case you find
other problems.

>
> Obviously, I've hacked it up abit to get more error reporting out.
> Here's my kirkwood-dreamplug.dts:
>
> ##### kirkwood-dreamplug.dts ####
> /dts-v1/;
>
> /include/ "kirkwood.dtsi"
>
> / {
> ? ? ? ?model = "Marvell Dreamplug";
> ? ? ? ?compatible = "marvell,dreamplug", "marvell,kirkwood";
>
> ? ? ? ?rtc at 0xf1010300 {
> ? ? ? ? ? ? ? ?status = "ok";
> ? ? ? ?};
> };
> #################################
>
> And the kirkwood.dtsi
>
> #### kirkwood.dtsi ####
> / {
> ? ? ? ?model = "Marvell Kirkwood";
> ? ? ? ?compatible = "marvell,kirkwood";
> ? ? ? ?#address-cells = <1>;
> ? ? ? ?#size-cells = <1>;
>
> ? ? ? ?cpus {
> ? ? ? ? ? ? ? ?#address-cells = <1>;
> ? ? ? ? ? ? ? ?#size-cells = <0>;
> ? ? ? ? ? ? ? ?cpu at 0 {
> ? ? ? ? ? ? ? ? ? ? ? ?compatible = "arm,arm926ejs";
> ? ? ? ? ? ? ? ? ? ? ? ?reg = <0>;
> ? ? ? ? ? ? ? ?};
> ? ? ? ?};
>
> ? ? ? ?rtc at 0xf1010300 {
> ? ? ? ? ? ? ? ?compatible = "marvell,kirkwood-rtc";
> ? ? ? ? ? ? ? ?reg = <0xf1010300 0x02>;
> ? ? ? ? ? ? ? ?status = "disabled";
> ? ? ? ?};
> };
> #######################
>
> I'd like to make sure my dts files are correct before I get to debugging
> code. ;-)
>
> A few notes:
>
> If I compile with '#define DEBUG' in my board config, it builds, but
> doesn't run, or at least, there's no output on the serial port.

That's because you are getting output prior to relocation. Graeme has
a patch for that, and I also sent a patch for pre-console panic (which
I will update once his patch goes in).

>
> I had the remove your fdt_decode_i2c() and clock.h include. ?The clock.h
> include seems to be specific to the tegra2 and doesn't exist for
> kirkwood.

Yes that's right, it is just an example at this stage, and the idea of
a periph_id is specific to Tegra at present. Patches 5 and 6 are just
an example to show how to use it in code.

Regards,
Simon

>
> thx,
>
> Jason.
>