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