U-boot dm-pre-reloc 属性

U-boot的驱动模型,核心数据结构体:udevice,用来描述各种设备。

U-boot提供了两种方式来描述和传递设备的信息:一种是通过platform data;一种是通过Device tree。

platform data 模式下,DM在初始化的时候,会检测每个driver是否有DM_FLAG_PRE_RELOC标记。这个标记用来表示每个driver是否有pre-reloc属性。如果一个driver标记了 DM_FLAG_PRE_RELOC 属性,那么在重定位之前,会绑定对应的设备(udevice)。

Device tree模式下,主要看每一个设备节点是否含有“u-boot,dm-pre-reloc”属性,不再检查driver的DM_FLAG_PRE_RELOC标记。

U-boot启动过程中,在重定位之前,仅仅调用DM模块的init函数,初始化DM模块,并不会初始化driver。除非一个driver标记了DM_FLAG_PRE_RELOC,或者设备节点里包含“u-boot,dm-pre-reloc”属性,对应的driver才会绑定对应的udevice,并进行初始化。这可以减少DM对系统的开销。

platform data 模式下,如果一个driver标记了DM_FLAG_PRE_RELOC,那么在重定位之前,DM不仅会初始化,还要绑定这个driver匹配的所有udevice,并进行初始化。这会大大增加系统开销。如果使用Device tree模式,只有包含“u-boot,dm-pre-reloc”属性的设备节点,才会展开为udevice,并和对应的driver绑定,调用probe函数初始化,开销会大大降低。

为了减少SPL的体积,只有包含‘u-boot,dm-pre-reloc’, ‘u-boot,dm-spl’ or ‘u-boot,dm-tpl’属性的设备节点,才会添加到SPL或TPL的镜像文件里。通过 fdtgrep 工具进行过滤,可以生成一个更小的设备树文件:spl/u-boot-spl.dtb
保留在SPL中的节点,会被绑定到对应的driver,并进行初始化。

重定位结束,系统跳入真正的U-boot代码运行时,系统会根据下面的属性去判断,设备树中的节点是否已经在SPL或TPL阶段被绑定。

u-boot,dm-pre-proper: U-Boot proper pre-relocation only
u-boot,dm-pre-reloc: legacy and indicates any of TPL or SPL Existing platforms only use it to 
                     indicate nodes needed in SPL. Should probably be replaced 
                     by u-boot,dm-spl for new platforms.
u-boot,dm-spl: SPL and U-Boot pre-relocation
u-boot,dm-tpl: TPL and U-Boot pre-relocation

对于一个设备,如果你想在重定向之前,绑定该设备,就需要在设备树节点中添加“u-boot,dm-pre-reloc”属性。该属性必须在根节点的子节点中声明。如果一个设备的路径很深,对应路径上的每一个设备节点,都需要添加“u-boot,dm-pre-reloc”属性,设置才会生效。