This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM6442:由于 k3-am64-main.dtsi 中的 DMA 存储器范围定义较大、导致 PCIe 条0分配异常

Guru**** 2465930 points
Other Parts Discussed in Thread: AM6442

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1468715/am6442-unexpected-pcie-bar-0-assignment-due-to-large-dma-memory-range-definition-in-the-k3-am64-main-dtsi

器件型号:AM6442

工具与软件:

在我们基于 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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Aleksandar、

    我正在研究它,并将在几天内回到你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Aleksandar、

    我仍在与我们的开发人员讨论此问题、尚未关闭内核日志中的 BAR0故障消息。 我目前的理解是、这一信息具有误导性、可以忽略。 也可以从 devicetree 中删除"dma-ranges"、然后 PCIe 驱动程序会使用"cdns、no-bar-match-nbits"属性来配置相同的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    刘斌、您好!

    感谢您的确认、我们将会这样做、不过我们仍需要 curios 来了解此设备的 dma-ranges 属性的背景以及是否确实需要。 因此、如果您回来提供有关此问题的答案、我们会建议您这样做。

    此致、

    Aleksandar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Aleksandar、

    下面的内核提交可以更好地了解此"dma 范围"设置。 PCIe 驱动程序最初使用"CDN、no-bar-match-nbits"来配置 PCIe 控制器、但之后想要使用标准"dma-ranges"传递地址映射信息、这个补丁也是如此。

    https://github.com/torvalds/linux/commit/5d3d063abb276

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    刘斌、您好!

    是的、我已经看到过此补丁、但无论如何、谢谢您指出。

    该补丁还显示:"

    但是、标准 PCI dt 绑定已经定义了"dma-范围"来
    描述 PCIe 控制器可访问的地址范围。 

    "

    根据 DTS 规格:

    "dma-ranges 属性用于描述存储器映射的直接存储器存取(DMA)结构
    可以从总线发起的 DMA 操作访问其 devicetre 父级的总线。 "

    基于 PCIe 框架确实正在尝试分配定义的空间(64GB)、因此该条目不仅与 Cadence 控制器配置相关、在我的看来、该条目不应该存在此器件、因为我们不会对如此大的范围进行 DMA 处理。 这就是为什么我很渴望你能澄清这一点,因为我可能监督一些东西。

    感谢您的支持!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    例如、我的怀疑是 DMA 范围是否确实需要、但是在这种情况下必须调整或者根本不需要 DMA 范围?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Aleksandar、

    "dma-ranges"配置 PCIe 控制器为 DMA 就绪。 如果您的应用不使用 DMA、那就没有什么坏处。 我认为这里唯一的问题就是由"dma-ranges"引起的令人困惑的内核报文。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在我的视图中、此条目不应存在、因为我们不使用如此大范围的 DMA。

    抱歉、我误读了您的消息。

    "dma 范围"基本上是将整个总线地址映射到系统地址、这似乎是 PCIe 控制器寄存器要求的、我没有深入到控制器硬件规格中。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    例如、我怀疑是否确实需要 DMA 范围、但该范围必须调整或根本不需要?

    我们正在实时聊天、因此我在回复时没有看到此消息...

    从应用的角度来看、我同意只有可用存储器地址是合理的、但我认为用于 DMA 映射的 Cadence PCIe 控制器寄存器需要完整的地址范围。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我以某种方式认为、目的是执行 RP_NO_BAR 配置情况(请参阅:cdns_pci_host_BAR_IB_config)。

    为此、DMA 范围大小必须大于128GB (请参阅 cdns_pci_host_find_max_bar)、至少这就是其他 TI 平台正在做的事情(e、g k3-j721e-main.dtsi)。

    查看   K3-am64-main.dts 中更多的 CDN、no-bar-match-nbits 和 dma-ranges 与  CDN 冲突   、no-bar-match-nbits 对 cdns_pci_host_bar_ib_config 执行 RP_no_bar 情况、dma-ranges 站点执行 BAR0情况(< 128GB)。

    但可能需要推测一下、因为我不是真的阅读 Cadence PCIe RC 规范。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不确定"128GB"、我没有深入阅读 PCIe 驱动程序以对此进行评论。 但是、AM64x 使用大小为"0x10_0000_0000"而其他 J7xx 器件使用"0x10000_0000_0000"的原因是、AM64x 具有36位地址、而 J7xx 具有48位地址。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答、我们可以关闭此案例。

    此致、