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

    文章

    1362

    浏览量

    40216
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10824

    浏览量

    211087
  • SMP
    SMP
    +关注

    关注

    0

    文章

    71

    浏览量

    19627
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    如何让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

    ATFbl2的启动

    bl2_entrypoint函数最终会触发安全监控模式调用(smc) ,通知bl1将CPU的控制权限转交给bl31,然后执行bl31。 该函数会执行 • 平台相关的初始化、 • 获取
    的头像 发表于 11-07 15:59 749次阅读
    ATF<b class='flag-5'>中</b><b class='flag-5'>bl</b>2的启动

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

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

    ATFbl2到bl31的跳转介绍

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

    ATFbl31的启动

    bl2触发安全监控模式调用后会跳转到bl31执行,bl31最主要的作用是 建立EL3运行态的软件配置 , 在该阶段会完成各种类型的安全
    的头像 发表于 11-07 16:13 1087次阅读
    ATF<b class='flag-5'>中</b><b class='flag-5'>bl31</b>的启动

    ATFbl31函数介绍与使用

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

    Bl31断处理流程概述

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

    psci接口规范介绍

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

    内核psci驱动是什么

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

    内核psci架构cpu_ops接口

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

    PSCI处理函数代码分析

    处理函数根据funid来决定服务,可以看到PSCI_CPU_ON_AARCH64为0xc4000003,这正是设备树填写的cpu_on属性的id,会委托psci_cpu_on来执行核上电任务。下面
    的头像 发表于 12-05 18:08 864次阅读

    armv8 u-boot的启动介绍

    先看arm官网提供的一张图: 上图详细概括了arm官方推荐的armv8的启动层次结构: 官方将启动分为了BL1,BL2,BL31BL32,BL
    的头像 发表于 12-07 11:09 1905次阅读
    armv8 u-boot的启动<b class='flag-5'>介绍</b>