这份日志显示了一个Android设备从唤醒(Resume)到再次休眠(Suspend)的完整过程,其中出现了两个关键错误:
主要问题分析:
1.MSDC/eMMC通信失败(核心问题)
[149013.510436][C1000000] mtk-msdc 11230000.mmc: msdc_cmd_done: cmd=6 arg=0x30F0001; rsp 0x0; cmd_error=-110; host_error=0x2 [149013.510513][C1000000] mtk-msdc 11230000.mmc: msdc_cmd_done: cmd=6 arg=0x30F0001; rsp 0x0; cmd_error=-110; host_error=0x2- 错误代码:
-110=ETIMEDOUT(超时错误) - 命令6:MMC_SWITCH(切换eMMC工作模式)
- 具体表现:eMMC存储控制器在尝试切换模式时无响应,连续两次失败
2.设备访问权限违规(DEVAPC Violation)
[149013.511080][C1000000] [DEVAPC]: catch it from INFRAAXI_MI Master is: MCU_AP_M [149013.511096][C1000000] [DEVAPC]: Violation - master: MCU_AP_M access violation slave: MSDC0_S-1 [149013.511108][C1000000] [DEVAPC]: Reason: power/clock is not enabled- 违规源:MCU_AP_M(主处理器)尝试访问MSDC0(eMMC控制器)
- 根本原因:电源或时钟未开启状态下进行了非法访问
- 违规类型:WRITE Violation(写操作违规)
完整的事件链分析:
阶段1:正常唤醒(149012.91秒附近)
- 系统从休眠中恢复,由WLAN中断触发
- eMMC控制器正常初始化,进行HS400调校
- 各模块(WLAN、BT、CAMERA等)依次恢复
阶段2:RPMB操作期间(149013.48秒附近)
- Trustonic TEE(安全环境)进行RPMB(安全存储)操作
- 读取和写入RPMB分区数据
- 这些操作触发了对eMMC的访问
阶段3:系统再次休眠(149013.42秒)
- 系统准备进入s2idle(浅度休眠)
- 开始冻结用户进程和可冻结任务
- 各模块开始挂起流程
阶段4:错误发生(149013.51秒)
- eMMC超时:在休眠过程中,eMMC控制器无响应
- 访问违规:由于eMMC时钟/电源可能已关闭,但MCU仍尝试访问
- 系统状态:此时已开始关闭外设电源,但TEE的RPMB操作仍在进行
根本原因推断:
时序竞争:在系统休眠过程中,TEE的RPMB操作与eMMC控制器电源管理存在竞争条件
电源管理冲突:
- eMMC控制器正在被挂起(
msdc_runtime_suspend) - 但安全环境(TEE)仍在进行RPMB读写操作
- 导致访问时时钟/电源已部分关闭
- eMMC控制器正在被挂起(
可能的具体原因:
- RPMB操作未在eMMC挂起前完成
- eMMC控制器提前进入低功耗状态
- 电源管理策略冲突
影响评估:
- 严重性:中度
- 影响范围:可能影响RPMB数据完整性
- 系统稳定性:可能导致休眠失败或数据损坏
建议解决方向:
- 检查TEE驱动:确保RPMB操作在系统休眠前完成
- 调整挂起顺序:eMMC控制器应在所有安全操作完成后才挂起
- 增加同步机制:在eMMC挂起和RPMB操作间添加同步锁
- 调试电源管理:检查MSDC0的时钟和电源管理策略
这是一个典型的电源管理时序问题,需要协调TEE安全操作与eMMC控制器电源管理的先后顺序。
系统恢复(Resume)过程:
一开始,系统从挂起状态恢复,由IRQ 138(wlan0)触发。
各个模块(如MDP、SCP、VCP、WLAN、BT等)依次恢复。
eMMC(msdc)进行了重新初始化(包括时钟设置和调校)。
系统再次挂起(Suspend)过程:
在恢复后不久(约0.5秒后),系统再次进入挂起状态(s2idle)。
挂起过程开始,冻结用户空间进程和剩余可冻结任务。
在挂起过程中,Trustonic TEE(可信执行环境)进行了多次RPMB(Replay Protected Memory
Block)操作,包括读取和写入。错误发生:
在挂起过程中,出现了两个主要错误: a. eMMC命令超时(cmd_error=-110)。 b.
设备访问权限(DEVAPC)违规(Violation)。错误分析:
a. eMMC命令超时:
在时间戳149013.510436和149013.510513,eMMC控制器(msdc)在发送命令6(CMD6)时超时(cmd_error=-110),这通常表示设备无响应。
这可能是由于在挂起过程中,eMMC设备已经进入低功耗状态,或者时钟被关闭,导致无法响应命令。
b. 设备访问权限违规:
紧接着,在149013.510595开始,出现了设备访问权限违规(DEVAPC)的中断。
违规信息显示,master(MCU_AP_M)试图访问slave(MSDC0_S-1)时发生违规,原因是“power/clock is
not enabled”(电源/时钟未开启)。这进一步证实了在挂起过程中,eMMC的时钟或电源可能已经被关闭,但仍有访问尝试。
可能的根本原因:
在挂起过程中,系统可能正在关闭eMMC控制器的时钟或电源,而与此同时,TEE的RPMB操作仍在进行,导致eMMC设备无法响应命令,进而产生超时和访问违规。
日志中的其他相关事件:
在挂起过程中,TEE进行了多次RPMB操作,包括读取和写入。这些操作可能需要访问eMMC设备。
在eMMC命令超时之前,有msdc_runtime_suspend: success to release
vcore的日志,表明eMMC控制器正在被挂起(可能正在关闭电源或时钟)。结论:
这个错误是由于在系统挂起过程中,eMMC设备被挂起(电源/时钟关闭)的同时,TEE的RPMB操作仍在尝试访问eMMC,导致访问超时和违规。
建议的解决方向:
检查TEE的RPMB操作在系统挂起过程中的处理。确保在挂起过程中,所有对eMMC的访问都已完成,并且挂起eMMC控制器的操作应在这些访问之后进行。
检查系统挂起和恢复过程中eMMC控制器与TEE的同步问题,可能需要调整挂起顺序或增加同步机制。