GDC基本原理
GDC硬件是根据配置的map表对图像进行处理,map表存储的是畸变矫正信息,GDC硬件处理时,不是按行处理,是有一个tile的概念,会把输入图像按照map表进行tile划分,然后以tile为单位,读取输入图像区域,进行矫正处理,完成所有tile处理之后,一帧图像也就处理完成;
场景
GDC回灌场景,作为算子加速模块,GDC每一帧配置都可以重置,在图像处理过程中,出现某一帧处理失败的场景,错误日志如下:
分析过程
dmesg日志分析
出现SMMU read溢出报错,说明GDC硬件读数据越界了,需要检测配置和buffer大小的正确性;
配置检查:
输入分辨率 width = 0x1e0, height =0x10e,wstride = 0x790,从寄存器上看配置是正确的;
input buffer address是0xF4700000, 通过smmu出错日志可知,溢出地址是0xf47802e0,访问的Y 地址偏移是0x802e0;
请求的buffer size = 0x790 * 0x10e = 0x7f9e0 < 0x802e0, GDC硬件访问的地址偏移超过了分配范围,需要检查map信息;
tile日志分析
GDC input tile的边界范围是height = 272,但是source height = 270,说明是tile范围计算有误,从而导致GDC硬件实际访问地址溢出;
结论
通过以上分析得知,tile范围计算异常了,分析tile计算代码发现,tile划分时会对source height进行向上4对齐,这就是问题的根本原因;