xref: /OK3568_Linux_fs/external/rknpu2/examples/3rdparty/rga/RV110X/include/rga.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2016 Rockchip Electronics Co., Ltd.
3*4882a593Smuzhiyun  * Authors:
4*4882a593Smuzhiyun  *    Zhiqin Wei <wzq@rock-chips.com>
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
7*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
8*4882a593Smuzhiyun  * You may obtain a copy of the License at
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
13*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
14*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
16*4882a593Smuzhiyun  * limitations under the License.
17*4882a593Smuzhiyun  */
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #ifndef _RGA_DRIVER_H_
20*4882a593Smuzhiyun #define _RGA_DRIVER_H_
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #include <asm/ioctl.h>
23*4882a593Smuzhiyun #include <stdint.h>
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #ifdef __cplusplus
26*4882a593Smuzhiyun extern "C"
27*4882a593Smuzhiyun {
28*4882a593Smuzhiyun #endif
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /* Use 'r' as magic number */
31*4882a593Smuzhiyun #define RGA_IOC_MAGIC       'r'
32*4882a593Smuzhiyun #define RGA_IOW(nr, type)   _IOW(RGA_IOC_MAGIC, nr, type)
33*4882a593Smuzhiyun #define RGA_IOR(nr, type)   _IOR(RGA_IOC_MAGIC, nr, type)
34*4882a593Smuzhiyun #define RGA_IOWR(nr, type)  _IOWR(RGA_IOC_MAGIC, nr, type)
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define RGA_IOC_GET_DRVIER_VERSION  RGA_IOR(0x1, struct rga_version_t)
37*4882a593Smuzhiyun #define RGA_IOC_GET_HW_VERSION      RGA_IOR(0x2, struct rga_hw_versions_t)
38*4882a593Smuzhiyun #define RGA_IOC_IMPORT_BUFFER       RGA_IOWR(0x3, struct rga_buffer_pool)
39*4882a593Smuzhiyun #define RGA_IOC_RELEASE_BUFFER      RGA_IOW(0x4, struct rga_buffer_pool)
40*4882a593Smuzhiyun #define RGA_START_CONFIG            RGA_IOR(0x5, uint32_t)
41*4882a593Smuzhiyun #define RGA_END_CONFIG              RGA_IOWR(0x6, struct rga_user_ctx_t)
42*4882a593Smuzhiyun #define RGA_CMD_CONFIG              RGA_IOWR(0x7, struct rga_user_ctx_t)
43*4882a593Smuzhiyun #define RGA_CANCEL_CONFIG           RGA_IOWR(0x8, uint32_t)
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define RGA_BLIT_SYNC   0x5017
46*4882a593Smuzhiyun #define RGA_BLIT_ASYNC  0x5018
47*4882a593Smuzhiyun #define RGA_FLUSH       0x5019
48*4882a593Smuzhiyun #define RGA_GET_RESULT  0x501a
49*4882a593Smuzhiyun #define RGA_GET_VERSION 0x501b
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #define RGA2_BLIT_SYNC   0x6017
52*4882a593Smuzhiyun #define RGA2_BLIT_ASYNC  0x6018
53*4882a593Smuzhiyun #define RGA2_FLUSH       0x6019
54*4882a593Smuzhiyun #define RGA2_GET_RESULT  0x601a
55*4882a593Smuzhiyun #define RGA2_GET_VERSION 0x601b
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #define RGA_REG_CTRL_LEN    0x8    /* 8  */
58*4882a593Smuzhiyun #define RGA_REG_CMD_LEN     0x1c   /* 28 */
59*4882a593Smuzhiyun #define RGA_CMD_BUF_SIZE    0x700  /* 16*28*4 */
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #ifndef ENABLE
62*4882a593Smuzhiyun #define ENABLE 1
63*4882a593Smuzhiyun #endif
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun #ifndef DISABLE
66*4882a593Smuzhiyun #define DISABLE 0
67*4882a593Smuzhiyun #endif
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun enum rga_memory_type {
70*4882a593Smuzhiyun     RGA_DMA_BUFFER = 0,
71*4882a593Smuzhiyun     RGA_VIRTUAL_ADDRESS,
72*4882a593Smuzhiyun     RGA_PHYSICAL_ADDRESS
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /* RGA process mode enum */
76*4882a593Smuzhiyun enum {
77*4882a593Smuzhiyun     bitblt_mode               = 0x0,
78*4882a593Smuzhiyun     color_palette_mode        = 0x1,
79*4882a593Smuzhiyun     color_fill_mode           = 0x2,
80*4882a593Smuzhiyun     line_point_drawing_mode   = 0x3,
81*4882a593Smuzhiyun     blur_sharp_filter_mode    = 0x4,
82*4882a593Smuzhiyun     pre_scaling_mode          = 0x5,
83*4882a593Smuzhiyun     update_palette_table_mode = 0x6,
84*4882a593Smuzhiyun     update_patten_buff_mode   = 0x7,
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun enum {
89*4882a593Smuzhiyun     rop_enable_mask          = 0x2,
90*4882a593Smuzhiyun     dither_enable_mask       = 0x8,
91*4882a593Smuzhiyun     fading_enable_mask       = 0x10,
92*4882a593Smuzhiyun     PD_enbale_mask           = 0x20,
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun enum {
96*4882a593Smuzhiyun     yuv2rgb_mode0            = 0x0,     /* BT.601 MPEG */
97*4882a593Smuzhiyun     yuv2rgb_mode1            = 0x1,     /* BT.601 JPEG */
98*4882a593Smuzhiyun     yuv2rgb_mode2            = 0x2,     /* BT.709      */
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun     rgb2yuv_601_full                = 0x1 << 8,
101*4882a593Smuzhiyun     rgb2yuv_709_full                = 0x2 << 8,
102*4882a593Smuzhiyun     yuv2yuv_601_limit_2_709_limit   = 0x3 << 8,
103*4882a593Smuzhiyun     yuv2yuv_601_limit_2_709_full    = 0x4 << 8,
104*4882a593Smuzhiyun     yuv2yuv_709_limit_2_601_limit   = 0x5 << 8,
105*4882a593Smuzhiyun     yuv2yuv_709_limit_2_601_full    = 0x6 << 8,     //not support
106*4882a593Smuzhiyun     yuv2yuv_601_full_2_709_limit    = 0x7 << 8,
107*4882a593Smuzhiyun     yuv2yuv_601_full_2_709_full     = 0x8 << 8,     //not support
108*4882a593Smuzhiyun     yuv2yuv_709_full_2_601_limit    = 0x9 << 8,     //not support
109*4882a593Smuzhiyun     yuv2yuv_709_full_2_601_full     = 0xa << 8,     //not support
110*4882a593Smuzhiyun     full_csc_mask = 0xf00,
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun /* RGA rotate mode */
114*4882a593Smuzhiyun enum {
115*4882a593Smuzhiyun     rotate_mode0             = 0x0,     /* no rotate */
116*4882a593Smuzhiyun     rotate_mode1             = 0x1,     /* rotate    */
117*4882a593Smuzhiyun     rotate_mode2             = 0x2,     /* x_mirror  */
118*4882a593Smuzhiyun     rotate_mode3             = 0x3,     /* y_mirror  */
119*4882a593Smuzhiyun };
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun enum {
122*4882a593Smuzhiyun     color_palette_mode0      = 0x0,     /* 1K */
123*4882a593Smuzhiyun     color_palette_mode1      = 0x1,     /* 2K */
124*4882a593Smuzhiyun     color_palette_mode2      = 0x2,     /* 4K */
125*4882a593Smuzhiyun     color_palette_mode3      = 0x3,     /* 8K */
126*4882a593Smuzhiyun };
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun enum {
129*4882a593Smuzhiyun     BB_BYPASS   = 0x0,     /* no rotate */
130*4882a593Smuzhiyun     BB_ROTATE   = 0x1,     /* rotate    */
131*4882a593Smuzhiyun     BB_X_MIRROR = 0x2,     /* x_mirror  */
132*4882a593Smuzhiyun     BB_Y_MIRROR = 0x3      /* y_mirror  */
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun enum {
136*4882a593Smuzhiyun     nearby   = 0x0,     /* no rotate */
137*4882a593Smuzhiyun     bilinear = 0x1,     /* rotate    */
138*4882a593Smuzhiyun     bicubic  = 0x2,     /* x_mirror  */
139*4882a593Smuzhiyun };
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun #define RGA_SCHED_PRIORITY_DEFAULT 0
142*4882a593Smuzhiyun #define RGA_SCHED_PRIORITY_MAX 6
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun enum {
145*4882a593Smuzhiyun     RGA3_SCHEDULER_CORE0    = 1 << 0,
146*4882a593Smuzhiyun     RGA3_SCHEDULER_CORE1    = 1 << 1,
147*4882a593Smuzhiyun     RGA2_SCHEDULER_CORE0    = 1 << 2,
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun /*
151*4882a593Smuzhiyun //          Alpha    Red     Green   Blue
152*4882a593Smuzhiyun {  4, 32, {{32,24,   8, 0,  16, 8,  24,16 }}, GGL_RGBA },   // RK_FORMAT_RGBA_8888
153*4882a593Smuzhiyun {  4, 24, {{ 0, 0,   8, 0,  16, 8,  24,16 }}, GGL_RGB  },   // RK_FORMAT_RGBX_8888
154*4882a593Smuzhiyun {  3, 24, {{ 0, 0,   8, 0,  16, 8,  24,16 }}, GGL_RGB  },   // RK_FORMAT_RGB_888
155*4882a593Smuzhiyun {  4, 32, {{32,24,  24,16,  16, 8,   8, 0 }}, GGL_BGRA },   // RK_FORMAT_BGRA_8888
156*4882a593Smuzhiyun {  2, 16, {{ 0, 0,  16,11,  11, 5,   5, 0 }}, GGL_RGB  },   // RK_FORMAT_RGB_565
157*4882a593Smuzhiyun {  2, 16, {{ 1, 0,  16,11,  11, 6,   6, 1 }}, GGL_RGBA },   // RK_FORMAT_RGBA_5551
158*4882a593Smuzhiyun {  2, 16, {{ 4, 0,  16,12,  12, 8,   8, 4 }}, GGL_RGBA },   // RK_FORMAT_RGBA_4444
159*4882a593Smuzhiyun {  3, 24, {{ 0, 0,  24,16,  16, 8,   8, 0 }}, GGL_BGR  },   // RK_FORMAT_BGB_888
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun */
162*4882a593Smuzhiyun /* In order to be compatible with RK_FORMAT_XX and HAL_PIXEL_FORMAT_XX,
163*4882a593Smuzhiyun  * RK_FORMAT_XX is shifted to the left by 8 bits to distinguish.  */
164*4882a593Smuzhiyun typedef enum _Rga_SURF_FORMAT {
165*4882a593Smuzhiyun     RK_FORMAT_RGBA_8888    = 0x0 << 8,
166*4882a593Smuzhiyun     RK_FORMAT_RGBX_8888    = 0x1 << 8,
167*4882a593Smuzhiyun     RK_FORMAT_RGB_888      = 0x2 << 8,
168*4882a593Smuzhiyun     RK_FORMAT_BGRA_8888    = 0x3 << 8,
169*4882a593Smuzhiyun     RK_FORMAT_RGB_565      = 0x4 << 8,
170*4882a593Smuzhiyun     RK_FORMAT_RGBA_5551    = 0x5 << 8,
171*4882a593Smuzhiyun     RK_FORMAT_RGBA_4444    = 0x6 << 8,
172*4882a593Smuzhiyun     RK_FORMAT_BGR_888      = 0x7 << 8,
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun     RK_FORMAT_YCbCr_422_SP = 0x8 << 8,
175*4882a593Smuzhiyun     RK_FORMAT_YCbCr_422_P  = 0x9 << 8,
176*4882a593Smuzhiyun     RK_FORMAT_YCbCr_420_SP = 0xa << 8,
177*4882a593Smuzhiyun     RK_FORMAT_YCbCr_420_P  = 0xb << 8,
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun     RK_FORMAT_YCrCb_422_SP = 0xc << 8,
180*4882a593Smuzhiyun     RK_FORMAT_YCrCb_422_P  = 0xd << 8,
181*4882a593Smuzhiyun     RK_FORMAT_YCrCb_420_SP = 0xe << 8,
182*4882a593Smuzhiyun     RK_FORMAT_YCrCb_420_P  = 0xf << 8,
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun     RK_FORMAT_BPP1         = 0x10 << 8,
185*4882a593Smuzhiyun     RK_FORMAT_BPP2         = 0x11 << 8,
186*4882a593Smuzhiyun     RK_FORMAT_BPP4         = 0x12 << 8,
187*4882a593Smuzhiyun     RK_FORMAT_BPP8         = 0x13 << 8,
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun     RK_FORMAT_Y4           = 0x14 << 8,
190*4882a593Smuzhiyun     RK_FORMAT_YCbCr_400    = 0x15 << 8,
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun     RK_FORMAT_BGRX_8888    = 0x16 << 8,
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun     RK_FORMAT_YVYU_422     = 0x18 << 8,
195*4882a593Smuzhiyun     RK_FORMAT_YVYU_420     = 0x19 << 8,
196*4882a593Smuzhiyun     RK_FORMAT_VYUY_422     = 0x1a << 8,
197*4882a593Smuzhiyun     RK_FORMAT_VYUY_420     = 0x1b << 8,
198*4882a593Smuzhiyun     RK_FORMAT_YUYV_422     = 0x1c << 8,
199*4882a593Smuzhiyun     RK_FORMAT_YUYV_420     = 0x1d << 8,
200*4882a593Smuzhiyun     RK_FORMAT_UYVY_422     = 0x1e << 8,
201*4882a593Smuzhiyun     RK_FORMAT_UYVY_420     = 0x1f << 8,
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun     RK_FORMAT_YCbCr_420_SP_10B = 0x20 << 8,
204*4882a593Smuzhiyun     RK_FORMAT_YCrCb_420_SP_10B = 0x21 << 8,
205*4882a593Smuzhiyun     RK_FORMAT_YCbCr_422_SP_10B = 0x22 << 8,
206*4882a593Smuzhiyun     RK_FORMAT_YCrCb_422_SP_10B = 0x23 << 8,
207*4882a593Smuzhiyun     /* For compatibility with misspellings */
208*4882a593Smuzhiyun     RK_FORMAT_YCbCr_422_10b_SP = RK_FORMAT_YCbCr_422_SP_10B,
209*4882a593Smuzhiyun     RK_FORMAT_YCrCb_422_10b_SP = RK_FORMAT_YCrCb_422_SP_10B,
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun     RK_FORMAT_BGR_565      = 0x24 << 8,
212*4882a593Smuzhiyun     RK_FORMAT_BGRA_5551    = 0x25 << 8,
213*4882a593Smuzhiyun     RK_FORMAT_BGRA_4444    = 0x26 << 8,
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun     RK_FORMAT_ARGB_8888    = 0x28 << 8,
216*4882a593Smuzhiyun     RK_FORMAT_XRGB_8888    = 0x29 << 8,
217*4882a593Smuzhiyun     RK_FORMAT_ARGB_5551    = 0x2a << 8,
218*4882a593Smuzhiyun     RK_FORMAT_ARGB_4444    = 0x2b << 8,
219*4882a593Smuzhiyun     RK_FORMAT_ABGR_8888    = 0x2c << 8,
220*4882a593Smuzhiyun     RK_FORMAT_XBGR_8888    = 0x2d << 8,
221*4882a593Smuzhiyun     RK_FORMAT_ABGR_5551    = 0x2e << 8,
222*4882a593Smuzhiyun     RK_FORMAT_ABGR_4444    = 0x2f << 8,
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun     RK_FORMAT_RGBA2BPP     = 0x30 << 8,
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun     RK_FORMAT_UNKNOWN      = 0x100 << 8,
227*4882a593Smuzhiyun } RgaSURF_FORMAT;
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun /* RGA3 rd_mode */
230*4882a593Smuzhiyun enum
231*4882a593Smuzhiyun {
232*4882a593Smuzhiyun     raster_mode             = 0x1 << 0,
233*4882a593Smuzhiyun     fbc_mode                = 0x1 << 1,
234*4882a593Smuzhiyun     tile_mode               = 0x1 << 2,
235*4882a593Smuzhiyun };
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun typedef struct rga_img_info_t {
238*4882a593Smuzhiyun     uint64_t yrgb_addr;          /* yrgb    mem addr         */
239*4882a593Smuzhiyun     uint64_t uv_addr;            /* cb/cr   mem addr         */
240*4882a593Smuzhiyun     uint64_t v_addr;             /* cr      mem addr         */
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun     uint32_t format;             //definition by RK_FORMAT
243*4882a593Smuzhiyun     uint16_t act_w;
244*4882a593Smuzhiyun     uint16_t act_h;
245*4882a593Smuzhiyun     uint16_t x_offset;
246*4882a593Smuzhiyun     uint16_t y_offset;
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun     uint16_t vir_w;
249*4882a593Smuzhiyun     uint16_t vir_h;
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun     uint16_t endian_mode; //for BPP
252*4882a593Smuzhiyun     uint16_t alpha_swap;
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun     //used by RGA3
255*4882a593Smuzhiyun     uint16_t rotate_mode;
256*4882a593Smuzhiyun     uint16_t rd_mode;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun     uint16_t is_10b_compact;
259*4882a593Smuzhiyun     uint16_t is_10b_endian;
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun     uint16_t enable;
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun rga_img_info_t;
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun typedef struct POINT {
266*4882a593Smuzhiyun     uint16_t x;
267*4882a593Smuzhiyun     uint16_t y;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun POINT;
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun typedef struct RECT {
272*4882a593Smuzhiyun     uint16_t xmin;
273*4882a593Smuzhiyun     uint16_t xmax; // width - 1
274*4882a593Smuzhiyun     uint16_t ymin;
275*4882a593Smuzhiyun     uint16_t ymax; // height - 1
276*4882a593Smuzhiyun } RECT;
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun typedef struct MMU {
279*4882a593Smuzhiyun     uint8_t mmu_en;
280*4882a593Smuzhiyun     uint64_t base_addr;
281*4882a593Smuzhiyun     uint32_t mmu_flag;     /* [0] mmu enable [1] src_flush [2] dst_flush [3] CMD_flush [4~5] page size*/
282*4882a593Smuzhiyun } MMU;
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun typedef struct COLOR_FILL {
285*4882a593Smuzhiyun     int16_t gr_x_a;
286*4882a593Smuzhiyun     int16_t gr_y_a;
287*4882a593Smuzhiyun     int16_t gr_x_b;
288*4882a593Smuzhiyun     int16_t gr_y_b;
289*4882a593Smuzhiyun     int16_t gr_x_g;
290*4882a593Smuzhiyun     int16_t gr_y_g;
291*4882a593Smuzhiyun     int16_t gr_x_r;
292*4882a593Smuzhiyun     int16_t gr_y_r;
293*4882a593Smuzhiyun     //u8  cp_gr_saturation;
294*4882a593Smuzhiyun }
295*4882a593Smuzhiyun COLOR_FILL;
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun typedef struct FADING {
298*4882a593Smuzhiyun     uint8_t b;
299*4882a593Smuzhiyun     uint8_t g;
300*4882a593Smuzhiyun     uint8_t r;
301*4882a593Smuzhiyun     uint8_t res;
302*4882a593Smuzhiyun }
303*4882a593Smuzhiyun FADING;
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun typedef struct line_draw_t {
306*4882a593Smuzhiyun     POINT start_point;                  /* LineDraw_start_point                */
307*4882a593Smuzhiyun     POINT end_point;                    /* LineDraw_end_point                  */
308*4882a593Smuzhiyun     uint32_t   color;                   /* LineDraw_color                      */
309*4882a593Smuzhiyun     uint32_t   flag;                    /* (enum) LineDrawing mode sel         */
310*4882a593Smuzhiyun     uint32_t   line_width;              /* range 1~16 */
311*4882a593Smuzhiyun }
312*4882a593Smuzhiyun line_draw_t;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun /* color space convert coefficient. */
315*4882a593Smuzhiyun typedef struct csc_coe_t {
316*4882a593Smuzhiyun     int16_t r_v;
317*4882a593Smuzhiyun     int16_t g_y;
318*4882a593Smuzhiyun     int16_t b_u;
319*4882a593Smuzhiyun     int32_t off;
320*4882a593Smuzhiyun } csc_coe_t;
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun typedef struct full_csc_t {
323*4882a593Smuzhiyun     uint8_t flag;
324*4882a593Smuzhiyun     csc_coe_t coe_y;
325*4882a593Smuzhiyun     csc_coe_t coe_u;
326*4882a593Smuzhiyun     csc_coe_t coe_v;
327*4882a593Smuzhiyun } full_csc_t;
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun struct rga_mosaic_info {
330*4882a593Smuzhiyun     uint8_t enable;
331*4882a593Smuzhiyun     uint8_t mode;
332*4882a593Smuzhiyun };
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun struct rga_pre_intr_info {
335*4882a593Smuzhiyun     uint8_t enable;
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun     uint8_t read_intr_en;
338*4882a593Smuzhiyun     uint8_t write_intr_en;
339*4882a593Smuzhiyun     uint8_t read_hold_en;
340*4882a593Smuzhiyun     uint32_t read_threshold;
341*4882a593Smuzhiyun     uint32_t write_start;
342*4882a593Smuzhiyun     uint32_t write_step;
343*4882a593Smuzhiyun };
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun /* MAX(min, (max - channel_value)) */
346*4882a593Smuzhiyun struct rga_osd_invert_factor {
347*4882a593Smuzhiyun     uint8_t alpha_max;
348*4882a593Smuzhiyun     uint8_t alpha_min;
349*4882a593Smuzhiyun     uint8_t yg_max;
350*4882a593Smuzhiyun     uint8_t yg_min;
351*4882a593Smuzhiyun     uint8_t crb_max;
352*4882a593Smuzhiyun     uint8_t crb_min;
353*4882a593Smuzhiyun };
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun struct rga_color {
356*4882a593Smuzhiyun     union {
357*4882a593Smuzhiyun         struct {
358*4882a593Smuzhiyun             uint8_t red;
359*4882a593Smuzhiyun             uint8_t green;
360*4882a593Smuzhiyun             uint8_t blue;
361*4882a593Smuzhiyun             uint8_t alpha;
362*4882a593Smuzhiyun         };
363*4882a593Smuzhiyun         uint32_t value;
364*4882a593Smuzhiyun     };
365*4882a593Smuzhiyun };
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun struct rga_osd_bpp2 {
368*4882a593Smuzhiyun     uint8_t  ac_swap;           // ac swap flag
369*4882a593Smuzhiyun                                 // 0: CA
370*4882a593Smuzhiyun                                 // 1: AC
371*4882a593Smuzhiyun     uint8_t  endian_swap;       // rgba2bpp endian swap
372*4882a593Smuzhiyun                                 // 0: Big endian
373*4882a593Smuzhiyun                                 // 1: Little endian
374*4882a593Smuzhiyun     struct rga_color color0;
375*4882a593Smuzhiyun     struct rga_color color1;
376*4882a593Smuzhiyun };
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun struct rga_osd_mode_ctrl {
379*4882a593Smuzhiyun     uint8_t mode;               // OSD cal mode:
380*4882a593Smuzhiyun                                 //   0b'1: statistics mode
381*4882a593Smuzhiyun                                 //   1b'1: auto inversion overlap mode
382*4882a593Smuzhiyun     uint8_t direction_mode;     // horizontal or vertical
383*4882a593Smuzhiyun                                 //   0: horizontal
384*4882a593Smuzhiyun                                 //   1: vertical
385*4882a593Smuzhiyun     uint8_t width_mode;         // using @fix_width or LUT width
386*4882a593Smuzhiyun                                 //   0: fix width
387*4882a593Smuzhiyun                                 //   1: LUT width
388*4882a593Smuzhiyun     uint16_t block_fix_width;   // OSD block fixed width
389*4882a593Smuzhiyun                                 //   real width = (fix_width + 1) * 2
390*4882a593Smuzhiyun     uint8_t block_num;          // OSD block num
391*4882a593Smuzhiyun     uint16_t flags_index;       // auto invert flags index
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun     /* invertion config */
394*4882a593Smuzhiyun     uint8_t color_mode;         // selete color
395*4882a593Smuzhiyun                                 //   0: src1 color
396*4882a593Smuzhiyun                                 //   1: config data color
397*4882a593Smuzhiyun     uint8_t invert_flags_mode;  // invert flag selete
398*4882a593Smuzhiyun                                 //   0: use RAM flag
399*4882a593Smuzhiyun                                 //   1: usr last result
400*4882a593Smuzhiyun     uint8_t default_color_sel;  // default color mode
401*4882a593Smuzhiyun                                 //   0: default is bright
402*4882a593Smuzhiyun                                 //   1: default is dark
403*4882a593Smuzhiyun     uint8_t invert_enable;      // invert channel enable
404*4882a593Smuzhiyun                                 //   1 << 0: aplha enable
405*4882a593Smuzhiyun                                 //   1 << 1: Y/G disable
406*4882a593Smuzhiyun                                 //   1 << 2: C/RB disable
407*4882a593Smuzhiyun     uint8_t invert_mode;        // invert cal mode
408*4882a593Smuzhiyun                                 //   0: normal(max-data)
409*4882a593Smuzhiyun                                 //   1: swap
410*4882a593Smuzhiyun     uint8_t invert_thresh;      // if luma > thresh, osd_flag to be 1
411*4882a593Smuzhiyun     uint8_t unfix_index;        // OSD width config index
412*4882a593Smuzhiyun };
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun struct rga_osd_info {
415*4882a593Smuzhiyun     uint8_t  enable;
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun     struct rga_osd_mode_ctrl mode_ctrl;
418*4882a593Smuzhiyun     struct rga_osd_invert_factor cal_factor;
419*4882a593Smuzhiyun     struct rga_osd_bpp2 bpp2_info;
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun     union {
422*4882a593Smuzhiyun         struct {
423*4882a593Smuzhiyun             uint32_t last_flags1;
424*4882a593Smuzhiyun             uint32_t last_flags0;
425*4882a593Smuzhiyun         };
426*4882a593Smuzhiyun         uint64_t last_flags;
427*4882a593Smuzhiyun     };
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun     union {
430*4882a593Smuzhiyun         struct {
431*4882a593Smuzhiyun             uint32_t cur_flags1;
432*4882a593Smuzhiyun             uint32_t cur_flags0;
433*4882a593Smuzhiyun         };
434*4882a593Smuzhiyun         uint64_t cur_flags;
435*4882a593Smuzhiyun     };
436*4882a593Smuzhiyun };
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun #define RGA_VERSION_SIZE    16
439*4882a593Smuzhiyun #define RGA_HW_SIZE            5
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun struct rga_version_t {
442*4882a593Smuzhiyun     uint32_t major;
443*4882a593Smuzhiyun     uint32_t minor;
444*4882a593Smuzhiyun     uint32_t revision;
445*4882a593Smuzhiyun     uint8_t str[RGA_VERSION_SIZE];
446*4882a593Smuzhiyun };
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun struct rga_hw_versions_t {
449*4882a593Smuzhiyun     struct rga_version_t version[RGA_HW_SIZE];
450*4882a593Smuzhiyun     uint32_t size;
451*4882a593Smuzhiyun };
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun struct rga_memory_parm {
454*4882a593Smuzhiyun     uint32_t width;
455*4882a593Smuzhiyun     uint32_t height;
456*4882a593Smuzhiyun     uint32_t format;
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun     uint32_t size;
459*4882a593Smuzhiyun };
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun struct rga_external_buffer {
462*4882a593Smuzhiyun     uint64_t memory;
463*4882a593Smuzhiyun     uint32_t type;
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun     uint32_t handle;
466*4882a593Smuzhiyun     struct rga_memory_parm memory_info;
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun     uint8_t reserve[252];
469*4882a593Smuzhiyun };
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun struct rga_buffer_pool {
472*4882a593Smuzhiyun     uint64_t buffers;
473*4882a593Smuzhiyun     uint32_t size;
474*4882a593Smuzhiyun };
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun struct rga_req {
477*4882a593Smuzhiyun     uint8_t render_mode;                  /* (enum) process mode sel */
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun     rga_img_info_t src;                   /* src image info */
480*4882a593Smuzhiyun     rga_img_info_t dst;                   /* dst image info */
481*4882a593Smuzhiyun     rga_img_info_t pat;                   /* patten image info */
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun     uint64_t rop_mask_addr;               /* rop4 mask addr */
484*4882a593Smuzhiyun     uint64_t LUT_addr;                    /* LUT addr */
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun     RECT clip;                            /* dst clip window default value is dst_vir */
487*4882a593Smuzhiyun                                           /* value from [0, w-1] / [0, h-1]*/
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun     int32_t sina;                         /* dst angle  default value 0  16.16 scan from table */
490*4882a593Smuzhiyun     int32_t cosa;                         /* dst angle  default value 0  16.16 scan from table */
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun     uint16_t alpha_rop_flag;              /* alpha rop process flag           */
493*4882a593Smuzhiyun                                           /* ([0] = 1 alpha_rop_enable)       */
494*4882a593Smuzhiyun                                           /* ([1] = 1 rop enable)             */
495*4882a593Smuzhiyun                                           /* ([2] = 1 fading_enable)          */
496*4882a593Smuzhiyun                                           /* ([3] = 1 PD_enable)              */
497*4882a593Smuzhiyun                                           /* ([4] = 1 alpha cal_mode_sel)     */
498*4882a593Smuzhiyun                                           /* ([5] = 1 dither_enable)          */
499*4882a593Smuzhiyun                                           /* ([6] = 1 gradient fill mode sel) */
500*4882a593Smuzhiyun                                           /* ([7] = 1 AA_enable)              */
501*4882a593Smuzhiyun                                           /* ([8] = 1 nn_quantize)            */
502*4882a593Smuzhiyun                                           /* ([9] = 1 Real color mode)        */
503*4882a593Smuzhiyun 
504*4882a593Smuzhiyun     uint8_t  scale_mode;                  /* 0 nearst / 1 bilnear / 2 bicubic */
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun     uint32_t color_key_max;               /* color key max */
507*4882a593Smuzhiyun     uint32_t color_key_min;               /* color key min */
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun     uint32_t fg_color;                    /* foreground color */
510*4882a593Smuzhiyun     uint32_t bg_color;                    /* background color */
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun     COLOR_FILL gr_color;                  /* color fill use gradient */
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun     line_draw_t line_draw_info;
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun     FADING fading;
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun     uint8_t PD_mode;                      /* porter duff alpha mode sel */
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun     uint8_t alpha_global_value;           /* global alpha value */
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun     uint16_t rop_code;                    /* rop2/3/4 code  scan from rop code table*/
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun     uint8_t bsfilter_flag;                /* [2] 0 blur 1 sharp / [1:0] filter_type*/
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun     uint8_t palette_mode;                 /* (enum) color palatte  0/1bpp, 1/2bpp 2/4bpp 3/8bpp*/
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun     uint8_t yuv2rgb_mode;                 /* (enum) BT.601 MPEG / BT.601 JPEG / BT.709  */
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun     uint8_t endian_mode;                  /* 0/big endian 1/little endian*/
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun     uint8_t rotate_mode;                  /* (enum) rotate mode  */
533*4882a593Smuzhiyun                                           /* 0x0,     no rotate  */
534*4882a593Smuzhiyun                                           /* 0x1,     rotate     */
535*4882a593Smuzhiyun                                           /* 0x2,     x_mirror   */
536*4882a593Smuzhiyun                                           /* 0x3,     y_mirror   */
537*4882a593Smuzhiyun 
538*4882a593Smuzhiyun     uint8_t color_fill_mode;              /* 0 solid color / 1 patten color */
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun     MMU mmu_info;                         /* mmu information */
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun     uint8_t  alpha_rop_mode;              /* ([0~1] alpha mode)       */
543*4882a593Smuzhiyun                                           /* ([2~3] rop   mode)       */
544*4882a593Smuzhiyun                                           /* ([4]   zero  mode en)    */
545*4882a593Smuzhiyun                                           /* ([5]   dst   alpha mode) (RGA1) */
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun     uint8_t  src_trans_mode;
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun     uint8_t  dither_mode;
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun     full_csc_t full_csc;                  /* full color space convert */
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun     int32_t in_fence_fd;
554*4882a593Smuzhiyun     uint8_t core;
555*4882a593Smuzhiyun     uint8_t priority;
556*4882a593Smuzhiyun     int32_t out_fence_fd;
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun     uint8_t handle_flag;
559*4882a593Smuzhiyun 
560*4882a593Smuzhiyun     /* RGA2 1106 add */
561*4882a593Smuzhiyun     struct rga_mosaic_info mosaic_info;
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun     uint8_t uvhds_mode;
564*4882a593Smuzhiyun     uint8_t uvvds_mode;
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun     struct rga_osd_info osd_info;
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun     struct rga_pre_intr_info pre_intr_info;
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun     uint8_t reservr[59];
571*4882a593Smuzhiyun };
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun struct rga_user_ctx_t {
574*4882a593Smuzhiyun     uint64_t cmd_ptr;
575*4882a593Smuzhiyun     uint32_t cmd_num;
576*4882a593Smuzhiyun     uint32_t id;
577*4882a593Smuzhiyun     uint32_t sync_mode;
578*4882a593Smuzhiyun     uint32_t out_fence_fd;
579*4882a593Smuzhiyun 
580*4882a593Smuzhiyun     uint32_t mpi_config_flags;
581*4882a593Smuzhiyun 
582*4882a593Smuzhiyun     uint8_t reservr[124];
583*4882a593Smuzhiyun };
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun #ifdef __cplusplus
586*4882a593Smuzhiyun }
587*4882a593Smuzhiyun #endif
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun #endif /*_RK29_IPP_DRIVER_H_*/
590