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#include <stdint.h> 233d0407baSopenharmony_ci#include <errno.h> 243d0407baSopenharmony_ci//#include <sys/cdefs.h> 253d0407baSopenharmony_ci 263d0407baSopenharmony_ci#include "rga.h" 273d0407baSopenharmony_ci 283d0407baSopenharmony_ci#ifdef ANDROID 293d0407baSopenharmony_ci#define DRMRGA_HARDWARE_MODULE_ID "librga" 303d0407baSopenharmony_ci 313d0407baSopenharmony_ci#include <hardware/gralloc.h> 323d0407baSopenharmony_ci#include <hardware/hardware.h> 333d0407baSopenharmony_ci#include <system/graphics.h> 343d0407baSopenharmony_ci#include <cutils/native_handle.h> 353d0407baSopenharmony_ci 363d0407baSopenharmony_ci#ifdef ANDROID_12 373d0407baSopenharmony_ci#include <hardware/hardware_rockchip.h> 383d0407baSopenharmony_ci#endif 393d0407baSopenharmony_ci 403d0407baSopenharmony_ci#endif 413d0407baSopenharmony_ci 423d0407baSopenharmony_ci#ifndef ANDROID /* LINUX */ 433d0407baSopenharmony_ci/* flip source image horizontally (around the vertical axis) */ 443d0407baSopenharmony_ci#define HAL_TRANSFORM_FLIP_H 0x01 453d0407baSopenharmony_ci/* flip source image vertically (around the horizontal axis)*/ 463d0407baSopenharmony_ci#define HAL_TRANSFORM_FLIP_V 0x02 473d0407baSopenharmony_ci/* rotate source image 90 degrees clockwise */ 483d0407baSopenharmony_ci#define HAL_TRANSFORM_ROT_90 0x04 493d0407baSopenharmony_ci/* rotate source image 180 degrees */ 503d0407baSopenharmony_ci#define HAL_TRANSFORM_ROT_180 0x03 513d0407baSopenharmony_ci/* rotate source image 270 degrees clockwise */ 523d0407baSopenharmony_ci#define HAL_TRANSFORM_ROT_270 0x07 533d0407baSopenharmony_ci#endif 543d0407baSopenharmony_ci 553d0407baSopenharmony_ci#define HAL_TRANSFORM_FLIP_H_V 0x08 563d0407baSopenharmony_ci 573d0407baSopenharmony_ci/*****************************************************************************/ 583d0407baSopenharmony_ci 593d0407baSopenharmony_ci/* for compatibility */ 603d0407baSopenharmony_ci#define DRM_RGA_MODULE_API_VERSION HWC_MODULE_API_VERSION_0_1 613d0407baSopenharmony_ci#define DRM_RGA_DEVICE_API_VERSION HWC_DEVICE_API_VERSION_0_1 623d0407baSopenharmony_ci#define DRM_RGA_API_VERSION HWC_DEVICE_API_VERSION 633d0407baSopenharmony_ci 643d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_ROT_MASK 0x0000000F 653d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_ROT_0 0x00000000 663d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_ROT_90 HAL_TRANSFORM_ROT_90 673d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_ROT_180 HAL_TRANSFORM_ROT_180 683d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_ROT_270 HAL_TRANSFORM_ROT_270 693d0407baSopenharmony_ci 703d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_FLIP_MASK 0x00000003 713d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_FLIP_H HAL_TRANSFORM_FLIP_H 723d0407baSopenharmony_ci#define DRM_RGA_TRANSFORM_FLIP_V HAL_TRANSFORM_FLIP_V 733d0407baSopenharmony_ci 743d0407baSopenharmony_cienum { 753d0407baSopenharmony_ci AWIDTH = 0, 763d0407baSopenharmony_ci AHEIGHT, 773d0407baSopenharmony_ci ASTRIDE, 783d0407baSopenharmony_ci AFORMAT, 793d0407baSopenharmony_ci ASIZE, 803d0407baSopenharmony_ci ATYPE, 813d0407baSopenharmony_ci}; 823d0407baSopenharmony_ci/*****************************************************************************/ 833d0407baSopenharmony_ci 843d0407baSopenharmony_ci#ifndef ANDROID 853d0407baSopenharmony_ci/* memory type definitions. */ 863d0407baSopenharmony_cienum drm_rockchip_gem_mem_type { 873d0407baSopenharmony_ci /* Physically Continuous memory and used as default. */ 883d0407baSopenharmony_ci ROCKCHIP_BO_CONTIG = 1 << 0, 893d0407baSopenharmony_ci /* cachable mapping. */ 903d0407baSopenharmony_ci ROCKCHIP_BO_CACHABLE = 1 << 1, 913d0407baSopenharmony_ci /* write-combine mapping. */ 923d0407baSopenharmony_ci ROCKCHIP_BO_WC = 1 << 2, 933d0407baSopenharmony_ci ROCKCHIP_BO_SECURE = 1 << 3, 943d0407baSopenharmony_ci ROCKCHIP_BO_MASK = ROCKCHIP_BO_CONTIG | ROCKCHIP_BO_CACHABLE | 953d0407baSopenharmony_ci ROCKCHIP_BO_WC | ROCKCHIP_BO_SECURE 963d0407baSopenharmony_ci}; 973d0407baSopenharmony_ci 983d0407baSopenharmony_citypedef struct bo { 993d0407baSopenharmony_ci int fd; 1003d0407baSopenharmony_ci void *ptr; 1013d0407baSopenharmony_ci size_t size; 1023d0407baSopenharmony_ci size_t offset; 1033d0407baSopenharmony_ci size_t pitch; 1043d0407baSopenharmony_ci unsigned handle; 1053d0407baSopenharmony_ci} bo_t; 1063d0407baSopenharmony_ci#endif 1073d0407baSopenharmony_ci 1083d0407baSopenharmony_ci/* 1093d0407baSopenharmony_ci @value size: user not need care about.For avoid read/write out of memory 1103d0407baSopenharmony_ci */ 1113d0407baSopenharmony_citypedef struct rga_rect { 1123d0407baSopenharmony_ci int xoffset; 1133d0407baSopenharmony_ci int yoffset; 1143d0407baSopenharmony_ci int width; 1153d0407baSopenharmony_ci int height; 1163d0407baSopenharmony_ci int wstride; 1173d0407baSopenharmony_ci int hstride; 1183d0407baSopenharmony_ci int format; 1193d0407baSopenharmony_ci int size; 1203d0407baSopenharmony_ci} rga_rect_t; 1213d0407baSopenharmony_ci 1223d0407baSopenharmony_citypedef struct rga_nn { 1233d0407baSopenharmony_ci int nn_flag; 1243d0407baSopenharmony_ci int scale_r; 1253d0407baSopenharmony_ci int scale_g; 1263d0407baSopenharmony_ci int scale_b; 1273d0407baSopenharmony_ci int offset_r; 1283d0407baSopenharmony_ci int offset_g; 1293d0407baSopenharmony_ci int offset_b; 1303d0407baSopenharmony_ci} rga_nn_t; 1313d0407baSopenharmony_ci 1323d0407baSopenharmony_citypedef struct rga_dither { 1333d0407baSopenharmony_ci int enable; 1343d0407baSopenharmony_ci int mode; 1353d0407baSopenharmony_ci int lut0_l; 1363d0407baSopenharmony_ci int lut0_h; 1373d0407baSopenharmony_ci int lut1_l; 1383d0407baSopenharmony_ci int lut1_h; 1393d0407baSopenharmony_ci} rga_dither_t; 1403d0407baSopenharmony_ci 1413d0407baSopenharmony_ci/* 1423d0407baSopenharmony_ci @value fd: use fd to share memory, it can be ion shard fd,and dma fd. 1433d0407baSopenharmony_ci @value virAddr:userspace address 1443d0407baSopenharmony_ci @value phyAddr:use phy address 1453d0407baSopenharmony_ci @value hnd: use buffer_handle_t 1463d0407baSopenharmony_ci */ 1473d0407baSopenharmony_citypedef struct rga_info { 1483d0407baSopenharmony_ci int fd; 1493d0407baSopenharmony_ci void *virAddr; 1503d0407baSopenharmony_ci void *phyAddr; 1513d0407baSopenharmony_ci#ifndef ANDROID /* LINUX */ 1523d0407baSopenharmony_ci unsigned hnd; 1533d0407baSopenharmony_ci#else /* Android */ 1543d0407baSopenharmony_ci buffer_handle_t hnd; 1553d0407baSopenharmony_ci#endif 1563d0407baSopenharmony_ci int format; 1573d0407baSopenharmony_ci rga_rect_t rect; 1583d0407baSopenharmony_ci unsigned int blend; 1593d0407baSopenharmony_ci int bufferSize; 1603d0407baSopenharmony_ci int rotation; 1613d0407baSopenharmony_ci int color; 1623d0407baSopenharmony_ci int testLog; 1633d0407baSopenharmony_ci int mmuFlag; 1643d0407baSopenharmony_ci int colorkey_en; 1653d0407baSopenharmony_ci int colorkey_mode; 1663d0407baSopenharmony_ci int colorkey_max; 1673d0407baSopenharmony_ci int colorkey_min; 1683d0407baSopenharmony_ci int scale_mode; 1693d0407baSopenharmony_ci int color_space_mode; 1703d0407baSopenharmony_ci int sync_mode; 1713d0407baSopenharmony_ci rga_nn_t nn; 1723d0407baSopenharmony_ci rga_dither_t dither; 1733d0407baSopenharmony_ci int rop_code; 1743d0407baSopenharmony_ci int rd_mode; 1753d0407baSopenharmony_ci unsigned short is_10b_compact; 1763d0407baSopenharmony_ci unsigned short is_10b_endian; 1773d0407baSopenharmony_ci 1783d0407baSopenharmony_ci int in_fence_fd; 1793d0407baSopenharmony_ci int out_fence_fd; 1803d0407baSopenharmony_ci 1813d0407baSopenharmony_ci int core; 1823d0407baSopenharmony_ci int priority; 1833d0407baSopenharmony_ci 1843d0407baSopenharmony_ci unsigned short enable; 1853d0407baSopenharmony_ci 1863d0407baSopenharmony_ci int handle; 1873d0407baSopenharmony_ci 1883d0407baSopenharmony_ci struct rga_mosaic_info mosaic_info; 1893d0407baSopenharmony_ci 1903d0407baSopenharmony_ci struct rga_osd_info osd_info; 1913d0407baSopenharmony_ci 1923d0407baSopenharmony_ci struct rga_pre_intr_info pre_intr; 1933d0407baSopenharmony_ci 1943d0407baSopenharmony_ci int mpi_mode; 1953d0407baSopenharmony_ci int ctx_id; 1963d0407baSopenharmony_ci 1973d0407baSopenharmony_ci char reserve[402]; 1983d0407baSopenharmony_ci} rga_info_t; 1993d0407baSopenharmony_ci 2003d0407baSopenharmony_ci 2013d0407baSopenharmony_citypedef struct drm_rga { 2023d0407baSopenharmony_ci rga_rect_t src; 2033d0407baSopenharmony_ci rga_rect_t dst; 2043d0407baSopenharmony_ci} drm_rga_t; 2053d0407baSopenharmony_ci 2063d0407baSopenharmony_ci/* 2073d0407baSopenharmony_ci @fun rga_set_rect:For use to set the rects esayly 2083d0407baSopenharmony_ci 2093d0407baSopenharmony_ci @param rect:The rect user want to set,like setting the src rect: 2103d0407baSopenharmony_ci drm_rga_t rects; 2113d0407baSopenharmony_ci rga_set_rect(rects.src,0,0,1920,1080,1920,NV12); 2123d0407baSopenharmony_ci mean to set the src rect to the value. 2133d0407baSopenharmony_ci */ 2143d0407baSopenharmony_cistatic inline int rga_set_rect(rga_rect_t *rect, 2153d0407baSopenharmony_ci int x, int y, int w, int h, int sw, int sh, int f) { 2163d0407baSopenharmony_ci if (!rect) 2173d0407baSopenharmony_ci return -EINVAL; 2183d0407baSopenharmony_ci 2193d0407baSopenharmony_ci rect->xoffset = x; 2203d0407baSopenharmony_ci rect->yoffset = y; 2213d0407baSopenharmony_ci rect->width = w; 2223d0407baSopenharmony_ci rect->height = h; 2233d0407baSopenharmony_ci rect->wstride = sw; 2243d0407baSopenharmony_ci rect->hstride = sh; 2253d0407baSopenharmony_ci rect->format = f; 2263d0407baSopenharmony_ci 2273d0407baSopenharmony_ci return 0; 2283d0407baSopenharmony_ci} 2293d0407baSopenharmony_ci 2303d0407baSopenharmony_ci#ifndef ANDROID /* LINUX */ 2313d0407baSopenharmony_cistatic inline void rga_set_rotation(rga_info_t *info, int angle) { 2323d0407baSopenharmony_ci if (angle == 90) 2333d0407baSopenharmony_ci info->rotation = HAL_TRANSFORM_ROT_90; 2343d0407baSopenharmony_ci else if (angle == 180) 2353d0407baSopenharmony_ci info->rotation = HAL_TRANSFORM_ROT_180; 2363d0407baSopenharmony_ci else if (angle == 270) 2373d0407baSopenharmony_ci info->rotation = HAL_TRANSFORM_ROT_270; 2383d0407baSopenharmony_ci} 2393d0407baSopenharmony_ci#endif 2403d0407baSopenharmony_ci/*****************************************************************************/ 2413d0407baSopenharmony_ci 2423d0407baSopenharmony_ci#endif 243