ranges 属性详解设备树内容为:
cpcie3x2: pcie@fe160000 {
compatible = "rockchip,rk3588-pcie", "snps,dw-pcie";
#address-cells = <3>;
#size-cells = <2>;
bus-range = <0x10 0x1f>;
clocks = <&cru ACLK_PCIE_2L_MSTR>, <&cru ACLK_PCIE_2L_SLV>,
<&cru ACLK_PCIE_2L_DBI>, <&cru PCLK_PCIE_2L>,
<&cru CLK_PCIE_AUX1>, <&cru CLK_PCIE2L_PIPE>;
clock-names = "aclk_mst", "aclk_slv",
"aclk_dbi", "pclk",
"aux", "pipe";
device_type = "pci";
interrupts = <GIC_SPI 258 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 257 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 255 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 254 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "sys", "pmc", "msg", "legacy", "err";
#interrupt-cells = <1>;
interrupt-map-mask = <0 0 0 7>;
interrupt-map = <0 0 0 1 &pcie3x2_intc 0>,
<0 0 0 2 &pcie3x2_intc 1>,
<0 0 0 3 &pcie3x2_intc 2>,
<0 0 0 4 &pcie3x2_intc 3>;
linux,pci-domain = <1>;
num-ib-windows = <16>;
num-ob-windows = <16>;
num-viewport = <8>;
max-link-speed = <3>;
msi-map = <0x1000 &its1 0x1000 0x1000>;
num-lanes = <2>;
phys = <&pcie30phy>;
phy-names = "pcie-phy";
power-domains = <&power RK3588_PD_PCIE>;
ranges = <0x00000800 0x0 0xf1000000 0x0 0xf1000000 0x0 0x100000
0x81000000 0x0 0xf1100000 0x0 0xf1100000 0x0 0x100000
0x82000000 0x0 0xf1200000 0x0 0xf1200000 0x0 0xe00000
0xc3000000 0x9 0x40000000 0x9 0x40000000 0x0 0x40000000>;
reg = <0x0 0xfe160000 0x0 0x10000>,
<0xa 0x40400000 0x0 0x400000>;
reg-names = "pcie-apb", "pcie-dbi";
resets = <&cru SRST_PCIE1_POWER_UP>, <&cru SRST_P_PCIE1>;
reset-names = "pcie", "periph";
rockchip,pipe-grf = <&php_grf>;
status = "disabled";
pcie3x2_intc: legacy-interrupt-controller {
interrupt-controller;
#address-cells = <0>;
#interrupt-cells = <1>;
interrupt-parent = <&gic>;
interrupts = <GIC_SPI 255 IRQ_TYPE_EDGE_RISING>;
};
};
相关链接:https://elinux.org/Device_Tree_Usage#PCI_Host_Bridge
ranges 属性定义了PCIe控制器的地址空间映射关系,它描述了PCIe总线地址空间如何映射到系统的物理地址空间。在Rockchip RK3588的这个PCIe 3.0 x2控制器中,定义了4个地址空间映射条目。
ranges 属性格式每个映射条目采用以下格式:
<属性32bit> <PCI地址> <PCI地址高位> <CPU地址> <CPU地址高位> <大小> <大小高位>
其中:
<PCI地址>: 3个单元(由#address-cells = <3>决定)<CPU地址>: 2个单元(由父节点的#address-cells决定)<大小>: 2个单元(由#size-cells = <2>决定)0x00000800 0x0 0xf1000000 0x0 0xf1000000 0x0 0x100000
0x00000800 (类型标志为0,表示配置空间)0xf1000000到0xf10fffff (1MB)0x81000000 0x0 0xf1100000 0x0 0xf1100000 0x0 0x100000
0x81000000 (类型标志为0x81000000,表示I/O空间)0xf1100000到0xf11fffff (1MB)0x82000000 0x0 0xf1200000 0x0 0xf1200000 0x0 0xe00000
0x82000000 (类型标志为0x82000000,表示32位内存空间)0xf1200000到0xf1ffffff (14MB)0xc3000000 0x9 0x40000000 0x9 0x40000000 0x0 0x40000000
0xc3000000 0x9 (类型标志为0xc3000000,表示64位内存空间)0x940000000到0x97fffffff (1GB)每个映射条目的第一个32位值包含类型标志:
00: 配置空间01: I/O空间10: 32位内存空间11: 64位内存空间这些映射使得:
0xf1000000开始的地址访问PCIe配置空间0xf1100000区域0xf1200000区域0x940000000区域这样的设计允许PCIe设备与CPU之间高效地进行数据交换,同时保持地址空间的隔离和安全性。
本文作者:Ryohei010
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!