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/TDA2:无法在 OSA_memAllocSR ()和 aligned_alloc ()分配的缓冲区之间进行 EDMA 传输

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/723796/linux-tda2-cannot-edma-transfer-between-osa_memallocsr-and-aligned_alloc-allocated-buffers

器件型号:TDA2

工具/软件:Linux

大家好、我使用的是 Processor SDK 3.03、这是为具有 TDA2 芯片的定制电路板而构建的。

到目前为止,我已成功地在 PSDK 用例中使用 OSA_memAllocSR()分配的两个缓冲区之间传输了数据。 为此,我调用 osa_memVirt2Phys()来获取这些缓冲区的物理地址,并将该信息转发到我编写的 EDMA 实用程序驱动程序。 现在,我需要在用 OSA_memAllocSR()分配的缓冲区和用 POSIX 中的 aligned_alloc()分配的缓冲区之间传输数据。 但是,我不知道如何获得使用 aligned_alloc()分配的物理地址。 我想知道如何进行这项工作、以便 EDMA 传输可以正常工作。

提前感谢您。

此致、

Nick

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

    通过简单的 aligned_alloc()调用无法实现您想要实现的目标。 aligned_alloc 调用提供了一个分散的列表、这不是连续的。 您需要一个特殊的分配器、例如提供连续存储器区域的 CMA。 有关详细信息、请参阅此链接。

    lwn.net/.../

    OSA_memVirt2Phys()之所以起作用,是因为分配来自 M4,其中物理到虚拟地址映射为1-1,但在 Linux 上并非如此。
    如果您打算从 Linux 中使用 EDMA、则需要使用 CMA 进行分配。 您还需要一种将应用与 EDMA 驱动程序相集成的方法(VISION-SDK EDMA 位于 M4上)。
    如果您打算使用来自 M4的 EDMA、我建议从 SR 分配并将缓冲器传递到 M4。

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

    您能否确认 CMA 已集成到 PSDK 3.03中使用的内核4.4.84中 ARM 的 DMA 子系统中? 如果是、那么我认为这只是使用 dma_alloc_相干()分配存储器的问题。

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

    很抱歉耽误了回复、我在休假。
    是的、您可以使用 dma_alloc_相干、如果器件为 NULL /器件没有专用的 DMA 池、它将从 CMA 分配。 然后、您可以使用此函数对 EDMA 进行编程(调用本身会返回虚拟地址、但传递的参数之一包含物理地址)。

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

    我设法使用 dma_alloc_相干()并在它和 OSA_memAllocSR ()分配的 EDMA 传输之间执行一个非常好的传输。

    下一个问题是使用 dma_alloc_相干()分配的缓冲区不能写入使用 O_direct 标志打开的 SSD 上的文件。 我已经在一些 Linux 相关论坛上发布过、因为我认为它不再与 TI 相关、但我没有得到任何答案。 您对此有什么经验吗? 如果您有答案、我会将其发布为新问题。

    期待收到您的回复。

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

    我不认为这是允许的、因为 IT 安全缺陷允许映射到用户空间的内核页面上的 I/O。 必须有一个内核空间的副本、然后可以通过 O_Direct 写入。

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

    Shravan、您好!

    我们尝试直接从内核模块的 dma_alloc_相干()缓冲区写入 SSD、但我们发现不鼓励从内核空间写入磁盘、并且只能通过特定的栈进行、因此我们放弃了这一点。 我现在想知道的是其他内容、但如果您想查看、我将制作另一个线程并将其链接到此处、基本上我们希望直接从 OSA_memAllocSR 缓冲区写入 SSD (这是促使我们进入这个问题的最初问题)但有关该主题的更多详细信息。 可在以下网址找到:e2e.ti.com/.../729926

    此致、
    Nick