# 调试 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

## 物理适配器/数据链路错误

在内核日志中，当看到 <cite>pa_err_cnt_total</cite> 和 <cite>dl_err_cnt_total</cite> 非零时，可将其视为物理适配器/数据链路 (PA/DL) 错误问题。
此问题表明 AP 和 UFS 设备之间的信号质量不佳。通常，解决此类问题需要硬件、软件和 UFS 厂商之间的合作。

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

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

mount -t debugfs none /sys/kernel/debug
    Copy 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_freq
            Copy to clipboard

        如果频率为最大值，跳至步骤 3。
    2. 检查是否已启用任何与 UFS 相关的功能（例如 WriteBooster）。
    3. 检查时钟缩放是否被禁用。

#cat /sys/devices/platform/soc@0/1d84000.ufs/clkscale_enable
            Copy to clipboard
    4. 监控 UFS 时钟频率和 UFS 电源轨。

        出现此问题的原因可能是初始设置或意外的 devfreq 事件。
- **休眠状态**

    在休眠状态下，如果 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

可以通过在 `<workspace_root_path>/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

Last Published: Dec 10, 2024

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