> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 配置远程处理器（remoteproc）子系统

remoteproc 框架用于将固件加载到其他子系统中，例如 Qualcomm<sup>®</sup> 平台上的音频数字信号处理器（aDSP）和计算数字信号处理器（cDSP）。

remoteproc 框架分为两部分：

* 核心框架——核心框架包含通用逻辑。它加载固件并启动或停止远程处理器。
* Remoteproc 驱动——驱动包含用于管理相应内核的平台特定操作。remoteproc 驱动向核心框架注册一个 remoteproc 实例和一组操作。

SoC 上存在多个异构远程处理器，采用非对称多处理（ASMP）配置。这些远程处理器运行不同的固件或 OS 实例。

有关 Qualcomm Linux 用于管理其他内核的标准框架的更多信息，请参阅 [Remote Processor Framework](https://docs.kernel.org/staging/remoteproc.html)。

## Qualcomm remoteproc 支持

Qualcomm 使用上游 PAS 驱动增强了 remoteproc 框架，以实现外设固件认证。

Qualcomm Linux 中的 Remoteproc 驱动实现了外设认证服务（PAS）驱动，它是基于 TrustZone 的外设镜像加载器，用于 Qualcomm SoC 设备上的远程处理器。

有关更多信息，请参阅 [qcom\_q6v5\_pas.c](https://github.com/torvalds/linux/blob/master/drivers/remoteproc/qcom_q6v5_pas.c)。

远程处理器用于管理各类协处理器的生命周期，例如 aDSP、cDSP、调制解调器外设子系统（MPSS）和无线处理器子系统（WPSS）。基于 QCS6490 的开发板和 Dragonwing<sup>™</sup> RB3 Gen 2 开发套件支持的协处理器为 aDSP、cDSP 和 WPSS。

<Note>
  支持的远程处理器子系统列表取决于所使用的 SoC。
</Note>

**用户接口：** remoteproc 框架跟踪已注册的 remoteproc 设备，并提供用户接口以启动和关闭这些设备。用户空间可以使用以下 `sysfs` 接口查询和更改 remoteproc 的当前状态：

```text theme={null}
remoteproc user space interface
# start remoteproc:
  echo "start" > /sys/class/remoteproc/remoteprocN/state

# stop remoteproc:
  echo "stop" > /sys/class/remoteproc/remoteprocN/state
```

<div className="flex flex-col items-center gap-2">
  <img src="https://mintcdn.com/qualcomm-prod/rpHTx_a6zriKQll9/System/Kernel/media/remoteproc-framework.svg?fit=max&auto=format&n=rpHTx_a6zriKQll9&q=85&s=7106e420e6a7c3f7c8d274e12f8d79c1" alt="图：Remoteproc 支持" width="976" height="744" data-path="System/Kernel/media/remoteproc-framework.svg" />

  <p className="text-sm text-gray-700">
    图：Remoteproc 支持
  </p>
</div>

## 配置 remoteproc 恢复和子系统重启

remoteproc 子设备管理远程处理器子系统崩溃和恢复场景中的通信上下文。

诸如通信上下文之类的实体必须确定远程处理器何时启动或关闭。每个子设备有两个操作：

* `probe()`：在 remoteproc `start()` 之后调用
* `remove()`：在 `stop()` 之前调用

当远程处理器发生致命错误时，remoteproc 驱动会处理该错误并调用 `rproc_report_crash()`，从而触发对故障远程处理器的恢复。

恢复处理程序执行以下操作：

<div className="flex flex-col items-center gap-2">
  <img src="https://mintcdn.com/qualcomm-prod/rpHTx_a6zriKQll9/System/Kernel/media/Remoteproc-recovery.svg?fit=max&auto=format&n=rpHTx_a6zriKQll9&q=85&s=77736732509d0645122919b4d2b7a966" alt="图：Remoteproc 崩溃流程" width="1071" height="204" data-path="System/Kernel/media/Remoteproc-recovery.svg" />

  <p className="text-sm text-gray-700">
    图：Remoteproc 崩溃流程
  </p>
</div>

启动 remoteproc 实例、重新加载固件、调用 coredump 生成器、停止 remoteproc 实例

**图：Remoteproc 崩溃流程**

要从用户空间使用 recovery `debugfs` 节点启用和禁用恢复，请执行以下操作：

```text theme={null}
mount -t debugfs nodev /sys/kernel/debug
echo disabled > /sys/kernel/debug/remoteproc/remoteprocN/recovery
```

## 启用或禁用核心转储

支持远程处理器核心转储（core dump），可使用 Qualcomm Linux 内核 devcoredump 特性调试子系统崩溃问题。

当子系统崩溃时，devcoredump 会在 `/sys/class/devcoredump/devcdN/data` 节点中暴露正在恢复的 remoteproc 的内存快照，并向用户空间发送关联的崩溃 `uevent`。读取该 sysfs 节点时，sysfs 以 ELF 容器形式提供这些段；写入操作会释放资源并销毁 devcoredump 实例。

系统暴露了一个 debugfs 节点，可从用户空间启用和禁用核心转储。

```text theme={null}
# Disable core dumps:
  echo disabled > /sys/kernel/debug/remoteproc/remoteprocN/coredump

# Enable core dumps:
  echo enabled > /sys/kernel/debug/remoteproc/remoteprocN/coredump
#
# N represents the index number of the remote processor.
```

<Note>
  为了收集用于崩溃分析的完整 RAM 转储，Qualcomm SoC 在 remoteproc 崩溃（远程处理器致命错误）时实现内核 panic。仅当核心转储被禁用时才会启用内核 panic 模式。
</Note>

只有在为子系统启用了核心转储的情况下，子系统崩溃时才会创建 devcoredump `/sys/class/devcoredump/devcdN/data` 节点。要启用核心转储，请运行 `echo enabled > /sys/kernel/debug/remoteproc/remoteprocN/coredump` 命令。`devcdN/data` 节点是临时的，会在超时后被移除。要调试问题，请使用 `copy` 命令将 `devcdN/data` 节点复制到本地设备以便安全使用。删除超时在 `base/devcoredump.c` 中定义。

以下是复制核心转储的示例命令：

```text theme={null}
# Copy Core dump to a local device
  cp /sys/class/devcoredump/devcdN/data > /var/spool/crash/dump_file.elf
#
# N represents the index of core dump. It is incremented each time a new core dump is generated.
```

要将核心转储文件传输到主机设备并调试问题，请使用 Qualcomm Crash Analysis Portal（QCAP）。

<Note>
  有关 QCAP 的更多信息，请参阅"使用 QCAP 解析 RAM 转储"。
</Note>

## 在 DT 中配置 remoteproc 节点和固件加载

remoteproc 设备在相应的设备树文件中使用 DT 绑定进行配置。配置包括 compatible 设备名称、内存区域、中断设置和时钟引用，遵循 `Documentation/devicetree/bindings/remoteproc/` 目录中的 DT 绑定。

以下示例展示了 `arch/arm64/boot/dts/qcom/qcs6490.dtsi`（在内核 v6.19 及更高版本中重命名为 `kodiak.dtsi`）中 QCS6490 aDSP remoteproc 设备树配置：

```text theme={null}
remoteproc_adsp: remoteproc@3000000 {
          compatible = "qcom,sc7280-adsp-pas";
          reg = <0x0 0x03000000 0x0 0x100>;

          interrupts-extended = <&pdc 6 IRQ_TYPE_EDGE_RISING>,
                                  <&adsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
                                  <&adsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
                                  <&adsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
                                  <&adsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>,
                                  <&adsp_smp2p_in 7 IRQ_TYPE_EDGE_RISING>;
          interrupt-names = "wdog", "fatal", "ready", "handover",
                          "stop-ack", "shutdown-ack";

          clocks = <&rpmhcc RPMH_CXO_CLK>;
          clock-names = "xo";
          <snip>
 };
```

请在 `arch/arm64/boot/dts/qcom/lemans.dtsi` 路径中查看 IQ-9075 设备树配置文件。

<Note>
  要获取所有 Qualcomm SoC 的设备树配置文件，请参阅相应的平台 DTSI 文件。
</Note>

所有固件文件都位于 `rootfs` 的 `/lib/firmware` 目录中，相关配置在相应的开发板设备树 `arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts` 文件中完成。对于其他 Qualcomm 硬件 SoC，请参阅 `arch/arm64/boot/dts/qcom/<SoC>-<board>.dts` 文件。

以下示例展示了 remoteproc DT 配置：

```text theme={null}
&remoteproc_adsp {
firmware-name = "qcom/qcs6490/adsp.mdt";
status = "okay";
};
```

### **Remoteproc 参考日志**

remoteproc 成功启动时会显示以下日志：

```text theme={null}
**
\# remoteproc success**
"remoteproc remoteproc1: remote processor 4080000.remoteproc is now up"
```

remoteproc 固件加载失败时会显示以下日志：

```text theme={null}
**
\# remoteproc failure**
Error log: "remoteproc remoteproc0: Direct firmware load for qcom/qcs6490/modem.mdt failed with error -2"

# Caused by: error loading firmware.
# Solution: ensure that the modem firmware is copied to /lib/firmware/qcom/qcs6490 in rootfs.
```
