---
title: Hisilicon加密驱动多项缺陷导致系统异常、RAS处理不当及DMA方向错误-官方技术文章-鲲鹏社区
description: Hisilicon加密驱动多项缺陷导致系统异常、RAS处理不当及DMA方向错误
keywords: Hisilicon,加密驱动多项,缺陷导致系统,异常,RAS,DMA,处理不当及,方向错误
url: https://www.hikunpeng.com/developer/techArticles/20260627-5?envFlag=1
section: (其他)
---

# Hisilicon加密驱动多项缺陷导致系统异常、RAS处理不当及DMA方向错误-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20260627-5?envFlag=1
描述: Hisilicon加密驱动多项缺陷导致系统异常、RAS处理不当及DMA方向错误
关键词: Hisilicon,加密驱动多项,缺陷导致系统,异常,RAS,DMA,处理不当及,方向错误

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

Hisilicon加密驱动多项缺陷导致系统异常、RAS处理不当及DMA方向错误

Hisilicon加密驱动多项缺陷导致系统异常、RAS处理不当及DMA方向错误

openEuler

发表于 2026/06/27

0

#内核版本

OLK-6.6

#问题现象

1. **Curve25519算法调用失败**：在硬件不支持或初始化失败的场景下，使用Curve25519算法时内核打印错误日志 `Failed to alloc curve25519 tfm!`，后续操作可能导致空指针崩溃或调用失败。

2. **压缩算法回退失败**：当硬件压缩算法回退到软件实现时，若系统未加载相应软件算法模块，初始化时打印 `could not alloc soft tfm`，可能导致后续压缩/解压缩操作调用空指针崩溃。

3. **中断上下文非法访问**：在异常中断处理流程中，访问设备寄存器时未获取电源管理引用计数，可能导致PM状态异常或内核崩溃。

4. **控制器复位阻塞与失败**：驱动卸载或复位流程卡死；复位准备阶段失败时未正确清理硬件状态，导致后续设备不可用。

5. **DMA内存管理错误**：DMA映射方向参数不一致，在错误处理路径中使用了错误的DMA解映射方向，可能导致内存泄漏或DMA异常。

#主要错误日志

- pr_err("Failed to alloc curve25519 tfm!\n");

- dev_err(&qm->pdev->dev, "failed to get runtime PM for aeq handle\n");

- pci_warn(qm->pdev, "Driver is down, need to reload driver!\n");

- dev_err(&qm->pdev->dev, "failed to get runtime PM for controller\n");

- pr_err("failed to do fallback %s work, ret=%d\n", algo, ret);

- pr_err("could not alloc soft tfm %s\n", alg_name);

#问题根因

1. **Curve25519支持缺陷**：驱动未设置 `CRYPTO_ALG_NEED_FALLBACK` 标志，且在硬件初始化失败（返回 -ENODEV）时未尝试分配软件 `soft_tfm` 作为后备，导致后续操作无有效上下文。

2. **回退机制不完善**：Zip驱动在初始化软件压缩 `soft_tfm` 前，未使用 `crypto_has_comp` 检查算法是否存在，直接分配导致失败。

3. **PM引用计数缺失**：`qm_aeq_thread` 中断处理函数和复位工作队列 `hisi_qm_controller_reset` 在访问硬件前未调用 `qm_pm_get_sync` 获取PM计数，违反电源管理约束。

4. **复位逻辑错误**：

- 使用 `QM_RST_SCHED` 位检查循环等待，易导致死锁。

- `qm_controller_reset_prepare` 失败后直接返回，未Master 传递及重置状态位，导致状态残留。

5. **RAS处理不彻底**：错误清除与屏蔽操作使用了非全1掩码，可能无法清除所有残留错误状态；异常中断处理流程调用 `qm_process_dev_error` 判断复位需求，逻辑冗余且可能在驱动卸载时触发错误调度。

6. **DMA方向参数不匹配**：`hisi_acc_sg_buf_map_to_hw_sgl` 函数错误路径中，`dma_unmap_sg` 使用了 `DMA_BIDIRECTIONAL`，而映射时使用的是传入的 `dir` 参数。

#解决方案

1. **完善算法回退机制**：

- 为 Curve25519 增加 `soft_tfm` 成员和 `CRYPTO_ALG_NEED_FALLBACK` 标志。

- 在 `init_tfm` 中处理 -ENODEV 返回值，分配软件算法实例；在相关算法接口中增加 fallback 分支处理。

- Zip驱动在分配软件算法前增加 `crypto_has_comp` 检查。

2. **修正PM与复位逻辑**：

- 在 `qm_aeq_thread` 和 `hisi_qm_controller_reset` 中添加 `qm_pm_get_sync` 和 `qm_pm_put_sync` 调用。

- 移除 `QM_RST_SCHED` 位及相关循环等待逻辑，改用 `cancel_work_sync` 复位工作。

- 在 `qm_controller_reset` 的 `err_prepare` 标签处增加Master OOO 和停止收发队列的操作。

3. **修复RAS与中断处理**：

- 统一使用 `GENMASK(31, 0)` 作为 RAS 清除和屏蔽的掩码（如 `QM_RAS_CLEAR_ALL`、`HPRE_RAS_MASK_ALL`），确保覆盖所有中断位。

- 简化 `qm_abnormal_irq` 处理，直接调度 `rst_work` 并打印警告，移除冗余的状态判断。

4. **修复代码缺陷**：

- 修正 `hisi_acc_sg_buf_map_to_hw_sgl` 错误路径中的 `dma_unmap_sg` 参数，使用传入的 `dir` 变量。

- 降低 Hisilicon 硬件加密算法优先级（如 HPRE, SEC, ZIP 优先级调整为 80），确保优先使用标准软件实现或在无专用硬件时正确回退。
