何时解析 devicetree 以填充 arm64 架构上的设备列表?

何时解析 devicetree 以填充 arm64 架构上的设备列表?

这个问题来自我试图了解内置驱动platform device程序如何在启动时初始化的尝试。

我正在 SoC(ARM + FPGA)上使用嵌入式 Linux 发行版(Yocto)。设备驱动程序是为a编写的platform device,IP可以在设备树中找到,描述为平台设备。 “兼容”属性与 C 驱动程序相匹配,到目前为止一切都很好。

引用平台设备的内核文档[1],

通常假设任何具有“兼容”属性的节点代表某种设备,其次,可以假设树根处的任何节点要么直接连接到处理器总线,要么是一个杂项系统无法以任何其他方式描述的设备。对于每个节点,Linux 分配并注册一个 platform_device,而该 platform_device 又可能绑定到一个 platform_driver。

但是也

2.4 设备数量

当主板被识别出来,并且解析出早期的配置数据后,内核初始化就可以正常进行了。 [...] 这也是调用特定于机器的设置挂钩的时间,例如 ARM 上的 machine_desc .init_early()、.init_irq() 和 .init_machine() 挂钩。

[...]

DT 上下文中最有趣的钩子是 .init_machine(),它主要负责使用有关平台的数据填充 Linux 设备模型

最终(遵循 Tegra 板的文档示例)

在 .init_machine() 时,Tegra 板支持代码将需要查看此 DT 并决定为哪些节点创建 platform_devices

果然,调查arch/arm[2] 我可以找到init_machine“查看”设备树的函数。然而,对于arm64架构来说,这个功能不存在。结构machine_desc仅适用于臂弓

浏览源代码,我能够在设备树上找到一些操作,这些操作都不容易理解,发生在 setup_machine_fdt [4] 这叫early_dt_scan但他们似乎没有填充设备

    /* Retrieve various information from the /chosen node */
    rc = of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);

    /* Initialize {size,address}-cells info */
    of_scan_flat_dt(early_init_dt_scan_root, NULL);

    /* Setup memory, calling early_init_dt_add_memory_arch */
    of_scan_flat_dt(early_init_dt_scan_memory, NULL);

这里的问题是,如果我继续遵循引导过程,我会do_basic_setup依次调用driver initbus_initplatform_bus_init最终of_core_init

我对最后一个抱有一些希望,它创建了一个名为“devicetree”的 kset。但是我不明白这棵树是否真的在这里被解析。

之后,它们initcalls被调用,这意味着将发生驱动程序初始化,但是这里涉及到DT解析呢? “兼容”属性实际在哪里使用?再次来自文档:

诀窍在于,内核从树的根部开始,寻找具有“兼容”属性的节点。首先,通常假设任何具有“兼容”属性的节点代表某种设备,其次,可以假设树根处的任何节点要么直接连接到处理器总线,要么是一个无法以任何其他方式描述的杂项系统设备。对于每个节点,Linux 分配并注册一个 platform_device,它又可能绑定到一个 platform_drive。

“绑定到平台驱动器”部分是由驱动程序代码定义的initcall完成的,我不明白的是“分配和注册平台设备”。

[1]Linux 和设备树

[2]初始化机器臂

[3]在 bootlin 上搜索 machine_desc

[4]setup_machine_fdt arm64

相关内容