- 核心框架——核心框架包含通用逻辑。它加载固件并启动或停止远程处理器。
- Remoteproc 驱动——驱动包含用于管理相应核心的平台特定操作。remoteproc 驱动向核心框架注册一个 remoteproc 实例和一组操作。
Qualcomm remoteproc 支持
Qualcomm 增强了 remoteproc 框架,使用上游 PAS 驱动实现外设固件认证。 Qualcomm Linux 中的 Remoteproc 驱动实现了外设认证服务(PAS)驱动,它是基于 TrustZone 的、面向 Qualcomm SoC 设备上远程处理器的外设镜像加载器。 有关更多信息,请参阅 qcom_q6v5_pas.c。 远程处理器用于管理各种协处理器的生命周期,例如 aDSP、cDSP、调制解调器外设子系统(MPSS)和无线处理器子系统(WPSS)。基于 QCS6490 的开发板和 Dragonwing™ RB3 Gen 2 开发套件支持的协处理器为 aDSP、cDSP 和 WPSS。支持的远程处理器子系统列表取决于所使用的 SoC。
sysfs 接口查询和更改 remoteproc 的当前状态:
图:Remoteproc 支持
配置 remoteproc 恢复和子系统重启
remoteproc 子设备负责管理远程处理器子系统崩溃和恢复场景下的通信上下文。 诸如通信上下文之类的实体必须确定远程处理器何时启动或关闭。每个子设备有两个操作:probe():在 remoteprocstart()之后调用remove():在stop()之前调用
rproc_report_crash(),从而触发对故障远程处理器的恢复。
恢复处理程序执行以下操作:
图:Remoteproc 崩溃序列
debugfs 节点启用和禁用恢复功能,请执行以下操作:
启用或禁用 core dump
支持远程处理器 core dump,可使用 Qualcomm Linux 内核的 devcoredump 特性调试子系统崩溃问题。 当发生子系统崩溃时,devcoredump 会在/sys/class/devcoredump/devcdN/data 节点中暴露正在恢复的 remoteproc 的内存快照,并向用户空间发送关联的崩溃 uevent。当读取该 sysfs 节点时,sysfs 以 ELF 容器的形式提供各内存段;写操作则会释放资源并销毁该 devcoredump 实例。
系统会暴露一个 debugfs 节点,用于从用户空间启用和禁用 core dump。
为了收集完整的 RAM dump 用于崩溃分析,Qualcomm SoC 在 remoteproc 崩溃(远程处理器发生致命错误)时实现内核 panic。仅当 core dump 被禁用时,才会启用内核 panic 模式。
/sys/class/devcoredump/devcdN/data 节点。要启用 core dump,请运行 echo enabled > /sys/kernel/debug/remoteproc/remoteprocN/coredump 命令。devcdN/data 节点是临时的,会在超时后被删除。要调试问题,请使用 copy 命令将 devcdN/data 节点复制到本地设备以便安全使用。删除超时时间在 base/devcoredump.c 中定义。
以下是复制 core dump 的示例命令:
有关 QCAP 的更多信息,请参阅使用 QCAP 解析 RAM dump。
在 DT 中配置 remoteproc 节点和固件加载
remoteproc 设备使用 DT 绑定在相应的设备树文件中进行配置。该配置包括兼容的设备名称、内存区域、中断设置以及时钟引用,均遵循Documentation/devicetree/bindings/remoteproc/ 目录中的 DT 绑定。
以下示例展示了 arch/arm64/boot/dts/qcom/qcs6490.dtsi(在内核 v6.19 及更高版本中更名为 kodiak.dtsi)中 QCS6490 aDSP remoteproc 的设备树配置:
arch/arm64/boot/dts/qcom/lemans.dtsi 路径中查看 IQ-9075 的设备树配置文件。
要获取所有 Qualcomm SoC 的设备树配置文件,请参阅相应的平台 DTSI 文件。
rootfs 的 /lib/firmware 目录中,相关配置在对应的开发板设备树 arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts 文件中完成。对于其他 Qualcomm 硬件 SoC,请参阅 arch/arm64/boot/dts/qcom/<SoC>-<board>.dts 文件。
以下示例展示了 remoteproc 的 DT 配置:

