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