From 99d9bea0a078739691c0502736154d37aacbb7d1 Mon Sep 17 00:00:00 2001 From: Chaoyi Chen Date: Mon, 26 Aug 2024 14:32:00 +0800 Subject: [PATCH] drm/rockchip: vop: make vop version code more readable Change-Id: I0d95ba93c1fa2d837a867a69ff8646b8143d36f2 Signed-off-by: Chaoyi Chen --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 52 ++++++++++++--------- drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 19 +++++++- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 48e70d34d96b..89dc2b101ba6 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -868,7 +868,8 @@ static void scl_vop_cal_scl_fac(struct vop *vop, const struct vop_win *win, if (!win->phy->scl) return; - if ((adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) && vop->version == VOP_VERSION(2, 2)) { + if ((adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) && + vop->version == VOP_VERSION_RK3036) { VOP_SCL_SET(vop, win, scale_yrgb_x, ((src_w << 12) / dst_w)); VOP_SCL_SET(vop, win, scale_yrgb_y, ((src_h << 12) / dst_h)); if (is_yuv) { @@ -1683,7 +1684,7 @@ static void vop_initial(struct drm_crtc *crtc) VOP_CTRL_SET(vop, afbdc_en, 0); vop_enable_debug_irq(crtc); - if (vop->version == VOP_VERSION(2, 0xd)) { + if (vop->version == VOP_VERSION_RK3576_LITE) { VOP_GRF_SET(vop, grf, grf_vopl_sel, 1); VOP_CTRL_SET(vop, enable, 1); } @@ -1990,8 +1991,7 @@ static void vop_plane_atomic_disable(struct drm_plane *plane, * vop will access the freed memory lead to iommu pagefault. * so we add this reset to workaround. */ - if (VOP_MAJOR(vop->version) == 2 && VOP_MINOR(vop->version) == 5 && - win->win_id == 2) + if (vop->version == VOP_VERSION_PX30_LITE && win->win_id == 2) VOP_WIN_SET(vop, win, yrgb_mst, 0); spin_unlock(&vop->reg_lock); @@ -2121,7 +2121,9 @@ static void vop_plane_atomic_update(struct drm_plane *plane, dsp_h = 4; actual_h = dsp_h * actual_h / drm_rect_height(dest); } - if ((vop->version == VOP_VERSION(2, 2) || vop->version >= VOP_VERSION(2, 0xd)) && + if ((vop->version == VOP_VERSION_RK3036 || + vop->version == VOP_VERSION_RK3506 || + vop->version == VOP_VERSION_RK3576_LITE) && (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)) dsp_h = dsp_h / 2; @@ -2136,7 +2138,9 @@ static void vop_plane_atomic_update(struct drm_plane *plane, dsp_stx = dest->x1 + mode->crtc_htotal - mode->crtc_hsync_start; dsp_sty = dest->y1 + mode->crtc_vtotal - mode->crtc_vsync_start; - if ((vop->version == VOP_VERSION(2, 2) || vop->version >= VOP_VERSION(2, 0xd)) && + if ((vop->version == VOP_VERSION_RK3036 || + vop->version == VOP_VERSION_RK3506 || + vop->version == VOP_VERSION_RK3576_LITE) && (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)) dsp_sty = dest->y1 / 2 + mode->crtc_vtotal - mode->crtc_vsync_start; dsp_st = dsp_sty << 16 | (dsp_stx & 0xffff); @@ -2596,7 +2600,7 @@ static int vop_crtc_enable_vblank(struct drm_crtc *crtc) spin_lock_irqsave(&vop->irq_lock, flags); - if (VOP_MAJOR(vop->version) == 3 && VOP_MINOR(vop->version) >= 7) { + if (vop->version == VOP_VERSION_RK3228 || vop->version == VOP_VERSION_RK3328) { VOP_INTR_SET_TYPE(vop, clear, FS_FIELD_INTR, 1); VOP_INTR_SET_TYPE(vop, enable, FS_FIELD_INTR, 1); } else { @@ -2619,7 +2623,7 @@ static void vop_crtc_disable_vblank(struct drm_crtc *crtc) spin_lock_irqsave(&vop->irq_lock, flags); - if (VOP_MAJOR(vop->version) == 3 && VOP_MINOR(vop->version) >= 7) + if (vop->version == VOP_VERSION_RK3228 || vop->version == VOP_VERSION_RK3328) VOP_INTR_SET_TYPE(vop, enable, FS_FIELD_INTR, 0); else VOP_INTR_SET_TYPE(vop, enable, FS_INTR, 0); @@ -2928,12 +2932,13 @@ vop_crtc_mode_valid(struct drm_crtc *crtc, const struct drm_display_mode *mode) return MODE_BAD_HVALUE; if ((mode->flags & DRM_MODE_FLAG_INTERLACE) && - VOP_MAJOR(vop->version) == 3 && - VOP_MINOR(vop->version) <= 2) + (vop->version == VOP_VERSION_RK3288 || vop->version == VOP_VERSION_RK3288W || + vop->version == VOP_VERSION_RK3368)) return MODE_BAD; /* * Dclk need to be double if BT656 interface and vop version >= 2.12. + * That is RV1126/RV1106/RK3576_LITE/RK3506 */ if (mode->flags & DRM_MODE_FLAG_DBLCLK || (VOP_MAJOR(vop->version) == 2 && VOP_MINOR(vop->version) >= 12 && @@ -3322,6 +3327,7 @@ static bool vop_crtc_mode_fixup(struct drm_crtc *crtc, /* * Dclk need to be double if BT656 interface and vop version >= 2.12. + * That is RV1126/RV1106/RK3576_LITE/RK3506 */ if (mode->flags & DRM_MODE_FLAG_DBLCLK || (VOP_MAJOR(vop->version) == 2 && VOP_MINOR(vop->version) >= 12 && @@ -3427,6 +3433,9 @@ static void vop_update_csc(struct drm_crtc *crtc) struct vop *vop = to_vop(crtc); u32 val; + /* + * When using BT656, set RV1126/RV1106/RK3576_LITE/RK3506 to P8888 mode. + */ if ((s->output_mode == ROCKCHIP_OUT_MODE_AAAA && !(vop->data->feature & VOP_FEATURE_OUTPUT_10BIT)) || (VOP_MAJOR(vop->version) == 2 && VOP_MINOR(vop->version) >= 12 && @@ -3443,8 +3452,7 @@ static void vop_update_csc(struct drm_crtc *crtc) * For RK3576 vopl, rg_swap and rb_swap need to be enabled in * YUV444 bus_format. */ - if ((VOP_MAJOR(vop->version) == 2 && VOP_MINOR(vop->version) == 0xd) && - s->bus_format == MEDIA_BUS_FMT_YUV8_1X24) + if (vop->version == VOP_VERSION_RK3576_LITE && s->bus_format == MEDIA_BUS_FMT_YUV8_1X24) VOP_CTRL_SET(vop, dsp_data_swap, DSP_RG_SWAP | DSP_RB_SWAP); VOP_CTRL_SET(vop, out_mode, s->output_mode); @@ -3460,13 +3468,13 @@ static void vop_update_csc(struct drm_crtc *crtc) /* * Background color is 10bit depth if vop version >= 3.5 + * That is RK3399/RK3228/RK3328 */ if (!is_yuv_output(s->bus_format)) val = 0; - else if (vop->version == VOP_VERSION(2, 0xd)) + else if (vop->version == VOP_VERSION_RK3576_LITE) val = 0; - else if (VOP_MAJOR(vop->version) == 3 && VOP_MINOR(vop->version) == 8 && - s->hdr.pre_overlay) + else if (vop->version == VOP_VERSION_RK3328 && s->hdr.pre_overlay) val = 0; else if (VOP_MAJOR(vop->version) == 3 && VOP_MINOR(vop->version) >= 5) val = 0x20010200; @@ -3566,7 +3574,8 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, vop_crtc_load_lut(crtc); if (vop->mcu_timing.mcu_pix_total) { - if (vop->version >= VOP_VERSION(2, 0xd)) + if (vop->version == VOP_VERSION_RK3576_LITE || + vop->version == VOP_VERSION_RK3506) vop_set_out_mode(vop, s->output_mode); else vop_set_out_mode(vop, ROCKCHIP_OUT_MODE_P888); @@ -3575,7 +3584,7 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, dclk_inv = (s->bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE) ? 1 : 0; /* For improving signal quality, dclk need to be inverted by default on rv1106. */ - if ((VOP_MAJOR(vop->version) == 2 && VOP_MINOR(vop->version) == 12)) + if (vop->version == VOP_VERSION_RV1106) dclk_inv = !dclk_inv; VOP_CTRL_SET(vop, dclk_pol, dclk_inv); @@ -3635,7 +3644,7 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, * RK3576 DSI CTRL hsync/vsync polarity is positive and can't update, * so set VOP hsync/vsync polarity as positive by default. */ - if (vop->version == VOP_VERSION(2, 0xd)) + if (vop->version == VOP_VERSION_RK3576_LITE) val = BIT(HSYNC_POSITIVE) | BIT(VSYNC_POSITIVE); VOP_CTRL_SET(vop, mipi_en, 1); VOP_CTRL_SET(vop, mipi_pin_pol, val); @@ -3706,8 +3715,7 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, act_end = vact_end; } - if (VOP_MAJOR(vop->version) == 3 && - (VOP_MINOR(vop->version) == 2 || VOP_MINOR(vop->version) == 8)) + if (vop->version == VOP_VERSION_RK3368 || vop->version == VOP_VERSION_RK3328) for_ddr_freq = 1000; VOP_INTR_SET(vop, line_flag_num[0], act_end); VOP_INTR_SET(vop, line_flag_num[1], @@ -4201,7 +4209,7 @@ static void vop_tv_config_update(struct drm_crtc *crtc, VOP_CTRL_SET(vop, bcsh_sin_hue, sin_hue); VOP_CTRL_SET(vop, bcsh_cos_hue, cos_hue); VOP_CTRL_SET(vop, bcsh_out_mode, BCSH_OUT_MODE_NORMAL_VIDEO); - if (VOP_MAJOR(vop->version) == 3 && VOP_MINOR(vop->version) == 0) + if (vop->version == VOP_VERSION_RK3288) VOP_CTRL_SET(vop, auto_gate_en, 0); VOP_CTRL_SET(vop, bcsh_en, s->bcsh_en); } @@ -4248,7 +4256,7 @@ static void vop_cfg_update(struct drm_crtc *crtc, static bool vop_fs_irq_is_pending(struct vop *vop) { - if (VOP_MAJOR(vop->version) == 3 && VOP_MINOR(vop->version) >= 7) + if (vop->version == VOP_VERSION_RK3228 || vop->version == VOP_VERSION_RK3328) return VOP_INTR_GET_TYPE(vop, status, FS_FIELD_INTR); else return VOP_INTR_GET_TYPE(vop, status, FS_INTR); diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index ee86f0184afa..8d5729c8b943 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -21,7 +21,24 @@ #define VOP_MAJOR(version) ((version) >> 8) #define VOP_MINOR(version) ((version) & 0xff) -#define VOP_VERSION_RK3576_LITE VOP_VERSION(0x2, 0xd) +#define VOP_VERSION_RK3066 VOP_VERSION(2, 1) +#define VOP_VERSION_RK3036 VOP_VERSION(2, 2) +#define VOP_VERSION_RK3126 VOP_VERSION(2, 4) +#define VOP_VERSION_PX30_LITE VOP_VERSION(2, 5) +#define VOP_VERSION_PX30_BIG VOP_VERSION(2, 6) +#define VOP_VERSION_RK3308 VOP_VERSION(2, 7) +#define VOP_VERSION_RV1126 VOP_VERSION(2, 0xb) +#define VOP_VERSION_RV1106 VOP_VERSION(2, 0xc) +#define VOP_VERSION_RK3576_LITE VOP_VERSION(2, 0xd) +#define VOP_VERSION_RK3506 VOP_VERSION(2, 0xe) +#define VOP_VERSION_RK3288 VOP_VERSION(3, 0) +#define VOP_VERSION_RK3288W VOP_VERSION(3, 1) +#define VOP_VERSION_RK3368 VOP_VERSION(3, 2) +#define VOP_VERSION_RK3366 VOP_VERSION(3, 4) +#define VOP_VERSION_RK3399_BIG VOP_VERSION(3, 5) +#define VOP_VERSION_RK3399_LITE VOP_VERSION(3, 6) +#define VOP_VERSION_RK3228 VOP_VERSION(3, 7) +#define VOP_VERSION_RK3328 VOP_VERSION(3, 8) #define VOP2_VERSION(major, minor, build) ((major) << 24 | (minor) << 16 | (build)) #define VOP2_MAJOR(version) (((version) >> 24) & 0xff)