编辑
2025-03-26
内核设备树
0
请注意,本文编写于 290 天前,最后修改于 290 天前,其中某些信息可能已经过时。

目录

PCIe ranges 属性详解
ranges 属性格式
四个映射条目解析
1. 配置空间映射
2. I/O空间映射
3. 内存空间映射(32位)
4. 内存空间映射(64位)
类型标志解释
实际应用

PCIe ranges 属性详解

设备树内容为:

c
pcie3x2: 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>决定)

四个映射条目解析

1. 配置空间映射

0x00000800 0x0 0xf1000000 0x0 0xf1000000 0x0 0x100000
  • 属性: 0x00000800 (类型标志为0,表示配置空间)
  • CPU物理地址: 0xf10000000xf10fffff (1MB)
  • 作用: 映射PCIe设备的配置空间,用于访问PCIe设备的配置寄存器

2. I/O空间映射

0x81000000 0x0 0xf1100000 0x0 0xf1100000 0x0 0x100000
  • 属性: 0x81000000 (类型标志为0x81000000,表示I/O空间)
  • CPU物理地址: 0xf11000000xf11fffff (1MB)
  • 作用: 映射PCIe设备的I/O空间,用于传统的端口I/O操作

3. 内存空间映射(32位)

0x82000000 0x0 0xf1200000 0x0 0xf1200000 0x0 0xe00000
  • 属性: 0x82000000 (类型标志为0x82000000,表示32位内存空间)
  • CPU物理地址: 0xf12000000xf1ffffff (14MB)
  • 作用: 映射PCIe设备的32位内存空间,用于设备的内存映射I/O(MMIO)

4. 内存空间映射(64位)

0xc3000000 0x9 0x40000000 0x9 0x40000000 0x0 0x40000000
  • 属性: 0xc3000000 0x9 (类型标志为0xc3000000,表示64位内存空间)
  • CPU物理地址: 0x9400000000x97fffffff (1GB)
  • 作用: 映射PCIe设备的64位内存空间,支持大容量内存映射

类型标志解释

每个映射条目的第一个32位值包含类型标志:

  • bit[24]: 预取标志(1=可预取,0=不可预取)
  • bit[25:28]: 保留
  • bit[29:30]: 空间类型
    • 00: 配置空间
    • 01: I/O空间
    • 10: 32位内存空间
    • 11: 64位内存空间
  • bit[31]: 1表示这是一个相对于PCI域基址的相对地址

实际应用

这些映射使得:

  1. CPU可以通过0xf1000000开始的地址访问PCIe配置空间
  2. PCIe设备的I/O操作会被映射到0xf1100000区域
  3. 32位内存请求映射到0xf1200000区域
  4. 64位大内存请求映射到0x940000000区域

这样的设计允许PCIe设备与CPU之间高效地进行数据交换,同时保持地址空间的隔离和安全性。

本文作者:Ryohei010

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!