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/AM5728:将 VIP DMABUF 作为源表发送到 GC320

Guru**** 2601915 points
Other Parts Discussed in Thread: AM5728

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/639446/linux-am5728-sending-vip-dmabuf-as-source-surface-to-gc320

器件型号:AM5728

工具/软件: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) 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Phil、

    我正与 GC320驱动程序专家一起检查此问题。 当我为您提供一些答案时、我们将返回到这里。

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

    有没有更新? 谢谢你。

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

    您好、Phil、

    很抱歉耽误你的回答。 GC320驱动程序专家的初步答复是、驱动程序内部不应有任何问题。 GC320 驱动程序支持 dmabuf 导入功能、该功能已被验证可与输出缓冲器配合使用、而 dmabuf 导入功能不区分输入和输出缓冲器、因此问题可能出在应用层。 他应该研究您共享的应用程序。 由于感谢美国的假期、他正在度假。 我将在他本周回来时再次对他执行 Ping 命令。

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

    感谢您的更新。 我期待收到驾驶员专家的回复。

    谢谢、

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


    您好、Phil、

    参考测试示例中的映射代码看起来正常。 进行了一些比较
    问题和意见。

     -您将根据哪一个 TI 基准运行此操作。
     -关于对齐,您能否检查对齐要求是否正确
      在 VIP 端口的源分配时间满意。 可能会得到保证
      请注意。
     -如果对齐、您可以尝试`memset`将缓冲区设置为零
      分配时间。

    谢谢、
    Gowtham

     

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

    您好、Gowtham、

    感谢您的回答。 以下是版本信息:

    Linux 内核版本:

    uname -r
    4.4.41 

    gal 版本:

    [318156.996308] GC320 IRQ:304
    [318156.999191] Galcore 版本5.0.11.33433 

    芯片修订信息:

    =========================== 芯片信息=========================
    芯片:GC320
    芯片修订版本:0x00005301
    补丁修订版本:0x00000000
    芯片特性:0xe02c7eca
    芯片小型功能0:0xc9399eff
    芯片小型功能1:0xfe1fb2db
    芯片小型功能2:0xdeff0080
    芯片小型功能3:0x00000005
    芯片小型功能3:0x00000005 =
    = 0x0000====== 0x0000=================0000==================0000==================0000============0000==============
    

    内核错误归结为:

    [212.952678][galcore]:硬件未成功复位、放弃
    [218.946585][galcore]:GPU [0]挂起、自动恢复。 

    VIP DRM 缓冲区根据 TI 的双摄像头示例进行分配和对齐:

    struct omap_bo *bo;
    
    BO_FLAGS |= OMA_BO_WC;
    
    BO = OMAP-BO_NEW (omapDevice、宽度*高度* bpp / 8、bo_flags);
    
    如果(bo){
    *BO_Handle = OMA_BO_Handle (bo);
    *间距=宽度* bpp / 8;
    IF (BO_FLAGS 和 OMAP-BO_TOB砖 型)
    *间距= ALIGN2 (*间距、page_shift);
    }
    

    您将哪个缓冲区称为 memsetting to zero? createGC320Surface ()函数取自 galRunTest2示例,该示例中的 memset 将函数末尾的表面缓冲区设置为零。 该函数中的对齐代码也与示例相同。

    您是否有一个提供 Serperate DMABUF 作为 GC320的输入和输出表面的示例?

    感谢您的帮助、

    Phil

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

    您好、Phil、

    >您将哪个缓冲区的 memsetting 指的是零? 。
    > createGC320Surface ()函数取自 galRunTest2示例、该示例
    > memset 将函数末尾的曲面缓冲区设置为零。 校准
    >该函数中的代码也与示例相同。

    在分配 VIP DRM 缓冲区的共享代码中、make
    确保考虑了对齐要求,并将* memset*对其进行了考虑
    然后再将其传递到 gcoSURF。 线中的某个东西。

    ```μ A
    struct omap_bo *bo;

    BO_FLAGS |= OMA_BO_WC;

    #调整大小以符合对齐要求
    # size =((width + 15)&~15)* height * bpp / 8;
    BO = OMAP-BO_NEW (omapDevice、SIZE、BO_FLAGS);

    如果(bo){
    *BO_Handle = OMA_BO_Handle (bo);
    *间距=宽度* bpp / 8;
    IF (BO_FLAGS 和 OMAP-BO_TOB砖 型)
    *pitch = ALIGN2 (*pitch、page_shift);

    void * vaddr = omap_bo_map (bo);
    memset (vaddr、0、size);
    ```μ A

    谢谢、

    Gowtham

     

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

    您好、Gowtham、

    将 VIP 缓冲区设置为0有效! 感谢您对此的支持。

    谢谢、

    Phil

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

    您好、Phil、

    很高兴听到问题得到解决。

    谢谢、

    Gowtham