1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef IEP_DRV_H_ 3*4882a593Smuzhiyun #define IEP_DRV_H_ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/device.h> 6*4882a593Smuzhiyun #include <linux/miscdevice.h> 7*4882a593Smuzhiyun #include <linux/mutex.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include "iep.h" 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define IEP_REG_LEN 0x100 12*4882a593Smuzhiyun #define IEP_CMD_REG_LEN 0xE 13*4882a593Smuzhiyun #define IEP_ADD_REG_LEN 0xE0 14*4882a593Smuzhiyun #define IEP_RAW_REG_LEN 0xA 15*4882a593Smuzhiyun #define IEP_SYS_REG_LEN 0x6 16*4882a593Smuzhiyun #define IEP_CNF_REG_LEN 0x2 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define IEP_CNF_REG_BASE 0x0 19*4882a593Smuzhiyun #define IEP_SYS_REG_BASE 0x2 20*4882a593Smuzhiyun #define IEP_CMD_REG_BASE 0x8 21*4882a593Smuzhiyun #define IEP_ADD_REG_BASE 0x20 22*4882a593Smuzhiyun #define IEP_RAW_REG_BASE 0x16 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun struct iep_parameter_req { 25*4882a593Smuzhiyun struct iep_img src; 26*4882a593Smuzhiyun struct iep_img dst; 27*4882a593Smuzhiyun }; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun struct iep_parameter_deinterlace { 30*4882a593Smuzhiyun struct iep_img src1; 31*4882a593Smuzhiyun struct iep_img dst1; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun struct iep_img src_itemp; 34*4882a593Smuzhiyun struct iep_img src_ftemp; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun struct iep_img dst_itemp; 37*4882a593Smuzhiyun struct iep_img dst_ftemp; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun u8 dein_mode; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun // deinterlace high frequency 42*4882a593Smuzhiyun u8 dein_high_fre_en; 43*4882a593Smuzhiyun u8 dein_high_fre_fct; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun // deinterlace edge interpolation 46*4882a593Smuzhiyun u8 dein_ei_mode; 47*4882a593Smuzhiyun u8 dein_ei_smooth; 48*4882a593Smuzhiyun u8 dein_ei_sel; 49*4882a593Smuzhiyun u8 dein_ei_radius; 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun struct iep_parameter_enhance { 53*4882a593Smuzhiyun u8 yuv_3D_denoise_en; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun u8 yuv_enhance_en; 56*4882a593Smuzhiyun float yuv_enh_saturation; //0-1.992 57*4882a593Smuzhiyun float yuv_enh_contrast; //0-1.992 58*4882a593Smuzhiyun s8 yuv_enh_brightness; //-32<brightness<31 59*4882a593Smuzhiyun s8 yuv_enh_hue_angle; //0-30,value is 0 - 30 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun u8 video_mode; //0-3 62*4882a593Smuzhiyun u8 color_bar_y; //0-127 63*4882a593Smuzhiyun u8 color_bar_u; //0-127 64*4882a593Smuzhiyun u8 color_bar_v; //0-127 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun u8 rgb_enhance_en; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun u8 rgb_cg_en; //sw_rgb_con_gam_en 69*4882a593Smuzhiyun double cg_rr; 70*4882a593Smuzhiyun double cg_rg; 71*4882a593Smuzhiyun double cg_rb; 72*4882a593Smuzhiyun u8 rgb_color_enhance_en; //sw_rgb_color_enh_en 73*4882a593Smuzhiyun float rgb_enh_coe; //0-3.96875 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun struct iep_parameter_scale { 77*4882a593Smuzhiyun u8 scale_up_mode; 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun struct iep_parameter_convert { 81*4882a593Smuzhiyun u8 dither_up_en; 82*4882a593Smuzhiyun u8 dither_down_en; //not to be used 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun u8 yuv2rgb_mode; 85*4882a593Smuzhiyun u8 rgb2yuv_mode; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun u8 global_alpha_value; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun u8 rgb2yuv_clip_en; 90*4882a593Smuzhiyun u8 yuv2rgb_clip_en; 91*4882a593Smuzhiyun }; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun typedef struct iep_session { 94*4882a593Smuzhiyun /* a linked list of data so we can access them for debugging */ 95*4882a593Smuzhiyun struct list_head list_session; 96*4882a593Smuzhiyun /* a linked list of register data waiting for process */ 97*4882a593Smuzhiyun struct list_head waiting; 98*4882a593Smuzhiyun /* a linked list of register data in ready */ 99*4882a593Smuzhiyun struct list_head ready; 100*4882a593Smuzhiyun /* a linked list of register data in processing */ 101*4882a593Smuzhiyun struct list_head running; 102*4882a593Smuzhiyun /* all coommand this thread done */ 103*4882a593Smuzhiyun atomic_t done; 104*4882a593Smuzhiyun wait_queue_head_t wait; 105*4882a593Smuzhiyun pid_t pid; 106*4882a593Smuzhiyun atomic_t task_running; 107*4882a593Smuzhiyun atomic_t num_done; 108*4882a593Smuzhiyun } iep_session; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun typedef struct iep_service_info { 111*4882a593Smuzhiyun struct mutex lock; 112*4882a593Smuzhiyun struct timer_list timer; /* timer for power off */ 113*4882a593Smuzhiyun struct list_head waiting; /* link to link_reg in struct iep_reg */ 114*4882a593Smuzhiyun atomic_t waitcnt; 115*4882a593Smuzhiyun struct list_head ready; /* link to link_reg in struct iep_reg */ 116*4882a593Smuzhiyun struct list_head running; /* link to link_reg in struct iep_reg */ 117*4882a593Smuzhiyun struct list_head done; /* link to link_reg in struct iep_reg */ 118*4882a593Smuzhiyun struct list_head session; /* link to list_session in struct vpu_session */ 119*4882a593Smuzhiyun atomic_t total_running; 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun struct iep_reg *reg; 122*4882a593Smuzhiyun bool enable; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun struct mutex mutex; // mutex 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun struct iep_iommu_info *iommu_info; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun struct device *iommu_dev; 129*4882a593Smuzhiyun u32 alloc_type; 130*4882a593Smuzhiyun } iep_service_info; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun struct iep_reg { 133*4882a593Smuzhiyun iep_session *session; 134*4882a593Smuzhiyun struct list_head session_link; /* link to rga service session */ 135*4882a593Smuzhiyun struct list_head status_link; /* link to register set list */ 136*4882a593Smuzhiyun uint32_t reg[0x300]; 137*4882a593Smuzhiyun bool dpi_en; 138*4882a593Smuzhiyun int off_x; 139*4882a593Smuzhiyun int off_y; 140*4882a593Smuzhiyun int act_width; 141*4882a593Smuzhiyun int act_height; 142*4882a593Smuzhiyun int vir_width; 143*4882a593Smuzhiyun int vir_height; 144*4882a593Smuzhiyun int layer; 145*4882a593Smuzhiyun unsigned int format; 146*4882a593Smuzhiyun struct list_head mem_region_list; 147*4882a593Smuzhiyun }; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun struct iep_mem_region { 150*4882a593Smuzhiyun struct list_head srv_lnk; 151*4882a593Smuzhiyun struct list_head reg_lnk; 152*4882a593Smuzhiyun struct list_head session_lnk; 153*4882a593Smuzhiyun unsigned long iova; /* virtual address for iommu */ 154*4882a593Smuzhiyun unsigned long len; 155*4882a593Smuzhiyun int hdl; 156*4882a593Smuzhiyun }; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun #endif 159*4882a593Smuzhiyun 160