零、说明
以下翻译通过翻译工具完成。
一、介绍
1、目的和范围
为了初始化和引导计算机系统,交互固件的各种软件组件可能在将控制传递给操作系统、引导加载程序或管理程序等软件之前执行系统硬件的低级初始化。引导加载程序和管理程序可以依次将控制加载并转移到操作系统。标准的、一致的接口和约定促进了这些软件组件之间的交互。在本文档中,术语引导程序一般用来指初始化系统状态并执行其他软件的软件组件。
这个规范,嵌入式电源体系结构平台要求( ePAPR
),提供了一个完整的引导程序到客户端程序接口的定义,与促进基于 cpu
的各种嵌入式系统开发的最低系统需求相结合,这些 cpu
实现了 Power ISA[1]
中定义的 Power
体系结构。
本规范针对的是嵌入式系统的需求。嵌入式系统通常由系统硬件、操作系统和应用软件组成,它们是为执行固定的、特定的一组任务而定制的。这与通用计算机不同,通用计算机被设计为由用户使用各种软件和IO设备进行定制。嵌入式系统的其他特征包括:
- 一组固定的
IO
设备,可能是为应用程序高度定制的。 - 一种优化了尺寸和成本的系统板。
- 有限的接口。
- 资源约束,如有限的内存和有限的非易失性存储。
- 实时约束。
- 使用各种操作系统,包括
Linux
、实时操作系统和定制的或专有的操作系统。
2、本文档的结构
- 第 1 章介绍了由
ePAPR
指定的体系结构。 - 第 2 章介绍了设备树的概念,描述了设备树的逻辑结构和标准特性。
- 第 3 章指定了符合
ePAPR
的设备树所需的设备节点基本集的定义。 - 第 4 章指定了
ELF
客户端程序的映像格式。 - 第 5 章指定了启动程序在单个和多个
CPU
系统上启动客户端程序的要求。 - 第 6 章描述了某些类型设备和特定设备类型的设备绑定。
- 第 7 章描述了
ePAPR
虚拟化扩展——超调用ABI
、超调用api
以及与虚拟化相关的设备树约定。 - 第 8 章详细介绍了设备树的物理结构。
3、本文档使用的约定
“shall”
一词用于表示为了符合标准而严格遵守的强制性要求,并且不允许偏离(应等于要求)。
“should”
一词用来表示在几种可能性中,其中一种被推荐为特别合适的,而不提及或排除其他可能性;或者某种行动是首选但并非必需的;或者(用否定的形式)反对但不禁止某种行为( should equals
是推荐的)。
"may"
一词用来表示在标准范围内允许的行为过程(may
等于允许)。
设备树结构的例子通常以设备树语法的形式显示。有关该语法的概述,请参阅附录A设备树源格式(版本1)。
4、与IEEE 1275的关系
ePAPR
与 IEEE 1275
开放固件标准 IEEE Boot
(初始化配置)固件标准:核心要求和实践[2]松散相关。
最初的 IEEE 1275
规范及其衍生物如 CHRP[10]
和地表铺面[16]通用计算机的地址问题,比如一个版本的操作系统可以工作在几个不同的电脑在同一家庭和加载操作系统的问题,从用户装机 IO
设备。
由于嵌入式系统的性质,开放的通用计算机所面临的一些问题并不适用。IEEE 1275
规范中被省略的值得注意的特性包括:
- 插件设备驱动程序
FCode
- 基于
Forth
的可编程开放固件用户界面 FCode
调试- 操作系统调试
IEEE-1275
保留了来自设备树架构的概念,通过这些概念,引导程序可以描述系统硬件信息并将其传递给客户端程序,从而消除了客户端程序对系统硬件的硬编码描述的需要。
5、32 位和 64 位支持
ePAPR
支持同时具有 32
位和 64
位寻址功能的 CPU
。在适用的情况下,ePAPR
的各节描述了 32
位和 64
位寻址的任何要求或注意事项。
6、参考
7、术语定义
二、设备树
1、概述
ePAPR
指定了一个称为设备树的构造来描述系统硬件。引导程序将设备树加载到客户端程序的内存中,并将指向设备树的指针传递给客户端。
本章描述了设备树的逻辑结构,并指定了用于描述设备节点的基本属性集。第 3 章指定了符合 ePAPR
要求的设备树所需要的某些设备节点。第6章描述了 ePAPR
定义的设备绑定,用于表示某些设备类型的设备类。第 8 章描述了设备树的内存编码。
设备树是一种树状数据结构,其中的节点用来描述系统中的设备。每个节点都有属性值对,用于描述所代表的设备的特征。除了没有父节点的根节点,每个节点都有一个父节点。
符合 ePAPR
的设备树描述了系统中客户端程序不一定能动态检测到的设备信息。例如,PCI
的体系结构允许客户机探测和检测附加的设备,因此可能不需要描述 PCI
设备的设备树节点。但是,如果无法探测到 PCI
主机桥设备,则需要设备节点来描述系统中的 PCI
主机桥设备。
例如:
图2-1显示了一个简单设备树的示例表示,该设备树几乎完全可以引导一个简单的操作系统,并描述了平台类型、CPU
和内存。设备节点显示的属性和值显示在节点旁边。
2、设备树结构和约定
1、节点名
设备树中的每个节点都按照以下约定进行命名:
node-name@unit-address
node-name
组件指定节点的名称。长度为**1 ~ 31
个字符**,且仅由表2-1中的字符集中的字符组成。
节点名应以小写或大写字母开头,并应描述设备的一般类别。
名称的单元地址组件特定于节点所在的总线类型。它由表 2-1
中的一个或多个ASCII字符组成。单元地址必须匹配节点的 reg
属性中指定的第一个地址。如果节点没有 reg
属性,则必须省略 @
和单元地址,仅使用节点名将节点与树中同一级别的其他节点区分开来。绑定一个特定的总线可能指定额外的,更具体的 reg
格式和单元地址的要求。
根节点没有节点名或单元地址。它由一个正斜杠( /
)标识。
例如:
在示例中:
- 名称为
cpu
的节点通过其单元地址值0
和1
来区分。 - 名称为
ethernet
的节点通过其单元地址值FE001000
和FE002000
来区分。
2、通用名称建议
节点的名称应该是通用的,反映设备的功能,而不是其精确的编程模型。如果合适,该名称应该是以下选项之一:
3、路径名
设备树中的一个节点可以通过指定从根节点到所有后代节点到所需节点的完整路径来唯一标识。
指定设备路径的约定为:
/node-name-1/node-name-2/node-name-N
例如,在图 2-2
中,设备到 cpu #1
的路径是:
/cpus/cpu@1
根节点的路径为 /
。
如果到节点的完整路径是明确的,则单元地址可以省略。
如果客户机程序遇到一个模糊路径,它的行为是未定义的。
4、属性
设备树中的每个节点都有描述该节点特征的属性。属性由名称和值组成。
1、属性名称
属性名由以下字符组成,长度范围是 1 ~ 31
个字符。
非标准属性名应该指定唯一的字符串前缀,例如股票代号,标识定义该属性的公司或组织的名称。例子:
fsl,channel-fifo-len
ibm,ppc-interrupt-server#s
linux,network-index
2、属性值
属性值是一个包含 0
个或多个字节的数组,其中包含与属性相关的信息。
属性在传递真假信息时可能为空值。在这种情况下,属性的存在或不存在是充分描述性的。
ePAPR
定义的基本值类型如表2-3所示。
3、标准属性
ePAPR
为设备节点指定一组标准属性。本节将详细描述这些属性。ePAPR
定义的设备节点(参见第 3
章设备节点要求)可能指定关于使用标准属性的额外要求或约束。描述特定设备表示的设备绑定(第 6
章)也可能指定额外的要求。
注意:本文档中所有的设备树节点示例都使用设备树源(DTS
)格式来指定节点和属性。
1、compatible
属性 | compatible |
---|---|
值类型 | stringlist |
描述 | compatible属性值由一个或多个字符串组成,这些字符串定义了设备的特定编程模型。 客户端程序应该使用这个字符串列表来选择设备驱动程序。 属性值由一组以空结尾的串接字符串组成,从最特定的到最一般的。 它们允许设备表达其与一系列类似设备的兼容性,可能允许单个设备驱动程序与多个设备匹配。 |
例子 | compatible = “fsl,mpc8641-uart”, “ns16550"; 在这个例子中,操作系统首先尝试定位支持fsl的设备驱动程序mpc8641-uart。 如果没有找到驱动程序,那么它将尝试定位支持更通用的ns16550设备类型的驱动程序。 |
2、model
属性 | model |
---|---|
值类型 | string |
描述 | model属性值是一个字符串,它指定设备的制造商型号。 推荐格式为:manufacturer,model,其中manufacturer是描述制造商名称的字符串(例如股票代号),model指定型号。 |
例子 | model = “fsl,MPC8349EMITX”; |
3、phandle
属性 | phandle |
---|---|
值类型 | u32 |
描述 | phandle属性为设备树中唯一的节点指定数字标识符。 phandle属性值由需要引用与该属性关联的节点的其他节点使用。 |
例子 | pic@10000000 { phandle = <1>; interrupt-controller; }; 定义了一个phandle值1。另一个设备节点可以使用phandle值1引用pic节点 interrupt-parent = <1>; |
兼容性说明 | 可能会遇到旧版本的设备树,其中包含一个已弃用的名为linux phandle的属性形式。 为了兼容性,如果没有phandle属性,客户端程序可能想要支持linux,phandle。这两个属性的含义和用途是相同的。 |
编程说明 | 在设备树语法(DTS)(参见附录A)中,大多数设备树不会包含显式的phandle属性。 DTC工具在将DTS编译为二进制DTB格式时,会自动插入phandle属性。 |
4、status
属性 | status |
---|---|
值类型 | string |
描述 | status属性表示设备的运行状态。下表列出并定义了有效值。详细信息见 Table 2-4 |
例子 |
5、#address-cells and #size-cells
属性 | #address-cells and #size-cells |
---|---|
值类型 | u32 |
描述 | #address-cells和#size-cells属性可以用于在设备树层次结构中有子设备的任何设备节点,并描述如何寻址子设备节点。 #address-cells属性定义了用于在一个子节点的 reg 属性中编码地址字段的u32个单元的数量。 #size-cells属性定义了用于在子节点的 reg 属性中编码 size 字段的u32个单元格的数量。 #address-cells和#size-cells属性不会从设备树中的祖先继承。它们应明确界定。 一个符合epapr的引导程序应该在所有有子节点的节点上提供#address-cells和#size-cells。 如果没有,客户端程序应该假定#address-cells的默认值为2,#size-cells的默认值为1。 |
例子 | 如图2-3所示。 假装有图2-3 在图2-3中,soc节点的#address-cells和#size-cells属性都设置为1。 此设置指定需要一个单元来表示地址,需要一个单元来表示此节点的子节点的大小。 串行设备的reg属性必须遵循父(soc)节点中的这个规范集,地址由单个单元表示(0x4600),大小由单个单元表示(0x100)。 |
6、reg
属性 | reg |
---|---|
值类型 | prop-encoded-array |
描述 | reg属性描述由其父总线定义的地址空间内设备资源的地址。 最常见的是,这意味着内存映射IO寄存器块的偏移量和长度,但在某些总线类型上可能有不同的含义。 根节点定义的地址空间中的地址为cpu实地址。 该值是一个支持编码的数组,由任意数量的地址和长度对组成,地址长度。 指定地址和长度所需的u32单元数是总线特定的,由设备节点的父节点中的#address-cells和#size-cells属性指定。 如果父节点为#size-cells指定一个值为0,则reg值中的长度字段将被省略。 |
例子 | 假设片上系统中的设备有两个寄存器块:SOC中一个32字节的寄存器块(19偏移量0x3000)和 一个256字节的寄存器块(偏移量0xFE00)。reg属性将被编码如下(假设#address-cells和#size-cells值为1) reg = <0x3000 0x20 0xFE00 0x100>; |
7、virtual-reg
属性 | virtual-reg |
---|---|
值类型 | u32 |
描述 | virtual-reg属性指定一个有效地址,该地址映射到设备节点的reg属性中指定的第一个物理地址。 此属性允许引导程序向客户机程序提供已设置的虚拟到物理的映射。 |
例子 |
8、ranges
属性 | ranges |
---|---|
值类型 | empty / prop-encoded-array |
描述 | ranges属性提供了在总线的地址空间(子地址空间)和总线节点的父节点的地址空间(父地址空间) 之间定义映射或转换的方法。 ranges属性的值的格式是任意数量的三元组(child-busaddress, parent-bus-address, length) 子总线地址是子总线地址空间中的物理地址。 表示地址的单元数依赖于总线,可以从该节点(显示ranges属性的节点)的#address-cells中确定。 父总线地址是父总线地址空间中的物理地址。 表示父地址的单元数依赖于总线,可以通过定义父地址空间的节点的#address-cells属性确定。 长度指定子节点地址空间范围的大小。 表示大小的单元格数可以通过该节点(ranges属性出现的节点)的#size-cells确定。 如果属性定义为空值,则它指定父地址空间和子地址空间是相同的,不需要地址转换。 如果该属性没有出现在总线节点中,则假定节点的子节点和父地址空间之间不存在映射。 |
例子 | 如图2-4所示。 在图2-4中,soc节点指定了一个范围属性 <0x0 0xe0000000 0x00100000>; 这个属性值指定对于1024KB范围的地址空间,地址在物理0x0的子节点映射到物理0xe0000000的父地址。 有了这个映射,串行设备节点可以通过地址为0xe0004600的负载或存储来寻址, 偏移量为0x4600(在reg中指定)加上范围中指定的0xe0000000映射。 |
9、dma-ranges
属性 | dma-ranges |
---|---|
值类型 | empty / prop-encoded-array |
描述 | DMA -ranges属性用于描述内存映射总线的直接内存访问(DMA)结构, 该总线的设备树父节点可以通过源自总线的DMA操作进行访问。 它提供了一种方法来定义总线的物理地址空间和总线父节点的物理地址空间之间的映射或转换。 dma-ranges属性的值的格式是(child-bus-address, parent-bus-address, length)的任意数量的三连体。 指定的每个三元组描述一个连续的DMA地址范围。 子总线地址是子总线地址空间中的物理地址。 表示地址的单元数取决于总线,可以从该节点(dma-ranges属性出现的节点)的#address-cells中确定。 父总线地址是父总线地址空间中的物理地址。 表示父地址的单元数依赖于总线,可以通过定义父地址空间的节点的#address-cells属性确定。 长度指定子节点地址空间范围的大小。 表示大小的单元格数量可以通过该节点(dma-ranges属性出现的节点)的#size-cells确定。 |
例子 |
10、name
属性 | name |
---|---|
值类型 | string |
描述 | name属性是一个指定节点名称的字符串。此属性已弃用,不推荐使用。 然而,它可能用于较老的非epapr兼容的设备树中。 操作系统根据节点名的名称组成部分确定节点名(参见2.2.1节)。 |
例子 |
11、device_type
属性 | device_type |
---|---|
值类型 | string |
描述 | 设备类型属性在IEEE 1275中用于描述设备的FCode programming模型。 由于ePAPR没有FCode,该属性的新用途已弃用, 为了与IEEE 1275派生的设备树兼容,它应该只包含在cpu和内存节点上。 |
例子 |
4、中断和中断映射
ePAPR
采用 Open Firmware
中指定的中断树模型表示中断。推荐实践:中断映射,版本 0.9[7]
。在设备树中存在一个逻辑中断树,它表示平台硬件中中断的层次结构和路由。虽然通常被称为中断树,但它在技术上更像是一个有向无环图。
中断源到中断控制器的物理连接在设备树中用 interrupt-parent
属性表示。表示产生中断的设备的节点包含一个 interrupt-parent
属性,该属性有一个 phandle
值,该值指向设备的中断被路由到的设备,通常是一个中断控制器。如果一个产生中断的设备没有 interrupt-parent
属性,那么它的中断父被假定为它的设备树父。
每个产生中断的设备都包含一个中断属性,该属性的值描述了该设备的一个或多个中断源,每个中断源都用称为中断指示符的信息表示。中断指示符的格式和含义是特定于中断域的,也就是说,它依赖于中断域根节点上的属性。中断域的根使用 #interrupt-cells
属性来定义对中断指示符进行编码所需的 u32
值的数量。例如,对于一个 Open PIC
中断控制器,一个中断指示符接受两个 32
位值,并由中断号和中断的级别感知信息组成。
中断域是解释中断指示符的上下文。域的根是一个中断控制器或一个中断连接。
1、一个中断控制器是一个物理设备,它需要一个驱动程序来处理路由到它的中断。它也可以级联到另一个中断域。中断控制器由设备树中该节点上的中断控制器属性的存在来指定。
2、一个中断连接定义了一个中断域和另一个中断域之间的转换。转换基于特定于领域的信息和特定于总线的信息。域之间的转换是通过**interrupt-map
属性**执行的。例如,一个 PCI
控制器设备节点可以是一个中断连接,它定义了从 PCI
中断命名空间( INTA
、INTB
等)到具有中断请求( IRQ
)号的中断控制器的转换。
中断树的根是在中断树的遍历到达一个没有中断属性的中断控制节点,因此没有显式的中断父节点时确定的。
图2-5是一个带有中断父关系的设备树的图示示例。对应的中断树如图2-6所示。
示例如图 2-5
和图 2-6
所示:
-
open-pic
中断控制器是中断树的根。 -
中断树根有三个子设备,它们将中断直接路由到
open-pic
device1
device2
PCI bus controller
-
存在三个中断域,一个根在
open-pic
节点上,一个在PCI
主机桥节点上,一个在PCI-PCI
桥节点上。 -
有两个连接节点,一个在
PCI
主机桥上,一个在PCI-PCI
桥上
1、中断生成设备的属性
1、interrupts
属性 | interrupts |
---|---|
值类型 | prop-encoded-array |
描述 | 设备节点的interrupts属性定义了设备产生的一个或多个中断。 interrupts属性的值由任意数量的中断说明符组成。中断说明符的格式是由中断域根的绑定定义的。 |
例子 | 在open PIC兼容的中断域中,中断指示符的一般定义由两个单元组成:中断数和电平感知信息。 请参阅下面的示例,它定义了一个中断指示符,其中断数为0xA,级别感知编码为8。 interrupts = <0xA 8>; |
2、interrupt-parent
属性 | interrupt-parent |
---|---|
值类型 | phandle |
描述 | 因为中断树中的节点层次结构可能与设备树不匹配,所以可以使用interrupt-parent属性来显式地定义中断父节点。 该值是中断父进程的手柄。如果这个属性在一个设备中缺失,那么它的中断父节点就被假定为它的设备树父节点。 |
例子 |
2、中断控制器的属性
1、#interrupt-cells
属性 | #interrupt-cells |
---|---|
值类型 | u32 |
描述 | #interrupt-cells属性定义了为中断域编码中断指示符所需的单元格数。 |
例子 |
2、interrupt-controller
属性 | interrupt-controller |
---|---|
值类型 | empty |
描述 | 中断控制器属性的存在将节点定义为中断控制器节点。 |
例子 |
3、中断关系属性
一个中断连接节点应该有一个 #interrupt-cells
属性。
1、interrupt-map
属性 | interrupt-map |
---|---|
值类型 | prop-encoded-array |
描述 | interrupt-map是连接一个中断域和一组父中断域的连接节点上的一个属性, 它指定子域中的中断说明符如何映射到它们各自的父域。 中断映射是一个表,其中每一行都是一个映射条目, 包含五个组件:子单元地址、子中断说明符、中断父、父单元地址、父中断说明符。 子设备地址。正在映射的子节点的单元地址。 指定此项所需的 32 位单元数由子节点所在的总线节点的 #address-cell 属性描述。 子中断说明符。正在映射的子节点的中断说明符。 指定此组件所需的 32 位单元数由此节点的 #interrupt-cell 属性(包含中断映射属性的结点节点)描述。 interrupt-parent。一个单一的phandle值,它指向子域映射到的中断父节点。 父设备地址。中断父级域中的设备地址。 指定此地址所需的 32 位单元数由中断父字段所指向的节点的 #addresscells 属性描述。 父中断说明符。父域中的中断说明符。 指定此组件所需的 32 位单元数由此节点的 #interrupt-cell 属性(包含中断映射属性的结点节点)描述。 |
例子 |
注:通过将一个单元地址中断说明符对与中断映射中的子组件相匹配,在中断映射表上执行查找。因为单元中断说明符中的一些字段可能不相关,所以在查找完成之前应用一个掩码。这个掩码在 interrupt-map-mask
属性中定义(请参阅 2.4.3.2
小节)。
注意:子节点和中断父节点都需要定义 #address-cells
和 #interrupt-cells
属性。如果不需要单元地址组件, #address-cells
必须显式地定义为零。
2、interrupt-map-mask
属性 | interrupt-map-mask |
---|---|
值类型 | prop-encoded-array |
描述 | 一个interrupt-map-mask属性是为中断树中的一个节点指定的。 此属性指定一个掩码,该掩码应用于正在interrupt-map属性中指定的表中查找的传入单元中断说明符。 |
例子 |
3、#interrupts-cells
属性 | #interrupts-cells |
---|---|
值类型 | u32 |
描述 | #interrupt-cells属性定义了为中断域编码中断指示符所需的单元格数。 |
例子 |
4、中断映射的例子
图 2-7
显示了带有 PCI
总线控制器的设备树片段的表示,以及描述两个 PCI
插槽( IDSEL 0x11,0x12
)的中断路由的示例中断映射。槽1
和槽 2
的 INTA
, INTB
, INTC
和 INTD
引脚连接到 Open PIC
中断控制器。
-
一个
Open PIC
中断控制器被表示为一个具有中断控制器属性的中断控制器。 -
中断-映射表中的每一行由五个部分组成:一个子单元地址和中断说明符,它被映射到一个具有指定的父单元地址和中断说明符的中断-父节点。
-
例如,中断-映射表的第一行指定槽位1的INTA的映射。该行的组件如下图所示。
- 子单元地址为
0x8800 00
。该值由三个32
位单元格编码,由PCI
控制器的#address-cells
属性(值为3
)的值决定。这三个单元表示PCI
总线绑定所描述的PCI
地址。- 编码包括总线编号 (
0x0 << 16
)、设备编号 (0x11 << 11
) 和功能编号 (0x0 << 8
)。
- 编码包括总线编号 (
- 子中断说明符是1,它指定了
PCI
绑定所描述的INTA
。它采用PCI
控制器的#interrupt-cells
属性(值为1
)指定的一个32
位cell
,该属性是子中断域。 - 中断父进程由一个
phandle
指定,该phandle
指向槽位的中断父进程,即Open PIC
中断控制器。 - 父节点没有单元地址,因为父中断域(
open-pic
节点)的#address-cells
值为0
。 - 父中断指示符是
2 1
。表示中断指示符的单元数(两个单元)由中断父节点(open-pic节点)上的#interrupt-cells
属性决定。- 值
<2 1>
是由Open PIC
中断控制器的设备绑定指定的值(请参见第6.4
节)。值<2>
指定INTA
连接到的中断控制器上的物理中断源编号。值<1>
指定级别/检测编码。
- 值
- 子单元地址为
-
在此示例中,中断映射掩码属性的值为
<0xf800 0 0 7>
。此掩码在中断映射表中执行查找之前应用于子单元中断说明符。 -
示例:为了查找
IDSEL 0x12 (slot 2) INTB
的open pic
中断源号,函数0x3
,将执行以下步骤:- 子单元地址和中断说明符构成值
<0x9300 0 0 2>
。- 地址的编码包括总线号 (
0x0 << 16
)、设备号 (0x12 << 11
) 和函数号 (0x3 << 8
)。 - 中断说明符是
2
,这是按照PCI
绑定对INTB
的编码。
- 地址的编码包括总线号 (
- 应用
interrupt-map-mask
值<0xf800 0 0 7>
,得到的结果为<0x9000 0 0 2>
。 - 该结果在
interrupt-map
表中查找,该表映射到父中断说明符<4 1>
。
- 子单元地址和中断说明符构成值
三、设备节点要求
1、基本设备节点类型
下面几节指定了符合 epapr
的设备树中所需的基本设备节点集的需求。
所有设备树都有一个根节点,以下节点位于所有设备树的根:
- 一个
cpus
节点 - 至少一个
memory
节点
2、Root 节点
设备树有一个根节点,所有其他设备节点都是它的子节点。根节点的全路径为 /
。
3、aliases 节点
一个设备树可能有一个别名节点( aliases
),它定义一个或多个别名属性。别名节点应位于设备树的根,节点名称为别名。
别名节点的每个属性都定义一个别名。属性名指定别名。该属性值指定设备树中节点的完整路径。例如,属性 serial0 = "/simple-bus@fe000000/serial@llc500"
定义别名 serial0
。
别名应为以下字符集中 1
到 31
个字符的小写文本字符串。
别名值是设备路径,并被编码为字符串。该值表示到节点的完整路径,但该路径不需要引用叶节点。
客户端程序可以使用别名属性名作为其字符串值的全部或部分引用完整的设备路径。一个客户端程序,当考虑一个字符串作为一个设备路径时,应该检测和使用别名。
例如:
aliases {
serial0 = "/simple-bus@fe000000/serial@llc500";
ethernet0 = "/simple-bus@fe000000/ethernet@31c000";
}
给定别名 serial0
,客户端程序可以查看 /aliases
节点并确定别名引用设备路径 /simple-bus@fe000000/serial@llc500
。
4、Memory 节点
所有设备树都需要一个内存设备节点,用于描述系统的物理内存布局。如果一个系统有多个内存范围,可以创建多个内存节点,或者可以在单个内存节点的 reg
属性中指定这些范围。
节点名称的命名组件应为内存。
客户端程序可以使用它选择的任何没有使用的内存。但是,在更改用于访问实际页面的存储属性之前,客户端程序负责执行体系结构和实现所需的操作,可能包括从缓存刷新实际页面。引导程序负责确保客户端程序可以安全地访问所有内存(包括内存预留所覆盖的内存),而不采取任何与存储属性更改相关的操作。这是:
not Write Through Required
not Caching Inhibited
Memory Coherence Required
either not Guarded or Guarded (i.e., WIMG = 0b001x)
如果支持 VLE
存储属性,则 VLE=0
。
例如:
给定一个具有以下物理内存布局的 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
的 IO
区域。注意,根节点的 #address-cells
和 #size-cells
属性指定的值为 2
,这意味着需要两个 32
位单元来定义内存节点的 reg
属性的地址和长度。
5、Chosen 节点
所选的节点并不代表系统中的真实设备,而是描述系统固件在运行时选择或指定的参数。它应该是根节点的子节点。
节点名称为 chosen
。
例如:
chosen {
bootargs = “root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200”;
};
兼容性说明:
可能会遇到较旧版本的设备树,其中包含一种已弃用的 stdout-path
属性形式,称为 linux
,stdout-path
。为了兼容,客户端程序可能希望支持 linux
,stdout-path
(如果 stdout-path
属性不存在)。这两个属性的含义和用途是相同的。
6、CPUS 节点
所有设备树都需要一个 cpu
节点。它并不代表系统中的一个真实设备,而是作为子 cpu
节点的容器,子 cpu
节点代表系统cpu。
节点名应为 cpus
。
CPU
节点可能包含多个 CPU
节点共有的属性。
7、CPU 节点
cpu
节点表示一个足够独立的硬件执行块,它能够运行一个操作系统而不干扰可能运行其他操作系统的其他 cpu
。
共享一个 MMU
的硬件线程通常在一个 cpu
节点下表示。如果设计了其他更复杂的 CPU
拓扑,CPU
的绑定必须描述该拓扑(例如不共享 MMU
的线程)。
cpu
和线程通过一个统一的数字空间进行编号,这个数字空间应该尽可能地匹配中断控制器对 cpu
线程的编号。
在 CPU
节点上具有相同值的属性可以放在 CPU
节点上。客户端程序必须首先检查特定的 CPU
节点,但是如果没有找到预期的属性,则应该查看父 CPU
节点。这样可以减少对属性的详细表示,这些属性在所有 cpu
上都是相同的。
每个 cpu
节点名称应为 cpu
。
1、CPU 节点通用属性
CPU
节点的基本属性如下表所示。表 3-6
中描述的一些属性是具有特定适用细节的选择标准属性。
兼容性说明:
可能会遇到在 CPU
节点上包含总线频率属性的旧版本的设备树。为了兼容性,客户端程序可能希望支持总线频率。格式与 clock-frequency
相同。推荐的做法是使用时钟频率属性表示总线节点上总线的频率。
2、TLB 属性
cpu
节点的以下属性描述了处理器 MMU
中的翻译备查缓冲区。
3、L1 属性
cpu
节点的以下属性描述了处理器的内部 (L1
)缓存。
兼容性说明:
可能会遇到包含被称为 l2-cache
的下一级缓存属性已弃用形式的旧版本的设备树。为了兼容性,如果没有下一级缓存属性,客户端程序可能希望支持 l2-cache
。这两个属性的含义和用途是相同的。
例如:
下面是具有一个子 cpu
节点的 cpus
节点的示例:
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
device_type = "cpu";
reg = <0>;
d-cache-block-size = <32>;
i-cache-block-size = <32>;
d-cache-size = <0x8000>;
i-cache-size = <0x8000>;
// L1 - 32 bytes // L1 - 32 bytes // L1, 32K // L1, 32K
timebase-frequency = <82500000>; // 82.5 MHz
clock-frequency = <825000000>; // 825 MHz
};
};
8、多级和共享缓存
处理器和系统可以实现额外的缓存层次结构,例如,第二级( L2
)或第三级( L3
)缓存。这些缓存可能与 CPU
紧密集成,也可能在多个 CPU
之间共享。
具有兼容值的设备节点描述了这些类型的缓存。
缓存节点应该定义一个 phandle
属性,所有与缓存关联或共享缓存的 cpu
节点或缓存节点都应该包含一个下一级缓存属性,指定缓存节点的 phandle
。
缓存节点可以在 CPU
节点或设备树中任何其他适当的位置下表示。
多层和共享缓存用表 3-9
中的属性表示。L1
缓存的属性说明如表 3-8
所示。
例如:
下面是两个 cpu
的设备树表示,每个 cpu
都有自己的片上 L2
和共享的 L3
。
四、客户端程序映像格式
五、客户端程序启动要求
六、设备绑定
注:重点(描述具体设备的绑定)。