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

drm/rockchip: vop2: Introduce vop hardware version

There is a version number hardcoded in the VOP VERSION_INFO
register, and the version number increments sequentially based
on the production order of the SoC.

So using this version number to distinguish different VOP features
will simplify the code.

Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
Tested-by: Michael Riesch <michael.riesch@wolfvision.net> # on RK3568
Tested-by: Detlev Casanova <detlev.casanova@collabora.com>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20250218112744.34433-7-andyshrk@163.com

authored by

Andy Yan and committed by
Heiko Stuebner
301618ed 5439c4f3

+33 -7
+19 -7
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
··· 355 355 356 356 static bool vop2_output_rg_swap(struct vop2 *vop2, u32 bus_format) 357 357 { 358 - if (vop2->data->soc_id == 3588) { 358 + if (vop2->version == VOP_VERSION_RK3588) { 359 359 if (bus_format == MEDIA_BUS_FMT_YUV8_1X24 || 360 360 bus_format == MEDIA_BUS_FMT_YUV10_1X30) 361 361 return true; ··· 408 408 if (modifier == DRM_FORMAT_MOD_INVALID) 409 409 return false; 410 410 411 - if (vop2->data->soc_id == 3568 || vop2->data->soc_id == 3566) { 411 + if (vop2->version == VOP_VERSION_RK3568) { 412 412 if (vop2_cluster_window(win)) { 413 413 if (modifier == DRM_FORMAT_MOD_LINEAR) { 414 414 drm_dbg_kms(vop2->drm, ··· 419 419 } 420 420 421 421 if (format == DRM_FORMAT_XRGB2101010 || format == DRM_FORMAT_XBGR2101010) { 422 - if (vop2->data->soc_id == 3588) { 422 + if (vop2->version == VOP_VERSION_RK3588) { 423 423 if (!rockchip_afbc(plane, modifier)) { 424 424 drm_dbg_kms(vop2->drm, "Only support 32 bpp format with afbc\n"); 425 425 return false; ··· 818 818 static void vop2_enable(struct vop2 *vop2) 819 819 { 820 820 int ret; 821 + u32 version; 821 822 822 823 ret = pm_runtime_resume_and_get(vop2->dev); 823 824 if (ret < 0) { ··· 838 837 return; 839 838 } 840 839 840 + version = vop2_readl(vop2, RK3568_VERSION_INFO); 841 + if (version != vop2->version) { 842 + drm_err(vop2->drm, "Hardware version(0x%08x) mismatch\n", version); 843 + return; 844 + } 845 + 846 + /* 847 + * rk3566 share the same vop version with rk3568, so 848 + * we need to use soc_id for identification here. 849 + */ 841 850 if (vop2->data->soc_id == 3566) 842 851 vop2_writel(vop2, RK3568_OTP_WIN_EN, 1); 843 852 844 - if (vop2->data->soc_id == 3588) 853 + if (vop2->version == VOP_VERSION_RK3588) 845 854 rk3588_vop2_power_domain_enable_all(vop2); 846 855 847 856 vop2_writel(vop2, RK3568_REG_CFG_DONE, RK3568_REG_CFG_DONE__GLB_CFG_DONE_EN); ··· 932 921 933 922 static inline bool vop2_supports_seamless_gamma_lut_update(struct vop2 *vop2) 934 923 { 935 - return (vop2->data->soc_id != 3566 && vop2->data->soc_id != 3568); 924 + return vop2->version != VOP_VERSION_RK3568; 936 925 } 937 926 938 927 static bool vop2_gamma_lut_in_use(struct vop2 *vop2, struct vop2_video_port *vp) ··· 1274 1263 &fb->format->format, 1275 1264 afbc_en ? "AFBC" : "", &yrgb_mst); 1276 1265 1277 - if (vop2->data->soc_id > 3568) { 1266 + if (vop2->version > VOP_VERSION_RK3568) { 1278 1267 vop2_win_write(win, VOP2_WIN_AXI_BUS_ID, win->data->axi_bus_id); 1279 1268 vop2_win_write(win, VOP2_WIN_AXI_YRGB_R_ID, win->data->axi_yrgb_r_id); 1280 1269 vop2_win_write(win, VOP2_WIN_AXI_UV_R_ID, win->data->axi_uv_r_id); ··· 1334 1323 * this bit is gating disable, we should write 1 to 1335 1324 * disable gating when enable afbc. 1336 1325 */ 1337 - if (vop2->data->soc_id == 3566 || vop2->data->soc_id == 3568) 1326 + if (vop2->version == VOP_VERSION_RK3568) 1338 1327 vop2_win_write(win, VOP2_WIN_AFBC_AUTO_GATING_EN, 0); 1339 1328 else 1340 1329 vop2_win_write(win, VOP2_WIN_AFBC_AUTO_GATING_EN, 1); ··· 2545 2534 vop2->dev = dev; 2546 2535 vop2->data = vop2_data; 2547 2536 vop2->ops = vop2_data->ops; 2537 + vop2->version = vop2_data->version; 2548 2538 vop2->drm = drm; 2549 2539 2550 2540 dev_set_drvdata(dev, vop2);
+11
drivers/gpu/drm/rockchip/rockchip_drm_vop2.h
··· 13 13 #include "rockchip_drm_drv.h" 14 14 #include "rockchip_drm_vop.h" 15 15 16 + #define VOP2_VERSION(major, minor, build) ((major) << 24 | (minor) << 16 | (build)) 17 + 18 + /* The VOP version of new SoC is bigger than the old */ 19 + #define VOP_VERSION_RK3568 VOP2_VERSION(0x40, 0x15, 0x8023) 20 + #define VOP_VERSION_RK3588 VOP2_VERSION(0x40, 0x17, 0x6786) 21 + #define VOP_VERSION_RK3528 VOP2_VERSION(0x50, 0x17, 0x1263) 22 + #define VOP_VERSION_RK3562 VOP2_VERSION(0x50, 0x17, 0x4350) 23 + #define VOP_VERSION_RK3576 VOP2_VERSION(0x50, 0x19, 0x9765) 24 + 16 25 #define VOP2_VP_FEATURE_OUTPUT_10BIT BIT(0) 17 26 18 27 #define VOP2_FEATURE_HAS_SYS_GRF BIT(0) ··· 252 243 struct vop2_data { 253 244 u8 nr_vps; 254 245 u64 feature; 246 + u32 version; 255 247 const struct vop2_ops *ops; 256 248 const struct vop2_win_data *win; 257 249 const struct vop2_video_port_data *vp; ··· 270 260 }; 271 261 272 262 struct vop2 { 263 + u32 version; 273 264 struct device *dev; 274 265 struct drm_device *drm; 275 266 struct vop2_video_port vps[ROCKCHIP_MAX_CRTC];
+3
drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
··· 1627 1627 }; 1628 1628 1629 1629 static const struct vop2_data rk3566_vop = { 1630 + .version = VOP_VERSION_RK3568, 1630 1631 .feature = VOP2_FEATURE_HAS_SYS_GRF, 1631 1632 .nr_vps = 3, 1632 1633 .max_input = { 4096, 2304 }, ··· 1646 1645 }; 1647 1646 1648 1647 static const struct vop2_data rk3568_vop = { 1648 + .version = VOP_VERSION_RK3568, 1649 1649 .feature = VOP2_FEATURE_HAS_SYS_GRF, 1650 1650 .nr_vps = 3, 1651 1651 .max_input = { 4096, 2304 }, ··· 1665 1663 }; 1666 1664 1667 1665 static const struct vop2_data rk3588_vop = { 1666 + .version = VOP_VERSION_RK3588, 1668 1667 .feature = VOP2_FEATURE_HAS_SYS_GRF | VOP2_FEATURE_HAS_VO1_GRF | 1669 1668 VOP2_FEATURE_HAS_VOP_GRF | VOP2_FEATURE_HAS_SYS_PMU, 1670 1669 .nr_vps = 4,