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

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

3天内不再提示

bl31中的psci架构介绍

麦辣鸡腿堡 来源:TrustZone 作者:Hcoco 2023-12-05 17:33 次阅读

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函数等。

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

    关注

    3

    文章

    1309

    浏览量

    39850
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10446

    浏览量

    206572
  • SMP
    SMP
    +关注

    关注

    0

    文章

    68

    浏览量

    19450
收藏 人收藏

    评论

    相关推荐

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

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

    基于armv8架构对u-boot进行启动流程分析(一)

    Linux kernel;启动BL1,BL2,BL31BL32则是一个完整的ATF信任链建立流程(ARM Trusted Firmware),像常见的
    发表于 05-23 15:59

    LS1046AFRWY需要做什么才能使用安全引导架构进行引导?

    架构进行引导?我是否在构建 BL2、BL31BL33 图像时使用代码签名工具,然后将这些图像闪存到我的板上? 在我对每个图像进行代码签名并将图像闪存到电路板上后,我还需要做什么?
    发表于 03-31 08:06

    如何让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。 该函数会执行 • 平台相关的初始化、 • 获取
    的头像 发表于 11-07 15:59 285次阅读
    ATF中<b class='flag-5'>bl</b>2的启动

    ATF中如何用函数完成bl2的启动

    。 • 将bl31加载到内存中后会触发安全监控模式调用(smc)将CPU权限转交给bl31。 该函数的主要内容和相关注释如下: ** void bl2_main ( void
    的头像 发表于 11-07 16:04 277次阅读

    ATF中bl2到bl31的跳转介绍

    bl2到bl31的跳转 在bl2_main函数中最终会调用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next_bl
    的头像 发表于 11-07 16:09 346次阅读

    ATF中bl31的启动

    如下: func bl31 _entrypoint /* el3初始化操作,该el3_ entrypoint _common函数在上面已经介绍过,其中runtime_ exceptions为 el3 runtime software的
    的头像 发表于 11-07 16:13 355次阅读
    ATF中<b class='flag-5'>bl31</b>的启动

    ATF中bl31函数介绍与使用

    runtime_svc_init函数 该函数主要用来建立安全监控模式调用处理函数的索引表,并执行EL3中提供的服务项的初始化操作,获取TEE OS的入口地址并赋值给bl32_init变量,以备启动
    的头像 发表于 11-07 16:23 249次阅读

    Bl31中断处理流程概述

    aarch64架构,在每个异常等级下都包含了四张异常等级表。 bl31的异常向量表定义在runtime_exceptions.S中,其与下图的定义一致
    的头像 发表于 11-07 17:43 290次阅读
    <b class='flag-5'>Bl31</b>中断处理流程概述

    psci接口规范介绍

    由于psci是由linux内核调用bl31中的安全服务,实现cpu电源管理功能的。因此其软件架构包含三个部分: (1)内核与bl31之间的调用接口规范 (2)内核中的
    的头像 发表于 12-05 16:53 361次阅读

    内核中的psci驱动是什么

    "; ( 2 ) } (1)用于指定psci版本 (2)根据该pscibl31处理还是hypervisor处理,可以指定其对应的陷入方式。若由bl31处理为smc,若由hypervi
    的头像 发表于 12-05 16:58 231次阅读
    内核中的<b class='flag-5'>psci</b>驱动是什么

    内核中的psci架构cpu_ops接口

    cpu_ops接口 驱动初始化完成后,cpu的cpu_ops就可以调用这些回调实现psci功能的调用。如下所示,当devicetree中cpu的enable-method设置为psci时,该cpu
    的头像 发表于 12-05 17:25 295次阅读

    SMP多核secondary cpu启动流程

    hotplug线程将调用psci回调函数,并最终触发smc异常进入bl31bl31接收到该异常后执行std_svc_smc_handler处理函数,并最终调用平台相关的电
    的头像 发表于 12-05 17:41 279次阅读
    SMP多核secondary cpu启动流程