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/AM3354:Linux DMAenger/EDMA 问题

Guru**** 2540720 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/595228/linux-am3354-linux-dmaengine-edma-question

器件型号:AM3354

工具/软件:Linux

大家好、

我希望向连接到 GPMC 总线的器件执行散聚 DMA 传输。 GPMC 总线在非 NAND 模式下运行。 我们的驱动器使用 dmaEngine 接口。

我可以通过将 dma_memcpy 传递到 dma_request_channel 来执行单次传输、然后使用 dmaenginer_prep_memcpy、这样就可以... 问题是每次传输后(通过 WAIT_for_Completion + DMA 描述符上的回调)、我需要进行上下文切换。 这在进行几次小规模传输时似乎效率低下、而按照"设备"的工作方式、我们需要进行大量小规模传输。

我无法在从模式下(即 dmaenginer_prep_slave_sg、dmaenginer_prep_slave_single)操作 DMA 至 GPMC、并且根据我的理解、从模式仅在 GPMC 配置为 NAND 模式时工作。

dmaengineer_prep_dma_sg()看起来正是我所需要的。 Linux 4.4中的 EDMA 驱动程序无法实现这一点。 我简要地扫描了 TI 的 Linux 树并进行了编辑、但在4.4或4.9分支中找不到任何此类实现。

是否还有其他类似的接口可用于进行散聚传输? 是否计划在 EDMA 驱动程序中实现 DMA_SG 接口?

感谢您提供的任何信息!

-Amanda

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

    [引述]是否还有其他类似的接口可用于这些散聚传输? 是否计划在 EDMA 驱动程序中实现 DMA_SG 接口?

    我不知道有任何计划在 DMA 驱动程序中实现这一点。

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

    散聚 DMA 是指 DMA 引擎在单个操作中自动从非连续存储器块执行一系列 DMA 操作的能力。 "散射"是指写入多个非连续块的能力、而"收集"是指从多个此类块读取的能力。

    散聚要求 DMA 编程器提供一个所谓"描述符"的链接列表、其中每个描述符都包含(连续)存储器块的源地址和目标地址。 DMA 控制器(通常)被告知主机存储器中该列表的位置、并在每次传输前获取每个描述符。

    是的、在 PSDK 3.03 (内核4.4.4.41)中、我们只有"slave_sg"支持:

    linux-4.4.4.4/41/drivers/dma/edma.c -> s_ddev->device_prep_slave_sg = edma_prep_slave_sg;

    下面的文件介绍了这种分散-集中的用法:

    Linux-4.4.4.41/Documentation/dmaengine/client.txt
    Linux-4.4.4.41/Documentation/dmaengine/provider.txt
    Linux-4.4.4.41/Documentation/DMA-API.txt
    Linux-4.4.4.41/Documentation/DMA-API-HOWTO.txt
    Linux-4.4.4.41/Documentation/dma-buf-sharing.txt

    另请参阅以下链接是否位于帮助中:

    e2e.ti.com/.../546507
    e2e.ti.com/.../149572
    www.linuxjournal.com/.../7104

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

    您好!

    我是最初打开这个问题的人。  我看到的问题是与软件中的 DMA 事务链接相关的巨大开销。 考虑以下 IO 链:

    GPMC_WRITE (SALE_CTL_REG、4);
    GPMC_Read (SALE_CTL_REG、4);
    GPMC_WRITE (CTL_REG2、 8);
    GPMC_WRITE (DATA_WINDOW、100); 

    我可以使用示波器观察 GPMC CSn 线路来测量延迟。 在裸机系统上、我可以在软件中以大约2us 的延迟将这些事务链接在一起。 这是可以接受的。

    另一方面、在 Linux 系统上、我看到的最小延迟约为20us、高达60us。 就这个最小延迟而言、如果我为 device_prep_completion_timeout ()或 dma_sync_wait ()、或者我禁用 了 device_prep_dma_memcpy ()的 dma_prep_interrupt 标志、这无关紧要。  此延迟将吞吐量限制为不适合在 总线另一端驱动器件的水平。

    我要尝试降低这个20us 延迟。 我认为这样做的方法是将硬件中的 DMA 事务链接起来、因此我的原始问题是。 是否还有其他一些我不知道的优化、或者我是否有更好的机会破解 EDMA 驱动程序?

    CSn 激活、裸机系统:

    CSn 激活、带 dmaengine 的 Linux 4.4:

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

    EDMA 是减少 GPMC 延迟的正确方向。

    由于 Cortex-A8的复杂性和软件的许多变化、我们不会引用中断的延迟数。 从 Linux 到 RTOS 或裸机解决方案的延迟可能会非常不同、具体取决于多种因素、例如是否使用 MMU 及其使用方式。 其他主要因素包括客户代码库中的任何关键部分。

    此外、根据您的延迟要求、还有一些方法可用于限制延迟。 其中一个示例是使用您可能需要低延迟的任何代码来锁定 L2高速缓存。

    请注意、还有其他可降低延迟的选项(而不是 Linux PSDK)、如 StarterWare、Linux-RT 和 RTOS。

    www.ti.com/.../processor-sdk-am335x

    另请参阅以下 e2e 线程是否将提供帮助:

    e2e.ti.com/.../1056619

    e2e.ti.com/.../36625
    e2e.ti.com/.../143795

    e2e.ti.com/.../356576
    e2e.ti.com/.../573232
    e2e.ti.com/.../477311

    此致、
    帕维尔