# 调试 UFS 问题

Source: [https://docs.qualcomm.com/doc/80-70014-6Y/topic/debug_ufs.html](https://docs.qualcomm.com/doc/80-70014-6Y/topic/debug_ufs.html)

本节介绍如何调试不同的 UFS 问题。

## UFS 设备问题

当 UFS 设备出现问题时，会出现 *cmd pending in the device* 或 *no response from device* 的错误日志，并记录在内核日志中，如下所示。如果出现此问题，咨询 UFS 厂商以获取更多信息。

**示例 1**：

    [ 82.928056][01-01 00:02:05] ufshcd-qcom 1d84000.ufshc: ufshcd_abort: Device abort task at tag 1 
    [ 82.928059][01-01 00:02:05] sd 0:0:0:4: [sde] tag#1 CDB: Read(10) 28 00 00 00 44 49 00 00 20 00 
    [ 82.936477][01-01 00:02:05] ufshcd-qcom 1d84000.ufshc: UPIU[1] - issue time 50955434 us 
    [ 82.936479][01-01 00:02:05] ufshcd-qcom 1d84000.ufshc: UPIU[1] - complete time 0 us 
    [ 82.936567][01-01 00:02:05] ufshcd-qcom 1d84000.ufshc: ufshcd_abort: cmd pending in the device. tag = 1 
    Copy to clipboard

**示例 2**：

    [ 1036.008147] [1230_22:00:49]@0 ufshcd-qcom 1d84000.ufshc: ufshcd_abort: 
    Device abort task at tag 2 [ 1036.008510] [1230_22:00:49]@0 sd 0:0:0:0: tag#2 
    CDB: opcode=0xfa (vendor) fa 02 01 48 07 79 ae 03 50 00 
    [ 1036.120287] [1230_22:00:50]@1 ufshcd-qcom 1d84000.ufshc: ufshcd_abort: no response from device. tag = 2, err -110.
    Copy to clipboard

## PA/DL 错误

在内核日志中，当看到 *pa\_err\_cnt\_total* 和 *dl\_err\_cnt\_total* 非零时，可将其视为 PA/DL 错误问题。此问题表明 SoC 和 UFS 设备之间的信号质量不佳。通常，解决此类问题需要硬件、软件和 UFS 厂商之间的合作。

使用 debugfs 路径 `/sys/kernel/debug/ufshcd/1d84000.ufs/stats` 查看 PA/DL 错误计数。

应使用以下命令挂载 debugfs。此命令将使能 debugfs 文件系统。

    mount -t debugfs none /sys/kernel/debugCopy to clipboard

**示例**：

    [31709.438001] ufshcd-qcom 1d84000.ufshc: pa_err_cnt_total=5086, pa_lane_0_err_cnt=3250, 
    pa_lane_1_err_cnt=1405, pa_line_reset_err_cnt=431
    [31709.438008] ufshcd-qcom 1d84000.ufshc: dl_err_cnt_total=4488,
    dl_nac_received_err_cnt=289, dl_tcx_replay_timer_expired_err_cnt=258
    [31709.438015] ufshcd-qcom 1d84000.ufshc: dl_afcx_request_timer_expired_err_cnt=0,
    dl_fcx_protection_timer_expired_err_cnt=0, dl_crc_err_cnt=18  Copy to clipboard

## UFS 功耗问题

本节解释了由于活动/休眠电源状态导致的额外功耗问题的调试步骤。

**活动状态**

在活动状态下，如果 UFS 功耗较高，按照以下步骤进行调试。

1. 检查问题发生的频率。 
    使用以下 ssh 命令检查当前时钟频率：

        # cat /sys/devices/platform/soc@0/1d84000.ufs/devfreq/1d84000.ufs/cur_freqCopy to clipboard

    如果频率最大，跳至步骤 3。
2. 检查是否已启用任何与 UFS 相关的功能（例如 WriteBooster）。
3. 在主机上使用以下 ssh 命令检查时钟缩放是否被禁用：

        #cat /sys/devices/platform/soc@0/1d84000.ufs/clkscale_enableCopy to clipboard
4. 在问题发生时检查 UFS 时钟频率和 UFS 电源。
5. 该问题可能由于初始配置而在设备启动后发生，或者由于意外的 devfreq 事件而在 suspend/resume 期间发生。

**休眠状态**
在休眠状态下，如果 UFS 功耗较高，按照以下步骤调试与 UFS suspend 相关的问题。
1. 使用 sysfs 节点 link\_state、curr\_freq 和 runtime\_status 检查电源管理状态，并检查 PM 级别（PM\_LVL 3 的功耗高于 5）。
2. 使用 sysfs 节点dev\_pm 检查 UFS 状态以判断 UFS 是否处于休眠模式。
3. 检查 HPB 和写入增强功能是否已启用，因为它们会导致高功耗。
4. 如果出现问题，从硬件端检查 UFS VCC/VCCQ/VCCQ2 时序。

## 禁用 UFS SMMU

系统内存管理单元 (SMMU) 是一种内存管理单元 (MMU)，它将具有直接内存访问功能（具有 DMA 功能）的 I/O 总线连接到物理内存。

每个设备都分配有一个唯一的 stream ID (SID)。该平台上的 UFS 控制器 SID 为 0x80。

如果 UFS SMMU 出现未处理的 SMMU 故障（如下面的日志所示），则可以禁用 UFS SMMU。

    arm-smmu 15000000.apps-smmu: Unhandled arm-smmu context fault from 1d84000.ufshc!Copy to clipboard

可以通过在 &lt;workspace\_root\_path&gt;/sources/kernel/kernel\_platform/kernel/arch/arm64/boot/dts/qcom/sc7280.dtsi 文件中的 `ufshc_mem` 节点进行以下更改来禁用 UFS SMMU。

    -   qcom,iommu-dma = "fastmap";
    +   qcom,iommu-dma = "bypass";
    Copy to clipboard

**Parent Topic:** [调试](https://docs.qualcomm.com/doc/80-70014-6Y/topic/troubleshooting.html)

Last Published: Aug 09, 2024

[Previous Topic
调试](https://docs.qualcomm.com/bundle/publicresource/80-70014-6Y/topics/troubleshooting.md) [Next Topic
使用 sysfs 或 debugfs 节点进行调试](https://docs.qualcomm.com/bundle/publicresource/80-70014-6Y/topics/ufs_sysfs_or_debugfs_nodes.md)