Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/rockchip: vop: Correct RK3399 VOP register fields

Commit 7707f7227f09 ("drm/rockchip: Add support for afbc") switched up
the rk3399_vop_big[] register windows, but it did so incorrectly.

The biggest problem is in rk3288_win23_data[] vs.
rk3368_win23_data[] .format field:

RK3288's format: VOP_REG(RK3288_WIN2_CTRL0, 0x7, 1)
RK3368's format: VOP_REG(RK3368_WIN2_CTRL0, 0x3, 5)

Bits 5:6 (i.e., shift 5, mask 0x3) are correct for RK3399, according to
the TRM.

There are a few other small differences between the 3288 and 3368
definitions that were swapped in commit 7707f7227f09. I reviewed them to
the best of my ability according to the RK3399 TRM and fixed them up.

This fixes IOMMU issues (and display errors) when testing with BG24
color formats.

Fixes: 7707f7227f09 ("drm/rockchip: Add support for afbc")
Cc: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Brian Norris <briannorris@chromium.org>
Tested-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20220119161104.1.I1d01436bef35165a8cdfe9308789c0badb5ff46a@changeid

authored by

Brian Norris and committed by
Heiko Stuebner
9da1e9ab c0cfbb12

+5 -3
+5 -3
drivers/gpu/drm/rockchip/rockchip_vop_reg.c
··· 902 902 .enable = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 0), 903 903 .format = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 1), 904 904 .rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12), 905 + .x_mir_en = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 21), 905 906 .y_mir_en = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 22), 906 907 .act_info = VOP_REG(RK3288_WIN0_ACT_INFO, 0x1fff1fff, 0), 907 908 .dsp_info = VOP_REG(RK3288_WIN0_DSP_INFO, 0x0fff0fff, 0), ··· 913 912 .uv_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 16), 914 913 .src_alpha_ctl = VOP_REG(RK3288_WIN0_SRC_ALPHA_CTRL, 0xff, 0), 915 914 .dst_alpha_ctl = VOP_REG(RK3288_WIN0_DST_ALPHA_CTRL, 0xff, 0), 915 + .channel = VOP_REG(RK3288_WIN0_CTRL2, 0xff, 0), 916 916 }; 917 917 918 918 /* ··· 924 922 static const struct vop_win_data rk3399_vop_win_data[] = { 925 923 { .base = 0x00, .phy = &rk3399_win01_data, 926 924 .type = DRM_PLANE_TYPE_PRIMARY }, 927 - { .base = 0x40, .phy = &rk3288_win01_data, 925 + { .base = 0x40, .phy = &rk3368_win01_data, 928 926 .type = DRM_PLANE_TYPE_OVERLAY }, 929 - { .base = 0x00, .phy = &rk3288_win23_data, 927 + { .base = 0x00, .phy = &rk3368_win23_data, 930 928 .type = DRM_PLANE_TYPE_OVERLAY }, 931 - { .base = 0x50, .phy = &rk3288_win23_data, 929 + { .base = 0x50, .phy = &rk3368_win23_data, 932 930 .type = DRM_PLANE_TYPE_CURSOR }, 933 931 }; 934 932