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/TMS320DM8148:Linux A8 PCI-e DMA 物理地址问题

Guru**** 2589265 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/637571/linux-tms320dm8148-linux-a8-pci-e-dma-physical-addresses-question

器件型号:TMS320DM8148

工具/软件:Linux

我正在使用 TI_EZSDK_EVM_05_05_02_00并使用512MB 内存模型在 A8上开发 Linux 内核驱动程序。 我将使用 SharedRegion.h API 运行 OMX 解码器来分配缓冲区。 在 将虚拟地址传递给驱动程序之前、我使用 DomxCore_mapUsrVirtualAddr2phy 将虚拟地址转换为物理地址。 要验证数据、请在 Linux 驱动程序中映射物理地址并打印数据的子集。 数据是我对输入文件的预期、我将馈送解码器、物理地址与 http://processors.wiki.ti.com/index.php/EZSDK_Memory_Map#Changing_Memory_Map_For_512MB_DM816x_Board 上的存储器映射保持线 (缓冲区位于188 MB 内、从0xAB000000开始)

我想通过 PCI-E 从 A8发送该数据 我将 PCIe 设备作为端点连接到 DM8148。 如果我执行 dma_alloc_相干 操作并将数据复制到新的 DMA 缓冲区、为 PCIe 器件提供返回的 dma_addr_t、我的 PCIe 器件可以成功地将数据 DMA 输出。 为了减少延迟、我尝试传递从 DomxCore_mapUsrVirtualAddr2phy 返回的物理地址。 执行此操作时、PCIe 设备无法检索数据。 我知道数据位于该物理地址、因为我可以使用 ioremap 进行验证。  

我还尝试对 Memory_alloc 的虚拟地址执行 dma_map_single、但这会导致内核恐慌、因为内核未映射内存。 这是有道理的、因为图像缓冲区位于为 Linux 保留的176MB 之外。

我知道该芯片具有 IOMMU。 我按照 http://processors.wiki.ti.com/index.php/TI81XX_PSP_IOMMU_Driver_User_Guide#Enabling_IOMMU_support_in_kernel 上的说明操作。 作为测试、我执行 dma_alloc_相干、然后打印所有 debugfs 条目以查看是否已为 PCIe 总线创建条目。 从 sys 和 Ducati 的打印输出中,我看不到任何 IOMMU 映射。 这让我相信 PCIe 总线不会利用 IOMMU 本身。  

我缺少哪些步骤来正确映射此物理地址、以便 PCIe 器件可以在不使用 DMA_alloc_相干 的情况下将其移出 DMA?

谢谢!

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

    您好、Shaun、

    [报价用户="Shaun">我将使用 TI_EZSDK_EVM_05_05_02_00并使用512MB 内存模型在 A8上开发 Linux 内核驱动程序。 我将使用 SharedRegion.h API 运行 OMX 解码器来分配缓冲区。 在 将虚拟地址传递给驱动程序之前、我使用 DomxCore_mapUsrVirtualAddr2phy 将虚拟地址转换为物理地址。 要验证数据、请在 Linux 驱动程序中映射物理地址并打印数据的子集。 数据是我对输入文件的预期、我将馈送解码器、物理地址与 http://processors.wiki.ti.com/index.php/EZSDK_Memory_Map#Changing_Memory_Map_For_512MB_DM816x_Board 上的存储器映射保持线 (缓冲区位于188 MB 内、从0xAB000000开始)[/quot]

    您发布的链接指向 DM816x 512MB 内存映射。 DM814x 512MB 内存映射的正确链接是:

    [报价用户="Shaun"]我想通过 PCI-E 从 A8发送此数据。

    Cortex-A8 ARM 不能包含太多数据、它具有极少的内部 RAM (64KB)。 您实际上是指 OCMC RAM (128KB)还是 DDR3 (512MB)?

    [引用 user="Shaun"]我缺少哪些步骤来正确映射此物理地址、以便 PCIe 设备可以在不使用 dma_alloc_相干 的情况下将其移出 DMA?

    请参阅以下链接:

    此致、
    帕维尔

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

    您好、Pavel、

    感谢您的快速响应和提供的大量信息。 我试图将数据从 DDR3 (512MB)中 DMA 出来、只是为了澄清。  

    调试 FW 显示我们越过了4KB 页边界。 在您发布的其中一个链接中、我们看到这会使 PCIe 标准无效。 我们将进行 FW 更改、以解决这些跨越页边界的访问。

    不过、有一个侧注问题、我们在查看存储器映射 http://processors.wiki.ti.com/index.php/EZSDK_Memory_Map#Changing_Memory_Map_For_512MB_DM814x_Board、并想知道为什么在存储器映射中存在孔洞、而不是将其压缩以适应0x8000000和0x9FFFFFFF 之间。 根据 LISA 寄存器的配置方式、不应访问的区域映射在相应区域的顶部就很好;我们在0x8B000000和0xAB000000处创建了一个指针、可以看到修改是相互一致的。

    感谢您对所有这些的帮助!

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

    您好、Pavel、

    通过查看 sprugz8g、 19.2.3.3地址对齐要求、可以看到 PCIESS 主接口可以在128字节边界将此类事务拆分为多个事务。 它看起来不像默认启用的那样。 我正在浏览 19.5.7 PCI Express 功能寄存器和 19.5.8 PCI Express 扩展功能寄存器、但没有看到如何启用此功能。 您知道如何启用此功能吗?

    谢谢

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

    似乎此功能(将大事务拆分为128字节的事务)默认处于启用状态。 我找不到能够启用/禁用/配置此功能的 PCIe 寄存器。

    另请参阅 DM814x 器件勘误表:

    Advisory 3.0.6 PCIe:PCIESS 从端口突发必须为16字节乘法器和16字节边界对齐

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

    Pavel、

    感谢您对此进行深入研究。 我们将确保所有交易保持一致、以确保安全。

    Shaun