任何人都可以解释范围属性中的每个值代表什么。
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>;
}
答案 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