DTC编译#address-cells=<2>场景下simple-bus_reg地址格式告警如何解决
以下是Linux内核中arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi的部分代码,该文件会被arch/arm64/boot/dts/arm/fvp-base-revc.dts引用:
/ { smb@8000000 { motherboard { arm,v2m-memory-map = "rs1"; compatible = "arm,vexpress,v2m-p1", "simple-bus"; #address-cells = <2>; /* SMB chipselect number and offset */ #size-cells = <1>; #interrupt-cells = <1>; ranges; flash@0,00000000 { compatible = "arm,vexpress-flash", "cfi-flash"; reg = <0 0x00000000 0x04000000>, <4 0x00000000 0x04000000>; bank-width = <4>; }; ethernet@2,02000000 { compatible = "smsc,lan91c111"; reg = <2 0x02000000 0x10000>; interrupts = <15>; };
完成预处理后,编译fvp-base-revc.dts文件时收到如下报错,所用DTC版本为1.5.0:
arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi:20.21-25.6: Warning (simple_bus_reg): /smb@8000000/motherboard/flash@0,00000000: simple-bus unit address format error, expected "0"
arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi:27.24-31.6: Warning (simple_bus_reg): /smb@8000000/motherboard/ethernet@2,02000000: simple-bus unit address format error, expected "202000000"
DTC针对flash@0,00000000、ethernet@2,02000000的地址格式提出告警,但该父节点已配置#address-cells = <2>,节点地址本应按照片选号+片选内偏移的格式编写,请问如何消除该错误?
这个告警属于DTC校验规则的误报,你当前的设备树写法完全符合VExpress平台的规范:父节点#address-cells = <2>的设计就是用第一个cell表示片选号、第二个cell表示片选内偏移,单元地址用逗号分隔两个值的写法是正确的。
告警触发的原因是DTC的simple_bus_reg校验规则默认假设所有兼容simple-bus的总线都使用单地址cell,没有覆盖#address-cells > 1的特殊场景。
你可以选择以下任意一种方案消除告警:
- 编译时添加DTC参数屏蔽该类告警:执行编译命令时附加
DTC_FLAGS=-Wno-simple_bus_reg即可,该方法不会改动设备树逻辑,是最常用的处理方式 - 升级DTC到1.6.0及以上版本,该版本之后DTC已经修复了多地址cell场景下simple-bus的校验逻辑,不会再误报该问题
- 若你确认平台总线驱动不需要依赖
simple-bus匹配枚举子节点,也可以删除父节点compatible属性中的"simple-bus"字符串,DTC就不会再触发simple_bus_reg相关校验
注意:删除simple-bus前请确认对应平台的总线驱动可以正常枚举子节点,避免设备无法识别的问题
内容的提问来源于stack exchange,提问作者Chan Kim

