1 /* 2 * Copyright (C) 2013 Samsung Electronics Co.Ltd 3 * Authors: 4 * Inki Dae <inki.dae@samsung.com> 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the next 14 * paragraph) shall be included in all copies or substantial portions of the 15 * Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 * OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26 #ifndef _FIMG2D_H_ 27 #define _FIMG2D_H_ 28 29 #define G2D_PLANE_MAX_NR 2 30 31 enum e_g2d_color_mode { 32 /* COLOR FORMAT */ 33 G2D_COLOR_FMT_XRGB8888, 34 G2D_COLOR_FMT_ARGB8888, 35 G2D_COLOR_FMT_RGB565, 36 G2D_COLOR_FMT_XRGB1555, 37 G2D_COLOR_FMT_ARGB1555, 38 G2D_COLOR_FMT_XRGB4444, 39 G2D_COLOR_FMT_ARGB4444, 40 G2D_COLOR_FMT_PRGB888, 41 G2D_COLOR_FMT_YCbCr444, 42 G2D_COLOR_FMT_YCbCr422, 43 G2D_COLOR_FMT_YCbCr420, 44 /* alpha 8bit */ 45 G2D_COLOR_FMT_A8, 46 /* Luminance 8bit: gray color */ 47 G2D_COLOR_FMT_L8, 48 /* alpha 1bit */ 49 G2D_COLOR_FMT_A1, 50 /* alpha 4bit */ 51 G2D_COLOR_FMT_A4, 52 G2D_COLOR_FMT_MASK, /* VER4.1 */ 53 54 /* COLOR ORDER */ 55 G2D_ORDER_AXRGB = (0 << 4), /* VER4.1 */ 56 G2D_ORDER_RGBAX = (1 << 4), /* VER4.1 */ 57 G2D_ORDER_AXBGR = (2 << 4), /* VER4.1 */ 58 G2D_ORDER_BGRAX = (3 << 4), /* VER4.1 */ 59 G2D_ORDER_MASK = (3 << 4), /* VER4.1 */ 60 61 /* Number of YCbCr plane */ 62 G2D_YCbCr_1PLANE = (0 << 8), /* VER4.1 */ 63 G2D_YCbCr_2PLANE = (1 << 8), /* VER4.1 */ 64 G2D_YCbCr_PLANE_MASK = (3 << 8), /* VER4.1 */ 65 66 /* Order in YCbCr */ 67 G2D_YCbCr_ORDER_CrY1CbY0 = (0 << 12), /* VER4.1 */ 68 G2D_YCbCr_ORDER_CbY1CrY0 = (1 << 12), /* VER4.1 */ 69 G2D_YCbCr_ORDER_Y1CrY0Cb = (2 << 12), /* VER4.1 */ 70 G2D_YCbCr_ORDER_Y1CbY0Cr = (3 << 12), /* VER4.1 */ 71 G2D_YCbCr_ORDER_CrCb = G2D_YCbCr_ORDER_CrY1CbY0, /* VER4.1 */ 72 G2D_YCbCr_ORDER_CbCr = G2D_YCbCr_ORDER_CbY1CrY0, /* VER4.1 */ 73 G2D_YCbCr_ORDER_MASK = (3 < 12), /* VER4.1 */ 74 75 /* CSC */ 76 G2D_CSC_601 = (0 << 16), /* VER4.1 */ 77 G2D_CSC_709 = (1 << 16), /* VER4.1 */ 78 G2D_CSC_MASK = (1 << 16), /* VER4.1 */ 79 80 /* Valid value range of YCbCr */ 81 G2D_YCbCr_RANGE_NARROW = (0 << 17), /* VER4.1 */ 82 G2D_YCbCr_RANGE_WIDE = (1 << 17), /* VER4.1 */ 83 G2D_YCbCr_RANGE_MASK = (1 << 17), /* VER4.1 */ 84 85 G2D_COLOR_MODE_MASK = 0xFFFFFFFF, 86 }; 87 88 enum e_g2d_select_mode { 89 G2D_SELECT_MODE_NORMAL = (0 << 0), 90 G2D_SELECT_MODE_FGCOLOR = (1 << 0), 91 G2D_SELECT_MODE_BGCOLOR = (2 << 0), 92 }; 93 94 enum e_g2d_repeat_mode { 95 G2D_REPEAT_MODE_REPEAT, 96 G2D_REPEAT_MODE_PAD, 97 G2D_REPEAT_MODE_REFLECT, 98 G2D_REPEAT_MODE_CLAMP, 99 G2D_REPEAT_MODE_NONE, 100 }; 101 102 enum e_g2d_scale_mode { 103 G2D_SCALE_MODE_NONE = 0, 104 G2D_SCALE_MODE_NEAREST, 105 G2D_SCALE_MODE_BILINEAR, 106 G2D_SCALE_MODE_MAX, 107 }; 108 109 enum e_g2d_buf_type { 110 G2D_IMGBUF_COLOR, 111 G2D_IMGBUF_GEM, 112 G2D_IMGBUF_USERPTR, 113 }; 114 115 enum e_g2d_rop3_type { 116 G2D_ROP3_DST = 0xAA, 117 G2D_ROP3_SRC = 0xCC, 118 G2D_ROP3_3RD = 0xF0, 119 G2D_ROP3_MASK = 0xFF, 120 }; 121 122 enum e_g2d_select_alpha_src { 123 G2D_SELECT_SRC_FOR_ALPHA_BLEND, /* VER4.1 */ 124 G2D_SELECT_ROP_FOR_ALPHA_BLEND, /* VER4.1 */ 125 }; 126 127 enum e_g2d_transparent_mode { 128 G2D_TRANSPARENT_MODE_OPAQUE, 129 G2D_TRANSPARENT_MODE_TRANSPARENT, 130 G2D_TRANSPARENT_MODE_BLUESCREEN, 131 G2D_TRANSPARENT_MODE_MAX, 132 }; 133 134 enum e_g2d_color_key_mode { 135 G2D_COLORKEY_MODE_DISABLE = 0, 136 G2D_COLORKEY_MODE_SRC_RGBA = (1<<0), 137 G2D_COLORKEY_MODE_DST_RGBA = (1<<1), 138 G2D_COLORKEY_MODE_SRC_YCbCr = (1<<2), /* VER4.1 */ 139 G2D_COLORKEY_MODE_DST_YCbCr = (1<<3), /* VER4.1 */ 140 G2D_COLORKEY_MODE_MASK = 15, 141 }; 142 143 enum e_g2d_alpha_blend_mode { 144 G2D_ALPHA_BLEND_MODE_DISABLE, 145 G2D_ALPHA_BLEND_MODE_ENABLE, 146 G2D_ALPHA_BLEND_MODE_FADING, /* VER3.0 */ 147 G2D_ALPHA_BLEND_MODE_MAX, 148 }; 149 150 enum e_g2d_op { 151 G2D_OP_CLEAR = 0x00, 152 G2D_OP_SRC = 0x01, 153 G2D_OP_DST = 0x02, 154 G2D_OP_OVER = 0x03, 155 G2D_OP_INTERPOLATE = 0x04, 156 G2D_OP_DISJOINT_CLEAR = 0x10, 157 G2D_OP_DISJOINT_SRC = 0x11, 158 G2D_OP_DISJOINT_DST = 0x12, 159 G2D_OP_CONJOINT_CLEAR = 0x20, 160 G2D_OP_CONJOINT_SRC = 0x21, 161 G2D_OP_CONJOINT_DST = 0x22, 162 }; 163 164 /* 165 * The G2D_COEFF_MODE_DST_{COLOR,ALPHA} modes both use the ALPHA_REG(0x618) 166 * register. The registers fields are as follows: 167 * bits 31:8 = color value (RGB order) 168 * bits 7:0 = alpha value 169 */ 170 enum e_g2d_coeff_mode { 171 G2D_COEFF_MODE_ONE, 172 G2D_COEFF_MODE_ZERO, 173 G2D_COEFF_MODE_SRC_ALPHA, 174 G2D_COEFF_MODE_SRC_COLOR, 175 G2D_COEFF_MODE_DST_ALPHA, 176 G2D_COEFF_MODE_DST_COLOR, 177 /* Global Alpha : Set by ALPHA_REG(0x618) */ 178 G2D_COEFF_MODE_GB_ALPHA, 179 /* Global Color and Alpha : Set by ALPHA_REG(0x618) */ 180 G2D_COEFF_MODE_GB_COLOR, 181 /* (1-SRC alpha)/DST Alpha */ 182 G2D_COEFF_MODE_DISJOINT_S, 183 /* (1-DST alpha)/SRC Alpha */ 184 G2D_COEFF_MODE_DISJOINT_D, 185 /* SRC alpha/DST alpha */ 186 G2D_COEFF_MODE_CONJOINT_S, 187 /* DST alpha/SRC alpha */ 188 G2D_COEFF_MODE_CONJOINT_D, 189 /* DST alpha/SRC alpha */ 190 G2D_COEFF_MODE_MASK 191 }; 192 193 enum e_g2d_acoeff_mode { 194 G2D_ACOEFF_MODE_A, /* alpha */ 195 G2D_ACOEFF_MODE_APGA, /* alpha + global alpha */ 196 G2D_ACOEFF_MODE_AMGA, /* alpha * global alpha */ 197 G2D_ACOEFF_MODE_MASK 198 }; 199 200 union g2d_point_val { 201 unsigned int val; 202 struct { 203 /* 204 * Coordinate of Source Image 205 * Range: 0 ~ 8000 (Requirement: SrcLeftX < SrcRightX) 206 * In YCbCr 422 and YCbCr 420 format with even number. 207 */ 208 unsigned int x:16; 209 /* 210 * Y Coordinate of Source Image 211 * Range: 0 ~ 8000 (Requirement: SrcTopY < SrcBottomY) 212 * In YCbCr 420 format with even number. 213 */ 214 unsigned int y:16; 215 } data; 216 }; 217 218 union g2d_rop4_val { 219 unsigned int val; 220 struct { 221 enum e_g2d_rop3_type unmasked_rop3:8; 222 enum e_g2d_rop3_type masked_rop3:8; 223 unsigned int reserved:16; 224 } data; 225 }; 226 227 union g2d_bitblt_cmd_val { 228 unsigned int val; 229 struct { 230 /* [0:3] */ 231 unsigned int mask_rop4_en:1; 232 unsigned int masking_en:1; 233 enum e_g2d_select_alpha_src rop4_alpha_en:1; 234 unsigned int dither_en:1; 235 /* [4:7] */ 236 unsigned int resolved1:4; 237 /* [8:11] */ 238 unsigned int cw_en:4; 239 /* [12:15] */ 240 enum e_g2d_transparent_mode transparent_mode:4; 241 /* [16:19] */ 242 enum e_g2d_color_key_mode color_key_mode:4; 243 /* [20:23] */ 244 enum e_g2d_alpha_blend_mode alpha_blend_mode:4; 245 /* [24:27] */ 246 unsigned int src_pre_multiply:1; 247 unsigned int pat_pre_multiply:1; 248 unsigned int dst_pre_multiply:1; 249 unsigned int dst_depre_multiply:1; 250 /* [28:31] */ 251 unsigned int fast_solid_color_fill_en:1; 252 unsigned int reserved:3; 253 } data; 254 }; 255 256 union g2d_blend_func_val { 257 unsigned int val; 258 struct { 259 /* [0:15] */ 260 enum e_g2d_coeff_mode src_coeff:4; 261 enum e_g2d_acoeff_mode src_coeff_src_a:2; 262 enum e_g2d_acoeff_mode src_coeff_dst_a:2; 263 enum e_g2d_coeff_mode dst_coeff:4; 264 enum e_g2d_acoeff_mode dst_coeff_src_a:2; 265 enum e_g2d_acoeff_mode dst_coeff_dst_a:2; 266 /* [16:19] */ 267 unsigned int inv_src_color_coeff:1; 268 unsigned int resoled1:1; 269 unsigned int inv_dst_color_coeff:1; 270 unsigned int resoled2:1; 271 /* [20:23] */ 272 unsigned int lighten_en:1; 273 unsigned int darken_en:1; 274 unsigned int win_ce_src_over_en:2; 275 /* [24:31] */ 276 unsigned int reserved:8; 277 } data; 278 }; 279 280 struct g2d_image { 281 enum e_g2d_select_mode select_mode; 282 enum e_g2d_color_mode color_mode; 283 enum e_g2d_repeat_mode repeat_mode; 284 enum e_g2d_scale_mode scale_mode; 285 unsigned int xscale; 286 unsigned int yscale; 287 unsigned char rotate_90; 288 unsigned char x_dir; 289 unsigned char y_dir; 290 unsigned char component_alpha; 291 unsigned int width; 292 unsigned int height; 293 unsigned int stride; 294 unsigned int need_free; 295 unsigned int color; 296 enum e_g2d_buf_type buf_type; 297 unsigned int bo[G2D_PLANE_MAX_NR]; 298 struct drm_exynos_g2d_userptr user_ptr[G2D_PLANE_MAX_NR]; 299 void *mapped_ptr[G2D_PLANE_MAX_NR]; 300 }; 301 302 struct g2d_context; 303 304 struct g2d_context *g2d_init(int fd); 305 void g2d_fini(struct g2d_context *ctx); 306 void g2d_config_event(struct g2d_context *ctx, void *userdata); 307 int g2d_exec(struct g2d_context *ctx); 308 int g2d_solid_fill(struct g2d_context *ctx, struct g2d_image *img, 309 unsigned int x, unsigned int y, unsigned int w, 310 unsigned int h); 311 int g2d_copy(struct g2d_context *ctx, struct g2d_image *src, 312 struct g2d_image *dst, unsigned int src_x, 313 unsigned int src_y, unsigned int dst_x, unsigned int dst_y, 314 unsigned int w, unsigned int h); 315 int g2d_move(struct g2d_context *ctx, struct g2d_image *img, 316 unsigned int src_x, unsigned int src_y, unsigned int dst_x, 317 unsigned dst_y, unsigned int w, unsigned int h); 318 int g2d_copy_with_scale(struct g2d_context *ctx, struct g2d_image *src, 319 struct g2d_image *dst, unsigned int src_x, 320 unsigned int src_y, unsigned int src_w, 321 unsigned int src_h, unsigned int dst_x, 322 unsigned int dst_y, unsigned int dst_w, 323 unsigned int dst_h, unsigned int negative); 324 int g2d_blend(struct g2d_context *ctx, struct g2d_image *src, 325 struct g2d_image *dst, unsigned int src_x, 326 unsigned int src_y, unsigned int dst_x, unsigned int dst_y, 327 unsigned int w, unsigned int h, enum e_g2d_op op); 328 int g2d_scale_and_blend(struct g2d_context *ctx, struct g2d_image *src, 329 struct g2d_image *dst, unsigned int src_x, unsigned int src_y, 330 unsigned int src_w, unsigned int src_h, unsigned int dst_x, 331 unsigned int dst_y, unsigned int dst_w, unsigned int dst_h, 332 enum e_g2d_op op); 333 #endif /* _FIMG2D_H_ */ 334