162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd 462306a36Sopenharmony_ci * Author:Mark Yao <mark.yao@rock-chips.com> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef _ROCKCHIP_DRM_VOP_H 862306a36Sopenharmony_ci#define _ROCKCHIP_DRM_VOP_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* 1162306a36Sopenharmony_ci * major: IP major version, used for IP structure 1262306a36Sopenharmony_ci * minor: big feature change under same structure 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_ci#define VOP_VERSION(major, minor) ((major) << 8 | (minor)) 1562306a36Sopenharmony_ci#define VOP_MAJOR(version) ((version) >> 8) 1662306a36Sopenharmony_ci#define VOP_MINOR(version) ((version) & 0xff) 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define NUM_YUV2YUV_COEFFICIENTS 12 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* AFBC supports a number of configurable modes. Relevant to us is block size 2162306a36Sopenharmony_ci * (16x16 or 32x8), storage modifiers (SPARSE, SPLIT), and the YUV-like 2262306a36Sopenharmony_ci * colourspace transform (YTR). 16x16 SPARSE mode is always used. SPLIT mode 2362306a36Sopenharmony_ci * could be enabled via the hreg_block_split register, but is not currently 2462306a36Sopenharmony_ci * handled. The colourspace transform is implicitly always assumed by the 2562306a36Sopenharmony_ci * decoder, so consumers must use this transform as well. 2662306a36Sopenharmony_ci * 2762306a36Sopenharmony_ci * Failure to match modifiers will cause errors displaying AFBC buffers 2862306a36Sopenharmony_ci * produced by conformant AFBC producers, including Mesa. 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_ci#define ROCKCHIP_AFBC_MOD \ 3162306a36Sopenharmony_ci DRM_FORMAT_MOD_ARM_AFBC( \ 3262306a36Sopenharmony_ci AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | AFBC_FORMAT_MOD_SPARSE \ 3362306a36Sopenharmony_ci | AFBC_FORMAT_MOD_YTR \ 3462306a36Sopenharmony_ci ) 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cienum vop_data_format { 3762306a36Sopenharmony_ci VOP_FMT_ARGB8888 = 0, 3862306a36Sopenharmony_ci VOP_FMT_RGB888, 3962306a36Sopenharmony_ci VOP_FMT_RGB565, 4062306a36Sopenharmony_ci VOP_FMT_YUV420SP = 4, 4162306a36Sopenharmony_ci VOP_FMT_YUV422SP, 4262306a36Sopenharmony_ci VOP_FMT_YUV444SP, 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistruct vop_rect { 4662306a36Sopenharmony_ci int width; 4762306a36Sopenharmony_ci int height; 4862306a36Sopenharmony_ci}; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cistruct vop_reg { 5162306a36Sopenharmony_ci uint32_t mask; 5262306a36Sopenharmony_ci uint16_t offset; 5362306a36Sopenharmony_ci uint8_t shift; 5462306a36Sopenharmony_ci bool write_mask; 5562306a36Sopenharmony_ci bool relaxed; 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct vop_afbc { 5962306a36Sopenharmony_ci struct vop_reg enable; 6062306a36Sopenharmony_ci struct vop_reg win_sel; 6162306a36Sopenharmony_ci struct vop_reg format; 6262306a36Sopenharmony_ci struct vop_reg rb_swap; 6362306a36Sopenharmony_ci struct vop_reg uv_swap; 6462306a36Sopenharmony_ci struct vop_reg auto_gating_en; 6562306a36Sopenharmony_ci struct vop_reg block_split_en; 6662306a36Sopenharmony_ci struct vop_reg pic_vir_width; 6762306a36Sopenharmony_ci struct vop_reg tile_num; 6862306a36Sopenharmony_ci struct vop_reg hreg_block_split; 6962306a36Sopenharmony_ci struct vop_reg pic_offset; 7062306a36Sopenharmony_ci struct vop_reg pic_size; 7162306a36Sopenharmony_ci struct vop_reg dsp_offset; 7262306a36Sopenharmony_ci struct vop_reg transform_offset; 7362306a36Sopenharmony_ci struct vop_reg hdr_ptr; 7462306a36Sopenharmony_ci struct vop_reg half_block_en; 7562306a36Sopenharmony_ci struct vop_reg xmirror; 7662306a36Sopenharmony_ci struct vop_reg ymirror; 7762306a36Sopenharmony_ci struct vop_reg rotate_270; 7862306a36Sopenharmony_ci struct vop_reg rotate_90; 7962306a36Sopenharmony_ci struct vop_reg rstn; 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistruct vop_modeset { 8362306a36Sopenharmony_ci struct vop_reg htotal_pw; 8462306a36Sopenharmony_ci struct vop_reg hact_st_end; 8562306a36Sopenharmony_ci struct vop_reg hpost_st_end; 8662306a36Sopenharmony_ci struct vop_reg vtotal_pw; 8762306a36Sopenharmony_ci struct vop_reg vact_st_end; 8862306a36Sopenharmony_ci struct vop_reg vpost_st_end; 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cistruct vop_output { 9262306a36Sopenharmony_ci struct vop_reg pin_pol; 9362306a36Sopenharmony_ci struct vop_reg dp_pin_pol; 9462306a36Sopenharmony_ci struct vop_reg dp_dclk_pol; 9562306a36Sopenharmony_ci struct vop_reg edp_pin_pol; 9662306a36Sopenharmony_ci struct vop_reg edp_dclk_pol; 9762306a36Sopenharmony_ci struct vop_reg hdmi_pin_pol; 9862306a36Sopenharmony_ci struct vop_reg hdmi_dclk_pol; 9962306a36Sopenharmony_ci struct vop_reg mipi_pin_pol; 10062306a36Sopenharmony_ci struct vop_reg mipi_dclk_pol; 10162306a36Sopenharmony_ci struct vop_reg rgb_pin_pol; 10262306a36Sopenharmony_ci struct vop_reg rgb_dclk_pol; 10362306a36Sopenharmony_ci struct vop_reg dp_en; 10462306a36Sopenharmony_ci struct vop_reg edp_en; 10562306a36Sopenharmony_ci struct vop_reg hdmi_en; 10662306a36Sopenharmony_ci struct vop_reg mipi_en; 10762306a36Sopenharmony_ci struct vop_reg mipi_dual_channel_en; 10862306a36Sopenharmony_ci struct vop_reg rgb_en; 10962306a36Sopenharmony_ci}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistruct vop_common { 11262306a36Sopenharmony_ci struct vop_reg cfg_done; 11362306a36Sopenharmony_ci struct vop_reg dsp_blank; 11462306a36Sopenharmony_ci struct vop_reg data_blank; 11562306a36Sopenharmony_ci struct vop_reg pre_dither_down; 11662306a36Sopenharmony_ci struct vop_reg dither_down_sel; 11762306a36Sopenharmony_ci struct vop_reg dither_down_mode; 11862306a36Sopenharmony_ci struct vop_reg dither_down_en; 11962306a36Sopenharmony_ci struct vop_reg dither_up; 12062306a36Sopenharmony_ci struct vop_reg dsp_lut_en; 12162306a36Sopenharmony_ci struct vop_reg update_gamma_lut; 12262306a36Sopenharmony_ci struct vop_reg lut_buffer_index; 12362306a36Sopenharmony_ci struct vop_reg gate_en; 12462306a36Sopenharmony_ci struct vop_reg mmu_en; 12562306a36Sopenharmony_ci struct vop_reg out_mode; 12662306a36Sopenharmony_ci struct vop_reg standby; 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cistruct vop_misc { 13062306a36Sopenharmony_ci struct vop_reg global_regdone_en; 13162306a36Sopenharmony_ci}; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistruct vop_intr { 13462306a36Sopenharmony_ci const int *intrs; 13562306a36Sopenharmony_ci uint32_t nintrs; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci struct vop_reg line_flag_num[2]; 13862306a36Sopenharmony_ci struct vop_reg enable; 13962306a36Sopenharmony_ci struct vop_reg clear; 14062306a36Sopenharmony_ci struct vop_reg status; 14162306a36Sopenharmony_ci}; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistruct vop_scl_extension { 14462306a36Sopenharmony_ci struct vop_reg cbcr_vsd_mode; 14562306a36Sopenharmony_ci struct vop_reg cbcr_vsu_mode; 14662306a36Sopenharmony_ci struct vop_reg cbcr_hsd_mode; 14762306a36Sopenharmony_ci struct vop_reg cbcr_ver_scl_mode; 14862306a36Sopenharmony_ci struct vop_reg cbcr_hor_scl_mode; 14962306a36Sopenharmony_ci struct vop_reg yrgb_vsd_mode; 15062306a36Sopenharmony_ci struct vop_reg yrgb_vsu_mode; 15162306a36Sopenharmony_ci struct vop_reg yrgb_hsd_mode; 15262306a36Sopenharmony_ci struct vop_reg yrgb_ver_scl_mode; 15362306a36Sopenharmony_ci struct vop_reg yrgb_hor_scl_mode; 15462306a36Sopenharmony_ci struct vop_reg line_load_mode; 15562306a36Sopenharmony_ci struct vop_reg cbcr_axi_gather_num; 15662306a36Sopenharmony_ci struct vop_reg yrgb_axi_gather_num; 15762306a36Sopenharmony_ci struct vop_reg vsd_cbcr_gt2; 15862306a36Sopenharmony_ci struct vop_reg vsd_cbcr_gt4; 15962306a36Sopenharmony_ci struct vop_reg vsd_yrgb_gt2; 16062306a36Sopenharmony_ci struct vop_reg vsd_yrgb_gt4; 16162306a36Sopenharmony_ci struct vop_reg bic_coe_sel; 16262306a36Sopenharmony_ci struct vop_reg cbcr_axi_gather_en; 16362306a36Sopenharmony_ci struct vop_reg yrgb_axi_gather_en; 16462306a36Sopenharmony_ci struct vop_reg lb_mode; 16562306a36Sopenharmony_ci}; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_cistruct vop_scl_regs { 16862306a36Sopenharmony_ci const struct vop_scl_extension *ext; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci struct vop_reg scale_yrgb_x; 17162306a36Sopenharmony_ci struct vop_reg scale_yrgb_y; 17262306a36Sopenharmony_ci struct vop_reg scale_cbcr_x; 17362306a36Sopenharmony_ci struct vop_reg scale_cbcr_y; 17462306a36Sopenharmony_ci}; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_cistruct vop_yuv2yuv_phy { 17762306a36Sopenharmony_ci struct vop_reg y2r_coefficients[NUM_YUV2YUV_COEFFICIENTS]; 17862306a36Sopenharmony_ci}; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_cistruct vop_win_phy { 18162306a36Sopenharmony_ci const struct vop_scl_regs *scl; 18262306a36Sopenharmony_ci const uint32_t *data_formats; 18362306a36Sopenharmony_ci uint32_t nformats; 18462306a36Sopenharmony_ci const uint64_t *format_modifiers; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci struct vop_reg enable; 18762306a36Sopenharmony_ci struct vop_reg gate; 18862306a36Sopenharmony_ci struct vop_reg format; 18962306a36Sopenharmony_ci struct vop_reg rb_swap; 19062306a36Sopenharmony_ci struct vop_reg uv_swap; 19162306a36Sopenharmony_ci struct vop_reg act_info; 19262306a36Sopenharmony_ci struct vop_reg dsp_info; 19362306a36Sopenharmony_ci struct vop_reg dsp_st; 19462306a36Sopenharmony_ci struct vop_reg yrgb_mst; 19562306a36Sopenharmony_ci struct vop_reg uv_mst; 19662306a36Sopenharmony_ci struct vop_reg yrgb_vir; 19762306a36Sopenharmony_ci struct vop_reg uv_vir; 19862306a36Sopenharmony_ci struct vop_reg y_mir_en; 19962306a36Sopenharmony_ci struct vop_reg x_mir_en; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci struct vop_reg dst_alpha_ctl; 20262306a36Sopenharmony_ci struct vop_reg src_alpha_ctl; 20362306a36Sopenharmony_ci struct vop_reg alpha_pre_mul; 20462306a36Sopenharmony_ci struct vop_reg alpha_mode; 20562306a36Sopenharmony_ci struct vop_reg alpha_en; 20662306a36Sopenharmony_ci struct vop_reg channel; 20762306a36Sopenharmony_ci}; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_cistruct vop_win_yuv2yuv_data { 21062306a36Sopenharmony_ci uint32_t base; 21162306a36Sopenharmony_ci const struct vop_yuv2yuv_phy *phy; 21262306a36Sopenharmony_ci struct vop_reg y2r_en; 21362306a36Sopenharmony_ci}; 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_cistruct vop_win_data { 21662306a36Sopenharmony_ci uint32_t base; 21762306a36Sopenharmony_ci const struct vop_win_phy *phy; 21862306a36Sopenharmony_ci enum drm_plane_type type; 21962306a36Sopenharmony_ci}; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_cistruct vop_data { 22262306a36Sopenharmony_ci uint32_t version; 22362306a36Sopenharmony_ci const struct vop_intr *intr; 22462306a36Sopenharmony_ci const struct vop_common *common; 22562306a36Sopenharmony_ci const struct vop_misc *misc; 22662306a36Sopenharmony_ci const struct vop_modeset *modeset; 22762306a36Sopenharmony_ci const struct vop_output *output; 22862306a36Sopenharmony_ci const struct vop_afbc *afbc; 22962306a36Sopenharmony_ci const struct vop_win_yuv2yuv_data *win_yuv2yuv; 23062306a36Sopenharmony_ci const struct vop_win_data *win; 23162306a36Sopenharmony_ci unsigned int win_size; 23262306a36Sopenharmony_ci unsigned int lut_size; 23362306a36Sopenharmony_ci struct vop_rect max_output; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci#define VOP_FEATURE_OUTPUT_RGB10 BIT(0) 23662306a36Sopenharmony_ci#define VOP_FEATURE_INTERNAL_RGB BIT(1) 23762306a36Sopenharmony_ci u64 feature; 23862306a36Sopenharmony_ci}; 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci/* interrupt define */ 24162306a36Sopenharmony_ci#define DSP_HOLD_VALID_INTR (1 << 0) 24262306a36Sopenharmony_ci#define FS_INTR (1 << 1) 24362306a36Sopenharmony_ci#define LINE_FLAG_INTR (1 << 2) 24462306a36Sopenharmony_ci#define BUS_ERROR_INTR (1 << 3) 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci#define INTR_MASK (DSP_HOLD_VALID_INTR | FS_INTR | \ 24762306a36Sopenharmony_ci LINE_FLAG_INTR | BUS_ERROR_INTR) 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci#define DSP_HOLD_VALID_INTR_EN(x) ((x) << 4) 25062306a36Sopenharmony_ci#define FS_INTR_EN(x) ((x) << 5) 25162306a36Sopenharmony_ci#define LINE_FLAG_INTR_EN(x) ((x) << 6) 25262306a36Sopenharmony_ci#define BUS_ERROR_INTR_EN(x) ((x) << 7) 25362306a36Sopenharmony_ci#define DSP_HOLD_VALID_INTR_MASK (1 << 4) 25462306a36Sopenharmony_ci#define FS_INTR_MASK (1 << 5) 25562306a36Sopenharmony_ci#define LINE_FLAG_INTR_MASK (1 << 6) 25662306a36Sopenharmony_ci#define BUS_ERROR_INTR_MASK (1 << 7) 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci#define INTR_CLR_SHIFT 8 25962306a36Sopenharmony_ci#define DSP_HOLD_VALID_INTR_CLR (1 << (INTR_CLR_SHIFT + 0)) 26062306a36Sopenharmony_ci#define FS_INTR_CLR (1 << (INTR_CLR_SHIFT + 1)) 26162306a36Sopenharmony_ci#define LINE_FLAG_INTR_CLR (1 << (INTR_CLR_SHIFT + 2)) 26262306a36Sopenharmony_ci#define BUS_ERROR_INTR_CLR (1 << (INTR_CLR_SHIFT + 3)) 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci#define DSP_LINE_NUM(x) (((x) & 0x1fff) << 12) 26562306a36Sopenharmony_ci#define DSP_LINE_NUM_MASK (0x1fff << 12) 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci/* src alpha ctrl define */ 26862306a36Sopenharmony_ci#define SRC_FADING_VALUE(x) (((x) & 0xff) << 24) 26962306a36Sopenharmony_ci#define SRC_GLOBAL_ALPHA(x) (((x) & 0xff) << 16) 27062306a36Sopenharmony_ci#define SRC_FACTOR_M0(x) (((x) & 0x7) << 6) 27162306a36Sopenharmony_ci#define SRC_ALPHA_CAL_M0(x) (((x) & 0x1) << 5) 27262306a36Sopenharmony_ci#define SRC_BLEND_M0(x) (((x) & 0x3) << 3) 27362306a36Sopenharmony_ci#define SRC_ALPHA_M0(x) (((x) & 0x1) << 2) 27462306a36Sopenharmony_ci#define SRC_COLOR_M0(x) (((x) & 0x1) << 1) 27562306a36Sopenharmony_ci#define SRC_ALPHA_EN(x) (((x) & 0x1) << 0) 27662306a36Sopenharmony_ci/* dst alpha ctrl define */ 27762306a36Sopenharmony_ci#define DST_FACTOR_M0(x) (((x) & 0x7) << 6) 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci/* 28062306a36Sopenharmony_ci * display output interface supported by rockchip lcdc 28162306a36Sopenharmony_ci */ 28262306a36Sopenharmony_ci#define ROCKCHIP_OUT_MODE_P888 0 28362306a36Sopenharmony_ci#define ROCKCHIP_OUT_MODE_P666 1 28462306a36Sopenharmony_ci#define ROCKCHIP_OUT_MODE_P565 2 28562306a36Sopenharmony_ci/* for use special outface */ 28662306a36Sopenharmony_ci#define ROCKCHIP_OUT_MODE_AAAA 15 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci/* output flags */ 28962306a36Sopenharmony_ci#define ROCKCHIP_OUTPUT_DSI_DUAL BIT(0) 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_cienum alpha_mode { 29262306a36Sopenharmony_ci ALPHA_STRAIGHT, 29362306a36Sopenharmony_ci ALPHA_INVERSE, 29462306a36Sopenharmony_ci}; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_cienum global_blend_mode { 29762306a36Sopenharmony_ci ALPHA_GLOBAL, 29862306a36Sopenharmony_ci ALPHA_PER_PIX, 29962306a36Sopenharmony_ci ALPHA_PER_PIX_GLOBAL, 30062306a36Sopenharmony_ci}; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_cienum alpha_cal_mode { 30362306a36Sopenharmony_ci ALPHA_SATURATION, 30462306a36Sopenharmony_ci ALPHA_NO_SATURATION, 30562306a36Sopenharmony_ci}; 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_cienum color_mode { 30862306a36Sopenharmony_ci ALPHA_SRC_PRE_MUL, 30962306a36Sopenharmony_ci ALPHA_SRC_NO_PRE_MUL, 31062306a36Sopenharmony_ci}; 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_cienum factor_mode { 31362306a36Sopenharmony_ci ALPHA_ZERO, 31462306a36Sopenharmony_ci ALPHA_ONE, 31562306a36Sopenharmony_ci ALPHA_SRC, 31662306a36Sopenharmony_ci ALPHA_SRC_INVERSE, 31762306a36Sopenharmony_ci ALPHA_SRC_GLOBAL, 31862306a36Sopenharmony_ci}; 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_cienum scale_mode { 32162306a36Sopenharmony_ci SCALE_NONE = 0x0, 32262306a36Sopenharmony_ci SCALE_UP = 0x1, 32362306a36Sopenharmony_ci SCALE_DOWN = 0x2 32462306a36Sopenharmony_ci}; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_cienum lb_mode { 32762306a36Sopenharmony_ci LB_YUV_3840X5 = 0x0, 32862306a36Sopenharmony_ci LB_YUV_2560X8 = 0x1, 32962306a36Sopenharmony_ci LB_RGB_3840X2 = 0x2, 33062306a36Sopenharmony_ci LB_RGB_2560X4 = 0x3, 33162306a36Sopenharmony_ci LB_RGB_1920X5 = 0x4, 33262306a36Sopenharmony_ci LB_RGB_1280X8 = 0x5 33362306a36Sopenharmony_ci}; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_cienum sacle_up_mode { 33662306a36Sopenharmony_ci SCALE_UP_BIL = 0x0, 33762306a36Sopenharmony_ci SCALE_UP_BIC = 0x1 33862306a36Sopenharmony_ci}; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_cienum scale_down_mode { 34162306a36Sopenharmony_ci SCALE_DOWN_BIL = 0x0, 34262306a36Sopenharmony_ci SCALE_DOWN_AVG = 0x1 34362306a36Sopenharmony_ci}; 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_cienum dither_down_mode { 34662306a36Sopenharmony_ci RGB888_TO_RGB565 = 0x0, 34762306a36Sopenharmony_ci RGB888_TO_RGB666 = 0x1 34862306a36Sopenharmony_ci}; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_cienum dither_down_mode_sel { 35162306a36Sopenharmony_ci DITHER_DOWN_ALLEGRO = 0x0, 35262306a36Sopenharmony_ci DITHER_DOWN_FRC = 0x1 35362306a36Sopenharmony_ci}; 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_cienum vop_pol { 35662306a36Sopenharmony_ci HSYNC_POSITIVE = 0, 35762306a36Sopenharmony_ci VSYNC_POSITIVE = 1, 35862306a36Sopenharmony_ci DEN_NEGATIVE = 2 35962306a36Sopenharmony_ci}; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci#define FRAC_16_16(mult, div) (((mult) << 16) / (div)) 36262306a36Sopenharmony_ci#define SCL_FT_DEFAULT_FIXPOINT_SHIFT 12 36362306a36Sopenharmony_ci#define SCL_MAX_VSKIPLINES 4 36462306a36Sopenharmony_ci#define MIN_SCL_FT_AFTER_VSKIP 1 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_cistatic inline uint16_t scl_cal_scale(int src, int dst, int shift) 36762306a36Sopenharmony_ci{ 36862306a36Sopenharmony_ci return ((src * 2 - 3) << (shift - 1)) / (dst - 1); 36962306a36Sopenharmony_ci} 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_cistatic inline uint16_t scl_cal_scale2(int src, int dst) 37262306a36Sopenharmony_ci{ 37362306a36Sopenharmony_ci return ((src - 1) << 12) / (dst - 1); 37462306a36Sopenharmony_ci} 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci#define GET_SCL_FT_BILI_DN(src, dst) scl_cal_scale(src, dst, 12) 37762306a36Sopenharmony_ci#define GET_SCL_FT_BILI_UP(src, dst) scl_cal_scale(src, dst, 16) 37862306a36Sopenharmony_ci#define GET_SCL_FT_BIC(src, dst) scl_cal_scale(src, dst, 16) 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_cistatic inline uint16_t scl_get_bili_dn_vskip(int src_h, int dst_h, 38162306a36Sopenharmony_ci int vskiplines) 38262306a36Sopenharmony_ci{ 38362306a36Sopenharmony_ci int act_height; 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci act_height = DIV_ROUND_UP(src_h, vskiplines); 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci if (act_height == dst_h) 38862306a36Sopenharmony_ci return GET_SCL_FT_BILI_DN(src_h, dst_h) / vskiplines; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci return GET_SCL_FT_BILI_DN(act_height, dst_h); 39162306a36Sopenharmony_ci} 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_cistatic inline enum scale_mode scl_get_scl_mode(int src, int dst) 39462306a36Sopenharmony_ci{ 39562306a36Sopenharmony_ci if (src < dst) 39662306a36Sopenharmony_ci return SCALE_UP; 39762306a36Sopenharmony_ci else if (src > dst) 39862306a36Sopenharmony_ci return SCALE_DOWN; 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci return SCALE_NONE; 40162306a36Sopenharmony_ci} 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_cistatic inline int scl_get_vskiplines(uint32_t srch, uint32_t dsth) 40462306a36Sopenharmony_ci{ 40562306a36Sopenharmony_ci uint32_t vskiplines; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci for (vskiplines = SCL_MAX_VSKIPLINES; vskiplines > 1; vskiplines /= 2) 40862306a36Sopenharmony_ci if (srch >= vskiplines * dsth * MIN_SCL_FT_AFTER_VSKIP) 40962306a36Sopenharmony_ci break; 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci return vskiplines; 41262306a36Sopenharmony_ci} 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_cistatic inline int scl_vop_cal_lb_mode(int width, bool is_yuv) 41562306a36Sopenharmony_ci{ 41662306a36Sopenharmony_ci int lb_mode; 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci if (is_yuv) { 41962306a36Sopenharmony_ci if (width > 1280) 42062306a36Sopenharmony_ci lb_mode = LB_YUV_3840X5; 42162306a36Sopenharmony_ci else 42262306a36Sopenharmony_ci lb_mode = LB_YUV_2560X8; 42362306a36Sopenharmony_ci } else { 42462306a36Sopenharmony_ci if (width > 2560) 42562306a36Sopenharmony_ci lb_mode = LB_RGB_3840X2; 42662306a36Sopenharmony_ci else if (width > 1920) 42762306a36Sopenharmony_ci lb_mode = LB_RGB_2560X4; 42862306a36Sopenharmony_ci else 42962306a36Sopenharmony_ci lb_mode = LB_RGB_1920X5; 43062306a36Sopenharmony_ci } 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci return lb_mode; 43362306a36Sopenharmony_ci} 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ciextern const struct component_ops vop_component_ops; 43662306a36Sopenharmony_ci#endif /* _ROCKCHIP_DRM_VOP_H */ 437