# 调试

本节描述了存储驱动程序的不同错误，并提供了解决这些错误的指导。

## 调试 UFS 设备问题

发生 UFS 设备问题时，内核日志会记录<cite>设备中待处理的 cmd</cite> 或<cite>设备没有响应</cite>。关于更多信息，请联系 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.ufs/stats`。

使用以下命令挂载 `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

## UFS 功耗问题

过多的功耗可能由活动或休眠电源状态造成。

### 活动状态

> 
> 
> 在活动状态下，按照以下步骤调试 UFS 功耗较高问题。
> 
> 
> 1. 检查问题发生的频率。使用以下 SSH 命令检查当前时钟频率。
> 
> 
> 
> 
> > 
> > 
> > cat /sys/devices/platform/soc@0/1d84000.ufs/devfreq/1d84000.ufs/cur_freq
> >     Copy to clipboard
> > 
> > 
> > Note
> > 
> > 
> > 如果频率为最大值，跳至步骤 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 和 write booster 功能是否已启用，因为它们会导致高功耗。
> 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

要禁用 UFS SMMU，请修改 `<workspace_root_path>/sources/kernel/kernel_platform/kernel/arch/arm64/boot/dts/qcom/sc7280.dtsi` 文件中的 `ufshc_mem` 节点。

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

## 使用 sysfs 或 debugfs 节点进行调试

要识别状态或更新状态，请使用 <cite>sysfs</cite> 和 <cite>debugfs</cite> 节点。

挂载 <cite>debugfs</cite>，以确保调试节点可以访问 <cite>debugfs</cite> 文件系统。

> 
> 
> mount -t debugfs none /sys/kernel/debug
>     Copy to clipboard

UFS 状态信息

| 所需的 UFS 状态信息 | 命令 |
| --- | --- |
| 检查 PA/DL 错误计数 | `cat /sys/kernel/debug/ufshcd/1d84000.ufs/stats` |
| 读取 UFS 门控延迟，单位为 ms | `cat /sys/devices/platform/soc@0/1d84000.ufs/clkgate_delay_ms` |
| 读取给定点上 UFS 时钟的当前频率 | `cat /sys/devices/platform/soc@0/1d84000.ufs/devfreq/1d84000.ufs/cur_freq` |
| 读取 UFS I/O 调度程序详细信息 | `cat /sys/devices/platform/soc@0/1d84000.ufs/devfreq/1d84000.ufs/governor` |
| 时钟缩降低间读取 UFS 最小频率 | `cat /sys/devices/platform/soc@0/1d84000.ufs/devfreq/1d84000.ufs/min_freq` |
| 时钟增加期间读取 UFS 最大频率 | `cat /sys/devices/platform/soc@0/1d84000.ufs/devfreq/1d84000.ufs/max_freq` |
| 读取 UFS 设备状态 ACTIVE 或 SLEEP | `cat /sys/devices/platform/soc@0/1d84000.ufs/power_info/dev_pm` |
| 读取 UFS 档位信息，如 HS\_G3、HS\_G4 | `cat /sys/devices/platform/soc@0/1d84000.ufs/power_info/gear` |
| 读取 UFS 通道数 | `cat /sys/devices/platform/soc@0/1d84000.ufs/power_info/lane` |
| 读取 UFS 链路状态，ACTIVE 或 HIBERN8 | `cat /sys/devices/platform/soc@0/1d84000.ufs/power_info/link_state` |
| 读取 UFS 速率信息，例如速率 A 或 B | `cat /sys/devices/platform/soc@0/1d84000.ufs/power_info/rate` |
| 读取 UFS 设备描述符信息 | `ls /sys/devices/platform/soc@0/1d84000.ufs/device_descriptor` |
| 读取 UFS 健康描述符信息 | `ls /sys/devices/platform/soc@0/1d84000.ufs/health_descriptor` |
| 读取 UFS runtime 状态信息，active 或 suspend | `cat /sys/devices/platform/soc@0/1d84000.ufs/power/runtime_status` |
| 查找和/或修改 SPM/RPM 级别 | `cat /sys/devices/platform/soc@0/1d84000.ufs/rpm_lvl`<br><br><br>`cat /sys/devices/platform/soc@0/1d84000.ufs/spm_lvl` |

SD 卡状态信息

| 所需的 SD 卡状态信息 | 命令 |
| --- | --- |
| 读取 SD 卡错误统计信息 | `cat /sys/kernel/debug/mmc1/err_stats` |
| 读取 SD 卡最新错误状态详情 | `cat /sys/kernel/debug/mmc1/err_state` |
| 检查当前运行时钟的详细信息 | `cat /sys/kernel/debug/mmc1/clock` |
| 读取 SD 卡 runtime 状态信息（active 或 suspend） | `cat /sys/devices/platform/soc@0/8804000.mmc/power/runtime_status` |
| 读取 SD 卡自动 suspend 延迟时间 | `cat /sys/devices/platform/soc@0/8804000.mmc/power/autosuspend_delay_ms` |
| 读取 SD 卡 runtime active 时间 | `cat /sys/devices/platform/soc@0/8804000.mmc/power/runtime_active_time` |
| 读取 SD 卡 runtime suspend 时间 | `cat /sys/devices/platform/soc@0/8804000.mmc/power/runtime_suspended_time` |
| 读取 SD 卡 uevent 详细信息 | `cat /sys/devices/platform/soc@0/8804000.mmc/uevent` |

## 调试 NVMe 问题

| 所需的 NVME 卡状态信息。 | 命令 |
| --- | --- |
| 查看设备型号名称 | `cat /sys/class/nvme/nvme0/model` |
| 查看设备序列号 | `cat /sys/class/nvme/nvme0/serial` |
| 查看当前固件版本 | `cat /sys/class/nvme/nvme0/firmware_rev` |
| 查看命名空间标识符 | `cat /sys/class/nvme/nvme0/nvme0n1/nsid` |
| 查看命名空间大小 | `cat /sys/class/nvme/nvme0/nvme0n1/size` |
| 查看以字节为单位的偏移量，以将 NVMe 命名空间的开头与最佳 I/O 边界对齐 | `cat /sys/class/nvme/nvme0/nvme0n1/alignment_offset` |
| 查看队列深度 | `cat /sys/class/nvme/nvme0/queue_count` |

Last Published: Jan 23, 2025

[Previous Topic
定制](https://docs.qualcomm.com/bundle/publicresource/80-70017-6SC/topics/customize.md) [Next Topic
参考资料](https://docs.qualcomm.com/bundle/publicresource/80-70017-6SC/topics/references.md)