.. SPDX-License-Identifier: GPL-2.0+
.. Copyright (c) 2017, Pantelis Antoniou <pantelis.antoniou@konsulko.com>

Device Tree Overlays
====================

Overlay Syntax
--------------

Device-tree overlays require a slightly different syntax compared to traditional
device-trees. Please refer to dt-object-internal.txt in the device-tree compiler
sources for information regarding the internal format of overlays:
https://git.kernel.org/pub/scm/utils/dtc/dtc.git/tree/Documentation/dt-object-internal.txt

Building Overlays
-----------------

In a nutshell overlays provides a means to manipulate a symbol a previous
device-tree or device-tree overlay has defined. It requires both the base
device-tree and all the overlays to be compiled with the *-@* command line
switch of the device-tree compiler so that symbol information is included.

Note
    Support for *-@* option can only be found in dtc version 1.4.4 or newer.
    Only version 4.14 or higher of the Linux kernel includes a built in version
    of dtc that meets this requirement.

Building a binary device-tree overlay follows the same process as building a
traditional binary device-tree. For example:

**base.dts**

::

	/dts-v1/;
	/ {
		foo: foonode {
			foo-property;
		};
	};

.. code-block:: console

	$ dtc -@ -I dts -O dtb -o base.dtb base.dts

**overlay.dts**

::

	/dts-v1/;
	/plugin/;
	/ {
		fragment@1 {
			target = <&foo>;
			__overlay__ {
				overlay-1-property;
				bar: barnode {
					bar-property;
				};
			};
		};
	};

.. code-block:: console

	$ dtc -@ -I dts -O dtb -o overlay.dtbo overlay.dts

Ways to Utilize Overlays in U-Boot
----------------------------------

There are two ways to apply overlays in U-Boot.

* Include and define overlays within a FIT image and have overlays
  automatically applied.

* Manually load and apply overlays

The remainder of this document will discuss using overlays via the manual
approach. For information on using overlays as part of a FIT image please see:
doc/uImage.FIT/overlay-fdt-boot.txt

Manually Loading and Applying Overlays
--------------------------------------

1. Figure out where to place both the base device tree blob and the
   overlay. Make sure you have enough space to grow the base tree without
   overlapping anything.

::

    => setenv fdtaddr 0x87f00000
    => setenv fdtovaddr 0x87fc0000

2. Load the base binary device-tree and the binary device-tree overlay.

::

    => load ${devtype} ${bootpart} ${fdtaddr} ${bootdir}/base.dtb
    => load ${devtype} ${bootpart} ${fdtovaddr} ${bootdir}/overlay.dtbo

3. Set the base binary device-tree as the working fdt tree.

::

    => fdt addr $fdtaddr

4. Grow it enough so it can encompass all applied overlays

::

    => fdt resize 8192

5. You are now ready to apply the overlay.

::

    => fdt apply $fdtovaddr

6. Boot system like you would do with a traditional dtb.

For bootm:

::

    => bootm ${kerneladdr} - ${fdtaddr}

For bootz:

::

    => bootz ${kerneladdr} - ${fdtaddr}

Please note that in case of an error, both the base and overlays are going
to be invalidated, so keep copies to avoid reloading.