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.

[参考译文] Linux/EVMK2H:在 ARM 和 DSP 之间使用 QMSS 和 PKTDMA、同时在 ARM 上运行 Linux

Guru**** 2591290 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/638930/linux-evmk2h-using-qmss-and-pktdma-between-arm-and-dsp-while-running-linux-on-arm

器件型号:EVMK2H

工具/软件:Linux

您好!

我想在运行 Linux 的同时使用 DSP 内核作为网络应用的协处理器。 据我所知、我应该能够使用 PKTDMA 和 QMSS 将传入的数据包从10GB 路由到 DSP、并使用它在内核之间进行通信。 我找到了一些有关此主题及其工作原理的幻灯片、但我找不到任何同时包含 ARM 和 DSP 代码的代码。 即使我在这里找到了一个未响应的类似线程:

https://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/p/590922/2172476

因此、我希望通过 Linux 执行 QMSS 初始化、然后使用 DSP 上 PDK 的 PKTDMA 函数与 XGBE 以及 ARM 内核进行通信。 以下是我的问题:

1)根据我的理解、我应该通过用于 Linux 引导的 DTS 文件(在包含 qmss 初始化的 arch/arm/boot/dts/keystone-k2hk)-netcp.dtsi 中)设置 QMSS 参数。 我找到了 xgbe 的 TX 和 Rx 的设置队列编号、该编号现在对应于 ARM 中断。 但是、在阅读"KeyStone 架构多核导航器"时、我找不到 DSP 的任何中断队列、看起来我应该使用低优先级或高优先级累加器。 但是、我找不到高优先级代码。 DSP 是否有任何中断队列、或者如何更新 DTS 文件以在 DTS 文件中包含高优先级队列?

2) 2)将 DSP 队列添加到 DTS 文件后、我是否需要为 Linux 执行其他一些初始化步骤? 我认为我可以将 xgbe 的 Rx 接收和 TX 完整队列更改为指向 DSP 队列、并使用 ARM 中断队列从 DSP 到 ARM 进行通信。 或者、我应该使用 QMSS TX 队列来在 DSP 和 ARM 之间进行通信(它表示在内核之间、不确定是哪一个内核)? 或 EDMA 队列?

3) 3)我想将描述符有效载荷放置在 DSP L2高速缓存(SRAM)中、可以通过 DTS 或 Linux 初始化来实现吗? 还是 QMSS 的那一部分初始化需要通过 DSP 完成、因为它是本地存储器?  

提前感谢您、

Moein

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

    我们将对此进行研究。 反馈将发布在此处。

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

    内核间通信的标准方法是通过 RPMsg 使用 IPC。 如果您坚持使用 QMSS、 processors.wiki.ti.com/.../Processor_SDK_Resource_Manager 中有一个 QMSS_LLD 及其示例

    它在一端执行 qmss_put 传输、在另一端执行 qmss_get 接收

    XGE 功能与内核间通信无关。 我认为我们没有任何 XGE RTOS 示例。 我需要咨询 RTOS 工程师。

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

    非常感谢 Rex、您的链接为我澄清了几个方面。  

    使用 DSP 进行 XGE 数据包处理是我的主要目标、由于 XGE 的接口是 PKTDMA、我希望使用相同的接口进行内核间通信、也可以在 DSP 内核之间使用。

    此外、我还不知道如何从 ARM 端正确设置 QMSS、可能需要对驱动程序进行一些修改。 我更改了 DTS 文件中 XGE 的 Rx 队列以使用同一 DTS 文件中已设置的低优先级队列。 现在队列编号已更新(在设置过程中使用 printk 以确保)、但 ARM 仍具有完全控制能力、不会将数据包发送到 DSP。

    Moein

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

    低优先级队列可能不起作用。 它生成一个中断226、在 K2H 数据表中将其定义为 ARM 导航器中断。 您可能应该使用去分度 DSP 的通用队列来定义 Rx 流。 此外、XGE 将从 DSP 接收的 TX 队列。

    您可能已经阅读了《多核导航器用户指南》 、www.ti.com/.../sprugr9h.pdf。 它包含详细信息和有用信息。

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

    尊敬的 Rex:

    我有点困惑、在多核导航器用户指南中、我看到以下队列分配:

    ARM (8704至8735)有单独的中断、而 XGE 实际上使用这些中断作为 RX 队列。 在低优先级和高优先级上、它显示了特定于内核、稍后它显示了如何映射到 DSP 内核:

    但是、正如您提到的、低优先级队列480至512被映射到中断226、并被发送到 ARM 处理器。 我在 DTS 文件中看到这一点:

    累加器{

    ACC-LOF-0{

    qrange =<480 32>;
    累加器=<0 47 16 2 50>;
    中断=<0 226 0xf01>;
    多队列;
    qalloc-by id;

    };

    };

    对于低优先级队列、哪个 K2H 数据表引用了226? 我能否更改此 DTS 文件为 DSP 分配高优先级队列中断? 甚至一些通用队列。

    或者、ARM 无法为 DSP 设置 QMSS、DSP 需要为其中断本身运行 QMSS 初始化? 如果是这种情况、那么我会有与我提到的未回答的线程相同的问题、即如何从 ARM 和 DSP 初始化 QMSS?

    BTW 我无法构建 PDK 示例工程、只有"evmk2h platfrom "是 CCS 工程、drv 文件夹中的 RM 或 QMSS 测试工程是一些源文件、同时包含 ARM 和 DSP 代码。 运行 make 只会在 lib 目录中构建一些".oa15fg"文件、我不确定这些文件是 ARM 的相同".out"文件、这些文件可以在/usr/bin 下的处理器 SDK 根文件系统中找到、也可以不找到。 我正在研究如何使用这些 PDK 示例、但如果您知道有关如何使用这些 PDK 示例的说明、我将不胜感激。

    谢谢、

    Moein

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

    在 SoC 产品说明书 www.ti.com/.../66ak2h12.pdf中、表8-23定义了#226的 ARM 中断、第103页。

    在《CPPI (或多核导航器)用户指南》的队列映射部分(5.1)中、表5-2中为 Keystone-2定义的队列被指定(硬编码)到特定 IP。 例如、8704-8735被指定为 CPSW、并在 netcp.dtsi 中定义。 您可以看到 GbE 和 XGE 都使用它们。 8752-8759指定给 XGE、您也可以在 dtsi 文件中找到相应的配置。 在表中、没有一个被指定给 DSP。 因此、您需要使用 gerneral 用途队列。

    上述设置位于内核空间中。 使用 RM 和 QMSS_LLD、它位于用户空间中。 QMSS_LLD 提供了隐藏所有这些配置的 API、因此用户可以调用 qms_put 进行传输、而另一侧执行 qmss_get 来获取消息。 示例的二进制文件包含在 tisdk-server-ext-rootfs 文件系统 tarball 中。 如果要编译它们、可能需要运行 pdkProjectCreate 脚本并使用 pdksetupenv 脚本设置编译 env。 您可能会在 RTOS PDK 中找到相关说明。 在 RM 用户指南中、有有关如何运行示例 的说明、processors.wiki.ti.com/.../Processor_SDK_Resource_Manager

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

    尊敬的 Rex:

    我明白了。 表8-22有针对内核 PAC 的中断、并且只有导航器中断是高优先级中断、例如:

    事件52、QMSS_INTD_2_HIGH_N:导航器2累积的高优先级中断0

    我的目标是将路由从"XGE 到 ARM"更改为"XGE 到 DSP"、而不是添加通过 ARM 的冗余延迟。 所以我想现在的问题是如何设置高优先级中断、如果我需要修改内核并重建它、我是可以的。  实际上、我正在寻找执行这些 qmss 设置步骤的位置、以便修改这些步骤。 我能否对 ARM dtsi 文件进行一些修改以更改设置并仅使用 DSP 端的 QMSS_LLD 发送/接收数据、如果不是、我应该在每侧修改哪些内核模块?  

    我在 DSP 方面找不到 XGE 支持、这就是我尝试通过 ARM 进行设置的原因。 如果可以通过 DSP 进行 XGE 设置、但仍然可以使用 ARM 内核引导 Linux、并通过 IPC 或 QMSS 与 DSP 进行通信、从而实现我的目标。 如果您能指出如果可以的话、我将不胜感激。

    感谢您提供有关 PDK 的指导。

    最棒的

    Moein

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

    PktDMA 提供了一种灵活的方法、但应注意避免任何现有资源的使用。 高优先级队列可以是解决方案之一、只要其他解决方案不使用它。 也可以选择通用队列。 没有一套必须使用的规则。 在 Linux 端设置队列并不意味着 DSP 将自动获得队列。 您将需要代码来使用队列。 如果使用中断、您可能需要考虑如何管理 XGE 上的中断泛洪。

    RTOS XGE 示例仅为 BER 测试设置 SerDes。 它不是为接收和传输数据包而设置的。 它还需要设置发送/接收队列。 此队列设置也适用于 GbE、它可能会用作参考。

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

    尊敬的 Rex:

    我仍然找不到您提到的示例或"Processor_SDK_Resource_Manager"中描述的示例。 它说:"将 rmK2xArmv7LinuxDspClientTestProject 导入 CCS 并编译工程"、但我找不到这样的工程、PDK 的 drv 文件夹中没有 CSS 工程。  

    根据您指向 setupenv 脚本的指针、我从 RTOS 文件夹运行了"make pdk"、但遇到了一些错误。 现在、我更新了以下两个软件版本、但在构建过程中仍会出现错误:

    1)已将此行添加至~/ti/processor_sdk_rtos_k2hk_4_01_00_06/makefile:
      导出 IPC_INSTALL_PATH="${SDK_INSTALL_PATH}/IPC_3_46_02_04"

    2)在~μ C/ti ran 中:sudo grep -rl "BIOS_6_46_04_53"。 | xargs sed -I S/BIOS_6_46_04_53/BIOS_6_46_05_55/g'

    错误:  

    #编译 K2H:c66x:release:osal_tirtos:src/tirtos/SemaphoreP_tirtos.c

    /home/moein/ti/ti-cgt-c6000_8.1.3/bin/cl6x std.h -ppp=/home/moein/ti/pdk_k2hk_4_0_7/packages/ti/binary/ti/osal/osal_tirtos/obj/k2h/c66/release/.deps/SemaphoreP_tirtos.P -DMakEFILE_Build -mv6600 --abi=eabi -q -m10 -mo -pdden -pds=238 -pds1110 -program_level_compile -g -endian=little -eo.oe66 -ea.se66 -emit_warnings_as_error-o3 -pds1110-program_level_compile -g -enodi=little_e/dle_oidese-ti_o_debug/degoti_ti_ti_ti_ti_/degoti_ti_/degine.ti_ti_/degine.ti_/degin/dest_ti_ti_ -isrc/tirtos -Isrc/tirtos/muxintcp/v0 -i/home/moein/ti/xdctools_3_32_01_22_core/packages -i/home/moein/ti/pdk_k2hk _4_0_7/packages -i/home/moein/packages -ti/emets=tirtos/rfs/tirtos/rfs/rfc/tirtos=-tos/rfs/tirtos/rfs/rfc/tirtos=-tos/rfs/tos/rfs/tirtos_/home/moein/ti/pdk_k2hk_4_0_7/packages/ti/binary/ti/osal/osal_tirtos/obj/k2h/c66/release /home/moein/ti/pdk_k2hk_4_0_7/packages/ti/binary/ti/osal/osal_tirtos/obj/k2h/c66/release
    "/home/moein/ti/xdctools_3_32_01_22_core/packages/xdc/std.h、第80行:致命错误#1965:无法打开源文件"ti/targets/elf/sd.h"
    1在"src/tirtos/SemaphoreP_tirtos.c"的编译中检测到灾难性错误。
    编译已终止。

    在另一种方法中、我搜索了 PDK 文件夹中的任何工程、并找到了 evmk2h 平台测试工程。 这个没有构建、在找出链接错误并立即解决这些错误后、在将项目加载到 DSP 期间、我得到了这个结果(我在 Windows 和 Linux 上都尝试过 CCS):

    C66xx_0:读取长度为0x4的第0页0x8000处的存储器块时出现问题:(错误-1190 @ 0x8000)无法访问器件存储器。 验证内存地址是否在有效内存中。 如果错误仍然存在、请确认配置、对电路板进行下电上电和/或尝试更可靠的 JTAG 设置(例如、较低的 TCLK)。 (仿真包7.0.48.0)
    C66xx_0:文件加载器:验证失败:目标读取0x00008000失败
    C66xx_0:GEL:文件:C:\ti\pdk_k2hk _4_0_7\packages/ti\platform\evmk2h\platform_test\Debug\platform_test_evmk2h.out:加载失败。

    如果您能告诉我在哪里找到这些项目并在必要时解决这些问题、我将不胜感激、比如我缺少的另一个路径或版本设置文件。

    谢谢、

    Moein

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

    您能否使用 tisdk-server-ext-rootfs-image-k2hk-evm.tar.xz 文件系统中的可执行文件、而不是使用 tisdk-server-rootfs-image-k2hk-evm.tar.xz? 所有示例二进制文件都在 ext-rootfs 文件系统中可用。

    雷克斯