关于兼容值的另一个注释。必须记录兼容属性中使用的任何字符串,以表明其所指示的内容。在Documentation/devicetree/bindings中添加兼容字符串的文档。
同样在ARM上,对于每个machine_desc,内核会查看是否有任何dt_compat列表条目出现在compatible属性中。如果有,那么machine_desc是驱动machine的候选者。在搜索整个machine_descs表之后,setup_machine_fdt()函数根据每个machine_desc匹配的兼容属性中的哪个条目返回"最兼容"的machine_desc。如果找不到匹配的machine_desc,则返回NULL。
这种方案背后的原因是,在大多数情况下,如果单个machine_desc都使用相同的SoC或相同的SoC系列,则它们可以支持大量的board。但是,总会有一些例外情况,特定的电路板需要特殊的设置代码,这在通用情况下是无用的。可以通过在通用设置代码中明确检查麻烦的板来处理特殊情况,但如果它不仅仅是几个案例,那么很快就会变得难看和/或不可维护。
相反,兼容列表允许通用machine_desc通过在dt_compat列表中指定“不太兼容”的值来为广泛的通用板集提供支持。在上面的示例中,通用板支持可声称与"ti,omap3"或"ti,omap3450"兼容。如果在原始beagleboard上发现了一个在早期启动时需要特殊解决方法代码的错误,那么可以添加一个新的machine_desc来实现变通方法并且只匹配"ti,omap3-beagleboard"。
PowerPC使用稍微不同的方案,它从每个machine_desc调用.probe()函数,并使用返回TRUE的第一个。但是,这种方法没有考虑兼容列表的优先级,并且可能应该避免新的体系结构支持。