bl31中的psci架构
bl31为内核提供了一系列运行时服务,psci作为其标准运行时服务的一部分,通过宏DECLARE_RT_SVC注册到系统中。其相应的定义如下:
DECLARE_RT_SVC(
std_svc,
OEN_STD_START,
OEN_STD_END,
SMC_TYPE_FAST,
std_svc_setup,
std_svc_smc_handler
)
其中std_svc_setup会在bl31启动流程中被调用,以用于初始化该服务相关的配置。而std_svc_smc_handler为其smc异常处理函数,当内核通过psci接口调用相关服务时,最终将由该函数执行实际的处理流程。
上图为psci初始化相关的流程,它主要包含内容:(1)前面我们已经介绍过power domain相关的背景,即psci需要协调不同层级的power domain状态,因此其必须要了解系统的power domain配置情况。以上流程中红色虚线框的部分主要就是用于初始化系统的power domain拓扑及其状态
(2)由于psci在执行电源相关接口时,最终需要操作实际的硬件。而它们是与架构相关的,因此其操作函数最终需要注册到平台相关的回调中。plat_setup_psci_ops即用于注册特定平台的psci_ops回调,其格式如下:
typedef struct plat_psci_ops {
void (*cpu_standby)(plat_local_state_t cpu_state);
int (*pwr_domain_on)(u_register_t mpidr);
void (*pwr_domain_off)(const psci_power_state_t *target_state);
void (*pwr_domain_suspend_pwrdown_early)(
const psci_power_state_t *target_state);
void (*pwr_domain_suspend)(const psci_power_state_t *target_state);
void (*pwr_domain_on_finish)(const psci_power_state_t *target_state);
void (*pwr_domain_on_finish_late)(
const psci_power_state_t *target_state);
void (*pwr_domain_suspend_finish)(
const psci_power_state_t *target_state);
void __dead2 (*pwr_domain_pwr_down_wfi)(
const psci_power_state_t *target_state);
void __dead2 (*system_off)(void);
void __dead2 (*system_reset)(void);
int (*validate_power_state)(unsigned int power_state,
psci_power_state_t *req_state);
int (*validate_ns_entrypoint)(uintptr_t ns_entrypoint);
void (*get_sys_suspend_power_state)(
psci_power_state_t *req_state);
int (*get_pwr_lvl_state_idx)(plat_local_state_t pwr_domain_state,
int pwrlvl);
int (*translate_power_state_by_mpidr)(u_register_t mpidr,
unsigned int power_state,
psci_power_state_t *output_state);
int (*get_node_hw_state)(u_register_t mpidr, unsigned int power_level);
int (*mem_protect_chk)(uintptr_t base, u_register_t length);
int (*read_mem_protect)(int *val);
int (*write_mem_protect)(int val);
int (*system_reset2)(int is_vendor,
int reset_type, u_register_t cookie);
}
最后我们再看一下psci操作相应的异常处理流程:

即其会根据function id的值,分别执行相应的电源管理服务,如启动cpu时会调用psci_cpu_on函数,重启系统时会调用psci_system_rest函数等。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
内核
+关注
关注
4文章
1476浏览量
43098 -
cpu
+关注
关注
68文章
11332浏览量
225957 -
SMP
+关注
关注
0文章
82浏览量
20968
发布评论请先 登录
相关推荐
热点推荐
可编程CPU重置地址,单CPU冷启动配置
如果将BL31用作TF-A入口点而不是BL1,则上图仍然相关,因为在这种情况下,所有这些操作都将发生在BL31中。有关详细信息,请参阅第6节“使用B
发表于 12-02 11:00
•1938次阅读
BL2 在跳转到 BL31 之前挂起 — 训练后出现 DDR PHY (0x01400000) 访问问题,求解
SDK (LSDK 25.06)使用以下调试选项:
调试=1
ddr_debug=是
ddr_phy_debug=是
我目前面临一个问题,即BL2 在跳到 BL31 之前停止.
为了调查这一点,我将
发表于 03-03 06:34
如何使 i.MX93 上的 U-Boot SPL 和 ATF/BL31输出静音呢?
到外部网络设备时,U-Boot SPL 和 ATF/BL31 启动消息会回显到外部设备的控制台。如果外部设备也在启动,它可以将这些字符解释为输入命令,从而可能损坏其引导加载程序或配置。
我成功静音的内容
发表于 03-09 08:28
如何让BL31的调试信息输出到S32R45的uart?
我用“DEBUG=1”构建 ATF 映像,uart 可以显示 BL2 的调试信息,但没有显示 BL31 的调试信息。 为什么?BL2到BL31,是不是又设置了控制台?如何让
发表于 04-11 08:20
BL31未在Kirkstone上加载的原因?
imx8mm_evk.h 和 imx8mm_evk.c 中的设置时,SPL 打印 do uart3,但它应该显示:注意:BL31:v2.6(发布
发表于 04-19 11:00
ATF中bl2的启动
bl2_entrypoint函数最终会触发安全监控模式调用(smc) ,通知bl1将CPU的控制权限转交给bl31,然后执行bl31。 该函数会执行 • 平台相关的初始化、 • 获取
ATF中如何用函数完成bl2的启动
bl31加载到内存中后会触发安全监控模式调用(smc)将CPU权限转交给bl31。 该函数的主要内容和相关注释如下: ** void bl2_main ( void
ATF中bl2到bl31的跳转介绍
bl2到bl31的跳转 在bl2_main函数中最终会调用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next_bl
ATF中bl31函数介绍与使用
runtime_svc_init函数 该函数主要用来建立安全监控模式调用处理函数的索引表,并执行EL3中提供的服务项的初始化操作,获取TEE OS的入口地址并赋值给bl32_init变量,以备启动
psci接口规范介绍
由于psci是由linux内核调用bl31中的安全服务,实现cpu电源管理功能的。因此其软件架构包含三个部分: (1)内核与bl31之间的调
内核中的psci驱动是什么
"; ( 2 ) } (1)用于指定psci版本 (2)根据该psci由bl31处理还是hypervisor处理,可以指定其对应的陷入方式。若由bl31处理为smc,若由hypervi
内核中的psci架构cpu_ops接口
cpu_ops接口 驱动初始化完成后,cpu的cpu_ops就可以调用这些回调实现psci功能的调用。如下所示,当devicetree中cpu的enable-method设置为psci时,该cpu
PSCI处理函数代码分析
处理函数根据funid来决定服务,可以看到PSCI_CPU_ON_AARCH64为0xc4000003,这正是设备树中填写的cpu_on属性的id,会委托psci_cpu_on来执行核上电任务。下面
bl31中的psci架构介绍
评论