MI GFX Debug SOP


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 12/05/2024

    前言

    本文为FAE及软件开发相关人员而写,旨在介绍开发过程中客户遇到MI GFX相关问题时,如何自行进行初步排查,确定是Sigmastar SDK问题后再提供相关信息给FAE分析。


    1. GFX处理效果异常/效果差

    1.1 当怀疑GFX的处理效果异常时:

    • 首先检查src/dst buf的实际内容和APP传给MI_GFX的参数是否匹配(width/height/stride/color format)。
    • 其次检查其他的效果参数是否配置正确。
    • 若检查参数和图像实际内容是匹配的,则dump传入MI_GFX的src/dst buf以及处理完的dst buf,从而确认src buf和dst buf原图就有异常。
    • 若检查都没有问题,请把API参数、src buf、dst buf给 FAE 进行分析。
    • 例如,在使用 MI_GFX_BitBlit 进行位图搬运时,src通常是所需处理的图片,dst通常是Framebuffer。
      • 检查src和dst的buf,即phyAddr该参数是否都映射成了物理地址。
      • 检查src的width/height/stride/color format是否与所需处理图片一一对应,注意stride根据不同格式计算方法不同。
      • 检查dts的width/height/stride/color format是否与Framebuffer一一对应,注意Framebuffer是否有同步机制进行保护,防止Framebuffer在旋转过程中被修改。
      • 检查pstSrcRect、pstDstRect指定的操作区域,是否超出的src或dts的总分辨率。
      • 检查pstOpt 定义 BitBlit 操作的参数是否正确,如果是旋转90度或者270度,只能切割成正方形旋转,具体参考本文第五点。
      • 若检查都没有问题,通过写本地文件的方式,将src/dst buf的物理地址映射对应的虚拟地址dump出来对比,确认src buf和dst buf原图是否有异常。

    2. FB叠加GFX操作后,FB显示异常

    当利用GFX加速图形运算贴到FB出现显示异常(包括FB闪屏/FB花图/FB错位等等),大概率都是GFX的BW占用比较高,导致disp gop抢不到BW,没法及时从DDR读完一整张待显示buf,从而出现各种FB的显示异常。可尝试拿掉GFX加速图形运算操作,观察FB是否还会显示异常。若FB还是显示异常,则找 FAE 进行理清 FB 本身存在的问题。若拿掉GFX操作,FB显示就正常了,则找 FAE 帮忙调整模块的BW优先级(miu模块可设置),或降低分辨率解决。

    3. MMU 踩内存问题/MIU Protect问题

    1. 现象

      出现以下log时,代表发生了MMU踩内存:

      [MI WRN] MI_SYS_Mma_MmuCallback[227]: [MI_SYS_Mma_MmuCallback] Status=0x2, PhyAddr=0x40070000, ClientId=0x3A,Name=GE IsWrite=0
      
      • Status
        • 触发该回调的原因,当前值为0x2,属于非法读写操作。
      • PhyAddr

        • 访问触发异常的entry起始地址,当前值为0x40070000
      • ClientId

        • 模块id,当前值为0x3A
      • Name

        • 模块名,当前值为GE
      • IsWrite

        • 读写操作,1是写,0是读,当前值为0,是读操作。

      出现以下log时,代表发生了miu protect:

      [HAL MIU ERR] [hal_miu_protect_show_hit_info@1301] [PROTECT] IP hit protect address.
      Hit block 32, address: 0x400800000<->0x400802000, whitelist: [CPU_CA55, ]
      Hit count: 1
      Hit IP : 0x3A - GE
      Hit MMU address: 0x400800000<->0x40080000f
      
    2. 分析

    3. 确认MMU踩的地址是否为虚拟地址范围。因为MI_GFX无论是内部使用的buf还是API参数传入的src/dst buf addr都是物理地址,当出现GE踩的地址为虚拟地址范围,则需要APP检查通过API传给MI_GFX的src/dst地址是否是虚拟地址。

      例如 MI_S32 MI_GFX_BitBlit(MI_GFX_DEV GfxDevId, MI_GFX_Surface_t *pstSrc, MI_GFX_Rect_t *pstSrcRect, MI_GFX_Surface_t *pstDst, MI_GFX_Rect_t *pstDstRect, MI_GFX_Opt_t *pstOpt, MI_U16 *pu16Fence);

      pstSrc的u32PhyAddr对应的是否是所需旋转的图像虚拟地址映射的物理地址,pstDst的u32PhyAddr所对应的是否是FB映射的物理地址。 - 确认MMU踩的地址是物理地址,若读踩的地址为APP传入的src/dst buf末尾的16Byte以内,忽略即可,因为GE硬件为了提升性能会有预读的操作。 - 若非上述两种情况,则检查APP传入src/dst buf的实际大小与设定给MI_GFX的参数不匹配(width/height/stride/color format)。

    4. APP强制退出的时候死机,堆栈信息发现MI_GFX的中断大量触发

    • cat /proc/interrupts查看退出前后的中断信息,判断 GE_ISR 的数量是否大量增加。
    • 检查 MI_SYS_Exit() 是否在最后调用。
    • 检查 MI模块的 InitDev 和 DeInitDev 没有配对使用,或者Init错配了DeInitDev。
    • 若上述检查都没有问题,抓取堆栈信息和cat /proc下MI模块各节点信息提供给 FAE 分析。

    5. GFX旋转90度和270度时,限制只能旋转正方形数据

    • 在使用 MI_GFX_BitBlit 进行图片旋转时,旋转0度和180度可以直接旋转矩形图像数据。
    • 旋转90度和270度时,直接旋转矩形数据会出现图像显示异常。因为硬件限制只能旋转正方形数据,若要旋转长方形数据,第三个参数和第五个参数 MI_GFX_Rect_t 需要将矩形切割成正方形,再调用 MI_GFX_BitBlit 进行旋转,可联系 FAE 提供 MI_GFX 的旋转demo进行参考。