0001
0002
0003
0004
0005
0006
0007 #ifndef _ROCKCHIP_DRM_VOP_H
0008 #define _ROCKCHIP_DRM_VOP_H
0009
0010
0011
0012
0013
0014 #define VOP_VERSION(major, minor) ((major) << 8 | (minor))
0015 #define VOP_MAJOR(version) ((version) >> 8)
0016 #define VOP_MINOR(version) ((version) & 0xff)
0017
0018 #define NUM_YUV2YUV_COEFFICIENTS 12
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #define ROCKCHIP_AFBC_MOD \
0031 DRM_FORMAT_MOD_ARM_AFBC( \
0032 AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | AFBC_FORMAT_MOD_SPARSE \
0033 | AFBC_FORMAT_MOD_YTR \
0034 )
0035
0036 enum vop_data_format {
0037 VOP_FMT_ARGB8888 = 0,
0038 VOP_FMT_RGB888,
0039 VOP_FMT_RGB565,
0040 VOP_FMT_YUV420SP = 4,
0041 VOP_FMT_YUV422SP,
0042 VOP_FMT_YUV444SP,
0043 };
0044
0045 struct vop_reg {
0046 uint32_t mask;
0047 uint16_t offset;
0048 uint8_t shift;
0049 bool write_mask;
0050 bool relaxed;
0051 };
0052
0053 struct vop_afbc {
0054 struct vop_reg enable;
0055 struct vop_reg win_sel;
0056 struct vop_reg format;
0057 struct vop_reg rb_swap;
0058 struct vop_reg uv_swap;
0059 struct vop_reg auto_gating_en;
0060 struct vop_reg block_split_en;
0061 struct vop_reg pic_vir_width;
0062 struct vop_reg tile_num;
0063 struct vop_reg hreg_block_split;
0064 struct vop_reg pic_offset;
0065 struct vop_reg pic_size;
0066 struct vop_reg dsp_offset;
0067 struct vop_reg transform_offset;
0068 struct vop_reg hdr_ptr;
0069 struct vop_reg half_block_en;
0070 struct vop_reg xmirror;
0071 struct vop_reg ymirror;
0072 struct vop_reg rotate_270;
0073 struct vop_reg rotate_90;
0074 struct vop_reg rstn;
0075 };
0076
0077 struct vop_modeset {
0078 struct vop_reg htotal_pw;
0079 struct vop_reg hact_st_end;
0080 struct vop_reg hpost_st_end;
0081 struct vop_reg vtotal_pw;
0082 struct vop_reg vact_st_end;
0083 struct vop_reg vpost_st_end;
0084 };
0085
0086 struct vop_output {
0087 struct vop_reg pin_pol;
0088 struct vop_reg dp_pin_pol;
0089 struct vop_reg dp_dclk_pol;
0090 struct vop_reg edp_pin_pol;
0091 struct vop_reg edp_dclk_pol;
0092 struct vop_reg hdmi_pin_pol;
0093 struct vop_reg hdmi_dclk_pol;
0094 struct vop_reg mipi_pin_pol;
0095 struct vop_reg mipi_dclk_pol;
0096 struct vop_reg rgb_pin_pol;
0097 struct vop_reg rgb_dclk_pol;
0098 struct vop_reg dp_en;
0099 struct vop_reg edp_en;
0100 struct vop_reg hdmi_en;
0101 struct vop_reg mipi_en;
0102 struct vop_reg mipi_dual_channel_en;
0103 struct vop_reg rgb_en;
0104 };
0105
0106 struct vop_common {
0107 struct vop_reg cfg_done;
0108 struct vop_reg dsp_blank;
0109 struct vop_reg data_blank;
0110 struct vop_reg pre_dither_down;
0111 struct vop_reg dither_down_sel;
0112 struct vop_reg dither_down_mode;
0113 struct vop_reg dither_down_en;
0114 struct vop_reg dither_up;
0115 struct vop_reg dsp_lut_en;
0116 struct vop_reg gate_en;
0117 struct vop_reg mmu_en;
0118 struct vop_reg out_mode;
0119 struct vop_reg standby;
0120 };
0121
0122 struct vop_misc {
0123 struct vop_reg global_regdone_en;
0124 };
0125
0126 struct vop_intr {
0127 const int *intrs;
0128 uint32_t nintrs;
0129
0130 struct vop_reg line_flag_num[2];
0131 struct vop_reg enable;
0132 struct vop_reg clear;
0133 struct vop_reg status;
0134 };
0135
0136 struct vop_scl_extension {
0137 struct vop_reg cbcr_vsd_mode;
0138 struct vop_reg cbcr_vsu_mode;
0139 struct vop_reg cbcr_hsd_mode;
0140 struct vop_reg cbcr_ver_scl_mode;
0141 struct vop_reg cbcr_hor_scl_mode;
0142 struct vop_reg yrgb_vsd_mode;
0143 struct vop_reg yrgb_vsu_mode;
0144 struct vop_reg yrgb_hsd_mode;
0145 struct vop_reg yrgb_ver_scl_mode;
0146 struct vop_reg yrgb_hor_scl_mode;
0147 struct vop_reg line_load_mode;
0148 struct vop_reg cbcr_axi_gather_num;
0149 struct vop_reg yrgb_axi_gather_num;
0150 struct vop_reg vsd_cbcr_gt2;
0151 struct vop_reg vsd_cbcr_gt4;
0152 struct vop_reg vsd_yrgb_gt2;
0153 struct vop_reg vsd_yrgb_gt4;
0154 struct vop_reg bic_coe_sel;
0155 struct vop_reg cbcr_axi_gather_en;
0156 struct vop_reg yrgb_axi_gather_en;
0157 struct vop_reg lb_mode;
0158 };
0159
0160 struct vop_scl_regs {
0161 const struct vop_scl_extension *ext;
0162
0163 struct vop_reg scale_yrgb_x;
0164 struct vop_reg scale_yrgb_y;
0165 struct vop_reg scale_cbcr_x;
0166 struct vop_reg scale_cbcr_y;
0167 };
0168
0169 struct vop_yuv2yuv_phy {
0170 struct vop_reg y2r_coefficients[NUM_YUV2YUV_COEFFICIENTS];
0171 };
0172
0173 struct vop_win_phy {
0174 const struct vop_scl_regs *scl;
0175 const uint32_t *data_formats;
0176 uint32_t nformats;
0177 const uint64_t *format_modifiers;
0178
0179 struct vop_reg enable;
0180 struct vop_reg gate;
0181 struct vop_reg format;
0182 struct vop_reg rb_swap;
0183 struct vop_reg uv_swap;
0184 struct vop_reg act_info;
0185 struct vop_reg dsp_info;
0186 struct vop_reg dsp_st;
0187 struct vop_reg yrgb_mst;
0188 struct vop_reg uv_mst;
0189 struct vop_reg yrgb_vir;
0190 struct vop_reg uv_vir;
0191 struct vop_reg y_mir_en;
0192 struct vop_reg x_mir_en;
0193
0194 struct vop_reg dst_alpha_ctl;
0195 struct vop_reg src_alpha_ctl;
0196 struct vop_reg alpha_pre_mul;
0197 struct vop_reg alpha_mode;
0198 struct vop_reg alpha_en;
0199 struct vop_reg channel;
0200 };
0201
0202 struct vop_win_yuv2yuv_data {
0203 uint32_t base;
0204 const struct vop_yuv2yuv_phy *phy;
0205 struct vop_reg y2r_en;
0206 };
0207
0208 struct vop_win_data {
0209 uint32_t base;
0210 const struct vop_win_phy *phy;
0211 enum drm_plane_type type;
0212 };
0213
0214 struct vop_data {
0215 uint32_t version;
0216 const struct vop_intr *intr;
0217 const struct vop_common *common;
0218 const struct vop_misc *misc;
0219 const struct vop_modeset *modeset;
0220 const struct vop_output *output;
0221 const struct vop_afbc *afbc;
0222 const struct vop_win_yuv2yuv_data *win_yuv2yuv;
0223 const struct vop_win_data *win;
0224 unsigned int win_size;
0225 unsigned int lut_size;
0226
0227 #define VOP_FEATURE_OUTPUT_RGB10 BIT(0)
0228 #define VOP_FEATURE_INTERNAL_RGB BIT(1)
0229 u64 feature;
0230 };
0231
0232
0233 #define DSP_HOLD_VALID_INTR (1 << 0)
0234 #define FS_INTR (1 << 1)
0235 #define LINE_FLAG_INTR (1 << 2)
0236 #define BUS_ERROR_INTR (1 << 3)
0237
0238 #define INTR_MASK (DSP_HOLD_VALID_INTR | FS_INTR | \
0239 LINE_FLAG_INTR | BUS_ERROR_INTR)
0240
0241 #define DSP_HOLD_VALID_INTR_EN(x) ((x) << 4)
0242 #define FS_INTR_EN(x) ((x) << 5)
0243 #define LINE_FLAG_INTR_EN(x) ((x) << 6)
0244 #define BUS_ERROR_INTR_EN(x) ((x) << 7)
0245 #define DSP_HOLD_VALID_INTR_MASK (1 << 4)
0246 #define FS_INTR_MASK (1 << 5)
0247 #define LINE_FLAG_INTR_MASK (1 << 6)
0248 #define BUS_ERROR_INTR_MASK (1 << 7)
0249
0250 #define INTR_CLR_SHIFT 8
0251 #define DSP_HOLD_VALID_INTR_CLR (1 << (INTR_CLR_SHIFT + 0))
0252 #define FS_INTR_CLR (1 << (INTR_CLR_SHIFT + 1))
0253 #define LINE_FLAG_INTR_CLR (1 << (INTR_CLR_SHIFT + 2))
0254 #define BUS_ERROR_INTR_CLR (1 << (INTR_CLR_SHIFT + 3))
0255
0256 #define DSP_LINE_NUM(x) (((x) & 0x1fff) << 12)
0257 #define DSP_LINE_NUM_MASK (0x1fff << 12)
0258
0259
0260 #define SRC_FADING_VALUE(x) (((x) & 0xff) << 24)
0261 #define SRC_GLOBAL_ALPHA(x) (((x) & 0xff) << 16)
0262 #define SRC_FACTOR_M0(x) (((x) & 0x7) << 6)
0263 #define SRC_ALPHA_CAL_M0(x) (((x) & 0x1) << 5)
0264 #define SRC_BLEND_M0(x) (((x) & 0x3) << 3)
0265 #define SRC_ALPHA_M0(x) (((x) & 0x1) << 2)
0266 #define SRC_COLOR_M0(x) (((x) & 0x1) << 1)
0267 #define SRC_ALPHA_EN(x) (((x) & 0x1) << 0)
0268
0269 #define DST_FACTOR_M0(x) (((x) & 0x7) << 6)
0270
0271
0272
0273
0274 #define ROCKCHIP_OUT_MODE_P888 0
0275 #define ROCKCHIP_OUT_MODE_P666 1
0276 #define ROCKCHIP_OUT_MODE_P565 2
0277
0278 #define ROCKCHIP_OUT_MODE_AAAA 15
0279
0280
0281 #define ROCKCHIP_OUTPUT_DSI_DUAL BIT(0)
0282
0283 enum alpha_mode {
0284 ALPHA_STRAIGHT,
0285 ALPHA_INVERSE,
0286 };
0287
0288 enum global_blend_mode {
0289 ALPHA_GLOBAL,
0290 ALPHA_PER_PIX,
0291 ALPHA_PER_PIX_GLOBAL,
0292 };
0293
0294 enum alpha_cal_mode {
0295 ALPHA_SATURATION,
0296 ALPHA_NO_SATURATION,
0297 };
0298
0299 enum color_mode {
0300 ALPHA_SRC_PRE_MUL,
0301 ALPHA_SRC_NO_PRE_MUL,
0302 };
0303
0304 enum factor_mode {
0305 ALPHA_ZERO,
0306 ALPHA_ONE,
0307 ALPHA_SRC,
0308 ALPHA_SRC_INVERSE,
0309 ALPHA_SRC_GLOBAL,
0310 };
0311
0312 enum scale_mode {
0313 SCALE_NONE = 0x0,
0314 SCALE_UP = 0x1,
0315 SCALE_DOWN = 0x2
0316 };
0317
0318 enum lb_mode {
0319 LB_YUV_3840X5 = 0x0,
0320 LB_YUV_2560X8 = 0x1,
0321 LB_RGB_3840X2 = 0x2,
0322 LB_RGB_2560X4 = 0x3,
0323 LB_RGB_1920X5 = 0x4,
0324 LB_RGB_1280X8 = 0x5
0325 };
0326
0327 enum sacle_up_mode {
0328 SCALE_UP_BIL = 0x0,
0329 SCALE_UP_BIC = 0x1
0330 };
0331
0332 enum scale_down_mode {
0333 SCALE_DOWN_BIL = 0x0,
0334 SCALE_DOWN_AVG = 0x1
0335 };
0336
0337 enum dither_down_mode {
0338 RGB888_TO_RGB565 = 0x0,
0339 RGB888_TO_RGB666 = 0x1
0340 };
0341
0342 enum dither_down_mode_sel {
0343 DITHER_DOWN_ALLEGRO = 0x0,
0344 DITHER_DOWN_FRC = 0x1
0345 };
0346
0347 enum vop_pol {
0348 HSYNC_POSITIVE = 0,
0349 VSYNC_POSITIVE = 1,
0350 DEN_NEGATIVE = 2
0351 };
0352
0353 #define FRAC_16_16(mult, div) (((mult) << 16) / (div))
0354 #define SCL_FT_DEFAULT_FIXPOINT_SHIFT 12
0355 #define SCL_MAX_VSKIPLINES 4
0356 #define MIN_SCL_FT_AFTER_VSKIP 1
0357
0358 static inline uint16_t scl_cal_scale(int src, int dst, int shift)
0359 {
0360 return ((src * 2 - 3) << (shift - 1)) / (dst - 1);
0361 }
0362
0363 static inline uint16_t scl_cal_scale2(int src, int dst)
0364 {
0365 return ((src - 1) << 12) / (dst - 1);
0366 }
0367
0368 #define GET_SCL_FT_BILI_DN(src, dst) scl_cal_scale(src, dst, 12)
0369 #define GET_SCL_FT_BILI_UP(src, dst) scl_cal_scale(src, dst, 16)
0370 #define GET_SCL_FT_BIC(src, dst) scl_cal_scale(src, dst, 16)
0371
0372 static inline uint16_t scl_get_bili_dn_vskip(int src_h, int dst_h,
0373 int vskiplines)
0374 {
0375 int act_height;
0376
0377 act_height = DIV_ROUND_UP(src_h, vskiplines);
0378
0379 if (act_height == dst_h)
0380 return GET_SCL_FT_BILI_DN(src_h, dst_h) / vskiplines;
0381
0382 return GET_SCL_FT_BILI_DN(act_height, dst_h);
0383 }
0384
0385 static inline enum scale_mode scl_get_scl_mode(int src, int dst)
0386 {
0387 if (src < dst)
0388 return SCALE_UP;
0389 else if (src > dst)
0390 return SCALE_DOWN;
0391
0392 return SCALE_NONE;
0393 }
0394
0395 static inline int scl_get_vskiplines(uint32_t srch, uint32_t dsth)
0396 {
0397 uint32_t vskiplines;
0398
0399 for (vskiplines = SCL_MAX_VSKIPLINES; vskiplines > 1; vskiplines /= 2)
0400 if (srch >= vskiplines * dsth * MIN_SCL_FT_AFTER_VSKIP)
0401 break;
0402
0403 return vskiplines;
0404 }
0405
0406 static inline int scl_vop_cal_lb_mode(int width, bool is_yuv)
0407 {
0408 int lb_mode;
0409
0410 if (is_yuv) {
0411 if (width > 1280)
0412 lb_mode = LB_YUV_3840X5;
0413 else
0414 lb_mode = LB_YUV_2560X8;
0415 } else {
0416 if (width > 2560)
0417 lb_mode = LB_RGB_3840X2;
0418 else if (width > 1920)
0419 lb_mode = LB_RGB_2560X4;
0420 else
0421 lb_mode = LB_RGB_1920X5;
0422 }
0423
0424 return lb_mode;
0425 }
0426
0427 extern const struct component_ops vop_component_ops;
0428 #endif