调试、故障排查与安全边界
1. 先识别驱动类型
排障前先确定:
- platform容器;
- 自定义bus type;
- 外部地址窗口;
- 错误监控器;
- MHI/FSL-MC动态对象;
- 目标平台是否实际匹配。
错误分类不清容易把child probe失败误判为物理bus fault。
2. 基础信息
1 | cat /proc/config.gz |
检查device:
1 | readlink /sys/bus/platform/devices/<dev>/driver |
3. DT
1 | dtc -I fs -O dts /sys/firmware/devicetree/base |
重点核对:
- compatible顺序;
status;- reg/ranges;
- clocks/resets/power-domains;
- child unit address;
- interrupt;
- IOMMU/MSI;
- timing和bus-width。
运行DTB比源码DTS更有证据力。
4. Child未出现
按顺序检查:
- parent platform device是否创建;
- parent driver是否probe;
- 是否返回defer/error;
- parent是否调用populate;
- child compatible是否正确;
- address translation是否成功;
- child依赖是否就绪。
5. 总线错误
遇到timeout/abort:
- 保存首条完整日志;
- 查fault address对应DT reg/ranges;
- 查initiator/master;
- 确认target power/clock/reset;
- 检查访问宽度和alignment;
- 检查secure/non-secure权限;
- 避免反复读故障地址制造中断风暴。
不要直接增大timeout掩盖断电或错误地址。
6. MHI
1 | lspci -nnk |
排障层次:
- PCIe枚举和BAR/MSI;
- controller注册;
- firmware/BHI;
- execution environment;
- M0/mission mode;
- channel devices;
- client driver;
- SYS_ERR/RDDM。
直接重载client driver不能修复controller未进入mission mode。
7. PM
1 | cat /sys/bus/platform/devices/<parent>/power/runtime_status |
若关闭autosuspend后故障消失,继续定位缺失PM引用、clock恢复、register context或parent-child依赖,不应永久用power/control=on掩盖。
8. Dynamic Debug和Trace
1 | echo 'file drivers/bus/* +p' > /sys/kernel/debug/dynamic_debug/control |
只在受控环境开启,MHI debugfs可能允许修改controller状态或暴露ring信息。
9. 安全边界
高风险面:
- 外部bus window映射;
- 用户态MC portal;
- MHI firmware和DMA;
- debugfs register写;
- sysfs timing/priority;
- 错误handler泄露物理地址;
- 恶意PCIe endpoint;
- 固件动态报告大量对象/channel。
加固:
- 关闭未用bus选项;
- 限制debugfs;
- 固件签名与版本控制;
- IOMMU隔离DMA;
- 最小化MC UAPI权限;
- 验证所有长度、ID和ring指针;
- error storm限速;
- 禁止用户态直接
/dev/mem改总线寄存器。
10. 性能
性能问题先区分:
- 互连/DDR带宽;
- 外部总线timing;
- MHI ring/IRQ;
- PCIe链路;
- CPU调度;
- runtime PM唤醒。
本目录不存在统一“bus frequency”参数,也没有可对所有驱动通用的调优sysfs。
11. 修改验证
修改bus driver至少测试:
- cold boot/warm reboot;
- probe defer;
- child bind/unbind;
- runtime/system suspend;
- I/O压力;
- error IRQ;
- controller reset;
- hot remove;
- DMA/IOMMU fault;
- module unload(若允许)。
基础总线错误可能影响存储、console或电源管理,必须保留可恢复启动路径。
正在加载留言…