summaryrefslogtreecommitdiff
path: root/Documentation/dt-object-internal.txt
diff options
context:
space:
mode:
Diffstat (limited to 'Documentation/dt-object-internal.txt')
-rw-r--r--Documentation/dt-object-internal.txt310
1 files changed, 0 insertions, 310 deletions
diff --git a/Documentation/dt-object-internal.txt b/Documentation/dt-object-internal.txt
deleted file mode 100644
index 51d68ab93ac9..000000000000
--- a/Documentation/dt-object-internal.txt
+++ /dev/null
@@ -1,310 +0,0 @@
-Device Tree Dynamic Object format internals
--------------------------------------------
-
-The Device Tree for most platforms is a static representation of
-the hardware capabilities. This is insufficient for platforms
-that need to dynamically insert Device Tree fragments into the
-live tree.
-
-This document explains the the Device Tree object format and
-modifications made to the Device Tree compiler, which make it possible.
-
-1. Simplified Problem Definition
---------------------------------
-
-Assume we have a platform which boots using following simplified Device Tree.
-
----- foo.dts -----------------------------------------------------------------
- /* FOO platform */
- / {
- compatible = "corp,foo";
-
- /* shared resources */
- res: res {
- };
-
- /* On chip peripherals */
- ocp: ocp {
- /* peripherals that are always instantiated */
- peripheral1 { ... };
- };
- };
----- foo.dts -----------------------------------------------------------------
-
-We have a number of peripherals that after probing (using some undefined method)
-should result in different Device Tree configuration.
-
-We cannot boot with this static tree because due to the configuration of the
-foo platform there exist multiple conficting peripherals DT fragments.
-
-So for the bar peripheral we would have this:
-
----- foo+bar.dts -------------------------------------------------------------
- /* FOO platform + bar peripheral */
- / {
- compatible = "corp,foo";
-
- /* shared resources */
- res: res {
- };
-
- /* On chip peripherals */
- ocp: ocp {
- /* peripherals that are always instantiated */
- peripheral1 { ... };
-
- /* bar peripheral */
- bar {
- compatible = "corp,bar";
- ... /* various properties and child nodes */
- };
- };
- };
----- foo+bar.dts -------------------------------------------------------------
-
-While for the baz peripheral we would have this:
-
----- foo+baz.dts -------------------------------------------------------------
- /* FOO platform + baz peripheral */
- / {
- compatible = "corp,foo";
-
- /* shared resources */
- res: res {
- /* baz resources */
- baz_res: res_baz { ... };
- };
-
- /* On chip peripherals */
- ocp: ocp {
- /* peripherals that are always instantiated */
- peripheral1 { ... };
-
- /* baz peripheral */
- baz {
- compatible = "corp,baz";
- /* reference to another point in the tree */
- ref-to-res = <&baz_res>;
- ... /* various properties and child nodes */
- };
- };
- };
----- foo+baz.dts -------------------------------------------------------------
-
-We note that the baz case is more complicated, since the baz peripheral needs to
-reference another node in the DT tree.
-
-2. Device Tree Object Format Requirements
------------------------------------------
-
-Since the Device Tree is used for booting a number of very different hardware
-platforms it is imperative that we tread very carefully.
-
-2.a) No changes to the Device Tree binary format for the base tree. We cannot
-modify the tree format at all and all the information we require should be
-encoded using Device Tree itself. We can add nodes that can be safely ignored
-by both bootloaders and the kernel. The plugin dtbs are optionally tagged
-with a different magic number in the header but otherwise they're simple
-blobs.
-
-2.b) Changes to the DTS source format should be absolutely minimal, and should
-only be needed for the DT fragment definitions, and not the base boot DT.
-
-2.c) An explicit option should be used to instruct DTC to generate the required
-information needed for object resolution. Platforms that don't use the
-dynamic object format can safely ignore it.
-
-2.d) Finally, DT syntax changes should be kept to a minimum. It should be
-possible to express everything using the existing DT syntax.
-
-3. Implementation
------------------
-
-The basic unit of addressing in Device Tree is the phandle. Turns out it's
-relatively simple to extend the way phandles are generated and referenced
-so that it's possible to dynamically convert symbolic references (labels)
-to phandle values. This is a valid assumption as long as the author uses
-reference syntax and does not assign phandle values manually (which might
-be a problem with decompiled source files).
-
-We can roughly divide the operation into two steps.
-
-3.a) Compilation of the base board DTS file using the '-@' option
-generates a valid DT blob with an added __symbols__ node at the root node,
-containing a list of all nodes that are marked with a label.
-
-Using the foo.dts file above the following node will be generated;
-
-$ dtc -@ -O dtb -o foo.dtb -b 0 foo.dts
-$ fdtdump foo.dtb
-...
-/ {
- ...
- res {
- ...
- phandle = <0x00000001>;
- ...
- };
- ocp {
- ...
- phandle = <0x00000002>;
- ...
- };
- __symbols__ {
- res="/res";
- ocp="/ocp";
- };
-};
-
-Notice that all the nodes that had a label have been recorded, and that
-phandles have been generated for them.
-
-This blob can be used to boot the board normally, the __symbols__ node will
-be safely ignored both by the bootloader and the kernel (the only loss will
-be a few bytes of memory and disk space).
-
-We generate a __symbols__ node to record nodes that had labels in the base
-tree (or subsequent loaded overlays) so that they can be matched up with
-references made to them in Device Tree objects.
-
-3.b) The Device Tree fragments must be compiled with the same option but they
-must also have a tag (/plugin/) that allows undefined references to nodes
-that are not present at compilation time to be recorded so that the runtime
-loader can fix them.
-
-So the bar peripheral's DTS format would be of the form:
-
-/dts-v1/;
-/plugin/; /* allow undefined references and record them */
-/ {
- .... /* various properties for loader use; i.e. part id etc. */
- fragment@0 {
- target = <&ocp>;
- __overlay__ {
- /* bar peripheral */
- bar {
- compatible = "corp,bar";
- ... /* various properties and child nodes */
- }
- };
- };
-};
-
-Note that there's a target property that specifies the location where the
-contents of the overlay node will be placed, and it references the node
-in the foo.dts file.
-
-$ dtc -@ -O dtb -o bar.dtbo -b 0 bar.dts
-$ fdtdump bar.dtbo
-...
-/ {
- ... /* properties */
- fragment@0 {
- target = <0xffffffff>;
- __overlay__ {
- bar {
- compatible = "corp,bar";
- ... /* various properties and child nodes */
- }
- };
- };
- __fixups__ {
- ocp = "/fragment@0:target:0";
- };
-};
-
-No __symbols__ node has been generated (no label in bar.dts).
-Note that the target's ocp label is undefined, so the phandle
-value is filled with the illegal value '0xffffffff', while a __fixups__
-node has been generated, which marks the location in the tree where
-the label lookup should store the runtime phandle value of the ocp node.
-
-The format of the __fixups__ node entry is
-
- <label> = "<local-full-path>:<property-name>:<offset>"
- [, "<local-full-path>:<property-name>:<offset>"...];
-
- <label> Is the label we're referring
- <local-full-path> Is the full path of the node the reference is
- <property-name> Is the name of the property containing the
- reference
- <offset> The offset (in bytes) of where the property's
- phandle value is located.
-
-Doing the same with the baz peripheral's DTS format is a little bit more
-involved, since baz contains references to local labels which require
-local fixups.
-
-/dts-v1/;
-/plugin/; /* allow undefined label references and record them */
-/ {
- .... /* various properties for loader use; i.e. part id etc. */
- fragment@0 {
- target = <&res>;
- __overlay__ {
- /* baz resources */
- baz_res: res_baz { ... };
- };
- };
- fragment@1 {
- target = <&ocp>;
- __overlay__ {
- /* baz peripheral */
- baz {
- compatible = "corp,baz";
- /* reference to another point in the tree */
- ref-to-res = <&baz_res>;
- ... /* various properties and child nodes */
- }
- };
- };
-};
-
-Note that &bar_res reference.
-
-$ dtc -@ -O dtb -o baz.dtbo -b 0 baz.dts
-$ fdtdump baz.dtbo
-...
-/ {
- ... /* properties */
- fragment@0 {
- target = <0xffffffff>;
- __overlay__ {
- res_baz {
- ....
- phandle = <0x00000001>;
- };
- };
- };
- fragment@1 {
- target = <0xffffffff>;
- __overlay__ {
- baz {
- compatible = "corp,baz";
- ... /* various properties and child nodes */
- ref-to-res = <0x00000001>;
- }
- };
- };
- __fixups__ {
- res = "/fragment@0:target:0";
- ocp = "/fragment@1:target:0";
- };
- __local_fixups__ {
- fragment@1 {
- __overlay__ {
- baz {
- ref-to-res = <0>;
- };
- };
- };
- };
-};
-
-This is similar to the bar case, but the reference of a local label by the
-baz node generates a __local_fixups__ entry that records the place that the
-local reference is being made. No matter how phandles are allocated from dtc
-the run time loader must apply an offset to each phandle in every dynamic
-DT object loaded. The __local_fixups__ node records the offset relative to the
-start of every local reference within that property so that the loader can apply
-the offset.