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
98 RGA2_FORMAT_YCbCr_420_SP_10B = 0x20,
\r
99 RGA2_FORMAT_YCrCb_420_SP_10B = 0x21,
\r
100 RGA2_FORMAT_YCbCr_422_SP_10B = 0x22,
\r
101 RGA2_FORMAT_YCrCb_422_SP_10B = 0x23,
\r
104 typedef struct mdp_img
\r
113 typedef struct mdp_img_act
\r
115 u16 width; // width
\r
116 u16 height; // height
\r
117 s16 x_off; // x offset for the vir
\r
118 s16 y_off; // y offset for the vir
\r
124 typedef struct mdp_img_vir
\r
136 typedef struct MMU_INFO
\r
138 unsigned long src0_base_addr;
\r
139 unsigned long src1_base_addr;
\r
140 unsigned long dst_base_addr;
\r
141 unsigned long els_base_addr;
\r
143 u8 src0_mmu_flag; /* [0] src0 mmu enable [1] src0_flush [2] src0_prefetch_en [3] src0_prefetch dir */
\r
144 u8 src1_mmu_flag; /* [0] src1 mmu enable [1] src1_flush [2] src1_prefetch_en [3] src1_prefetch dir */
\r
145 u8 dst_mmu_flag; /* [0] dst mmu enable [1] dst_flush [2] dst_prefetch_en [3] dst_prefetch dir */
\r
146 u8 els_mmu_flag; /* [0] els mmu enable [1] els_flush [2] els_prefetch_en [3] els_prefetch dir */
\r
157 MMU_FLUSH_DIS = 0x0,
\r
167 MMU_PRE_DIR_FORW = 0x0,
\r
168 MMU_PRE_DIR_BACK = 0x8
\r
170 typedef struct COLOR_FILL
\r
185 ALPHA_ORIGINAL = 0x0,
\r
193 R2_MASKNOTPEN = 0x0a,
\r
195 R2_MASKPENNOT = 0x50,
\r
196 R2_MERGENOTPEN = 0xaf,
\r
197 R2_MERGEPEN = 0xfa,
\r
198 R2_MERGEPENNOT = 0xf5,
\r
201 R2_NOTCOPYPEN = 0x0f,
\r
202 R2_NOTMASKPEN = 0x5f,
\r
203 R2_NOTMERGEPEN = 0x05,
\r
204 R2_NOTXORPEN = 0xa5,
\r
210 /***************************************/
\r
211 /* porting from rga.h for msg convert */
\r
212 /***************************************/
\r
214 typedef struct FADING
\r
225 unsigned char mmu_en;
\r
226 unsigned long base_addr;
\r
227 uint32_t mmu_flag; /* [0] mmu enable [1] src_flush [2] dst_flush [3] CMD_flush [4~5] page size*/
\r
230 typedef struct MMU_32
\r
232 unsigned char mmu_en;
\r
233 uint32_t base_addr;
\r
234 uint32_t mmu_flag; /* [0] mmu enable [1] src_flush [2] dst_flush [3] CMD_flush [4~5] page size*/
\r
237 typedef struct RECT
\r
239 unsigned short xmin;
\r
240 unsigned short xmax; // width - 1
\r
241 unsigned short ymin;
\r
242 unsigned short ymax; // height - 1
\r
245 typedef struct POINT
\r
252 typedef struct line_draw_t
\r
254 POINT start_point; /* LineDraw_start_point */
\r
255 POINT end_point; /* LineDraw_end_point */
\r
256 uint32_t color; /* LineDraw_color */
\r
257 uint32_t flag; /* (enum) LineDrawing mode sel */
\r
258 uint32_t line_width; /* range 1~16 */
\r
262 typedef struct rga_img_info_t
\r
264 unsigned long yrgb_addr; /* yrgb mem addr */
\r
265 unsigned long uv_addr; /* cb/cr mem addr */
\r
266 unsigned long v_addr; /* cr mem addr */
\r
267 unsigned int format; //definition by RK_FORMAT
\r
269 unsigned short act_w;
\r
270 unsigned short act_h;
\r
271 unsigned short x_offset;
\r
272 unsigned short y_offset;
\r
274 unsigned short vir_w;
\r
275 unsigned short vir_h;
\r
277 unsigned short endian_mode; //for BPP
\r
278 unsigned short alpha_swap;
\r
281 typedef struct rga_img_info_32_t
\r
283 uint32_t yrgb_addr; /* yrgb mem addr */
\r
284 uint32_t uv_addr; /* cb/cr mem addr */
\r
285 uint32_t v_addr; /* cr mem addr */
\r
286 unsigned int format; //definition by RK_FORMAT
\r
287 unsigned short act_w;
\r
288 unsigned short act_h;
\r
289 unsigned short x_offset;
\r
290 unsigned short y_offset;
\r
291 unsigned short vir_w;
\r
292 unsigned short vir_h;
\r
293 unsigned short endian_mode; //for BPP
\r
294 unsigned short alpha_swap;
\r
299 uint8_t render_mode; /* (enum) process mode sel */
\r
301 rga_img_info_t src; /* src image info */
\r
302 rga_img_info_t dst; /* dst image info */
\r
303 rga_img_info_t pat; /* patten image info */
\r
305 unsigned long rop_mask_addr; /* rop4 mask addr */
\r
306 unsigned long LUT_addr; /* LUT addr */
\r
308 RECT clip; /* dst clip window default value is dst_vir */
\r
309 /* value from [0, w-1] / [0, h-1]*/
\r
311 int32_t sina; /* dst angle default value 0 16.16 scan from table */
\r
312 int32_t cosa; /* dst angle default value 0 16.16 scan from table */
\r
314 uint16_t alpha_rop_flag; /* alpha rop process flag */
\r
315 /* ([0] = 1 alpha_rop_enable) */
\r
316 /* ([1] = 1 rop enable) */
\r
317 /* ([2] = 1 fading_enable) */
\r
318 /* ([3] = 1 PD_enable) */
\r
319 /* ([4] = 1 alpha cal_mode_sel) */
\r
320 /* ([5] = 1 dither_enable) */
\r
321 /* ([6] = 1 gradient fill mode sel) */
\r
322 /* ([7] = 1 AA_enable) */
\r
324 uint8_t scale_mode; /* 0 nearst / 1 bilnear / 2 bicubic */
\r
326 uint32_t color_key_max; /* color key max */
\r
327 uint32_t color_key_min; /* color key min */
\r
329 uint32_t fg_color; /* foreground color */
\r
330 uint32_t bg_color; /* background color */
\r
332 COLOR_FILL gr_color; /* color fill use gradient */
\r
334 line_draw_t line_draw_info;
\r
338 uint8_t PD_mode; /* porter duff alpha mode sel */
\r
340 uint8_t alpha_global_value; /* global alpha value */
\r
342 uint16_t rop_code; /* rop2/3/4 code scan from rop code table*/
\r
344 uint8_t bsfilter_flag; /* [2] 0 blur 1 sharp / [1:0] filter_type*/
\r
346 uint8_t palette_mode; /* (enum) color palatte 0/1bpp, 1/2bpp 2/4bpp 3/8bpp*/
\r
348 uint8_t yuv2rgb_mode; /* (enum) BT.601 MPEG / BT.601 JPEG / BT.709 */
\r
350 uint8_t endian_mode; /* 0/big endian 1/little endian*/
\r
352 uint8_t rotate_mode; /* (enum) rotate mode */
\r
353 /* 0x0, no rotate */
\r
355 /* 0x2, x_mirror */
\r
356 /* 0x3, y_mirror */
\r
358 uint8_t color_fill_mode; /* 0 solid color / 1 patten color */
\r
360 MMU mmu_info; /* mmu information */
\r
362 uint8_t alpha_rop_mode; /* ([0~1] alpha mode) */
\r
363 /* ([2~3] rop mode) */
\r
364 /* ([4] zero mode en) */
\r
365 /* ([5] dst alpha mode) */
\r
366 /* ([6] alpha output mode sel) 0 src / 1 dst*/
\r
368 uint8_t src_trans_mode;
\r
372 uint8_t render_mode; /* (enum) process mode sel */
\r
373 rga_img_info_32_t src; /* src image info */
\r
374 rga_img_info_32_t dst; /* dst image info */
\r
375 rga_img_info_32_t pat; /* patten image info */
\r
376 uint32_t rop_mask_addr; /* rop4 mask addr */
\r
377 uint32_t LUT_addr; /* LUT addr */
\r
378 RECT clip; /* dst clip window default value is dst_vir */
\r
379 /* value from [0, w-1] / [0, h-1]*/
\r
380 int32_t sina; /* dst angle default value 0 16.16 scan from table */
\r
381 int32_t cosa; /* dst angle default value 0 16.16 scan from table */
\r
382 uint16_t alpha_rop_flag; /* alpha rop process flag */
\r
383 /* ([0] = 1 alpha_rop_enable) */
\r
384 /* ([1] = 1 rop enable) */
\r
385 /* ([2] = 1 fading_enable) */
\r
386 /* ([3] = 1 PD_enable) */
\r
387 /* ([4] = 1 alpha cal_mode_sel) */
\r
388 /* ([5] = 1 dither_enable) */
\r
389 /* ([6] = 1 gradient fill mode sel) */
\r
390 /* ([7] = 1 AA_enable) */
\r
391 uint8_t scale_mode; /* 0 nearst / 1 bilnear / 2 bicubic */
\r
392 uint32_t color_key_max; /* color key max */
\r
393 uint32_t color_key_min; /* color key min */
\r
394 uint32_t fg_color; /* foreground color */
\r
395 uint32_t bg_color; /* background color */
\r
396 COLOR_FILL gr_color; /* color fill use gradient */
\r
397 line_draw_t line_draw_info;
\r
399 uint8_t PD_mode; /* porter duff alpha mode sel */
\r
400 uint8_t alpha_global_value; /* global alpha value */
\r
401 uint16_t rop_code; /* rop2/3/4 code scan from rop code table*/
\r
402 uint8_t bsfilter_flag; /* [2] 0 blur 1 sharp / [1:0] filter_type*/
\r
403 uint8_t palette_mode; /* (enum) color palatte 0/1bpp, 1/2bpp 2/4bpp 3/8bpp*/
\r
404 uint8_t yuv2rgb_mode; /* (enum) BT.601 MPEG / BT.601 JPEG / BT.709 */
\r
405 uint8_t endian_mode; /* 0/big endian 1/little endian*/
\r
406 uint8_t rotate_mode; /* (enum) rotate mode */
\r
407 /* 0x0, no rotate */
\r
409 /* 0x2, x_mirror */
\r
410 /* 0x3, y_mirror */
\r
411 uint8_t color_fill_mode; /* 0 solid color / 1 patten color */
\r
412 MMU_32 mmu_info; /* mmu information */
\r
413 uint8_t alpha_rop_mode; /* ([0~1] alpha mode) */
\r
414 /* ([2~3] rop mode) */
\r
415 /* ([4] zero mode en) */
\r
416 /* ([5] dst alpha mode) */
\r
417 /* ([6] alpha output mode sel) 0 src / 1 dst*/
\r
418 uint8_t src_trans_mode;
\r
425 u8 render_mode; /* (enum) process mode sel */
\r
427 rga_img_info_t src; // src active window
\r
428 rga_img_info_t src1; // src1 active window
\r
429 rga_img_info_t dst; // dst active window
\r
430 rga_img_info_t pat; // patten active window
\r
432 unsigned long rop_mask_addr; // rop4 mask addr
\r
433 unsigned long LUT_addr; // LUT addr
\r
435 u32 rop_mask_stride;
\r
437 u8 bitblt_mode; /* 0: SRC + DST => DST */
\r
438 /* 1: SRC + SRC1 => DST */
\r
440 u8 rotate_mode; /* [1:0] */
\r
442 /* 90 degree 0x1 */
\r
443 /* 180 degree 0x2 */
\r
444 /* 270 degree 0x3 */
\r
449 /* x_mirror + y_mirror 0x3 */
\r
451 u16 alpha_rop_flag; /* alpha rop process flag */
\r
452 /* ([0] = 1 alpha_rop_enable) */
\r
453 /* ([1] = 1 rop enable) */
\r
454 /* ([2] = 1 fading_enable) */
\r
455 /* ([3] = 1 alpha cal_mode_sel) */
\r
456 /* ([4] = 1 src_dither_up_enable) */
\r
457 /* ([5] = 1 dst_dither_up_enable) */
\r
458 /* ([6] = 1 dither_down_enable) */
\r
459 /* ([7] = 1 gradient fill mode sel) */
\r
462 u16 alpha_mode_0; /* [0] SrcAlphaMode0 */
\r
463 /* [2:1] SrcGlobalAlphaMode0 */
\r
464 /* [3] SrcAlphaSelectMode0 */
\r
465 /* [6:4] SrcFactorMode0 */
\r
466 /* [7] SrcColorMode */
\r
468 /* [8] DstAlphaMode0 */
\r
469 /* [10:9] DstGlobalAlphaMode0 */
\r
470 /* [11] DstAlphaSelectMode0 */
\r
471 /* [14:12] DstFactorMode0 */
\r
472 /* [15] DstColorMode0 */
\r
474 u16 alpha_mode_1; /* [0] SrcAlphaMode1 */
\r
475 /* [2:1] SrcGlobalAlphaMode1 */
\r
476 /* [3] SrcAlphaSelectMode1 */
\r
477 /* [6:4] SrcFactorMode1 */
\r
479 /* [8] DstAlphaMode1 */
\r
480 /* [10:9] DstGlobalAlphaMode1 */
\r
481 /* [11] DstAlphaSelectMode1 */
\r
482 /* [14:12] DstFactorMode1 */
\r
484 u8 scale_bicu_mode; /* 0 1 2 3 */
\r
486 u32 color_key_max; /* color key max */
\r
487 u32 color_key_min; /* color key min */
\r
489 u32 fg_color; /* foreground color */
\r
490 u32 bg_color; /* background color */
\r
492 u8 color_fill_mode;
\r
493 COLOR_FILL gr_color; /* color fill use gradient */
\r
495 u8 fading_alpha_value; /* Fading value */
\r
500 u8 src_a_global_val; /* src global alpha value */
\r
501 u8 dst_a_global_val; /* dst global alpha value */
\r
505 u16 rop_code; /* rop2/3/4 code */
\r
507 u8 palette_mode; /* (enum) color palatte 0/1bpp, 1/2bpp 2/4bpp 3/8bpp*/
\r
509 u8 yuv2rgb_mode; /* (enum) BT.601 MPEG / BT.601 JPEG / BT.709 */
\r
511 u8 endian_mode; /* 0/little endian 1/big endian */
\r
513 u8 CMD_fin_int_enable;
\r
515 MMU_INFO mmu_info; /* mmu infomation */
\r
525 struct sg_table *sg_src0;
\r
526 struct sg_table *sg_src1;
\r
527 struct sg_table *sg_dst;
\r
528 struct sg_table *sg_els;
\r
531 struct rga2_mmu_buf_t {
\r
537 unsigned int *buf_virtual;
\r
539 struct page **pages;
\r
544 BB_ROTATE_OFF = 0x0, /* no rotate */
\r
545 BB_ROTATE_90 = 0x1, /* rotate 90 */
\r
546 BB_ROTATE_180 = 0x2, /* rotate 180 */
\r
547 BB_ROTATE_270 = 0x3, /* rotate 270 */
\r
552 BB_MIRROR_OFF = (0x0 << 4), /* no mirror */
\r
553 BB_MIRROR_X = (0x1 << 4), /* x mirror */
\r
554 BB_MIRROR_Y = (0x2 << 4), /* y mirror */
\r
555 BB_MIRROR_XY = (0x3 << 4), /* xy mirror */
\r
560 BB_COPY_USE_TILE = (0x1 << 6), /* bitblt mode copy but use Tile mode */
\r
566 BT_601_RANGE0 = 0x1,
\r
567 BT_601_RANGE1 = 0x2,
\r
568 BT_709_RANGE0 = 0x3,
\r
569 }; /*yuv2rgb_mode*/
\r
573 BPP1 = 0x0, /* BPP1 */
\r
574 BPP2 = 0x1, /* BPP2 */
\r
575 BPP4 = 0x2, /* BPP4 */
\r
576 BPP8 = 0x3 /* BPP8 */
\r
577 }; /*palette_mode*/
\r
581 SOLID_COLOR = 0x0, //color fill mode; ROP4: SOLID_rop4_mask_addr COLOR
\r
582 PATTERN_COLOR = 0x1 //pattern_fill_mode;ROP4:PATTERN_COLOR
\r
583 }; /*color fill mode*/
\r
587 COLOR_FILL_CLIP = 0x0,
\r
588 COLOR_FILL_NOT_CLIP = 0x1
\r
597 }; /*bicubic coefficient*/
\r
609 LITTLE_ENDIAN = 0x1
\r
614 MMU_TABLE_4KB = 0x0,
\r
615 MMU_TABLE_64KB = 0x1,
\r
616 }; /*MMU table size*/
\r
624 }; /*dither down mode*/
\r
629 * struct for process session which connect to rga
\r
631 * @author ZhangShengqin (2012-2-15)
\r
633 typedef struct rga2_session {
\r
634 /* a linked list of data so we can access them for debugging */
\r
635 struct list_head list_session;
\r
636 /* a linked list of register data waiting for process */
\r
637 struct list_head waiting;
\r
638 /* a linked list of register data in processing */
\r
639 struct list_head running;
\r
640 /* all coommand this thread done */
\r
642 wait_queue_head_t wait;
\r
644 atomic_t task_running;
\r
649 rga2_session *session;
\r
650 struct list_head session_link; /* link to rga service session */
\r
651 struct list_head status_link; /* link to register set list */
\r
652 uint32_t sys_reg[8];
\r
653 uint32_t cmd_reg[32];
\r
655 uint32_t *MMU_base;
\r
657 //atomic_t int_enable;
\r
659 //struct rga_req req;
\r
664 struct rga2_service_info {
\r
666 struct timer_list timer; /* timer for power off */
\r
667 struct list_head waiting; /* link to link_reg in struct vpu_reg */
\r
668 struct list_head running; /* link to link_reg in struct vpu_reg */
\r
669 struct list_head done; /* link to link_reg in struct vpu_reg */
\r
670 struct list_head session; /* link to list_session in struct vpu_session */
\r
671 atomic_t total_running;
\r
673 struct rga2_reg *reg;
\r
675 uint32_t cmd_buff[32*8];/* cmd_buff for rga */
\r
676 uint32_t *pre_scale_buf;
\r
677 atomic_t int_disable; /* 0 int enable 1 int disable */
\r
679 atomic_t src_format_swt;
\r
680 int last_prc_src_format;
\r
681 atomic_t rga_working;
\r
685 //struct rga_req req[10];
\r
687 struct mutex mutex; // mutex
\r
690 #define RGA2_TEST_CASE 0
\r
691 #define RGA2_TEST 0
\r
692 #define RGA2_TEST_MSG 0
\r
693 #define RGA2_TEST_TIME 0
\r
695 //General Registers
\r
696 #define RGA2_SYS_CTRL 0x000
\r
697 #define RGA2_CMD_CTRL 0x004
\r
698 #define RGA2_CMD_BASE 0x008
\r
699 #define RGA2_STATUS 0x00c
\r
700 #define RGA2_INT 0x010
\r
701 #define RGA2_MMU_CTRL0 0x018
\r
702 #define RGA2_MMU_CMD_BASE 0x01c
\r
704 //Command code start
\r
705 #define RGA2_MODE_CTRL 0x100
\r
706 #define RGA_BLIT_COMPLETE_EVENT 1
\r
708 #endif /*_RK29_IPP_DRIVER_H_*/
\r