/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
 * Copyright (c) 2021 Amlogic, Inc. All rights reserved.
 */

#ifndef _GE2D_H_
#define _GE2D_H_

#include <linux/types.h>
#include <linux/wait.h>
#include <linux/sched.h>
#include <linux/semaphore.h>
#include <linux/completion.h>

#ifdef CONFIG_COMPAT
#include <linux/compat.h>
#endif

enum ge2d_memtype_s {
	AML_GE2D_MEM_ION,
	AML_GE2D_MEM_DMABUF,
	AML_GE2D_MEM_INVALID,
};

#define MAX_PLANE         4
#define MAX_BITBLT_WORK_CONFIG 4
#define DEFAULT_MAX_GE2D_CMD  32   /* 64 */

#define CONFIG_GE2D_ADV_NUM
#define CONFIG_GE2D_SRC2
#define GE2D_STATE_IDLE                 0
#define GE2D_STATE_RUNNING              1
#define GE2D_STATE_CLEANUP              2
#define GE2D_STATE_REMOVING_WQ          3
#define	GE2D_PROCESS_QUEUE_START        0
#define	GE2D_PROCESS_QUEUE_STOP         1

#define RELEASE_SRC1_CANVAS 0x01
#define RELEASE_SRC2_CANVAS 0x02
#define RELEASE_SRC1_BUFFER 0x04
#define RELEASE_SRC2_BUFFER 0x08
#define RELEASE_CB          0x10
#define RELEASE_REQUIRED    0x1f

#define START_FLAG          0x20
#define RELEASE_FLAG        0x40
#define FINISH_FLAG         0x80

#define FORMAT_8BIT_COMPONENT   0
#define COMPONENT_Y_OR_R      0
#define COMPONENT_Cb_OR_G     1
#define COMPONENT_Cr_OR_B     2
#define COMPONENT_ALPHA       3
#define FORMAT_422_YUV          1
#define FORMAT_444_YUV_OR_RGB   2
#define FORMAT_YUVA_OR_RGBA     3

#define FILL_MODE_BOUNDARY_PIXEL    0
#define FILL_MODE_DEFAULT_COLOR     1

#define OPERATION_ADD           0    /* Cd = Cs*Fs+Cd*Fd */
#define OPERATION_SUB           1    /* Cd = Cs*Fs-Cd*Fd */
#define OPERATION_REVERSE_SUB   2    /* Cd = Cd*Fd-Cs*Fs */
#define OPERATION_MIN           3    /* Cd = Min(Cd*Fd,Cs*Fs) */
#define OPERATION_MAX           4    /* Cd = Max(Cd*Fd,Cs*Fs) */
#define OPERATION_LOGIC         5

#define COLOR_FACTOR_ZERO                     0
#define COLOR_FACTOR_ONE                      1
#define COLOR_FACTOR_SRC_COLOR                2
#define COLOR_FACTOR_ONE_MINUS_SRC_COLOR      3
#define COLOR_FACTOR_DST_COLOR                4
#define COLOR_FACTOR_ONE_MINUS_DST_COLOR      5
#define COLOR_FACTOR_SRC_ALPHA                6
#define COLOR_FACTOR_ONE_MINUS_SRC_ALPHA      7
#define COLOR_FACTOR_DST_ALPHA                8
#define COLOR_FACTOR_ONE_MINUS_DST_ALPHA      9
#define COLOR_FACTOR_CONST_COLOR              10
#define COLOR_FACTOR_ONE_MINUS_CONST_COLOR    11
#define COLOR_FACTOR_CONST_ALPHA              12
#define COLOR_FACTOR_ONE_MINUS_CONST_ALPHA    13
#define COLOR_FACTOR_SRC_ALPHA_SATURATE       14

#define ALPHA_FACTOR_ZERO                     0
#define ALPHA_FACTOR_ONE                      1
#define ALPHA_FACTOR_SRC_ALPHA                2
#define ALPHA_FACTOR_ONE_MINUS_SRC_ALPHA      3
#define ALPHA_FACTOR_DST_ALPHA                4
#define ALPHA_FACTOR_ONE_MINUS_DST_ALPHA      5
#define ALPHA_FACTOR_CONST_ALPHA              6
#define ALPHA_FACTOR_ONE_MINUS_CONST_ALPHA    7

#define LOGIC_OPERATION_CLEAR       0
#define LOGIC_OPERATION_COPY        1
#define LOGIC_OPERATION_NOOP        2
#define LOGIC_OPERATION_SET         3
#define LOGIC_OPERATION_COPY_INVERT 4
#define LOGIC_OPERATION_INVERT      5
#define LOGIC_OPERATION_AND_REVERSE 6
#define LOGIC_OPERATION_OR_REVERSE  7
#define LOGIC_OPERATION_AND         8
#define LOGIC_OPERATION_OR          9
#define LOGIC_OPERATION_NAND        10
#define LOGIC_OPERATION_NOR         11
#define LOGIC_OPERATION_XOR         12
#define LOGIC_OPERATION_EQUIV       13
#define LOGIC_OPERATION_AND_INVERT  14
#define LOGIC_OPERATION_OR_INVERT   15

#define DST_CLIP_MODE_INSIDE    0
#define DST_CLIP_MODE_OUTSIDE   1

#define FILTER_TYPE_BICUBIC     1
#define FILTER_TYPE_BILINEAR    2
#define FILTER_TYPE_TRIANGLE    3
#define FILTER_TYPE_GAU0    4
#define FILTER_TYPE_GAU0_BOT    5
#define FILTER_TYPE_GAU1    6

#define DST_SIGN_MODE   BIT(8)
#define DST_REPEAT      BIT(7)
#define CANVAS_STATUS   (BIT(5) | BIT(6))
#define HAS_SELF_POWER  BIT(4)
#define DEEP_COLOR      BIT(3)
#define ADVANCED_MATRIX BIT(2)
#define SRC2_REPEAT     BIT(1)
#define SRC2_ALPHA      BIT(0)

#define DST_RPT_PATTERN_X0 1
#define DST_RPT_PATTERN_0X 2
#define DST_RPT_PATTERN_XX 3

#define DST_RPT_2          (0 << 2)
#define DST_RPT_4          BIT(2)
#define DST_RPT_8          (2 << 2)

#define MATRIX_YCC_TO_RGB               BIT(0)
#define MATRIX_RGB_TO_YCC               BIT(1)
#define MATRIX_FULL_RANGE_YCC_TO_RGB    BIT(2)
#define MATRIX_RGB_TO_FULL_RANGE_YCC    BIT(3)
#define MATRIX_BT_601                   (0 << 4)
#define MATRIX_BT_709                   BIT(4)
#define MATRIX_CUSTOM                   BIT(5)
#define MATRIX_SIGNED                   BIT(6)

#define GE2D_EXT_MASK                   (BIT(25) | BIT(26) | BIT(27) | BIT(31))
#define GE2D_DST_REPEAT_2               BIT(31)
#define GE2D_DST_REPEAT_4               BIT(27)
#define GE2D_DST_REPEAT_8               (BIT(31) | BIT(27))
#define GE2D_DST_SIGN_MDOE              BIT(26)

#define GE2D_FORMAT_BT_STANDARD         BIT(28)
#define GE2D_FORMAT_BT601               (0 << 28)
#define GE2D_FORMAT_BT709               BIT(28)
#define GE2D_MATRIX_CUSTOM              BIT(29)
#define GE2D_STRIDE_CUSTOM              BIT(30)

#define GE2D_ENDIAN_SHIFT	24
#define GE2D_ENDIAN_MASK            (0x1 << GE2D_ENDIAN_SHIFT)
#define GE2D_BIG_ENDIAN             (0 << GE2D_ENDIAN_SHIFT)
#define GE2D_LITTLE_ENDIAN          BIT(GE2D_ENDIAN_SHIFT)

#define GE2D_COLOR_MAP_SHIFT        20
#define GE2D_COLOR_MAP_MASK         (0xf << GE2D_COLOR_MAP_SHIFT)
/* nv12 &nv21, only works on m6*/
#define GE2D_COLOR_MAP_NV12		(15 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_NV21		(14 << GE2D_COLOR_MAP_SHIFT)

/* deep color, only works after TXL */
#define GE2D_COLOR_MAP_10BIT_YUV444		(0 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_10BIT_VUY444		(5 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_10BIT_YUV422		(0 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_10BIT_YVU422		BIT(GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_12BIT_YUV422		(8 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_12BIT_YVU422		(9 << GE2D_COLOR_MAP_SHIFT)

/* 16 bit */
#define GE2D_COLOR_MAP_YUV422		(0 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_RGB655		BIT(GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_YUV655		BIT(GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_RGB844		(2 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_YUV844		(2 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_RGBA6442     (3 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_YUVA6442     (3 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_RGBA4444     (4 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_YUVA4444     (4 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_RGB565       (5 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_YUV565       (5 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_ARGB4444		(6 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_AYUV4444		(6 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_ARGB1555     (7 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_AYUV1555     (7 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_RGBA4642     (8 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_YUVA4642     (8 << GE2D_COLOR_MAP_SHIFT)
/* 24 bit */
#define GE2D_COLOR_MAP_RGB888       (0 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_YUV444       (0 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_RGBA5658     BIT(GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_YUVA5658     BIT(GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_ARGB8565     (2 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_AYUV8565     (2 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_RGBA6666     (3 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_YUVA6666     (3 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_ARGB6666     (4 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_AYUV6666     (4 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_BGR888		(5 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_VUY888		(5 << GE2D_COLOR_MAP_SHIFT)
/* 32 bit */
#define GE2D_COLOR_MAP_RGBA8888		(0 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_YUVA8888		(0 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_ARGB8888     BIT(GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_AYUV8888     BIT(GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_ABGR8888     (2 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_AVUY8888     (2 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_BGRA8888     (3 << GE2D_COLOR_MAP_SHIFT)
#define GE2D_COLOR_MAP_VUYA8888     (3 << GE2D_COLOR_MAP_SHIFT)

/*
 * format code is defined as:
 * [18] : 1-deep color mode(10/12 bit), 0-8bit mode
 * [17] : 1-YUV color space, 0-RGB color space
 * [16] : compress_range, 1-full range, 0-limited range
 * [9:8]: format
 * [7:6]: 8bit_mode_sel
 * [5]  : LUT_EN
 * [4:3]: PIC_STRUCT
 * [2]  : SEP_EN
 * [1:0]: X_YC_RATIO, SRC1_Y_YC_RATIO
 */
#define GE2D_FORMAT_MASK                0x0ffff
#define GE2D_BPP_MASK                   0x00300
#define GE2D_BPP_8BIT                   0x00000
#define GE2D_BPP_16BIT                  0x00100
#define GE2D_BPP_24BIT                  0x00200
#define GE2D_BPP_32BIT                  0x00300
#define GE2D_FORMAT_DEEP_COLOR   0x40000
#define GE2D_FORMAT_YUV                 0x20000
#define GE2D_FORMAT_FULL_RANGE          0x10000
/*bit8(2)  format   bi6(2) mode_8b_sel  bit5(1)lut_en   bit2 sep_en*/
/*M  separate block S one block.*/

#define GE2D_FMT_S8_Y		0x00000 /* 00_00_0_00_0_00 */
#define GE2D_FMT_S8_CB		0x00040 /* 00_01_0_00_0_00 */
#define GE2D_FMT_S8_CR		0x00080 /* 00_10_0_00_0_00 */
#define GE2D_FMT_S8_R		0x00000 /* 00_00_0_00_0_00 */
#define GE2D_FMT_S8_G		0x00040 /* 00_01_0_00_0_00 */
#define GE2D_FMT_S8_B		0x00080 /* 00_10_0_00_0_00 */
#define GE2D_FMT_S8_A		0x000c0 /* 00_11_0_00_0_00 */
#define GE2D_FMT_S8_LUT		0x00020 /* 00_00_1_00_0_00 */
#define GE2D_FMT_S16_YUV422	0x20102 /* 01_00_0_00_0_00 */
#define GE2D_FMT_S16_RGB (GE2D_LITTLE_ENDIAN | 0x00100) /* 01_00_0_00_0_00 */
#define GE2D_FMT_S24_YUV444	0x20200 /* 10_00_0_00_0_00 */
#define GE2D_FMT_S24_RGB (GE2D_LITTLE_ENDIAN | 0x00200) /* 10_00_0_00_0_00 */
#define GE2D_FMT_S32_YUVA444	0x20300 /* 11_00_0_00_0_00 */
#define GE2D_FMT_S32_RGBA (GE2D_LITTLE_ENDIAN | 0x00300) /* 11_00_0_00_0_00 */
#define GE2D_FMT_M24_YUV420	0x20007 /* 00_00_0_00_1_11 */
#define GE2D_FMT_M24_YUV422	0x20006 /* 00_00_0_00_1_10 */
#define GE2D_FMT_M24_YUV444	0x20004 /* 00_00_0_00_1_00 */
#define GE2D_FMT_M24_RGB		0x00004 /* 00_00_0_00_1_00 */
#define GE2D_FMT_M24_YUV420T	0x20017 /* 00_00_0_10_1_11 */
#define GE2D_FMT_M24_YUV420B	0x2001f /* 00_00_0_11_1_11 */

#define GE2D_FMT_M24_YUV420SP		0x20207
#define GE2D_FMT_M24_YUV422SP           0x20206
/* 01_00_0_00_1_11 nv12 &nv21, only works on m6. */
#define GE2D_FMT_M24_YUV420SPT		0x20217
/* 01_00_0_00_1_11 nv12 &nv21, only works on m6. */
#define GE2D_FMT_M24_YUV420SPB		0x2021f

#define GE2D_FMT_S16_YUV422T	0x20110 /* 01_00_0_10_0_00 */
#define GE2D_FMT_S16_YUV422B	0x20138 /* 01_00_0_11_0_00 */
#define GE2D_FMT_S24_YUV444T	0x20210 /* 10_00_0_10_0_00 */
#define GE2D_FMT_S24_YUV444B	0x20218 /* 10_00_0_11_0_00 */

/* only works after TXL and for src1. */
#define GE2D_FMT_S24_10BIT_YUV444		0x60200
#define GE2D_FMT_S24_10BIT_YUV444T		0x60210
#define GE2D_FMT_S24_10BIT_YUV444B		0x60218
#define GE2D_FMT_S24_10BIT_RGB888		0x40200

#define GE2D_FMT_S16_10BIT_YUV422		0x60102
#define GE2D_FMT_S16_10BIT_YUV422T		0x60112
#define GE2D_FMT_S16_10BIT_YUV422B		0x6011a

#define GE2D_FMT_S16_12BIT_YUV422		0x60102
#define GE2D_FMT_S16_12BIT_YUV422T		0x60112
#define GE2D_FMT_S16_12BIT_YUV422B		0x6011a

/* back compatible defines */
#define GE2D_FORMAT_S8_Y            (GE2D_FORMAT_YUV | GE2D_FMT_S8_Y)
#define GE2D_FORMAT_S8_CB           (GE2D_FORMAT_YUV | GE2D_FMT_S8_CB)
#define GE2D_FORMAT_S8_CR           (GE2D_FORMAT_YUV | GE2D_FMT_S8_CR)
#define GE2D_FORMAT_S8_R            GE2D_FMT_S8_R
#define GE2D_FORMAT_S8_G            GE2D_FMT_S8_G
#define GE2D_FORMAT_S8_B            GE2D_FMT_S8_B
#define GE2D_FORMAT_S8_A            GE2D_FMT_S8_A
#define GE2D_FORMAT_S8_LUT          GE2D_FMT_S8_LUT
/* nv12 &nv21, only works on m6. */
#define GE2D_FORMAT_M24_NV12  (GE2D_FMT_M24_YUV420SP | GE2D_COLOR_MAP_NV12)
#define GE2D_FORMAT_M24_NV12T (GE2D_FMT_M24_YUV420SPT | GE2D_COLOR_MAP_NV12)
#define GE2D_FORMAT_M24_NV12B (GE2D_FMT_M24_YUV420SPB | GE2D_COLOR_MAP_NV12)
#define GE2D_FORMAT_M24_NV21  (GE2D_FMT_M24_YUV420SP | GE2D_COLOR_MAP_NV21)
#define GE2D_FORMAT_M24_NV21T (GE2D_FMT_M24_YUV420SPT | GE2D_COLOR_MAP_NV21)
#define GE2D_FORMAT_M24_NV21B (GE2D_FMT_M24_YUV420SPB | GE2D_COLOR_MAP_NV21)

#define GE2D_FORMAT_S12_RGB_655 (GE2D_FMT_S16_RGB | GE2D_COLOR_MAP_RGB655)
#define GE2D_FORMAT_S16_YUV422 (GE2D_FMT_S16_YUV422 | GE2D_COLOR_MAP_YUV422)
#define GE2D_FORMAT_S16_RGB_655 (GE2D_FMT_S16_RGB | GE2D_COLOR_MAP_RGB655)
#define GE2D_FORMAT_S24_YUV444 (GE2D_FMT_S24_YUV444 | GE2D_COLOR_MAP_YUV444)
#define GE2D_FORMAT_S24_RGB (GE2D_FMT_S24_RGB | GE2D_COLOR_MAP_RGB888)
#define GE2D_FORMAT_S32_YUVA444 (GE2D_FMT_S32_YUVA444 | GE2D_COLOR_MAP_YUVA4444)
#define GE2D_FORMAT_S32_RGBA (GE2D_FMT_S32_RGBA | GE2D_COLOR_MAP_RGBA8888)
#define GE2D_FORMAT_M24_YUV420      GE2D_FMT_M24_YUV420
#define GE2D_FORMAT_M24_YUV422      GE2D_FMT_M24_YUV422
#define GE2D_FORMAT_M24_YUV444      GE2D_FMT_M24_YUV444
#define GE2D_FORMAT_M24_RGB         GE2D_FMT_M24_RGB
#define GE2D_FORMAT_M24_YUV420T     GE2D_FMT_M24_YUV420T
#define GE2D_FORMAT_M24_YUV420B     GE2D_FMT_M24_YUV420B
#define GE2D_FORMAT_M24_YUV422SP (GE2D_FMT_M24_YUV422SP | GE2D_COLOR_MAP_NV12)
#define GE2D_FORMAT_S16_YUV422T (GE2D_FMT_S16_YUV422T | GE2D_COLOR_MAP_YUV422)
#define GE2D_FORMAT_S16_YUV422B (GE2D_FMT_S16_YUV422B | GE2D_COLOR_MAP_YUV422)
#define GE2D_FORMAT_S24_YUV444T (GE2D_FMT_S24_YUV444T | GE2D_COLOR_MAP_YUV444)
#define GE2D_FORMAT_S24_YUV444B (GE2D_FMT_S24_YUV444B | GE2D_COLOR_MAP_YUV444)
/* format added in A1H */
/*16 bit*/
#define GE2D_FORMAT_S16_RGB_565   (GE2D_FMT_S16_RGB | GE2D_COLOR_MAP_RGB565)
#define GE2D_FORMAT_S16_RGB_844   (GE2D_FMT_S16_RGB | GE2D_COLOR_MAP_RGB844)
#define GE2D_FORMAT_S16_RGBA_6442 (GE2D_FMT_S16_RGB | GE2D_COLOR_MAP_RGBA6442)
#define GE2D_FORMAT_S16_RGBA_4444 (GE2D_FMT_S16_RGB | GE2D_COLOR_MAP_RGBA4444)
#define GE2D_FORMAT_S16_ARGB_4444 (GE2D_FMT_S16_RGB | GE2D_COLOR_MAP_ARGB4444)
#define GE2D_FORMAT_S16_ARGB_1555 (GE2D_FMT_S16_RGB | GE2D_COLOR_MAP_ARGB1555)
#define GE2D_FORMAT_S16_RGBA_4642 (GE2D_FMT_S16_RGB | GE2D_COLOR_MAP_RGBA4642)
/*24 bit*/
#define GE2D_FORMAT_S24_RGBA_5658 (GE2D_FMT_S24_RGB | GE2D_COLOR_MAP_RGBA5658)
#define GE2D_FORMAT_S24_ARGB_8565 (GE2D_FMT_S24_RGB | GE2D_COLOR_MAP_ARGB8565)
#define GE2D_FORMAT_S24_RGBA_6666 (GE2D_FMT_S24_RGB | GE2D_COLOR_MAP_RGBA6666)
#define GE2D_FORMAT_S24_ARGB_6666 (GE2D_FMT_S24_RGB | GE2D_COLOR_MAP_ARGB6666)
#define GE2D_FORMAT_S24_BGR (GE2D_FMT_S24_RGB | GE2D_COLOR_MAP_BGR888)
/*32 bit*/
#define GE2D_FORMAT_S32_ARGB (GE2D_FMT_S32_RGBA | GE2D_COLOR_MAP_ARGB8888)
#define GE2D_FORMAT_S32_ABGR (GE2D_FMT_S32_RGBA | GE2D_COLOR_MAP_ABGR8888)
#define GE2D_FORMAT_S32_BGRA (GE2D_FMT_S32_RGBA | GE2D_COLOR_MAP_BGRA8888)

/* format added in TXL */
#define GE2D_FORMAT_S24_10BIT_YUV444 \
	(GE2D_FMT_S24_10BIT_YUV444 | GE2D_COLOR_MAP_10BIT_YUV444)

#define GE2D_FORMAT_S24_10BIT_VUY444 \
	(GE2D_FMT_S24_10BIT_YUV444 | GE2D_COLOR_MAP_10BIT_VUY444)

#define GE2D_FORMAT_S24_10BIT_RGB888 GE2D_FMT_S24_10BIT_RGB888

#define GE2D_FORMAT_S24_10BIT_BGR888 \
	(GE2D_FMT_S24_10BIT_RGB888 | GE2D_COLOR_MAP_BGR888)

#define GE2D_FORMAT_S16_10BIT_YUV422 \
	(GE2D_FMT_S16_10BIT_YUV422 | GE2D_COLOR_MAP_10BIT_YUV422)

#define GE2D_FORMAT_S16_10BIT_YUV422T \
	(GE2D_FMT_S16_10BIT_YUV422T | GE2D_COLOR_MAP_10BIT_YUV422)

#define GE2D_FORMAT_S16_10BIT_YUV422B \
	(GE2D_FMT_S16_10BIT_YUV422B | GE2D_COLOR_MAP_10BIT_YUV422)

#define GE2D_FORMAT_S16_10BIT_YVU422 \
	(GE2D_FMT_S16_10BIT_YUV422 | GE2D_COLOR_MAP_10BIT_YVU422)

#define GE2D_FORMAT_S16_12BIT_YUV422 \
	(GE2D_FMT_S16_12BIT_YUV422 | GE2D_COLOR_MAP_12BIT_YUV422)

#define GE2D_FORMAT_S16_12BIT_YUV422T \
	(GE2D_FMT_S16_12BIT_YUV422T | GE2D_COLOR_MAP_12BIT_YUV422)

#define GE2D_FORMAT_S16_12BIT_YUV422B \
	(GE2D_FMT_S16_12BIT_YUV422B | GE2D_COLOR_MAP_12BIT_YUV422)

#define GE2D_FORMAT_S16_12BIT_YVU422 \
	(GE2D_FMT_S16_12BIT_YUV422 | GE2D_COLOR_MAP_12BIT_YVU422)

#define	UPDATE_SRC_DATA     0x01
#define	UPDATE_SRC_GEN      0x02
#define	UPDATE_DST_DATA     0x04
#define	UPDATE_DST_GEN      0x08
#define	UPDATE_DP_GEN       0x10
#define	UPDATE_SCALE_COEF   0x20
#define	UPDATE_ALL          0x3f

#define IS_FILLRECT         0x1
#define IS_BLEND            0x2
#define IS_STRETCHBLIT      0x4
#define IS_BLIT             0x8

/* Indicates that dma fd has been attached using ioctl GE2D_ATTACH_DMA_FD */
#define DMA_FD_ATTACHED     (-2)

struct rectangle_s {
	int x;   /* X coordinate of its top-left point */
	int y;   /* Y coordinate of its top-left point */
	int w;   /* width of it */
	int h;   /* height of it */
};

struct ge2d_para_s {
	unsigned int    color;
	struct rectangle_s src1_rect;
	struct rectangle_s src2_rect;
	struct rectangle_s dst_rect;
	int op;
};

struct ge2d_gen_s {
	unsigned char     interrupt_ctrl;
	unsigned char     dp_onoff_mode;
	unsigned char     vfmt_onoff_en;
	unsigned int      dp_on_cnt;
	unsigned int      dp_off_cnt;
	unsigned int      fifo_size;
	unsigned int      burst_ctrl;
	unsigned int      bytes_per_burst;
};

struct ge2d_src1_data_s {
	unsigned char     urgent_en;
	unsigned char     ddr_burst_size_y;
	unsigned char     ddr_burst_size_cb;
	unsigned char     ddr_burst_size_cr;
	unsigned int	  canaddr;
	unsigned char     x_yc_ratio;
	unsigned char     y_yc_ratio;
	unsigned char     sep_en;
	unsigned char     format;

	unsigned char     endian;
	unsigned char     color_map;

	unsigned char     mode_8b_sel;
	unsigned char     lut_en;
	unsigned char     deep_color;
	unsigned char     mult_rounding;
	unsigned char     alpha_conv_mode0;
	unsigned char     alpha_conv_mode1;
	unsigned char     color_conv_mode0;
	unsigned char     color_conv_mode1;
	unsigned int      def_color;
	unsigned int      format_all;
	unsigned long      phy_addr[MAX_PLANE];
	unsigned int      stride[MAX_PLANE];
	unsigned int      stride_mode[MAX_PLANE];
};

struct ge2d_src1_gen_s {
	int               clipx_start;
	int               clipx_end;
	int               clipy_start;
	int               clipy_end;
	unsigned char     clipx_start_ex;
	unsigned char     clipx_end_ex;
	unsigned char     clipy_start_ex;
	unsigned char     clipy_end_ex;
	unsigned char     pic_struct;
	/* bit1 for outside alpha , bit0 for color data */
	unsigned char     fill_mode;
	unsigned int      outside_alpha;
	unsigned char     chfmt_rpt_pix;
	unsigned char     cvfmt_rpt_pix;
};

struct ge2d_src2_dst_data_s {
	unsigned char     urgent_en;
	unsigned char     ddr_burst_size;
	unsigned char     src2_canaddr;
	unsigned char     src2_format;

	unsigned char     src2_endian;
	unsigned char     src2_color_map;

	unsigned char     src2_mode_8b_sel;
	unsigned int      src2_def_color;

	unsigned int     dst_canaddr;
	unsigned char    dst_format;

	unsigned char     dst_endian;
	unsigned char     dst_color_map;

	unsigned char     dst_mode_8b_sel;

	unsigned int      src2_format_all;
	unsigned int      dst_format_all;

	/* only for m6 */
	unsigned char	dst2_pixel_byte_width;
	unsigned char	dst2_color_map;
	unsigned char	dst2_discard_mode;
	unsigned char	dst2_enable;

	unsigned long src2_phyaddr[MAX_PLANE];
	unsigned int src2_stride[MAX_PLANE];
	unsigned int src2_stride_mode[MAX_PLANE];
	unsigned long dst_phyaddr[MAX_PLANE];
	unsigned int dst_stride[MAX_PLANE];
	unsigned int dst_stride_mode[MAX_PLANE];
	unsigned char dst_rpt;
};

struct ge2d_src2_dst_gen_s {
	int               src2_clipx_start;
	int               src2_clipx_end;
	int               src2_clipy_start;
	int               src2_clipy_end;
	unsigned char     src2_pic_struct;
	/* bit1 for outside alpha , bit0 for color data */
	unsigned char     src2_fill_mode;
	unsigned int      src2_outside_alpha;

	int               dst_clipx_start;
	int               dst_clipx_end;
	int               dst_clipy_start;
	int               dst_clipy_end;
	unsigned char     dst_clip_mode;
	unsigned char     dst_pic_struct;
};

struct ge2d_dp_gen_s {
	/* scaler related */
	unsigned char     src1_vsc_bank_length;
	unsigned char     src1_vsc_phase0_always_en;
	unsigned char     src1_hsc_bank_length;
	unsigned char     src1_hsc_phase0_always_en;
	/* 1bit, 0: using minus, 1: using repeat data */
	unsigned char     src1_hsc_rpt_ctrl;
	/* 1bit, 0: using minus  1: using repeat data */
	unsigned char     src1_vsc_rpt_ctrl;
	unsigned char     src1_hsc_nearest_en;
	unsigned char     src1_vsc_nearest_en;

	unsigned char     antiflick_en;
	unsigned char     antiflick_ycbcr_rgb_sel;
	unsigned char     antiflick_cbcr_en;
	/* Y= (R * r_coef + G * g_coef + B * b_coef)/256 */
	unsigned int      antiflick_r_coef;
	unsigned int      antiflick_g_coef;
	unsigned int      antiflick_b_coef;
	unsigned int      antiflick_color_filter_n1[4];
	unsigned int      antiflick_color_filter_n2[4];
	unsigned int      antiflick_color_filter_n3[4];
	unsigned int      antiflick_color_filter_th[3];
	unsigned int      antiflick_alpha_filter_n1[4];
	unsigned int      antiflick_alpha_filter_n2[4];
	unsigned int      antiflick_alpha_filter_n3[4];
	unsigned int      antiflick_alpha_filter_th[3];
	/* matrix related */
	unsigned char     use_matrix_default;         /* src1 matrix */
	unsigned char     use_matrix_default_src2;    /* src2_matrix */
	unsigned char     use_matrix_default_dst;     /* dst  matrix */
	unsigned char     conv_matrix_en;             /* src1 matrix enable */
	unsigned char     conv_matrix_en_src2;        /* src2 matrix enable */
	unsigned char     conv_matrix_en_dst;         /* dst  matrix enable */
	unsigned char     matrix_sat_in_en;
	unsigned char     dst_signed_mode;
	unsigned char     matrix_minus_16_ctrl; /* 3bit */
	unsigned char     matrix_sign_ctrl;     /* 3bit */
	int               matrix_offset[3];
	int               matrix_coef[9];

	unsigned char     src1_gb_alpha_en;
	unsigned char     src1_gb_alpha;
#ifdef CONFIG_GE2D_SRC2
	unsigned char     src2_gb_alpha_en;
	unsigned char     src2_gb_alpha;
	unsigned char     src2_cmult_ad;
#endif
	unsigned int      alu_const_color;

	unsigned char     src1_key_en;
	unsigned char     src2_key_en;
	unsigned char     src1_key_mode;
	unsigned char     src2_key_mode;
	unsigned int      src1_key;
	unsigned int      src2_key;
	unsigned int      src1_key_mask;
	unsigned int      src2_key_mask;
	unsigned char     bitmask_en;
	unsigned char     bytemask_only;
	unsigned int      bitmask;
};

struct ge2d_cmd_s {
	int              src1_x_start;
	int              src1_y_start;
	int              src1_x_end;
	int              src1_y_end;
	/* unsigned char    src1_x_start_ex; */
	/* unsigned char    src1_y_start_ex; */
	/* unsigned char    src1_x_end_ex; */
	/* unsigned char    src1_y_end_ex; */

	unsigned char    src1_x_rev;
	unsigned char    src1_y_rev;
	/* unsigned char    src1_x_chr_phase; */
	/* unsigned char    src1_y_chr_phase; */
	unsigned char    src1_fill_color_en;
	unsigned int     src1_fmt;

	int              src2_x_start;
	int              src2_y_start;
	int              src2_x_end;
	int              src2_y_end;
	unsigned char    src2_x_rev;
	unsigned char    src2_y_rev;
	unsigned char    src2_fill_color_en;
	unsigned int     src2_fmt;

	int              dst_x_start;
	int              dst_y_start;
	int              dst_x_end;
	int              dst_y_end;
	unsigned char    dst_xy_swap;
	unsigned char    dst_x_rev;
	unsigned char    dst_y_rev;
	unsigned int     dst_fmt;

	int              sc_prehsc_en;
	int              sc_prevsc_en;
	int              sc_hsc_en;
	int              sc_vsc_en;
	int              vsc_phase_step;
	int              vsc_phase_slope;
	unsigned char    vsc_rpt_l0_num;
	int              vsc_ini_phase;
	int              hsc_phase_step;
	int              hsc_phase_slope;
	unsigned char    hsc_rpt_p0_num;
	int              hsc_ini_phase;
	unsigned char    hsc_div_en;
	unsigned int    hsc_div_length;
	int              hsc_adv_num;
	int              hsc_adv_phase;

	unsigned char    src1_cmult_asel;
	unsigned char    src2_cmult_asel;
#ifdef CONFIG_GE2D_SRC2
	unsigned char    src2_cmult_ad;
#endif
	unsigned char    color_blend_mode;
	unsigned char    color_src_blend_factor;
	unsigned char    color_dst_blend_factor;
	unsigned char    color_logic_op;

	unsigned char    alpha_blend_mode;
	unsigned char    alpha_src_blend_factor;
	unsigned char    alpha_dst_blend_factor;
	unsigned char    alpha_logic_op;

	int (*cmd_cb)(unsigned int param);
	unsigned int     cmd_cb_param;
	unsigned int     src1_buffer;
	unsigned int     src2_buffer;
	unsigned char    release_flag;
	unsigned char    wait_done_flag;
	unsigned char    hang_flag;
	unsigned char    cmd_op;
};

struct ge2d_canvas_cfg_s {
	int canvas_used;
	int canvas_index;
	unsigned int stride;
	unsigned int height;
	unsigned long phys_addr;
};

struct ge2d_dma_cfg_s {
	int dma_used[MAX_PLANE];
	void *dma_cfg;
};

struct ge2d_matrix_s {
	unsigned int pre_offset0;
	unsigned int pre_offset1;
	unsigned int pre_offset2;
	unsigned int coef0;
	unsigned int coef1;
	unsigned int coef2;
	unsigned int coef3;
	unsigned int coef4;
	unsigned int coef5;
	unsigned int coef6;
	unsigned int coef7;
	unsigned int coef8;
	unsigned int offset0;
	unsigned int offset1;
	unsigned int offset2;
	/* input y/cb/cr saturation enable */
	unsigned char sat_in_en;
};

struct ge2d_stride_s {
	unsigned int src1_stride[MAX_PLANE];
	unsigned int src2_stride[MAX_PLANE];
	unsigned int dst_stride[MAX_PLANE];
};

/*temporary struct to accept data from user*/
struct ge2d_clut8_t {
	u32 data[256];
	u32 count;
};

struct ge2d_clut8_s {
	u32 *data;
	u32 count;
};

struct ge2d_config_s {
	struct ge2d_gen_s            gen;
	struct ge2d_src1_data_s      src1_data;
	struct ge2d_src1_gen_s       src1_gen;
	struct ge2d_src2_dst_data_s  src2_dst_data;
	struct ge2d_src2_dst_gen_s   src2_dst_gen;
	struct ge2d_dp_gen_s         dp_gen;
	unsigned int	v_scale_coef_type;
	unsigned int	h_scale_coef_type;
	unsigned int	update_flag;
	struct ge2d_canvas_cfg_s src_canvas_cfg[MAX_PLANE];
	struct ge2d_canvas_cfg_s src2_canvas_cfg[MAX_PLANE];
	struct ge2d_canvas_cfg_s dst_canvas_cfg[MAX_PLANE];
	struct ge2d_dma_cfg_s src_dma_cfg[MAX_PLANE];
	struct ge2d_dma_cfg_s src2_dma_cfg[MAX_PLANE];
	struct ge2d_dma_cfg_s dst_dma_cfg[MAX_PLANE];
	struct ge2d_matrix_s matrix_custom;
	struct ge2d_clut8_s clut8_table;
	/* operate on secure memory */
	int mem_sec;
};

struct ge2d_dma_buf_s {
	dma_addr_t paddr;
	void *vaddr;
	int len;
};

enum ge2d_data_type_e {
	AML_GE2D_SRC,
	AML_GE2D_SRC2,
	AML_GE2D_DST,
	AML_GE2D_TYPE_INVALID,
};

enum ge2d_src_dst_e {
	OSD0_OSD0 = 0,
	OSD0_OSD1,
	OSD1_OSD1,
	OSD1_OSD0,
	ALLOC_OSD0,
	ALLOC_OSD1,
	ALLOC_ALLOC,
	TYPE_INVALID,
};

enum ge2d_src_canvas_type_e {
	CANVAS_OSD0 = 0,
	CANVAS_OSD1,
	CANVAS_ALLOC,
	CANVAS_TYPE_INVALID,
};

struct ge2d_item_flag_s {
	unsigned int cmd_queue_mode : 1;
	unsigned int cmd_queue_last_item : 1;
	unsigned int cmd_queue_ready : 1;
};

struct ge2d_queue_item_s {
	struct list_head list;
	struct ge2d_cmd_s cmd;
	struct ge2d_config_s config;
	struct ge2d_item_flag_s flag;
};

struct ge2d_context_s {
	/* connect all process in one queue for RR process. */
	struct list_head   list;
	/* current wq configuration */
	struct ge2d_config_s       config;
	struct ge2d_cmd_s		cmd;
	struct list_head	work_queue;
	struct list_head	free_queue;
	wait_queue_head_t	cmd_complete;
	int				queue_dirty;
	int				queue_need_recycle;
	int				ge2d_request_exit;
	spinlock_t		lock;	/* for get and release item. */
};

struct ge2d_event_s {
	wait_queue_head_t cmd_complete;
	struct completion process_complete;
	/* for queue switch and create destroy queue. */
	spinlock_t sem_lock;
	struct completion cmd_in_com;
	/* for destroy context */
	struct mutex destroy_lock;
};

struct ge2d_manager_s {
	struct list_head process_queue;
	struct ge2d_context_s *current_wq;
	struct ge2d_context_s *last_wq;
	struct task_struct *ge2d_thread;
	struct ge2d_event_s event;
	struct aml_dma_buffer *buffer;
	int irq_num;
	int ge2d_state;
	int process_queue_state;
	int probe;
	struct platform_device *pdev;
};

struct src_dst_para_s {
	int  xres;
	int  yres;
	int  canvas_index;
	int  bpp;
	int  ge2d_color_index;
	ulong  phy_addr[MAX_PLANE];
	int  stride[MAX_PLANE];
};

enum ge2d_op_type_e {
	GE2D_OP_DEFAULT = 0,
	GE2D_OP_FILLRECT,
	GE2D_OP_BLIT,
	GE2D_OP_STRETCHBLIT,
	GE2D_OP_BLEND,
	GE2D_OP_MAXNUM
};

struct config_planes_s {
	unsigned long addr;
	unsigned int w;
	unsigned int h;
};

#ifdef CONFIG_COMPAT
struct compat_config_planes_s {
	compat_uptr_t addr;
	unsigned int w;
	unsigned int h;
};
#endif

struct src_key_ctrl_s {
	int key_enable;
	int key_color;
	int key_mask;
	int key_mode;
};

struct config_para_s {
	int  src_dst_type;
	int  alu_const_color;
	unsigned int src_format;
	unsigned int dst_format; /* add for src&dst all in user space. */

	struct config_planes_s src_planes[4];
	struct config_planes_s dst_planes[4];
	struct src_key_ctrl_s  src_key;
};

#ifdef CONFIG_COMPAT
struct compat_config_para_s {
	int  src_dst_type;
	int  alu_const_color;
	unsigned int src_format;
	unsigned int dst_format; /* add for src&dst all in user space. */

	struct compat_config_planes_s src_planes[4];
	struct compat_config_planes_s dst_planes[4];
	struct src_key_ctrl_s  src_key;
};
#endif

struct src_dst_para_ex_s {
	int  canvas_index;
	int  top;
	int  left;
	int  width;
	int  height;
	int  format;
	int  mem_type;
	int  color;
	unsigned char x_rev;
	unsigned char y_rev;
	unsigned char fill_color_en;
	unsigned char fill_mode;
};

struct config_para_ex_s {
	struct src_dst_para_ex_s src_para;
	struct src_dst_para_ex_s src2_para;
	struct src_dst_para_ex_s dst_para;

	/* key mask */
	struct src_key_ctrl_s  src_key;
	struct src_key_ctrl_s  src2_key;

	int alu_const_color;
	unsigned int src1_gb_alpha;
#ifdef CONFIG_GE2D_SRC2
	unsigned int src2_gb_alpha;
#endif
	unsigned int op_mode;
	unsigned char bitmask_en;
	unsigned char bytemask_only;
	unsigned int  bitmask;
	unsigned char dst_xy_swap;

	/* scaler and phase related */
	unsigned int hf_init_phase;
	int hf_rpt_num;
	unsigned int hsc_start_phase_step;
	int hsc_phase_slope;
	unsigned int vf_init_phase;
	int vf_rpt_num;
	unsigned int vsc_start_phase_step;
	int vsc_phase_slope;
	unsigned char src1_vsc_phase0_always_en;
	unsigned char src1_hsc_phase0_always_en;
	/* 1bit, 0: using minus, 1: using repeat data */
	unsigned char src1_hsc_rpt_ctrl;
	/* 1bit, 0: using minus  1: using repeat data */
	unsigned char src1_vsc_rpt_ctrl;

	/* canvas info */
	struct config_planes_s src_planes[4];
	struct config_planes_s src2_planes[4];
	struct config_planes_s dst_planes[4];
	/* operate on secure memory */
	int mem_sec;
};

#ifdef CONFIG_COMPAT
struct compat_config_para_ex_s {
	struct src_dst_para_ex_s src_para;
	struct src_dst_para_ex_s src2_para;
	struct src_dst_para_ex_s dst_para;

	/* key mask */
	struct src_key_ctrl_s  src_key;
	struct src_key_ctrl_s  src2_key;

	int alu_const_color;
	unsigned int src1_gb_alpha;
#ifdef CONFIG_GE2D_SRC2
	unsigned int src2_gb_alpha;
#endif
	unsigned int op_mode;
	unsigned char bitmask_en;
	unsigned char bytemask_only;
	unsigned int  bitmask;
	unsigned char dst_xy_swap;

	/* scaler and phase related */
	unsigned int hf_init_phase;
	int hf_rpt_num;
	unsigned int hsc_start_phase_step;
	int hsc_phase_slope;
	unsigned int vf_init_phase;
	int vf_rpt_num;
	unsigned int vsc_start_phase_step;
	int vsc_phase_slope;
	unsigned char src1_vsc_phase0_always_en;
	unsigned char src1_hsc_phase0_always_en;
	/* 1bit, 0: using minus, 1: using repeat data */
	unsigned char src1_hsc_rpt_ctrl;
	/* 1bit, 0: using minus  1: using repeat data */
	unsigned char src1_vsc_rpt_ctrl;

	/* canvas info */
	struct compat_config_planes_s src_planes[4];
	struct compat_config_planes_s src2_planes[4];
	struct compat_config_planes_s dst_planes[4];
	/* operate on secure memory */
	int mem_sec;
};
#endif

struct config_planes_ion_s {
	unsigned long addr;
	unsigned int w;
	unsigned int h;
	int shared_fd;
};

#ifdef CONFIG_COMPAT
struct compat_config_planes_ion_s {
	compat_uptr_t addr;
	unsigned int w;
	unsigned int h;
	int shared_fd;
};
#endif

struct config_para_ex_ion_s {
	struct src_dst_para_ex_s src_para;
	struct src_dst_para_ex_s src2_para;
	struct src_dst_para_ex_s dst_para;

	/* key mask */
	struct src_key_ctrl_s  src_key;
	struct src_key_ctrl_s  src2_key;

	unsigned char src1_cmult_asel;
	unsigned char src2_cmult_asel;
#ifdef CONFIG_GE2D_SRC2
	unsigned char src2_cmult_ad;
#endif
	int alu_const_color;
	unsigned char src1_gb_alpha_en;
	unsigned int src1_gb_alpha;
#ifdef CONFIG_GE2D_SRC2
	unsigned char src2_gb_alpha_en;
	unsigned int src2_gb_alpha;
#endif
	unsigned int op_mode;
	unsigned char bitmask_en;
	unsigned char bytemask_only;
	unsigned int  bitmask;
	unsigned char dst_xy_swap;

	/* scaler and phase related */
	unsigned int hf_init_phase;
	int hf_rpt_num;
	unsigned int hsc_start_phase_step;
	int hsc_phase_slope;
	unsigned int vf_init_phase;
	int vf_rpt_num;
	unsigned int vsc_start_phase_step;
	int vsc_phase_slope;
	unsigned char src1_vsc_phase0_always_en;
	unsigned char src1_hsc_phase0_always_en;
	/* 1bit, 0: using minus, 1: using repeat data */
	unsigned char src1_hsc_rpt_ctrl;
	/* 1bit, 0: using minus  1: using repeat data */
	unsigned char src1_vsc_rpt_ctrl;

	/* canvas info */
	struct config_planes_ion_s src_planes[4];
	struct config_planes_ion_s src2_planes[4];
	struct config_planes_ion_s dst_planes[4];
};

#ifdef CONFIG_COMPAT
struct compat_config_para_ex_ion_s {
	struct src_dst_para_ex_s src_para;
	struct src_dst_para_ex_s src2_para;
	struct src_dst_para_ex_s dst_para;

	/* key mask */
	struct src_key_ctrl_s  src_key;
	struct src_key_ctrl_s  src2_key;

	unsigned char src1_cmult_asel;
	unsigned char src2_cmult_asel;
#ifdef CONFIG_GE2D_SRC2
	unsigned char src2_cmult_ad;
#endif
	int alu_const_color;
	unsigned char src1_gb_alpha_en;
	unsigned int src1_gb_alpha;
#ifdef CONFIG_GE2D_SRC2
	unsigned char src2_gb_alpha_en;
	unsigned int src2_gb_alpha;
#endif
	unsigned int op_mode;
	unsigned char bitmask_en;
	unsigned char bytemask_only;
	unsigned int  bitmask;
	unsigned char dst_xy_swap;

	/* scaler and phase related */
	unsigned int hf_init_phase;
	int hf_rpt_num;
	unsigned int hsc_start_phase_step;
	int hsc_phase_slope;
	unsigned int vf_init_phase;
	int vf_rpt_num;
	unsigned int vsc_start_phase_step;
	int vsc_phase_slope;
	unsigned char src1_vsc_phase0_always_en;
	unsigned char src1_hsc_phase0_always_en;
	/* 1bit, 0: using minus, 1: using repeat data */
	unsigned char src1_hsc_rpt_ctrl;
	/* 1bit, 0: using minus  1: using repeat data */
	unsigned char src1_vsc_rpt_ctrl;

	/* canvas info */
	struct compat_config_planes_ion_s src_planes[4];
	struct compat_config_planes_ion_s src2_planes[4];
	struct compat_config_planes_ion_s dst_planes[4];
};
#endif

struct config_para_ex_memtype_s {
	int ge2d_magic;
	struct config_para_ex_ion_s _ge2d_config_ex;
	/* memtype */
	unsigned int src1_mem_alloc_type;
	unsigned int src2_mem_alloc_type;
	unsigned int dst_mem_alloc_type;
	/* for customized matrix */
	struct ge2d_matrix_s matrix_custom;
	/* for customized stride */
	struct ge2d_stride_s stride_custom;
};

struct config_ge2d_para_ex_s {
	union {
		struct config_para_ex_ion_s para_config_ion;
		struct config_para_ex_memtype_s para_config_memtype;
	};
};

#ifdef CONFIG_COMPAT
struct compat_config_para_ex_memtype_s {
	int ge2d_magic;
	struct compat_config_para_ex_ion_s _ge2d_config_ex;
	/* memtype */
	unsigned int src1_mem_alloc_type;
	unsigned int src2_mem_alloc_type;
	unsigned int dst_mem_alloc_type;
	/* for customized matrix */
	struct ge2d_matrix_s matrix_custom;
	/* for customized stride */
	struct ge2d_stride_s stride_custom;
};

struct compat_config_ge2d_para_ex_s {
	union {
		struct compat_config_para_ex_ion_s para_config_ion;
		struct compat_config_para_ex_memtype_s para_config_memtype;
	};
};
#endif

/* for ge2d dma buf define */
struct ge2d_dmabuf_req_s {
	int index;
	unsigned int len;
	unsigned int dma_dir;
};

struct ge2d_dmabuf_exp_s {
	int index;
	unsigned int flags;
	int fd;
};

struct ge2d_dmabuf_attach_s {
	int dma_fd[MAX_PLANE];
	enum ge2d_data_type_e data_type;
};

/* end of ge2d dma buffer define */

enum {
	CBUS_BASE,
	AOBUS_BASE,
	HIUBUS_BASE,
	GEN_PWR_SLEEP0,
	GEN_PWR_ISO0,
	MEM_PD_REG0,
	PWR_SMC,
	PWR_RUNTIME
};

struct ge2d_ctrl_s {
	unsigned int table_type;
	unsigned int reg;
	unsigned int val;
	unsigned int start;
	unsigned int len;
	unsigned int udelay;
};

struct ge2d_power_table_s {
	unsigned int table_size;
	struct ge2d_ctrl_s *power_table;
};

struct ge2d_device_data_s {
	int ge2d_rate;
	int src2_alp;
	int canvas_status;
	int deep_color;
	int hang_flag;
	int fifo;
	int has_self_pwr;
	struct ge2d_power_table_s *poweron_table;
	struct ge2d_power_table_s *poweroff_table;
	int chip_type;
	unsigned int adv_matrix;
	unsigned int src2_repeat;    /* src2 x/y repeat */
	unsigned int dst_repeat;     /* dst x repeat */
	unsigned int dst_sign_mode;  /* dst signed matrix */
	unsigned int blk_stride_mode;     /* block or linear mode*/
	unsigned int cmd_queue_mode;  /* cmd queue mode */
};

extern struct ge2d_device_data_s ge2d_meson_dev;

#define GE2D_IOC_MAGIC  'G'

#define GE2D_CONFIG		_IOW(GE2D_IOC_MAGIC, 0x00, struct config_para_s)

#ifdef CONFIG_COMPAT
#define GE2D_CONFIG32	_IOW(GE2D_IOC_MAGIC, 0x00, struct compat_config_para_s)
#endif

#define GE2D_CONFIG_EX	 _IOW(GE2D_IOC_MAGIC, 0x01,  struct config_para_ex_s)

#ifdef CONFIG_COMPAT
#define GE2D_CONFIG_EX32  \
	_IOW(GE2D_IOC_MAGIC, 0x01,  struct compat_config_para_ex_s)
#endif

#define	GE2D_SRCCOLORKEY     _IOW(GE2D_IOC_MAGIC, 0x02, struct config_para_s)

#ifdef CONFIG_COMPAT
#define	GE2D_SRCCOLORKEY32   \
	_IOW(GE2D_IOC_MAGIC, 0x02, struct compat_config_para_s)
#endif

#define GE2D_CONFIG_EX_ION	 \
	_IOW(GE2D_IOC_MAGIC, 0x03,  struct config_para_ex_ion_s)

#ifdef CONFIG_COMPAT
#define GE2D_CONFIG_EX32_ION  \
	_IOW(GE2D_IOC_MAGIC, 0x03,  struct compat_config_para_ex_ion_s)
#endif

#define GE2D_REQUEST_BUFF _IOW(GE2D_IOC_MAGIC, 0x04, struct ge2d_dmabuf_req_s)
#define GE2D_EXP_BUFF _IOW(GE2D_IOC_MAGIC, 0x05, struct ge2d_dmabuf_exp_s)
#define GE2D_FREE_BUFF _IOW(GE2D_IOC_MAGIC, 0x06, int)

#define GE2D_CONFIG_EX_MEM	 \
	_IOW(GE2D_IOC_MAGIC, 0x07,  struct config_ge2d_para_ex_s)

#ifdef CONFIG_COMPAT
#define GE2D_CONFIG_EX32_MEM  \
	_IOW(GE2D_IOC_MAGIC, 0x07,  struct compat_config_ge2d_para_ex_s)
#endif

#define GE2D_SYNC_DEVICE _IOW(GE2D_IOC_MAGIC, 0x08, int)
#define GE2D_SYNC_CPU _IOW(GE2D_IOC_MAGIC, 0x09, int)

#define GE2D_ATTACH_DMA_FD _IOW(GE2D_IOC_MAGIC, 0x0a, struct ge2d_dmabuf_attach_s)
#define GE2D_DETACH_DMA_FD _IOW(GE2D_IOC_MAGIC, 0x0b, enum ge2d_data_type_e)
#define GE2D_SET_CLUT _IOW(GE2D_IOC_MAGIC, 0x0c, struct ge2d_clut8_t)

/* cmd queue */
#define	GE2D_FILLRECTANGLE_ENQUEUE \
	_IOW(GE2D_IOC_MAGIC, 0x0d, struct ge2d_para_s)
#define	GE2D_BLEND_ENQUEUE         \
	_IOW(GE2D_IOC_MAGIC, 0x0e, struct ge2d_para_s)
#define GE2D_BLEND_NOALPHA_ENQUEUE \
	_IOW(GE2D_IOC_MAGIC, 0x0f, struct ge2d_para_s)
#define	GE2D_STRETCHBLIT_ENQUEUE   \
	_IOW(GE2D_IOC_MAGIC, 0x10, struct ge2d_para_s)
#define	GE2D_STRETCHBLIT_NOALPHA_ENQUEUE   \
	_IOW(GE2D_IOC_MAGIC, 0x11, struct ge2d_para_s)
#define	GE2D_BLIT_NOALPHA_ENQUEUE          \
	_IOW(GE2D_IOC_MAGIC, 0x12, struct ge2d_para_s)
#define	GE2D_BLIT_ENQUEUE                  \
	_IOW(GE2D_IOC_MAGIC, 0x13, struct ge2d_para_s)
#define GE2D_POST_QUEUE            \
	_IO(GE2D_IOC_MAGIC, 0x14)
#define GE2D_POST_QUEUE_NOBLOCK    \
	_IO(GE2D_IOC_MAGIC, 0x15)

void ge2d_set_src1_data(struct ge2d_src1_data_s *cfg, u32 mask);
void ge2d_set_src1_gen(struct ge2d_src1_gen_s *cfg, u32 mask);
void ge2d_set_src2_dst_data(struct ge2d_src2_dst_data_s *cfg, u32 mask);
void ge2d_set_src2_dst_gen(struct ge2d_src2_dst_gen_s *cfg,
			   struct ge2d_cmd_s *cmd, u32 mask);
void ge2d_set_dp_gen(struct ge2d_config_s *config, u32 mask);
void ge2d_set_cmd(struct ge2d_cmd_s *cfg, u32 mask);
void ge2d_wait_done(void);
void ge2d_set_src1_scale_coef(unsigned int v_filt_type,
			      unsigned int h_filt_type,
			      unsigned int mask);
void ge2d_set_gen(struct ge2d_gen_s *cfg);
void ge2d_soft_rst(void);
void ge2d_dma_reset(void);
unsigned int ge2d_queue_cnt(void);
bool ge2d_queue_empty(void);
bool ge2d_is_busy(void);
int ge2d_cmd_fifo_full(void);

int ge2d_context_config(struct ge2d_context_s *context,
			struct config_para_s *ge2d_config);
int ge2d_context_config_ex(struct ge2d_context_s *context,
			   struct config_para_ex_s *ge2d_config);
int ge2d_context_config_ex_ion(struct ge2d_context_s *context,
			       struct config_para_ex_ion_s *ge2d_config);
int
ge2d_context_config_ex_mem(struct ge2d_context_s *context,
			   struct config_para_ex_memtype_s *ge2d_config_mem);
struct ge2d_context_s *create_ge2d_work_queue(void);
int destroy_ge2d_work_queue(struct ge2d_context_s *wq);
int ge2d_wq_remove_config(struct ge2d_context_s *wq);
void ge2d_wq_set_scale_coef(struct ge2d_context_s *wq,
			    unsigned int v_scale_coef,
			    unsigned int h_scale_coef);
int ge2d_antiflicker_enable(struct ge2d_context_s *context,
			    unsigned long enable);
struct ge2d_src1_data_s *ge2d_wq_get_src_data(struct ge2d_context_s *wq);
struct ge2d_src1_gen_s *ge2d_wq_get_src_gen(struct ge2d_context_s *wq);
struct ge2d_src2_dst_data_s
*ge2d_wq_get_dst_data(struct ge2d_context_s *wq);
extern struct ge2d_src2_dst_gen_s
*ge2d_wq_get_dst_gen(struct ge2d_context_s *wq);
struct ge2d_dp_gen_s *ge2d_wq_get_dp_gen(struct ge2d_context_s *wq);
struct ge2d_cmd_s *ge2d_wq_get_cmd(struct ge2d_context_s *wq);
int ge2d_wq_add_work(struct ge2d_context_s *wq, int enqueue);
void ge2d_canv_config(u32 index, ulong *addr, u32 *stride, u32 *stride_mode,
		      u32 mask);
void switch_cmd_queue_irq(u32 queue_index, u32 enable);
void ge2d_backup_initial_regs(void __iomem *to_buf);
void init_cmd_queue_buf(u32 queue_index);
void adjust_cmd_queue_buf(u32 queue_index);
void start_cmd_queue_process(u32 queue_cnt);
void stop_cmd_queue_process(void);
void dump_cmd_queue_regs(u32 queue_index);

#include "ge2d_func.h"

#endif
