根节点
设备树有一个单一的根节点,所有其他设备节点都是后代。 根节点的完整路径为/
。
根节点的属性:
属性名称 | 惯例 | 值类型 | 描述 |
---|---|---|---|
#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 | 小写字母 |
- | 破折号 |
别名值是设备路径,并被编码为字符串。 值表示到节点的完整路径,但路径不需要引用叶节点。 例如:
dts aliases {
serial0 = "/simple-bus@fe000000/serial@llc500";
ethernet0 = "/simple-bus@fe000000/ethernet@31c000";
};
/memory
节点
所有设备都需要一个内存设备节点,并描述系统的物理内存布局。如果一个系统有多个内存范围,可以创建多个内存节点,或者可以在单个内存节点的reg
属性中指定范围。
客户端程序可以访问未被任何内存保留覆盖的内存。然而,在使用于访问真实页面的存储属性之前,客户端程序负责执行体系结构和实现所需的操作,可能包括从缓存中刷新真实页面。引导程序负责确保,在不采取任何与存储属性更改相关的操作的情况下,客户端程序可以安全地访问WIMG=0b001x
的所有内存。/memory
节点的属性如下:
属性名称 | 惯例 | 值类型 | 描述 |
---|---|---|---|
device_type | 必须 | 值应该是”memory” | |
reg | 必须 | 由指定内存范围的物理地址和大小的任意数量的地址和大小对组成 | |
initial-mapped-area | 非必须 | 指定初始映射区域的地址和大小是由(有效地址,物理地址,大小)的三重态组成的支柱编码阵列。有效地址和物理地址各为64位( |
所有其他标准属性部分是允许的。
例如给定64位系统,具有以下物理内存布局:
- RAM:起始地址 0x0,长度 0x80000000(2GB)
- RAM:起始地址 0x100000000,长度 0x100000000(4GB)
内存节点可以定义如下,#address-cells = <2>
和#size-cells = <2>
。
memory@0 {
device_type = "memory";
reg = <0x000000000 0x00000000 0x00000000 0x80000000
0x000000001 0x00000000 0x00000001 0x00000000>;
};
或者
memory@0 {
device_type = "memory";
reg = <0x000000000 0x00000000 0x00000000 0x80000000>;
};
memory@100000000 {
device_type = "memory";
reg = <0x000000001 0x00000000 0x00000001 0x00000000>;
};
使用reg
属性定义两个内存范围的地址和大小,跳过2GB的区域。 注意,根节点的#address-cells
和#size-cells
属性指定了2的值,这意味着需要两个32位单元来定义内存节点的reg
属性的地址和长度。
/chosen
节点
选择的节点不表示系统中的真实设备,而是描述系统固件在运行时选择或指定的参数。 应为根节点的子节点。/chosen
节点属性:
属性名称 | 惯例 | 值类型 | 描述 |
---|---|---|---|
bootargs | 非必须 | 指定客户端程序引导参数的字符串。如果不需 要引导参数,该值可能是空字符串。 | |
stdout-path | 非必须 | 指定指向节点的完整路径的字符串,该节点表示用于引导控制台输出的设备。如果值中存在字符”:”,则终止路径。值可能是别名。如果没有指定stdin-path 属性,则应假定stdout-path 定义输入设备。 |
|
stdin-path | 非必须 | 指定指向节点的完整路径的字符串,该节点表示用于引导控制台输入的设备。如果值中存在字符”:”,则终止路径。 值可能是别名。 |
所有其他标准属性,部分是允许的。
例如:
chosen {
bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200";
};
/cpus
节点
所有设备都需要一个/cpus
节点。 它不代表系统中的真实设备,而是充当表示系统CPU的子cpu
节点的容器。/cpus
节点属性。
属性名称 | 惯例 | 值类型 | 描述 |
---|---|---|---|
#address-cells | 必须的 | 该值指定reg 属性数组的每个元素在该节点的子节点中接受多少个地址单元格 |
|
#size-cells | 必须的 | 值应为0。 指定此节点的子节点的reg 属性中不需要大小。 |
/cpus/cpu
节点
一个cpu节点表示一个足够独立的硬件执行块,它能够在不干扰可能运行其他操作系统的其他CPU的情况下运行操作系统。
共享MMU的硬件线程通常在一个cpu节点下表示。如果设计了其他更复杂的CPU映射,则CPU的绑定必须描述映射(例如。 不共享 MMU的线程)。
CPU和线程通过一个统一的编号空间进行编号,该空间应尽可能与中断控制器的CPU/线程编号匹配。
在cpu节点之间具有相同值的属性可以放置在cpus节点中。 客户端程序必须首先检查特定的cpu节点, 但如果没有找到预期属性,则应该查看父cpus节点。 这导致了对所有CPU相同的属性的不那么冗长的表示。
/cpus/cpu
节点的一般属性
属性名称 | 惯例 | 值类型 | 描述 |
---|---|---|---|
device_type | 必须的 | 值应为”cpu” | |
reg | 必须的 | array | 这个reg值是一个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 。 |
示例
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
device_type = "cpu";
reg = <0>;
d-cache-block-size = <32>; // L1 - 32 bytes
i-cache-block-size = <32>; // L1 - 32 bytes
d-cache-size = <0x8000>; // L1, 32K
i-cache-size = <0x8000>; // L1, 32K
timebase-frequency = <82500000>; // 82.5 MHz
clock-frequency = <825000000>; // 825 MHz
};
};
/cpus/cpu*/L?-cache
节点
处理器和系统可以实现缓存层次结构的附加级别。 例如,二级(L2)或三级(L3)缓存,这些缓存可能与CPU紧密集成, 或者可能在多个 CPU之间共享。
缓存节点应定义phandle
属性,与缓存相关联或共享缓存的所有cpu节点
或缓存节点
都应包含指定缓存节点的next-level-cache
属性。
缓存节点可以在CPU节点或devicetree中的任何其他适当位置下表示。
多级和共享缓存节点的属性:
属性名称 | 惯例 | 值类型 | 描述 |
---|---|---|---|
compatible | 必须的 | 属性值为”cache” | |
cache-level | 必须的 | 指定缓存层次结构中的级别。例如,二级缓存的值为2 |
例如:
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
device_type = "cpu";
reg = <0>;
cache-unified;
cache-size = <0x8000>; // L1, 32KB
cache-block-size = <32>;
timebase-frequency = <82500000>; // 82.5 MHz
next-level-cache = <&L2_0>; // phandle to L2
L2_0:l2-cache {
compatible = "cache";
cache-unified;
cache-size = <0x40000>; // 256 KB
cache-sets = <1024>;
cache-block-size = <32>;
cache-level = <2>;
next-level-cache = <&L3>; // phandle to L3
L3:l3-cache {
compatible = "cache";
cache-unified;
cache-size = <0x40000>; // 256 KB
cache-sets = <0x400>; // 1024
cache-block-size = <32>;
cache-level = <3>;
};
};
};
cpu@1 {
device_type = "cpu";
reg = <1>;
cache-unified;
cache-block-size = <32>;
cache-size = <0x8000>; // L1, 32KB
timebase-frequency = <82500000>; // 82.5 MHz
clock-frequency = <825000000>; // 825 MHz
cache-level = <2>;
next-level-cache = <&L2_1>; // phandle to L2
L2_1:l2-cache {
compatible = "cache";
cache-unified;
cache-size = <0x40000>; // 256 KB
cache-sets = <0x400>; // 1024
cache-line-size = <32>; // 32 bytes
next-level-cache = <&L3>; // phandle to L3
};
};
};