MTK驱动(53)---平台DTS文件匹配过程

MTK平台DTS文件匹配过程

1. lk中platform paramter

      lk阶段会从boot image 解析出dtb数据,然后通过atag方式将dtb数据传递给了内核。

    在mtk平台lk在向内核传递dtb数据前会修改部分dtb数据,具体如下:

  a.  修改model数据,根据获取到的hw code (芯片ID)及 devinfo(mtk平台来自mtk lib库中) 

          选择正真的model值,然后修改dtb property中对应的model值。

  

       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数据。

你可能感兴趣的:(MTK,驱动)