/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef __MTKFB_H
#define __MTKFB_H

#include <linux/types.h>
#include "mtkfb_info.h"


/**NOTICE:
 * Must be consistent with bionic/libc/kernel/linux/common/mtkfb.h
 */
#define MTK_FB_NO_ION_FD                 ((int)(~0U>>1))
#define MTK_FB_NO_USE_LAEYR_ID			 ((int)(~0U>>1))
#define FBCAPS_GENERIC_MASK              (0x00000fff)
#define FBCAPS_LCDC_MASK                 (0x00fff000)
#define FBCAPS_PANEL_MASK                (0xff000000)
#define FBCAPS_MANUAL_UPDATE             (0x00001000)
#define FBCAPS_SET_BACKLIGHT             (0x01000000)
#define MTKFB_ERROR_IS_EARLY_SUSPEND     (0x12000000)
/* --------------------------------------------------------------------------- */
/* IOCTL commands. */
#define MTK_IOW(num, dtype)     _IOW('O', num, dtype)
#define MTK_IOR(num, dtype)     _IOR('O', num, dtype)
#define MTK_IOWR(num, dtype)    _IOWR('O', num, dtype)
#define MTK_IO(num)             _IO('O', num)
#define MTKFB_QUEUE_OVERLAY_CONFIG			MTK_IOW(137, struct fb_overlay_config)
/* -------------------------------------------------------------------------- */
#define MTKFB_SET_OVERLAY_LAYER                MTK_IOW(0, struct fb_overlay_layer)
#define MTKFB_TRIG_OVERLAY_OUT                 MTK_IO(1)
#define MTKFB_SET_VIDEO_LAYERS                 MTK_IOW(2, struct fb_overlay_layer)
#define MTKFB_CAPTURE_FRAMEBUFFER              MTK_IOW(3, unsigned long)
#define MTKFB_CONFIG_IMMEDIATE_UPDATE          MTK_IOW(4, unsigned long)
#define MTKFB_SET_MULTIPLE_LAYERS              MTK_IOW(5, struct fb_overlay_layer)
#define MTKFB_REGISTER_OVERLAYBUFFER           MTK_IOW(6, struct fb_overlay_buffer_info)
#define MTKFB_UNREGISTER_OVERLAYBUFFER         MTK_IOW(7, unsigned int)
#define MTKFB_SET_ORIENTATION                  MTK_IOW(8, unsigned long)
#define MTKFB_FBLAYER_ENABLE                   MTK_IOW(9, unsigned int)
#define MTKFB_LOCK_FRONT_BUFFER                MTK_IO(10)
#define MTKFB_UNLOCK_FRONT_BUFFER              MTK_IO(11)
#define MTKFB_POWERON				           MTK_IO(12)
#define MTKFB_POWEROFF				           MTK_IO(13)

/* Fence/Ion, OVL decoupling */
#define MTKFB_PREPARE_OVERLAY_BUFFER           MTK_IOW(14, struct fb_overlay_buffer)

/* S3D control */
#define MTKFB_SET_COMPOSING3D                  MTK_IOW(15, unsigned long)
#define MTKFB_SET_S3D_FTM		               MTK_IOW(16, unsigned long)

/* FM De-sense for EM and Normal mode */
#define MTKFB_GET_DEFAULT_UPDATESPEED          MTK_IOR(17, unsigned long)
#define MTKFB_GET_CURR_UPDATESPEED             MTK_IOR(18, unsigned long)
/* for EM, not called change writecycle because DPI change pll ckl */
#define MTKFB_CHANGE_UPDATESPEED               MTK_IOW(19, unsigned long)
#define MTKFB_GET_INTERFACE_TYPE               MTK_IOR(20, unsigned long)	/* /0 DBI, 1 DPI, 2 MIPI */
#define MTKFB_GET_POWERSTATE		           MTK_IOR(21, unsigned long)	/* /0: power off  1: power on */
#define MTKFB_GET_DISPLAY_IF_INFORMATION       MTK_IOR(22, mtk_dispif_info_t)
/*called before SET_OVERLAY each time, if true, hwc will not use FB_LAYER again*/
#define MTKFB_AEE_LAYER_EXIST                  MTK_IOR(23, unsigned long)
#define MTKFB_GET_OVERLAY_LAYER_INFO           MTK_IOR(24, struct fb_overlay_layer_info)
#define MTKFB_FACTORY_AUTO_TEST                MTK_IOR(25, unsigned long)
#define MTKFB_GET_FRAMEBUFFER_MVA              MTK_IOR(26, unsigned int)
#define MTKFB_SLT_AUTO_CAPTURE                 MTK_IOWR(27, struct fb_slt_catpure)

/*error handling*/
#define MTKFB_META_RESTORE_SCREEN              MTK_IOW(101, unsigned long)
#define MTKFB_ERROR_INDEX_UPDATE_TIMEOUT       MTK_IO(103)
#define MTKFB_ERROR_INDEX_UPDATE_TIMEOUT_AEE   MTK_IO(104)

/*restore bootlogo and character in meta mode*/
#define MTKFB_META_SHOW_BOOTLOGO               MTK_IO(105)

/*Extension FB active option*/
#define FB_ACTIVATE_NO_UPDATE  512       /* Skip frame update */
/**
 * Just for mt6589 Platform
 * @{
 */
#define MTKFB_GETVFRAMEPHYSICAL                MTK_IOW(41, unsigned long)
#define MTKFB_WAIT_OVERLAY_READY               MTK_IO(42)
#define MTKFB_GET_OVERLAY_LAYER_COUNT          MTK_IOR(43, unsigned long)
#define MTKFB_GET_VIDEOLAYER_SIZE              MTK_IOR(44, struct fb_overlay_layer)
#define MTKFB_CAPTURE_VIDEOBUFFER              MTK_IOW(45, unsigned long)

/* -------------------------------------------------------------------------- */
/* Video Playback Mode */
#define MTKFB_TV_POST_VIDEO_BUFFER             MTK_IOW(46, unsigned long)
#define MTKFB_TV_LEAVE_VIDEO_PLAYBACK_MODE     MTK_IOW(47, unsigned long)
/* For Factory Mode */
#define MTKFB_IS_TV_CABLE_PLUG_IN              MTK_IOW(48, unsigned long)

/* -------------------------------------------------------------------------- */
#define MTKFB_BOOTANIMATION			           MTK_IO(49)
#define MTKFB_GETFPS			               MTK_IOW(50, unsigned long)
#define MTKFB_VSYNC                            MTK_IO(51)

/* ----------------------------------------------------------------------FM De-sense for EM and Normal mode */
#define MTKFB_FM_NOTIFY_FREQ                   MTK_IOW(52, unsigned long)	/* for Normal mode */
#define MTKFB_RESET_UPDATESPEED                MTK_IO(53)
#define MTKFB_SET_UI_LAYER_ALPHA               MTK_IOW(54, unsigned long)
#define MTKFB_SET_UI_LAYER_SRCKEY              MTK_IOW(55, unsigned long)

#define MTKFB_GET_MAX_DISPLAY_COUNT		       MTK_IOR(56, unsigned int)
#define MTKFB_SET_FB_LAYER_SECURE              MTK_IOW(57, int)
/**
 * @}
 */
/* ---------------------------------------------------------------------- */

/* -------------------------------------------------------------------------- */

typedef enum {
	MTK_FB_ORIENTATION_0 = 0,
	MTK_FB_ORIENTATION_90 = 1,
	MTK_FB_ORIENTATION_180 = 2,
	MTK_FB_ORIENTATION_270 = 3,
} MTK_FB_ORIENTATION;


typedef enum {
	MTK_FB_TV_SYSTEM_NTSC = 0,
	MTK_FB_TV_SYSTEM_PAL = 1,
} MTK_FB_TV_SYSTEM;


typedef enum {
	MTK_FB_TV_FMT_RGB565 = 0,
	MTK_FB_TV_FMT_YUV420_SEQ = 1,
	MTK_FB_TV_FMT_UYUV422 = 2,
	MTK_FB_TV_FMT_YUV420_BLK = 3,
} MTK_FB_TV_SRC_FORMAT;

typedef enum {
	LAYER_NORMAL_BUFFER = 0,
	LAYER_SECURE_BUFFER = 1,
	LAYER_PROTECTED_BUFFER = 2,
	LAYER_SECURE_BUFFER_WITH_ALIGN = 0x10001,	/* the higher 16 bits =1 for adding 64 bytes alignment */
} MTK_FB_OVL_LAYER_SECURE_MODE;

typedef struct _disp_dfo_item {
	char name[32];
	int value;
} disp_dfo_item_t;

/* -------------------------------------------------------------------------- */
struct fb_slt_catpure {
	MTK_FB_FORMAT format;

	volatile char *outputBuffer;
	unsigned int wdma_width;
	unsigned int wdma_height;
};

struct fb_scale {
	unsigned int xscale, yscale;
};

struct fb_frame_offset {
	unsigned int idx;
	unsigned long offset;
};

struct fb_update_window {
	unsigned int x, y;
	unsigned int width, height;
};

typedef enum {
	LAYER_2D = 0,
	LAYER_3D_SBS_0 = 0x1,
	LAYER_3D_SBS_90 = 0x2,
	LAYER_3D_SBS_180 = 0x3,
	LAYER_3D_SBS_270 = 0x4,
	LAYER_3D_TAB_0 = 0x10,
	LAYER_3D_TAB_90 = 0x20,
	LAYER_3D_TAB_180 = 0x30,
	LAYER_3D_TAB_270 = 0x40,
} MTK_FB_LAYER_TYPE;

typedef enum {
	DISP_DIRECT_LINK_MODE,
	DISP_DECOUPLE_MODE
} MTK_DISP_MODE;
struct fb_overlay_mode {
	MTK_DISP_MODE mode;
};

typedef enum {			/* map sessions to scenairos in kernel driver */
	DISP_SESSION_LCM = 1 << 0,	/* DSI0 */
	DISP_SESSION_MEM = 1 << 1,	/* OVL0->WDMA0 */
/* Extension mode, Dst buf is provided by user,for Wifi Display or other purpose */
	DISP_SESSION_WFD = 1 << 2,
	DISP_SESSION_MHL = 1 << 3,	/* DPI */
	DISP_SESSION_LCM1 = 1 << 4,	/* DSI1 */
	DISP_SESSION_MEM1 = 1 << 5,	/* OVL1->WDMA1 */
	/* TODO:can be extended with other Session Id */
	SESSION_MASK = 0xff & ~(1 << 6)
} MTK_DISP_SESSION;

struct fb_overlay_session {
	unsigned int session;	/* one or more @MTK_DISP_SESSION combined */
};

struct fb_overlay_decouple {
	MTK_DISP_MODE mode;
	unsigned int session;
};
struct fb_overlay_buffer {
	/* Input */
	int layer_id;
	unsigned int layer_en;
	int ion_fd;
	unsigned int cache_sync;
	/* Output */
	unsigned int index;
	int fence_fd;
};

struct fb_overlay_layer {
	unsigned int layer_id;
	unsigned int layer_enable;

	void *src_base_addr;
	void *src_phy_addr;
	unsigned int src_direct_link;
	MTK_FB_FORMAT src_fmt;
	unsigned int src_use_color_key;
	unsigned int src_color_key;
	unsigned int src_pitch;
	unsigned int src_offset_x, src_offset_y;
	unsigned int src_width, src_height;

	unsigned int tgt_offset_x, tgt_offset_y;
	unsigned int tgt_width, tgt_height;
	MTK_FB_ORIENTATION layer_rotation;
	MTK_FB_LAYER_TYPE layer_type;
	MTK_FB_ORIENTATION video_rotation;

	unsigned int isTdshp;	/* set to 1, will go through tdshp first, then layer blending, then to color */

	int next_buff_idx;
	int identity;
	int connected_type;
	unsigned int security;
	unsigned int alpha_enable;
	unsigned int alpha;
	int fence_fd;		/* 8135 */
	int ion_fd;		/* 8135 CL 2340210 */
};

struct fb_overlay_config {
	int fence;
	int time;
	struct fb_overlay_layer layers[4];
};

struct fb_overlay_buffer_info {
	unsigned int src_vir_addr;
	unsigned int size;
};

struct fb_overlay_layer_info {
	unsigned int layer_id;
	unsigned int layer_enabled;	/* TO BE DEL */
	unsigned int curr_en;
	unsigned int next_en;
	unsigned int hw_en;
	int curr_idx;
	int next_idx;
	int hw_idx;
	int curr_identity;
	int next_identity;
	int hw_identity;
	int curr_conn_type;
	int next_conn_type;
	int hw_conn_type;
	MTK_FB_ORIENTATION layer_rotation;
};
/* -------------------------------------------------------------------------- */

struct fb_post_video_buffer {
	void *phy_addr;
	void *vir_addr;
	MTK_FB_TV_SRC_FORMAT format;
	unsigned int width, height;
};

#if defined(CONFIG_ARCH_MT6735) || defined(CONFIG_ARCH_MT6735M) || defined(CONFIG_ARCH_MT6753)
extern unsigned int EnableVSyncLog;

void mtkfb_log_enable(int enable);
int mtkfb_set_backlight_mode(unsigned int mode);
int mtkfb_set_backlight_level(unsigned int level);
int mtkfb_get_debug_state(char *stringbuf, int buf_len);
unsigned int mtkfb_fm_auto_test(void);
void mtkfb_clear_lcm(void);
#endif /* CONFIG_ARCH_MT6735 */

#ifdef __KERNEL__

#include <linux/completion.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
#include <linux/version.h>
#include <../drivers/staging/android/sw_sync.h>


#define MTKFB_DRIVER "mtkfb"

enum mtkfb_state {
	MTKFB_DISABLED = 0,
	MTKFB_SUSPENDED = 99,
	MTKFB_ACTIVE = 100
};

typedef enum {
	MTKFB_LAYER_ENABLE_DIRTY = (1 << 0),
	MTKFB_LAYER_FORMAT_DIRTY = (1 << 1),
	MTKFB_LAYER_SET_DIRTY = (1 << 2),
} MTKFB_LAYER_CONFIG_DIRTY;

typedef struct {
	struct work_struct work;
	struct list_head list;
	struct fb_overlay_config config;
	struct sync_fence *fences[4];
	struct ion_handle *ion_handles[4];
	void *dev;
} update_ovls_work_t;

struct mtkfb_device {
	int state;
	void *fb_va_base;	/* MPU virtual address */
	dma_addr_t fb_pa_base;	/* Bus physical address */
	unsigned long fb_size_in_byte;
	void *ovl_va_base;	/* MPU virtual address */
	dma_addr_t ovl_pa_base;	/* Bus physical address */
	unsigned long ovl_size_in_byte;

	unsigned long layer_enable;
	MTK_FB_FORMAT *layer_format;
	unsigned int layer_config_dirty;

	int xscale, yscale, mirror;	/* transformations.
					   rotate is stored in fb_info->var */
	u32 pseudo_palette[17];

	struct fb_info *fb_info;	/* Linux fbdev framework data */
	struct device *dev;

	/* Android native fence support */
	struct workqueue_struct *update_ovls_wq;
	struct mutex timeline_lock;
	struct sw_sync_timeline *timeline;
	int timeline_max;
	struct list_head pending_configs;	/* CL2340210 */
	struct ion_client *ion_client;
};

#endif				/* __KERNEL__ */

extern long hdmi_handle_cmd(unsigned int cmd, unsigned long arg);

#if defined(CONFIG_ARCH_MT6797)
extern unsigned int vramsize;
#endif

#if defined(CONFIG_ARCH_MT6735) || defined(CONFIG_ARCH_MT6735M) || defined(CONFIG_ARCH_MT6753)
extern bool is_early_suspended;
extern void mtkfb_waitVsync(void);
extern bool is_ipoh_bootup;

#ifdef CONFIG_OF
int _parse_tag_videolfb(void);
extern unsigned int islcmconnected;
extern unsigned int vramsize;
#else
extern char *saved_command_line;
#endif
#endif /* CONFIG_ARCH_MT6735 */


#endif				/* __MTKFB_H */
