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.

[参考译文] c6678 DSP MSI 的问题

Guru**** 2602655 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/649117/problem-of-c6678-dsp-msi

尊敬的 TI 教授:  

  我将 Altera FPGA PCIe 通信与 c6678结合使用、FPGA 用作 EP、DSP 用作 RC.I wanner 意识到 FPGA 控制 AD 转换器可采集数据并将数据保存到 FIFO 中。 当 FIFO 满时、将触发中断向量为0的 MSI、DSP core0接收中断并远程配置 FPGA DMA 寄存器、以将数据从 FPGA FIFO 传输到 DSP DDR3 SDRAM。 当 DMA 触发 DMA 传输结束 MSI 中断向量为1时、DSP core0接收 msi 中断并通知 core1处理数据。

  现在、我的问题是 FPGA 将触发两个 msi 中断、中断矢量是0和1、 core0接收两个 msi 中断 、但显示常见的中断矢量。我查看 PCIe 规范数据表、我发现 MSI 矢量必须继续、msi-x 中断矢量可以停止。但 DSP core0仅接收 msi 矢量是0、8、16和24。这意味着 FPGA 无法向发送两个 msi 中断 DSP。

  我不确定我是否理解这一权利。 您能给我一点关于 DSP core0从 FPGA 接收两个 msi 的想法吗?

  想一想!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    IIRC、支持32个 MSI 矢量、它们均匀分布在所有内核上。 因此、您的 Core0接收矢量0、8、16、24、Core1接收矢量1、 9、17、25、酷睿2接收2、10、 18、26等。 因此、每个内核有4个 MSI 矢量、足以处理"数据就绪"和"传输就绪"事件。 触发多个 MSI 非常简单:FPGA 向'siIrq'所需的矢量写入数据。 因此、您可以写入0和8以触发两个事件。
    我无法在你的信息中解释第二段,请详细说明。
    需要检查的一点是、了解您在 FPGA 配置期间启用了多少个 MSI。 EP 通告其拥有的 MSI 数量、而由 RC 来启用所有的 MSI、或者限制特定数量。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    一种可能的混淆可能是每个内核从 PCIe 子系统接收单个事件、例如 PCIe 子系统事件4、这意味着 Core0有 MSI、0、8、16、24中的一个、 事件#5是 Core1的 MSI、矢量1、9、17、24等。 此事件编号可能是 HWI 触发的来源。 但是、在 ISR 中、您仍然需要查看 mSIN_IRQ_STATUS 寄存器、以了解4个矢量中哪个矢量触发了此事件。

    因此、Core0可以接收 MSI 向量0、8、16、24。 所有四个矢量触发单个事件#4、并且由用户来读取 mSIN_IRQ_STATUS 寄存器并查看设置了哪个位(共4个)。

    希望这对您有所帮助、但请详细说明您的困难。

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

    你好,拉吉克

       感谢您的回复!  我将 FIFO 满中断向量设置为0、DMA 传输完成中断向量设置为8、但 不管 FPGA 发送中断向量是多少、MSI0_IRQ_STATUS 寄存器的值始终为1。  MSI_CAP 寄存器的 MULT_MSG_EN 值为000、MULT_MSG_CAP 值为000。    无法在 FPGA 中更改该值。 我尝试向 MULT_MSG_EN 写入001、但失败了。我不知道这是不是原因。

       此外、我还想知道是否有有关 DSP core0接收两个 msi 中断的示例。

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

    您好、Sunny、

    在我了解这种情况时、EP 会通过 MSI 多消息功能广播可用的 MSI 数量。 然后由 RC 读取该值并请求该数量或更少的值。 但是、您会看到 FPGA 将零作为多需求上限、这意味着只有一个矢量。 我认为关键在于 FPGA 方面。 我来自 Xilinx 沙盒、因此我无法准确地为您提供指导。 在我自定义 PCIe IP 内核的情况下、有一页关于可用的 MSI 中断数量、请参阅屏幕截图。 您应该能够在工具中找到类似的参数。 之后、您应该能够读取更大的值。 然后使用类似的内容启用多消息 CAP

    {
    pcieMsiCapReg_t * reg =MsiCap;
    uint32_t val = reg->raw = epCfg[(FPGA_CFG_MSI_CAP_OFFSET >> 2)];
    
    PCIe_getbits (val、CSL_PCIe_CFG_SPACT_MSI_CAP_64BIG_EN、 reg->en64位);
    PCIe_getbits (val、CSL_PCIe_CFG_SPACT_MSI_CAP_MULT_MSG_EN、REG->MultMsgEn);
    PCIe_getbits (val、CSL_PCIe_CFG_SPACT_MSI_CAP_MULT_MSG_CAP,REG->MultMsgCap);
    PCIe_getbits (val、CSL_PCIe_CFG_SPACT_MSI_CAP_MSI_EN、 reg->msiEn );
    PCIe_getbits (val、CSL_PCIe_CFG_SPACT_MSI_CAP_NEW_CAP、 reg->nextCap );
    PCIe_getbits (val、CSL_PCIe_CFG_SPACT_MSI_CAP_CAP_ID、 reg->capId );
    } /* pcie_read_msiCap_reg */
    
    /*
    *端点在 multMsgCap 中公布其 MSI 多向量功能。
    *启用其中一些中断、RC 写入 multMsgEn。
    *我们可能会限制此处允许的中断数量。
    *
    MsiCap.multMsgEn = MsiCap.multMsgCap;//启用所有可用中断
    MsiCap.msiEn = 1; //启用 MSI 功能
    
    {
    pcieMsiCapReg_t * reg =MsiCap;
    uint32_t new_val = reg->raw;
    PCIe_range_check_begin;
    
    PCIe_setbits (new_val、CSL_PCIe_CFG_SPACT_MSI_CAP_64BIG_EN、reg->en64bit );
    PCIe_setbits (new_val、CSL_PCIe_CFG_SPACT_MSI_CAP_MULT_MSG_EN、REG->MULTMsgEn);
    PCIe_setbits (new_val、CSL_PCIe_CFG_SPACT_MSI_CAP_MULT_MSG_CAP、REG->MULTMsgCap);
    PCIe_setbits (new_val、CSL_PCIe_CFG_SPACT_MSI_CAP_MSI_EN、 reg->msiEn );
    PCIe_setbits (new_val、CSL_PCIe_CFG_SPACT_MSI_CAP_NEW_CAP、REG->nextCap );
    PCIe_setbits (new_val、CSL_PCIe_CFG_SPACT_MSI_CAP_CAP_ID、 reg->capId );
    
    epCfg[(FPGA_CFG_MSI_CAP_OFFSET >> 2)]= reg->raw = new_val;
    } /* PCIe_write_msiCap_reg */ 

    此时、我应该再次警告您、TI 代码为远程 EP 提供了一些配置空间布局。 它对 TI 器件有效、但让我向您保证、它至少与 Xilinx FPGA 不匹配。 因此、在上面的代码中、我必须像使用自己的偏移

    /*
    FPGA 中的端点配置空间布局与 DSP 的布局不同
    ,*因此我们必须定义适当的偏移,而不使用 LLD 的值。
    *为清楚起见,这些偏移量是字节地址。 寄存器*作为
    32位值进行访问、因此必须将其 DWORD 偏移量调整为 rsh (2)。
    */
    #define FPGA_CFG_MSI_CAP_OFFSET 0x48
    #define FPGA_CFG_MSI_LOW32_ADDR_OFFSET 0x4C
    #define FPGA_CFG_MSI_UP32_ADDR_OFFSET 0x50
    #define FPGA_CFG_MSI_DATA_OFFSET 0x54
    #define FPGA_CFG_DEV_STAT_CTRL_OFFSET 0x60
    

    请确保您正在读取正确的寄存器、并且不会为此使用 TI 的 PCIe LLD。