0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ATF(TF-A)代码的剖析

Linux阅码场 来源:Linux阅码场 作者:Linux阅码场 2022-06-23 10:27 次阅读

思考:

1、 SOC一上电,只有一个核启动,还是所有核都启动?

2、如果SOC一上电,如果只有一个核启动,那么从核启动的时候,从核的入口是哪里?

3、啥是cold boot?啥时warm boot? 在哪些场景下会使用warm boot?4、啥是cold reset/warm reset/primary boot/senondary boot?

说明:

1、本文以为armv8-aarch64、armv9为例、TF-A代码为例,不讨论其它硬件架构和固件软件中的设计。

2、重点讲述cold reset/warm reset/primary boot/senondary boot之间的流程和概念。

1、基础概念

请先自行理解以下4个概念:

  • cold boot

  • warm boot

  • Primary boot

  • Secondary boot

另外还两种配置:

  • 你的reset地址是可编程的,则会配置PROGRAMMABLE_RESET_ADDRESS=1,与之对立的则是你的reset地址是不可编程的。

  • 你在SOC启动的时候,首先只启动一个core,则会配置COLD_BOOT_SINGLE_CPU=1,与之对立的则是你的SOC启动的时候,所有core都上电了。

2、启动流程

我们就假定 reset地址是可编程的、SOC启动的时候只启动一个core,来讲解我们的boot流程:

(1)、SOC一上电,SOC给ARM Core的signal configuration会改变RVBAR_EL3,这里一般就是就是bootrom的首地址。即CPU一上电,Primary core的PC指向的就是RVBAR_EL3的地址,机器就开始启动了。

(2)、当需要Secondary Core启动的时候,例如会走PSCI协议,【主核】进入ATF会将bl31_warm_entrypoint(或平台自定义的地址)写入到SOC寄存器,改变reset地址(改变RVBAR_EL3的值),然后此时SOC的PMIC给Secondary Core上电,此时Secondary Core也就发生了cold reset,PC从RVBAR_EL3(bl31_warm_entrypoint或平台自定义函数)处开始执行.

总结(针对本文示例情况:reset地址是可编程的、cold boot的时候只启动一个cpu):

  • 开机一上电只有Primary Core再跑,从RVBAR_EL3处开始跑,属于cold boot

  • 从核启动时,会修改reset的值,影响到RVBAR_EL3的值,然后给从核上电,此时属于Secondary boot,仍然是cold boot.

  • 一般会将bl31_warm_entrypoint设置为reset地址,即Secondary Core的启动地址;

  • 这个示例中没有用到warm boot

3、ATF(TF-A)代码的剖析

以BL1代码为例分析,该代码适配支持cold reset/warm reset/primary boot/senondary boot等诸多场景。

c8e8583c-f288-11ec-ba43-dac502259ad0.png

  • 如果reset是可编程的,PROGRAMMABLE_RESET_ADDRESS=1, 则_warm_boot_mailbox=0,则下面这段代码不会被编译,无论cold boot还是warm boot都不会走_warm_boot_mailbox

  • 如果reset是可编程的,PROGRAMMABLE_RESET_ADDRESS=0, 则_warm_boot_mailbox=1,则下面这段代码会被编译,但cold boot走do_cold_boot流程,warm boot需要走br x0流程


	
  1. .if \_warm_boot_mailbox

  2. /* -------------------------------------------------------------

  3. * This code will be executed for both warm and cold resets.

  4. * Now is the time to distinguish between the two.

  5. * Query the platform entrypoint address and if it is not zero

  6. * then it means it is a warm boot so jump to this address.

  7. * -------------------------------------------------------------

  8. */

  9. bl plat_get_my_entrypoint

  10. cbz x0, do_cold_boot

  11. br x0

  12. do_cold_boot:

  13. .endif /* _warm_boot_mailbox */

  • 如果SOC启动的时候只启动一个core,COLD_BOOT_SINGLE_CPU=1_secondary_cold_boot=0,则下面代码不被编译, 则无论主核还是从核都不需要走_secondary_cold_boot流程

  • 如果SOC启动的时候启动多个core,COLD_BOOT_SINGLE_CPU=0_secondary_cold_boot=1, 则下面代码会被编译,则主核走do_primary_cold_boot流程, 从核需要走plat_secondary_cold_boot_setup流程


	
  1. .if \_secondary_cold_boot

  2. /* -------------------------------------------------------------

  3. * Check if this is a primary or secondary CPU cold boot.

  4. * The primary CPU will set up the platform while the

  5. * secondaries are placed in a platform-specific state until the

  6. * primary CPU performs the necessary actions to bring them out

  7. * of that state and allows entry into the OS.

  8. * -------------------------------------------------------------

  9. */

  10. bl plat_is_my_cpu_primary

  11. cbnz w0, do_primary_cold_boot

  12. /* This is a cold boot on a secondary CPU */

  13. bl plat_secondary_cold_boot_setup

  14. /* plat_secondary_cold_boot_setup() is not supposed to return */

  15. bl el3_panic

  16. do_primary_cold_boot:

根据以上的代码规则,这里也画了两张图:

(1)、BL2 at EL3的场景

c8fe1f5a-f288-11ec-ba43-dac502259ad0.png

(2)、BL2 at S-EL1的场景

c922fc4e-f288-11ec-ba43-dac502259ad0.png

4、软件如何判断当前是cold reset/warm reset/primary boot/senondary boot

TF-A中定义了多核的启动框架,如上一节框图所示,在启动的过程中会进行一些判断,是cold reset还是warm reset,是primary boot还是secondary boot?那么代码中是怎么知道这些状态的呢?

4.1 cold reset和warm reset

这种判断方法由平台实现,其实就是读取mailbox的值。

在第一个核cold boot时,会写mailbox内存(magic,entrypoint...)在第二个核启动时、或第一个核再次启动时(有可能是resume唤醒时),会读取mailbox内存,如果读取到了符合期望的magic的值,则走warm流程,否则走cold流程。注意这里所说的warm流程,只是软件上的warm流程,并非说当前是warm reset。

4.2 primary boot和secondary boot

这种判断方法由平台实现,看似也很简单,一般而言就说读取mpidr寄存器进行判断。


	
  1. (trusted-firmware-a/plat/marvell/armada/a8k/common/aarch64/plat_helpers.S)

  2. func plat_is_my_cpu_primary

  3. mrs x0, mpidr_el1

  4. and x0, x0,

    #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)

  5. cmp x0, #MVEBU_PRIMARY_CPU

  6. cset w0, eq

  7. ret

  8. endfunc plat_is_my_cpu_primary

5、mailbox的介绍

5.1 mailbox是什么

mailbox就说一块内存,所有的core都能访问这块内存。第一次启动时,core会填充mailbox,将其下次resume时的地址、secondary core的启动地址、warm reset的地址写入到mailbox内存中,这几个地址其实是一个地址。同时也会将这个地址写入到SOC PMIC寄存器中,影响到RVBAR_EL3的值。

当SOC一上电所有core都启动的这种情况下,主核会继续跑,从核会在SOC一上电就进入wfi状态。当从核需要继续启动时,该core从BL1 BL2 BL31正常流程启动时,会在BL1、BL2 at EL3、BL31中,强制跳转到mailbox的地址,跳过主核已经初始化的部分;

当SOC一上电,只有一个core上电的情况下,主核继续跑,从核未上电。当从核需要启动时,相当于cold reset,从核会直接从RVBAR_EL3处开始跑,也就是你设置的entrypoint。

5.2 mailbox的作用

mailbox中定义了entrypoint地址,当core从BL1 BL2 BL31正常流程启动时,会在BL1、BL2 at EL3、BL31中,强制跳转到mailbox的地址,以跳过已初始化的部分。

c933e6da-f288-11ec-ba43-dac502259ad0.png

5.3 mailbox的示例

其实就是定义了一块内存,主核第一次跑时,会填充该内存。主核第二次跑时或从和跑时,检测该内存已经填充过了,则走warm启动流程,即强制跳转到mailbox中的address地址。

c94561b2-f288-11ec-ba43-dac502259ad0.png

6、具体场景的总结

  • 串口中断中敲击reboot命令、或系统panic时导致的机器重启:在一些的SOC厂商设计中,应该是code reboot。比如在Linux Kernel中敲击reboot,到底层还是写的一些寄存器控制pmic(或PMU),直接给cpu下电了。然后再上电,SOC还是会给Core发送signal configuration,此时RVBAR_EL3又会变成ASIC设置的值.

  • Suspend和Resume:比如我在看ATF中的海思平台,在ATF的suspend函数,将bl31_warm_entrypoint地址写入到了SOC PMIC的一个寄存器中(上电时,该寄存器会影响的是RVBARADDR信号)。此时系统深睡的时候,应该是Linux Kernel调用到ATF,将bl31_warm_entrypoint地址写入到了pmu/pmic相关的寄存器中,在下一次reset时,会影响到signal configuration继而改变RVBAR_EL3的值。然后还会给各个模块下电(给哪些模块下电是SOC的设计和逻辑),最后再给ARM Core下电, 这就算是深睡了。Resume的时候,也是有一些SOC的硬件行为,然后再给Core上电,那给Core上电后,一上电执行的是哪里?

    PC还是指向RVBAR_EL3中的地址,当然这是我们suspend的时候更改过的,其实就是bl31_warm_entrypoint

  • RMR_EL3:本文中都没有提到RMR_EL3。那么RMREL3是干啥的呢?这是ARM的一个feature,怎么用?是你自己的设计,随便你。你写RMR_EL3中的bit,就可以触发warm reset. 一般的kernel dump、或者一些工具,就可以主动触发RMR_EL3,然后去干一些活. 还有在csdn上看到一篇高通soc的启动流程的博客,他们正常的启动流程中,某一个镜像跳转到另外一个镜像时,竟然就是写了一些RMR_EL3,触发warm_reset,另外一个镜像的地址恰好就是warm reset的跳转地址。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • soc
    soc
    +关注

    关注

    38

    文章

    4087

    浏览量

    217743
  • 架构
    +关注

    关注

    1

    文章

    506

    浏览量

    25430

原文标题:SOC的多核启动流程详解

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    TF卡的安全性与加密技术

    随着数字时代的到来,数据安全成为了一个不可忽视的问题。TF卡(TransFlash卡,也称为MicroSD卡)作为一种便携式存储设备,广泛应用于手机、相机、平板电脑等设备中。TF卡的安全性和加
    的头像 发表于 11-04 09:58 112次阅读

    使用TF卡的常见问题

    随着科技的发展,TF卡(TransFlash卡,也称为MicroSD卡)已经成为我们日常生活中不可或缺的存储工具。它们被广泛应用于智能手机、平板电脑、数码相机等设备中,用于扩展存储空间,存储照片
    的头像 发表于 11-04 09:54 150次阅读

    TF卡使用注意事项

    随着科技的发展,TF卡因其体积小、容量大、价格低廉等优点,已成为我们日常生活中不可或缺的存储工具。然而,在使用过程中,如果不注意一些细节,可能会导致数据丢失、TF卡损坏等问题。 1. 选择合适的TF
    的头像 发表于 11-04 09:53 115次阅读

    TF卡适用于哪些设备

    TF卡以其小巧的体积和大容量存储的特点,被广泛应用于各种便携式电子设备中。随着技术的不断进步,TF卡的容量也在不断增加,从最初的128MB到现在的2TB甚至更高,满足了不同用户对存储空间的需求。TF
    的头像 发表于 11-04 09:52 82次阅读

    TF卡与SD卡的区别

    在数字时代,存储卡成为了我们生活中不可或缺的一部分。无论是手机、相机还是平板电脑,都需要存储卡来扩展存储空间。TF卡和SD卡是两种市面上最常见的存储卡类型,它们在功能和应用上有着各自的特点和优势
    的头像 发表于 11-04 09:50 89次阅读

    stm32mp157编译烧录运行到uboot串口无输出怎么解决?

    1.大概2月前后,参考第2部分的方法,生成sdcard镜像文件并烧录的步骤,生成了sdcard镜像文件并烧录到sd卡,然后我一直使用这个sd卡和生成sdcard镜像文件更新自己编译的tf-a
    发表于 07-05 08:11

    什么是贴片式TF卡?

    贴片式TF卡,也被称为贴片式SD卡或SD NAND,是一种可以直接贴装在电路板上的存储芯片。与传统的插拔式TF卡不同,贴片式TF卡采用BGA(球栅阵列)封装技术,使其可以通过回流焊接工艺直接贴装在电子设备的主板上。这种设计不仅提
    的头像 发表于 05-31 10:55 897次阅读
    什么是贴片式<b class='flag-5'>TF</b>卡?

    如何使用Yocto更新已更改的TF-A设备树来产生新的镜像文件?

    求助大佬, 我用Yocto构建了STM32MP157的镜像文件,但我需要更改和移植TF-A和U-BOOT来适配我的板子, 我按照它正点原子教程里更改了.bl2和创建了新的.dtsi设备树文件,但
    发表于 03-29 08:01

    stm32mp157d主频为什么无法达到800mhz?

    我在移植tf-a 2.6 版本和uboot 2021.10 版本后发现mpu主频是650mhz ,我的芯片是mp157d的型号应该是要跑到800mhz的,移植测试用的开发板用的是分离式电源,没有采用
    发表于 03-20 06:02

    TF卡和SD卡的区别有哪些?

    TF卡和SD卡在物理尺寸和一些应用领域上存在差异,但在技术规格上,特别是MicroSD卡,它们之间的差异相对较小。选择TF卡还是SD卡通常取决于设备的兼容性和用户的需求。
    的头像 发表于 01-18 09:17 9616次阅读
    <b class='flag-5'>TF</b>卡和SD卡的区别有哪些?

    什么是SD NAND存储芯片? SD NAND与TF卡的区别

    什么是SD NAND?它俗称贴片式T卡,贴片式TF卡,贴片式SD卡,贴片式内存卡,贴片式闪存卡,贴片式卡...等等。虽然SD NAND 和TF卡称呼上有些类似,但是SD NAND和TF卡有着本质上的区别。
    的头像 发表于 01-06 14:35 1609次阅读
    什么是SD NAND存储芯片? SD NAND与<b class='flag-5'>TF</b>卡的区别

    SD/TF卡的速度等级,如何读懂TF的速度标识

    SD/TF卡的速度等级下图是SD协会的速度等级图,从图中可以看出不同的符号对应的速度等级信息。如何读懂TF的丝印标识以MK-米客方德工业级TF卡为例:U3:UHS速度等级可达30M/s,U1和U3
    的头像 发表于 01-02 16:38 9952次阅读
    SD/<b class='flag-5'>TF</b>卡的速度等级,如何读懂<b class='flag-5'>TF</b>的速度标识

    可编程CPU重置地址,单CPU冷启动配置

    如果将BL31用作TF-A入口点而不是BL1,则上图仍然相关,因为在这种情况下,所有这些操作都将发生在BL31中。有关详细信息,请参阅第6节“使用BL31入口点作为重置地址”。
    发表于 12-02 11:00 978次阅读
    可编程CPU重置地址,单CPU冷启动配置

    如何对机器人静态TF广播进行管理

    静态TF广播 我们说TF的主要作用是对坐标系进行管理,那就管理一个试试呗? 坐标变换中最为简单的应该是相对位置不发生变化的情况,比如你家的房子在哪个位置,只要房子不拆,这个坐标应该就不会变化。 在
    的头像 发表于 11-22 17:31 477次阅读
    如何对机器人静态<b class='flag-5'>TF</b>广播进行管理

    ROS中的TF该如何使用

    TF命令行操作 ROS中的TF该如何使用呢?我们先通过两只小海龟的示例,了解下基于坐标系的一种机器人跟随算法。 小海龟跟随例程 这个示例需要我们先安装相应的功能包,然后就可以通过一个launch文件
    的头像 发表于 11-22 17:24 1004次阅读
    ROS中的<b class='flag-5'>TF</b>该如何使用