Files

560 lines
13 KiB
C

/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef _OSD_H_
#define _OSD_H_
#include <amlogic/color.h>
/* OSD device ioctl definition */
#define FBIOPUT_OSD_SRCKEY_ENABLE 0x46fa
#define FBIOPUT_OSD_SRCCOLORKEY 0x46fb
#define FBIOPUT_OSD_SET_GBL_ALPHA 0x4500
#define FBIOGET_OSD_GET_GBL_ALPHA 0x4501
#define FBIOPUT_OSD_2X_SCALE 0x4502
#define FBIOPUT_OSD_ENABLE_3D_MODE 0x4503
#define FBIOPUT_OSD_FREE_SCALE_ENABLE 0x4504
#define FBIOPUT_OSD_FREE_SCALE_WIDTH 0x4505
#define FBIOPUT_OSD_FREE_SCALE_HEIGHT 0x4506
#define FBIOPUT_OSD_ORDER 0x4507
#define FBIOGET_OSD_ORDER 0x4508
#define FBIOGET_OSD_SCALE_AXIS 0x4509
#define FBIOPUT_OSD_SCALE_AXIS 0x450a
#define FBIOGET_OSD_BLOCK_WINDOWS 0x450b
#define FBIOPUT_OSD_BLOCK_WINDOWS 0x450c
#define FBIOGET_OSD_BLOCK_MODE 0x450d
#define FBIOPUT_OSD_BLOCK_MODE 0x450e
#define FBIOGET_OSD_FREE_SCALE_AXIS 0x450f
#define FBIOPUT_OSD_FREE_SCALE_AXIS 0x4510
#define FBIOPUT_OSD_FREE_SCALE_MODE 0x4511
#define FBIOGET_OSD_WINDOW_AXIS 0x4512
#define FBIOPUT_OSD_WINDOW_AXIS 0x4513
#define FBIOGET_OSD_FLUSH_RATE 0x4514
#define FBIOPUT_OSD_REVERSE 0x4515
#define FBIOPUT_OSD_ROTATE_ON 0x4516
#define FBIOPUT_OSD_ROTATE_ANGLE 0x4517
#define FBIOPUT_OSD_SYNC_ADD 0x4518
/* OSD color definition */
#define KEYCOLOR_FLAG_TARGET 1
#define KEYCOLOR_FLAG_ONHOLD 2
#define KEYCOLOR_FLAG_CURRENT 4
#define HW_OSD_COUNT 4
/* OSD block definition */
#define HW_OSD_BLOCK_COUNT 4
#define HW_OSD_BLOCK_REG_COUNT (HW_OSD_BLOCK_COUNT*2)
#define HW_OSD_BLOCK_ENABLE_MASK 0x000F
#define HW_OSD_BLOCK_ENABLE_0 0x0001 /* osd blk0 enable */
#define HW_OSD_BLOCK_ENABLE_1 0x0002 /* osd blk1 enable */
#define HW_OSD_BLOCK_ENABLE_2 0x0004 /* osd blk2 enable */
#define HW_OSD_BLOCK_ENABLE_3 0x0008 /* osd blk3 enable */
#define HW_OSD_BLOCK_LAYOUT_MASK 0xFFFF0000
#define HW_OSD_BLOCK_LAYOUT_HORIZONTAL 0x00010000
#define HW_OSD_BLOCK_LAYOUT_VERTICAL 0x00020000
#define HW_OSD_BLOCK_LAYOUT_GRID 0x00030000
#define HW_OSD_BLOCK_LAYOUT_CUSTOMER 0xFFFF0000
#define OSD_LEFT 0
#define OSD_RIGHT 1
#define OSD_ORDER_01 1
#define OSD_ORDER_10 2
#define OSD_GLOBAL_ALPHA_DEF 0xff
#define OSD_DATA_BIG_ENDIAN 0
#define OSD_DATA_LITTLE_ENDIAN 1
#define OSD_TC_ALPHA_ENABLE_DEF 0 /* disable tc_alpha */
#define INT_VIU_VSYNC 35
#define INT_VIU2_VSYNC 45
extern int int_rdma;
#define OSD_MAX_BUF_NUM 3 /* fence relative */
enum osd_enable_e {
DISABLE = 0,
ENABLE
};
enum scan_mode_e {
SCAN_MODE_INTERLACE,
SCAN_MODE_PROGRESSIVE
};
struct color_bit_define_s {
enum color_index_e color_index;
u8 hw_colormat;
u8 hw_blkmode;
u8 red_offset;
u8 red_length;
u8 red_msb_right;
u8 green_offset;
u8 green_length;
u8 green_msb_right;
u8 blue_offset;
u8 blue_length;
u8 blue_msb_right;
u8 transp_offset;
u8 transp_length;
u8 transp_msb_right;
u8 color_type;
u8 bpp;
};
struct osd_ctl_s {
u32 xres_virtual;
u32 yres_virtual;
u32 xres;
u32 yres;
u32 disp_start_x; /* coordinate of screen */
u32 disp_start_y;
u32 disp_end_x;
u32 disp_end_y;
u32 addr;
u32 index;
};
struct osd_info_s {
u32 index;
u32 osd_reverse;
};
struct para_osd_info_s {
char *name;
u32 info;
u32 prev_idx;
u32 next_idx;
u32 cur_group_start;
u32 cur_group_end;
};
enum osd_dev_e {
DEV_OSD0 = 0,
DEV_OSD1,
DEV_ALL,
DEV_MAX
};
enum reverse_info_e {
REVERSE_NONE = 0, /* no rotaion */
REVERSE_XY, /* x+y rotation */
OSD1_REVERSE_XY, /* osd1 x+y rotation */
OSD2_REVERSE_XY, /* osd2 x+y rotation */
REVERSE_X, /* x rotation */
OSD1_REVERSE_X, /* osd1 x rotation */
OSD2_REVERSE_X, /* osd2 x rotation */
REVERSE_Y, /* y rotaion */
OSD1_REVERSE_Y, /* osd1 y rotation */
OSD2_REVERSE_Y, /* osd2 y rotation */
REVERSE_MAX
};
enum hw_reg_index_e {
OSD_COLOR_MODE = 0,
OSD_ENABLE,
OSD_COLOR_KEY,
OSD_COLOR_KEY_ENABLE,
OSD_GBL_ALPHA,
OSD_CHANGE_ORDER,
OSD_FREESCALE_COEF,
DISP_GEOMETRY,
DISP_SCALE_ENABLE,
DISP_FREESCALE_ENABLE,
DISP_OSD_REVERSE,
DISP_OSD_ROTATE,
HW_REG_INDEX_MAX
};
enum osd_ver_e {
OSD_SIMPLE = 0,
OSD_NORMAL,
OSD_HIGH_ONE,
OSD_HIGH_OTHER
};
enum vpp_mux_input_type {
VPP_DIN_NONE = 0,
VPP_OSD1,
VPP_OSD2,
VPP_OSD3,
VPP_OSD4,
};
enum vpp_vsync_type {
VPU_VPP0,
VPU_VPP1,
VPU_VPP2,
VPU_VPP_MAX
};
enum matrix_type_e {
MATRIX_BYPASS = 0,
YUV2RGB,
RGB2YUV
};
struct pandata_s {
s32 x_start;
s32 x_end;
s32 y_start;
s32 y_end;
};
struct fb_geometry_s {
u32 width; /* in byte unit */
u32 height;
u32 canvas_idx;
u32 addr;
};
struct osd_scale_s {
u16 h_enable;
u16 v_enable;
};
struct osd_3d_mode_s {
struct osd_scale_s origin_scale;
u16 enable;
u16 left_right;
u16 l_start;
u16 l_end;
u16 r_start;
u16 r_end;
};
struct osd_rotate_s {
u32 on_off;
u32 angle;
};
typedef void (*update_func_t)(void);
struct hw_list_s {
update_func_t update_func;
};
struct hw_para_s {
struct pandata_s pandata[HW_OSD_COUNT];
struct pandata_s dispdata[HW_OSD_COUNT];
struct pandata_s scaledata[HW_OSD_COUNT];
struct pandata_s free_scale_data[HW_OSD_COUNT];
struct pandata_s free_dst_data[HW_OSD_COUNT];
struct pandata_s rotation_pandata[HW_OSD_COUNT];
struct pandata_s cursor_dispdata[HW_OSD_COUNT];
u32 gbl_alpha[HW_OSD_COUNT];
u32 color_key[HW_OSD_COUNT];
u32 color_key_enable[HW_OSD_COUNT];
u32 enable[HW_OSD_COUNT];
u32 reg_status_save;
#ifdef FIQ_VSYNC
bridge_item_t fiq_handle_item;
#endif
struct osd_scale_s scale[HW_OSD_COUNT];
struct osd_scale_s free_scale[HW_OSD_COUNT];
u32 free_scale_enable[HW_OSD_COUNT];
u32 free_scale_width[HW_OSD_COUNT];
u32 free_scale_height[HW_OSD_COUNT];
struct fb_geometry_s fb_gem[HW_OSD_COUNT];
const struct color_bit_define_s *color_info[HW_OSD_COUNT];
u32 scan_mode;
u32 order;
struct osd_3d_mode_s mode_3d[HW_OSD_COUNT];
u32 updated[HW_OSD_COUNT];
u32 block_windows[HW_OSD_COUNT][HW_OSD_BLOCK_REG_COUNT];
u32 block_mode[HW_OSD_COUNT];
u32 free_scale_mode[HW_OSD_COUNT];
u32 osd_reverse[HW_OSD_COUNT];
struct osd_rotate_s rotate[HW_OSD_COUNT];
struct hw_list_s reg[HW_OSD_COUNT][HW_REG_INDEX_MAX];
u32 field_out_en;
u32 scale_workaround;
u32 fb_for_4k2k;
u32 antiflicker_mode;
u32 angle[HW_OSD_COUNT];
u32 clone[HW_OSD_COUNT];
u32 vpp_index[HW_OSD_COUNT];
u32 bot_type;
u32 osd_ver;
u32 shift_line;
u32 mif_linear;
u32 path_ctrl_independ;
u32 viux_scale_cap;
u32 has_pi;
};
struct hw_osd_reg_s {
u32 osd_ctrl_stat; /* VIU_OSD1_CTRL_STAT */
u32 osd_ctrl_stat2;/* VIU_OSD1_CTRL_STAT2 */
u32 osd_color_addr;/* VIU_OSD1_COLOR_ADDR */
u32 osd_color;/* VIU_OSD1_COLOR */
u32 osd_tcolor_ag0; /* VIU_OSD1_TCOLOR_AG0 */
u32 osd_tcolor_ag1; /* VIU_OSD1_TCOLOR_AG1 */
u32 osd_tcolor_ag2; /* VIU_OSD1_TCOLOR_AG2 */
u32 osd_tcolor_ag3; /* VIU_OSD1_TCOLOR_AG3 */
u32 osd_blk0_cfg_w0;/* VIU_OSD1_BLK0_CFG_W0 */
u32 osd_blk0_cfg_w1;/* VIU_OSD1_BLK0_CFG_W1 */
u32 osd_blk0_cfg_w2;/* VIU_OSD1_BLK0_CFG_W2 */
u32 osd_blk0_cfg_w3;/* VIU_OSD1_BLK0_CFG_W3 */
u32 osd_blk0_cfg_w4;/* VIU_OSD1_BLK0_CFG_W4 */
u32 osd_blk1_cfg_w4;/* VIU_OSD1_BLK1_CFG_W4 */
u32 osd_blk2_cfg_w4;/* VIU_OSD1_BLK2_CFG_W4 */
u32 osd_fifo_ctrl_stat;/* VIU_OSD1_FIFO_CTRL_STAT */
//u32 osd_prot_ctrl;/* VIU_OSD1_PROT_CTRL */
//u32 osd_mali_unpack_ctrl;/* VIU_OSD1_MALI_UNPACK_CTRL */
//u32 osd_dimm_ctrl;/* VIU_OSD1_DIMM_CTRL */
//u32 osd_matrix_en_ctrl;
u32 osd_scale_coef_idx;/* VPP_OSD_SCALE_COEF_IDX */
u32 osd_scale_coef;/* VPP_OSD_SCALE_COEF */
u32 osd_vsc_phase_step;/* VPP_OSD_VSC_PHASE_STEP */
u32 osd_vsc_init_phase;/* VPP_OSD_VSC_INI_PHASE */
u32 osd_vsc_ctrl0;/* VPP_OSD_VSC_CTRL0 */
u32 osd_hsc_phase_step;/* VPP_OSD_HSC_PHASE_STEP */
u32 osd_hsc_init_phase;/* VPP_OSD_HSC_INI_PHASE */
u32 osd_hsc_ctrl0;/* VPP_OSD_HSC_CTRL0 */
u32 osd_sc_dummy_data;/* VPP_OSD_SC_DUMMY_DATA */
u32 osd_sc_ctrl0;/* VPP_OSD_SC_CTRL0 */
u32 osd_sci_wh_m1;/* VPP_OSD_SCI_WH_M1 */
u32 osd_sco_h_start_end;/* VPP_OSD_SCO_H_START_END */
u32 osd_sco_v_start_end;/* VPP_OSD_SCO_V_START_END */
u32 osd_proc_in_size; /* OSD1_PROC_IN_SIZE */
u32 osd_proc_out_size; /* OSD1_PROC_OUT_SIZE */
};
struct hw_osd_vout_blend_reg_s {
u32 vpu_vout_irq_ctrl;
u32 vpu_vout_blend_ctrl;
u32 vpu_vout_blend_dumdata;
u32 vpu_vout_blend_size;
u32 vpu_vout_bld_src0_hpos;
u32 vpu_vout_bld_src0_vpos;
u32 vpu_vout_bld_src1_hpos;
u32 vpu_vout_bld_src1_vpos;
};
struct hw_osd_vout_csc_reg_s {
u32 vout_osd1_csc_coef00_01;
u32 vout_osd1_csc_coef02_10;
u32 vout_osd1_csc_coef11_12;
u32 vout_osd1_csc_coef20_21;
u32 vout_osd1_csc_coef22;
u32 vout_osd1_csc_coef30_31;
u32 vout_osd1_csc_coef32_40;
u32 vout_osd1_csc_coef41_42;
u32 vout_osd1_csc_clip;
u32 vout_osd1_csc_offset0_1;
u32 vout_osd1_csc_offset2;
u32 vout_osd1_csc_pre_offset0_1;
u32 vout_osd1_csc_pre_offset2;
u32 vout_osd1_csc_en_ctrl;
};
#ifdef AML_S5_DISPLAY
/* VPP POST input src: 3VD, 2 OSD */
/* S5 only VD1, VD2 */
#define VPP_POST_VD_NUM 3
#define VPP_POST_OSD_NUM 2
#define VPP_POST_NUM (VPP_POST_VD_NUM + VPP_POST_OSD_NUM)
#define POST_SLICE_NUM 4
struct slice_info {
u32 hsize; /*slice hsize*/
u32 vsize; /*slice vsize*/
};
struct vpp_post_info_t {
u32 slice_num; /*valid slice num*/
u32 overlap_hsize;
u32 vpp_post_blend_hsize; /*blend out hsize*/
u32 vpp_post_blend_vsize; /*blend out vsize*/
struct slice_info slice[POST_SLICE_NUM];
};
struct vpp_post_blend_s {
u32 bld_out_en;
u32 bld_out_w;
u32 bld_out_h;
u32 bld_out_premult;
u32 bld_src1_sel; //1:din0 2:din1 3:din2 4:din3 5:din4 else :close
u32 bld_src2_sel; //1:din0 2:din1 3:din2 4:din3 5:din4 else :close
u32 bld_src3_sel; //1:din0 2:din1 3:din2 4:din3 5:din4 else :close
u32 bld_src4_sel; //1:din0 2:din1 3:din2 4:din3 5:din4 else :close
u32 bld_src5_sel; //1:din0 2:din1 3:din2 4:din3 5:din4 else :close
u32 bld_dummy_data;
//usually the bottom layer set 1, for example postbld_src1_sel = 1,set 0x1
u32 bld_din0_premult_en;
u32 bld_din1_premult_en;
u32 bld_din2_premult_en;
u32 bld_din3_premult_en;
u32 bld_din4_premult_en;
//u32 vd1_index;//VPP_VD1/VPP_VD2/VPP_VD3
u32 bld_din0_h_start;
u32 bld_din0_h_end;
u32 bld_din0_v_start;
u32 bld_din0_v_end;
u32 bld_din0_alpha;
//u32 vd2_index;//VPP_VD1/VPP_VD2/VPP_VD3
u32 bld_din1_h_start;
u32 bld_din1_h_end;
u32 bld_din1_v_start;
u32 bld_din1_v_end;
u32 bld_din1_alpha;
//u32 vd3_index;//VPP_VD1/VPP_VD2/VPP_VD3
u32 bld_din2_h_start;
u32 bld_din2_h_end;
u32 bld_din2_v_start;
u32 bld_din2_v_end;
u32 bld_din2_alpha;
//u32 osd1_index;//VPP_OSD1/VPP_OSD2/VPP_OSD3/VPP_OSD4
u32 bld_din3_h_start;
u32 bld_din3_h_end;
u32 bld_din3_v_start;
u32 bld_din3_v_end;
//u32 osd2_index;//VPP_OSD1/VPP_OSD2/VPP_OSD3/VPP_OSD4
u32 bld_din4_h_start;
u32 bld_din4_h_end;
u32 bld_din4_v_start;
u32 bld_din4_v_end;
};
struct vd1_hwin_s {
u32 vd1_hwin_en;
u32 vd1_hwin_in_hsize;
/* hwin cut out before to blend */
u32 vd1_hwin_out_hsize;
};
struct vpp_post_pad_s {
u32 vpp_post_pad_en;
u32 vpp_post_pad_hsize;
u32 vpp_post_pad_dummy;
/* 1: padding with last colum */
/* 0: padding with vpp_post_pad_dummy val */
u32 vpp_post_pad_rpt_lcol;
};
struct vpp_post_hwin_s {
u32 vpp_post_hwin_en;
u32 vpp_post_dout_hsize;
u32 vpp_post_dout_vsize;
};
struct vpp_post_proc_slice_s {
u32 hsize[POST_SLICE_NUM];
u32 vsize[POST_SLICE_NUM];
};
struct vpp_post_proc_hwin_s {
u32 hwin_en[POST_SLICE_NUM];
u32 hwin_bgn[POST_SLICE_NUM];
u32 hwin_end[POST_SLICE_NUM];
};
struct vpp_post_proc_s {
struct vpp_post_proc_slice_s vpp_post_proc_slice;
struct vpp_post_proc_hwin_s vpp_post_proc_hwin;
u32 align_fifo_size[POST_SLICE_NUM];
u32 gamma_bypass;
u32 ccm_bypass;
u32 vadj2_bypass;
u32 lut3d_bypass;
u32 gain_off_bypass;
u32 vwm_bypass;
};
struct vpp_post_input_s {
u32 slice_num;
u32 overlap_hsize;
u32 din_hsize[VPP_POST_NUM];
u32 din_vsize[VPP_POST_NUM];
u32 din_x_start[VPP_POST_NUM];
u32 din_y_start[VPP_POST_NUM];
u32 bld_out_hsize;
u32 bld_out_vsize;
/* means vd1 4s4p padding */
u32 vd1_padding_en;
u32 vd1_size_before_padding;
u32 vd1_size_after_padding;
};
struct vpp0_post_s {
u32 slice_num;
u32 overlap_hsize;
struct vd1_hwin_s vd1_hwin;
struct vpp_post_blend_s vpp_post_blend;
struct vpp_post_pad_s vpp_post_pad;
struct vpp_post_hwin_s vpp_post_hwin;
struct vpp_post_proc_s vpp_post_proc;
};
struct vpp1_post_blend_s {
u32 bld_out_en;
u32 bld_out_w;
u32 bld_out_h;
//0: vpp1 walk slice1 to venc1; 1: vpp1 bypass slice1 to venc1
u32 vpp1_dpath_sel;
//0:select postblend 1:select vpp1 blend
u32 vd3_dpath_sel;
u32 bld_out_premult;
u32 bld_dummy_data;
//usually the bottom layer set 1, for example postbld_src1_sel = 1,set 0x1
u32 bld_din0_premult_en;
u32 bld_din1_premult_en;
//VD3
u32 bld_din0_h_start;
u32 bld_din0_h_end;
u32 bld_din0_v_start;
u32 bld_din0_v_end;
u32 bld_din0_alpha;
//OSD3
u32 bld_din1_h_start;
u32 bld_din1_h_end;
u32 bld_din1_v_start;
u32 bld_din1_v_end;
u32 bld_din1_alpha;
//1:din0(vd3) 2:din1(osd3) 3:din2 4:din3 5:din4 else :close
u32 bld_src1_sel;
u32 bld_src2_sel;
};
struct vpp1_post_s {
bool vpp1_en;
bool vpp1_bypass_slice1;
u32 slice_num;
u32 overlap_hsize;
struct vpp1_post_blend_s vpp1_post_blend;
};
struct vpp_post_s {
struct vpp0_post_s vpp0_post;
struct vpp1_post_s vpp1_post;
};
#endif
extern int rma_test;
extern int rma_test_addr;
extern struct hw_osd_reg_s hw_osd_reg_array[HW_OSD_COUNT];
#ifdef AML_S5_DISPLAY
struct vpp_post_info_t *get_vpp_post_amdv_info(void);
#endif
#endif /* _OSD_H_ */