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.

[参考译文] TDA2xx:ProcessorSDK 3.01 PDK PCIe 示例/PCIe 优化

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/671051/tda2xx-processorsdk-3-01-pdk-pcie-example-pcie-optimization

您好!

我目前正在尝试优化两个 TDA2xx 之间的 PCIe 传输。 我正在运行的测试可在此处找到:" \ti_componels\drivers\pdk_01_08_00_16\packages/ti\csl\examples\pce"。 一个 TDA2xx 用作 RC、另一个用作 EP。 该测试将16MB 的数据从 RC 发送到 EP、然后数据从 EP 环回 RC、并在此处与原始数据进行比较。 如果这些相同、则测试成功。 系统 EDMA 用于执行传输。

在当前状态下进行的测试中、未经任何修改即表明、当 RC 和 EP 均利用 Gen2传输速度时、PCIe 吞吐量为370Mbps。

阅读完一些文档后、我发现为了实现最佳性能、需要满足以下要求:

1) 1)设置 EDMA 传输参数、以便传输控制器提交尽可能少的传输请求

2) 2) EDMA TC 默认突发大小等于 PCIe 有效载荷大小

至于项目符号1)、我提到了这个表(在 SPRAC21中)。

在测试中、使用系统 EDMA 的 TC0。 我之前使用过 EDMA、因此我能够对(A/B/C) CNT 值进行实验。 例如、具有 ACNT=16K、BCNT=16M/16K 和 CCNT=1的原始测试(不符合上表)给出了370Mbps 的吞吐量。 当我将值设置为 ACNT=128、BCNT=128和 CCNT=1024 (这在表中是建议的)时、我得到的是330Mbps、更糟糕的情况。 我还应该尝试哪些仅涉及传输参数的操作?

关于项目符号2)、这是我需要澄清的地方。

-我无法确认 EDMA 的 TC0确实正在使用128B 的 DBS,我发现它在" \ti_componations\drivers\pdk_01_08_00_16\packages/ti\cSL\soc \tda2xx\hw_ctrl_core.h" CTRL_core_control_io_1_tC0_default_burst_size_mask 宏定义。 它不在任何地方使用、我不知道在哪里找到用于配置 TC 的代码。

-当我们说 PCIe 有效载荷大小时、这是否意味着它是在 TLP 中发送的数据的大小、不包括添加到其中的标头? 此外、在哪里可以设置 PCIe 传输的有效载荷大小? 我想它最多可以是128B、我根据 SPRABK5B 中的这个片段得出结论。 我的两个器件都是 KeyStone、它们是否不是(它们是 TDA2xx)?

我目前正在学习 PCIe 及其工作原理、因此请原谅我的困惑。 我只想获得一些帮助来优化这一特定测试、该测试涉及代码中设置所有这些参数的位置以及如何正确设置这些参数。

很抱歉这篇长文章、并提前感谢您。

此致、

Nick

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

    您好、Nick、

    TDA2xx 不是 Keystone 器件。

    据我所知、当 acount=16k、ccount=1、BCount=x 时、EDMA 可提供最佳吞吐量

    让我来看看是否有 EDMA 配置可以提供更好的吞吐量。

    在线提供了大量免费文档、您可以参考这些文档来了解 PCIe 数据包结构。

    此外、您看到的数字也是倾斜的、因为这两者之间有三个 UART 输出。

    您能否按如下方式注释打印内容并尝试:

    //UARTPuts("r: link is up\r\n",-1);
    
    /*配置 PCIe 通信*/
    PcieAppConfigTrafficRemote();
    /*等待内存空间被启用*/
    while (memSpaceEnable != 1U);
    /UARTPuts("r: Mem space is enabled \r)\r
    eTRC(\eRp and transference/eRts'/eRts');/eRts'eRts'/eRts'\eRts'\eRts'/eRts'\eRts'\eRts'\eRts'/eRts'/eRts
    
    

    此致、

    Rishabh

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

    实际上、UART 输出可能会使数字偏移、这不是 RC 侧、因为开始时间是在配置 EDMA 之后和触发传输之前收集的、并且在 RC 验证数据已到达 EP 后收集结束时间、其中没有 UART 输出。 但是、EP 端在 RC 发送数据时进行一些 UART 打印(并且 RC 上的时钟已经开始)、因此如果数据发送速度真的很快、那么在 EP 上打印 UART 可能会显著增加时钟的时间。
    但是、在注释掉 EP 侧的打印内容时、传输速度没有任何变化。

    我遇到的另一件事是收集开始和结束时间。 如上所述、开始时间在 RC 侧的 EDMA 触发之前收集、这很好、但结束时间是在验证数据到达 EP 后收集的。 验证通过轮询 EP 在其 Rx 缓冲器中写入的特定值来完成。 然后收集结束时间。 我在验证之前移动了结束时间集合、但没有任何变化。

    如果您能告诉我在代码中可以在何处设置/验证系统 EDMA TC0的 DBS 以及 PCIe 的有效载荷大小、那将对我非常有帮助。

    提前感谢您。

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

    由于疏忽、我提到了一个较旧版本的示例、其中起始时间戳位于不同的位置。
    突发大小为128字节。 无论如何、这可以通过修改 CTRL_CORE_CONTINL_IO_1寄存器进行配置。
    TDA2xx 具有两个 PCIe 通道。 您可以将 PCIe_number_for_Lanes 修改为2以提高 PCIe 吞吐量。
    在 TDA2xx 上、最大 PCIe 有效载荷大小为256字节、这是在复位时设置的(寄存器 PCIECTRL_RC_DBICS_DEV_CAP)。

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

    我曾讨论过 EDMA 配置。 EDMA 配置似乎是最优化的。
    唯一可能的优化是使缓冲器128字节对齐。

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

    感谢您的建议。 我会尝试这些方法、然后返回给您。

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

    您好、Rishabh、

    下面是我尝试的结果和相应的结果:

    Done:如下声明了 RC 侧的 dataTxBuffer:
    静态易失性 uint32_t dataTxBuffer[data_size_in_word]__attribute__(aligned (128)));
    结果:吞吐量方面没有任何变化。

    完成:在 PCIe_number_for_Lanes 中启用2个通道
    结果:吞吐量方面没有任何变化。

    我目前正在查看此文档: www.ti.com/.../sprac21.pdf。 第78页的是在 X2 Gen2模式下 PCIe 运行时的性能测量值。 对于从 RC 到 EP 的 WR 运行、测得的吞吐量为5966.86Mbps、即~750Mbps (仅供参考、I 获取370MBps)。
    在第76页上、有测量性能的配置。 EDMA 和 PCIe 配置与 PDK 测试中的配置完全相同、因此我假设在测量性能时使用了该测试。 我唯一不确定是否完全相同的配置是计时器配置、您能帮我检查一下吗?

    此外、我更详细地介绍了 PCIe 协议、并想知道上面文档中测量的性能是仅涉及有效载荷的吞吐量还是涉及最终通过 PCIe 链路传输的具有8b/10b 编码的整个数据包。

    此外、如果您可以使用一条和两条通道运行测试、并查看测量的吞吐量是否存在差异、我将不胜感激。

    提前感谢您。

    此致、
    Nick

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

    您好、Nick、

    本文档使用的测试与 PDK 中提供的测试不同。

    在本文档中有两个表。 X1用于单通道、X2用于双通道。

    使用当前系统、您可以获得适用于单通道的370Mbps、文档内容为3013.15Mbps (376.6Mbps)。

    对于双通道、性能肯定会提高(几乎是原来的两倍)。

    您能否再次确认具有双通道 PCIe Gen2的干净构建的吞吐量。

    此致、

    Rishabh

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

    您好、Rishabh、

    我刚刚安装了 clean processor_sdk_vision_03_02_00_00、对 PDK 驱动程序、SBL 和示例进行了纯净构建。 我只在 pcie_app.h 中将 NUMBER_O_of _Lanes 宏定义更改为2、没有其他内容。 仍然没有成功、它说吞吐量为370MBps。

    以下是以下两个内核的控制台输出:



    我不知道问题可能是什么。

    此致、
    Nick

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

    我已查看 EVM 原理图。 TDA2xx EVM 上似乎只有一个 PCIe 通道连接。
    因此、您无法建立双通道通信。
    应用手册中的两个通道编号是通过在芯片验证板上运行 PCIe 测试用例获得的。
    您使用单通道获得的数字几乎与性能说明中给出的数字相同。

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

    您好、Rishabh、

    实际上、我在通过双通道 PCIe 连接两个 SoC 的定制板上进行测试、我查看了我们的原理图。 您是否想说 SoC 内部只有一个通道连接到 PCIe 子系统1、无论是否有2个通道从外部连接到引脚?

    感谢您迄今提供的帮助。

    此致、
    Nick

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

    SoC 支持两个通道。 我将讨论 TDA2xx EVM、它只有一个通道连接到引脚。
    如果您的板上支持两个通道、则需要启用第二个 PHY。
    您能参考电路板的原理图并在 PCIEAppPrcmConfig()中进行相应的更改一下。

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

    您好、Rishabh、

    我非常高兴地通知您、我发现了问题所在。 考虑到您提到的有关 PHY 的提示、我偶然发现了表26-61。 TDA2xx TRM 中的 PCIePHY 子系统低级编程序列(第7274页)。 我发现、为了在 PCIe 子系统1中使用 PDK 的原始测试中未包含的2个通道、还需要执行两个额外的步骤。 它们是:"将 PCIe PHY 配置为×1或×2模式"、"配置 PCIESS2电源控制时钟频率以匹配 SYS_CLK1、以 MHz 为单位"和"加电 PCIESS2_PHY_TX 和 PCIESS2_PHY_RX"。

    在 PCIe_app.c 的 PlatformPCIESS1CtrlConfig()函数的开头设置了这些寄存器中的正确值后、我将获得稳定的740Mbps、接近于 TDA2xx 性能文档中的测量值。

    PlatformPCIESS1CtrlConfig()现在如下所示:

    void PlatformPCIESS1CtrlConfig (void)
    {
    uint32_t regVal;
    
    /*启用 x2模式*/
    regVal = HW_RD_REG32 (
    SoC_SEC_EFUSE_REGISTER_BASE + CTRL_CORE_PCIe_CONTROL);
    
    HW_SET_FIELD32 (regVal、CTRL_CORE_PCIe_CONTRAL_PCIe_B1C0_MODE_SEL、
    0x01U);
    
    HW_WR_REG32 (SOC_SEC_EFUSE_REGISTER_BASE + CTRL_CORE_PCIe_CONTROL、
    regVal);
    
    regVal = HW_RD_REG32 (
    SoC_SEC_EFUSE_REGISTER_BASE + CTRL_CORE_PCIe_CONTROL);
    
    HW_SET_FIELD32 (regVal、CTRL_CORE_PCIe_CONTROL_PCIe_B0_B1_TSYNCEN、
    0x01U);
    
    HW_WR_REG32 (SOC_SEC_EFUSE_REGISTER_BASE + CTRL_CORE_PCIe_CONTROL、
    regVal);
    
    /* PCIeSS1*的控制模块 PWR CTL REG 状态*/
    regVal = HW_RD_REG32 (
    SoC_SEC_EFUSE_REGISTER_BASE + CTRL_CORE_PHY_POWER_PCIESS1);
    
    HW_SET_FIELD32 (regVal、CTRL_CORE_PHY_POWER_PCIESS1_PCIESS1_PWRCTL_CMD、
    0x03U);
    
    HW_SET_FIELD32 (regVal、CTRL_CORE_PHY_POWER_PCIESS1_PCIESS1_PWRCTL_CLKFREQ、
    0x1AU);
    
    HW_WR_REG32 (SOC_SEC_EFUSE_REGISTER_BASE + CTRL_CORE_PHY_POWER_PCIESS1、
    regVal);
    
    /* PCIeSS2*/的控制模块 PWR CTL REG 状态
    regVal = HW_RD_REG32 (
    SoC_SEC_EFUSE_REGISTER_BASE + CTRL_CORE_PHY_POWER_PCIESS2);
    
    HW_SET_FIELD32 (regVal、CTRL_CORE_PHY_POWER_PCIESS2_PCIESS2_PWRCTL_CMD、
    0x03U);
    
    HW_SET_FIELD32 (regVal、CTRL_CORE_PHY_POWER_PCIESS2_PCIESS2_PWRCTL_CLKFREQ、
    0x1AU);
    
    HW_WR_REG32 (SOC_SEC_EFUSE_REGISTER_BASE + CTRL_CORE_PHY_POWER_PCIESS2、
    regVal);
    
    /*设置 PCIeSS1延迟计数*/
    HW_WR_FIELD32 (SOC_SEC_EFUSE_REGISTER_BASE + CTRL_CORE_PCIe_PCS、
    CTRL_CORE_PCIe_PCS_PCIESS1_PCS_RC_DELAY_COUNT、0xF1U);
    /*设置 PCIeSS2延迟计数*/
    HW_WR_FIELD32 (SOC_SEC_EFUSE_REGISTER_BASE + CTRL_CORE_PCIe_PCS、
    CTRL_CORE_PCIe_PCS_PCIESS2_PCS_RC_DELAY_COUNT、0xF1U);
    } 

    我要再次感谢大家的帮助、希望大家在遇到类似问题时也能找到这篇文章。

    此致、
    Nick

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

    很高兴知道您的问题已得到解决。
    感谢您发表详细的回复、让他人受益。
    通过创建新主题、您可以随时提出任何后续问题。

    此致、
    Rishabh