2

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

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>;
} 
4

2 回答 2

5

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

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。

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

0xf00000000

第五个和六个值指定要映射的段的大小。在本例中为 128MB 段。

0x0 0x08000000

知道这一点,您的单元格大小似乎不正确,地址单元格应为 3 以覆盖 64 位 PCI 地址值加上 32 位位域,而 2 为 64 位大小值。CPU 地址的 32 位大小是从父级继承的。

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

这是关于PCI地址转换的更深入的解释

于 2016-06-07T17:34:51.987 回答
-3

这是来自文档:

ranges = <0 0  0x10100000   0x10000     // Chipselect 1, Ethernet
              1 0  0x10160000   0x10000     // Chipselect 2, i2c controller
              2 0  0x30000000   0x1000000>; // Chipselect 3, NOR Flash
于 2015-04-24T06:03:57.763 回答