1 #ifndef _RGA_DRIVER_H_
\r
2 #define _RGA_DRIVER_H_
\r
4 #include <linux/mutex.h>
\r
5 #include <linux/scatterlist.h>
\r
9 #define RGA_BLIT_SYNC 0x5017
\r
10 #define RGA_BLIT_ASYNC 0x5018
\r
11 #define RGA_FLUSH 0x5019
\r
12 #define RGA_GET_RESULT 0x501a
\r
13 #define RGA_GET_VERSION 0x501b
\r
15 #define RGA2_BLIT_SYNC 0x6017
\r
16 #define RGA2_BLIT_ASYNC 0x6018
\r
17 #define RGA2_FLUSH 0x6019
\r
18 #define RGA2_GET_RESULT 0x601a
\r
19 #define RGA2_GET_VERSION 0x601b
\r
22 #define RGA2_REG_CTRL_LEN 0x8 /* 8 */
\r
23 #define RGA2_REG_CMD_LEN 0x20 /* 32 */
\r
24 #define RGA2_CMD_BUF_SIZE 0x700 /* 16*28*4 */
\r
26 #define RGA2_OUT_OF_RESOURCES -10
\r
27 #define RGA2_MALLOC_ERROR -11
\r
29 #define SCALE_DOWN_LARGE 1
\r
31 #define rgaIS_ERROR(status) (status < 0)
\r
32 #define rgaNO_ERROR(status) (status >= 0)
\r
33 #define rgaIS_SUCCESS(status) (status == 0)
\r
35 /* RGA2 process mode enum */
\r
39 color_palette_mode = 0x1,
\r
40 color_fill_mode = 0x2,
\r
41 update_palette_table_mode = 0x3,
\r
42 update_patten_buff_mode = 0x4,
\r
49 }; //bitblt_mode select
\r
53 rop_enable_mask = 0x2,
\r
54 dither_enable_mask = 0x8,
\r
55 fading_enable_mask = 0x10,
\r
56 PD_enbale_mask = 0x20,
\r
62 // Alpha Red Green Blue
\r
63 { 4, 32, {{32,24, 8, 0, 16, 8, 24,16 }}, GGL_RGBA }, // RK_FORMAT_RGBA_8888
\r
64 { 4, 24, {{ 0, 0, 8, 0, 16, 8, 24,16 }}, GGL_RGB }, // RK_FORMAT_RGBX_8888
\r
65 { 3, 24, {{ 0, 0, 8, 0, 16, 8, 24,16 }}, GGL_RGB }, // RK_FORMAT_RGB_888
\r
66 { 4, 32, {{32,24, 24,16, 16, 8, 8, 0 }}, GGL_BGRA }, // RK_FORMAT_BGRA_8888
\r
67 { 2, 16, {{ 0, 0, 16,11, 11, 5, 5, 0 }}, GGL_RGB }, // RK_FORMAT_RGB_565
\r
68 { 2, 16, {{ 1, 0, 16,11, 11, 6, 6, 1 }}, GGL_RGBA }, // RK_FORMAT_RGBA_5551
\r
69 { 2, 16, {{ 4, 0, 16,12, 12, 8, 8, 4 }}, GGL_RGBA }, // RK_FORMAT_RGBA_4444
\r
70 { 2, 16, {{ 0, 0, 5, 0 11, 5, 16,11}}, GGL_BGR }, // RK_FORMAT_BGR_565
\r
71 { 2, 16, {{ 1, 0, 6, 1, 11, 6, 16,11}}, GGL_BGRA }, // RK_FORMAT_BGRA_5551
\r
72 { 2, 16, {{ 4, 0, 8, 4, 12, 8, 16,12}}, GGL_BGRA }, // RK_FORMAT_BGRA_4444
\r
77 RGA2_FORMAT_RGBA_8888 = 0x0,
\r
78 RGA2_FORMAT_RGBX_8888 = 0x1,
\r
79 RGA2_FORMAT_RGB_888 = 0x2,
\r
80 RGA2_FORMAT_BGRA_8888 = 0x3,
\r
81 RGA2_FORMAT_BGRX_8888 = 0x4,
\r
82 RGA2_FORMAT_BGR_888 = 0x5,
\r
83 RGA2_FORMAT_RGB_565 = 0x6,
\r
84 RGA2_FORMAT_RGBA_5551 = 0x7,
\r
85 RGA2_FORMAT_RGBA_4444 = 0x8,
\r
86 RGA2_FORMAT_BGR_565 = 0x9,
\r
87 RGA2_FORMAT_BGRA_5551 = 0xa,
\r
88 RGA2_FORMAT_BGRA_4444 = 0xb,
\r
90 RGA2_FORMAT_YCbCr_422_SP = 0x10,
\r
91 RGA2_FORMAT_YCbCr_422_P = 0x11,
\r
92 RGA2_FORMAT_YCbCr_420_SP = 0x12,
\r
93 RGA2_FORMAT_YCbCr_420_P = 0x13,
\r
94 RGA2_FORMAT_YCrCb_422_SP = 0x14,
\r
95 RGA2_FORMAT_YCrCb_422_P = 0x15,
\r
96 RGA2_FORMAT_YCrCb_420_SP = 0x16,
\r
97 RGA2_FORMAT_YCrCb_420_P = 0x17,
\r
100 typedef struct mdp_img
\r
109 typedef struct mdp_img_act
\r
111 u16 width; // width
\r
112 u16 height; // height
\r
113 s16 x_off; // x offset for the vir
\r
114 s16 y_off; // y offset for the vir
\r
120 typedef struct mdp_img_vir
\r
132 typedef struct MMU_INFO
\r
134 unsigned long src0_base_addr;
\r
135 unsigned long src1_base_addr;
\r
136 unsigned long dst_base_addr;
\r
137 unsigned long els_base_addr;
\r
139 u8 src0_mmu_flag; /* [0] src0 mmu enable [1] src0_flush [2] src0_prefetch_en [3] src0_prefetch dir */
\r
140 u8 src1_mmu_flag; /* [0] src1 mmu enable [1] src1_flush [2] src1_prefetch_en [3] src1_prefetch dir */
\r
141 u8 dst_mmu_flag; /* [0] dst mmu enable [1] dst_flush [2] dst_prefetch_en [3] dst_prefetch dir */
\r
142 u8 els_mmu_flag; /* [0] els mmu enable [1] els_flush [2] els_prefetch_en [3] els_prefetch dir */
\r
153 MMU_FLUSH_DIS = 0x0,
\r
163 MMU_PRE_DIR_FORW = 0x0,
\r
164 MMU_PRE_DIR_BACK = 0x8
\r
166 typedef struct COLOR_FILL
\r
181 ALPHA_ORIGINAL = 0x0,
\r
189 R2_MASKNOTPEN = 0x0a,
\r
191 R2_MASKPENNOT = 0x50,
\r
192 R2_MERGENOTPEN = 0xaf,
\r
193 R2_MERGEPEN = 0xfa,
\r
194 R2_MERGEPENNOT = 0xf5,
\r
197 R2_NOTCOPYPEN = 0x0f,
\r
198 R2_NOTMASKPEN = 0x5f,
\r
199 R2_NOTMERGEPEN = 0x05,
\r
200 R2_NOTXORPEN = 0xa5,
\r
206 /***************************************/
\r
207 /* porting from rga.h for msg convert */
\r
208 /***************************************/
\r
210 typedef struct FADING
\r
221 unsigned char mmu_en;
\r
222 unsigned long base_addr;
\r
223 uint32_t mmu_flag; /* [0] mmu enable [1] src_flush [2] dst_flush [3] CMD_flush [4~5] page size*/
\r
226 typedef struct MMU_32
\r
228 unsigned char mmu_en;
\r
229 uint32_t base_addr;
\r
230 uint32_t mmu_flag; /* [0] mmu enable [1] src_flush [2] dst_flush [3] CMD_flush [4~5] page size*/
\r
233 typedef struct RECT
\r
235 unsigned short xmin;
\r
236 unsigned short xmax; // width - 1
\r
237 unsigned short ymin;
\r
238 unsigned short ymax; // height - 1
\r
241 typedef struct POINT
\r
248 typedef struct line_draw_t
\r
250 POINT start_point; /* LineDraw_start_point */
\r
251 POINT end_point; /* LineDraw_end_point */
\r
252 uint32_t color; /* LineDraw_color */
\r
253 uint32_t flag; /* (enum) LineDrawing mode sel */
\r
254 uint32_t line_width; /* range 1~16 */
\r
258 typedef struct rga_img_info_t
\r
260 unsigned long yrgb_addr; /* yrgb mem addr */
\r
261 unsigned long uv_addr; /* cb/cr mem addr */
\r
262 unsigned long v_addr; /* cr mem addr */
\r
263 unsigned int format; //definition by RK_FORMAT
\r
265 unsigned short act_w;
\r
266 unsigned short act_h;
\r
267 unsigned short x_offset;
\r
268 unsigned short y_offset;
\r
270 unsigned short vir_w;
\r
271 unsigned short vir_h;
\r
273 unsigned short endian_mode; //for BPP
\r
274 unsigned short alpha_swap;
\r
277 typedef struct rga_img_info_32_t
\r
279 uint32_t yrgb_addr; /* yrgb mem addr */
\r
280 uint32_t uv_addr; /* cb/cr mem addr */
\r
281 uint32_t v_addr; /* cr mem addr */
\r
282 unsigned int format; //definition by RK_FORMAT
\r
283 unsigned short act_w;
\r
284 unsigned short act_h;
\r
285 unsigned short x_offset;
\r
286 unsigned short y_offset;
\r
287 unsigned short vir_w;
\r
288 unsigned short vir_h;
\r
289 unsigned short endian_mode; //for BPP
\r
290 unsigned short alpha_swap;
\r
295 uint8_t render_mode; /* (enum) process mode sel */
\r
297 rga_img_info_t src; /* src image info */
\r
298 rga_img_info_t dst; /* dst image info */
\r
299 rga_img_info_t pat; /* patten image info */
\r
301 unsigned long rop_mask_addr; /* rop4 mask addr */
\r
302 unsigned long LUT_addr; /* LUT addr */
\r
304 RECT clip; /* dst clip window default value is dst_vir */
\r
305 /* value from [0, w-1] / [0, h-1]*/
\r
307 int32_t sina; /* dst angle default value 0 16.16 scan from table */
\r
308 int32_t cosa; /* dst angle default value 0 16.16 scan from table */
\r
310 uint16_t alpha_rop_flag; /* alpha rop process flag */
\r
311 /* ([0] = 1 alpha_rop_enable) */
\r
312 /* ([1] = 1 rop enable) */
\r
313 /* ([2] = 1 fading_enable) */
\r
314 /* ([3] = 1 PD_enable) */
\r
315 /* ([4] = 1 alpha cal_mode_sel) */
\r
316 /* ([5] = 1 dither_enable) */
\r
317 /* ([6] = 1 gradient fill mode sel) */
\r
318 /* ([7] = 1 AA_enable) */
\r
320 uint8_t scale_mode; /* 0 nearst / 1 bilnear / 2 bicubic */
\r
322 uint32_t color_key_max; /* color key max */
\r
323 uint32_t color_key_min; /* color key min */
\r
325 uint32_t fg_color; /* foreground color */
\r
326 uint32_t bg_color; /* background color */
\r
328 COLOR_FILL gr_color; /* color fill use gradient */
\r
330 line_draw_t line_draw_info;
\r
334 uint8_t PD_mode; /* porter duff alpha mode sel */
\r
336 uint8_t alpha_global_value; /* global alpha value */
\r
338 uint16_t rop_code; /* rop2/3/4 code scan from rop code table*/
\r
340 uint8_t bsfilter_flag; /* [2] 0 blur 1 sharp / [1:0] filter_type*/
\r
342 uint8_t palette_mode; /* (enum) color palatte 0/1bpp, 1/2bpp 2/4bpp 3/8bpp*/
\r
344 uint8_t yuv2rgb_mode; /* (enum) BT.601 MPEG / BT.601 JPEG / BT.709 */
\r
346 uint8_t endian_mode; /* 0/big endian 1/little endian*/
\r
348 uint8_t rotate_mode; /* (enum) rotate mode */
\r
349 /* 0x0, no rotate */
\r
351 /* 0x2, x_mirror */
\r
352 /* 0x3, y_mirror */
\r
354 uint8_t color_fill_mode; /* 0 solid color / 1 patten color */
\r
356 MMU mmu_info; /* mmu information */
\r
358 uint8_t alpha_rop_mode; /* ([0~1] alpha mode) */
\r
359 /* ([2~3] rop mode) */
\r
360 /* ([4] zero mode en) */
\r
361 /* ([5] dst alpha mode) */
\r
362 /* ([6] alpha output mode sel) 0 src / 1 dst*/
\r
364 uint8_t src_trans_mode;
\r
368 uint8_t render_mode; /* (enum) process mode sel */
\r
369 rga_img_info_32_t src; /* src image info */
\r
370 rga_img_info_32_t dst; /* dst image info */
\r
371 rga_img_info_32_t pat; /* patten image info */
\r
372 uint32_t rop_mask_addr; /* rop4 mask addr */
\r
373 uint32_t LUT_addr; /* LUT addr */
\r
374 RECT clip; /* dst clip window default value is dst_vir */
\r
375 /* value from [0, w-1] / [0, h-1]*/
\r
376 int32_t sina; /* dst angle default value 0 16.16 scan from table */
\r
377 int32_t cosa; /* dst angle default value 0 16.16 scan from table */
\r
378 uint16_t alpha_rop_flag; /* alpha rop process flag */
\r
379 /* ([0] = 1 alpha_rop_enable) */
\r
380 /* ([1] = 1 rop enable) */
\r
381 /* ([2] = 1 fading_enable) */
\r
382 /* ([3] = 1 PD_enable) */
\r
383 /* ([4] = 1 alpha cal_mode_sel) */
\r
384 /* ([5] = 1 dither_enable) */
\r
385 /* ([6] = 1 gradient fill mode sel) */
\r
386 /* ([7] = 1 AA_enable) */
\r
387 uint8_t scale_mode; /* 0 nearst / 1 bilnear / 2 bicubic */
\r
388 uint32_t color_key_max; /* color key max */
\r
389 uint32_t color_key_min; /* color key min */
\r
390 uint32_t fg_color; /* foreground color */
\r
391 uint32_t bg_color; /* background color */
\r
392 COLOR_FILL gr_color; /* color fill use gradient */
\r
393 line_draw_t line_draw_info;
\r
395 uint8_t PD_mode; /* porter duff alpha mode sel */
\r
396 uint8_t alpha_global_value; /* global alpha value */
\r
397 uint16_t rop_code; /* rop2/3/4 code scan from rop code table*/
\r
398 uint8_t bsfilter_flag; /* [2] 0 blur 1 sharp / [1:0] filter_type*/
\r
399 uint8_t palette_mode; /* (enum) color palatte 0/1bpp, 1/2bpp 2/4bpp 3/8bpp*/
\r
400 uint8_t yuv2rgb_mode; /* (enum) BT.601 MPEG / BT.601 JPEG / BT.709 */
\r
401 uint8_t endian_mode; /* 0/big endian 1/little endian*/
\r
402 uint8_t rotate_mode; /* (enum) rotate mode */
\r
403 /* 0x0, no rotate */
\r
405 /* 0x2, x_mirror */
\r
406 /* 0x3, y_mirror */
\r
407 uint8_t color_fill_mode; /* 0 solid color / 1 patten color */
\r
408 MMU_32 mmu_info; /* mmu information */
\r
409 uint8_t alpha_rop_mode; /* ([0~1] alpha mode) */
\r
410 /* ([2~3] rop mode) */
\r
411 /* ([4] zero mode en) */
\r
412 /* ([5] dst alpha mode) */
\r
413 /* ([6] alpha output mode sel) 0 src / 1 dst*/
\r
414 uint8_t src_trans_mode;
\r
421 u8 render_mode; /* (enum) process mode sel */
\r
423 rga_img_info_t src; // src active window
\r
424 rga_img_info_t src1; // src1 active window
\r
425 rga_img_info_t dst; // dst active window
\r
426 rga_img_info_t pat; // patten active window
\r
428 unsigned long rop_mask_addr; // rop4 mask addr
\r
429 unsigned long LUT_addr; // LUT addr
\r
431 u32 rop_mask_stride;
\r
433 u8 bitblt_mode; /* 0: SRC + DST => DST */
\r
434 /* 1: SRC + SRC1 => DST */
\r
436 u8 rotate_mode; /* [1:0] */
\r
438 /* 90 degree 0x1 */
\r
439 /* 180 degree 0x2 */
\r
440 /* 270 degree 0x3 */
\r
445 /* x_mirror + y_mirror 0x3 */
\r
447 u16 alpha_rop_flag; /* alpha rop process flag */
\r
448 /* ([0] = 1 alpha_rop_enable) */
\r
449 /* ([1] = 1 rop enable) */
\r
450 /* ([2] = 1 fading_enable) */
\r
451 /* ([3] = 1 alpha cal_mode_sel) */
\r
452 /* ([4] = 1 src_dither_up_enable) */
\r
453 /* ([5] = 1 dst_dither_up_enable) */
\r
454 /* ([6] = 1 dither_down_enable) */
\r
455 /* ([7] = 1 gradient fill mode sel) */
\r
458 u16 alpha_mode_0; /* [0] SrcAlphaMode0 */
\r
459 /* [2:1] SrcGlobalAlphaMode0 */
\r
460 /* [3] SrcAlphaSelectMode0 */
\r
461 /* [6:4] SrcFactorMode0 */
\r
462 /* [7] SrcColorMode */
\r
464 /* [8] DstAlphaMode0 */
\r
465 /* [10:9] DstGlobalAlphaMode0 */
\r
466 /* [11] DstAlphaSelectMode0 */
\r
467 /* [14:12] DstFactorMode0 */
\r
468 /* [15] DstColorMode0 */
\r
470 u16 alpha_mode_1; /* [0] SrcAlphaMode1 */
\r
471 /* [2:1] SrcGlobalAlphaMode1 */
\r
472 /* [3] SrcAlphaSelectMode1 */
\r
473 /* [6:4] SrcFactorMode1 */
\r
475 /* [8] DstAlphaMode1 */
\r
476 /* [10:9] DstGlobalAlphaMode1 */
\r
477 /* [11] DstAlphaSelectMode1 */
\r
478 /* [14:12] DstFactorMode1 */
\r
480 u8 scale_bicu_mode; /* 0 1 2 3 */
\r
482 u32 color_key_max; /* color key max */
\r
483 u32 color_key_min; /* color key min */
\r
485 u32 fg_color; /* foreground color */
\r
486 u32 bg_color; /* background color */
\r
488 u8 color_fill_mode;
\r
489 COLOR_FILL gr_color; /* color fill use gradient */
\r
491 u8 fading_alpha_value; /* Fading value */
\r
496 u8 src_a_global_val; /* src global alpha value */
\r
497 u8 dst_a_global_val; /* dst global alpha value */
\r
501 u16 rop_code; /* rop2/3/4 code */
\r
503 u8 palette_mode; /* (enum) color palatte 0/1bpp, 1/2bpp 2/4bpp 3/8bpp*/
\r
505 u8 yuv2rgb_mode; /* (enum) BT.601 MPEG / BT.601 JPEG / BT.709 */
\r
507 u8 endian_mode; /* 0/little endian 1/big endian */
\r
509 u8 CMD_fin_int_enable;
\r
511 MMU_INFO mmu_info; /* mmu infomation */
\r
521 struct sg_table *sg_src0;
\r
522 struct sg_table *sg_src1;
\r
523 struct sg_table *sg_dst;
\r
524 struct sg_table *sg_els;
\r
527 struct rga2_mmu_buf_t {
\r
533 unsigned int *buf_virtual;
\r
535 struct page **pages;
\r
540 BB_ROTATE_OFF = 0x0, /* no rotate */
\r
541 BB_ROTATE_90 = 0x1, /* rotate 90 */
\r
542 BB_ROTATE_180 = 0x2, /* rotate 180 */
\r
543 BB_ROTATE_270 = 0x3, /* rotate 270 */
\r
548 BB_MIRROR_OFF = (0x0 << 4), /* no mirror */
\r
549 BB_MIRROR_X = (0x1 << 4), /* x mirror */
\r
550 BB_MIRROR_Y = (0x2 << 4), /* y mirror */
\r
551 BB_MIRROR_XY = (0x3 << 4), /* xy mirror */
\r
556 BB_COPY_USE_TILE = (0x1 << 6), /* bitblt mode copy but use Tile mode */
\r
562 BT_601_RANGE0 = 0x1,
\r
563 BT_601_RANGE1 = 0x2,
\r
564 BT_709_RANGE0 = 0x3,
\r
565 }; /*yuv2rgb_mode*/
\r
569 BPP1 = 0x0, /* BPP1 */
\r
570 BPP2 = 0x1, /* BPP2 */
\r
571 BPP4 = 0x2, /* BPP4 */
\r
572 BPP8 = 0x3 /* BPP8 */
\r
573 }; /*palette_mode*/
\r
577 SOLID_COLOR = 0x0, //color fill mode; ROP4: SOLID_rop4_mask_addr COLOR
\r
578 PATTERN_COLOR = 0x1 //pattern_fill_mode;ROP4:PATTERN_COLOR
\r
579 }; /*color fill mode*/
\r
583 COLOR_FILL_CLIP = 0x0,
\r
584 COLOR_FILL_NOT_CLIP = 0x1
\r
593 }; /*bicubic coefficient*/
\r
605 LITTLE_ENDIAN = 0x1
\r
610 MMU_TABLE_4KB = 0x0,
\r
611 MMU_TABLE_64KB = 0x1,
\r
612 }; /*MMU table size*/
\r
620 }; /*dither down mode*/
\r
625 * struct for process session which connect to rga
\r
627 * @author ZhangShengqin (2012-2-15)
\r
629 typedef struct rga2_session {
\r
630 /* a linked list of data so we can access them for debugging */
\r
631 struct list_head list_session;
\r
632 /* a linked list of register data waiting for process */
\r
633 struct list_head waiting;
\r
634 /* a linked list of register data in processing */
\r
635 struct list_head running;
\r
636 /* all coommand this thread done */
\r
638 wait_queue_head_t wait;
\r
640 atomic_t task_running;
\r
645 rga2_session *session;
\r
646 struct list_head session_link; /* link to rga service session */
\r
647 struct list_head status_link; /* link to register set list */
\r
648 uint32_t sys_reg[8];
\r
649 uint32_t cmd_reg[32];
\r
651 uint32_t *MMU_base;
\r
653 //atomic_t int_enable;
\r
655 //struct rga_req req;
\r
660 struct rga2_service_info {
\r
662 struct timer_list timer; /* timer for power off */
\r
663 struct list_head waiting; /* link to link_reg in struct vpu_reg */
\r
664 struct list_head running; /* link to link_reg in struct vpu_reg */
\r
665 struct list_head done; /* link to link_reg in struct vpu_reg */
\r
666 struct list_head session; /* link to list_session in struct vpu_session */
\r
667 atomic_t total_running;
\r
669 struct rga2_reg *reg;
\r
671 uint32_t cmd_buff[32*8];/* cmd_buff for rga */
\r
672 uint32_t *pre_scale_buf;
\r
673 atomic_t int_disable; /* 0 int enable 1 int disable */
\r
675 atomic_t src_format_swt;
\r
676 int last_prc_src_format;
\r
677 atomic_t rga_working;
\r
680 //struct rga_req req[10];
\r
682 struct mutex mutex; // mutex
\r
685 #define RGA2_TEST_CASE 0
\r
686 #define RGA2_TEST 0
\r
687 #define RGA2_TEST_MSG 0
\r
688 #define RGA2_TEST_TIME 0
\r
690 //General Registers
\r
691 #define RGA2_SYS_CTRL 0x000
\r
692 #define RGA2_CMD_CTRL 0x004
\r
693 #define RGA2_CMD_BASE 0x008
\r
694 #define RGA2_STATUS 0x00c
\r
695 #define RGA2_INT 0x010
\r
696 #define RGA2_MMU_CTRL0 0x018
\r
697 #define RGA2_MMU_CMD_BASE 0x01c
\r
699 //Command code start
\r
700 #define RGA2_MODE_CTRL 0x100
\r
701 #define RGA_BLIT_COMPLETE_EVENT 1
\r
703 #endif /*_RK29_IPP_DRIVER_H_*/
\r