在嵌入式SOC中,PCIe的RC一般是厂商各自的,RC代码位于 drivers/pci/controller/
下, 在嵌入式环境下,一般就会使用设备树,这个和x86环境不同。
记录一个关于PCIe RC设备树节点属性ranges
example:
amba_pl: amba_pl@0 {
#address-cells = <2>;
#size-cells = <2>;
compatible = "simple-bus";
ranges ;
pcie_dma_versal_0: axi-pcie@80000000 {
#address-cells = <3>;
#interrupt-cells = <1>;
#size-cells = <2>;
compatible = "xlnx,qdma-host-3.00";
device_type = "pci";
interrupt-map = <0 0 0 1 &psv_pcie_intc_0 1>, <0 0 0 2 &psv_pcie_intc_0 2>, <0 0 0 3 &psv_pcie_intc_0 3>, <0 0 0 4 &psv_pcie_intc_0 4>;
interrupt-map-mask = <0 0 0 7>;
interrupt-names = "misc", "msi0", "msi1";
interrupt-parent = <&gic>;
interrupts = <0 84 4 0 85 4 0 86 4>;
ranges = <0x02000000 0x00000000 0xA8000000 0x0 0xA8000000 0x00000000 0x100000>;
reg = <0x0 0x90000000 0x0 0x5000>,
<0x0 0x80000000 0x0 0x1000000>;
reg-names = "breg", "cfg";
psv_pcie_intc_0: interrupt-controller {
#address-cells = <0>;
#interrupt-cells = <1>;
interrupt-controller ;
};
};
};
ranges 一般是用来表示地址转换的,ranges = <local_address parent_address address_size>
,但是在PCIe RC这里就不同,用法有些变化
bus-range = <2 3>; 该设备(一般为RC)下的pci总线号范围
ranges = <0x2000000 0x0 0xc0000000 0 0xc0000000 0x0 0x20000000
0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>;
ranges表示资源配置信息,7个元素为一组,第一个元素表示属性,第二个和第三个为pci域地址, 第四个和第五个为CPU域地址空间,第六个和第七个为size,表示设备将访问CPU域的地址时,将转化到pci域的地址。 上例中地址映射符合一般的一一对应映射。 元素属性暂不知如何理解