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