Qcom平台开机时DeviceTree匹配处理

目录

1.开机过程中 dtb 和 dtbo 的处理

2.开机匹配的重点函数逻辑

2.1 GetSocDtb

2.2 GetBoardDtb

2.3 ReadDtbFindMatch

2.4 ApplyOverlay

3.开机过程匹配时的数据

3.1 GetPlatfromMatchDtb比对数据

3.2 GetBoardMatchDtb比对数据

3.3 ReadBestPmicMatch比对数据

3.4 MatchOEMVariantId比对数据


        本文目的在于介绍高通平台  dtb 和 overlay dtbo 在开机过程中的匹配检测及 merge、在编译过程中各子系统 dts、dtsi 怎样合成、生成对应dtb和dtbo。

1.开机过程中 dtb 和 dtbo 的处理

        开机启动时高通平台通过BootLinux()调用DTBImgCheckAndAppendDT函数完成对 dtb 和 dtbo 的一些列处理工作。如下图:

  • GetSocDtb 负责完成main dtb与平台匹配的检测工作,返回指向与平台匹配成功的dtb。main dtb 由 main dts 和各子系统的 dts 经合成、编译后生成,高通平台 main dtb 通常包含多个套片的 dtb;Android系统main dtb在编译时被打包到vendor_boot image中,故在debug时通过解包vendor_boot image来获取版本对应的main dtb。
  • GetBoardDtb 负责完成overlay dtb与平台匹配的检测工作,返回指向与平台匹配成功的dtbo。overlay dtb 是由 项目overlay dts 与 各子系统的 overlay dts 经合成、编译后生成,同main dtb一样overlay dtb通过也包含多个套片的dtb;Andorid系统 oveylay dtb 在编译时会被打到 dtbo image 中,故通过解包dtbo image 可以获取overlay dtb。
  • GetHypDtbo 当支持Hypervisor dtbo时会执行此操作,从hyper子系统获取hyper dtbo。
  • GetOverdDtbo 非user版本时支持此操作,获取user_dtbo。
  • AppendToDtList 负责将匹配成功的dtbo(boart dtbo、Hypervisor dtbo、OverdDtbo)添加到到DtsList链表。
  • ApplyOverlay 通过ufdt_apply_mutil_overlayj将Soc dtb(匹配成功的main dtb数据)与 Dtslist链表中的dtbo进行overlay,即负责运行的main dtb 与 dtbo的overlay。

2.开机匹配的重点函数逻辑

2.1 GetSocDtb

函数处理流程:

  • 逐个遍历dtb中所有的 main dtb
  • 通过ReadDtbFindMatch函数将main dtb与项目平台中的plaform、board、pmic、OEMVarientId进行比对,获取每个main dtb的匹配得分
  • SOC_MATCH匹配情况下,得分最高的main dtb即为最匹配的dtb并返回。

特殊点:

         该函数指定的必须匹配内容为SOC_MATCH,即mian dtb中的ChipID与当前的与主板套片的ChipID必须一致

        如果最终获取的匹配得分和ALL_BITS_SET设定的得分一致,则认为此main dtb包含项目需要的所有devicetree数据,则会跳过后续的overlay dtb的匹配检测。高通平台通常设计中会将平台的devicetree设置与项目的devicetree设置进行分离,mian dtb中更多的平台相关的devicetree数据、而项目devicetree数据则更对在overlay dtb中。所以通常情况下在执行完GetSocDtb函数后都会进入GetBoardDtb函数。

2.2 GetBoardDtb

函数处理流程:

  • 逐个遍历dtbo image中所有的 overlay dtb
  • 通过ReadDtbFindMatch函数将overlay dtb与项目平台中的plaform、board、pmic、OEMVarientId进行比对,获取每个main dtb的匹配得分
  • VARIANT_MATCH匹配情况下,得分最高的ovarlay dtb即为最匹配的dtb并返回。

特殊点:

        因指定VARIANT_MATCH必匹配项,故ovrelay dtbo中的DtVariantId必须与项目的平台一致

2.3 ReadDtbFindMatch

        ReadDtbFindMatch是进行 main dtb(GetSocDtb) 和 overlay dtbo (GetBoardDtb)与平台匹配判断的核心函数,从main dtb 与 overlay dtbo中找到最佳的dtb 和dtbo, 其内部框图如上图。

函数处理流程:

匹配判断,分为四个逻辑依次执行:

  • GetPlatfromMatchDtb 将dtb/dtbo中的chipid、soc_rev、foundryid、packageid、skuid与项目平台的各项对应参数进行比对,若相同则该项得分。其中必匹配项:chipid,有条件必匹配项:foundryid(dtb\dtbo中有配置foundryid)、skuid(项目平台有配置skuid)、packageid(dtb\dtbo中有配置packageid)。必匹配项和有条件必匹配项在条件成立时,必须匹配成功,如果失败则进行dtb/dtbo中其他chipid、soc_rev、foundryid、packageid、skuid判断或进行其他dtb/dtbo的匹配判断。
  • GetBoardMatchDtb 将dtb/dtbo中的variantid、variantmajor、variantminor、platfrom_subtype与项目平台中的各项参数进行比对,若相同则该项目得分。其有条件匹配项为:variantid(dtb/dtbo中存在variantid)、platfrom_subtype(dtb/dtbo中存在platfrom_subtype),同样条件成立时其必须匹配。
  • ReadBestPmicMatch  将dtb/dtbo中的pmicrev、pmicmodel与项目平台的各项参数进行比对,若相同则该项目得分。
  • MatchOEMVariantId  将dtb/dtbo中的 oemveriantId 与项目平台的参数进行比对,若相同则该项目得分。

得分处理:

  • 在指定精准匹配成功成立时,获取最高得分(平台为每项匹配设置独立的分值)的dtb\dtbo进行后续的overlay处理。
  • 精准匹配成功时,历史(已遍历的main dtb/overlay dtbo)最高best与本次匹配得分比较:

                        < ,  将本次赋值给best

                        > ,  best保持

                        = ,如图逐项进行比较,若本次项大于best对应项、则将本次的赋值给best。

     否则,认为匹配失败。

2.4 ApplyOverlay

        该函数会将选取的匹配成功的main dtb 和 overlay dtbo进行overlay。如果该函数执行报错,则意味着overley时出现语法错误。对应该类错误debug方法,可参考

3.开机过程匹配时的数据

        用于比对数据分别为:dtb、dtbo中解析的平台相关数据(红框)和 来自平台的数据(紫色),如chipid、foundry id、pmic id、ddr type

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值