Re: ftdoverlay overwrites phandle

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



Hello,

[Cc += Maxime who seems to have done some overlay work in dtc]

On Wed, Jun 29, 2022 at 10:59:27PM +0200, Uwe Kleine-König wrote:
> I want to apply an overlay to a device tree that is compiled without -@
> because that's how dtbs are shipped by the Debian kernel package.
> I'm using dtc 1.6.1-1 as provided by Debian.
> 
> The machine dtb is bcm2836-rpi-2-b.dtb[1]. The source for the dtbo looks
> as follows:
> 
> 	uwe@taurus:~/tmp$ cat dht11-overlay.dts 
> 	/*
> 	 * Overlay for the DHT11/21/22 humidity/temperature sensor modules.
> 	 */
> 	/dts-v1/;
> 	/plugin/;
> 
> 	/ {
> 		compatible = "brcm,bcm2708";
> 
> 		fragment@0 {
> 			target-path = "/";
> 
> 			__overlay__ {
> 				dht11: dht11@0 {
> 					compatible = "dht11";
> 					pinctrl-names = "default";
> 					pinctrl-0 = <&dht11_pins>;
> 					gpios = <&gpio 4 0>;
> 					status = "okay";
> 				};
> 			};
> 		};
> 
> 		fragment@1 {
> 			target-path = "/soc/";
> 			__overlay__ {
> 				gpio: gpio@7e200000 {
> 					dht11_pins: dht11_pins {
> 						brcm,pins = <4>;
> 						brcm,function = <0>; // in
> 						brcm,pull = <0>; // off
> 					};
> 				};
> 			};
> 		};
> 
> 		__overrides__ {
> 			gpiopin = <&dht11_pins>,"brcm,pins:0",
> 				<&dht11>,"gpios:4";
> 		};
> 	};
> 
> which is more or less the overlay with the same name provided by the
> RaspberryPi Foundation[2].
> 
> I can compile and apply the overlay just fine (well there are warnings,
> but ...):
> 
> 	uwe@taurus:~/tmp$ dtc -I dts -O dtb dht11-overlay.dts > dht11-overlay.dtbo
> 	dht11-overlay.dts:14.19-20.6: Warning (unit_address_vs_reg): /fragment@0/__overlay__/dht11@0: node has a unit name, but no reg or ranges property
> 	dht11-overlay.dts:27.24-33.6: Warning (unit_address_vs_reg): /fragment@1/__overlay__/gpio@7e200000: node has a unit name, but no reg or ranges property
> 	dht11-overlay.dts:14.19-20.6: Warning (gpios_property): /fragment@0/__overlay__/dht11@0: Missing property '#gpio-cells' in node /fragment@1/__overlay__/gpio@7e200000 or bad phandle (referred from gpios[0])
> 	uwe@taurus:~/tmp$ fdtoverlay -i bcm2836-rpi-2-b.dtb -o bcm2836-rpi-2-b+dht11.dtb dht11-overlay.dtbo
> 
> However there is a problem: The original bcm2836-rpi-2-b.dtb has:
> 
> 	uwe@taurus:~/tmp$ fdtdump bcm2836-rpi-2-b.dtb 
> 	...
> 	        gpio@7e200000 {
> 	            ....
> 	            phandle = <0x00000006>;
> 	        ....
> 	        hdmi@7e902000 {
> 	            ...
> 	            hpd-gpios = <0x00000006 0x0000002e 0x00000001>;
> 	            ...
> 
> the patched dtb has:
> 
> 	...
> 	    dht11@0 {
> 	        phandle = <0x0000001d>;
> 	        status = "okay";
> 	        gpios = <0x0000001c 0x00000004 0x00000000>;
> 	        pinctrl-0 = <0x0000001b>;
> 	        pinctrl-names = "default";
> 	        compatible = "dht11";
> 	    };
> 	    ...
> 	        gpio@7e200000 {
> 	            phandle = <0x0000001c>;
> 	        ....
> 	        hdmi@7e902000 {
> 	            ...
> 	            hpd-gpios = <0x00000006 0x0000002e 0x00000001>;
> 	            ...
> 
> So the gpios property of the dht11 node points to the gpio node as
> expected, however the hpd-gpios property of the hdmi node is broken
> because the phandle of gpio@7e200000 changed.
> 
> I think it should be possible to not overwrite the phandle of
> gpio@7e200000 and just reuse the value 6.

I thought a bit more about that and with the given design of fdtoverlay
this is hard because there are two types of (local) references: One
where you just have to add $delta (which is the only case that is
currently supported) and the other where the already existing number
from the dtb is reused.

An alternative would be to use a new node (say) __base_symbols__ that is
used to lookup symbols in the base dtb. E.g.:

	/ {
	    compatible = "brcm,bcm2708";
	    fragment@0 {
		target-path = "/";
		__overlay__ {
		    dht11 {
			compatible = "dht11";
			pinctrl-names = "default";
			pinctrl-0 = <0x00000001>;
			gpios = <0xffffffff 0x00000004 0x00000000>;
			status = "okay";
			phandle = <0x00000002>;
		    };
		};
	    };
	    __fixups__ {
		gpio = "/fragment@0/__overlay__/dht11:gpios:0";
	    };
	    __base_symbols__ {
	        gpio = "/soc/gpio@7e200000";
	    };
	};

then if the dtb that is supposed to be patched doesn't have gpio in its
__symbols__ node, this is looked up using __base_symbols__ in the dtbo.

Does this sound sensible? The downside compared to the first possibility
is that we have to extend the overlay device tree format.

A workaround I just noticed is: I could create two overlays and apply
them im a row. The first adds a __symbols__ node to the dtb and the
second uses the newly created node to properly fixup the local
reference.

What do you think?

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Device Tree]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux