【SA8295P 源码分析】03 - SA8295P QNX Host上电开机流程分析
- 一、阶段1 固件开机自检 (SM BIST):APPS PBL加载XBL后触发 INT_RESET进行Warm Reset
- 二、阶段2 固件开机自检 (SM BIST):加载TZ,初始Hypervisor,启动QNX Kernel,加载并启动各子系统
系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总》
本文链接:《【SA8295P 源码分析】03 - SA8295P QNX Host 上电开机流程分析》
一、阶段1 固件开机自检 (SM BIST):APPS PBL加载XBL后触发 INT_RESET进行Warm Reset
-
1 . 按下开机键,触发复位信号,高通
®Kryo™CPU Gold core 0
核 心CPU0
退出Reset
状态,开始执行APPS PBL
初始化硬件(定时器、PRNG
、时钟等等),启用caches
缓存和MMU
,并根据BOOT PIN
配置检测引导设备:
默认启动设备为:UFS Extern Storage
外置存储
默认启动选项:被EDL cookie
覆盖 或 通过USB GPIO
强制配置 -
2a .
APPS PBL
从引导设备bootdevice
加载并验证XBL Loader
镜像(region #1
)到Boot IMEM
中。 (xbl_a
分区中的xbl.elf
镜像) -
2b .
APPS PBL
从引导设备bootdevice
加载并验证XBL SDI
镜像(region #2
)到OCIMEM
中(片上内部存储器On-Chip Internal Memory
) -
2c .
APPS PBL
从引导设备bootdevice
加载XBL SEC
镜像(region #0
)到Boot IMEM
中,(xbl_sec
分区中的xbl_sec.mbn
镜像)
XBL SEC
是一个QC
签名的ELF
代码段,用于锁定xPUs
-
3 .
XBL SEC
跳到XBL
并将CPU
控制 从Secure EL3
安全等级3环境 切换到Non-Secure EL1
非安全等级1环境 -
4a . 在阶段
1
引导中,XBL
执行SMSS MBIST
进行内存自检(Memory BIST
)和SMSS LBIST
进行逻辑自检(Logic BIST
),
加载并验证SMSSCSM
内存中的SMSS FW
固件,并Reset SMSS
触发SMSS
运行,
然后AP
(XBL Loader
)将CPU
控制权移交给SMSS
(安全管理) (smss_a
中的smss.elf
镜像),并进入WFI
待机模式 (standby
模式Wait For Interrupt
)。
此时,SMSS
将分别在AP
、IMEM
、LLCC
、SMMU
、GEMNOC
这些区域上执行BIST
内存自检。 -
5 . 自检完成后,在没有
PMIC
的情况下,整个芯片触发INT_RESET
,进行Warm Reset
操作
之所以进行Warm Reset
,是保持供电,以便保持之前初始化过的一些TCSR
寄存器和SMSS IMEM
/registers
的状态。
二、阶段2 固件开机自检 (SM BIST):加载TZ,初始Hypervisor,启动QNX Kernel,加载并启动各子系统
在阶段一中,整个芯片启动 INT_RESET
,启动warm reset
,此时,APPS PBL
代码会重新跑一遍。
详细过程如下:
-
2a .
APPS PBL
从引导设备bootdevice
加载并验证XBL Loader
镜像(region #1
)到Boot IMEM
中。 (xbl_a
分区中的xbl.elf
镜像) -
2b .
APPS PBL
从引导设备bootdevice
加载并验证XBL SDI
镜像(region #2
)到OCIMEM
中(片上内部存储器On-Chip Internal Memory
) -
2c .
APPS PBL
从引导设备bootdevice
加载XBL SEC
镜像(region #0
)到Boot IMEM
中,(secdata
分区中的sec.dat
)
XBL SEC
是一个QC
签名的ELF
代码段,用于锁定xPUs
-
3 .
XBL SEC
在EL3
模式下运行Security Configuration
启动SMSS
(smss_a
中的smss.elf
镜像),然后跳转到EL1
非安全环境 并运行XBL Loader
。 -
4 .
XBL Loader
将CPU
控制权移交给SMSS
并进入WFI
模式。
SMSS
将分别在DPU
、Camera
、CamNoc
、NSP
、Ethernet
以太网、PCIe
上执行BIST
,
自检完毕后,将CPU
控制权交回给XBL Loader
,
接着XBL Loaders
继续正常的冷启动流程 -
4b .
XBL Loader
加载和校验XBL Config
镜像到BOOT IMEM
中 (xbl_config_a
分区中的xbl_config.elf
镜像) -
4c .
XBL Loader
加载Shrm
镜像到Code RAM
中(shrm_a
分区中的shrm.elf
镜像) -
4d .
XBL Loader
加载并验证MISC
镜像到BOOT IMEM
中 -
4e .
XBL Loader
从引导设备boot device
加载并验证AOP
镜像 到AOP CodeRAM
中 (aop_a
分区中的aop.mbn
镜像) -
4f .
XBL Loader
触发AOP
实时响应处理器Reset
,开始AOP CodeRAM
中跑AOP
代码 -
4g .
XBL Loader
加载并验证QSEE
镜像到pIMEM
中(tz_a
分区中的tz.mbn
) -
4h .
XBL Loader
加载并验证QHEE
镜像(hyp_a
分区中的mifs_hyp_la.img
镜像,用于hypervisor
虚拟化) -
4i .
XBL Loader
从XBL
镜像中加载并验证UEFI Segment
代码段 -
4j .
XBL Loader
从跳转到XBL_SEC
,由XBL_SEC
将CPU
交到QSEE
(TrustZone
)手中 -
5 .
QSEE
(TZ
)将CPU
转交到QHEE
(hypervisor
),高通Hypervisor
运行在EL2
模式,QHEE
配置SMMUs
,并提供虚拟化服务 -
6 . 高通
Hypervisor
执行XBLcore
代码(位于region #3
中),它是在Non-sec EL1
非安全模式下运行的,
UEFI
外围镜像加载器(UEFI peripheral image loader (PIL)
)挂载并运行ABL firmware volume(FV)
固件(abl_a
中的abl_fastboot.elf
abl.elf
),其中包含Fastboot
和Linux Loader
应用程序 -
7 .
Linux Loader
应用程序(位于abl.elf
镜像)通过verified boot
加载并验证HLOS Kernel
镜像(对应boot_a
中的boot_la.img
,它是QNX Host Kernel
微内核),HLOS Kernel
运行在Non-Sec EL1
模式下 -
8 .
HLOS PIL driver (QNX)
将所有子系统Iris FW
、Camera FW
、Audio FW
、Sensor FW
、Turing FW
、Deep Learning FW
的镜像加载到DDR
,并相应的配置时钟和电源。HLOS PIL driver (QNX)
执行对QSEE (TrustZone)
的SCM
系统调用,以请求一个安全的PIL driver
,用于验证各子系统的镜像,然后 高通Hypervisor
触发每个子系统进行Reset
启动
注意,此时只是 QNX Host
启动起来了,运行在 EL1
环境中,IVI Android Guest
还没启动呢,GVM
是运行在 EL0
中的