13d0407baSopenharmony_ci/* 23d0407baSopenharmony_ci * Copyright (C) 2016 Rockchip Electronics Co., Ltd. 33d0407baSopenharmony_ci * Authors: 43d0407baSopenharmony_ci * Zhiqin Wei <wzq@rock-chips.com> 53d0407baSopenharmony_ci * 63d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 73d0407baSopenharmony_ci * you may not use this file except in compliance with the License. 83d0407baSopenharmony_ci * You may obtain a copy of the License at 93d0407baSopenharmony_ci * 103d0407baSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 113d0407baSopenharmony_ci * 123d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 133d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 143d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 153d0407baSopenharmony_ci * See the License for the specific language governing permissions and 163d0407baSopenharmony_ci * limitations under the License. 173d0407baSopenharmony_ci */ 183d0407baSopenharmony_ci 193d0407baSopenharmony_ci#ifndef _rk_drm_rga_ 203d0407baSopenharmony_ci#define _rk_drm_rga_ 213d0407baSopenharmony_ci 223d0407baSopenharmony_ci/* flip source image horizontally (around the vertical axis) */ 233d0407baSopenharmony_ci#define HAL_TRANSFORM_FLIP_H 0x01 243d0407baSopenharmony_ci/* flip source image vertically (around the horizontal axis) */ 253d0407baSopenharmony_ci#define HAL_TRANSFORM_FLIP_V 0x02 263d0407baSopenharmony_ci/* rotate source image 90 degrees clockwise */ 273d0407baSopenharmony_ci#define HAL_TRANSFORM_ROT_90 0x04 283d0407baSopenharmony_ci/* rotate source image 180 degrees */ 293d0407baSopenharmony_ci#define HAL_TRANSFORM_ROT_180 0x03 303d0407baSopenharmony_ci/* rotate source image 270 degrees clockwise */ 313d0407baSopenharmony_ci#define HAL_TRANSFORM_ROT_270 0x07 323d0407baSopenharmony_ci 333d0407baSopenharmony_ci#define HAL_TRANSFORM_FLIP_H_V 0x08 343d0407baSopenharmony_ci 353d0407baSopenharmony_ci/*****************************************************************************/ 363d0407baSopenharmony_ci 373d0407baSopenharmony_ci/* for compatibility */ 383d0407baSopenharmony_ci 393d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_ROT_MASK 0x0000000F 403d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_ROT_0 0x00000000 413d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_ROT_90 HAL_TRANSFORM_ROT_90 423d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_ROT_180 HAL_TRANSFORM_ROT_180 433d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_ROT_270 HAL_TRANSFORM_ROT_270 443d0407baSopenharmony_ci 453d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_FLIP_MASK 0x00000003 463d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_FLIP_H HAL_TRANSFORM_FLIP_H 473d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_FLIP_V HAL_TRANSFORM_FLIP_V 483d0407baSopenharmony_ci 493d0407baSopenharmony_cienum { 503d0407baSopenharmony_ci AWIDTH = 0, 513d0407baSopenharmony_ci AHEIGHT, 523d0407baSopenharmony_ci ASTRIDE, 533d0407baSopenharmony_ci AFORMAT, 543d0407baSopenharmony_ci ASIZE, 553d0407baSopenharmony_ci ATYPE, 563d0407baSopenharmony_ci}; 573d0407baSopenharmony_ci/*****************************************************************************/ 583d0407baSopenharmony_ci 593d0407baSopenharmony_ci/* memory type definitions. */ 603d0407baSopenharmony_cienum drm_rockchip_gem_mem_type { 613d0407baSopenharmony_ci /* Physically Continuous memory and used as default. */ 623d0407baSopenharmony_ci ROCKCHIP_BO_CONTIG = 1 << 0, 633d0407baSopenharmony_ci /* cachable mapping. */ 643d0407baSopenharmony_ci ROCKCHIP_BO_CACHABLE = 1 << 1, 653d0407baSopenharmony_ci /* write-combine mapping. */ 663d0407baSopenharmony_ci ROCKCHIP_BO_WC = 1 << 2, 673d0407baSopenharmony_ci ROCKCHIP_BO_SECURE = 1 << 3, 683d0407baSopenharmony_ci ROCKCHIP_BO_MASK = ROCKCHIP_BO_CONTIG | ROCKCHIP_BO_CACHABLE | 693d0407baSopenharmony_ci ROCKCHIP_BO_WC | ROCKCHIP_BO_SECURE 703d0407baSopenharmony_ci}; 713d0407baSopenharmony_ci 723d0407baSopenharmony_citypedef struct bo { 733d0407baSopenharmony_ci int fd; 743d0407baSopenharmony_ci void *ptr; 753d0407baSopenharmony_ci size_t size; 763d0407baSopenharmony_ci size_t offset; 773d0407baSopenharmony_ci size_t pitch; 783d0407baSopenharmony_ci unsigned handle; 793d0407baSopenharmony_ci} bo_t; 803d0407baSopenharmony_ci 813d0407baSopenharmony_ci/* 823d0407baSopenharmony_ci @value size: user not need care about.For avoid read/write out of memory 833d0407baSopenharmony_ci */ 843d0407baSopenharmony_citypedef struct rga_rect { 853d0407baSopenharmony_ci int xoffset; 863d0407baSopenharmony_ci int yoffset; 873d0407baSopenharmony_ci int width; 883d0407baSopenharmony_ci int height; 893d0407baSopenharmony_ci int wstride; 903d0407baSopenharmony_ci int hstride; 913d0407baSopenharmony_ci int format; 923d0407baSopenharmony_ci int size; 933d0407baSopenharmony_ci} rga_rect_t; 943d0407baSopenharmony_ci 953d0407baSopenharmony_citypedef struct rga_nn { 963d0407baSopenharmony_ci int nn_flag; 973d0407baSopenharmony_ci int scale_r; 983d0407baSopenharmony_ci int scale_g; 993d0407baSopenharmony_ci int scale_b; 1003d0407baSopenharmony_ci int offset_r; 1013d0407baSopenharmony_ci int offset_g; 1023d0407baSopenharmony_ci int offset_b; 1033d0407baSopenharmony_ci} rga_nn_t; 1043d0407baSopenharmony_ci 1053d0407baSopenharmony_citypedef struct rga_dither { 1063d0407baSopenharmony_ci int enable; 1073d0407baSopenharmony_ci int mode; 1083d0407baSopenharmony_ci int lut0_l; 1093d0407baSopenharmony_ci int lut0_h; 1103d0407baSopenharmony_ci int lut1_l; 1113d0407baSopenharmony_ci int lut1_h; 1123d0407baSopenharmony_ci} rga_dither_t; 1133d0407baSopenharmony_ci 1143d0407baSopenharmony_ci/* 1153d0407baSopenharmony_ci @value fd: use fd to share memory, it can be ion shard fd,and dma fd. 1163d0407baSopenharmony_ci @value virAddr:userspace address 1173d0407baSopenharmony_ci @value phyAddr:use phy address 1183d0407baSopenharmony_ci @value hnd: use buffer_handle_t 1193d0407baSopenharmony_ci */ 1203d0407baSopenharmony_citypedef struct rga_info { 1213d0407baSopenharmony_ci int fd; 1223d0407baSopenharmony_ci void *virAddr; 1233d0407baSopenharmony_ci void *phyAddr; 1243d0407baSopenharmony_ci unsigned hnd; 1253d0407baSopenharmony_ci int format; 1263d0407baSopenharmony_ci rga_rect_t rect; 1273d0407baSopenharmony_ci unsigned int blend; 1283d0407baSopenharmony_ci int bufferSize; 1293d0407baSopenharmony_ci int rotation; 1303d0407baSopenharmony_ci int color; 1313d0407baSopenharmony_ci int testLog; 1323d0407baSopenharmony_ci int mmuFlag; 1333d0407baSopenharmony_ci int colorkey_en; 1343d0407baSopenharmony_ci int colorkey_mode; 1353d0407baSopenharmony_ci int colorkey_max; 1363d0407baSopenharmony_ci int colorkey_min; 1373d0407baSopenharmony_ci int scale_mode; 1383d0407baSopenharmony_ci int color_space_mode; 1393d0407baSopenharmony_ci int sync_mode; 1403d0407baSopenharmony_ci rga_nn_t nn; 1413d0407baSopenharmony_ci rga_dither_t dither; 1423d0407baSopenharmony_ci int rop_code; 1433d0407baSopenharmony_ci int reserve[127]; 1443d0407baSopenharmony_ci} rga_info_t; 1453d0407baSopenharmony_ci 1463d0407baSopenharmony_ci 1473d0407baSopenharmony_citypedef struct drm_rga { 1483d0407baSopenharmony_ci rga_rect_t src; 1493d0407baSopenharmony_ci rga_rect_t dst; 1503d0407baSopenharmony_ci} drm_rga_t; 1513d0407baSopenharmony_ci 1523d0407baSopenharmony_ci/* 1533d0407baSopenharmony_ci @fun rga_set_rect:For use to set the rects esayly 1543d0407baSopenharmony_ci 1553d0407baSopenharmony_ci @param rect:The rect user want to set,like setting the src rect: 1563d0407baSopenharmony_ci drm_rga_t rects; 1573d0407baSopenharmony_ci rga_set_rect(rects.src,0,0,1920,1080,1920,NV12); 1583d0407baSopenharmony_ci mean to set the src rect to the value. 1593d0407baSopenharmony_ci */ 1603d0407baSopenharmony_cistatic inline int rga_set_rect(rga_rect_t *rect, int x, int y, int w, int h, int sw, int sh, int f) 1613d0407baSopenharmony_ci{ 1623d0407baSopenharmony_ci if (!rect) { 1633d0407baSopenharmony_ci return -EINVAL; 1643d0407baSopenharmony_ci } 1653d0407baSopenharmony_ci rect->xoffset = x; 1663d0407baSopenharmony_ci rect->yoffset = y; 1673d0407baSopenharmony_ci rect->width = w; 1683d0407baSopenharmony_ci rect->height = h; 1693d0407baSopenharmony_ci rect->wstride = sw; 1703d0407baSopenharmony_ci rect->hstride = sh; 1713d0407baSopenharmony_ci rect->format = f; 1723d0407baSopenharmony_ci return 0; 1733d0407baSopenharmony_ci} 1743d0407baSopenharmony_ci 1753d0407baSopenharmony_cistatic inline void rga_set_rotation(rga_info_t *info, int angle) 1763d0407baSopenharmony_ci{ 1773d0407baSopenharmony_ci if (angle == 90) { // 90:HAL_TRANSFORM_ROT 1783d0407baSopenharmony_ci info->rotation = HAL_TRANSFORM_ROT_90; 1793d0407baSopenharmony_ci } else if (angle == 180) { // 180:HAL_TRANSFORM_ROT 1803d0407baSopenharmony_ci info->rotation = HAL_TRANSFORM_ROT_180; 1813d0407baSopenharmony_ci } else if (angle == 270) { // 270:HAL_TRANSFORM_ROT 1823d0407baSopenharmony_ci info->rotation = HAL_TRANSFORM_ROT_270; 1833d0407baSopenharmony_ci } 1843d0407baSopenharmony_ci} 1853d0407baSopenharmony_ci/*****************************************************************************/ 1863d0407baSopenharmony_ci 1873d0407baSopenharmony_ci#endif 188