DSC 问题排查
Display Driver 问题处理手册 (mediatek.com)
How to check dsc config
完成 DSC 的相关配置之后,如果因为 DSC Porting 导致的显示异常问题,可以按照以下方法去 check dsc config,包括平台和屏端的检查。
如果是 lk dsc config 和 kernel dsc config 都有显示异常问题,那么我们可以在进入 kernel 之后,做完休眠唤醒之后再去 debug 问题。
从 Figure 3-1 可以理解 dsc config 出现问题,可能是 AP 端 DSC Encoder 的压缩设定问题,也可能是 Panel 端 DSC Decoder 的解压设定问题。
1.check mtk dsc config
目的:检查 AP 端 DSC Encoder 的 PPS 相关设定
排查:
问题机器从开机起来吃的还是 lk 的 dsc 配置,先做休眠唤醒,这样会吃 kernel 的 dsc 配置。
输入以下指令,抓一份 mtkfb diagnose,初步去 check mtk dsc config 是否符合预期理论值。
adb shell "echo logger:on > /proc/mtkfb"
adb shell "echo enable_idlemgr:0 > /proc/mtkfb"
adb shell "echo diagnose > /proc/mtkfb && cat /proc/mtkfb" > mtkfb.txt
打开 mtkfb.txt,全局搜索 dsc 关键字,就可以找到相关的 dsc 寄存器打印。
检查 DISP_DSC_PPS0~DISP_DSC_PPS19 的配置是否符合预期,偏移地址是 0x080~0x0CC。
举例:
(1) 按照上面的步骤,抓取真实的 dsc pps 寄存器配置:
[76061.441339]== DSC0 REGS:0x0x000000001400c000 ==
[76061.441340]== DSC0 offset:0x0 ==
[76061.441341](0x000)DSC_START=0x10089
[76061.441341](0x020)DSC_SLICE_WIDTH=0xcb0262
[76061.441342](0x024)DSC_SLICE_HIGHT=0x40e1000b
[76061.441343](0x018)DSC_WIDTH=0x19604c4
[76061.441344](0x01c)DSC_HEIGHT=0xa970a97
[76061.441345](0x228)DSC_SHADOW=0x1
[76061.441345]-- Start dump dsc registers --
[76061.441347]DSC+0x000: 0x10089 0x0 0x1 0x0
[76061.441348]DSC+0x010: 0x707 0x0 0x19604c4 0xa970a97
[76061.441350]DSC+0x020: 0xcb0262 0x40e1000b 0x262 0x1c98
[76061.441351]DSC+0x030: 0x10001 0x28 0x1 0x4c40262
[76061.441353]DSC+0x040: 0x0 0x0 0x0 0x0
[76061.441355]DSC+0x050: 0x0 0x0 0x0 0x0
[76061.441356]DSC+0x060: 0x200 0x6cbe 0x46ce 0x0
[76061.441358]DSC+0x070: 0x800000c8 0x1900190 0x0 0x0
[76061.441359]DSC+0x080: 0xc80ab 0x2320200 0x1310020 0xc0008
[76061.441361]DSC+0x090: 0x77b08bb 0x10f01800 0x20001007 0x330f0f06
[76061.441362]DSC+0x0a0: 0x382a1c0e 0x69625446 0x7b797770 0x7e7d
[76061.441364]DSC+0x0b0: 0x1040900 0xf9450125 0xe967f167 0xe187e167
[76061.441366]DSC+0x0c0: 0xd9c7e1a7 0xd209d9e9 0xd22bd229 0xd271
[76061.441367]DSC+0x0d0: 0x0 0x0 0x0 0x0
[76061.441369]DSC+0x0e0: 0x0 0x0 0x0 0x0
[76061.441370]DSC+0x0f0: 0x0 0x0 0x0 0x0
[76061.441372]DSC+0x100: 0xc12 0xd08 0x10001572 0x10001572
[76061.441374]DSC+0x110: 0x0 0x0 0x0 0x0
[76061.441375]DSC+0x120: 0x0 0x0 0x0 0x0
[76061.441377]DSC+0x130: 0x10141072 0x3014708c 0x510051 0x2358
[76061.441379]DSC+0x140: 0xaf00bb 0x6ca 0x6ca00c3 0x6ca008a
[76061.441380]DSC+0x150: 0xac3b0 0x0 0x0 0x0
[76061.441382]DSC+0x160: 0xa0442030 0xc054a048 0x0 0x0
[76061.441383]DSC+0x170: 0x0 0xffffffff 0x0 0x0
[76061.441385]DSC+0x180: 0x0 0x0 0x0 0x0
[76061.441386]DSC+0x190: 0x0 0x0 0x0 0x0
[76061.441388]DSC+0x1a0: 0x0 0x0 0x0 0x0
[76061.441390]DSC+0x1b0: 0x0 0x0 0x0 0x0
[76061.441391]DSC+0x1c0: 0x0 0x0 0x0 0x0
[76061.441393]DSC+0x1d0: 0x0 0x0 0x0 0x0
[76061.441394]DSC+0x1e0: 0x0 0x0 0x0 0x0
[76061.441396]DSC+0x1f0: 0x0 0x0 0x0 0x0
(2) 找屏厂要对应 128 bytes PPS,利用 DSC_Parse_tool 计算出 result.txt,查看理论的 dsc pps 寄存器配置:
================================================================
| DSC PPS Parameter Register 0 ~ 19 |
================================================================
0x80 DISP_REG_DSC_PPS00 0x000c80ab
0x84 DISP_REG_DSC_PPS01 0x02320200
0x88 DISP_REG_DSC_PPS02 0x01310020
0x8c DISP_REG_DSC_PPS03 0x000c0008
0x90 DISP_REG_DSC_PPS04 0x077b08bb
0x94 DISP_REG_DSC_PPS05 0x10f01800
0x98 DISP_REG_DSC_PPS06 0x20001007
0x9c DISP_REG_DSC_PPS07 0x330f0f06
0xa0 DISP_REG_DSC_PPS08 0x382a1c0e
0xa4 DISP_REG_DSC_PPS09 0x69625446
0xa8 DISP_REG_DSC_PPS10 0x7b797770
0xac DISP_REG_DSC_PPS11 0x00007e7d
0xb0 DISP_REG_DSC_PPS12 0x01040900
0xb4 DISP_REG_DSC_PPS13 0xf9450125
0xb8 DISP_REG_DSC_PPS14 0xe967f167
0xbc DISP_REG_DSC_PPS15 0xe187e167
0xc0 DISP_REG_DSC_PPS16 0xd9c7e1a7
0xc4 DISP_REG_DSC_PPS17 0xd209d9e9
0xc8 DISP_REG_DSC_PPS18 0xd22bd229
0xcc DISP_REG_DSC_PPS19 0x0000d271
(3) 对比真实的 dsc pps 寄存器设定和理论的 dsc pps 设定是否一致。如果二者不一致,请按照 DSC 参数配置 => 4.mtk dsc config 再排查一遍相关配置是否正确。
如果配置没有问题,请初步排查为什么代码实际配置不是理论预期,然后提 case 给 MTK 分析。
2.check mtk dsc params
目的:检查 AP 端 DSC Encoder 的非 PPS 其他设定
排查:如果直接从 dsc register 排查设定是比较难排查的,我们可以初步排查 sw code 是否有正确配置,避免手不听话敲错代码犯了低级错误。
举例:按照 DSC 参数配置 => 3.mtk dsc params 排查下面的相关配置是否正确,是否和 DSC_Parse_tool 计算出来的 result.txt 理论值相同。
1) .dsc_param_load_mode 是 kernel-6.1 之后才需要配置的,往前的版本不需要配置
2) .dsc_params 的 .dsc_cg 需要特别留意
3) .dsc_params 的 .ext_pps_cfg 在 kernel-5.15 之后支援,如果采用该方式也需要排查相关配置
3.check panel dsc init
目的:检查 Panel 端的 DSC Decoder 的相关设定
排查:
1) 找屏厂确认,如何检查 panel dsc init code 是否有完整正确下到屏端,是否有可读的寄存器确认,理论的寄存器值等等。
2) 找屏厂确认,屏端初始化的时候下 dsc init code 是否有什么特殊要求,如是否存在什么特殊的时序要求等等。
3)找屏厂确认,屏端初始化的 dsc init code 是否合理,如有些屏厂是完整版设定 128 Bytes、有些是精简版等。
4)找屏厂确认,屏端初始化是否正常,有没有可能是因为 dsc init code 比较长,而发 init code 的时间有限,导致其他的 init code 没有来的及发到屏端
4.check 128 bytes PPS
目的:有些时候屏厂提供的 128 bytes PPS 不一定是合理的,maybe 他们也是在 try,所以有必要排查 128 bytes PPS 是否合理
排查:
1)如果用的是平台提供的 DSC Parse Tool 计算的 result.txt,请先检查 dump 出来的 128 bytes PPS 是否正确,避免坏了大事咯,干了无用功;
2)找屏厂排查 128 bytes PPS 是否合理。
比如,屏厂是否可以根据 128 bytes PPS 去设定屏端,不吃 AP 的送图,直接喂图给屏端,看看屏端是否可以正确显示,这样子可以排除 AP 设定的问题;
5.如果通过前面的初步排查,都没有办法确认到问题点,思考一下会不会不是 dsc porting 导致的问题呢,而是其他 module 导致的异常呢?
1) 按照 "点屏不亮的check" 和 "点屏中的异常处理",排查基础问题,如供电是否正常、屏端初始化时序是否正常、屏端是否有正确初始化等等;
2)如果经过上面的排查,屏端状态都是 OK 的,平台的相关设定也没有发现问题,可以考虑把 DSC 关掉看看,确认是不是真的是因为开了 DSC 导致的问题:
6.如果上述的初步排查均无效,请提供以下材料,提 case 到 MTK 具体问题具体分析:
1) 提供屏厂给的完整 128 bytes PPS;
2)提供 lk 和 kernel 的 panel driver .c 和 .h 文件,至少需要包括 dsc init code & dsc params;
3)提供平台显示相关的 source code
lk code: (lk or lk2 看具体项目)
/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6xxx/
/vendor/mediatek/proprietary/bootable/bootloader/lk2/platform/mediatek/mt6xxx/disp/
Note: 如果贵司内部有上传代码限制,可以只上传对应目录下的 ddp_dsc.c 和 ddp_reg_dsc.h
kernel code: (mediatek or mediatek_v2 看具体项目)
kernel-xxx/drivers/gpu/drm/mediatek/
kernel-xxx/drviers/gpu/drm/mediatek/mediatek_v2/
Note: 如果贵司内部有上传代码限制,可以只上传对应目录下的 mtk_disp_dsc.c 和 mtk_disp_dsc.h
4)提供异常显示时的 mtkfb diagnose
adb shell "echo logger:on > /proc/mtkfb"
adb shell "echo enable_idlemgr:0 > /proc/mtkfb"
adb shell "echo diagnose > /proc/mtkfb && cat /proc/mtkfb" > mtkfb.txt