blob: b4919ad76934c4e574ccd28dc17429e061983cd1 [file] [log] [blame]
.. _device_tree:
###########
Device Tree
###########
OP-TEE core can use the device tree format to inject platform configuration
information during platform initialization and possibly some run time contexts.
Device Tree technology allows to describe platforms from ASCII source files
so-called DTS files. These can be used to generate a platform description binary
image, so-called DTB, embedded in the platform boot media for applying expected
configuration settings during the platform initializations.
This scheme relaxes design constraints on the OP-TEE core implementation as most
of the platform specific hardware can be tuned without modifying C source files
or adding configuration directives in the build environments.
Secure and Non-Secure Device Trees
**********************************
There can be several device trees embedded in the target system and some can be
shared across the boot stages.
- Boot loader stages may load a device tree structure in memory for all boot
stage to get platform configuration from. If such device tree data are to
be accessed by the non-secure world, they shall be located in non-secure
memory. Secure world may use its content during OP-TEE core
initialization.
- Boot loader stages may load a device tree structure in secure memory for
the benefit of the secure world only. Such device tree blob shall be
located in secure memory. Secure world could use its content but this
is currently not implemented in the latest OP-TEE release.
- OP-TEE core can also embedded a device tree structure to describe the
platform.
- Non-secure world can embed its own device tree structure(s) and/or
rely on a device tree structure loaded by the secure world during
its initialization which happen before non-secure world is booted.
Obviously the non-secure world will not be able to access a device tree image
located in a secure memory which non-secure world has no access to.
When OP-TEE core is built with ``CFG_DT=y``, non-secure and secure device trees
can be accessed by OP-TEE core to get some platform configuration information.
.. _generic_boot_and_dtbs:
Generic boot and DTBs
*********************
Generic boot sequence gets discovers main memory address ranges from
preferrably embedded DTB (section :ref:`embedded_dtb`), defaulting to
early boot external DTB (section :ref:`external_dtb`).
Generic boot uses early boot external DTB (section :ref:`external_dtb`)
to share platform configuration information with the non-secure world.
Plaform and drivers can call OP-TEE DT API (``core/include/kernel/dt.h``)
to access embedded and/or external DTBs.
.. _external_dtb:
Early boot external device tree
*******************************
The bootloader provides arguments to OP-TEE core when it boots it. Among
those, the physical memory base address of a non-secure device tree image
accessible to OP-TEE core, or a null address value in absence of such DTB.
Platform configuration may statically define such DTB location using the
build configuration directive ``CFG_DT_ADDR``.
When an external DTB is referred, OP-TEE core gets the console configuration
if the platform has registered a compatible driver by adding attribute
``__dt_driver`` to a defined ``const struct dt_driver`` instance.
When an external DTB is referred, OP-TEE core adds into this DTB the
description of some OP-TEE resources. These information can be used
by the non-secure world to properly communicate with OP-TEE. This scheme
assumes the image is located in non-secure memory.
Modifications made by OP-TEE core on the non-secure device tree image provided
by early boot and passed to non-secure world are the following:
- Add an OP-TEE node if none found with the related invocation parameters.
- Add a reserved memory node for the few memory areas that shall be reserved
to the secure world and non accessed by the non-secure world.
- Add a PSCI description node if none found.
Early boot DTB can be accessed by OP-TEE core only during its initialization,
before non-secure world boots as it is expected the DTB memory location has
likely been replaced with runtime contexts content.
Assuming there is no embedded DTB (section :ref:`embedded_dtb`) OP-TEE core
discovers the main memory address ranges from the non-secure DTB.
.. _external_dtb_overlay:
Early boot device tree overlay
******************************
There are two possibilities for OP-TEE core to provide a device tree
overlay to the non-secure world.
- Append OP-TEE nodes to an existing DTB overlay located in early boot DTB.
(``CFG_DT_ADDR`` or boot argument register ``R2``/``X2``).
- Generate a new DTB overlay image at location defined by ``CFG_DT_ADDR``.
In the later case, memory referred by configuration directive ``CFG_DT_ADDR``
shall not contain a valid DTB image when OP-TEE core is booted. A subsequent
non-secure boot stage should merge the OP-TEE DTB overlay image into
another DTB.
A typical bootflow for this would be Trusted Firmware-A -> OP-TEE -> U-Boot
with U-Boot in charge of merging OP-TEE DTB overlay located at ``CFG_DT_ADDR``
into a DTB U-Boot has loaded from elsewhere.
This functionality is enabled when ``CFG_EXTERNAL_DTB_OVERLAY=y``.
.. _embedded_dtb:
Embedded Secure Device Tree
***************************
When OP-TEE core is built with configuration directive ``CFG_EMBED_DTB=y``,
directive ``CFG_EMBED_DTB_SOURCE_FILE`` shall provide the relative path of the
DTS file inside directory ``core/arch/$(ARCH)/dts`` from which a DTB is
generated and embedded in a read-only section of OP-TEE core.
Refer to ``core/include/kernel/dt.h`` for API to access embedded DTB.
Section :ref:`generic_boot_and_dtbs` documents the generic boot sequence
against embedded DTB.