目录
1. 整体架构介绍
2 Linux中reset模块
2.1 Reset consumer
2.2 Reset provider
3. Linux SCMI reset通信
3.1 SCMI reset协议初始化
3.2 SCMI reset消息收发
4. SCP中reset
4.1 固件新增module
4.2 scmi_reset_domain初始化
4.3 scmi_reset_domain消息处理
4.3.1 scmi_reset_domain中处理
4.3.2 reset-domain HAL层
4.3.3 juno-reset-domain驱动层
5. 硬件CRU设计
上篇介绍了电源管理入门-4子系统reset,提到子系统reset的执行为了安全可以到SCP里面去执行,但是怎么把这个消息传递过去呢,答案就是mailbox。
Mailbox是核间通信软硬件的统称。
在软件上可以使用SCMI协议+共享内存报文头,
在硬件上可以使用PL320或者MHU。
1. 整体架构介绍
Reset系统架构框图
上图以NPU子模块的服务为例子,Mailbox的硬件使用PL320,整体流程如下:
-
Reset consumer模块执行devm_reset_control_get()获取npu_reset复位句柄,然后通过reset_control_reset()触发复位
-
Linux系统reset framework找到复位驱动并执行ops->reset()回调函数
-
scmi-reset驱动里面提供.reset函数的实现scmi_reset_deassert(),并执行
-
arm-scmi里面提供scmi reset协议的实现模块reset,里面提供reset函数scmi_reset_domain_reset()
-
arm-scmi里面提供scmi协议收发的框架driver,提供do_xfer()
-
arm-scmi里面提供mailbox的接口函数mailbox_send_message()
-
arm-scmi里面提供共享内存的操作函数shmem_tx_prepare()
-
mailbox驱动里面提供硬件PL320的寄存器操作实现pl320_mbox_send_data()
-
SCP中PL320驱动模块接收mailbox中断
-
SCP中SMT模块从共享内存中读取SCMI报文数据
-
SCP中SCMI模块对SCMI协议报文进行解析,并进行分发处理
-
SCP中SCMI RESET DOMAIN协议模块对报文进行功能处理
-
SCP中RESET DOMAIN模块屏蔽硬件差异实现统一API
-
SCP中JUNO RESET DOMAIN模块提供具体硬件CRU寄存器操作实现
2 Linux中reset模块
2.1 Reset consumer
之前的文章电源管理入门-4子系统reset介绍了怎么使用Linux的reset子系统,这里我们就直接使用,需要在DTS中修改即可。
reset使用Linux自带的reset框架,假定consumer-firmware-npu这个驱动要使用NPU的reset,定义在DTS中有reset consumer的说明:consumer-firmware-npu。
/ {
consumer_firmware@0x0 {
compatible = "consumer-firmware-npu";
reg = < 0x0 0x0 0x0 0x00 >;
resets = <&scmi_reset 0>;
reset-names = "npu_reset";
};
};
drivers/firmware/consumer/consumer.c中驱动需要使用reset功能。
static struct platform_driver consumer_firmware_driver = {
.driver = {
.name = "consumer_firmware",
.of_match_table = consumer_firmware_of_match,
},
.probe = consumer_firmware_probe,
.remove