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.

[参考译文] AM5728:PCIe 重新枚举失败

Guru**** 2652475 points

Other Parts Discussed in Thread: AM5728

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/848278/am5728-pcie-re-enumeration-fails

器件型号:AM5728

您好!

这个问题与我们自己的电路板和基于 TI SDK 05.00.00.15的 Linux 有关

我们将 PCIe 总线用作两个单独的链路、连接两个不同的 FPGA 器件、其中 AM5728是 RC。

当我启动系统时、Linux 将检测并枚举这两个 FPGA。 我可以毫无问题地与这些 FPGA 通信。

但我希望能够在 CPU 未复位时在运行时重新配置 FPGA。
我对另一个 CPU 以及从其他用户那里读取的内容如下:
-通过以下方式从发现器件中移除 FPGA EP 器件:
  echo 1 >/sys/bus/pci/devices/0001:01:00.0/ remove     (0001.01.00.0是 FPGA EP 的 id)
-现在重新配置 FPGA
-重新配置 FPGA 时,执行 PCI 重新扫描,方法是:
  echo 1 >/sys/bus/pci/devices/0001:00:00.0/rescan      (0001:00:00.0是 AM5728中网桥的 ID)

通常情况下、应使用 lspci 再次显示 FPGA 以列出所有器件、但情况并非如此。

经过一些调查、我发现 PCIe 控制器的 LTSSM 已禁用、因此我启用了它以查看将发生什么情况。
当我这么做时、我可以再次枚举 FPGA、并使用 lspci 命令再次出现。 但不幸的是、这还不够(正如预期的那样)。
经过进一步调查并阅读用户手册后、我可以看到 PCIe 控制器已复位(PCIe 链路断开复位条件)、并且由于复位、PCIe 桥配置设置为默认值、并且从未在 PCIe 驱动程序中重新编程

我还尝试了 SDK 06.00.00.07、但现在行为发生了变化。

我的问题是、此功能是否有效、如果有效、我应该采取不同的措施。 对于我们来说、对 FPGA 进行重新编程运行时间至关重要、因此重新枚举必须起作用。

此致、
Robert

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

    您好、Robert、

    [引用 USER="Robert Pot"]:使用以下命令从查找器件中删除 FPGA EP 器件:
      echo 1 >/sys/bus/pci/devices/0001:01:00.0/ remove     (0001.01.00.0是 FPGA EP 的 ID)[/quot]

    请在此步骤中移除 RC、而不是移除 EP。

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

    您好!

    感谢您的建议。 我的第一个想法是、这确实会有所帮助、因为您现在移除了网桥、这将强制重新初始化所有内容。

    但不幸的是、这没有帮助、我仍然遇到同样的情况。

    root@am57xx-EVM:~# echo 1 >/sys/bus/pci/devices/0001 \:00\:00.0/删除
    echo 1 >/sys/bus/pci/rescan
    [251.011159] PCI 0001:00:00.0:忽略类0x000000 (与标头类型01不匹配)
    [251.019251] PCI 0001:00:00.0:网桥配置无效([bus 00-00])、重新配置
    [251.031164] PCI:总线1:启用快速背对背传输
    [251.036835] PCI 0001:00:00.0:未为总线0001:01设置网桥

    和 dmesg 的输出:
    [251.011000] PCI_BUS 0000:00:扫描总线
    [251.011041] pcieport 0000:00:00.0:扫描桥后的[bus 01-ff]、通过0
    [251.011055] PCI_BUS 0000:01:扫描总线
    [251.011065] PCI_BUS 0000:01:总线扫描返回时 max = 01
    [251.011078] pcieport 0000:00:00.0:扫描桥后的[bus 01-ff]、pass 1
    [251.011088] PCI_BUS 0000:00:总线扫描返回、最大值=关断
    [251.011107] PCI_BUS 0001:00:扫描总线
    [251.011141] PCI 0001:00:00.0:[104C:888]类型01类0x000000
    [251.011159] PCI 0001:00:00.0:忽略类0x000000 (与标头类型01不匹配)
    [251.018953] PCI 0001:00:00.0:调用 PCI_fixup_ide_Bases+0x0/0x68
    [251.018998] PCI 0001:00:00.0:支持 D1
    [251.019007] PCI 0001:00:00.0:D0 D1 D3hot 支持 PME#
    [251.019017] PCI 0001:00:00.0:PME#已禁用
    [251.019241] PCI 0001:00:00.0:扫描桥后的[bus 00-00]、通过0
    [251.019251] PCI 0001:00:00.0:网桥配置无效([bus 00-00])、重新配置
    [251.031019] PCI 0001:00:00.0:扫描桥后的[bus 00-00]、通过1
    [251.031140] PCI_BUS 0001:01:扫描总线
    [251.031157] PCI_BUS 0001:01:总线固定
    [251.031164] PCI:总线1:启用快速背对背传输
    [251.036799] PCI_BUS 0001:01:总线扫描返回时 max = 01
    [251.036811] PCI_bus 0001:01:Busn_res:[bus 01-ff] end 更新为01
    [251.036823] PCI_BUS 0001:00:总线扫描返回时 max = 01
    [251.036835] PCI 0001:00:00.0:未为总线0001:01设置网桥

    当您执行删除和重新扫描时、它会起作用、但这不会重置 RC。
    加载 FPGA 中的新映像后、PCIe 链路消失、RC 桥接器复位、您将得到上述行为。

    您的建议是否适用于其他客户?

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

    [报价用户="Robert Pot"]您的建议是否适用于其他客户?[/quot]

    是的、请检查以下链接。

    https://e2e.ti.com/support/processors/f/791/p/745415/2759411#2759411

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

    感谢您的链接、但这是另一种情况。 在这种情况下、CPU 和端点之间使用来自 PLX 的 PCI 桥。 在这种情况下、CPU 上的 phy 链路从未消失、移除 phy 链路会导致 RC 中的所有寄存器复位。

    同样,在我的情况下,如果在 CPU 上的 Linux 启动期间尚未配置 FPGA,并且稍后配置 FPGA,则重新扫描(使用“echo 1 >/sys/bus/pci/rescan”)会导致工作情况。

    当您的配置正常且 FPGA 已重新编程时、会出现此问题、这会导致 CPU 和 FPGA 之间的 phy 链路消失、直至 FPGA 重新生成。

    此致、
    Robert

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

    Robert、

    PCIe 基本上不支持热插拔。 我不确定是什么导致您的 FPGA 设置出现问题。 但是、如果您将此 FPGA EP 插入其他 RC、例如 PC、您描述的方案是否起作用?

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

    您好、Bin、

    我们还有另一个产品、我们也在使用 NXP CPU、但这可以正常工作。 但我承认、这里还有一个 CPU 和 FPGA 之间的 PCIe 开关。
    这是使用 AM5728的原因之一、因为它具有2个 PCIe 总线、因此无需为我们使用 PCIe 开关。

    当我在 https://e2e.ti.com/support/processors/f/791/p/585029/2153006中阅读答案时 、有一条注释"根复合体当前不会重新扫描。 它预计终点 已经在上升。" 如果情况仍然如此、这意味着我无法使其正常工作?

    我认为原因如下、如用户手册中所述:

    "PCIe 链路断开复位条件-当 PCIe 链路断开并再次上升时、即
    从 D3COLD / L3转换回 D0、PCIe 内核自动应用此内部基本复位和
    链接后报告 IRQ 事件(PCIECTRL_TI_CONF_IRQSTATUS_MAIN[11] LINK_REQ_RST)。 "

    问题是、Linux 驱动程序不会处理上述复位条件、因为 PCIe 内核中的许多寄存器在该事件后保持其复位值。 它们仅在启动时进行编程。

    此致、
    Robert

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

    您好!

    当前的情况是、我更改了驱动程序、以便在链路丢失时重新配置 PCIe 桥。

    虽然我不确定这是否在所有情况下都正确、但这似乎是有效的。 例如、处理 MSI 中断很可能不正确、但这是以后的问题。

    现在我已经完成了。