> ## 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.

# 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
```

**示例 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.
```

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

在内核日志中，`pa_err_cnt_total` 和 `dl_err_cnt_total` 为非零值表示存在物理适配器或数据链路（PA/DL）错误问题。当 AP 与 UFS 设备之间的信号质量不佳时会出现此问题，需要在硬件、软件和 UFS 设备供应商这三个方面进行修改才能解决。

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

使用以下命令挂载 `debugfs`。该命令可确保 `debugfs` 文件系统对调试节点保持可访问。

```bash theme={null}
mount -t debugfs none /sys/kernel/debug
```

例如：

```
[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
```

## Active 状态 UFS 设备功耗问题

使用以下步骤调试 UFS 设备在 Active 状态下的高功耗问题。

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

   ```bash theme={null}
   cat /sys/devices/platform/soc@0/1d84000.ufshc/devfreq/1d84000.ufshc/cur_freq
   ```

   <Note>
     如果频率已是最大值，请跳到步骤 3。
   </Note>

2. 检查是否启用了任何与 UFS 设备相关的功能（例如 WriteBooster）。

3. 检查时钟调频是否已禁用。

   ```bash theme={null}
   cat /sys/devices/platform/soc@0/1d84000.ufshc/clkscale_enable
   ```

4. 监控 UFS 设备时钟频率和 UFS 设备电源轨。

   该问题可能由初始设置或意外的 `devfreq` 事件引起。

## Sleep 状态功耗问题

在 Sleep 状态下，如果 UFS 设备功耗偏高，请使用以下步骤调试与 UFS 设备挂起相关的问题。

1. 使用 sysfs 节点 `link_state`、`cur_freq` 和 `runtime_status` 以及 PM 级别（`PM_LVL` 3 的功耗高于 5）检查电源管理状态。

2. 使用 sysfs 节点 `dev_pm` 检查 UFS 设备状态，以确定 UFS 设备是否处于睡眠模式。

3. 检查是否启用了 HPB 和 write booster 功能，因为它们会导致高功耗。

4. 如果出现问题，请从硬件侧检查 UFS 设备 VCC/VCCQ/VCCQ2 时序。

## 未处理的 UFS 设备 SMMU 问题

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

每个设备被分配一个唯一的流 ID（SID）。UFS 设备控制器的 SID 值为 0x80。

对于来自 UFS 设备 SMMU 的未处理 SMMU 故障，请禁用 UFS 设备 SMMU。

```
arm-smmu 15000000.apps-smmu: Unhandled arm-smmu context fault from 1d84000.ufshc!
```

要禁用 UFS 设备 SMMU，请修改通常位于 SOC DTSI 文件中的 `ufshc_mem` 节点。例如，`<workspace_root_path>/sources/kernel/kernel_platform/kernel/arch/arm64/boot/dts/qcom/sc7280.dtsi` 文件。

```diff theme={null}
-   qcom,iommu-dma = "fastmap";
+   qcom,iommu-dma = "bypass";
```
