1#
2# Device Tree Control
3#
4
5config SUPPORT_OF_CONTROL
6	bool
7
8config PYLIBFDT
9	bool
10
11config DTOC
12	bool
13	select PYLIBFDT
14
15config BINMAN
16	bool
17	select DTOC
18
19menu "Device Tree Control"
20	depends on SUPPORT_OF_CONTROL
21
22config OF_CONTROL
23	bool "Run-time configuration via Device Tree"
24	select OF_LIBFDT
25	select OF_REAL
26	help
27	  This feature provides for run-time configuration of U-Boot
28	  via a flattened device tree.
29
30config OF_REAL
31	bool
32	help
33	  Indicates that a real devicetree is available which can be accessed
34	  at runtime. This means that dev_read_...() functions can be used to
35	  read data from the devicetree for each device. This is true if
36	  OF_CONTROL is enabled in U-Boot proper.
37
38config OF_BOARD_FIXUP
39	bool "Board-specific manipulation of Device Tree"
40	help
41	  In certain circumstances it is necessary to be able to modify
42	  U-Boot's device tree (e.g. to delete device from it). This option
43	  make the Device Tree writeable and provides a board-specific
44	  "board_fix_fdt" callback (called during pre-relocation time), which
45	  enables the board initialization to modifiy the Device Tree. The
46	  modified copy is subsequently used by U-Boot after relocation.
47
48config SPL_OF_CONTROL
49	bool "Enable run-time configuration via Device Tree in SPL"
50	depends on SPL && OF_CONTROL
51	select SPL_OF_LIBFDT if !SPL_OF_PLATDATA
52	select SPL_OF_REAL if !SPL_OF_PLATDATA
53	help
54	  Some boards use device tree in U-Boot but only have 4KB of SRAM
55	  which is not enough to support device tree. Disable this option to
56	  allow such boards to be supported by U-Boot SPL.
57
58config TPL_OF_CONTROL
59	bool "Enable run-time configuration via Device Tree in TPL"
60	depends on TPL && OF_CONTROL
61	select TPL_OF_LIBFDT if !TPL_OF_PLATDATA
62	select TPL_OF_REAL if !TPL_OF_PLATDATA
63	help
64	  Some boards use device tree in U-Boot but only have 4KB of SRAM
65	  which is not enough to support device tree. Enable this option to
66	  allow such boards to be supported by U-Boot TPL.
67
68config VPL_OF_CONTROL
69	bool "Enable run-time configuration via Device Tree in VPL"
70	depends on VPL && OF_CONTROL
71	default y if SPL_OF_CONTROL
72	help
73	  Some boards use device tree in U-Boot but only have 4KB of SRAM
74	  which is not enough to support device tree. Enable this option to
75	  allow such boards to be supported by U-Boot VPL.
76
77config OF_LIVE
78	bool "Enable use of a live tree"
79	depends on DM && OF_CONTROL
80	help
81	  Normally U-Boot uses a flat device tree which saves space and
82	  avoids the need to unpack the tree before use. However a flat
83	  tree does not support modification from within U-Boot since it
84	  can invalidate driver-model device tree offsets. This option
85	  enables a live tree which is available after relocation,
86	  and can be adjusted as needed.
87
88config OF_UPSTREAM
89	bool "Enable use of devicetree imported from Linux kernel release"
90	help
91	  Traditionally, U-Boot platforms used to have their custom devicetree
92	  files or copy devicetree files from Linux kernel which are hard to
93	  maintain and can usually get out-of-sync from Linux kernel. This
94	  option enables platforms to migrate to devicetree-rebasing repo where
95	  a regular sync will be maintained every major Linux kernel release
96	  cycle. However, platforms can still have some custom u-boot specific
97	  bits maintained as part of *-u-boot.dtsi files.
98
99	  Note: This option should be set in Kconfig, for the SoC as a whole.
100	  However, newer boards whose devicetree source files haven't landed in
101	  the dts/upstream subtree, they can override this option to have the
102	  DT build from existing U-Boot tree location instead.
103
104config OF_UPSTREAM_BUILD_VENDOR
105	bool "Build all devicetree files for a particular vendor"
106	depends on OF_UPSTREAM
107	help
108	  Enable building all devicetree files for a particular vendor. This
109	  is useful for generic U-Boot configurations where many boards can
110	  be supported with a single binary.
111
112	  This is only available for platforms using upstream devicetree.
113
114config OF_UPSTREAM_VENDOR
115	string "Vendor to build all upstream devicetree files for"
116	depends on OF_UPSTREAM_BUILD_VENDOR
117	default "qcom" if ARCH_SNAPDRAGON
118	default "rockchip" if ARCH_ROCKCHIP
119	default "amlogic" if ARCH_MESON
120	default "allwinner" if ARCH_SUNXI
121	default "mediatek" if ARCH_MEDIATEK
122	default "marvell" if ARCH_MVEBU || ARCH_KIRKWOOD
123	default "xilinx" if ARCH_VERSAL || ARCH_ZYNQ
124	default "nvidia" if ARCH_TEGRA
125	help
126	  Select the vendor to build all devicetree files for.
127
128config OF_UPSTREAM_INCLUDE_LOCAL_FALLBACK_DTBOS
129	bool "Build local DTBOs as fallback for DTBOs missing upstream"
130	default n
131	depends on OF_UPSTREAM
132	help
133	  Enable building DTBOs from arch/$(ARCH)/dts as a fallback for
134	  DTBOs which are not part of Linux kernel upstream yet. This is
135	  a stopgap measure to expedite OF_UPSTREAM switch for platforms
136	  which already have main DT in Linux kernel upstream, but still
137	  have leftover DTBOs in U-Boot tree.
138
139	  Do not use this option, upstream your DTs and DTBOs instead.
140	  If the upstreaming is in progress, use with utmost caution.
141
142	  If unsure, say N.
143
144choice
145	prompt "Provider of DTB for DT control"
146	depends on OF_CONTROL
147
148config OF_SEPARATE
149	bool "Separate DTB for DT control"
150	help
151	  If this option is enabled, the device tree will be built and
152	  placed as a separate u-boot.dtb file alongside the U-Boot image.
153
154config OF_EMBED
155	bool "Embedded DTB for DT control"
156	help
157	  If this option is enabled, the device tree will be picked up and
158	  built into the U-Boot image. This is suitable for local debugging
159	  and development only and is not recommended for production devices.
160	  Boards in the mainline U-Boot tree should not use it.
161
162endchoice
163
164config OF_INITIAL_DTB_READONLY
165	bool "Initial DTB for DT control is read-only"
166	help
167	  If initial DTB for DT control is read-only (e.g. points to
168	  memory-mapped flash memory), then set this option.
169
170config OF_BOARD
171	bool "Provided by the board (e.g a previous loader) at runtime"
172	default y if SANDBOX || OF_HAS_PRIOR_STAGE
173	help
174	  If this option is enabled, the device tree is provided at runtime by
175	  a custom function called board_fdt_blob_setup(). The board must
176	  implement this function if it wishes to provide special behaviour.
177
178	  With this option, the device tree build by U-Boot may be overridden or
179	  ignored. See OF_HAS_PRIOR_STAGE.
180
181	  Note: Boards which use this to handle a device tree passed from an
182	  earlier stage should enable OF_HAS_PRIOR_STAGE.
183
184config OF_HAS_PRIOR_STAGE
185	bool
186	help
187	  Indicates that a prior stage of the firmware (before U-Boot proper)
188	  makes use of device tree and this board normally boots with that prior
189	  stage, that provides a devicetree to U-Boot.
190
191	  This means that the device tree built in U-Boot should not be packaged
192	  in the firmware image. Instead, the prior stage's device tree should
193	  be so packaged. At runtime, the prior stage reads this, does any
194	  necessary fix-ups, then passes it to U-Boot. See OF_BOARD.
195
196	  This option does not preclude using the U-Boot device tree, e.g. for
197	  development purposes, but it is not recommended, and likely will not
198	  even work, for production systems.
199
200	  Note: This option must be set in Kconfig and cannot be enabled or
201	  disabled in the board's defconfig file.
202
203config OF_OMIT_DTB
204	bool "Omit the device tree output when building"
205	default y if OF_HAS_PRIOR_STAGE && !BINMAN
206	help
207	  As a special case, avoid writing a device tree file u-boot.dtb when
208	  building. Also don't include that file in u-boot.bin
209
210	  This is used for boards which normally provide a devicetree via a
211	  runtime mechanism (such as OF_BOARD), to avoid confusion.
212
213config DEFAULT_DEVICE_TREE
214	string "Default Device Tree for DT control"
215	depends on OF_CONTROL
216	help
217	  This option specifies the default Device Tree used for DT control.
218	  It can be overridden from the command line:
219	  $ make DEVICE_TREE=<device-tree-name>
220
221config DEVICE_TREE_INCLUDES
222       string "Extra .dtsi files to include when building DT control"
223	depends on OF_CONTROL
224	help
225	  U-Boot's control .dtb is usually built from an in-tree .dts
226	  file, plus (if available) an in-tree U-Boot-specific .dtsi
227	  file. This option specifies a space-separated list of extra
228	  .dtsi files that will also be used.
229
230config OF_LIST
231	string "List of device tree files to include for DT control" if SPL_LOAD_FIT || MULTI_DTB_FIT
232	depends on OF_CONTROL
233	default DEFAULT_DEVICE_TREE
234	help
235	  This option specifies a list of device tree files to use for DT
236	  control. These will be packaged into a FIT. At run-time, U-Boot
237	  or SPL will select the correct DT to use by examining the
238	  hardware (e.g. reading a board ID value). This is a list of
239	  device tree files (without the directory or .dtb suffix)
240	  separated by <space>.
241
242config OF_OVERLAY_LIST
243	string "List of device tree overlays to include for DT control"
244	help
245	  This option specifies a list of device tree overlays to use for DT
246	  control. This option can then be used by a FIT generator to include
247	  the overlays in the FIT image or by binman when assembling an image
248	  that uses overlays during DT fixup.
249
250choice
251	prompt "OF LIST compression"
252	depends on MULTI_DTB_FIT
253	default MULTI_DTB_FIT_NO_COMPRESSION
254
255config MULTI_DTB_FIT_LZO
256	bool "LZO"
257	depends on SYS_MALLOC_F
258	select LZO
259	help
260	  Compress the FIT image containing the DTBs available for the SPL
261	  using LZO compression. (requires lzop on host).
262
263config MULTI_DTB_FIT_GZIP
264	bool "GZIP"
265	depends on SYS_MALLOC_F
266	select GZIP
267	help
268	  Compress the FIT image containing the DTBs available for the SPL
269	  using GZIP compression. (requires gzip on host)
270
271config MULTI_DTB_FIT_NO_COMPRESSION
272	bool "No compression"
273	help
274	  Do not compress the FIT image containing the DTBs available for the SPL.
275	  Use this options only if LZO is not available and the DTBs are very small.
276endchoice
277
278choice
279	prompt "Location of uncompressed DTBs"
280	depends on (MULTI_DTB_FIT_GZIP || MULTI_DTB_FIT_LZO)
281	default MULTI_DTB_FIT_DYN_ALLOC if SYS_MALLOC_F
282
283config MULTI_DTB_FIT_DYN_ALLOC
284	bool "Dynamically allocate the memory"
285	depends on SYS_MALLOC_F
286
287config MULTI_DTB_FIT_USER_DEFINED_AREA
288	bool "User-defined location"
289endchoice
290
291config MULTI_DTB_FIT_UNCOMPRESS_SZ
292	hex "Size of memory reserved to uncompress the DTBs"
293	default 0x8000
294	help
295	   This is the size of this area where the DTBs are uncompressed.
296	   If this area is dynamically allocated, make sure that
297	   SYS_MALLOC_F_LEN is big enough to contain it.
298
299config MULTI_DTB_FIT_USER_DEF_ADDR
300	hex "Address of memory where dtbs are uncompressed"
301	depends on MULTI_DTB_FIT_USER_DEFINED_AREA
302	help
303	   the FIT image containing the DTBs is uncompressed in an area defined
304	   at compilation time. This is the address of this area. It must be
305	   aligned on 2-byte boundary.
306
307config DTB_RESELECT
308	bool "Support swapping dtbs at a later point in boot"
309	depends on MULTI_DTB_FIT
310	help
311	  It is possible during initial boot you may need to use a generic
312	  dtb until you can fully determine the board your running on. This
313	  config allows boards to implement a function at a later point
314	  during boot to switch to the "correct" dtb.
315
316config MULTI_DTB_FIT
317	bool "Support embedding several DTBs in a FIT image for u-boot"
318	help
319	  This option provides hooks to allow U-Boot to parse an
320	  appended FIT image and enable board specific code to then select
321	  the correct DTB to be used. Use this if you need to support
322	  multiple DTBs but don't use the SPL.
323
324
325config SPL_MULTI_DTB_FIT
326	depends on SPL_LOAD_FIT && SPL_OF_REAL
327	bool "Support embedding several DTBs in a FIT image for the SPL"
328	help
329	  This option provides the SPL with the ability to select its own
330	  DTB at runtime from an appended FIT image containing several DTBs.
331	  This allows using the same SPL binary on multiple platforms.
332	  The primary purpose is to handle different versions of
333	  the same platform without tweaking the platform code if the
334	  differences can be expressed in the DTBs (common examples are: bus
335	  capabilities, pad configurations).
336
337config SPL_OF_LIST
338	string "List of device tree files to include for DT control in SPL" if SPL_MULTI_DTB_FIT
339	depends on SPL_OF_CONTROL
340	default OF_LIST
341	help
342	  This option specifies a list of device tree files to use for DT
343	  control in the SPL. These will be packaged into a FIT. At run-time,
344	  the SPL will select the correct DT to use by examining the
345	  hardware (e.g. reading a board ID value). This is a list of
346	  device tree files (without the directory or .dtb suffix)
347	  separated by <space>.
348
349choice
350	prompt "SPL OF LIST compression"
351	depends on SPL_MULTI_DTB_FIT
352	default SPL_MULTI_DTB_FIT_LZO
353
354config SPL_MULTI_DTB_FIT_LZO
355	bool "LZO"
356	depends on SYS_MALLOC_F
357	select SPL_LZO
358	help
359	  Compress the FIT image containing the DTBs available for the SPL
360	  using LZO compression. (requires lzop on host).
361
362config SPL_MULTI_DTB_FIT_GZIP
363	bool "GZIP"
364	depends on SYS_MALLOC_F
365	select SPL_GZIP
366	help
367	  Compress the FIT image containing the DTBs available for the SPL
368	  using GZIP compression. (requires gzip on host)
369
370config SPL_MULTI_DTB_FIT_NO_COMPRESSION
371	bool "No compression"
372	help
373	  Do not compress the FIT image containing the DTBs available for the SPL.
374	  Use this options only if LZO is not available and the DTBs are very small.
375endchoice
376
377choice
378	prompt "Location of uncompressed DTBs"
379	depends on (SPL_MULTI_DTB_FIT_GZIP || SPL_MULTI_DTB_FIT_LZO)
380	default SPL_MULTI_DTB_FIT_DYN_ALLOC if SYS_MALLOC_F
381
382config SPL_MULTI_DTB_FIT_DYN_ALLOC
383	bool "Dynamically allocate the memory"
384	depends on SYS_MALLOC_F
385
386config SPL_MULTI_DTB_FIT_USER_DEFINED_AREA
387	bool "User-defined location"
388endchoice
389
390config SPL_MULTI_DTB_FIT_UNCOMPRESS_SZ
391	hex "Size of memory reserved to uncompress the DTBs"
392	depends on (SPL_MULTI_DTB_FIT_GZIP || SPL_MULTI_DTB_FIT_LZO)
393	default 0x8000
394	help
395	   This is the size of this area where the DTBs are uncompressed.
396	   If this area is dynamically allocated, make sure that
397	   SPL_SYS_MALLOC_F_LEN is big enough to contain it.
398
399config SPL_MULTI_DTB_FIT_USER_DEF_ADDR
400	hex "Address of memory where dtbs are uncompressed"
401	depends on SPL_MULTI_DTB_FIT_USER_DEFINED_AREA
402	help
403	   the FIT image containing the DTBs is uncompressed in an area defined
404	   at compilation time. This is the address of this area. It must be
405	   aligned on 2-byte boundary.
406
407config OF_TAG_MIGRATE
408	bool "Ease migration from old device trees with u-boot,dm- tags"
409	default y
410	help
411	  U-Boot moved over to use new tags to mark device tree nodes which need
412	  to be processed in SPL, before relocation, etc. Enable this option to
413	  detect old tags and handle them.
414
415	  Note: This option will be removed after the 2023.07 release.
416
417config OF_SPL_REMOVE_PROPS
418	string "List of device tree properties to drop for SPL"
419	depends on SPL_OF_CONTROL
420	default "interrupt-parent interrupts" if SPL_PINCTRL && SPL_CLK
421	default "clocks clock-names interrupt-parent interrupts" if SPL_PINCTRL
422	default "pinctrl-0 pinctrl-names interrupt-parent interrupts" if SPL_CLK
423	default "pinctrl-0 pinctrl-names clocks clock-names interrupt-parent interrupts"
424	help
425	  Since SPL normally runs in a reduced memory space, the device tree
426	  is cut down to only what is needed to load and start U-Boot. Only
427	  nodes marked with the property "bootph-all" will be
428	  included. In addition, some properties are not used by U-Boot and
429	  can be discarded. This option defines the list of properties to
430	  discard.
431
432config OF_DTB_PROPS_REMOVE
433	bool "Enable removal of device tree properties"
434	depends on OF_CONTROL
435	help
436	  Some boards have restricted amount of storage for U-Boot image.
437	  If the generated binary doesn't fit into available image storage,
438	  the built-in device tree could probably be cut down by removing
439	  some not required device tree properties to reduce the image size.
440	  Enable this option and define the properties to be removed in the
441	  CONFIG_OF_REMOVE_PROPS list. Do not enable this option if you must
442	  pass the built-in DTB directly to the kernel!
443
444config OF_REMOVE_PROPS
445	string "List of device tree properties to drop"
446	depends on OF_DTB_PROPS_REMOVE
447	default "interrupt-parent interrupts" if PINCTRL
448	help
449	  Some properties are not used by U-Boot and can be discarded.
450	  This option defines the list of properties to discard.
451
452config SPL_OF_PLATDATA
453	bool "Generate platform data for use in SPL"
454	depends on SPL_OF_CONTROL
455	select DTOC
456	select SPL_OF_PLATDATA_DRIVER_RT if !SPL_OF_PLATDATA_INST
457	help
458	  For very constrained SPL environments the overhead of decoding
459	  device tree nodes and converting their contents into platform data
460	  is too large. This overhead includes libfdt code as well as the
461	  device tree contents itself. The latter is fairly compact, but the
462	  former can add 3KB or more to a Thumb 2 Image.
463
464	  This option enables generation of platform data from the device
465	  tree as C code. This code creates devices using U_BOOT_DRVINFO()
466	  declarations. The benefit is that it allows driver code to access
467	  the platform data directly in C structures, avoidin the libfdt
468	  overhead.
469
470	  This option works by generating C structure declarations for each
471	  compatible string, then adding platform data and U_BOOT_DRVINFO
472	  declarations for each node. See of-plat.txt for more information.
473
474config SPL_OF_REAL
475	bool "Support a real devicetree in SPL" if SANDBOX
476	depends on SPL_OF_CONTROL
477	select SPL_OF_LIBFDT
478	help
479	  Indicates that a real devicetree is available which can be accessed
480	  at runtime. This means that dev_read_...() functions can be used to
481	  read data from the devicetree for each device. You do not need to
482	  enable this option if you have enabled SPL_OF_PLATDATA.
483
484if SPL_OF_PLATDATA
485
486config SPL_OF_PLATDATA_PARENT
487	bool "Support parent information in devices"
488	default y
489	help
490	  Generally it is useful to be able to access the parent of a device
491	  with of-platdata. To save space this can be disabled, but in that
492	  case dev_get_parent() will always return NULL;
493
494config SPL_OF_PLATDATA_INST
495	bool "Declare devices at build time"
496	help
497	  Declare devices as udevice instances so that they do not need to be
498	  bound when U-Boot starts. This can save time and code space.
499
500config SPL_OF_PLATDATA_NO_BIND
501	bool "Don't allow run-time binding of devices"
502	depends on SPL_OF_PLATDATA_INST
503	default y
504	help
505	  This removes the ability to bind devices at run time, thus saving
506	  some code space in U-Boot. This can be disabled if binding is needed,
507	  at the code of some code size increase.
508
509config SPL_OF_PLATDATA_RT
510	bool "Use a separate struct for device runtime data"
511	depends on SPL_OF_PLATDATA_INST
512	default y
513	help
514	  For systems running SPL from read-only memory it is convenient to
515	  separate out the runtime information, so that the devices don't need
516	  to be copied before being used. This moves the read-write parts of
517	  struct udevice (at present just the flags) into a separate struct,
518	  which is allocated at runtime.
519
520config SPL_OF_PLATDATA_DRIVER_RT
521	bool
522	help
523	  Use a separate struct for driver runtime data.
524
525	  This enables the driver_rt information, used with of-platdata when
526	  of-platdata-inst is not used. It allows finding devices by their
527	  driver data.
528
529endif
530
531config TPL_OF_REAL
532	bool
533	help
534	  Indicates that a real devicetree is available which can be accessed
535	  at runtime. This means that dev_read_...() functions can be used to
536	  read data from the devicetree for each device. This is true if
537	  TPL_OF_CONTROL is enabled and not TPL_OF_PLATDATA
538
539config TPL_OF_PLATDATA
540	bool "Generate platform data for use in TPL"
541	depends on TPL_OF_CONTROL
542	select DTOC
543	select TPL_OF_PLATDATA_DRIVER_RT if !TPL_OF_PLATDATA_INST
544	help
545	  For very constrained SPL environments the overhead of decoding
546	  device tree nodes and converting their contents into platform data
547	  is too large. This overhead includes libfdt code as well as the
548	  device tree contents itself. The latter is fairly compact, but the
549	  former can add 3KB or more to a Thumb 2 Image.
550
551	  This option enables generation of platform data from the device
552	  tree as C code. This code creates devices using U_BOOT_DRVINFO()
553	  declarations. The benefit is that it allows driver code to access
554	  the platform data directly in C structures, avoidin the libfdt
555	  overhead.
556
557	  This option works by generating C structure declarations for each
558	  compatible string, then adding platform data and U_BOOT_DRVINFO
559	  declarations for each node. See of-plat.txt for more information.
560
561if TPL_OF_PLATDATA
562
563config TPL_OF_PLATDATA_PARENT
564	bool "Support parent information in devices"
565	default y
566	help
567	  Generally it is useful to be able to access the parent of a device
568	  with of-platdata. To save space this can be disabled, but in that
569	  case dev_get_parent() will always return NULL;
570
571config TPL_OF_PLATDATA_INST
572	bool "Declare devices at build time"
573
574	help
575	  Declare devices as udevice instances so that they do not need to be
576	  bound when U-Boot starts. This can save time and code space.
577
578config TPL_OF_PLATDATA_NO_BIND
579	bool "Don't allow run-time binding of devices"
580	depends on TPL_OF_PLATDATA_INST
581	default y
582	help
583	  This removes the ability to bind devices at run time, thus saving
584	  some code space in U-Boot. This can be disabled if binding is needed,
585	  at the code of some code size increase.
586
587config TPL_OF_PLATDATA_RT
588	bool "Use a separate struct for device runtime data"
589	depends on TPL_OF_PLATDATA_INST
590	default y
591	help
592	  For systems running TPL from read-only memory it is convenient to
593	  separate out the runtime information, so that the devices don't need
594	  to be copied before being used. This moves the read-write parts of
595	  struct udevice (at present just the flags) into a separate struct,
596	  which is allocated at runtime.
597
598config TPL_OF_PLATDATA_DRIVER_RT
599	bool
600	help
601	  Use a separate struct for driver runtime data.
602
603	  This enables the driver_rt information, used with of-platdata when
604	  of-platdata-inst is not used. It allows finding devices by their
605	  driver data.
606
607endif
608
609config VPL_OF_REAL
610	def_bool y
611	depends on VPL
612	help
613	  Indicates that a real devicetree is available which can be accessed
614	  at runtime. This means that dev_read_...() functions can be used to
615	  read data from the devicetree for each device. This is true if
616	  TPL_OF_CONTROL is enabled and not TPL_OF_PLATDATA
617
618endmenu
619