MTK平台DTS文件匹配过程
lk阶段会从boot image 解析出dtb数据,然后通过atag方式将dtb数据传递给了内核。
在mtk平台lk在向内核传递dtb数据前会修改部分dtb数据,具体如下:
a. 修改model数据,根据获取到的hw code (芯片ID)及 devinfo(mtk平台来自mtk lib库中)
b. 修改memory数据,根据在plerloader阶段检测到的 rank /mblock数据调reserve-memory和memory
property数据。
c. 同时也在修改/chosen atag,boot atag,mem atag,vcore_dvfs atag,devinfo atag,videolfb
atag,mdinfo ccci,modem_info atag,ptp tee_reserved_mem non_secure_sram 等等一系列property数据。
以上3点的修改都是mtk针对平台特有的。
脑洞:
1.以前只知道mtk平台可以自动检测ram size不需要手动修改内核dts文件中memory size内容。现在知
道proloader检测到的memory 数据是怎样传递到内核的dts文件了。
代码路径
lk/app/mt_boot/mt_boot.c
extern int target_fdt_model(void *fdt)__attribute__((weak));
if (target_fdt_model) {target_fdt_model(fdt);
}
extern int target_fdt_cpus(void *fdt)__attribute__((weak));
if (target_fdt_cpus) {target_fdt_cpus(fdt);
}
2.kernel部分匹配过程:
2.1 __arch_info_begin , 由 MACHINE_START/DT_MACHINE_START 宏定义编译链接形成的 struct machine_desc 数组。
lds链接脚本如下:
alps/kernel-3.18/arch/arm/kernel/vmlinux.lds.S
.init.arch.info : {
__arch_info_begin = .;*(.arch.info.init)
__arch_info_end = .;
}mtk平台匹配类型:
alps/kernel-3.18/arch/arm/mach-mediatek/core.c
static const char *mt6570_dt_match[] __initconst = {
"mediatek,MT6570",
NULL
};
DT_MACHINE_START(MT6570_DT, "MT6570")
.dt_compat = mt6570_dt_match,
MACHINE_END
static const char *mt6580_dt_match[] __initconst = {
"mediatek,MT6580",
NULL
};
2.2 lk中会将从image中解析的dtb数据传通过atag传递到kernel空间,内核中initial_boot_params变量会指向 __atags_pointer所代表的atag中dtb数据空间。
内核在setup_arch设置架构的函数中首先完成CPU架构的设置,在进行dtb数据与平台支持的匹配(个人观点:这两者 没有必然先后顺序)。
在进行dtb匹配时会遍历initial_boot_params所指向的dtb数据中每一个fdt_property结构中的compatible元素数与 __arch_info_begin数组中每一个machine_desc结构中的dt_compat元素数值进行比较。
a. 比较函数 of_compat_cmp(cp, compat, strlen(compat),compat为machine_desc->dt_compat ,cp为 property->compatible,从比较函数中可以看比较过程是以dt_compat数值为参看的。
b. 从上述的标示中可以推断匹配过程的至少采用了两层大循环查找,实际实现过程中外层dt_compat,内层为dtb property;实际匹配比较过程中是会将property->compatible/dt_compat数值进行移位比较,尽可能找出匹配的 dtb property.
c. 在比较的同时会记录每次匹配情况score值,去所有score中最小的那个数据即找到最匹配平台的dtb property数 据。脑洞:
2.精简dtb数据及__arch_info_begin数组可以加速匹配,提高开机速度;
3.mtk平台只有一组dts文件编译在bootimage中,所以在lk阶段没有太对调整dtb中的compatible数据,而高通 平台机有所有不同会有多组dtb打包道bootimage中所有在进入kernel之前会进行compatible 及board id 等数 据调整,用以匹配对应的dtb property数据。