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