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 EP 出站配置方法

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1513663/am5728-inquiry-on-pcie-ep-outbound-configuration-method

器件型号:AM5728

工具/软件:

您好:
我目前正在努力使用 AM5728配置 PCIe 端点(EP)、将基于 Windows 的 PC 设置为根复合体(RC)。 我正在开发一个使用出站配置将数据从 AM5728传输到 PC 的示例。

目前、出站窗口的基地址设置为 AM5728的内部 RAM (0x4040_0000)、目标地址配置为 Windows 端 bar2的物理地址、如设备管理器(0x7410_0000)所示。

将数据写入内部 RAM 并触发 EDMA 进行传输后、我希望 PC 端的数据得到更新。 但是、数据似乎没有更新。

作为参考、我已确认入站配置(在不同的 BAR 区域)工作正常。

我希望您能协助您查看和更正出站设置。

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

    尊敬的 Daewon:

    您能否分享您正在使用的 SDK 版本? 您使用的是 Linux 吗?

    -Josue

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

    目前、我们正在使用 PDK 已将裸机级 SBL 配置为一个单独的工程、并仅使用电路板、CSL、drv 和 osal 库。 我们未使用 TI-RTOS 或 Linux。

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

    当前输入的值对应于图中的所选区域、即0x7410_0000 (bar2)。

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

    尊敬的 Daewon:

    您能尝试在触发 EDMA 之前对 AM57端的高速缓存进行刷新吗? 然后在读取存储器之前在 Windows PC 端执行缓存无效?

    只需确保数据不会卡在缓存中、并且数据会正确传播到存储器。

    此致、

    Takuma

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

    我实施了一个按图中所示顺序执行数据交换的示例。
    在 EP 端、将执行缓存取消验证。 在 PC 端、不会应用缓存无效、因为在这种情况下通常不需要缓存无效。
    在触发 EP 侧的 EDMA 后、我还确认错误状态寄存器中没有报告错误。
    我也会尝试在 PC 端应用缓存无效。

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

    尊敬的 Daewon:

    我也会尝试在 PC 端应用缓存无效。

    以防万一。  

    查看顺序图、对问题进行故障排除、是否执行了检查 、以验证 EP 是否从顶部第三个块中的 BAR0正确读取了 bar2地址、并检查确认 EP 是否正确写入了底部向上四个块中的 bar2地址?

    此致、

    Takuma

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

    为了验证通过 BAR0读取的 bar2物理地址是否正确、需要建立通信。 因此、我们当前正在直接通过调试端口读取值。
    因此、我们已经确认地址与器件驱动程序的输出相匹配、并且我们将继续使用该地址作为目标地址。
    此外、关于您提到的 PC 端的缓存无效- Windows 似乎不提供对此的明确支持。
    如果您知道另一种方法、请与我们分享、我们将不胜感激。

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

    尊敬的 Daewon:

    我不太熟悉 Windows 处理缓存的方法。 但是、我可以指出一些有关 Linux 的材料:

    具体而言、此幻灯片:

    而这张幻灯片:

    至于一些实验、您能尝试不使用 EDMA 吗? 如果直接 CPU 写入工作正常、则会使 EDMA 设置并缓存更可疑。

    此致、

    Takuma

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

    方框图链接

    我还没有按照您的建议继续在 Windows 上执行缓存无效、因为我没有找到它的工作方法。

    此外、我尝试执行出站(OB)转接 DMA 的读取 、方法是直接将数据写入目标的 bar2物理地址。 但是、这会导致固件进入异常状态。

    作为参考、我会分享我编写的 PCIe 初始化代码的方框图。 配置值(尤其是出站窗口的配置值)已包含在图中。 如果您发现任何不正确或配置错误、我非常感谢您的反馈。

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

    尊敬的 Daewon:

    此外、我尝试执行出站(OB)传输 DMA 的读取 、方法是直接将数据写入目标的 bar2物理地址。 但是、这会导致固件进入异常状态。

    这有点出乎意料。 在不使用 DMA 的情况下、应该可以进行读取/写入、尽管其效率会降低一些... 除非硬件存在限制、因此有必要使用 EDMA 将数据封装成 PCIe 可理解的格式。

    在任何情况下、都有一些旧的 PCIe 应用手册、其中包含一些用于设置 PCIe 和通过 EDMA 进行传输的伪代码示例。 如果您尚未通读它们、我建议您仔细阅读它们并将其与您的代码进行比较:

    按 Ctrl+F 选择"示例"、这应将您指向包含示例的应用手册中分散的位置。

    此致、

    Takuma

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

    查看数据表和 CSL 环回示例后、我发现我忽略了 PCIE_SS1区域。
    CSL 示例为入站和出站传输设置了 BAR0、并确认它是一个环回示例。
    在此示例中、BAR 配置如下:

    [BAR0配置]
     locationParam.location = pcie_location_local;
     locationParam.outboundCfgOffset = outbound_CFG_OFFSET;

     barParams.barAddrSize = pcie_bar_ADDR_SIZE_32位;
     barParams.barType = pcie_bar_type_memory;
     barParams.enableBar = pcie_config_enable;
     barParams.enablePrefetch = pcie_config_enable;
     barParams.lowerBarMask = inball_pcie_limit;
     barParams.lowebaseAddr = inball_pcie_address;//(0xA0000000)外部存储器
     barParams.upperBarMask = pcie_upper_address;
     barParams.upperBaseAddr = PCIE_UPPER_ADDRESS;

    [BAR0出站]
     locationParams.location = pcie_location_local;

     regionParams.regionDir = pcie_ATU_region_DIR_outbound;
     regionParams.tlpType = PCIE_TLP_TYPE_MEM;
     regionParams.enableRegion = pcie_config_enable;

     regionParams.lowebaseAddr = bout_MEM_space;//(0x05000000) PCIE_SS1偏移??
     regionParams.upperBaseAddr = PCIE_UPPER_ADDRESS;
     regionParams.regionWindowSize = output_MEM_space_limit;

     regionParams.lowerTargetAddr = outbout_pcie_address;//(0xB0000000)外部存储器
     regionParams.upperTargetAddr = pcie_upper_address;

    [BAR0入站]
     regionParams.regionDir = pcie_ATU_region_DIR_inbound;
     regionParams.tlpType = PCIE_TLP_TYPE_MEM;
     regionParams.enableRegion = pcie_config_enable;
     regionParams.matchMode = PCIE_ATU_REGION_MATCH_MODE_BAR;
     regionParams.barNumber = 0;

     regionParams.lowebaseAddr = inball_pcie_address;//(0xA0000000)外部存储器
     regionParams.upperBaseAddr = PCIE_UPPER_ADDRESS;
     regionParams.regionWindowSize = inball_pcie_limit;

     regionParams.lowerTargetAddr = RX_DATA_BUFFER_ADDR;//(0x90000000)外部存储器
     regionParams.upperTargetAddr = pcie_upper_address;

    关于这个例子,我的问题是:
    虽然这是一个环回示例、但如果我想实现一个 RC 是 PC 且 EP 是 AM5728的示例、如何调整地址映射?

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

    尊敬的 Daewon:

    对于作为 RC 的 PC 和作为 AM5728的 EP、您是否参考了 https://www.ti.com/lit/an/sprabk8/sprabk8.pdf 的"5 PCIe 编程示例"一节 ?

    应该有两个单独的示例、一个用于 RC、另一个用于 EP。 我认为 AM5728可遵循 EP 端示例、而 RC 侧则可开发与应用手册中类似的应用。

    此致、

    Takuma