On Wed, Jun 12, 2013 at 3:32 PM, Collins, Rod <rod.coll...@saabsensis.com> wrote: > > I have been chasing a problem where a module device driver that uses the > device tree I install, cannot find a compatible match when I know the device > tree has the match for my driver. > > So I wrote a small module device driver that dumps the device tree > information. I add it to the device driver list using insmod dtdump.ko. If I > add the insmod to the start of the rc (using uCLinux distribution) file then > I get the proper contents. If I add insmod at the end of the rc file then the > device tree is bad. > > The problem is in the file fdt.c and the function unflatten_dt_node. > > When the unflattened tree is created the memory is allocated for the nodes > and the property structures, however the pointers are just inserted into the > property structure. The pointers are pointing in the memory area freed after > initialization. This will work if the embedded __init memory is not freed but > freeing this memory ends up with tree nodes that have invalid properties and > thus the device tree is no good.
If your fdt blob is getting freed, then you've got a bug. How are you loading the device tree? Normally the device tree is passed in from the bootloader and the kernel marks the whole region as reserved. > I am working on a fix to the unflatten_dt_node function. Allocate space for > the property name and value and copy them in also as the node name is done. unflatten_dt_node is actually doing the right thing. If the dt blob is in an __init section, then it needs to be copied into non-init memory before unflattening. g. _______________________________________________ devicetree-discuss mailing list devicetree-discuss@lists.ozlabs.org https://lists.ozlabs.org/listinfo/devicetree-discuss