任何人都可以解释范围属性中的每个值代表什么。
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>;
}
任何人都可以解释范围属性中的每个值代表什么。
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>;
}
这个问题已经提出了一段时间,但我遇到了同样的问题,并在搜索了一段时间后找到了答案。
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>;
这是来自文档:
ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet
1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash