xref: /rockchip-linux_mpp/mpp/vproc/iep/iep.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka /* This header is for communication between userspace driver and kernel driver */
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #ifndef __IEP_H__
20*437bfbebSnyanmisaka #define __IEP_H__
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #include <sys/ioctl.h>
23*437bfbebSnyanmisaka #include "rk_type.h"
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka /* Capability for current iep version using by userspace to determine iep features */
26*437bfbebSnyanmisaka typedef struct IepHwCap_t {
27*437bfbebSnyanmisaka     RK_U8   scaling_supported;
28*437bfbebSnyanmisaka     RK_U8   i4_deinterlace_supported;
29*437bfbebSnyanmisaka     RK_U8   i2_deinterlace_supported;
30*437bfbebSnyanmisaka     RK_U8   compression_noise_reduction_supported;
31*437bfbebSnyanmisaka     RK_U8   sampling_noise_reduction_supported;
32*437bfbebSnyanmisaka     RK_U8   hsb_enhancement_supported;
33*437bfbebSnyanmisaka     RK_U8   cg_enhancement_supported;
34*437bfbebSnyanmisaka     RK_U8   direct_path_supported;
35*437bfbebSnyanmisaka     RK_U16  max_dynamic_width;
36*437bfbebSnyanmisaka     RK_U16  max_dynamic_height;
37*437bfbebSnyanmisaka     RK_U16  max_static_width;
38*437bfbebSnyanmisaka     RK_U16  max_static_height;
39*437bfbebSnyanmisaka     RK_U8   max_enhance_radius;
40*437bfbebSnyanmisaka } IepHwCap;
41*437bfbebSnyanmisaka 
42*437bfbebSnyanmisaka #define IEP_IOC_MAGIC 'i'
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka #define IEP_SET_PARAMETER_REQ           _IOW(IEP_IOC_MAGIC, 1, unsigned long)
45*437bfbebSnyanmisaka #define IEP_SET_PARAMETER_DEINTERLACE   _IOW(IEP_IOC_MAGIC, 2, unsigned long)
46*437bfbebSnyanmisaka #define IEP_SET_PARAMETER_ENHANCE       _IOW(IEP_IOC_MAGIC, 3, unsigned long)
47*437bfbebSnyanmisaka #define IEP_SET_PARAMETER_CONVERT       _IOW(IEP_IOC_MAGIC, 4, unsigned long)
48*437bfbebSnyanmisaka #define IEP_SET_PARAMETER_SCALE         _IOW(IEP_IOC_MAGIC, 5, unsigned long)
49*437bfbebSnyanmisaka #define IEP_GET_RESULT_SYNC             _IOW(IEP_IOC_MAGIC, 6, unsigned long)
50*437bfbebSnyanmisaka #define IEP_GET_RESULT_ASYNC            _IOW(IEP_IOC_MAGIC, 7, unsigned long)
51*437bfbebSnyanmisaka #define IEP_SET_PARAMETER               _IOW(IEP_IOC_MAGIC, 8, unsigned long)
52*437bfbebSnyanmisaka #define IEP_RELEASE_CURRENT_TASK        _IOW(IEP_IOC_MAGIC, 9, unsigned long)
53*437bfbebSnyanmisaka #define IEP_GET_IOMMU_STATE             _IOR(IEP_IOC_MAGIC, 10, unsigned long)
54*437bfbebSnyanmisaka #define IEP_QUERY_CAP                   _IOR(IEP_IOC_MAGIC, 11, IepHwCap)
55*437bfbebSnyanmisaka 
56*437bfbebSnyanmisaka enum {
57*437bfbebSnyanmisaka     DEI_MODE_BYPASS_DIS         = 0x0,
58*437bfbebSnyanmisaka     DEI_MODE_I4O2               = 0x1,
59*437bfbebSnyanmisaka     DEI_MODE_I4O1B              = 0x2,
60*437bfbebSnyanmisaka     DEI_MODE_I4O1T              = 0x3,
61*437bfbebSnyanmisaka     DEI_MODE_I2O1B              = 0x4,
62*437bfbebSnyanmisaka     DEI_MODE_I2O1T              = 0x5,
63*437bfbebSnyanmisaka     DEI_MODE_BYPASS             = 0x6,
64*437bfbebSnyanmisaka };
65*437bfbebSnyanmisaka 
66*437bfbebSnyanmisaka // for rgb_enhance_mode
67*437bfbebSnyanmisaka enum {
68*437bfbebSnyanmisaka     RGB_ENHANCE_BYPASS          = 0x0,
69*437bfbebSnyanmisaka     RGB_ENHANCE_DENOISE         = 0x1,
70*437bfbebSnyanmisaka     RGB_ENHANCE_DETAIL          = 0x2,
71*437bfbebSnyanmisaka     RGB_ENHANCE_EDGE            = 0x3,
72*437bfbebSnyanmisaka };
73*437bfbebSnyanmisaka 
74*437bfbebSnyanmisaka // for rgb_contrast_enhance_mode
75*437bfbebSnyanmisaka enum {
76*437bfbebSnyanmisaka     RGB_CONTRAST_CC_P_DDE       = 0x0,      // cg prior to dde
77*437bfbebSnyanmisaka     RGB_CONTRAST_DDE_P_CC       = 0x1,      // dde prior to cg
78*437bfbebSnyanmisaka };
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka // for video mode
81*437bfbebSnyanmisaka enum {
82*437bfbebSnyanmisaka     BLACK_SCREEN                = 0x0,
83*437bfbebSnyanmisaka     BLUE_SCREEN                 = 0x1,
84*437bfbebSnyanmisaka     COLOR_BAR                   = 0x2,
85*437bfbebSnyanmisaka     NORMAL_MODE                 = 0x3,
86*437bfbebSnyanmisaka };
87*437bfbebSnyanmisaka 
88*437bfbebSnyanmisaka /*
89*437bfbebSnyanmisaka //          Alpha    Red     Green   Blue
90*437bfbebSnyanmisaka {  4, 32, {{32,24,  24,16,  16, 8,   8, 0 }}, GGL_RGBA },   // IEP_FORMAT_ARGB_8888
91*437bfbebSnyanmisaka {  4, 32, {{32,24,   8, 0,  16, 8,  24,16 }}, GGL_RGB  },   // IEP_FORMAT_ABGR_8888
92*437bfbebSnyanmisaka {  4, 32, {{ 8, 0,  32,24,  24,16,  16, 8 }}, GGL_RGB  },   // IEP_FORMAT_RGBA_8888
93*437bfbebSnyanmisaka {  4, 32, {{ 8, 0,  16, 8,  24,16,  32,24 }}, GGL_BGRA },   // IEP_FORMAT_BGRA_8888
94*437bfbebSnyanmisaka {  2, 16, {{ 0, 0,  16,11,  11, 5,   5, 0 }}, GGL_RGB  },   // IEP_FORMAT_RGB_565
95*437bfbebSnyanmisaka {  2, 16, {{ 0, 0,   5, 0,  11, 5,  16,11 }}, GGL_RGB  },   // IEP_FORMAT_RGB_565
96*437bfbebSnyanmisaka */
97*437bfbebSnyanmisaka 
98*437bfbebSnyanmisaka // for hardware format value
99*437bfbebSnyanmisaka enum {
100*437bfbebSnyanmisaka     IEP_MSG_FMT_ARGB_8888       = 0x0,
101*437bfbebSnyanmisaka     IEP_MSG_FMT_ABGR_8888       = 0x1,
102*437bfbebSnyanmisaka     IEP_MSG_FMT_RGBA_8888       = 0x2,
103*437bfbebSnyanmisaka     IEP_MSG_FMT_BGRA_8888       = 0x3,
104*437bfbebSnyanmisaka     IEP_MSG_FMT_RGB_565         = 0x4,
105*437bfbebSnyanmisaka     IEP_MSG_FMT_BGR_565         = 0x5,
106*437bfbebSnyanmisaka 
107*437bfbebSnyanmisaka     IEP_MSG_FMT_YCbCr_422_SP    = 0x10,
108*437bfbebSnyanmisaka     IEP_MSG_FMT_YCbCr_422_P     = 0x11,
109*437bfbebSnyanmisaka     IEP_MSG_FMT_YCbCr_420_SP    = 0x12,
110*437bfbebSnyanmisaka     IEP_MSG_FMT_YCbCr_420_P     = 0x13,
111*437bfbebSnyanmisaka     IEP_MSG_FMT_YCrCb_422_SP    = 0x14,
112*437bfbebSnyanmisaka     IEP_MSG_FMT_YCrCb_422_P     = 0x15, // same as IEP_FORMAT_YCbCr_422_P
113*437bfbebSnyanmisaka     IEP_MSG_FMT_YCrCb_420_SP    = 0x16,
114*437bfbebSnyanmisaka     IEP_MSG_FMT_YCrCb_420_P     = 0x17, // same as IEP_FORMAT_YCbCr_420_P
115*437bfbebSnyanmisaka };
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka /*
118*437bfbebSnyanmisaka  *  + <--------------+  virtual width  +------------> +
119*437bfbebSnyanmisaka  *  |                                                 |
120*437bfbebSnyanmisaka  *  +-------------------------------------------------+---+---+
121*437bfbebSnyanmisaka  *  |                                                 |   ^
122*437bfbebSnyanmisaka  *  |      + <---+  actual width  +--> +              |   |
123*437bfbebSnyanmisaka  *  |      |                           |              |   |
124*437bfbebSnyanmisaka  *  |      +---------------------------+---+--+       |   |
125*437bfbebSnyanmisaka  *  |      |                           |   ^          |   +
126*437bfbebSnyanmisaka  *  |      |                           |   +          | virtual
127*437bfbebSnyanmisaka  *  |      |                           | actual       | height
128*437bfbebSnyanmisaka  *  |      |                           | height       |   +
129*437bfbebSnyanmisaka  *  |      |                           |   +          |   |
130*437bfbebSnyanmisaka  *  |      |                           |   ^          |   |
131*437bfbebSnyanmisaka  *  |      +---------------------------+---+--+       |   |
132*437bfbebSnyanmisaka  *  |                                                 |   ^
133*437bfbebSnyanmisaka  *  +-------------------------------------------------+---+---+
134*437bfbebSnyanmisaka  */
135*437bfbebSnyanmisaka // NOTE: This is for kernel driver communication. keep it for compatibility
136*437bfbebSnyanmisaka typedef struct IepMsgImg_t {
137*437bfbebSnyanmisaka     RK_U16  act_w;              // act_width
138*437bfbebSnyanmisaka     RK_U16  act_h;              // act_height
139*437bfbebSnyanmisaka     RK_S16  x_off;              // x offset for the vir,word unit
140*437bfbebSnyanmisaka     RK_S16  y_off;              // y offset for the vir,word unit
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka     RK_U16  vir_w;              // unit :pix
143*437bfbebSnyanmisaka     RK_U16  vir_h;              // unit :pix
144*437bfbebSnyanmisaka     RK_U32  format;
145*437bfbebSnyanmisaka     RK_U32  mem_addr;
146*437bfbebSnyanmisaka     RK_U32  uv_addr;
147*437bfbebSnyanmisaka     RK_U32  v_addr;
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka     RK_U8   rb_swap;            // not be used
150*437bfbebSnyanmisaka     RK_U8   uv_swap;            // not be used
151*437bfbebSnyanmisaka 
152*437bfbebSnyanmisaka     RK_U8   alpha_swap;         // not be used
153*437bfbebSnyanmisaka } IepMsgImg;
154*437bfbebSnyanmisaka 
155*437bfbebSnyanmisaka typedef struct IepMsg_t {
156*437bfbebSnyanmisaka     IepMsgImg src;              // src active window
157*437bfbebSnyanmisaka     IepMsgImg dst;              // src virtual window
158*437bfbebSnyanmisaka 
159*437bfbebSnyanmisaka     IepMsgImg src1;
160*437bfbebSnyanmisaka     IepMsgImg dst1;
161*437bfbebSnyanmisaka 
162*437bfbebSnyanmisaka     IepMsgImg src_itemp;
163*437bfbebSnyanmisaka     IepMsgImg src_ftemp;
164*437bfbebSnyanmisaka 
165*437bfbebSnyanmisaka     IepMsgImg dst_itemp;
166*437bfbebSnyanmisaka     IepMsgImg dst_ftemp;
167*437bfbebSnyanmisaka 
168*437bfbebSnyanmisaka     RK_U8   dither_up_en;
169*437bfbebSnyanmisaka     RK_U8   dither_down_en;     //not to be used
170*437bfbebSnyanmisaka 
171*437bfbebSnyanmisaka     RK_U8   yuv2rgb_mode;
172*437bfbebSnyanmisaka     RK_U8   rgb2yuv_mode;
173*437bfbebSnyanmisaka 
174*437bfbebSnyanmisaka     RK_U8   global_alpha_value;
175*437bfbebSnyanmisaka 
176*437bfbebSnyanmisaka     RK_U8   rgb2yuv_clip_en;
177*437bfbebSnyanmisaka     RK_U8   yuv2rgb_clip_en;
178*437bfbebSnyanmisaka 
179*437bfbebSnyanmisaka     RK_U8   lcdc_path_en;
180*437bfbebSnyanmisaka     RK_S32  off_x;
181*437bfbebSnyanmisaka     RK_S32  off_y;
182*437bfbebSnyanmisaka     RK_S32  width;
183*437bfbebSnyanmisaka     RK_S32  height;
184*437bfbebSnyanmisaka     RK_S32  layer;
185*437bfbebSnyanmisaka 
186*437bfbebSnyanmisaka     RK_U8   yuv_3D_denoise_en;
187*437bfbebSnyanmisaka 
188*437bfbebSnyanmisaka     /// yuv color enhance
189*437bfbebSnyanmisaka     RK_U8   yuv_enhance_en;
190*437bfbebSnyanmisaka     RK_S32  sat_con_int;
191*437bfbebSnyanmisaka     RK_S32  contrast_int;
192*437bfbebSnyanmisaka     RK_S32  cos_hue_int;
193*437bfbebSnyanmisaka     RK_S32  sin_hue_int;
194*437bfbebSnyanmisaka     RK_S8   yuv_enh_brightness;     // -32 < brightness < 31
195*437bfbebSnyanmisaka     RK_U8   video_mode;             // 0 ~ 3
196*437bfbebSnyanmisaka     RK_U8   color_bar_y;            // 0 ~ 127
197*437bfbebSnyanmisaka     RK_U8   color_bar_u;            // 0 ~ 127
198*437bfbebSnyanmisaka     RK_U8   color_bar_v;            // 0 ~ 127
199*437bfbebSnyanmisaka 
200*437bfbebSnyanmisaka 
201*437bfbebSnyanmisaka     RK_U8   rgb_enhance_en;         // I don't know its usage
202*437bfbebSnyanmisaka 
203*437bfbebSnyanmisaka     RK_U8   rgb_color_enhance_en;   // sw_rgb_color_enh_en
204*437bfbebSnyanmisaka     RK_U32  rgb_enh_coe;
205*437bfbebSnyanmisaka 
206*437bfbebSnyanmisaka     RK_U8   rgb_enhance_mode;       // sw_rgb_enh_sel,dde sel
207*437bfbebSnyanmisaka 
208*437bfbebSnyanmisaka     RK_U8   rgb_cg_en;              // sw_rgb_con_gam_en
209*437bfbebSnyanmisaka     RK_U32  cg_tab[192];
210*437bfbebSnyanmisaka 
211*437bfbebSnyanmisaka     // sw_con_gam_order; 0 cg prior to dde, 1 dde prior to cg
212*437bfbebSnyanmisaka     RK_U8   rgb_contrast_enhance_mode;
213*437bfbebSnyanmisaka 
214*437bfbebSnyanmisaka     RK_S32  enh_threshold;
215*437bfbebSnyanmisaka     RK_S32  enh_alpha;
216*437bfbebSnyanmisaka     RK_S32  enh_radius;
217*437bfbebSnyanmisaka 
218*437bfbebSnyanmisaka     RK_U8   scale_up_mode;
219*437bfbebSnyanmisaka 
220*437bfbebSnyanmisaka     RK_U8   field_order;
221*437bfbebSnyanmisaka     RK_U8   dein_mode;
222*437bfbebSnyanmisaka     //DIL High Frequency
223*437bfbebSnyanmisaka     RK_U8   dein_high_fre_en;
224*437bfbebSnyanmisaka     RK_U8   dein_high_fre_fct;
225*437bfbebSnyanmisaka     //DIL EI
226*437bfbebSnyanmisaka     RK_U8   dein_ei_mode;
227*437bfbebSnyanmisaka     RK_U8   dein_ei_smooth;
228*437bfbebSnyanmisaka     RK_U8   dein_ei_sel;
229*437bfbebSnyanmisaka     RK_U8   dein_ei_radius;         // when dein_ei_sel=0 will be used
230*437bfbebSnyanmisaka 
231*437bfbebSnyanmisaka     RK_U8   dil_mtn_tbl_en;
232*437bfbebSnyanmisaka     RK_U32  dil_mtn_tbl[8];
233*437bfbebSnyanmisaka 
234*437bfbebSnyanmisaka     RK_U8   vir_addr_enable;
235*437bfbebSnyanmisaka 
236*437bfbebSnyanmisaka     void    *base;
237*437bfbebSnyanmisaka } IepMsg;
238*437bfbebSnyanmisaka 
239*437bfbebSnyanmisaka #endif /* __IEP_H__ */
240