1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _IEP_H_ 3*4882a593Smuzhiyun #define _IEP_H_ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* Capability for current iep version 6*4882a593Smuzhiyun using by userspace to determine iep features */ 7*4882a593Smuzhiyun struct IEP_CAP { 8*4882a593Smuzhiyun u8 scaling_supported; 9*4882a593Smuzhiyun u8 i4_deinterlace_supported; 10*4882a593Smuzhiyun u8 i2_deinterlace_supported; 11*4882a593Smuzhiyun u8 compression_noise_reduction_supported; 12*4882a593Smuzhiyun u8 sampling_noise_reduction_supported; 13*4882a593Smuzhiyun u8 hsb_enhancement_supported; 14*4882a593Smuzhiyun u8 cg_enhancement_supported; 15*4882a593Smuzhiyun u8 direct_path_supported; 16*4882a593Smuzhiyun u16 max_dynamic_width; 17*4882a593Smuzhiyun u16 max_dynamic_height; 18*4882a593Smuzhiyun u16 max_static_width; 19*4882a593Smuzhiyun u16 max_static_height; 20*4882a593Smuzhiyun u8 max_enhance_radius; 21*4882a593Smuzhiyun }; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define IEP_IOC_MAGIC 'i' 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define IEP_SET_PARAMETER_REQ _IOW(IEP_IOC_MAGIC, 1, unsigned long) 26*4882a593Smuzhiyun #define IEP_SET_PARAMETER_DEINTERLACE _IOW(IEP_IOC_MAGIC, 2, unsigned long) 27*4882a593Smuzhiyun #define IEP_SET_PARAMETER_ENHANCE _IOW(IEP_IOC_MAGIC, 3, unsigned long) 28*4882a593Smuzhiyun #define IEP_SET_PARAMETER_CONVERT _IOW(IEP_IOC_MAGIC, 4, unsigned long) 29*4882a593Smuzhiyun #define IEP_SET_PARAMETER_SCALE _IOW(IEP_IOC_MAGIC, 5, unsigned long) 30*4882a593Smuzhiyun #define IEP_GET_RESULT_SYNC _IOW(IEP_IOC_MAGIC, 6, unsigned long) 31*4882a593Smuzhiyun #define IEP_GET_RESULT_ASYNC _IOW(IEP_IOC_MAGIC, 7, unsigned long) 32*4882a593Smuzhiyun #define IEP_SET_PARAMETER _IOW(IEP_IOC_MAGIC, 8, unsigned long) 33*4882a593Smuzhiyun #define IEP_RELEASE_CURRENT_TASK _IOW(IEP_IOC_MAGIC, 9, unsigned long) 34*4882a593Smuzhiyun #define IEP_GET_IOMMU_STATE _IOR(IEP_IOC_MAGIC,10, unsigned long) 35*4882a593Smuzhiyun #define IEP_QUERY_CAP _IOR(IEP_IOC_MAGIC,11, struct IEP_CAP) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #ifdef CONFIG_COMPAT 38*4882a593Smuzhiyun #define COMPAT_IEP_SET_PARAMETER_REQ _IOW(IEP_IOC_MAGIC, 1, u32) 39*4882a593Smuzhiyun #define COMPAT_IEP_SET_PARAMETER_DEINTERLACE _IOW(IEP_IOC_MAGIC, 2, u32) 40*4882a593Smuzhiyun #define COMPAT_IEP_SET_PARAMETER_ENHANCE _IOW(IEP_IOC_MAGIC, 3, u32) 41*4882a593Smuzhiyun #define COMPAT_IEP_SET_PARAMETER_CONVERT _IOW(IEP_IOC_MAGIC, 4, u32) 42*4882a593Smuzhiyun #define COMPAT_IEP_SET_PARAMETER_SCALE _IOW(IEP_IOC_MAGIC, 5, u32) 43*4882a593Smuzhiyun #define COMPAT_IEP_GET_RESULT_SYNC _IOW(IEP_IOC_MAGIC, 6, u32) 44*4882a593Smuzhiyun #define COMPAT_IEP_GET_RESULT_ASYNC _IOW(IEP_IOC_MAGIC, 7, u32) 45*4882a593Smuzhiyun #define COMPAT_IEP_SET_PARAMETER _IOW(IEP_IOC_MAGIC, 8, u32) 46*4882a593Smuzhiyun #define COMPAT_IEP_RELEASE_CURRENT_TASK _IOW(IEP_IOC_MAGIC, 9, u32) 47*4882a593Smuzhiyun #define COMPAT_IEP_GET_IOMMU_STATE _IOR(IEP_IOC_MAGIC,10, u32) 48*4882a593Smuzhiyun #define COMPAT_IEP_QUERY_CAP _IOR(IEP_IOC_MAGIC,11, struct IEP_CAP) 49*4882a593Smuzhiyun #endif 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /* Driver information */ 52*4882a593Smuzhiyun #define DRIVER_DESC "IEP Device Driver" 53*4882a593Smuzhiyun #define DRIVER_NAME "iep" 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define DEBUG 56*4882a593Smuzhiyun #ifdef DEBUG 57*4882a593Smuzhiyun #define iep_debug(level, fmt, args...) \ 58*4882a593Smuzhiyun do { \ 59*4882a593Smuzhiyun if (debug >= level) \ 60*4882a593Smuzhiyun pr_info("%s:%d: " fmt, \ 61*4882a593Smuzhiyun __func__, __LINE__, ##args); \ 62*4882a593Smuzhiyun } while (0) 63*4882a593Smuzhiyun #else 64*4882a593Smuzhiyun #define iep_debug(level, fmt, args...) 65*4882a593Smuzhiyun #endif 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define iep_debug_enter() vpu_debug(4, "enter\n") 68*4882a593Smuzhiyun #define iep_debug_leave() vpu_debug(4, "leave\n") 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun #define iep_err(fmt, args...) \ 71*4882a593Smuzhiyun pr_err("%s:%d: " fmt, __func__, __LINE__, ##args) 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* Logging */ 74*4882a593Smuzhiyun #define IEP_DEBUG 0 75*4882a593Smuzhiyun #if IEP_DEBUG 76*4882a593Smuzhiyun #define IEP_DBG(format, args...) printk("%s: " format, DRIVER_NAME, ## args) 77*4882a593Smuzhiyun #else 78*4882a593Smuzhiyun #define IEP_DBG(format, args...) 79*4882a593Smuzhiyun #endif 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define IEP_INFORMATION 1 82*4882a593Smuzhiyun #if IEP_INFORMATION 83*4882a593Smuzhiyun #define IEP_INFO(format, args...) \ 84*4882a593Smuzhiyun printk(KERN_INFO "%s: " format, DRIVER_NAME, ## args) 85*4882a593Smuzhiyun #else 86*4882a593Smuzhiyun #define IEP_INFO(format, args...) 87*4882a593Smuzhiyun #endif 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun #define IEP_ERR(format, args...) printk(KERN_ERR "%s: " format, DRIVER_NAME, ## args) 90*4882a593Smuzhiyun #define IEP_WARNING(format, args...) printk(KERN_WARNING "%s: " format, DRIVER_NAME, ## args) 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun enum { 93*4882a593Smuzhiyun yuv2rgb_BT_601_l = 0x0, /* BT.601_1 */ 94*4882a593Smuzhiyun yuv2rgb_BT_601_f = 0x1, /* BT.601_f */ 95*4882a593Smuzhiyun yuv2rgb_BT_709_l = 0x2, /* BT.709_1 */ 96*4882a593Smuzhiyun yuv2rgb_BT_709_f = 0x3, /* BT.709_f */ 97*4882a593Smuzhiyun }; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun enum { 100*4882a593Smuzhiyun rgb2yuv_BT_601_l = 0x0, /* BT.601_1 */ 101*4882a593Smuzhiyun rgb2yuv_BT_601_f = 0x1, /* BT.601_f */ 102*4882a593Smuzhiyun rgb2yuv_BT_709_l = 0x2, /* BT.709_1 */ 103*4882a593Smuzhiyun rgb2yuv_BT_709_f = 0x3, /* BT.709_f */ 104*4882a593Smuzhiyun }; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun enum { 107*4882a593Smuzhiyun dein_mode_bypass_dis = 0x0, 108*4882a593Smuzhiyun dein_mode_I4O2 = 0x1, 109*4882a593Smuzhiyun dein_mode_I4O1B = 0x2, 110*4882a593Smuzhiyun dein_mode_I4O1T = 0x3, 111*4882a593Smuzhiyun dein_mode_I2O1B = 0x4, 112*4882a593Smuzhiyun dein_mode_I2O1T = 0x5, 113*4882a593Smuzhiyun dein_mode_bypass = 0x6, 114*4882a593Smuzhiyun }; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun enum IEP_FIELD_ORDER { 117*4882a593Smuzhiyun FIELD_ORDER_TOP_FIRST, 118*4882a593Smuzhiyun FIELD_ORDER_BOTTOM_FIRST 119*4882a593Smuzhiyun }; 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun enum IEP_YUV_DEINTERLACE_MODE { 122*4882a593Smuzhiyun IEP_DEINTERLACE_MODE_DISABLE, 123*4882a593Smuzhiyun IEP_DEINTERLACE_MODE_I2O1, 124*4882a593Smuzhiyun IEP_DEINTERLACE_MODE_I4O1, 125*4882a593Smuzhiyun IEP_DEINTERLACE_MODE_I4O2, 126*4882a593Smuzhiyun IEP_DEINTERLACE_MODE_BYPASS 127*4882a593Smuzhiyun }; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun enum { 130*4882a593Smuzhiyun rgb_enhance_bypass = 0x0, 131*4882a593Smuzhiyun rgb_enhance_denoise = 0x1, 132*4882a593Smuzhiyun rgb_enhance_detail = 0x2, 133*4882a593Smuzhiyun rgb_enhance_edge = 0x3, 134*4882a593Smuzhiyun };/* for rgb_enhance_mode */ 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun enum { 137*4882a593Smuzhiyun rgb_contrast_CC_P_DDE = 0x0, /* cg prior to dde */ 138*4882a593Smuzhiyun rgb_contrast_DDE_P_CC = 0x1, /* dde prior to cg */ 139*4882a593Smuzhiyun }; /* for rgb_contrast_enhance_mode */ 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun enum { 142*4882a593Smuzhiyun black_screen = 0x0, 143*4882a593Smuzhiyun blue_screen = 0x1, 144*4882a593Smuzhiyun color_bar = 0x2, 145*4882a593Smuzhiyun normal_mode = 0x3, 146*4882a593Smuzhiyun }; /* for video mode */ 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun /* 149*4882a593Smuzhiyun Alpha Red Green Blue 150*4882a593Smuzhiyun { 4, 32, {{32,24, 24,16, 16, 8, 8, 0 }}, GGL_RGBA }, IEP_FORMAT_ARGB_8888 151*4882a593Smuzhiyun { 4, 32, {{32,24, 8, 0, 16, 8, 24,16 }}, GGL_RGB }, IEP_FORMAT_ABGR_8888 152*4882a593Smuzhiyun { 4, 32, {{ 8, 0, 32,24, 24,16, 16, 8 }}, GGL_RGB }, IEP_FORMAT_RGBA_8888 153*4882a593Smuzhiyun { 4, 32, {{ 8, 0, 16, 8, 24,16, 32,24 }}, GGL_BGRA }, IEP_FORMAT_BGRA_8888 154*4882a593Smuzhiyun { 2, 16, {{ 0, 0, 16,11, 11, 5, 5, 0 }}, GGL_RGB }, IEP_FORMAT_RGB_565 155*4882a593Smuzhiyun { 2, 16, {{ 0, 0, 5, 0, 11, 5, 16,11 }}, GGL_RGB }, IEP_FORMAT_RGB_565 156*4882a593Smuzhiyun */ 157*4882a593Smuzhiyun enum { 158*4882a593Smuzhiyun IEP_FORMAT_ARGB_8888 = 0x0, 159*4882a593Smuzhiyun IEP_FORMAT_ABGR_8888 = 0x1, 160*4882a593Smuzhiyun IEP_FORMAT_RGBA_8888 = 0x2, 161*4882a593Smuzhiyun IEP_FORMAT_BGRA_8888 = 0x3, 162*4882a593Smuzhiyun IEP_FORMAT_RGB_565 = 0x4, 163*4882a593Smuzhiyun IEP_FORMAT_BGR_565 = 0x5, 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun IEP_FORMAT_YCbCr_422_SP = 0x10, 166*4882a593Smuzhiyun IEP_FORMAT_YCbCr_422_P = 0x11, 167*4882a593Smuzhiyun IEP_FORMAT_YCbCr_420_SP = 0x12, 168*4882a593Smuzhiyun IEP_FORMAT_YCbCr_420_P = 0x13, 169*4882a593Smuzhiyun IEP_FORMAT_YCrCb_422_SP = 0x14, 170*4882a593Smuzhiyun IEP_FORMAT_YCrCb_422_P = 0x15,/* same as IEP_FORMAT_YCbCr_422_P */ 171*4882a593Smuzhiyun IEP_FORMAT_YCrCb_420_SP = 0x16, 172*4882a593Smuzhiyun IEP_FORMAT_YCrCb_420_P = 0x17,/* same as IEP_FORMAT_YCbCr_420_P */ 173*4882a593Smuzhiyun }; /* for format */ 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun struct iep_img 176*4882a593Smuzhiyun { 177*4882a593Smuzhiyun u16 act_w; /* act_width */ 178*4882a593Smuzhiyun u16 act_h; /* act_height */ 179*4882a593Smuzhiyun s16 x_off; /* x offset for the vir,word unit */ 180*4882a593Smuzhiyun s16 y_off; /* y offset for the vir,word unit */ 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun u16 vir_w; /* unit :pix */ 183*4882a593Smuzhiyun u16 vir_h; /* unit :pix */ 184*4882a593Smuzhiyun u32 format; 185*4882a593Smuzhiyun u32 mem_addr; 186*4882a593Smuzhiyun u32 uv_addr; 187*4882a593Smuzhiyun u32 v_addr; 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun u8 rb_swap; /* not be used */ 190*4882a593Smuzhiyun u8 uv_swap; /* not be used */ 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun u8 alpha_swap; /* not be used */ 193*4882a593Smuzhiyun }; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun struct IEP_MSG { 196*4882a593Smuzhiyun struct iep_img src; 197*4882a593Smuzhiyun struct iep_img dst; 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun struct iep_img src1; 200*4882a593Smuzhiyun struct iep_img dst1; 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun struct iep_img src_itemp; 203*4882a593Smuzhiyun struct iep_img src_ftemp; 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun struct iep_img dst_itemp; 206*4882a593Smuzhiyun struct iep_img dst_ftemp; 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun u8 dither_up_en; 209*4882a593Smuzhiyun u8 dither_down_en;/* not to be used */ 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun u8 yuv2rgb_mode; 212*4882a593Smuzhiyun u8 rgb2yuv_mode; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun u8 global_alpha_value; 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun u8 rgb2yuv_clip_en; 217*4882a593Smuzhiyun u8 yuv2rgb_clip_en; 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun u8 lcdc_path_en; 220*4882a593Smuzhiyun s32 off_x; 221*4882a593Smuzhiyun s32 off_y; 222*4882a593Smuzhiyun s32 width; 223*4882a593Smuzhiyun s32 height; 224*4882a593Smuzhiyun s32 layer; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun u8 yuv_3D_denoise_en; 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun /* yuv color enhance */ 229*4882a593Smuzhiyun u8 yuv_enhance_en; 230*4882a593Smuzhiyun s32 sat_con_int; 231*4882a593Smuzhiyun s32 contrast_int; 232*4882a593Smuzhiyun s32 cos_hue_int; 233*4882a593Smuzhiyun s32 sin_hue_int; 234*4882a593Smuzhiyun s8 yuv_enh_brightness; /*-32<brightness<31*/ 235*4882a593Smuzhiyun u8 video_mode; /*0-3*/ 236*4882a593Smuzhiyun u8 color_bar_y; /*0-127*/ 237*4882a593Smuzhiyun u8 color_bar_u; /*0-127*/ 238*4882a593Smuzhiyun u8 color_bar_v; /*0-127*/ 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun u8 rgb_enhance_en;/*i don't konw what is used*/ 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun u8 rgb_color_enhance_en;/*sw_rgb_color_enh_en*/ 244*4882a593Smuzhiyun u32 rgb_enh_coe; 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun u8 rgb_enhance_mode;/*sw_rgb_enh_sel,dde sel*/ 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun u8 rgb_cg_en;/*sw_rgb_con_gam_en*/ 249*4882a593Smuzhiyun u32 cg_tab[192]; 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun /*sw_con_gam_order;0 cg prior to dde,1 dde prior to cg*/ 252*4882a593Smuzhiyun u8 rgb_contrast_enhance_mode; 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun s32 enh_threshold; 255*4882a593Smuzhiyun s32 enh_alpha; 256*4882a593Smuzhiyun s32 enh_radius; 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun u8 scale_up_mode; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun u8 field_order; 261*4882a593Smuzhiyun u8 dein_mode; 262*4882a593Smuzhiyun /*DIL HF*/ 263*4882a593Smuzhiyun u8 dein_high_fre_en; 264*4882a593Smuzhiyun u8 dein_high_fre_fct; 265*4882a593Smuzhiyun /*DIL EI*/ 266*4882a593Smuzhiyun u8 dein_ei_mode; 267*4882a593Smuzhiyun u8 dein_ei_smooth; 268*4882a593Smuzhiyun u8 dein_ei_sel; 269*4882a593Smuzhiyun u8 dein_ei_radius;/*when dein_ei_sel=0 will be used*/ 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun u8 vir_addr_enable; 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun void *base; 274*4882a593Smuzhiyun }; 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun #endif 277