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.

[参考译文] TDA4VH-Q1:TDA4VH/J784S4上的 TI PSDK 如何实际处理高速缓存同步

Guru**** 2553260 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1386941/tda4vh-q1-how-cache-sync-is-actually-handled-with-ti-psdk-on-tda4vh-j784s4

器件型号:TDA4VH-Q1
主题中讨论的其他器件:TDA4VH

工具与软件:

您好:

我最近发现了以下论坛主题:

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1283968/tda4vh-q1-cache-coherency

我也一直在检查 PSDK 软件、但我在软件中看到的内容与上述主题中提供的答案之间似乎存在矛盾。

作为参考、我正在查看9.2.0.5 Linux ADAS 和 PSDK 软件版本(应该是最新版本)。

一些背景知识:

TDA4VH 具有 A72内核(计算集群)、R5f 内核和 C71 DSP 处理器。 根据 TI 的设计、Linux 内核提供了使用 RPMSG 与远程处理器进行通信的设施。 A72内核和远程处理器还可以在它们之间共享部分 DDR 存储器。 PSDK 发行版包含与内核连接的库和应用程序代码、用于使应用程序代码与远程处理器进行交互。

当前结构中、PSDK 代码具有一个 app_utils 层、该层为 tiovx 和视觉应用程序代码提供了一些抽象。 特别是,app_utils 提供诸如 appMemAlloc()、appMemMap()和 appMemCacheWb()以及 appMemCacheInv()等例程。

在 Linux 实现中、这些例程似乎使用 dma_bufs 接口、该接口使用 ioctls 来分配支持 DMA 的存储器区域。

这些例程依次由诸如 tivxMemBufferAlloc ()、tivxMemBufferMap ()和 tivxMemBufferUnmap ()等更高级别的 API 使用。

当然、在使用这些例程时必须考虑缓存一致性、因为分配的缓冲区会与远程处理器共享。

现在、问题就在这里:上面提到的论坛主题指出:

"对于 TDA4VH、每个 A72集群都直接连接到 MSMC3、因此两个 A72集群之间完全相干、但每个 C7x 不再直接连接到 MSMC3。  这意味着在 A72实例和 C7实例之间交换数据时需要执行一些软件缓存操作。"

要么这是不正确的、要么我漏掉了一些重要的东西。

下面是 tiovxMemBufferMap()函数的作用:

        {
            #if defined(SOC_AM62A)
            appMemCacheWb(host_ptr, size);
            #else
            #ifndef A72
            appMemCacheWb(host_ptr, size);
            #endif
            #endif
        }

请注意、对于 A72处理器、它将完全跳过 appMemCacheWb()调用。 tiovxMemBufferUnmap()中存在相同的构造软。

根据我的分析、还有一个单独的共享存储器区域用于交换对象描述符、用于 IPC 模块。 例如调用 ownObjDescSend()时使用该函数。 从我可以看到的情况来看、描述符管理代码中根本没有缓存同步的配置。

鉴于 tiovx 代码似乎跳过/缺少这些缓冲区的任何软件缓存同步操作、我只能通过两种方式了解其可能实现方式:

1) Linux 在禁用高速缓存的情况下映射这些区域

2) Linux 正在以某种方式将这些区域映射为启用缓存、同时也确保了硬件缓存与远程处理器的一致性。

我的问题是:我正在尝试在不同的操作系统(在 A72内核上运行)上实现对 PSDK 库的支持、我希望能够像 Linux 一样托管它。 但我很难找到管理缓存一致性的正确方法。 当前、共享存储器区域以缓存禁止的方式映射、并且可以正常运行。 我说"正常工作"时、这意味着我使用代客泊车演示(app_tidl_AVP)。 它会按预期通过 DP1显示端口连接器处理帧并在外部监视器上显示进度。 但这意味着 A72内核对共享存储器区域的访问比我想要的要慢得多。 如果我尝试将这些区域映射为启用高速缓存、则演示根本不会运行。

这给我留下了几个重要的问题:

1) 1)上一个讨论主题中的答案是否真的正确? A72内核上是否确实需要软件缓存操作来与 C71内核同步? PSDK 软件本身似乎与此相矛盾。

2) 2)如果可以实现硬件高速缓存一致性、则需要哪些特定的 Arm MMU 页面属性来确保实现这一点? 此外、是否还需要任何其他配置、例如 MSMC 模块? (请不要回复这个问题、说"看看 TI Linux 有什么功能"、因为如果我知道源代码中有什么内容、我现在就会这样做。)

不幸的是、另一个线程会说:"TI SDK 中的软件设计为遵循上述规则。  大多数 A72和 C7x 群集级别的最终用户都可能在框架 API 抽象之上添加/构建应用程序、因此他们可能不担心底层管道。" 我想我不是"大多数用户"。

-法案

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

    我应该补充一个后续行动:

    事实证明、这里有两个存储器区域起作用。 k3-j784s4-rtos-memory-map.dtsi 显示(以及其他内容):

            vision_apps_memory_region: vision-apps-dma-memory@af000000 {
                    compatible = "shared-dma-pool";
                    reg = <0x00 0xaf000000 0x00 0x03000000>;
                    no-map;
            };
    
            vision_apps_shared_region: vision_apps_shared-memories {
                    compatible = "dma-heap-carveout";
                    reg = <0x09 0x00000000 0x00 0x3c000000>;
            };

    第一个区域用于表示与 IPC 一起使用的对象描述符。 第二个用于 TIOVX 缓冲区,例如通过 TIVxMemBufferAlloc ()分配的缓冲区。

    第一个区域似乎需要手动高速缓存同步。 但 TI PSDK 代码实际上并不实现它:相反、它似乎依赖于该映射为未缓存的区域。

    另一方面、第二个区域似乎与硬件一致、因此您可以将其映射为缓存。

    其中一条线索是 vision_apps_shared-memorys 区域中没有指定"无映射"属性。 从我来看 TI Linux 内核中的 cerveout-heap.c 代码可以看出、如果缺少"no-map"、内存被视为可高速缓冲。

    事实证明,在我的操作系统中,这两个区域都被映射为未缓存,这是有效的,但这会导致对通过 tivxMemBufferAlloc()获取的缓冲区的访问速度不必要地缓慢。 当我意识到只有 VISION-APPS-DMA-MEMORY 需要映射为未缓存时、我启用了其他区域的缓存和一致性、性能得到了更好的提升。

    我认为这意味着另一个线程中的答案是误导性的:这意味着你需要在 TIOVX 代码中的任何地方使用显式软件缓存同步,但这似乎只有在 vision-apps-dma-memory 区域是正确的。

    -法案

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

    尊敬的 Bill:

    是的、我与您的上述观察结果一致、即 DMA 区域应该被解缓、而共享区域应该被缓存。

    在 TIOVX 代码中、必须进行高速缓存同步、我认为这是通过映射/取消映射 API (A72除外)实现的。  

    此致、

    Nikhil

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

    我认为问题在于、在 PSDK 中的 app_utils 代码中、Linux 抽象会对这两个区域使用 Linux 内核中的 dma-bufs 工具、并且不清楚它们的缓存属性是否不同。 这可能没有详尽的文档记录、因为这是 PSDK 的内部实现详细信息。

    在我使用的操作系统中、有一个假设、由于两个区域在 Linux 中都由同一个工具处理、这意味着它们也需要进行未缓存映射。 但现在我已经确认第二个区域已经与硬件缓存一致、我已经纠正了该问题并解决了性能问题。

    我最初担心的是、可能需要使用特定的 Arm MMU 属性才能实现一致性、但事实并非如此。 我们使用的是带内部和外部回写功能的普通内存、并将可共享性设置为内部可共享功能。 有一段时间我想也许我们应该使用外部可共享的,但事实证明,这不是问题。

    因此、感谢您的跟进、我想您可以将这个问题标记为已解决。

    -法案

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

    感谢 Bill 的确认和描述。

    正在关闭该主题帖。