何時解析 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

相關內容