根节点

设备树有一个单一的根节点,所有其他设备节点都是后代。 根节点的完整路径为/
根节点的属性:

属性名称 惯例 值类型 描述
#address-cells 必须的 描述子节点的reg属性中编码地址区域
#size-cells 必须的 描述子节点的reg属性中编码大小区域
model 必须的 指定唯一标识系统板模型的字符串。推荐的格 式是”制造商,型号-编号”
compatible 必须的 指定与此平台兼容的平台体系结构列表。此属性可供操作系统在选择平台特定代码时使用。 属性的建议形式是:”制造商、型号” 例如:compatible=”fsl,mpc8572ds”

/aliases节点

devicetree可能有一个别名节点,它定义了一个或多个别名属性。别名节点应位于devicetree的根,并具有节点名称/aliases/aliases节点的每个属性定义一个别名。 属性名指定别名。 属性值指定到devicetree中节点的完整路径。 例如,属性序列为:
serial0 = "/simple-bus@fe000000/serial@llc500"定义了一个别名为serial0。
别名应是以下的1到31个字符的小写文本字符串。

字符 描述
0-9 数字
a-z 小写字母
- 破折号

别名值是设备路径,并被编码为字符串。 值表示到节点的完整路径,但路径不需要引用叶节点。 例如:

  1. dts aliases {
  2. serial0 = "/simple-bus@fe000000/serial@llc500";
  3. ethernet0 = "/simple-bus@fe000000/ethernet@31c000";
  4. };

/memory节点

所有设备都需要一个内存设备节点,并描述系统的物理内存布局。如果一个系统有多个内存范围,可以创建多个内存节点,或者可以在单个内存节点的reg属性中指定范围。
客户端程序可以访问未被任何内存保留覆盖的内存。然而,在使用于访问真实页面的存储属性之前,客户端程序负责执行体系结构和实现所需的操作,可能包括从缓存中刷新真实页面。引导程序负责确保,在不采取任何与存储属性更改相关的操作的情况下,客户端程序可以安全地访问WIMG=0b001x的所有内存。
/memory节点的属性如下:

属性名称 惯例 值类型 描述
device_type 必须 值应该是”memory”
reg 必须 由指定内存范围的物理地址和大小的任意数量的地址和大小对组成
initial-mapped-area 非必须 指定初始映射区域的地址和大小是由(有效地址,物理地址,大小)的三重态组成的支柱编码阵列。有效地址和物理地址各为64位(),大小为32位()

所有其他标准属性部分是允许的。
例如给定64位系统,具有以下物理内存布局:

  • RAM:起始地址 0x0,长度 0x80000000(2GB)
  • RAM:起始地址 0x100000000,长度 0x100000000(4GB)

内存节点可以定义如下,#address-cells = <2>#size-cells = <2>

  1. memory@0 {
  2. device_type = "memory";
  3. reg = <0x000000000 0x00000000 0x00000000 0x80000000
  4. 0x000000001 0x00000000 0x00000001 0x00000000>;
  5. };

或者

  1. memory@0 {
  2. device_type = "memory";
  3. reg = <0x000000000 0x00000000 0x00000000 0x80000000>;
  4. };
  5. memory@100000000 {
  6. device_type = "memory";
  7. reg = <0x000000001 0x00000000 0x00000001 0x00000000>;
  8. };

使用reg属性定义两个内存范围的地址和大小,跳过2GB的区域。 注意,根节点的#address-cells#size-cells属性指定了2的值,这意味着需要两个32位单元来定义内存节点的reg属性的地址和长度。

/chosen节点

选择的节点不表示系统中的真实设备,而是描述系统固件在运行时选择或指定的参数。 应为根节点的子节点。
/chosen节点属性:

属性名称 惯例 值类型 描述
bootargs 非必须 指定客户端程序引导参数的字符串。如果不需 要引导参数,该值可能是空字符串。
stdout-path 非必须 指定指向节点的完整路径的字符串,该节点表示用于引导控制台输出的设备。如果值中存在字符”:”,则终止路径。值可能是别名。如果没有指定stdin-path属性,则应假定stdout-path定义输入设备。
stdin-path 非必须 指定指向节点的完整路径的字符串,该节点表示用于引导控制台输入的设备。如果值中存在字符”:”,则终止路径。 值可能是别名。

所有其他标准属性,部分是允许的。
例如:

  1. chosen {
  2. bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200";
  3. };

/cpus节点

所有设备都需要一个/cpus节点。 它不代表系统中的真实设备,而是充当表示系统CPU的子cpu节点的容器。
/cpus节点属性。

属性名称 惯例 值类型 描述
#address-cells 必须的 该值指定reg属性数组的每个元素在该节点的子节点中接受多少个地址单元格
#size-cells 必须的 值应为0。 指定此节点的子节点的reg属性中不需要大小。

/cpus节点可能包含跨cpu节点的共同属性。

/cpus/cpu节点

一个cpu节点表示一个足够独立的硬件执行块,它能够在不干扰可能运行其他操作系统的其他CPU的情况下运行操作系统。
共享MMU的硬件线程通常在一个cpu节点下表示。如果设计了其他更复杂的CPU映射,则CPU的绑定必须描述映射(例如。 不共享 MMU的线程)。
CPU和线程通过一个统一的编号空间进行编号,该空间应尽可能与中断控制器的CPU/线程编号匹配。
在cpu节点之间具有相同值的属性可以放置在cpus节点中。 客户端程序必须首先检查特定的cpu节点, 但如果没有找到预期属性,则应该查看父cpus节点。 这导致了对所有CPU相同的属性的不那么冗长的表示。

/cpus/cpu节点的一般属性

属性名称 惯例 值类型 描述
device_type 必须的 值应为”cpu”
reg 必须的 array 这个reg值是一个,为CPU节点表示的CPU/thread定义唯一的CPU/thread id。如果CPU支持多个线程。reg属性是一个数组,每个线程有1个元素。 在/cpus节点上的#address-cells指定数组的每个元素占用多少个单元。 软件可以通过将reg的大小除以父节点的#address-cells来确定线程的数量。 如果CPU/thread可以是外部中断的目标,则reg属性值必须是中断控制器可寻址的唯一CPU/thread id。 如果 CPU/线程不能成为外部中断的目标,则reg必须是唯一的,并且超出中断控制器寻址范围。如果CPU/thread的PIR(挂起中断寄存器)是可修改的,则客户端程序应该修改PIR以匹配reg属性值。如果reg是不能修改的,并且PIR值不同于中断控制器编号空间,如果需要的话,则CPU绑定可以定义PIR值的特定绑定形式。
clock-frequency 必须的 array 指定以赫兹为单位的CPU当前时钟速度。 该值是一个<prop-encoded-array>的以下两种值之一:
1、一个32位整数,由一个<u32>指定频率。
2、表示为<u64>指定频率
timebase-frequency 必须的 array 指定时基的当前频率(以赫兹为单位)。该值是一个<prop-encoded-array>的以下两种值之一:
1、一个32位整数,由一个<u32>指定频率。
2、表示为<u64>的64位整数
status 查看定义 描述CPU状态的标准属性。 此属性应存在于表示对称多处理(SMP)配置中CPU的节点。对于CPU节点,”ok”和”disabled”值的含义如下:
“ok”:CPU正在运行。
“disabled”:CPU处于禁止状态。
禁止CPU处于不能干扰其他CPU正常工作的状态,也不能受其他正在运行的CPU正常工作的影响,但启用或重新启用禁止CPU的显式方法除外。 特别是,运行中的CPU应能够发出广播TLB无效,而不影响禁止CPU。 示例:禁止CPU可以处于自旋循环中,保持在复位中,并且与系统总线或另一个实现依赖状 态电隔离。
enable-method 查看定义 描述禁用状态下CPU的方法。 此属性对于具有”禁用”值的状态属性的CPU是必需的。 该值由一个或多个字符串组成,这些字符串定义了释放此CPU的方法。 如果客户端程序识别任何方法,它可以使用它。值应为以下内容之一:
1、 “spin-table”:CPU使用设备树中定义的自旋表方法。
2、”[vendor],[method]”:实现依赖字符串,描述CPU从”禁用”状态释放的方法。所需格式为:”[vendor],[method]”,其中供应商是描述制造商名称的字符串,方法是描述特定供应商特定机制的字符串。 例如:”fsl,MPC8572DS”
cpu-release-addr 查看定义 对于具有”spin-table”的启用方法属性值的cpu节点,cpu-release-addr属性是必需的。 该值指定 从其自旋循环释放二次CPU的自旋表条目的物理地址。

/cpus/cpu节点电源ISA属性

属性名称 惯例 值类型 描述
power-isa-version 可选的 指定PowerISA版本字符串的数字部分的字符串。例如,对于符合Power ISA版本2.06的实 现,此属性的值将为”2.06”
power-isa-* 可选的 空值 如果存在power-isa-version属性,则对于所指示的PowerISA版本的类别部分中的每个类别,存在一个名为 power-is a-[CAT]的属性,其中[CAT]是缩写的类别名称,所有大写字母转换为小写,表明该类别得到实现的支持。例如,如果存在 power-isa-version属性,且其值为”2.06”,并且存在power-isa-e.hv属性,则支持[Category:Embedded.Hypervisor]在PowerISA版本2.06中定义
cache-op-block-size 查看定义 指定缓存块指令操作的块大小。如 果与L1缓存块大小不同,则需要此选项
reservation-granule-size 查看定义 指定此处理器支持的保留颗粒大小(以字节为 单位)
mmu-type 可选的 指定 CPU 的 MMU 类型。 有效值为:
“mpc8xx”、”ppc40x”、”ppc440”、”ppc476”、”power-embedded”、”powerpc-classic”、”power-server-stab”、”power-server-slb”、”none”

/cpus/cpu节点的TLB属性

以下cpu节点的属性描述了处理器的MMU中的转换侧缓冲区。

属性名称 惯例 值类型 描述
tlb-split 查看定义 空值 如果存在,则指定TLB具有拆分配置。则为指令和数据提供单独的TLB。如果没有指定,则TLB具有统一配置。在拆分配置中具有CPU所需的TLB配置
tlb-size 查看定义 指定TLB中的条目数。 对于统一配置TLB的CPU所需要配置
tlb-sets 查看定义 指定TLB中的集合的数目。对于统一配置TLB的CPU所需要配置
d-tlb-size 查看定义 指定数据TLB中的条目数。 对于拆分配置TLB的CPU所需要配置
d-tlb-sets 查看定义 指定数据TLB中的集合的数目。对于拆分配置TLB的CPU所需要配置
i-tlb-size 查看定义 指定指令TLB中的条目数。对于拆分配置TLB的CPU所需要配
i-tlb-set 查看定义 指定指令TLB中的集合的数目。对于拆分配置TLB的CPU所需要配置

/cpus/cpu节点的内存缓存(L1)属性

以下cpu节点的属性描述处理器的内部(L1)缓存。

属性名称 惯例 值类型 描述
cache-unifie 查看定义 空值 如果存在,则指定缓存具有统一的组织。如果不存在,则指定缓存具有指令和数据的单独缓存的哈佛体系结构。
cache-size 查看定 指定统一缓存的字节大小。如果缓存统一(合并指令和数据),则需要配置。
cache-sets 查看定义 指定统一缓存中的集合数目。如果缓存统一(合并指令和数据),则需要配置。
cache-block-size 查看定义 指定统一缓存的块大小(以字节为单位)。如果处理器有统一的缓存(合并指令和数据),则需要配置。
cache-line-size 查看定义 指定统一缓存的行大小(以字节为单位),如果与处理器具有统一缓存(组合指令和数据)并且所需缓存和块缓存大小不同,则必须要配置。
i-cache-size 查看定义 指定指令缓存的大小(以字节为单位)。如果处理器单独缓存需要配置。
i-cache-sets 查看定义 指定指令缓存中的集合数目。如果处理器单独缓存需要配置。
i-cache-block-size 查看定义 指定指令缓存的块大小。如果处理器单独缓存需要配置。
i-cache-line-size 查看定义 指定指令缓存的行大小(以字节为单位),如果与缓存块大小不同且处理器单独缓存需要配置。
d-cache-size 查看定义 指定数据缓存的大小(以字节为单位)。如果处理器单独缓存需要配置。
d-cache-sets 查看定义 指定数据缓存中的集合数目。如果处理器单独缓存需要配置。
d-cache-block-size 查看定义 指定数据缓存的块大小。如果处理器单独缓存需要配置。
d-cache-line-size 查看定义 指定数据缓存的行大小(以字节为单位),如果与缓存块大小不同且处理器单独缓存需要配置。
next-level-cache 查看定义 如果存在,则指示存在另一级缓存。值是下一级缓存的phandle

示例

  1. cpus {
  2. #address-cells = <1>;
  3. #size-cells = <0>;
  4. cpu@0 {
  5. device_type = "cpu";
  6. reg = <0>;
  7. d-cache-block-size = <32>; // L1 - 32 bytes
  8. i-cache-block-size = <32>; // L1 - 32 bytes
  9. d-cache-size = <0x8000>; // L1, 32K
  10. i-cache-size = <0x8000>; // L1, 32K
  11. timebase-frequency = <82500000>; // 82.5 MHz
  12. clock-frequency = <825000000>; // 825 MHz
  13. };
  14. };

/cpus/cpu*/L?-cache节点

处理器和系统可以实现缓存层次结构的附加级别。 例如,二级(L2)或三级(L3)缓存,这些缓存可能与CPU紧密集成, 或者可能在多个 CPU之间共享。
缓存节点应定义phandle属性,与缓存相关联或共享缓存的所有cpu节点缓存节点都应包含指定缓存节点的next-level-cache属性。
缓存节点可以在CPU节点或devicetree中的任何其他适当位置下表示。
多级和共享缓存节点的属性:

属性名称 惯例 值类型 描述
compatible 必须的 属性值为”cache”
cache-level 必须的 指定缓存层次结构中的级别。例如,二级缓存的值为2

例如:

  1. cpus {
  2. #address-cells = <1>;
  3. #size-cells = <0>;
  4. cpu@0 {
  5. device_type = "cpu";
  6. reg = <0>;
  7. cache-unified;
  8. cache-size = <0x8000>; // L1, 32KB
  9. cache-block-size = <32>;
  10. timebase-frequency = <82500000>; // 82.5 MHz
  11. next-level-cache = <&L2_0>; // phandle to L2
  12. L2_0:l2-cache {
  13. compatible = "cache";
  14. cache-unified;
  15. cache-size = <0x40000>; // 256 KB
  16. cache-sets = <1024>;
  17. cache-block-size = <32>;
  18. cache-level = <2>;
  19. next-level-cache = <&L3>; // phandle to L3
  20. L3:l3-cache {
  21. compatible = "cache";
  22. cache-unified;
  23. cache-size = <0x40000>; // 256 KB
  24. cache-sets = <0x400>; // 1024
  25. cache-block-size = <32>;
  26. cache-level = <3>;
  27. };
  28. };
  29. };
  30. cpu@1 {
  31. device_type = "cpu";
  32. reg = <1>;
  33. cache-unified;
  34. cache-block-size = <32>;
  35. cache-size = <0x8000>; // L1, 32KB
  36. timebase-frequency = <82500000>; // 82.5 MHz
  37. clock-frequency = <825000000>; // 825 MHz
  38. cache-level = <2>;
  39. next-level-cache = <&L2_1>; // phandle to L2
  40. L2_1:l2-cache {
  41. compatible = "cache";
  42. cache-unified;
  43. cache-size = <0x40000>; // 256 KB
  44. cache-sets = <0x400>; // 1024
  45. cache-line-size = <32>; // 32 bytes
  46. next-level-cache = <&L3>; // phandle to L3
  47. };
  48. };
  49. };