工具/软件:Linux
我正在尝试使用 AM5728中的 Vivante GC320 2D 加速器来处理从 VIP 端口捕获的帧。 我需要使用零副本来实现这一点、以提高性能。
TI E2E 论坛上有多篇关于与 GC320共享 DMABUF 的文章。 其中大多数提供了 galRunTest2_DRM.c 文件、作为将带有 OMAP-BO_NEW 的 DMABUF 分配给 GC320呈现到的目标表面的示例。 我需要一个相反的示例、展示如何从 VIP 端口直接向 GC320提供 DMABUF。
我已经编写了一个小型测试应用程序来在 VIP 端口帧上进行一些处理。 我能够在源表面上执行一些处理我自己创建并成功将其呈现到 DRM DMABUF 中作为输出或"目标表面"。 但是、我无法直接从 VIP 端口提供 DMABUF 作为2D GPU 的输入表面。 如果我映射 VIP 端口 DMABUF 并将其直接传递到2D Surface Creation 例程,则 Linux 内核会出现问题,并且2D 加速器会尝试无限期地“恢复”。 我已经粘贴了下面的一些内核回溯。 它抱怨 DMA "卡住"。
因此、我现在的权变措施是复制它。 我创建一个基于 DMABUF 的表面(与我创建工作的输出 DMABUF 的方式相同),并对其进行 mmap。 然后,我将 VIP 端口的 mmap 缓冲器存储到表面缓冲器中。 这似乎可以正常工作、但在2D GPU 中将其用作输入表面进行渲染之前、memcpy 的成本为从一个 DMABUF 到另一个 DMABUF 额外的6ms。
我将我的小测试申请附在这篇文章中、希望有人能告诉我我发生了什么错误。 此应用程序从 VIP 端口捕获一个帧,尝试将其提交到 GC320,并将文件保存到磁盘。 可以使用以下命令在 Ubuntu 上查看生成的文件:
转换-depth 8 -size 640x480+0 RGBA:gc320.rgb a.png;eog a.png
e2e.ti.com/.../vip_5F00_to_5F00_gc320.zip
如何将 DMABUF 直接传递到 GC320源极表面? 谢谢你。
DMA 导致内核崩溃:
[2572.062341] OMAP_L3_NOC 44000000.OCP:L3应用程序错误:目标5 mod:1 (不可清除) [2572.070549] OMAP_L3_NOC 44000000.OCP:L3调试错误:目标5 mod:1 (不可清除) [2576.126358][galcore]:GPU[0]、自动挂起恢复。 [2580.229141] GPU [0](ChipModel=0x320 ChipRevision=0x5301): [2580.2355542 [2580.239805]*** GPU 状态转储*** [2580.243578 [2580.247712]轴 = 0x00000071 [2580.251225] IDLE = 0x7FFFFFFE [2580.254731] FE 未空闲 [2580.257648] DMA 似乎卡在该地址: [2580.262816] 0x7E724000 [2580.265539] dmaLow = 0x48000000 [2580.269089] dmaHigh = 0x00000701 [2580.272599] dmaState = 0x00000000 [2580.276107] 命令状态 = 0 (PAR_IDLE_ST) [2580.281583] 命令 DMA 状态= 0 (CMD_IDLE_ST) [2580.286739] 命令获取状态= 0 (FET_IDLE_ST) [2580.291820] DMA 请求状态= 0 (REQ_IDLE_ST) [2580.296977] CAL 状态 = 0 (CAL_IDLE_ST) [2580.302064] ve 请求状态= 0 (VER_IDLE_ST)