工具与软件:
在我们基于 AM6442的产品中、当 Linux 内核启动时、我们会看到意外的 PCIe 条分配错误、由于连接的 PCIe 端点按预期工作、故障似乎不会很严重。 然而、由于我们正在设计和开发用于工业 目的的稳健产品、因此我们的目标是找出确切的根本原因并了解这种故障。
我们的初步调查表明、该故障是由于 k3-am64-main.dtsi 描述中 PCIe 节点(pcie0_RC)的 DMA 范围定义所致、dma-range 定义为"dma-ranges =<0x02000000 0x0 0x0 0x0 0x0 0x0 0x0 0x00000010 0x0>"此定义预计会在系统上映射地址空间和 AUF RAM 达64GB。 这仍然起作用的原因是 Linux 内核 PCIe 栈决定忽略并回收此类 虚假分配。
您能否向我们解释一下进入此 DMA 范围背后的原因、以及这在 父级总线上的预期映射位置? 此外、在研究所使用的 Cadence 驱动程序(drivers/pci/ controller/cadence/pcie -cadence-host.c)时、可以看到 dma 范围和 cdn、no-bar-match-nbits 属性互斥、因此不需要其中一个属性、实际上、如果我们删除 dma-ranges 属性、PCIe 仍按预期工作、而 bar 0分配错误不存在。
已删除日志:
存在 DMA 范围时的情况:
[ 1.553386] j721e-pcie f102000.pcie:主机桥接器/bus@f4000/pcie@f102000范围:
[ 1.560120] mmcblk0:p1
[ 1.565353] j721e-pcie f102000.pcie:io 0x0068001000..0x0068010fff -> 0x0068001000
[ 1.568960] mmcblk0boot0:mmc0:0001 DG4008 4.00MIB
[ 1.575944] j721e-PCIe f102000.PCIe:MEM 0x0068011000..0x006fffff -> 0x0068011000
[ 1.582266] mmcblk0boot1:mmc0:0001 DG4008 4.00MiB
[ 1.588928] j721e-pcie f102000.pcie:IB MEM 0x0000000000..0x00ffffff -> 0x0000000000
[ 1.595361] mmcblk0rpmb:mmc0:0001 DG4008 4.00 MiB、chardev (243:0)
[ 1.811743] j721e-pcie f102000.pcie:链路接通
[1.816568] j721e-pcie f102000.pcie:PCI 主机桥接器至总线0000:00
[ 1.822874] PCI_BUS 0000:00:根总线资源[总线00-ff]
[ 1.828366] PCI_BUS 0000:00:根总线资源[IO 0x0000-0FFFFF](总线地址[0x68001000-0x68010fff])
[ 1.837858] PCI_BUS 0000:00:根总线资源[mem 0x68011000-0x6fffff]
[ 1.844766] PCI 0000:00:00.0:[104C:b01]类型01类0x060400
[ 1.850782] PCI 0000:00:00.0:reg 0x10:[MEM 0x00000000-0xffffffff 64位 pref]
[ 1.858078] PCI 0000:00:00.0:支持 D1
[ 1.862086] PCI 0000:00:00.0:D0 D1 D3hot 支持 PME#
[ 1.869889] PCI 0000:00:00.0:桥配置无效([bus 00-00])、重新配置
[ 1.878099] PCI 0000:01:00.0:[17cb:1109]类型00类0x028000
[ 1.884153] PCI 0000:01:00.0:寄存器0x10:[MEM 0x00000000-0x001fff 64位]
[1.891193] PCI 0000:01:00.0:D0 D3hot D3cold 支持 PME#
[ 1.897368] PCI 0000:01:00.0:4.000 Gb/s 可用 GT GT 带宽、受5.0 Gb/s PCIe x1链路(在0000:00:00.0处)限制(使用8.0 Gb/s PCIe x2链路时能够实现15.752 Gb/s)
[ 1.923745] PCI_BUS 0000:01:Busn_res:[bus 01-ff] END 更新为01
[ 1.930413] PCI 0000:00:00.0:bar 0:没有空间用于[mem size 0x100000000 64位 pref]
[ 1.938071] PCI 0000:00:00.0:bar 0:无法分配[mem size 0x100000000 64位 pref]
[ 1.946074] PCI 0000:00:00.0:bar 8:已分配[mem 0x68200000-0x683fff]
[ 1.952862] PCI 0000:01:00.0:bar 0:已分配[mem 0x68200000-0x683fff 64位]
[1.960186] PCI 0000:00:00.0:PCI 桥接至[总线01]
[ 1.965150] PCI 0000:00:00.0:桥接窗口[mem 0x68200000-0x683fff]
删除 DMA 范围时的情况:
[ 1.580175] j721e-pcie f102000.pcie:主机桥/bus@f4000/pcie@f102000范围:
[ 1.587659] j721e-pcie f102000.pcie:io 0x0068001000..0x0068010fff -> 0x0068001000
[ 1.595758] j721e-PCIe f102000.PCIe:MEM 0x0068011000..0x006fffff -> 0x0068011000
[1.815096] j721e-pcie f102000.pcie:链路接通
[1.819921] j721e-pcie f102000.pcie:PCI 主机桥接至总线0000:00
[1.826230] PCI_BUS 0000:00:根总线资源[总线00-ff]
[ 1.831740] PCI_BUS 0000:00:根总线资源[IO 0x0000-0FFFFF](总线地址[0x68001000-0x68010fff])
[ 1.841211] PCI_BUS 0000:00:根总线资源[mem 0x68011000-0x6fffff]
[ 1.848117] PCI 0000:00:00.0:[104C:b010]类型01类0x060400
[1.854209] PCI 0000:00:00.0:支持 D1
[1.858221] PCI 0000:00:00.0:D0 D1 D3hot 支持 PME#
[ 1.866014] PCI 0000:00:00.0:桥配置无效([bus 00-00])、重新配置
[ 1.874206] PCI 0000:01:00.0:[17cb:1109]类型00类0x028000
[ 1.880259] PCI 0000:01:00.0:寄存器0x10:[MEM 0x00000000-0x001fff 64位]
[1.887298] PCI 0000:01:00.0:D0 D3hot D3cold 支持 PME#
[ 1.893463] PCI 0000:01:00.0:4.000 Gb/s 可用 GT GT 带宽、受限于5.0 Gb/s PCIe x1链路(在0000:00:00.0处)(使用8.0 Gb/s PCIe x2链路时能够支持15.752 Gb/s)
[ 1.919114] PCI_BUS 0000:01:Busn_res:[bus 01-ff] END 更新为01
[ 1.925772] PCI 0000:00:00.0:bar 8:已分配[mem 0x68200000-0x683fff]
[ 1.932581] PCI 0000:01:00.0:bar 0:已分配[mem 0x68200000-0x683fff 64位]
[1.939905] PCI 0000:00:00.0:PCI 桥接至[总线01]
[ 1.944869] PCI 0000:00:00.0:桥接窗口[mem 0x68200000-0x683fff]
提前感谢您的宝贵支持!
此致、
Aleksandar