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