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