Linux 设备树:了解对已删除节点的引用如何工作?

Linux Device Tree: Understanding how a reference to a deleted node works?

上下文

我查看了用于工作的基于 i.MX6 的开发板的设备树。我注意到在以太网配置的情况下,存在令人困惑的指令组合。即:

  1. 节点 fec1 包含 删除 节点 mdio
  2. 的指令
  3. 节点 fec2 包含对节点 ethphy1
  4. 的引用
  5. 节点ethphy1mdio内,被删除的节点。

片段

&fec1 {
        pinctrl-0 = <&pinctrl_enet1>, <&pinctrl_enet1_gpio>;
        /delete-node/ mdio;
};

&fec2 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_enet2>, <&pinctrl_enet2_gpio>, <&pinctrl_enet2_mdio>;
        phy-mode = "rmii";

        /* Reference */
        phy-handle = <&ethphy1>;
        phy-reset-gpios=<&gpio5 5 GPIO_ACTIVE_LOW>;
        phy-reset-duration=<100>;
        status = "okay";

        /* Deleted node */
        mdio {
                #address-cells = <1>;
                #size-cells = <0>;

                /* Referenced node */
                ethphy1: ethernet-phy@3 {
                        compatible = "ethernet-phy-ieee802.3-c22";
                        micrel,rmii-reference-clock-select-25-mhz;
                        micrel,led-mode = <0>;
                        clocks = <&rmii_ref_clk>;
                        clock-names = "rmii-ref";
                        reg = <3>;
                };
        };
};

问题

删除引用子节点的节点最终效果如何?参考是否损坏。是否只删除了父节点?

TL;DR 版本

/delete-node/ mdio; 指令正在删除在 imx6ul-imx6ull-var-som.dtsi or imx6ul-imx6ull-var-dart.dtsi 中添加的 mdio 节点。

完整版

OP 指向 imx6ul-imx6ull-var-som-concerto-board.dtsi 作为片段的来源。包括以下内容:

根据它们的 imx6ulimx6ullimx6ulz 前缀,其中至少包含以下内容之一:

ims6ul:

imx6ull:

imx6ulz:

根据它们的 imx6ulimx6ullimx6ulz 前缀,它们都包含以下内容之一:

imx6ul:

imx6ull:

imx6ulz:

imx6ul-imx6ull-var-som.dtsi and imx6ul-imx6ull-var-dart.dtsi 均包含此部分:

&fec1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_enet1>, <&pinctrl_enet1_gpio>, <&pinctrl_enet1_mdio>;
    phy-mode = "rmii";
    phy-reset-gpios=<&gpio5 0 GPIO_ACTIVE_LOW>;
    phy-reset-duration=<100>;
    phy-handle = <&ethphy0>;
    status = "okay";

    mdio {
        #address-cells = <1>;
        #size-cells = <0>;

        ethphy0: ethernet-phy@1 {
            compatible = "ethernet-phy-ieee802.3-c22";
            micrel,rmii-reference-clock-select-25-mhz;
            micrel,led-mode = <1>;
            clocks = <&rmii_ref_clk>;
            clock-names = "rmii-ref";
            reg = <1>;
        };
    };
};

修改&fec1引用的节点(在imx6ul.dtsi中定义)并添加一个名为mdio的子节点。但是OP引用的imx6ul-imx6ull-var-som-concerto-board.dtsi包含这一部分:

&fec1 {
    pinctrl-0 = <&pinctrl_enet1>, <&pinctrl_enet1_gpio>;
    /delete-node/ mdio;
};

这也修改了引用的节点 &fec1/delete-node/ mdio; 指令删除之前添加的 mdio 子节点。

/delete-node/ 在设备树编译器中的作用

使用 /delete-node/ 删除节点会删除节点、附加到节点的任何标签、节点中包含的任何属性,以及递归地删除节点中包含的任何节点。如果 /delete-node/ 删除的节点不存在,则该指令将被静默忽略。

如果删除节点,设备树源中其他地方对节点的任何引用(或对附加到节点的任何标签的引用)将不再有效,因此设备树编译器将生成一个编译源代码时出现错误 “引用了不存在的节点或标签”

/delete-node/ 在设备树覆盖层中的影响

/delete-node/ 指令只影响正在编译的源代码。如果它在设备树覆盖的源中使用,则 /delete-node/ 指令将不会影响应用覆盖的实时设备树。编译后的 dtbo 输出中没有任何内容表明应用覆盖时应从活动树中删除节点。

/delete-property/呢?

/delete-property/ 指令与 /delete-node/ 类似,不同之处在于它用于删除 属性 和任何附加到 属性 的标签。