xref: /rk3399_rockchip-uboot/doc/uImage.FIT/overlay-fdt-boot.txt (revision 6a53d8fa9f52c61d08f4f19448d8a0287aaced91)
1*6a53d8faSFranklin S Cooper JrU-Boot FDT Overlay FIT usage
2*6a53d8faSFranklin S Cooper Jr============================
3a116ed49SPantelis Antoniou
4a116ed49SPantelis AntoniouIntroduction
5a116ed49SPantelis Antoniou------------
6a116ed49SPantelis AntoniouIn many cases it is desirable to have a single FIT image support a multitude
7a116ed49SPantelis Antoniouof similar boards and their expansion options. The same kernel on DT enabled
8a116ed49SPantelis Antoniouplatforms can support this easily enough by providing a DT blob upon boot
9a116ed49SPantelis Antoniouthat matches the desired configuration.
10a116ed49SPantelis Antoniou
11*6a53d8faSFranklin S Cooper JrThis document focuses on specifically using overlays as part of a FIT image.
12*6a53d8faSFranklin S Cooper JrGeneral information regarding overlays including its syntax and building it
13*6a53d8faSFranklin S Cooper Jrcan be found in doc/README.fdt-overlays
14*6a53d8faSFranklin S Cooper Jr
15a116ed49SPantelis AntoniouConfiguration without overlays
16a116ed49SPantelis Antoniou------------------------------
17a116ed49SPantelis Antoniou
18a116ed49SPantelis AntoniouTake a hypothetical board named 'foo' where there are different supported
19a116ed49SPantelis Antoniourevisions, reva and revb. Assume that both board revisions can use add a bar
20a116ed49SPantelis Antoniouadd-on board, while only the revb board can use a baz add-on board.
21a116ed49SPantelis Antoniou
22a116ed49SPantelis AntoniouWithout using overlays the configuration would be as follows for every case.
23a116ed49SPantelis Antoniou
24a116ed49SPantelis Antoniou	/dts-v1/;
25a116ed49SPantelis Antoniou	/ {
26a116ed49SPantelis Antoniou		images {
27a116ed49SPantelis Antoniou			kernel@1 {
28a116ed49SPantelis Antoniou				data = /incbin/("./zImage");
29a116ed49SPantelis Antoniou				type = "kernel";
30a116ed49SPantelis Antoniou				arch = "arm";
31a116ed49SPantelis Antoniou				os = "linux";
32a116ed49SPantelis Antoniou				load = <0x82000000>;
33a116ed49SPantelis Antoniou				entry = <0x82000000>;
34a116ed49SPantelis Antoniou			};
35a116ed49SPantelis Antoniou			fdt@1 {
36a116ed49SPantelis Antoniou				data = /incbin/("./foo-reva.dtb");
37a116ed49SPantelis Antoniou				type = "flat_dt";
38a116ed49SPantelis Antoniou				arch = "arm";
39a116ed49SPantelis Antoniou			};
40a116ed49SPantelis Antoniou			fdt@2 {
41a116ed49SPantelis Antoniou				data = /incbin/("./foo-revb.dtb");
42a116ed49SPantelis Antoniou				type = "flat_dt";
43a116ed49SPantelis Antoniou				arch = "arm";
44a116ed49SPantelis Antoniou			};
45a116ed49SPantelis Antoniou			fdt@3 {
46a116ed49SPantelis Antoniou				data = /incbin/("./foo-reva-bar.dtb");
47a116ed49SPantelis Antoniou				type = "flat_dt";
48a116ed49SPantelis Antoniou				arch = "arm";
49a116ed49SPantelis Antoniou			};
50a116ed49SPantelis Antoniou			fdt@4 {
51a116ed49SPantelis Antoniou				data = /incbin/("./foo-revb-bar.dtb");
52a116ed49SPantelis Antoniou				type = "flat_dt";
53a116ed49SPantelis Antoniou				arch = "arm";
54a116ed49SPantelis Antoniou			};
55a116ed49SPantelis Antoniou			fdt@5 {
56a116ed49SPantelis Antoniou				data = /incbin/("./foo-revb-baz.dtb");
57a116ed49SPantelis Antoniou				type = "flat_dt";
58a116ed49SPantelis Antoniou				arch = "arm";
59a116ed49SPantelis Antoniou			};
60a116ed49SPantelis Antoniou			fdt@6 {
61a116ed49SPantelis Antoniou				data = /incbin/("./foo-revb-bar-baz.dtb");
62a116ed49SPantelis Antoniou				type = "flat_dt";
63a116ed49SPantelis Antoniou				arch = "arm";
64a116ed49SPantelis Antoniou			};
65a116ed49SPantelis Antoniou		};
66a116ed49SPantelis Antoniou
67a116ed49SPantelis Antoniou		configurations {
68a116ed49SPantelis Antoniou			default = "foo-reva.dtb;
69a116ed49SPantelis Antoniou			foo-reva.dtb {
70a116ed49SPantelis Antoniou				kernel = "kernel@1";
71a116ed49SPantelis Antoniou				fdt = "fdt@1";
72a116ed49SPantelis Antoniou			};
73a116ed49SPantelis Antoniou			foo-revb.dtb {
74a116ed49SPantelis Antoniou				kernel = "kernel@1";
75a116ed49SPantelis Antoniou				fdt = "fdt@2";
76a116ed49SPantelis Antoniou			};
77a116ed49SPantelis Antoniou			foo-reva-bar.dtb {
78a116ed49SPantelis Antoniou				kernel = "kernel@1";
79a116ed49SPantelis Antoniou				fdt = "fdt@3";
80a116ed49SPantelis Antoniou			};
81a116ed49SPantelis Antoniou			foo-revb-bar.dtb {
82a116ed49SPantelis Antoniou				kernel = "kernel@1";
83a116ed49SPantelis Antoniou				fdt = "fdt@4";
84a116ed49SPantelis Antoniou			};
85a116ed49SPantelis Antoniou			foo-revb-baz.dtb {
86a116ed49SPantelis Antoniou				kernel = "kernel@1";
87a116ed49SPantelis Antoniou				fdt = "fdt@5";
88a116ed49SPantelis Antoniou			};
89a116ed49SPantelis Antoniou			foo-revb-bar-baz.dtb {
90a116ed49SPantelis Antoniou				kernel = "kernel@1";
91a116ed49SPantelis Antoniou				fdt = "fdt@6";
92a116ed49SPantelis Antoniou			};
93a116ed49SPantelis Antoniou		};
94a116ed49SPantelis Antoniou	};
95a116ed49SPantelis Antoniou
96a116ed49SPantelis AntoniouNote the blob needs to be compiled for each case and the combinatorial explosion of
97a116ed49SPantelis Antoniouconfigurations. A typical device tree blob is in the low hunderds of kbytes so a
98a116ed49SPantelis Antonioumultitude of configuration grows the image quite a bit.
99a116ed49SPantelis Antoniou
100a116ed49SPantelis AntoniouBooting this image is done by using
101a116ed49SPantelis Antoniou
102a116ed49SPantelis Antoniou	# bootm <addr>#<config>
103a116ed49SPantelis Antoniou
104a116ed49SPantelis AntoniouWhere config is one of:
105a116ed49SPantelis Antoniou	foo-reva.dtb, foo-revb.dtb, foo-reva-bar.dtb, foo-revb-bar.dtb,
106a116ed49SPantelis Antoniou	foo-revb-baz.dtb, foo-revb-bar-baz.dtb
107a116ed49SPantelis Antoniou
108a116ed49SPantelis AntoniouThis selects the DTB to use when booting.
109a116ed49SPantelis Antoniou
110a116ed49SPantelis AntoniouConfiguration using overlays
111a116ed49SPantelis Antoniou----------------------------
112a116ed49SPantelis Antoniou
113a116ed49SPantelis AntoniouDevice tree overlays can be applied to a base DT and result in the same blob
114a116ed49SPantelis Antonioubeing passed to the booting kernel. This saves on space and avoid the combinatorial
115a116ed49SPantelis Antoniouexplosion problem.
116a116ed49SPantelis Antoniou
117a116ed49SPantelis Antoniou	/dts-v1/;
118a116ed49SPantelis Antoniou	/ {
119a116ed49SPantelis Antoniou		images {
120a116ed49SPantelis Antoniou			kernel@1 {
121a116ed49SPantelis Antoniou				data = /incbin/("./zImage");
122a116ed49SPantelis Antoniou				type = "kernel";
123a116ed49SPantelis Antoniou				arch = "arm";
124a116ed49SPantelis Antoniou				os = "linux";
125a116ed49SPantelis Antoniou				load = <0x82000000>;
126a116ed49SPantelis Antoniou				entry = <0x82000000>;
127a116ed49SPantelis Antoniou			};
128a116ed49SPantelis Antoniou			fdt@1 {
129a116ed49SPantelis Antoniou				data = /incbin/("./foo.dtb");
130a116ed49SPantelis Antoniou				type = "flat_dt";
131a116ed49SPantelis Antoniou				arch = "arm";
132a116ed49SPantelis Antoniou				load = <0x87f00000>;
133a116ed49SPantelis Antoniou			};
134a116ed49SPantelis Antoniou			fdt@2 {
135a116ed49SPantelis Antoniou				data = /incbin/("./reva.dtbo");
136a116ed49SPantelis Antoniou				type = "flat_dt";
137a116ed49SPantelis Antoniou				arch = "arm";
138a116ed49SPantelis Antoniou				load = <0x87fc0000>;
139a116ed49SPantelis Antoniou			};
140a116ed49SPantelis Antoniou			fdt@3 {
141a116ed49SPantelis Antoniou				data = /incbin/("./revb.dtbo");
142a116ed49SPantelis Antoniou				type = "flat_dt";
143a116ed49SPantelis Antoniou				arch = "arm";
144a116ed49SPantelis Antoniou				load = <0x87fc0000>;
145a116ed49SPantelis Antoniou			};
146a116ed49SPantelis Antoniou			fdt@4 {
147a116ed49SPantelis Antoniou				data = /incbin/("./bar.dtbo");
148a116ed49SPantelis Antoniou				type = "flat_dt";
149a116ed49SPantelis Antoniou				arch = "arm";
150a116ed49SPantelis Antoniou				load = <0x87fc0000>;
151a116ed49SPantelis Antoniou			};
152a116ed49SPantelis Antoniou			fdt@5 {
153a116ed49SPantelis Antoniou				data = /incbin/("./baz.dtbo");
154a116ed49SPantelis Antoniou				type = "flat_dt";
155a116ed49SPantelis Antoniou				arch = "arm";
156a116ed49SPantelis Antoniou				load = <0x87fc0000>;
157a116ed49SPantelis Antoniou			};
158a116ed49SPantelis Antoniou		};
159a116ed49SPantelis Antoniou
160a116ed49SPantelis Antoniou		configurations {
161a116ed49SPantelis Antoniou			default = "foo-reva.dtb;
162a116ed49SPantelis Antoniou			foo-reva.dtb {
163a116ed49SPantelis Antoniou				kernel = "kernel@1";
164a116ed49SPantelis Antoniou				fdt = "fdt@1", "fdt@2";
165a116ed49SPantelis Antoniou			};
166a116ed49SPantelis Antoniou			foo-revb.dtb {
167a116ed49SPantelis Antoniou				kernel = "kernel@1";
168a116ed49SPantelis Antoniou				fdt = "fdt@1", "fdt@3";
169a116ed49SPantelis Antoniou			};
170a116ed49SPantelis Antoniou			foo-reva-bar.dtb {
171a116ed49SPantelis Antoniou				kernel = "kernel@1";
172a116ed49SPantelis Antoniou				fdt = "fdt@1", "fdt@2", "fdt@4";
173a116ed49SPantelis Antoniou			};
174a116ed49SPantelis Antoniou			foo-revb-bar.dtb {
175a116ed49SPantelis Antoniou				kernel = "kernel@1";
176a116ed49SPantelis Antoniou				fdt = "fdt@1", "fdt@3", "fdt@4";
177a116ed49SPantelis Antoniou			};
178a116ed49SPantelis Antoniou			foo-revb-baz.dtb {
179a116ed49SPantelis Antoniou				kernel = "kernel@1";
180a116ed49SPantelis Antoniou				fdt = "fdt@1", "fdt@3", "fdt@5";
181a116ed49SPantelis Antoniou			};
182a116ed49SPantelis Antoniou			foo-revb-bar-baz.dtb {
183a116ed49SPantelis Antoniou				kernel = "kernel@1";
184a116ed49SPantelis Antoniou				fdt = "fdt@1", "fdt@3", "fdt@4", "fdt@5";
185a116ed49SPantelis Antoniou			};
186a116ed49SPantelis Antoniou			bar {
187a116ed49SPantelis Antoniou				fdt = "fdt@4";
188a116ed49SPantelis Antoniou			};
189a116ed49SPantelis Antoniou			baz {
190a116ed49SPantelis Antoniou				fdt = "fdt@5";
191a116ed49SPantelis Antoniou			};
192a116ed49SPantelis Antoniou		};
193a116ed49SPantelis Antoniou	};
194a116ed49SPantelis Antoniou
195a116ed49SPantelis AntoniouBooting this image is exactly the same as the non-overlay example.
196a116ed49SPantelis Antoniouu-boot will retrieve the base blob and apply the overlays in sequence as
197a116ed49SPantelis Antoniouthey are declared in the configuration.
198a116ed49SPantelis Antoniou
199a116ed49SPantelis AntoniouNote the minimum amount of different DT blobs, as well as the requirement for
200a116ed49SPantelis Antoniouthe DT blobs to have a load address; the overlay application requires the blobs
201a116ed49SPantelis Antoniouto be writeable.
202a116ed49SPantelis Antoniou
203a116ed49SPantelis AntoniouConfiguration using overlays and feature selection
204a116ed49SPantelis Antoniou--------------------------------------------------
205a116ed49SPantelis Antoniou
206a116ed49SPantelis AntoniouAlthough the configuration in the previous section works is a bit inflexible
207a116ed49SPantelis Antoniousince it requires all possible configuration options to be laid out before
208a116ed49SPantelis Antoniouhand in the FIT image. For the add-on boards the extra config selection method
209a116ed49SPantelis Antonioumight make sense.
210a116ed49SPantelis Antoniou
211a116ed49SPantelis AntoniouNote the two bar & baz configuration nodes. To boot a reva board with
212a116ed49SPantelis Antoniouthe bar add-on board enabled simply use:
213a116ed49SPantelis Antoniou
214a116ed49SPantelis Antoniou	# bootm <addr>#foo-reva.dtb#bar
215a116ed49SPantelis Antoniou
216a116ed49SPantelis AntoniouWhile booting a revb with bar and baz is as follows:
217a116ed49SPantelis Antoniou
218a116ed49SPantelis Antoniou	# bootm <addr>#foo-revb.dtb#bar#baz
219a116ed49SPantelis Antoniou
220a116ed49SPantelis AntoniouThe limitation for a feature selection configuration node is that a single
221a116ed49SPantelis Antonioufdt option is currently supported.
222a116ed49SPantelis Antoniou
223a116ed49SPantelis AntoniouPantelis Antoniou
224a116ed49SPantelis Antonioupantelis.antoniou@konsulko.com
225a116ed49SPantelis Antoniou12/6/2017
226