| /* |
| * 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 */ |