MI GFX Debug SOP
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 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问题¶
-
现象
出现以下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
- Status
-
分析
-
确认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进行参考。