1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 2016 Rockchip Electronics Co., Ltd. 3*4882a593Smuzhiyun * Authors: 4*4882a593Smuzhiyun * Zhiqin Wei <wzq@rock-chips.com> 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License"); 7*4882a593Smuzhiyun * you may not use this file except in compliance with the License. 8*4882a593Smuzhiyun * You may obtain a copy of the License at 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software 13*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS, 14*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*4882a593Smuzhiyun * See the License for the specific language governing permissions and 16*4882a593Smuzhiyun * limitations under the License. 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #ifndef _RGA_DRIVER_H_ 20*4882a593Smuzhiyun #define _RGA_DRIVER_H_ 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #include <asm/ioctl.h> 23*4882a593Smuzhiyun #include <stdint.h> 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #ifdef __cplusplus 26*4882a593Smuzhiyun extern "C" 27*4882a593Smuzhiyun { 28*4882a593Smuzhiyun #endif 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* Use 'r' as magic number */ 31*4882a593Smuzhiyun #define RGA_IOC_MAGIC 'r' 32*4882a593Smuzhiyun #define RGA_IOW(nr, type) _IOW(RGA_IOC_MAGIC, nr, type) 33*4882a593Smuzhiyun #define RGA_IOR(nr, type) _IOR(RGA_IOC_MAGIC, nr, type) 34*4882a593Smuzhiyun #define RGA_IOWR(nr, type) _IOWR(RGA_IOC_MAGIC, nr, type) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #define RGA_IOC_GET_DRVIER_VERSION RGA_IOR(0x1, struct rga_version_t) 37*4882a593Smuzhiyun #define RGA_IOC_GET_HW_VERSION RGA_IOR(0x2, struct rga_hw_versions_t) 38*4882a593Smuzhiyun #define RGA_IOC_IMPORT_BUFFER RGA_IOWR(0x3, struct rga_buffer_pool) 39*4882a593Smuzhiyun #define RGA_IOC_RELEASE_BUFFER RGA_IOW(0x4, struct rga_buffer_pool) 40*4882a593Smuzhiyun #define RGA_START_CONFIG RGA_IOR(0x5, uint32_t) 41*4882a593Smuzhiyun #define RGA_END_CONFIG RGA_IOWR(0x6, struct rga_user_ctx_t) 42*4882a593Smuzhiyun #define RGA_CMD_CONFIG RGA_IOWR(0x7, struct rga_user_ctx_t) 43*4882a593Smuzhiyun #define RGA_CANCEL_CONFIG RGA_IOWR(0x8, uint32_t) 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define RGA_BLIT_SYNC 0x5017 46*4882a593Smuzhiyun #define RGA_BLIT_ASYNC 0x5018 47*4882a593Smuzhiyun #define RGA_FLUSH 0x5019 48*4882a593Smuzhiyun #define RGA_GET_RESULT 0x501a 49*4882a593Smuzhiyun #define RGA_GET_VERSION 0x501b 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define RGA2_BLIT_SYNC 0x6017 52*4882a593Smuzhiyun #define RGA2_BLIT_ASYNC 0x6018 53*4882a593Smuzhiyun #define RGA2_FLUSH 0x6019 54*4882a593Smuzhiyun #define RGA2_GET_RESULT 0x601a 55*4882a593Smuzhiyun #define RGA2_GET_VERSION 0x601b 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun #define RGA_REG_CTRL_LEN 0x8 /* 8 */ 58*4882a593Smuzhiyun #define RGA_REG_CMD_LEN 0x1c /* 28 */ 59*4882a593Smuzhiyun #define RGA_CMD_BUF_SIZE 0x700 /* 16*28*4 */ 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun #ifndef ENABLE 62*4882a593Smuzhiyun #define ENABLE 1 63*4882a593Smuzhiyun #endif 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #ifndef DISABLE 66*4882a593Smuzhiyun #define DISABLE 0 67*4882a593Smuzhiyun #endif 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun enum rga_memory_type { 70*4882a593Smuzhiyun RGA_DMA_BUFFER = 0, 71*4882a593Smuzhiyun RGA_VIRTUAL_ADDRESS, 72*4882a593Smuzhiyun RGA_PHYSICAL_ADDRESS 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* RGA process mode enum */ 76*4882a593Smuzhiyun enum { 77*4882a593Smuzhiyun bitblt_mode = 0x0, 78*4882a593Smuzhiyun color_palette_mode = 0x1, 79*4882a593Smuzhiyun color_fill_mode = 0x2, 80*4882a593Smuzhiyun line_point_drawing_mode = 0x3, 81*4882a593Smuzhiyun blur_sharp_filter_mode = 0x4, 82*4882a593Smuzhiyun pre_scaling_mode = 0x5, 83*4882a593Smuzhiyun update_palette_table_mode = 0x6, 84*4882a593Smuzhiyun update_patten_buff_mode = 0x7, 85*4882a593Smuzhiyun }; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun enum { 89*4882a593Smuzhiyun rop_enable_mask = 0x2, 90*4882a593Smuzhiyun dither_enable_mask = 0x8, 91*4882a593Smuzhiyun fading_enable_mask = 0x10, 92*4882a593Smuzhiyun PD_enbale_mask = 0x20, 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun enum { 96*4882a593Smuzhiyun yuv2rgb_mode0 = 0x0, /* BT.601 MPEG */ 97*4882a593Smuzhiyun yuv2rgb_mode1 = 0x1, /* BT.601 JPEG */ 98*4882a593Smuzhiyun yuv2rgb_mode2 = 0x2, /* BT.709 */ 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun rgb2yuv_601_full = 0x1 << 8, 101*4882a593Smuzhiyun rgb2yuv_709_full = 0x2 << 8, 102*4882a593Smuzhiyun yuv2yuv_601_limit_2_709_limit = 0x3 << 8, 103*4882a593Smuzhiyun yuv2yuv_601_limit_2_709_full = 0x4 << 8, 104*4882a593Smuzhiyun yuv2yuv_709_limit_2_601_limit = 0x5 << 8, 105*4882a593Smuzhiyun yuv2yuv_709_limit_2_601_full = 0x6 << 8, //not support 106*4882a593Smuzhiyun yuv2yuv_601_full_2_709_limit = 0x7 << 8, 107*4882a593Smuzhiyun yuv2yuv_601_full_2_709_full = 0x8 << 8, //not support 108*4882a593Smuzhiyun yuv2yuv_709_full_2_601_limit = 0x9 << 8, //not support 109*4882a593Smuzhiyun yuv2yuv_709_full_2_601_full = 0xa << 8, //not support 110*4882a593Smuzhiyun full_csc_mask = 0xf00, 111*4882a593Smuzhiyun }; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* RGA rotate mode */ 114*4882a593Smuzhiyun enum { 115*4882a593Smuzhiyun rotate_mode0 = 0x0, /* no rotate */ 116*4882a593Smuzhiyun rotate_mode1 = 0x1, /* rotate */ 117*4882a593Smuzhiyun rotate_mode2 = 0x2, /* x_mirror */ 118*4882a593Smuzhiyun rotate_mode3 = 0x3, /* y_mirror */ 119*4882a593Smuzhiyun }; 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun enum { 122*4882a593Smuzhiyun color_palette_mode0 = 0x0, /* 1K */ 123*4882a593Smuzhiyun color_palette_mode1 = 0x1, /* 2K */ 124*4882a593Smuzhiyun color_palette_mode2 = 0x2, /* 4K */ 125*4882a593Smuzhiyun color_palette_mode3 = 0x3, /* 8K */ 126*4882a593Smuzhiyun }; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun enum { 129*4882a593Smuzhiyun BB_BYPASS = 0x0, /* no rotate */ 130*4882a593Smuzhiyun BB_ROTATE = 0x1, /* rotate */ 131*4882a593Smuzhiyun BB_X_MIRROR = 0x2, /* x_mirror */ 132*4882a593Smuzhiyun BB_Y_MIRROR = 0x3 /* y_mirror */ 133*4882a593Smuzhiyun }; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun enum { 136*4882a593Smuzhiyun nearby = 0x0, /* no rotate */ 137*4882a593Smuzhiyun bilinear = 0x1, /* rotate */ 138*4882a593Smuzhiyun bicubic = 0x2, /* x_mirror */ 139*4882a593Smuzhiyun }; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun #define RGA_SCHED_PRIORITY_DEFAULT 0 142*4882a593Smuzhiyun #define RGA_SCHED_PRIORITY_MAX 6 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun enum { 145*4882a593Smuzhiyun RGA3_SCHEDULER_CORE0 = 1 << 0, 146*4882a593Smuzhiyun RGA3_SCHEDULER_CORE1 = 1 << 1, 147*4882a593Smuzhiyun RGA2_SCHEDULER_CORE0 = 1 << 2, 148*4882a593Smuzhiyun }; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* 151*4882a593Smuzhiyun // Alpha Red Green Blue 152*4882a593Smuzhiyun { 4, 32, {{32,24, 8, 0, 16, 8, 24,16 }}, GGL_RGBA }, // RK_FORMAT_RGBA_8888 153*4882a593Smuzhiyun { 4, 24, {{ 0, 0, 8, 0, 16, 8, 24,16 }}, GGL_RGB }, // RK_FORMAT_RGBX_8888 154*4882a593Smuzhiyun { 3, 24, {{ 0, 0, 8, 0, 16, 8, 24,16 }}, GGL_RGB }, // RK_FORMAT_RGB_888 155*4882a593Smuzhiyun { 4, 32, {{32,24, 24,16, 16, 8, 8, 0 }}, GGL_BGRA }, // RK_FORMAT_BGRA_8888 156*4882a593Smuzhiyun { 2, 16, {{ 0, 0, 16,11, 11, 5, 5, 0 }}, GGL_RGB }, // RK_FORMAT_RGB_565 157*4882a593Smuzhiyun { 2, 16, {{ 1, 0, 16,11, 11, 6, 6, 1 }}, GGL_RGBA }, // RK_FORMAT_RGBA_5551 158*4882a593Smuzhiyun { 2, 16, {{ 4, 0, 16,12, 12, 8, 8, 4 }}, GGL_RGBA }, // RK_FORMAT_RGBA_4444 159*4882a593Smuzhiyun { 3, 24, {{ 0, 0, 24,16, 16, 8, 8, 0 }}, GGL_BGR }, // RK_FORMAT_BGB_888 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun */ 162*4882a593Smuzhiyun /* In order to be compatible with RK_FORMAT_XX and HAL_PIXEL_FORMAT_XX, 163*4882a593Smuzhiyun * RK_FORMAT_XX is shifted to the left by 8 bits to distinguish. */ 164*4882a593Smuzhiyun typedef enum _Rga_SURF_FORMAT { 165*4882a593Smuzhiyun RK_FORMAT_RGBA_8888 = 0x0 << 8, 166*4882a593Smuzhiyun RK_FORMAT_RGBX_8888 = 0x1 << 8, 167*4882a593Smuzhiyun RK_FORMAT_RGB_888 = 0x2 << 8, 168*4882a593Smuzhiyun RK_FORMAT_BGRA_8888 = 0x3 << 8, 169*4882a593Smuzhiyun RK_FORMAT_RGB_565 = 0x4 << 8, 170*4882a593Smuzhiyun RK_FORMAT_RGBA_5551 = 0x5 << 8, 171*4882a593Smuzhiyun RK_FORMAT_RGBA_4444 = 0x6 << 8, 172*4882a593Smuzhiyun RK_FORMAT_BGR_888 = 0x7 << 8, 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun RK_FORMAT_YCbCr_422_SP = 0x8 << 8, 175*4882a593Smuzhiyun RK_FORMAT_YCbCr_422_P = 0x9 << 8, 176*4882a593Smuzhiyun RK_FORMAT_YCbCr_420_SP = 0xa << 8, 177*4882a593Smuzhiyun RK_FORMAT_YCbCr_420_P = 0xb << 8, 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun RK_FORMAT_YCrCb_422_SP = 0xc << 8, 180*4882a593Smuzhiyun RK_FORMAT_YCrCb_422_P = 0xd << 8, 181*4882a593Smuzhiyun RK_FORMAT_YCrCb_420_SP = 0xe << 8, 182*4882a593Smuzhiyun RK_FORMAT_YCrCb_420_P = 0xf << 8, 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun RK_FORMAT_BPP1 = 0x10 << 8, 185*4882a593Smuzhiyun RK_FORMAT_BPP2 = 0x11 << 8, 186*4882a593Smuzhiyun RK_FORMAT_BPP4 = 0x12 << 8, 187*4882a593Smuzhiyun RK_FORMAT_BPP8 = 0x13 << 8, 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun RK_FORMAT_Y4 = 0x14 << 8, 190*4882a593Smuzhiyun RK_FORMAT_YCbCr_400 = 0x15 << 8, 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun RK_FORMAT_BGRX_8888 = 0x16 << 8, 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun RK_FORMAT_YVYU_422 = 0x18 << 8, 195*4882a593Smuzhiyun RK_FORMAT_YVYU_420 = 0x19 << 8, 196*4882a593Smuzhiyun RK_FORMAT_VYUY_422 = 0x1a << 8, 197*4882a593Smuzhiyun RK_FORMAT_VYUY_420 = 0x1b << 8, 198*4882a593Smuzhiyun RK_FORMAT_YUYV_422 = 0x1c << 8, 199*4882a593Smuzhiyun RK_FORMAT_YUYV_420 = 0x1d << 8, 200*4882a593Smuzhiyun RK_FORMAT_UYVY_422 = 0x1e << 8, 201*4882a593Smuzhiyun RK_FORMAT_UYVY_420 = 0x1f << 8, 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun RK_FORMAT_YCbCr_420_SP_10B = 0x20 << 8, 204*4882a593Smuzhiyun RK_FORMAT_YCrCb_420_SP_10B = 0x21 << 8, 205*4882a593Smuzhiyun RK_FORMAT_YCbCr_422_SP_10B = 0x22 << 8, 206*4882a593Smuzhiyun RK_FORMAT_YCrCb_422_SP_10B = 0x23 << 8, 207*4882a593Smuzhiyun /* For compatibility with misspellings */ 208*4882a593Smuzhiyun RK_FORMAT_YCbCr_422_10b_SP = RK_FORMAT_YCbCr_422_SP_10B, 209*4882a593Smuzhiyun RK_FORMAT_YCrCb_422_10b_SP = RK_FORMAT_YCrCb_422_SP_10B, 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun RK_FORMAT_BGR_565 = 0x24 << 8, 212*4882a593Smuzhiyun RK_FORMAT_BGRA_5551 = 0x25 << 8, 213*4882a593Smuzhiyun RK_FORMAT_BGRA_4444 = 0x26 << 8, 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun RK_FORMAT_ARGB_8888 = 0x28 << 8, 216*4882a593Smuzhiyun RK_FORMAT_XRGB_8888 = 0x29 << 8, 217*4882a593Smuzhiyun RK_FORMAT_ARGB_5551 = 0x2a << 8, 218*4882a593Smuzhiyun RK_FORMAT_ARGB_4444 = 0x2b << 8, 219*4882a593Smuzhiyun RK_FORMAT_ABGR_8888 = 0x2c << 8, 220*4882a593Smuzhiyun RK_FORMAT_XBGR_8888 = 0x2d << 8, 221*4882a593Smuzhiyun RK_FORMAT_ABGR_5551 = 0x2e << 8, 222*4882a593Smuzhiyun RK_FORMAT_ABGR_4444 = 0x2f << 8, 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun RK_FORMAT_RGBA2BPP = 0x30 << 8, 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun RK_FORMAT_UNKNOWN = 0x100 << 8, 227*4882a593Smuzhiyun } RgaSURF_FORMAT; 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun /* RGA3 rd_mode */ 230*4882a593Smuzhiyun enum 231*4882a593Smuzhiyun { 232*4882a593Smuzhiyun raster_mode = 0x1 << 0, 233*4882a593Smuzhiyun fbc_mode = 0x1 << 1, 234*4882a593Smuzhiyun tile_mode = 0x1 << 2, 235*4882a593Smuzhiyun }; 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun typedef struct rga_img_info_t { 238*4882a593Smuzhiyun uint64_t yrgb_addr; /* yrgb mem addr */ 239*4882a593Smuzhiyun uint64_t uv_addr; /* cb/cr mem addr */ 240*4882a593Smuzhiyun uint64_t v_addr; /* cr mem addr */ 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun uint32_t format; //definition by RK_FORMAT 243*4882a593Smuzhiyun uint16_t act_w; 244*4882a593Smuzhiyun uint16_t act_h; 245*4882a593Smuzhiyun uint16_t x_offset; 246*4882a593Smuzhiyun uint16_t y_offset; 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun uint16_t vir_w; 249*4882a593Smuzhiyun uint16_t vir_h; 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun uint16_t endian_mode; //for BPP 252*4882a593Smuzhiyun uint16_t alpha_swap; 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun //used by RGA3 255*4882a593Smuzhiyun uint16_t rotate_mode; 256*4882a593Smuzhiyun uint16_t rd_mode; 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun uint16_t is_10b_compact; 259*4882a593Smuzhiyun uint16_t is_10b_endian; 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun uint16_t enable; 262*4882a593Smuzhiyun } 263*4882a593Smuzhiyun rga_img_info_t; 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun typedef struct POINT { 266*4882a593Smuzhiyun uint16_t x; 267*4882a593Smuzhiyun uint16_t y; 268*4882a593Smuzhiyun } 269*4882a593Smuzhiyun POINT; 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun typedef struct RECT { 272*4882a593Smuzhiyun uint16_t xmin; 273*4882a593Smuzhiyun uint16_t xmax; // width - 1 274*4882a593Smuzhiyun uint16_t ymin; 275*4882a593Smuzhiyun uint16_t ymax; // height - 1 276*4882a593Smuzhiyun } RECT; 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun typedef struct MMU { 279*4882a593Smuzhiyun uint8_t mmu_en; 280*4882a593Smuzhiyun uint64_t base_addr; 281*4882a593Smuzhiyun uint32_t mmu_flag; /* [0] mmu enable [1] src_flush [2] dst_flush [3] CMD_flush [4~5] page size*/ 282*4882a593Smuzhiyun } MMU; 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun typedef struct COLOR_FILL { 285*4882a593Smuzhiyun int16_t gr_x_a; 286*4882a593Smuzhiyun int16_t gr_y_a; 287*4882a593Smuzhiyun int16_t gr_x_b; 288*4882a593Smuzhiyun int16_t gr_y_b; 289*4882a593Smuzhiyun int16_t gr_x_g; 290*4882a593Smuzhiyun int16_t gr_y_g; 291*4882a593Smuzhiyun int16_t gr_x_r; 292*4882a593Smuzhiyun int16_t gr_y_r; 293*4882a593Smuzhiyun //u8 cp_gr_saturation; 294*4882a593Smuzhiyun } 295*4882a593Smuzhiyun COLOR_FILL; 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun typedef struct FADING { 298*4882a593Smuzhiyun uint8_t b; 299*4882a593Smuzhiyun uint8_t g; 300*4882a593Smuzhiyun uint8_t r; 301*4882a593Smuzhiyun uint8_t res; 302*4882a593Smuzhiyun } 303*4882a593Smuzhiyun FADING; 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun typedef struct line_draw_t { 306*4882a593Smuzhiyun POINT start_point; /* LineDraw_start_point */ 307*4882a593Smuzhiyun POINT end_point; /* LineDraw_end_point */ 308*4882a593Smuzhiyun uint32_t color; /* LineDraw_color */ 309*4882a593Smuzhiyun uint32_t flag; /* (enum) LineDrawing mode sel */ 310*4882a593Smuzhiyun uint32_t line_width; /* range 1~16 */ 311*4882a593Smuzhiyun } 312*4882a593Smuzhiyun line_draw_t; 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun /* color space convert coefficient. */ 315*4882a593Smuzhiyun typedef struct csc_coe_t { 316*4882a593Smuzhiyun int16_t r_v; 317*4882a593Smuzhiyun int16_t g_y; 318*4882a593Smuzhiyun int16_t b_u; 319*4882a593Smuzhiyun int32_t off; 320*4882a593Smuzhiyun } csc_coe_t; 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun typedef struct full_csc_t { 323*4882a593Smuzhiyun uint8_t flag; 324*4882a593Smuzhiyun csc_coe_t coe_y; 325*4882a593Smuzhiyun csc_coe_t coe_u; 326*4882a593Smuzhiyun csc_coe_t coe_v; 327*4882a593Smuzhiyun } full_csc_t; 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun struct rga_mosaic_info { 330*4882a593Smuzhiyun uint8_t enable; 331*4882a593Smuzhiyun uint8_t mode; 332*4882a593Smuzhiyun }; 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun struct rga_pre_intr_info { 335*4882a593Smuzhiyun uint8_t enable; 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun uint8_t read_intr_en; 338*4882a593Smuzhiyun uint8_t write_intr_en; 339*4882a593Smuzhiyun uint8_t read_hold_en; 340*4882a593Smuzhiyun uint32_t read_threshold; 341*4882a593Smuzhiyun uint32_t write_start; 342*4882a593Smuzhiyun uint32_t write_step; 343*4882a593Smuzhiyun }; 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun /* MAX(min, (max - channel_value)) */ 346*4882a593Smuzhiyun struct rga_osd_invert_factor { 347*4882a593Smuzhiyun uint8_t alpha_max; 348*4882a593Smuzhiyun uint8_t alpha_min; 349*4882a593Smuzhiyun uint8_t yg_max; 350*4882a593Smuzhiyun uint8_t yg_min; 351*4882a593Smuzhiyun uint8_t crb_max; 352*4882a593Smuzhiyun uint8_t crb_min; 353*4882a593Smuzhiyun }; 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun struct rga_color { 356*4882a593Smuzhiyun union { 357*4882a593Smuzhiyun struct { 358*4882a593Smuzhiyun uint8_t red; 359*4882a593Smuzhiyun uint8_t green; 360*4882a593Smuzhiyun uint8_t blue; 361*4882a593Smuzhiyun uint8_t alpha; 362*4882a593Smuzhiyun }; 363*4882a593Smuzhiyun uint32_t value; 364*4882a593Smuzhiyun }; 365*4882a593Smuzhiyun }; 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun struct rga_osd_bpp2 { 368*4882a593Smuzhiyun uint8_t ac_swap; // ac swap flag 369*4882a593Smuzhiyun // 0: CA 370*4882a593Smuzhiyun // 1: AC 371*4882a593Smuzhiyun uint8_t endian_swap; // rgba2bpp endian swap 372*4882a593Smuzhiyun // 0: Big endian 373*4882a593Smuzhiyun // 1: Little endian 374*4882a593Smuzhiyun struct rga_color color0; 375*4882a593Smuzhiyun struct rga_color color1; 376*4882a593Smuzhiyun }; 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun struct rga_osd_mode_ctrl { 379*4882a593Smuzhiyun uint8_t mode; // OSD cal mode: 380*4882a593Smuzhiyun // 0b'1: statistics mode 381*4882a593Smuzhiyun // 1b'1: auto inversion overlap mode 382*4882a593Smuzhiyun uint8_t direction_mode; // horizontal or vertical 383*4882a593Smuzhiyun // 0: horizontal 384*4882a593Smuzhiyun // 1: vertical 385*4882a593Smuzhiyun uint8_t width_mode; // using @fix_width or LUT width 386*4882a593Smuzhiyun // 0: fix width 387*4882a593Smuzhiyun // 1: LUT width 388*4882a593Smuzhiyun uint16_t block_fix_width; // OSD block fixed width 389*4882a593Smuzhiyun // real width = (fix_width + 1) * 2 390*4882a593Smuzhiyun uint8_t block_num; // OSD block num 391*4882a593Smuzhiyun uint16_t flags_index; // auto invert flags index 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun /* invertion config */ 394*4882a593Smuzhiyun uint8_t color_mode; // selete color 395*4882a593Smuzhiyun // 0: src1 color 396*4882a593Smuzhiyun // 1: config data color 397*4882a593Smuzhiyun uint8_t invert_flags_mode; // invert flag selete 398*4882a593Smuzhiyun // 0: use RAM flag 399*4882a593Smuzhiyun // 1: usr last result 400*4882a593Smuzhiyun uint8_t default_color_sel; // default color mode 401*4882a593Smuzhiyun // 0: default is bright 402*4882a593Smuzhiyun // 1: default is dark 403*4882a593Smuzhiyun uint8_t invert_enable; // invert channel enable 404*4882a593Smuzhiyun // 1 << 0: aplha enable 405*4882a593Smuzhiyun // 1 << 1: Y/G disable 406*4882a593Smuzhiyun // 1 << 2: C/RB disable 407*4882a593Smuzhiyun uint8_t invert_mode; // invert cal mode 408*4882a593Smuzhiyun // 0: normal(max-data) 409*4882a593Smuzhiyun // 1: swap 410*4882a593Smuzhiyun uint8_t invert_thresh; // if luma > thresh, osd_flag to be 1 411*4882a593Smuzhiyun uint8_t unfix_index; // OSD width config index 412*4882a593Smuzhiyun }; 413*4882a593Smuzhiyun 414*4882a593Smuzhiyun struct rga_osd_info { 415*4882a593Smuzhiyun uint8_t enable; 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun struct rga_osd_mode_ctrl mode_ctrl; 418*4882a593Smuzhiyun struct rga_osd_invert_factor cal_factor; 419*4882a593Smuzhiyun struct rga_osd_bpp2 bpp2_info; 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun union { 422*4882a593Smuzhiyun struct { 423*4882a593Smuzhiyun uint32_t last_flags1; 424*4882a593Smuzhiyun uint32_t last_flags0; 425*4882a593Smuzhiyun }; 426*4882a593Smuzhiyun uint64_t last_flags; 427*4882a593Smuzhiyun }; 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun union { 430*4882a593Smuzhiyun struct { 431*4882a593Smuzhiyun uint32_t cur_flags1; 432*4882a593Smuzhiyun uint32_t cur_flags0; 433*4882a593Smuzhiyun }; 434*4882a593Smuzhiyun uint64_t cur_flags; 435*4882a593Smuzhiyun }; 436*4882a593Smuzhiyun }; 437*4882a593Smuzhiyun 438*4882a593Smuzhiyun #define RGA_VERSION_SIZE 16 439*4882a593Smuzhiyun #define RGA_HW_SIZE 5 440*4882a593Smuzhiyun 441*4882a593Smuzhiyun struct rga_version_t { 442*4882a593Smuzhiyun uint32_t major; 443*4882a593Smuzhiyun uint32_t minor; 444*4882a593Smuzhiyun uint32_t revision; 445*4882a593Smuzhiyun uint8_t str[RGA_VERSION_SIZE]; 446*4882a593Smuzhiyun }; 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun struct rga_hw_versions_t { 449*4882a593Smuzhiyun struct rga_version_t version[RGA_HW_SIZE]; 450*4882a593Smuzhiyun uint32_t size; 451*4882a593Smuzhiyun }; 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun struct rga_memory_parm { 454*4882a593Smuzhiyun uint32_t width; 455*4882a593Smuzhiyun uint32_t height; 456*4882a593Smuzhiyun uint32_t format; 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun uint32_t size; 459*4882a593Smuzhiyun }; 460*4882a593Smuzhiyun 461*4882a593Smuzhiyun struct rga_external_buffer { 462*4882a593Smuzhiyun uint64_t memory; 463*4882a593Smuzhiyun uint32_t type; 464*4882a593Smuzhiyun 465*4882a593Smuzhiyun uint32_t handle; 466*4882a593Smuzhiyun struct rga_memory_parm memory_info; 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun uint8_t reserve[252]; 469*4882a593Smuzhiyun }; 470*4882a593Smuzhiyun 471*4882a593Smuzhiyun struct rga_buffer_pool { 472*4882a593Smuzhiyun uint64_t buffers; 473*4882a593Smuzhiyun uint32_t size; 474*4882a593Smuzhiyun }; 475*4882a593Smuzhiyun 476*4882a593Smuzhiyun struct rga_req { 477*4882a593Smuzhiyun uint8_t render_mode; /* (enum) process mode sel */ 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun rga_img_info_t src; /* src image info */ 480*4882a593Smuzhiyun rga_img_info_t dst; /* dst image info */ 481*4882a593Smuzhiyun rga_img_info_t pat; /* patten image info */ 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun uint64_t rop_mask_addr; /* rop4 mask addr */ 484*4882a593Smuzhiyun uint64_t LUT_addr; /* LUT addr */ 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun RECT clip; /* dst clip window default value is dst_vir */ 487*4882a593Smuzhiyun /* value from [0, w-1] / [0, h-1]*/ 488*4882a593Smuzhiyun 489*4882a593Smuzhiyun int32_t sina; /* dst angle default value 0 16.16 scan from table */ 490*4882a593Smuzhiyun int32_t cosa; /* dst angle default value 0 16.16 scan from table */ 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun uint16_t alpha_rop_flag; /* alpha rop process flag */ 493*4882a593Smuzhiyun /* ([0] = 1 alpha_rop_enable) */ 494*4882a593Smuzhiyun /* ([1] = 1 rop enable) */ 495*4882a593Smuzhiyun /* ([2] = 1 fading_enable) */ 496*4882a593Smuzhiyun /* ([3] = 1 PD_enable) */ 497*4882a593Smuzhiyun /* ([4] = 1 alpha cal_mode_sel) */ 498*4882a593Smuzhiyun /* ([5] = 1 dither_enable) */ 499*4882a593Smuzhiyun /* ([6] = 1 gradient fill mode sel) */ 500*4882a593Smuzhiyun /* ([7] = 1 AA_enable) */ 501*4882a593Smuzhiyun /* ([8] = 1 nn_quantize) */ 502*4882a593Smuzhiyun /* ([9] = 1 Real color mode) */ 503*4882a593Smuzhiyun 504*4882a593Smuzhiyun uint8_t scale_mode; /* 0 nearst / 1 bilnear / 2 bicubic */ 505*4882a593Smuzhiyun 506*4882a593Smuzhiyun uint32_t color_key_max; /* color key max */ 507*4882a593Smuzhiyun uint32_t color_key_min; /* color key min */ 508*4882a593Smuzhiyun 509*4882a593Smuzhiyun uint32_t fg_color; /* foreground color */ 510*4882a593Smuzhiyun uint32_t bg_color; /* background color */ 511*4882a593Smuzhiyun 512*4882a593Smuzhiyun COLOR_FILL gr_color; /* color fill use gradient */ 513*4882a593Smuzhiyun 514*4882a593Smuzhiyun line_draw_t line_draw_info; 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun FADING fading; 517*4882a593Smuzhiyun 518*4882a593Smuzhiyun uint8_t PD_mode; /* porter duff alpha mode sel */ 519*4882a593Smuzhiyun 520*4882a593Smuzhiyun uint8_t alpha_global_value; /* global alpha value */ 521*4882a593Smuzhiyun 522*4882a593Smuzhiyun uint16_t rop_code; /* rop2/3/4 code scan from rop code table*/ 523*4882a593Smuzhiyun 524*4882a593Smuzhiyun uint8_t bsfilter_flag; /* [2] 0 blur 1 sharp / [1:0] filter_type*/ 525*4882a593Smuzhiyun 526*4882a593Smuzhiyun uint8_t palette_mode; /* (enum) color palatte 0/1bpp, 1/2bpp 2/4bpp 3/8bpp*/ 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun uint8_t yuv2rgb_mode; /* (enum) BT.601 MPEG / BT.601 JPEG / BT.709 */ 529*4882a593Smuzhiyun 530*4882a593Smuzhiyun uint8_t endian_mode; /* 0/big endian 1/little endian*/ 531*4882a593Smuzhiyun 532*4882a593Smuzhiyun uint8_t rotate_mode; /* (enum) rotate mode */ 533*4882a593Smuzhiyun /* 0x0, no rotate */ 534*4882a593Smuzhiyun /* 0x1, rotate */ 535*4882a593Smuzhiyun /* 0x2, x_mirror */ 536*4882a593Smuzhiyun /* 0x3, y_mirror */ 537*4882a593Smuzhiyun 538*4882a593Smuzhiyun uint8_t color_fill_mode; /* 0 solid color / 1 patten color */ 539*4882a593Smuzhiyun 540*4882a593Smuzhiyun MMU mmu_info; /* mmu information */ 541*4882a593Smuzhiyun 542*4882a593Smuzhiyun uint8_t alpha_rop_mode; /* ([0~1] alpha mode) */ 543*4882a593Smuzhiyun /* ([2~3] rop mode) */ 544*4882a593Smuzhiyun /* ([4] zero mode en) */ 545*4882a593Smuzhiyun /* ([5] dst alpha mode) (RGA1) */ 546*4882a593Smuzhiyun 547*4882a593Smuzhiyun uint8_t src_trans_mode; 548*4882a593Smuzhiyun 549*4882a593Smuzhiyun uint8_t dither_mode; 550*4882a593Smuzhiyun 551*4882a593Smuzhiyun full_csc_t full_csc; /* full color space convert */ 552*4882a593Smuzhiyun 553*4882a593Smuzhiyun int32_t in_fence_fd; 554*4882a593Smuzhiyun uint8_t core; 555*4882a593Smuzhiyun uint8_t priority; 556*4882a593Smuzhiyun int32_t out_fence_fd; 557*4882a593Smuzhiyun 558*4882a593Smuzhiyun uint8_t handle_flag; 559*4882a593Smuzhiyun 560*4882a593Smuzhiyun /* RGA2 1106 add */ 561*4882a593Smuzhiyun struct rga_mosaic_info mosaic_info; 562*4882a593Smuzhiyun 563*4882a593Smuzhiyun uint8_t uvhds_mode; 564*4882a593Smuzhiyun uint8_t uvvds_mode; 565*4882a593Smuzhiyun 566*4882a593Smuzhiyun struct rga_osd_info osd_info; 567*4882a593Smuzhiyun 568*4882a593Smuzhiyun struct rga_pre_intr_info pre_intr_info; 569*4882a593Smuzhiyun 570*4882a593Smuzhiyun uint8_t reservr[59]; 571*4882a593Smuzhiyun }; 572*4882a593Smuzhiyun 573*4882a593Smuzhiyun struct rga_user_ctx_t { 574*4882a593Smuzhiyun uint64_t cmd_ptr; 575*4882a593Smuzhiyun uint32_t cmd_num; 576*4882a593Smuzhiyun uint32_t id; 577*4882a593Smuzhiyun uint32_t sync_mode; 578*4882a593Smuzhiyun uint32_t out_fence_fd; 579*4882a593Smuzhiyun 580*4882a593Smuzhiyun uint32_t mpi_config_flags; 581*4882a593Smuzhiyun 582*4882a593Smuzhiyun uint8_t reservr[124]; 583*4882a593Smuzhiyun }; 584*4882a593Smuzhiyun 585*4882a593Smuzhiyun #ifdef __cplusplus 586*4882a593Smuzhiyun } 587*4882a593Smuzhiyun #endif 588*4882a593Smuzhiyun 589*4882a593Smuzhiyun #endif /*_RK29_IPP_DRIVER_H_*/ 590