Device tree pcie设备树';范围';属性解释

Device tree pcie设备树';范围';属性解释,device-tree,Device Tree,有人能解释ranges属性中的每个值代表什么吗 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 0x080000

有人能解释ranges属性中的每个值代表什么吗

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 {
#地址单元=;
#大小单元格=;
compatible=“mypcie”;
设备类型=“pcie”;
reg=<0x40000000 0x00100000>;
范围=<0x0200000000 0xf0000000 0xf00000000 0x0 0x08000000>;
} 

这来自文档:

ranges = <0 0  0x10100000   0x10000     // Chipselect 1, Ethernet
              1 0  0x10160000   0x10000     // Chipselect 2, i2c controller
              2 0  0x30000000   0x1000000>; // Chipselect 3, NOR Flash
范围=;//芯片选择3,也不闪烁

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

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地址转换视为一种特殊情况,其中第一个值是位字段而不是地址。在这种情况下,“0x020000000”将指定一个不可预取的32位内存空间

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

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

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

0x0 0x08000000
知道这一点后,您的单元大小似乎不正确,因此地址单元的大小应为3,以覆盖64位PCI地址值加上32位字段,而64位大小值应为2。CPU地址的32位大小从父级继承

#address-cells = <3>;
#size-cells = <2>;
#地址单元格=;
#大小单元格=;

文档编制有点晚,但我正在刷新关于这个主题的记忆。这是一个很好的解释
#address-cells = <3>;
#size-cells = <2>;