工具/软件: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?
谢谢!
