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 _RGA_DRIVER_H_
203d0407baSopenharmony_ci#define _RGA_DRIVER_H_
213d0407baSopenharmony_ci
223d0407baSopenharmony_ci#include <asm/ioctl.h>
233d0407baSopenharmony_ci#include <stdint.h>
243d0407baSopenharmony_ci
253d0407baSopenharmony_ci#ifdef __cplusplus
263d0407baSopenharmony_ciextern "C"
273d0407baSopenharmony_ci{
283d0407baSopenharmony_ci#endif
293d0407baSopenharmony_ci
303d0407baSopenharmony_ci/* Use 'r' as magic number */
313d0407baSopenharmony_ci#define RGA_IOC_MAGIC       'r'
323d0407baSopenharmony_ci#define RGA_IOW(nr, type)   _IOW(RGA_IOC_MAGIC, nr, type)
333d0407baSopenharmony_ci#define RGA_IOR(nr, type)   _IOR(RGA_IOC_MAGIC, nr, type)
343d0407baSopenharmony_ci#define RGA_IOWR(nr, type)  _IOWR(RGA_IOC_MAGIC, nr, type)
353d0407baSopenharmony_ci
363d0407baSopenharmony_ci#define RGA_IOC_GET_DRVIER_VERSION  RGA_IOR(0x1, struct rga_version_t)
373d0407baSopenharmony_ci#define RGA_IOC_GET_HW_VERSION      RGA_IOR(0x2, struct rga_hw_versions_t)
383d0407baSopenharmony_ci#define RGA_IOC_IMPORT_BUFFER       RGA_IOWR(0x3, struct rga_buffer_pool)
393d0407baSopenharmony_ci#define RGA_IOC_RELEASE_BUFFER      RGA_IOW(0x4, struct rga_buffer_pool)
403d0407baSopenharmony_ci#define RGA_START_CONFIG            RGA_IOR(0x5, uint32_t)
413d0407baSopenharmony_ci#define RGA_END_CONFIG              RGA_IOWR(0x6, struct rga_user_ctx_t)
423d0407baSopenharmony_ci#define RGA_CMD_CONFIG              RGA_IOWR(0x7, struct rga_user_ctx_t)
433d0407baSopenharmony_ci#define RGA_CANCEL_CONFIG           RGA_IOWR(0x8, uint32_t)
443d0407baSopenharmony_ci
453d0407baSopenharmony_ci#define RGA_BLIT_SYNC   0x5017
463d0407baSopenharmony_ci#define RGA_BLIT_ASYNC  0x5018
473d0407baSopenharmony_ci#define RGA_FLUSH       0x5019
483d0407baSopenharmony_ci#define RGA_GET_RESULT  0x501a
493d0407baSopenharmony_ci#define RGA_GET_VERSION 0x501b
503d0407baSopenharmony_ci
513d0407baSopenharmony_ci#define RGA2_BLIT_SYNC   0x6017
523d0407baSopenharmony_ci#define RGA2_BLIT_ASYNC  0x6018
533d0407baSopenharmony_ci#define RGA2_FLUSH       0x6019
543d0407baSopenharmony_ci#define RGA2_GET_RESULT  0x601a
553d0407baSopenharmony_ci#define RGA2_GET_VERSION 0x601b
563d0407baSopenharmony_ci
573d0407baSopenharmony_ci#define RGA_REG_CTRL_LEN    0x8    /* 8  */
583d0407baSopenharmony_ci#define RGA_REG_CMD_LEN     0x1c   /* 28 */
593d0407baSopenharmony_ci#define RGA_CMD_BUF_SIZE    0x700  /* 16*28*4 */
603d0407baSopenharmony_ci
613d0407baSopenharmony_ci#ifndef ENABLE
623d0407baSopenharmony_ci#define ENABLE 1
633d0407baSopenharmony_ci#endif
643d0407baSopenharmony_ci
653d0407baSopenharmony_ci#ifndef DISABLE
663d0407baSopenharmony_ci#define DISABLE 0
673d0407baSopenharmony_ci#endif
683d0407baSopenharmony_ci
693d0407baSopenharmony_cienum rga_memory_type {
703d0407baSopenharmony_ci    RGA_DMA_BUFFER = 0,
713d0407baSopenharmony_ci    RGA_VIRTUAL_ADDRESS,
723d0407baSopenharmony_ci    RGA_PHYSICAL_ADDRESS
733d0407baSopenharmony_ci};
743d0407baSopenharmony_ci
753d0407baSopenharmony_ci/* RGA process mode enum */
763d0407baSopenharmony_cienum {
773d0407baSopenharmony_ci    bitblt_mode               = 0x0,
783d0407baSopenharmony_ci    color_palette_mode        = 0x1,
793d0407baSopenharmony_ci    color_fill_mode           = 0x2,
803d0407baSopenharmony_ci    line_point_drawing_mode   = 0x3,
813d0407baSopenharmony_ci    blur_sharp_filter_mode    = 0x4,
823d0407baSopenharmony_ci    pre_scaling_mode          = 0x5,
833d0407baSopenharmony_ci    update_palette_table_mode = 0x6,
843d0407baSopenharmony_ci    update_patten_buff_mode   = 0x7,
853d0407baSopenharmony_ci};
863d0407baSopenharmony_ci
873d0407baSopenharmony_ci
883d0407baSopenharmony_cienum {
893d0407baSopenharmony_ci    rop_enable_mask          = 0x2,
903d0407baSopenharmony_ci    dither_enable_mask       = 0x8,
913d0407baSopenharmony_ci    fading_enable_mask       = 0x10,
923d0407baSopenharmony_ci    PD_enbale_mask           = 0x20,
933d0407baSopenharmony_ci};
943d0407baSopenharmony_ci
953d0407baSopenharmony_cienum {
963d0407baSopenharmony_ci    yuv2rgb_mode0            = 0x0,     /* BT.601 MPEG */
973d0407baSopenharmony_ci    yuv2rgb_mode1            = 0x1,     /* BT.601 JPEG */
983d0407baSopenharmony_ci    yuv2rgb_mode2            = 0x2,     /* BT.709      */
993d0407baSopenharmony_ci
1003d0407baSopenharmony_ci    rgb2yuv_601_full                = 0x1 << 8,
1013d0407baSopenharmony_ci    rgb2yuv_709_full                = 0x2 << 8,
1023d0407baSopenharmony_ci    yuv2yuv_601_limit_2_709_limit   = 0x3 << 8,
1033d0407baSopenharmony_ci    yuv2yuv_601_limit_2_709_full    = 0x4 << 8,
1043d0407baSopenharmony_ci    yuv2yuv_709_limit_2_601_limit   = 0x5 << 8,
1053d0407baSopenharmony_ci    yuv2yuv_709_limit_2_601_full    = 0x6 << 8,     //not support
1063d0407baSopenharmony_ci    yuv2yuv_601_full_2_709_limit    = 0x7 << 8,
1073d0407baSopenharmony_ci    yuv2yuv_601_full_2_709_full     = 0x8 << 8,     //not support
1083d0407baSopenharmony_ci    yuv2yuv_709_full_2_601_limit    = 0x9 << 8,     //not support
1093d0407baSopenharmony_ci    yuv2yuv_709_full_2_601_full     = 0xa << 8,     //not support
1103d0407baSopenharmony_ci    full_csc_mask = 0xf00,
1113d0407baSopenharmony_ci};
1123d0407baSopenharmony_ci
1133d0407baSopenharmony_ci/* RGA rotate mode */
1143d0407baSopenharmony_cienum {
1153d0407baSopenharmony_ci    rotate_mode0             = 0x0,     /* no rotate */
1163d0407baSopenharmony_ci    rotate_mode1             = 0x1,     /* rotate    */
1173d0407baSopenharmony_ci    rotate_mode2             = 0x2,     /* x_mirror  */
1183d0407baSopenharmony_ci    rotate_mode3             = 0x3,     /* y_mirror  */
1193d0407baSopenharmony_ci};
1203d0407baSopenharmony_ci
1213d0407baSopenharmony_cienum {
1223d0407baSopenharmony_ci    color_palette_mode0      = 0x0,     /* 1K */
1233d0407baSopenharmony_ci    color_palette_mode1      = 0x1,     /* 2K */
1243d0407baSopenharmony_ci    color_palette_mode2      = 0x2,     /* 4K */
1253d0407baSopenharmony_ci    color_palette_mode3      = 0x3,     /* 8K */
1263d0407baSopenharmony_ci};
1273d0407baSopenharmony_ci
1283d0407baSopenharmony_cienum {
1293d0407baSopenharmony_ci    BB_BYPASS   = 0x0,     /* no rotate */
1303d0407baSopenharmony_ci    BB_ROTATE   = 0x1,     /* rotate    */
1313d0407baSopenharmony_ci    BB_X_MIRROR = 0x2,     /* x_mirror  */
1323d0407baSopenharmony_ci    BB_Y_MIRROR = 0x3      /* y_mirror  */
1333d0407baSopenharmony_ci};
1343d0407baSopenharmony_ci
1353d0407baSopenharmony_cienum {
1363d0407baSopenharmony_ci    nearby   = 0x0,     /* no rotate */
1373d0407baSopenharmony_ci    bilinear = 0x1,     /* rotate    */
1383d0407baSopenharmony_ci    bicubic  = 0x2,     /* x_mirror  */
1393d0407baSopenharmony_ci};
1403d0407baSopenharmony_ci
1413d0407baSopenharmony_ci#define RGA_SCHED_PRIORITY_DEFAULT 0
1423d0407baSopenharmony_ci#define RGA_SCHED_PRIORITY_MAX 6
1433d0407baSopenharmony_ci
1443d0407baSopenharmony_cienum {
1453d0407baSopenharmony_ci    RGA3_SCHEDULER_CORE0    = 1 << 0,
1463d0407baSopenharmony_ci    RGA3_SCHEDULER_CORE1    = 1 << 1,
1473d0407baSopenharmony_ci    RGA2_SCHEDULER_CORE0    = 1 << 2,
1483d0407baSopenharmony_ci};
1493d0407baSopenharmony_ci
1503d0407baSopenharmony_ci/*
1513d0407baSopenharmony_ci//          Alpha    Red     Green   Blue
1523d0407baSopenharmony_ci{  4, 32, {{32,24,   8, 0,  16, 8,  24,16 }}, GGL_RGBA },   // RK_FORMAT_RGBA_8888
1533d0407baSopenharmony_ci{  4, 24, {{ 0, 0,   8, 0,  16, 8,  24,16 }}, GGL_RGB  },   // RK_FORMAT_RGBX_8888
1543d0407baSopenharmony_ci{  3, 24, {{ 0, 0,   8, 0,  16, 8,  24,16 }}, GGL_RGB  },   // RK_FORMAT_RGB_888
1553d0407baSopenharmony_ci{  4, 32, {{32,24,  24,16,  16, 8,   8, 0 }}, GGL_BGRA },   // RK_FORMAT_BGRA_8888
1563d0407baSopenharmony_ci{  2, 16, {{ 0, 0,  16,11,  11, 5,   5, 0 }}, GGL_RGB  },   // RK_FORMAT_RGB_565
1573d0407baSopenharmony_ci{  2, 16, {{ 1, 0,  16,11,  11, 6,   6, 1 }}, GGL_RGBA },   // RK_FORMAT_RGBA_5551
1583d0407baSopenharmony_ci{  2, 16, {{ 4, 0,  16,12,  12, 8,   8, 4 }}, GGL_RGBA },   // RK_FORMAT_RGBA_4444
1593d0407baSopenharmony_ci{  3, 24, {{ 0, 0,  24,16,  16, 8,   8, 0 }}, GGL_BGR  },   // RK_FORMAT_BGB_888
1603d0407baSopenharmony_ci
1613d0407baSopenharmony_ci*/
1623d0407baSopenharmony_ci/* In order to be compatible with RK_FORMAT_XX and HAL_PIXEL_FORMAT_XX,
1633d0407baSopenharmony_ci * RK_FORMAT_XX is shifted to the left by 8 bits to distinguish.  */
1643d0407baSopenharmony_citypedef enum _Rga_SURF_FORMAT {
1653d0407baSopenharmony_ci    RK_FORMAT_RGBA_8888    = 0x0 << 8,
1663d0407baSopenharmony_ci    RK_FORMAT_RGBX_8888    = 0x1 << 8,
1673d0407baSopenharmony_ci    RK_FORMAT_RGB_888      = 0x2 << 8,
1683d0407baSopenharmony_ci    RK_FORMAT_BGRA_8888    = 0x3 << 8,
1693d0407baSopenharmony_ci    RK_FORMAT_RGB_565      = 0x4 << 8,
1703d0407baSopenharmony_ci    RK_FORMAT_RGBA_5551    = 0x5 << 8,
1713d0407baSopenharmony_ci    RK_FORMAT_RGBA_4444    = 0x6 << 8,
1723d0407baSopenharmony_ci    RK_FORMAT_BGR_888      = 0x7 << 8,
1733d0407baSopenharmony_ci
1743d0407baSopenharmony_ci    RK_FORMAT_YCbCr_422_SP = 0x8 << 8,
1753d0407baSopenharmony_ci    RK_FORMAT_YCbCr_422_P  = 0x9 << 8,
1763d0407baSopenharmony_ci    RK_FORMAT_YCbCr_420_SP = 0xa << 8,
1773d0407baSopenharmony_ci    RK_FORMAT_YCbCr_420_P  = 0xb << 8,
1783d0407baSopenharmony_ci
1793d0407baSopenharmony_ci    RK_FORMAT_YCrCb_422_SP = 0xc << 8,
1803d0407baSopenharmony_ci    RK_FORMAT_YCrCb_422_P  = 0xd << 8,
1813d0407baSopenharmony_ci    RK_FORMAT_YCrCb_420_SP = 0xe << 8,
1823d0407baSopenharmony_ci    RK_FORMAT_YCrCb_420_P  = 0xf << 8,
1833d0407baSopenharmony_ci
1843d0407baSopenharmony_ci    RK_FORMAT_BPP1         = 0x10 << 8,
1853d0407baSopenharmony_ci    RK_FORMAT_BPP2         = 0x11 << 8,
1863d0407baSopenharmony_ci    RK_FORMAT_BPP4         = 0x12 << 8,
1873d0407baSopenharmony_ci    RK_FORMAT_BPP8         = 0x13 << 8,
1883d0407baSopenharmony_ci
1893d0407baSopenharmony_ci    RK_FORMAT_Y4           = 0x14 << 8,
1903d0407baSopenharmony_ci    RK_FORMAT_YCbCr_400    = 0x15 << 8,
1913d0407baSopenharmony_ci
1923d0407baSopenharmony_ci    RK_FORMAT_BGRX_8888    = 0x16 << 8,
1933d0407baSopenharmony_ci
1943d0407baSopenharmony_ci    RK_FORMAT_YVYU_422     = 0x18 << 8,
1953d0407baSopenharmony_ci    RK_FORMAT_YVYU_420     = 0x19 << 8,
1963d0407baSopenharmony_ci    RK_FORMAT_VYUY_422     = 0x1a << 8,
1973d0407baSopenharmony_ci    RK_FORMAT_VYUY_420     = 0x1b << 8,
1983d0407baSopenharmony_ci    RK_FORMAT_YUYV_422     = 0x1c << 8,
1993d0407baSopenharmony_ci    RK_FORMAT_YUYV_420     = 0x1d << 8,
2003d0407baSopenharmony_ci    RK_FORMAT_UYVY_422     = 0x1e << 8,
2013d0407baSopenharmony_ci    RK_FORMAT_UYVY_420     = 0x1f << 8,
2023d0407baSopenharmony_ci
2033d0407baSopenharmony_ci    RK_FORMAT_YCbCr_420_SP_10B = 0x20 << 8,
2043d0407baSopenharmony_ci    RK_FORMAT_YCrCb_420_SP_10B = 0x21 << 8,
2053d0407baSopenharmony_ci    RK_FORMAT_YCbCr_422_SP_10B = 0x22 << 8,
2063d0407baSopenharmony_ci    RK_FORMAT_YCrCb_422_SP_10B = 0x23 << 8,
2073d0407baSopenharmony_ci    /* For compatibility with misspellings */
2083d0407baSopenharmony_ci    RK_FORMAT_YCbCr_422_10b_SP = RK_FORMAT_YCbCr_422_SP_10B,
2093d0407baSopenharmony_ci    RK_FORMAT_YCrCb_422_10b_SP = RK_FORMAT_YCrCb_422_SP_10B,
2103d0407baSopenharmony_ci
2113d0407baSopenharmony_ci    RK_FORMAT_BGR_565      = 0x24 << 8,
2123d0407baSopenharmony_ci    RK_FORMAT_BGRA_5551    = 0x25 << 8,
2133d0407baSopenharmony_ci    RK_FORMAT_BGRA_4444    = 0x26 << 8,
2143d0407baSopenharmony_ci
2153d0407baSopenharmony_ci    RK_FORMAT_ARGB_8888    = 0x28 << 8,
2163d0407baSopenharmony_ci    RK_FORMAT_XRGB_8888    = 0x29 << 8,
2173d0407baSopenharmony_ci    RK_FORMAT_ARGB_5551    = 0x2a << 8,
2183d0407baSopenharmony_ci    RK_FORMAT_ARGB_4444    = 0x2b << 8,
2193d0407baSopenharmony_ci    RK_FORMAT_ABGR_8888    = 0x2c << 8,
2203d0407baSopenharmony_ci    RK_FORMAT_XBGR_8888    = 0x2d << 8,
2213d0407baSopenharmony_ci    RK_FORMAT_ABGR_5551    = 0x2e << 8,
2223d0407baSopenharmony_ci    RK_FORMAT_ABGR_4444    = 0x2f << 8,
2233d0407baSopenharmony_ci
2243d0407baSopenharmony_ci    RK_FORMAT_RGBA2BPP     = 0x30 << 8,
2253d0407baSopenharmony_ci
2263d0407baSopenharmony_ci    RK_FORMAT_UNKNOWN      = 0x100 << 8,
2273d0407baSopenharmony_ci} RgaSURF_FORMAT;
2283d0407baSopenharmony_ci
2293d0407baSopenharmony_ci/* RGA3 rd_mode */
2303d0407baSopenharmony_cienum
2313d0407baSopenharmony_ci{
2323d0407baSopenharmony_ci    raster_mode             = 0x1 << 0,
2333d0407baSopenharmony_ci    fbc_mode                = 0x1 << 1,
2343d0407baSopenharmony_ci    tile_mode               = 0x1 << 2,
2353d0407baSopenharmony_ci};
2363d0407baSopenharmony_ci
2373d0407baSopenharmony_citypedef struct rga_img_info_t {
2383d0407baSopenharmony_ci    uint64_t yrgb_addr;          /* yrgb    mem addr         */
2393d0407baSopenharmony_ci    uint64_t uv_addr;            /* cb/cr   mem addr         */
2403d0407baSopenharmony_ci    uint64_t v_addr;             /* cr      mem addr         */
2413d0407baSopenharmony_ci
2423d0407baSopenharmony_ci    uint32_t format;             //definition by RK_FORMAT
2433d0407baSopenharmony_ci    uint16_t act_w;
2443d0407baSopenharmony_ci    uint16_t act_h;
2453d0407baSopenharmony_ci    uint16_t x_offset;
2463d0407baSopenharmony_ci    uint16_t y_offset;
2473d0407baSopenharmony_ci
2483d0407baSopenharmony_ci    uint16_t vir_w;
2493d0407baSopenharmony_ci    uint16_t vir_h;
2503d0407baSopenharmony_ci
2513d0407baSopenharmony_ci    uint16_t endian_mode; //for BPP
2523d0407baSopenharmony_ci    uint16_t alpha_swap;
2533d0407baSopenharmony_ci
2543d0407baSopenharmony_ci    //used by RGA3
2553d0407baSopenharmony_ci    uint16_t rotate_mode;
2563d0407baSopenharmony_ci    uint16_t rd_mode;
2573d0407baSopenharmony_ci
2583d0407baSopenharmony_ci    uint16_t is_10b_compact;
2593d0407baSopenharmony_ci    uint16_t is_10b_endian;
2603d0407baSopenharmony_ci
2613d0407baSopenharmony_ci    uint16_t enable;
2623d0407baSopenharmony_ci}
2633d0407baSopenharmony_cirga_img_info_t;
2643d0407baSopenharmony_ci
2653d0407baSopenharmony_citypedef struct POINT {
2663d0407baSopenharmony_ci    uint16_t x;
2673d0407baSopenharmony_ci    uint16_t y;
2683d0407baSopenharmony_ci}
2693d0407baSopenharmony_ciPOINT;
2703d0407baSopenharmony_ci
2713d0407baSopenharmony_citypedef struct RECT {
2723d0407baSopenharmony_ci    uint16_t xmin;
2733d0407baSopenharmony_ci    uint16_t xmax; // width - 1
2743d0407baSopenharmony_ci    uint16_t ymin;
2753d0407baSopenharmony_ci    uint16_t ymax; // height - 1
2763d0407baSopenharmony_ci} RECT;
2773d0407baSopenharmony_ci
2783d0407baSopenharmony_citypedef struct MMU {
2793d0407baSopenharmony_ci    uint8_t mmu_en;
2803d0407baSopenharmony_ci    uint64_t base_addr;
2813d0407baSopenharmony_ci    uint32_t mmu_flag;     /* [0] mmu enable [1] src_flush [2] dst_flush [3] CMD_flush [4~5] page size*/
2823d0407baSopenharmony_ci} MMU;
2833d0407baSopenharmony_ci
2843d0407baSopenharmony_citypedef struct COLOR_FILL {
2853d0407baSopenharmony_ci    int16_t gr_x_a;
2863d0407baSopenharmony_ci    int16_t gr_y_a;
2873d0407baSopenharmony_ci    int16_t gr_x_b;
2883d0407baSopenharmony_ci    int16_t gr_y_b;
2893d0407baSopenharmony_ci    int16_t gr_x_g;
2903d0407baSopenharmony_ci    int16_t gr_y_g;
2913d0407baSopenharmony_ci    int16_t gr_x_r;
2923d0407baSopenharmony_ci    int16_t gr_y_r;
2933d0407baSopenharmony_ci    //u8  cp_gr_saturation;
2943d0407baSopenharmony_ci}
2953d0407baSopenharmony_ciCOLOR_FILL;
2963d0407baSopenharmony_ci
2973d0407baSopenharmony_citypedef struct FADING {
2983d0407baSopenharmony_ci    uint8_t b;
2993d0407baSopenharmony_ci    uint8_t g;
3003d0407baSopenharmony_ci    uint8_t r;
3013d0407baSopenharmony_ci    uint8_t res;
3023d0407baSopenharmony_ci}
3033d0407baSopenharmony_ciFADING;
3043d0407baSopenharmony_ci
3053d0407baSopenharmony_citypedef struct line_draw_t {
3063d0407baSopenharmony_ci    POINT start_point;                  /* LineDraw_start_point                */
3073d0407baSopenharmony_ci    POINT end_point;                    /* LineDraw_end_point                  */
3083d0407baSopenharmony_ci    uint32_t   color;                   /* LineDraw_color                      */
3093d0407baSopenharmony_ci    uint32_t   flag;                    /* (enum) LineDrawing mode sel         */
3103d0407baSopenharmony_ci    uint32_t   line_width;              /* range 1~16 */
3113d0407baSopenharmony_ci}
3123d0407baSopenharmony_ciline_draw_t;
3133d0407baSopenharmony_ci
3143d0407baSopenharmony_ci/* color space convert coefficient. */
3153d0407baSopenharmony_citypedef struct csc_coe_t {
3163d0407baSopenharmony_ci    int16_t r_v;
3173d0407baSopenharmony_ci    int16_t g_y;
3183d0407baSopenharmony_ci    int16_t b_u;
3193d0407baSopenharmony_ci    int32_t off;
3203d0407baSopenharmony_ci} csc_coe_t;
3213d0407baSopenharmony_ci
3223d0407baSopenharmony_citypedef struct full_csc_t {
3233d0407baSopenharmony_ci    uint8_t flag;
3243d0407baSopenharmony_ci    csc_coe_t coe_y;
3253d0407baSopenharmony_ci    csc_coe_t coe_u;
3263d0407baSopenharmony_ci    csc_coe_t coe_v;
3273d0407baSopenharmony_ci} full_csc_t;
3283d0407baSopenharmony_ci
3293d0407baSopenharmony_cistruct rga_mosaic_info {
3303d0407baSopenharmony_ci    uint8_t enable;
3313d0407baSopenharmony_ci    uint8_t mode;
3323d0407baSopenharmony_ci};
3333d0407baSopenharmony_ci
3343d0407baSopenharmony_cistruct rga_pre_intr_info {
3353d0407baSopenharmony_ci    uint8_t enable;
3363d0407baSopenharmony_ci
3373d0407baSopenharmony_ci    uint8_t read_intr_en;
3383d0407baSopenharmony_ci    uint8_t write_intr_en;
3393d0407baSopenharmony_ci    uint8_t read_hold_en;
3403d0407baSopenharmony_ci    uint32_t read_threshold;
3413d0407baSopenharmony_ci    uint32_t write_start;
3423d0407baSopenharmony_ci    uint32_t write_step;
3433d0407baSopenharmony_ci};
3443d0407baSopenharmony_ci
3453d0407baSopenharmony_ci/* MAX(min, (max - channel_value)) */
3463d0407baSopenharmony_cistruct rga_osd_invert_factor {
3473d0407baSopenharmony_ci    uint8_t alpha_max;
3483d0407baSopenharmony_ci    uint8_t alpha_min;
3493d0407baSopenharmony_ci    uint8_t yg_max;
3503d0407baSopenharmony_ci    uint8_t yg_min;
3513d0407baSopenharmony_ci    uint8_t crb_max;
3523d0407baSopenharmony_ci    uint8_t crb_min;
3533d0407baSopenharmony_ci};
3543d0407baSopenharmony_ci
3553d0407baSopenharmony_cistruct rga_color {
3563d0407baSopenharmony_ci    union {
3573d0407baSopenharmony_ci        struct {
3583d0407baSopenharmony_ci            uint8_t red;
3593d0407baSopenharmony_ci            uint8_t green;
3603d0407baSopenharmony_ci            uint8_t blue;
3613d0407baSopenharmony_ci            uint8_t alpha;
3623d0407baSopenharmony_ci        };
3633d0407baSopenharmony_ci        uint32_t value;
3643d0407baSopenharmony_ci    };
3653d0407baSopenharmony_ci};
3663d0407baSopenharmony_ci
3673d0407baSopenharmony_cistruct rga_osd_bpp2 {
3683d0407baSopenharmony_ci    uint8_t  ac_swap;           // ac swap flag
3693d0407baSopenharmony_ci                                // 0: CA
3703d0407baSopenharmony_ci                                // 1: AC
3713d0407baSopenharmony_ci    uint8_t  endian_swap;       // rgba2bpp endian swap
3723d0407baSopenharmony_ci                                // 0: Big endian
3733d0407baSopenharmony_ci                                // 1: Little endian
3743d0407baSopenharmony_ci    struct rga_color color0;
3753d0407baSopenharmony_ci    struct rga_color color1;
3763d0407baSopenharmony_ci};
3773d0407baSopenharmony_ci
3783d0407baSopenharmony_cistruct rga_osd_mode_ctrl {
3793d0407baSopenharmony_ci    uint8_t mode;               // OSD cal mode:
3803d0407baSopenharmony_ci                                //   0b'1: statistics mode
3813d0407baSopenharmony_ci                                //   1b'1: auto inversion overlap mode
3823d0407baSopenharmony_ci    uint8_t direction_mode;     // horizontal or vertical
3833d0407baSopenharmony_ci                                //   0: horizontal
3843d0407baSopenharmony_ci                                //   1: vertical
3853d0407baSopenharmony_ci    uint8_t width_mode;         // using @fix_width or LUT width
3863d0407baSopenharmony_ci                                //   0: fix width
3873d0407baSopenharmony_ci                                //   1: LUT width
3883d0407baSopenharmony_ci    uint16_t block_fix_width;   // OSD block fixed width
3893d0407baSopenharmony_ci                                //   real width = (fix_width + 1) * 2
3903d0407baSopenharmony_ci    uint8_t block_num;          // OSD block num
3913d0407baSopenharmony_ci    uint16_t flags_index;       // auto invert flags index
3923d0407baSopenharmony_ci
3933d0407baSopenharmony_ci    /* invertion config */
3943d0407baSopenharmony_ci    uint8_t color_mode;         // selete color
3953d0407baSopenharmony_ci                                //   0: src1 color
3963d0407baSopenharmony_ci                                //   1: config data color
3973d0407baSopenharmony_ci    uint8_t invert_flags_mode;  // invert flag selete
3983d0407baSopenharmony_ci                                //   0: use RAM flag
3993d0407baSopenharmony_ci                                //   1: usr last result
4003d0407baSopenharmony_ci    uint8_t default_color_sel;  // default color mode
4013d0407baSopenharmony_ci                                //   0: default is bright
4023d0407baSopenharmony_ci                                //   1: default is dark
4033d0407baSopenharmony_ci    uint8_t invert_enable;      // invert channel enable
4043d0407baSopenharmony_ci                                //   1 << 0: aplha enable
4053d0407baSopenharmony_ci                                //   1 << 1: Y/G disable
4063d0407baSopenharmony_ci                                //   1 << 2: C/RB disable
4073d0407baSopenharmony_ci    uint8_t invert_mode;        // invert cal mode
4083d0407baSopenharmony_ci                                //   0: normal(max-data)
4093d0407baSopenharmony_ci                                //   1: swap
4103d0407baSopenharmony_ci    uint8_t invert_thresh;      // if luma > thresh, osd_flag to be 1
4113d0407baSopenharmony_ci    uint8_t unfix_index;        // OSD width config index
4123d0407baSopenharmony_ci};
4133d0407baSopenharmony_ci
4143d0407baSopenharmony_cistruct rga_osd_info {
4153d0407baSopenharmony_ci    uint8_t  enable;
4163d0407baSopenharmony_ci
4173d0407baSopenharmony_ci    struct rga_osd_mode_ctrl mode_ctrl;
4183d0407baSopenharmony_ci    struct rga_osd_invert_factor cal_factor;
4193d0407baSopenharmony_ci    struct rga_osd_bpp2 bpp2_info;
4203d0407baSopenharmony_ci
4213d0407baSopenharmony_ci    union {
4223d0407baSopenharmony_ci        struct {
4233d0407baSopenharmony_ci            uint32_t last_flags1;
4243d0407baSopenharmony_ci            uint32_t last_flags0;
4253d0407baSopenharmony_ci        };
4263d0407baSopenharmony_ci        uint64_t last_flags;
4273d0407baSopenharmony_ci    };
4283d0407baSopenharmony_ci
4293d0407baSopenharmony_ci    union {
4303d0407baSopenharmony_ci        struct {
4313d0407baSopenharmony_ci            uint32_t cur_flags1;
4323d0407baSopenharmony_ci            uint32_t cur_flags0;
4333d0407baSopenharmony_ci        };
4343d0407baSopenharmony_ci        uint64_t cur_flags;
4353d0407baSopenharmony_ci    };
4363d0407baSopenharmony_ci};
4373d0407baSopenharmony_ci
4383d0407baSopenharmony_ci#define RGA_VERSION_SIZE    16
4393d0407baSopenharmony_ci#define RGA_HW_SIZE            5
4403d0407baSopenharmony_ci
4413d0407baSopenharmony_cistruct rga_version_t {
4423d0407baSopenharmony_ci    uint32_t major;
4433d0407baSopenharmony_ci    uint32_t minor;
4443d0407baSopenharmony_ci    uint32_t revision;
4453d0407baSopenharmony_ci    uint8_t str[RGA_VERSION_SIZE];
4463d0407baSopenharmony_ci};
4473d0407baSopenharmony_ci
4483d0407baSopenharmony_cistruct rga_hw_versions_t {
4493d0407baSopenharmony_ci    struct rga_version_t version[RGA_HW_SIZE];
4503d0407baSopenharmony_ci    uint32_t size;
4513d0407baSopenharmony_ci};
4523d0407baSopenharmony_ci
4533d0407baSopenharmony_cistruct rga_memory_parm {
4543d0407baSopenharmony_ci    uint32_t width;
4553d0407baSopenharmony_ci    uint32_t height;
4563d0407baSopenharmony_ci    uint32_t format;
4573d0407baSopenharmony_ci
4583d0407baSopenharmony_ci    uint32_t size;
4593d0407baSopenharmony_ci};
4603d0407baSopenharmony_ci
4613d0407baSopenharmony_cistruct rga_external_buffer {
4623d0407baSopenharmony_ci    uint64_t memory;
4633d0407baSopenharmony_ci    uint32_t type;
4643d0407baSopenharmony_ci
4653d0407baSopenharmony_ci    uint32_t handle;
4663d0407baSopenharmony_ci    struct rga_memory_parm memory_info;
4673d0407baSopenharmony_ci
4683d0407baSopenharmony_ci    uint8_t reserve[252];
4693d0407baSopenharmony_ci};
4703d0407baSopenharmony_ci
4713d0407baSopenharmony_cistruct rga_buffer_pool {
4723d0407baSopenharmony_ci    uint64_t buffers;
4733d0407baSopenharmony_ci    uint32_t size;
4743d0407baSopenharmony_ci};
4753d0407baSopenharmony_ci
4763d0407baSopenharmony_cistruct rga_req {
4773d0407baSopenharmony_ci    uint8_t render_mode;                  /* (enum) process mode sel */
4783d0407baSopenharmony_ci
4793d0407baSopenharmony_ci    rga_img_info_t src;                   /* src image info */
4803d0407baSopenharmony_ci    rga_img_info_t dst;                   /* dst image info */
4813d0407baSopenharmony_ci    rga_img_info_t pat;                   /* patten image info */
4823d0407baSopenharmony_ci
4833d0407baSopenharmony_ci    uint64_t rop_mask_addr;               /* rop4 mask addr */
4843d0407baSopenharmony_ci    uint64_t LUT_addr;                    /* LUT addr */
4853d0407baSopenharmony_ci
4863d0407baSopenharmony_ci    RECT clip;                            /* dst clip window default value is dst_vir */
4873d0407baSopenharmony_ci                                          /* value from [0, w-1] / [0, h-1]*/
4883d0407baSopenharmony_ci
4893d0407baSopenharmony_ci    int32_t sina;                         /* dst angle  default value 0  16.16 scan from table */
4903d0407baSopenharmony_ci    int32_t cosa;                         /* dst angle  default value 0  16.16 scan from table */
4913d0407baSopenharmony_ci
4923d0407baSopenharmony_ci    uint16_t alpha_rop_flag;              /* alpha rop process flag           */
4933d0407baSopenharmony_ci                                          /* ([0] = 1 alpha_rop_enable)       */
4943d0407baSopenharmony_ci                                          /* ([1] = 1 rop enable)             */
4953d0407baSopenharmony_ci                                          /* ([2] = 1 fading_enable)          */
4963d0407baSopenharmony_ci                                          /* ([3] = 1 PD_enable)              */
4973d0407baSopenharmony_ci                                          /* ([4] = 1 alpha cal_mode_sel)     */
4983d0407baSopenharmony_ci                                          /* ([5] = 1 dither_enable)          */
4993d0407baSopenharmony_ci                                          /* ([6] = 1 gradient fill mode sel) */
5003d0407baSopenharmony_ci                                          /* ([7] = 1 AA_enable)              */
5013d0407baSopenharmony_ci                                          /* ([8] = 1 nn_quantize)            */
5023d0407baSopenharmony_ci                                          /* ([9] = 1 Real color mode)        */
5033d0407baSopenharmony_ci
5043d0407baSopenharmony_ci    uint8_t  scale_mode;                  /* 0 nearst / 1 bilnear / 2 bicubic */
5053d0407baSopenharmony_ci
5063d0407baSopenharmony_ci    uint32_t color_key_max;               /* color key max */
5073d0407baSopenharmony_ci    uint32_t color_key_min;               /* color key min */
5083d0407baSopenharmony_ci
5093d0407baSopenharmony_ci    uint32_t fg_color;                    /* foreground color */
5103d0407baSopenharmony_ci    uint32_t bg_color;                    /* background color */
5113d0407baSopenharmony_ci
5123d0407baSopenharmony_ci    COLOR_FILL gr_color;                  /* color fill use gradient */
5133d0407baSopenharmony_ci
5143d0407baSopenharmony_ci    line_draw_t line_draw_info;
5153d0407baSopenharmony_ci
5163d0407baSopenharmony_ci    FADING fading;
5173d0407baSopenharmony_ci
5183d0407baSopenharmony_ci    uint8_t PD_mode;                      /* porter duff alpha mode sel */
5193d0407baSopenharmony_ci
5203d0407baSopenharmony_ci    uint8_t alpha_global_value;           /* global alpha value */
5213d0407baSopenharmony_ci
5223d0407baSopenharmony_ci    uint16_t rop_code;                    /* rop2/3/4 code  scan from rop code table*/
5233d0407baSopenharmony_ci
5243d0407baSopenharmony_ci    uint8_t bsfilter_flag;                /* [2] 0 blur 1 sharp / [1:0] filter_type*/
5253d0407baSopenharmony_ci
5263d0407baSopenharmony_ci    uint8_t palette_mode;                 /* (enum) color palatte  0/1bpp, 1/2bpp 2/4bpp 3/8bpp*/
5273d0407baSopenharmony_ci
5283d0407baSopenharmony_ci    uint8_t yuv2rgb_mode;                 /* (enum) BT.601 MPEG / BT.601 JPEG / BT.709  */
5293d0407baSopenharmony_ci
5303d0407baSopenharmony_ci    uint8_t endian_mode;                  /* 0/big endian 1/little endian*/
5313d0407baSopenharmony_ci
5323d0407baSopenharmony_ci    uint8_t rotate_mode;                  /* (enum) rotate mode  */
5333d0407baSopenharmony_ci                                          /* 0x0,     no rotate  */
5343d0407baSopenharmony_ci                                          /* 0x1,     rotate     */
5353d0407baSopenharmony_ci                                          /* 0x2,     x_mirror   */
5363d0407baSopenharmony_ci                                          /* 0x3,     y_mirror   */
5373d0407baSopenharmony_ci
5383d0407baSopenharmony_ci    uint8_t color_fill_mode;              /* 0 solid color / 1 patten color */
5393d0407baSopenharmony_ci
5403d0407baSopenharmony_ci    MMU mmu_info;                         /* mmu information */
5413d0407baSopenharmony_ci
5423d0407baSopenharmony_ci    uint8_t  alpha_rop_mode;              /* ([0~1] alpha mode)       */
5433d0407baSopenharmony_ci                                          /* ([2~3] rop   mode)       */
5443d0407baSopenharmony_ci                                          /* ([4]   zero  mode en)    */
5453d0407baSopenharmony_ci                                          /* ([5]   dst   alpha mode) (RGA1) */
5463d0407baSopenharmony_ci
5473d0407baSopenharmony_ci    uint8_t  src_trans_mode;
5483d0407baSopenharmony_ci
5493d0407baSopenharmony_ci    uint8_t  dither_mode;
5503d0407baSopenharmony_ci
5513d0407baSopenharmony_ci    full_csc_t full_csc;                  /* full color space convert */
5523d0407baSopenharmony_ci
5533d0407baSopenharmony_ci    int32_t in_fence_fd;
5543d0407baSopenharmony_ci    uint8_t core;
5553d0407baSopenharmony_ci    uint8_t priority;
5563d0407baSopenharmony_ci    int32_t out_fence_fd;
5573d0407baSopenharmony_ci
5583d0407baSopenharmony_ci    uint8_t handle_flag;
5593d0407baSopenharmony_ci
5603d0407baSopenharmony_ci    /* RGA2 1106 add */
5613d0407baSopenharmony_ci    struct rga_mosaic_info mosaic_info;
5623d0407baSopenharmony_ci
5633d0407baSopenharmony_ci    uint8_t uvhds_mode;
5643d0407baSopenharmony_ci    uint8_t uvvds_mode;
5653d0407baSopenharmony_ci
5663d0407baSopenharmony_ci    struct rga_osd_info osd_info;
5673d0407baSopenharmony_ci
5683d0407baSopenharmony_ci    struct rga_pre_intr_info pre_intr_info;
5693d0407baSopenharmony_ci
5703d0407baSopenharmony_ci    uint8_t reservr[59];
5713d0407baSopenharmony_ci};
5723d0407baSopenharmony_ci
5733d0407baSopenharmony_cistruct rga_user_ctx_t {
5743d0407baSopenharmony_ci    uint64_t cmd_ptr;
5753d0407baSopenharmony_ci    uint32_t cmd_num;
5763d0407baSopenharmony_ci    uint32_t id;
5773d0407baSopenharmony_ci    uint32_t sync_mode;
5783d0407baSopenharmony_ci    uint32_t out_fence_fd;
5793d0407baSopenharmony_ci
5803d0407baSopenharmony_ci    uint32_t mpi_config_flags;
5813d0407baSopenharmony_ci
5823d0407baSopenharmony_ci    uint8_t reservr[124];
5833d0407baSopenharmony_ci};
5843d0407baSopenharmony_ci
5853d0407baSopenharmony_ci#ifdef __cplusplus
5863d0407baSopenharmony_ci}
5873d0407baSopenharmony_ci#endif
5883d0407baSopenharmony_ci
5893d0407baSopenharmony_ci#endif /*_RK29_IPP_DRIVER_H_*/
590