pcie device tree'range'属性说明

时间:2015-04-24 05:58:54

标签: device-tree

任何人都可以解释范围属性中的每个值代表什么。

my_pcie_0: pcie@10000000 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "mypcie";
device_type = "pcie";
reg = < 0x40000000 0x00100000 >;
ranges = < 0x02000000 0 0xf0000000 0xf00000000 0x0 0x08000000>;
} 

2 个答案:

答案 0 :(得分:4)

这个问题已经存在了一段时间,但我遇到了同样的问题,并在搜索了一段时间后找到了答案。

my_pcie_0: pcie@10000000 {
    #address-cells = <1>;
    #size-cells = <1>;
    compatible = "mypcie";
    device_type = "pcie";
    reg = < 0x40000000 0x00100000 >;
    ranges = < 0x02000000 0 0xf0000000 0xf00000000 0x0 0x08000000>;
} 

在范围字段中,前三个值指定要映射的PCI总线上的地址。

0x02000000 0 0xf0000000

然而,设备树将PCI地址转换视为一种特殊情况,其中第一个值是位域而不是地址。在这种情况下,“0x02000000”将指定一个不可预取的32位存储空间。

这将留下“0 0xf0000000”作为要映射的64位PCI地址的高低部分,因为高部分为0,实际地址为0xf00000000。

第四个值指定CPU总线上用于映射PCI总线段的地址。它在32位处理器上是32位。

0xf00000000

第五个和第六个值指定要映射的段的大小。在这种情况下,128MB段。

0x0 0x08000000

知道这看起来你的单元大小不正确,它们应该是3,地址单元覆盖64位PCI地址值加上32位位域,2位表示64位大小值。 32位大小的CPU地址继承自父级。

#address-cells = <3>;
#size-cells = <2>;

Here's a more in-depth explanation on PCI address translation

答案 1 :(得分:-2)

这来自文档:

ranges = <0 0  0x10100000   0x10000     // Chipselect 1, Ethernet
              1 0  0x10160000   0x10000     // Chipselect 2, i2c controller
              2 0  0x30000000   0x1000000>; // Chipselect 3, NOR Flash