xref: /OK3568_Linux_fs/kernel/drivers/video/rockchip/rga/rga.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _RGA_DRIVER_H_
3*4882a593Smuzhiyun #define _RGA_DRIVER_H_
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/mutex.h>
6*4882a593Smuzhiyun #include <linux/scatterlist.h>
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #define RGA_BLIT_SYNC	0x5017
10*4882a593Smuzhiyun #define RGA_BLIT_ASYNC  0x5018
11*4882a593Smuzhiyun #define RGA_FLUSH       0x5019
12*4882a593Smuzhiyun #define RGA_GET_RESULT  0x501a
13*4882a593Smuzhiyun #define RGA_GET_VERSION 0x501b
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #define RGA_REG_CTRL_LEN    0x8    /* 8  */
17*4882a593Smuzhiyun #define RGA_REG_CMD_LEN     0x20   /* 32 */
18*4882a593Smuzhiyun #define RGA_CMD_BUF_SIZE    0x700  /* 16*28*4 */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define RGA_OUT_OF_RESOURCES    -10
21*4882a593Smuzhiyun #define RGA_MALLOC_ERROR        -11
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define RGA_BUF_GEM_TYPE_MASK	0xC0
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define rgaIS_ERROR(status)			(status < 0)
26*4882a593Smuzhiyun #define rgaNO_ERROR(status)			(status >= 0)
27*4882a593Smuzhiyun #define rgaIS_SUCCESS(status)		(status == 0)
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #define RGA_DEBUGFS 1
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun /* RGA process mode enum */
32*4882a593Smuzhiyun enum
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun     bitblt_mode               = 0x0,
35*4882a593Smuzhiyun     color_palette_mode        = 0x1,
36*4882a593Smuzhiyun     color_fill_mode           = 0x2,
37*4882a593Smuzhiyun     line_point_drawing_mode   = 0x3,
38*4882a593Smuzhiyun     blur_sharp_filter_mode    = 0x4,
39*4882a593Smuzhiyun     pre_scaling_mode          = 0x5,
40*4882a593Smuzhiyun     update_palette_table_mode = 0x6,
41*4882a593Smuzhiyun     update_patten_buff_mode   = 0x7,
42*4882a593Smuzhiyun };
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun enum
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun     rop_enable_mask          = 0x2,
48*4882a593Smuzhiyun     dither_enable_mask       = 0x8,
49*4882a593Smuzhiyun     fading_enable_mask       = 0x10,
50*4882a593Smuzhiyun     PD_enbale_mask           = 0x20,
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun enum
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun     yuv2rgb_mode0            = 0x0,     /* BT.601 MPEG */
56*4882a593Smuzhiyun     yuv2rgb_mode1            = 0x1,     /* BT.601 JPEG */
57*4882a593Smuzhiyun     yuv2rgb_mode2            = 0x2,     /* BT.709      */
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /* RGA rotate mode */
62*4882a593Smuzhiyun enum
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun     rotate_mode0             = 0x0,     /* no rotate */
65*4882a593Smuzhiyun     rotate_mode1             = 0x1,     /* rotate    */
66*4882a593Smuzhiyun     rotate_mode2             = 0x2,     /* x_mirror  */
67*4882a593Smuzhiyun     rotate_mode3             = 0x3,     /* y_mirror  */
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun enum
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun     color_palette_mode0      = 0x0,     /* 1K */
73*4882a593Smuzhiyun     color_palette_mode1      = 0x1,     /* 2K */
74*4882a593Smuzhiyun     color_palette_mode2      = 0x2,     /* 4K */
75*4882a593Smuzhiyun     color_palette_mode3      = 0x3,     /* 8K */
76*4882a593Smuzhiyun };
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /*
81*4882a593Smuzhiyun //          Alpha    Red     Green   Blue
82*4882a593Smuzhiyun {  4, 32, {{32,24,   8, 0,  16, 8,  24,16 }}, GGL_RGBA },   // RK_FORMAT_RGBA_8888
83*4882a593Smuzhiyun {  4, 24, {{ 0, 0,   8, 0,  16, 8,  24,16 }}, GGL_RGB  },   // RK_FORMAT_RGBX_8888
84*4882a593Smuzhiyun {  3, 24, {{ 0, 0,   8, 0,  16, 8,  24,16 }}, GGL_RGB  },   // RK_FORMAT_RGB_888
85*4882a593Smuzhiyun {  4, 32, {{32,24,  24,16,  16, 8,   8, 0 }}, GGL_BGRA },   // RK_FORMAT_BGRA_8888
86*4882a593Smuzhiyun {  2, 16, {{ 0, 0,  16,11,  11, 5,   5, 0 }}, GGL_RGB  },   // RK_FORMAT_RGB_565
87*4882a593Smuzhiyun {  2, 16, {{ 1, 0,  16,11,  11, 6,   6, 1 }}, GGL_RGBA },   // RK_FORMAT_RGBA_5551
88*4882a593Smuzhiyun {  2, 16, {{ 4, 0,  16,12,  12, 8,   8, 4 }}, GGL_RGBA },   // RK_FORMAT_RGBA_4444
89*4882a593Smuzhiyun {  3, 24, {{ 0, 0,  24,16,  16, 8,   8, 0 }}, GGL_BGR  },   // RK_FORMAT_BGB_888
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun */
92*4882a593Smuzhiyun enum
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun 	RK_FORMAT_RGBA_8888    = 0x0,
95*4882a593Smuzhiyun     RK_FORMAT_RGBX_8888    = 0x1,
96*4882a593Smuzhiyun     RK_FORMAT_RGB_888      = 0x2,
97*4882a593Smuzhiyun     RK_FORMAT_BGRA_8888    = 0x3,
98*4882a593Smuzhiyun     RK_FORMAT_RGB_565      = 0x4,
99*4882a593Smuzhiyun     RK_FORMAT_RGBA_5551    = 0x5,
100*4882a593Smuzhiyun     RK_FORMAT_RGBA_4444    = 0x6,
101*4882a593Smuzhiyun     RK_FORMAT_BGR_888      = 0x7,
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun     RK_FORMAT_YCbCr_422_SP = 0x8,
104*4882a593Smuzhiyun     RK_FORMAT_YCbCr_422_P  = 0x9,
105*4882a593Smuzhiyun     RK_FORMAT_YCbCr_420_SP = 0xa,
106*4882a593Smuzhiyun     RK_FORMAT_YCbCr_420_P  = 0xb,
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun     RK_FORMAT_YCrCb_422_SP = 0xc,
109*4882a593Smuzhiyun     RK_FORMAT_YCrCb_422_P  = 0xd,
110*4882a593Smuzhiyun     RK_FORMAT_YCrCb_420_SP = 0xe,
111*4882a593Smuzhiyun     RK_FORMAT_YCrCb_420_P  = 0xf,
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun     RK_FORMAT_BPP1         = 0x10,
114*4882a593Smuzhiyun     RK_FORMAT_BPP2         = 0x11,
115*4882a593Smuzhiyun     RK_FORMAT_BPP4         = 0x12,
116*4882a593Smuzhiyun     RK_FORMAT_BPP8         = 0x13,
117*4882a593Smuzhiyun     RK_FORMAT_YCbCr_420_SP_10B = 0x20,
118*4882a593Smuzhiyun     RK_FORMAT_YCrCb_420_SP_10B = 0x21,
119*4882a593Smuzhiyun };
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun typedef struct rga_img_info_t
123*4882a593Smuzhiyun {
124*4882a593Smuzhiyun     unsigned long yrgb_addr;      /* yrgb    mem addr         */
125*4882a593Smuzhiyun     unsigned long uv_addr;        /* cb/cr   mem addr         */
126*4882a593Smuzhiyun     unsigned long v_addr;         /* cr      mem addr         */
127*4882a593Smuzhiyun     unsigned int format;         //definition by RK_FORMAT
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun     unsigned short act_w;
130*4882a593Smuzhiyun     unsigned short act_h;
131*4882a593Smuzhiyun     unsigned short x_offset;
132*4882a593Smuzhiyun     unsigned short y_offset;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun     unsigned short vir_w;
135*4882a593Smuzhiyun     unsigned short vir_h;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun     unsigned short endian_mode; //for BPP
138*4882a593Smuzhiyun     unsigned short alpha_swap;
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun rga_img_info_t;
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun typedef struct mdp_img_act
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun     unsigned short w;         // width
146*4882a593Smuzhiyun     unsigned short h;         // height
147*4882a593Smuzhiyun     short x_off;     // x offset for the vir
148*4882a593Smuzhiyun     short y_off;     // y offset for the vir
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun mdp_img_act;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun typedef struct RANGE
155*4882a593Smuzhiyun {
156*4882a593Smuzhiyun     unsigned short min;
157*4882a593Smuzhiyun     unsigned short max;
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun RANGE;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun typedef struct POINT
162*4882a593Smuzhiyun {
163*4882a593Smuzhiyun     unsigned short x;
164*4882a593Smuzhiyun     unsigned short y;
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun POINT;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun typedef struct RECT
169*4882a593Smuzhiyun {
170*4882a593Smuzhiyun     unsigned short xmin;
171*4882a593Smuzhiyun     unsigned short xmax; // width - 1
172*4882a593Smuzhiyun     unsigned short ymin;
173*4882a593Smuzhiyun     unsigned short ymax; // height - 1
174*4882a593Smuzhiyun } RECT;
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun typedef struct RGB
177*4882a593Smuzhiyun {
178*4882a593Smuzhiyun     unsigned char r;
179*4882a593Smuzhiyun     unsigned char g;
180*4882a593Smuzhiyun     unsigned char b;
181*4882a593Smuzhiyun     unsigned char res;
182*4882a593Smuzhiyun }RGB;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun typedef struct MMU
186*4882a593Smuzhiyun {
187*4882a593Smuzhiyun     unsigned char mmu_en;
188*4882a593Smuzhiyun     unsigned long base_addr;
189*4882a593Smuzhiyun 	uint32_t mmu_flag;
190*4882a593Smuzhiyun } MMU;
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun typedef struct COLOR_FILL
196*4882a593Smuzhiyun {
197*4882a593Smuzhiyun     short gr_x_a;
198*4882a593Smuzhiyun     short gr_y_a;
199*4882a593Smuzhiyun     short gr_x_b;
200*4882a593Smuzhiyun     short gr_y_b;
201*4882a593Smuzhiyun     short gr_x_g;
202*4882a593Smuzhiyun     short gr_y_g;
203*4882a593Smuzhiyun     short gr_x_r;
204*4882a593Smuzhiyun     short gr_y_r;
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun     //u8  cp_gr_saturation;
207*4882a593Smuzhiyun }
208*4882a593Smuzhiyun COLOR_FILL;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun typedef struct FADING
211*4882a593Smuzhiyun {
212*4882a593Smuzhiyun     uint8_t b;
213*4882a593Smuzhiyun     uint8_t g;
214*4882a593Smuzhiyun     uint8_t r;
215*4882a593Smuzhiyun     uint8_t res;
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun FADING;
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun typedef struct line_draw_t
221*4882a593Smuzhiyun {
222*4882a593Smuzhiyun     POINT start_point;              /* LineDraw_start_point                */
223*4882a593Smuzhiyun     POINT end_point;                /* LineDraw_end_point                  */
224*4882a593Smuzhiyun     uint32_t   color;               /* LineDraw_color                      */
225*4882a593Smuzhiyun     uint32_t   flag;                /* (enum) LineDrawing mode sel         */
226*4882a593Smuzhiyun     uint32_t   line_width;          /* range 1~16 */
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun line_draw_t;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun struct rga_req {
233*4882a593Smuzhiyun     uint8_t render_mode;            /* (enum) process mode sel */
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun     rga_img_info_t src;             /* src image info */
236*4882a593Smuzhiyun     rga_img_info_t dst;             /* dst image info */
237*4882a593Smuzhiyun     rga_img_info_t pat;             /* patten image info */
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun     unsigned long rop_mask_addr;         /* rop4 mask addr */
240*4882a593Smuzhiyun     unsigned long LUT_addr;              /* LUT addr */
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun     RECT clip;                      /* dst clip window default value is dst_vir */
243*4882a593Smuzhiyun                                     /* value from [0, w-1] / [0, h-1]*/
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun     int32_t sina;                   /* dst angle  default value 0  16.16 scan from table */
246*4882a593Smuzhiyun     int32_t cosa;                   /* dst angle  default value 0  16.16 scan from table */
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun     uint16_t alpha_rop_flag;        /* alpha rop process flag           */
249*4882a593Smuzhiyun                                     /* ([0] = 1 alpha_rop_enable)       */
250*4882a593Smuzhiyun                                     /* ([1] = 1 rop enable)             */
251*4882a593Smuzhiyun                                     /* ([2] = 1 fading_enable)          */
252*4882a593Smuzhiyun                                     /* ([3] = 1 PD_enable)              */
253*4882a593Smuzhiyun                                     /* ([4] = 1 alpha cal_mode_sel)     */
254*4882a593Smuzhiyun                                     /* ([5] = 1 dither_enable)          */
255*4882a593Smuzhiyun                                     /* ([6] = 1 gradient fill mode sel) */
256*4882a593Smuzhiyun                                     /* ([7] = 1 AA_enable)              */
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun     uint8_t  scale_mode;            /* 0 nearst / 1 bilnear / 2 bicubic */
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun     uint32_t color_key_max;         /* color key max */
261*4882a593Smuzhiyun     uint32_t color_key_min;         /* color key min */
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun     uint32_t fg_color;              /* foreground color */
264*4882a593Smuzhiyun     uint32_t bg_color;              /* background color */
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun     COLOR_FILL gr_color;            /* color fill use gradient */
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun     line_draw_t line_draw_info;
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun     FADING fading;
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun     uint8_t PD_mode;                /* porter duff alpha mode sel */
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun     uint8_t alpha_global_value;     /* global alpha value */
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun     uint16_t rop_code;              /* rop2/3/4 code  scan from rop code table*/
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun     uint8_t bsfilter_flag;          /* [2] 0 blur 1 sharp / [1:0] filter_type*/
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun     uint8_t palette_mode;           /* (enum) color palatte  0/1bpp, 1/2bpp 2/4bpp 3/8bpp*/
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun     uint8_t yuv2rgb_mode;           /* (enum) BT.601 MPEG / BT.601 JPEG / BT.709  */
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun     uint8_t endian_mode;            /* 0/big endian 1/little endian*/
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun     uint8_t rotate_mode;            /* (enum) rotate mode  */
287*4882a593Smuzhiyun                                     /* 0x0,     no rotate  */
288*4882a593Smuzhiyun                                     /* 0x1,     rotate     */
289*4882a593Smuzhiyun                                     /* 0x2,     x_mirror   */
290*4882a593Smuzhiyun                                     /* 0x3,     y_mirror   */
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun     uint8_t color_fill_mode;        /* 0 solid color / 1 patten color */
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun     MMU mmu_info;                   /* mmu information */
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun     uint8_t  alpha_rop_mode;        /* ([0~1] alpha mode)       */
297*4882a593Smuzhiyun                                     /* ([2~3] rop   mode)       */
298*4882a593Smuzhiyun                                     /* ([4]   zero  mode en)    */
299*4882a593Smuzhiyun                                     /* ([5]   dst   alpha mode) */
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun     uint8_t  src_trans_mode;
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun     struct sg_table *sg_src;
304*4882a593Smuzhiyun 	struct sg_table *sg_dst;
305*4882a593Smuzhiyun 	struct dma_buf_attachment *attach_src;
306*4882a593Smuzhiyun 	struct dma_buf_attachment *attach_dst;
307*4882a593Smuzhiyun };
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun typedef struct TILE_INFO
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun     int64_t matrix[4];
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun     uint16_t tile_x_num;     /* x axis tile num / tile size is 8x8 pixel */
315*4882a593Smuzhiyun     uint16_t tile_y_num;     /* y axis tile num */
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun     int16_t dst_x_tmp;      /* dst pos x = (xstart - xoff) default value 0 */
318*4882a593Smuzhiyun     int16_t dst_y_tmp;      /* dst pos y = (ystart - yoff) default value 0 */
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun     uint16_t tile_w;
321*4882a593Smuzhiyun     uint16_t tile_h;
322*4882a593Smuzhiyun     int16_t tile_start_x_coor;
323*4882a593Smuzhiyun     int16_t tile_start_y_coor;
324*4882a593Smuzhiyun     int32_t tile_xoff;
325*4882a593Smuzhiyun     int32_t tile_yoff;
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun     int32_t tile_temp_xstart;
328*4882a593Smuzhiyun     int32_t tile_temp_ystart;
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun     /* src tile incr */
331*4882a593Smuzhiyun     int32_t x_dx;
332*4882a593Smuzhiyun     int32_t x_dy;
333*4882a593Smuzhiyun     int32_t y_dx;
334*4882a593Smuzhiyun     int32_t y_dy;
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun     mdp_img_act dst_ctrl;
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun TILE_INFO;
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun struct rga_mmu_buf_t {
342*4882a593Smuzhiyun     int32_t front;
343*4882a593Smuzhiyun     int32_t back;
344*4882a593Smuzhiyun     int32_t size;
345*4882a593Smuzhiyun     int32_t curr;
346*4882a593Smuzhiyun     unsigned int *buf;
347*4882a593Smuzhiyun     unsigned int *buf_virtual;
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun     struct page **pages;
350*4882a593Smuzhiyun };
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun /**
353*4882a593Smuzhiyun  * struct for process session which connect to rga
354*4882a593Smuzhiyun  *
355*4882a593Smuzhiyun  * @author ZhangShengqin (2012-2-15)
356*4882a593Smuzhiyun  */
357*4882a593Smuzhiyun typedef struct rga_session {
358*4882a593Smuzhiyun 	/* a linked list of data so we can access them for debugging */
359*4882a593Smuzhiyun 	struct list_head    list_session;
360*4882a593Smuzhiyun 	/* a linked list of register data waiting for process */
361*4882a593Smuzhiyun 	struct list_head    waiting;
362*4882a593Smuzhiyun 	/* a linked list of register data in processing */
363*4882a593Smuzhiyun 	struct list_head    running;
364*4882a593Smuzhiyun 	/* all coommand this thread done */
365*4882a593Smuzhiyun     atomic_t            done;
366*4882a593Smuzhiyun 	wait_queue_head_t   wait;
367*4882a593Smuzhiyun 	pid_t           pid;
368*4882a593Smuzhiyun 	atomic_t        task_running;
369*4882a593Smuzhiyun     atomic_t        num_done;
370*4882a593Smuzhiyun } rga_session;
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun struct rga_reg {
373*4882a593Smuzhiyun     rga_session 		*session;
374*4882a593Smuzhiyun 	struct list_head	session_link;		/* link to rga service session */
375*4882a593Smuzhiyun 	struct list_head	status_link;		/* link to register set list */
376*4882a593Smuzhiyun 	uint32_t  sys_reg[RGA_REG_CTRL_LEN];
377*4882a593Smuzhiyun     uint32_t  cmd_reg[RGA_REG_CMD_LEN];
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun     uint32_t *MMU_base;
380*4882a593Smuzhiyun     uint32_t MMU_len;
381*4882a593Smuzhiyun     //atomic_t int_enable;
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun     //struct rga_req      req;
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 	struct sg_table *sg_src;
386*4882a593Smuzhiyun 	struct sg_table *sg_dst;
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 	struct dma_buf_attachment *attach_src;
389*4882a593Smuzhiyun 	struct dma_buf_attachment *attach_dst;
390*4882a593Smuzhiyun };
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun typedef struct rga_service_info {
395*4882a593Smuzhiyun     struct mutex	lock;
396*4882a593Smuzhiyun     struct timer_list	timer;			/* timer for power off */
397*4882a593Smuzhiyun     struct list_head	waiting;		/* link to link_reg in struct vpu_reg */
398*4882a593Smuzhiyun     struct list_head	running;		/* link to link_reg in struct vpu_reg */
399*4882a593Smuzhiyun     struct list_head	done;			/* link to link_reg in struct vpu_reg */
400*4882a593Smuzhiyun     struct list_head	session;		/* link to list_session in struct vpu_session */
401*4882a593Smuzhiyun     atomic_t		total_running;
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun     struct rga_reg        *reg;
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun     uint32_t            cmd_buff[28*8];/* cmd_buff for rga */
406*4882a593Smuzhiyun     uint32_t            *pre_scale_buf;
407*4882a593Smuzhiyun 	atomic_t            int_disable;     /* 0 int enable 1 int disable  */
408*4882a593Smuzhiyun     atomic_t            cmd_num;
409*4882a593Smuzhiyun 	atomic_t src_format_swt;
410*4882a593Smuzhiyun 	int last_prc_src_format;
411*4882a593Smuzhiyun 	atomic_t            rga_working;
412*4882a593Smuzhiyun     bool                enable;
413*4882a593Smuzhiyun 	u32 dev_mode;
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun     //struct rga_req      req[10];
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun     struct mutex	mutex;	// mutex
418*4882a593Smuzhiyun } rga_service_info;
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun #if defined(CONFIG_ARCH_RK2928) || defined(CONFIG_ARCH_RK3026) || defined(CONFIG_ARCH_RK312x)
423*4882a593Smuzhiyun #define RGA_BASE                 0x1010c000
424*4882a593Smuzhiyun #elif defined(CONFIG_ARCH_RK30)
425*4882a593Smuzhiyun #define RGA_BASE                 0x10114000
426*4882a593Smuzhiyun #endif
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun //General Registers
429*4882a593Smuzhiyun #define RGA_SYS_CTRL             0x000
430*4882a593Smuzhiyun #define RGA_CMD_CTRL             0x004
431*4882a593Smuzhiyun #define RGA_CMD_ADDR             0x008
432*4882a593Smuzhiyun #define RGA_STATUS               0x00c
433*4882a593Smuzhiyun #define RGA_INT                  0x010
434*4882a593Smuzhiyun #define RGA_AXI_ID               0x014
435*4882a593Smuzhiyun #define RGA_MMU_STA_CTRL         0x018
436*4882a593Smuzhiyun #define RGA_MMU_STA              0x01c
437*4882a593Smuzhiyun #define RGA_VERSION              0x028
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun //Command code start
440*4882a593Smuzhiyun #define RGA_MODE_CTRL            0x100
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun //Source Image Registers
443*4882a593Smuzhiyun #define RGA_SRC_Y_MST            0x104
444*4882a593Smuzhiyun #define RGA_SRC_CB_MST           0x108
445*4882a593Smuzhiyun #define RGA_MASK_READ_MST        0x108  //repeat
446*4882a593Smuzhiyun #define RGA_SRC_CR_MST           0x10c
447*4882a593Smuzhiyun #define RGA_SRC_VIR_INFO         0x110
448*4882a593Smuzhiyun #define RGA_SRC_ACT_INFO         0x114
449*4882a593Smuzhiyun #define RGA_SRC_X_PARA           0x118
450*4882a593Smuzhiyun #define RGA_SRC_Y_PARA           0x11c
451*4882a593Smuzhiyun #define RGA_SRC_TILE_XINFO       0x120
452*4882a593Smuzhiyun #define RGA_SRC_TILE_YINFO       0x124
453*4882a593Smuzhiyun #define RGA_SRC_TILE_H_INCR      0x128
454*4882a593Smuzhiyun #define RGA_SRC_TILE_V_INCR      0x12c
455*4882a593Smuzhiyun #define RGA_SRC_TILE_OFFSETX     0x130
456*4882a593Smuzhiyun #define RGA_SRC_TILE_OFFSETY     0x134
457*4882a593Smuzhiyun #define RGA_SRC_BG_COLOR         0x138
458*4882a593Smuzhiyun #define RGA_SRC_FG_COLOR         0x13c
459*4882a593Smuzhiyun #define RGA_LINE_DRAWING_COLOR   0x13c  //repeat
460*4882a593Smuzhiyun #define RGA_SRC_TR_COLOR0        0x140
461*4882a593Smuzhiyun #define RGA_CP_GR_A              0x140  //repeat
462*4882a593Smuzhiyun #define RGA_SRC_TR_COLOR1        0x144
463*4882a593Smuzhiyun #define RGA_CP_GR_B              0x144  //repeat
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun #define RGA_LINE_DRAW            0x148
466*4882a593Smuzhiyun #define RGA_PAT_START_POINT      0x148  //repeat
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun //Destination Image Registers
469*4882a593Smuzhiyun #define RGA_DST_MST              0x14c
470*4882a593Smuzhiyun #define RGA_LUT_MST              0x14c  //repeat
471*4882a593Smuzhiyun #define RGA_PAT_MST              0x14c  //repeat
472*4882a593Smuzhiyun #define RGA_LINE_DRAWING_MST     0x14c  //repeat
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun #define RGA_DST_VIR_INFO         0x150
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun #define RGA_DST_CTR_INFO         0x154
477*4882a593Smuzhiyun #define RGA_LINE_DRAW_XY_INFO    0x154  //repeat
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun //Alpha/ROP Registers
480*4882a593Smuzhiyun #define RGA_ALPHA_CON            0x158
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun #define RGA_PAT_CON              0x15c
483*4882a593Smuzhiyun #define RGA_DST_VIR_WIDTH_PIX    0x15c  //repeat
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun #define RGA_ROP_CON0             0x160
486*4882a593Smuzhiyun #define RGA_CP_GR_G              0x160  //repeat
487*4882a593Smuzhiyun #define RGA_PRESCL_CB_MST        0x160  //repeat
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun #define RGA_ROP_CON1             0x164
490*4882a593Smuzhiyun #define RGA_CP_GR_R              0x164  //repeat
491*4882a593Smuzhiyun #define RGA_PRESCL_CR_MST        0x164  //repeat
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun //MMU Register
494*4882a593Smuzhiyun #define RGA_FADING_CON           0x168
495*4882a593Smuzhiyun #define RGA_MMU_CTRL             0x168  //repeat
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun #define RGA_MMU_TBL              0x16c  //repeat
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun #define RGA_YUV_OUT_CFG          0x170
500*4882a593Smuzhiyun #define RGA_DST_UV_MST           0x174
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun #define RGA_BLIT_COMPLETE_EVENT 1
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun long rga_ioctl_kernel(struct rga_req *req);
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun #endif /*_RK29_IPP_DRIVER_H_*/
508