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.

[参考译文] RTOS/TMS320C6678:PCIe 根复合体配置/示例

Guru**** 2582405 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/632469/rtos-tms320c6678-pcie-root-complex-configuration-examples

器件型号:TMS320C6678

工具/软件:TI-RTOS

您好!

我们设计了一个类似于 C6678 EVM 的系统、其中 C6678 DSP 通过 PCIe Gen2 x2连接到 Virtex 7 FPGA。 DSP 计划为根复合体侧。

验证 PCIe 连接所需的步骤如下所示:

  • 供应商/子系统供应商 ID
  • 器件/子系统器件 ID
  • 类代码
  • Bar 0内的寄存器偏移量

我们已经成功完成了前3个步骤、但第4个步骤仍然是开放的。

我找到的唯一示例是 在~/ti/pdk_c667x_2_0_7/packages/ti/drv/pcie/example/sample/src/pcie_sample.c 路径中、我不知道如何修改它以读取 BAR0空间寄存器(从 FPGA 端、配置的是64KB 的 BAR0大小)、而不是预定义的出站地址空间(从0x70000000开始)和入站地址空间(从0x90000000开始)。

您能否建议您如何查找所需的示例/修改其来源?

此致

Andranik

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

    我已将您的疑问转发给软件专家。 他们的反馈应发布在此处。

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

    你好!

    有关 PCIe 寻址 www.ti.com/.../sprabk8.pdf、有一份很好的备忘录。

    在您从 FPGA 读取任何内容之前、您必须配置其条形图。 令人困惑的是、所有 TI 示例都是针对这种情况编写的、其中处理器存在于 RC 和 EP 上、而这些处理器确实配置了它们的本地条形图。 这将不起作用。 相反、您必须配置远程 EP、即 FPGA 的 bar。 这与配置 DSP 自己的条形图非常相似、唯一的例外是条形图位置是远程的、如下所示:

    pcieRet_e RetVal;
    pcieBarCfg_t barCfg;
    
    //为
    FPGA 结构中的 Apllication 寄存器和 BRAM 配置条*// BAR0 *
    barCfg.location = pcie_location_remote;
    barCfg.mode = PCIe_EP_MODE;
    barCfg.base = FPGA_BAR0_BASE;
    barCfg.prefetch = PCIe_bar_non_PREF;
    barCfg.type = PCIe_bar_TYPE32;
    barCfg.memSpace = PCIe_bar_MEM_MEM;
    barCfg.idx = 0;
    
    如果(PCIe_RET_OK!=(retval = PCIe_cfgBar (handle、&barCfg)))
    ...
    

    这是如何定义 FPGA_BAR0_BASE 的唯一问题。 可以认为、该条由两个寄存器定义、即基址和基掩码。 当您定义请求的地址范围时、后者被隐式设置。 在设置 FPGA 的 PCIe IP 内核时、需要执行一个步骤来定义条码大小。 下面的某个位置有一个具有计算掩码的窗口。 下图是用于较旧的器件和工具链、您的可能看起来不同、但概念相同:

    如您所见、对于128个字节、需要7个地址位、而这7个 LSB 在掩码中被归零。 相反、带有1的所有高位都可以定义基址本身。 在您的情况下、当您请求64KB 时、掩码将如0xFFF_0000。

    现在、您可能会认为每个传入的 TLP 都与目标条相匹配。 数据包中的地址字段与条掩码进行 AND 运算、结果与条地址进行比较。 如果匹配、则该条已命中、数据包将在该条上被接受。 请参阅示例:

    屏蔽256B 窗口的0xFFF_ff00
    将配置栏设置为0x0000_0200 (写入0x0000_0200):
    0xFFF_FF00
    &0x0000_0200
    = 0x0000_0200
    
    访问示例:
    PCIe 地址0x0000_0224
    &0xFFF_FF00
    0x0000_0200与 BAR 比较
    bar:0x0000_0200 -> bar 冲击
    
    PCIe 地址0x0000_1024
    &0xFFF_FF00
    0x0000_1000与 bar 比较
    bar:0x0000_0200 -> bar not hit
    
    

    您提到过、您正在使用目标为0x70000000的出站地址转换。 这意味着、对 PCIe 地址窗口(0x6000_0000)的访问将转换为0x7000_0000范围、并且您的 TLP 将通过基于0x7000_0000的地址字段到达您的 FPGA。 因此、您必须使用基于0x7000_0000的基址来配置 bar。 想象一下、您希望将您的 BAR0放置在原始位置、然后通过 PCIe_cfgBar()调用将0x7000_0000写入 BAR0。 想象一下、您想要将另一个64KB 窗口定义为 BAR0旁边的 BAR1、然后将 0x7001_0000写入 BAR1、对0x6001_XXXX 的每次访问都将扩展到 BAR1。

    希望这对您有所帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 ragic 在设置 FPGA 方面的详细经验!

    Andranik、该建议是否有用? 问题是否已解决?

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

    感谢您提供完整的过程说明-我们终于测试了 FPGA 到 DSP x2 PCIe 的连接、并能够读取所需的 BAR0寄存器。

    再次感谢您的努力。

    此致

    Andranik