video: rockchip: fb: add car_reversing for px5
[firefly-linux-kernel-4.4.55.git] / include / linux / rk_fb.h
index a1acbafbd6edf070c4762ca7deb670c818e00cfc..2374664e6dfe4f4205308c551506a2a7f8a18c4d 100755 (executable)
 #include <asm/atomic.h>
 #include <linux/rk_screen.h>
 #if defined(CONFIG_OF)
-#include <dt-bindings/rkfb/rk_fb.h>
+#include <dt-bindings/display/rk_fb.h>
 #endif
 #include "../../drivers/staging/android/sw_sync.h"
 #include <linux/file.h>
 #include <linux/kthread.h>
+#include <linux/pm_runtime.h>
+#include <linux/version.h>
 
 
 #define RK30_MAX_LCDC_SUPPORT  2
 #define RK_LF_STATUS_NC                  0xfe
 #define RK_LF_MAX_TIMEOUT                       (1600000UL << 6)       //>0.64s
 
-
-/* x y mirror or rotate mode */
-#define NO_MIRROR      0
-#define X_MIRROR       1               /* up-down flip*/
-#define Y_MIRROR       2               /* left-right flip */
-#define X_Y_MIRROR     3               /* the same as rotate 180 degrees */
-#define ROTATE_90      4               /* clockwise rotate 90 degrees */
-#define ROTATE_180     8               /* rotate 180 degrees
-                                        * It is recommended to use X_Y_MIRROR
-                                        * rather than ROTATE_180
-                                        */
-#define ROTATE_270     12              /* clockwise rotate 270 degrees */
-
-
 /**
 * pixel align value for gpu,align as 64 bytes in an odd number of times
 */
 #define ALIGN_ODD_TIMES(x, align)              (((x) % ((align) * 2) == 0) ? ((x) + (align)) : (x))
 #define ALIGN_64BYTE_ODD_TIMES(x, align)       ALIGN_ODD_TIMES(ALIGN_N_TIMES(x, align), align)
 
+#define DUMP_FRAME_NUM 3
 
 //#define USE_ION_MMU 1
 #if defined(CONFIG_ION_ROCKCHIP)
@@ -116,27 +105,22 @@ extern u64 rk_fb_get_prmry_screen_framedone_t(void);
 extern int rk_fb_set_prmry_screen_status(int status);
 extern bool rk_fb_poll_wait_frame_complete(void);
 
-/********************************************************************
-**          display output interface supported by rockchip lcdc                       *
-********************************************************************/
-/* */
-#define OUT_P888            0  //24bit screen,connect to lcdc D0~D23
-#define OUT_P666            1  //18bit screen,connect to lcdc D0~D17
-#define OUT_P565            2
-#define OUT_S888x           4
-#define OUT_CCIR656         6
-#define OUT_S888            8
-#define OUT_S888DUMY        12
-#define OUT_YUV_420        14
-#define OUT_RGB_AAA        15
-#define OUT_P16BPP4         24
-#define OUT_D888_P666       0x21       //18bit screen,connect to lcdc D2~D7, D10~D15, D18~D23
-#define OUT_D888_P565       0x22
+enum {
+       CSC_BT601,
+       CSC_BT709,
+       CSC_BT2020,
+};
+#define CSC_SHIFT      6
+#define CSC_MASK       (0x3 << CSC_SHIFT)
+#define CSC_FORMAT(x)  (((x) & CSC_MASK) >> CSC_SHIFT)
+
+#define BT601(x)       ((CSC_BT601 << CSC_SHIFT) | ((x) & ~CSC_MASK))
+#define BT709(x)       ((CSC_BT709 << CSC_SHIFT) | ((x) & ~CSC_MASK))
+#define BT2020(x)      ((CSC_BT2020 << CSC_SHIFT) | ((x) & ~CSC_MASK))
 
 /**
  * pixel format definitions,this is copy from android/system/core/include/system/graphics.h
  */
-
 enum {
        HAL_PIXEL_FORMAT_RGBA_8888 = 1,
        HAL_PIXEL_FORMAT_RGBX_8888 = 2,
@@ -185,6 +169,10 @@ enum {
        HAL_PIXEL_FORMAT_YV12 = 0x32315659,     // YCrCb 4:2:0 Planar
 
        /* Legacy formats (deprecated), used by ImageFormat.java */
+
+       /*
+        * YCbCr format default is BT601.
+        */
        HAL_PIXEL_FORMAT_YCbCr_422_SP = 0x10,   // NV16
        HAL_PIXEL_FORMAT_YCrCb_420_SP = 0x11,   // NV21
        HAL_PIXEL_FORMAT_YCbCr_422_I = 0x14,    // YUY2
@@ -193,35 +181,76 @@ enum {
        
        HAL_PIXEL_FORMAT_YCrCb_NV12_10      = 0x22, // YUV420_1obit
        HAL_PIXEL_FORMAT_YCbCr_422_SP_10        = 0x23, // YUV422_1obit
-       HAL_PIXEL_FORMAT_YCrCb_420_SP_10        = 0x24, //YUV444_1obit
+       HAL_PIXEL_FORMAT_YCrCb_444_SP_10        = 0x24, //YUV444_1obit
 
        HAL_PIXEL_FORMAT_YCrCb_444 = 0x25,      //yuv444
        HAL_PIXEL_FORMAT_FBDC_RGB565    = 0x26,
        HAL_PIXEL_FORMAT_FBDC_U8U8U8U8  = 0x27, /*ARGB888*/
        HAL_PIXEL_FORMAT_FBDC_U8U8U8    = 0x28, /*RGBP888*/
        HAL_PIXEL_FORMAT_FBDC_RGBA888   = 0x29, /*ABGR888*/
+       HAL_PIXEL_FORMAT_BGRX_8888 = 0x30,
+       HAL_PIXEL_FORMAT_BGR_888 = 0x31,
+       HAL_PIXEL_FORMAT_BGR_565 = 0x32,
+
+       HAL_PIXEL_FORMAT_YUYV422 = 0x33,
+       HAL_PIXEL_FORMAT_YUYV420 = 0x34,
+       HAL_PIXEL_FORMAT_UYVY422 = 0x35,
+       HAL_PIXEL_FORMAT_UYVY420 = 0x36,
+
+       HAL_PIXEL_FORMAT_YCrCb_NV12_BT709 =
+                       BT709(HAL_PIXEL_FORMAT_YCrCb_NV12),
+       HAL_PIXEL_FORMAT_YCrCb_NV12_VIDEO_BT709 =
+                       BT709(HAL_PIXEL_FORMAT_YCrCb_NV12_VIDEO),
+       HAL_PIXEL_FORMAT_YCbCr_422_SP_BT709 =
+                       BT709(HAL_PIXEL_FORMAT_YCbCr_422_SP),
+       HAL_PIXEL_FORMAT_YCrCb_444_BT709 =
+                       BT709(HAL_PIXEL_FORMAT_YCrCb_444),
+
+       HAL_PIXEL_FORMAT_YCrCb_NV12_10_BT709 =
+                       BT709(HAL_PIXEL_FORMAT_YCrCb_NV12_10),
+       HAL_PIXEL_FORMAT_YCbCr_422_SP_10_BT709  =
+                       BT709(HAL_PIXEL_FORMAT_YCbCr_422_SP_10),
+       HAL_PIXEL_FORMAT_YCrCb_420_SP_10_BT709  =
+                       BT709(HAL_PIXEL_FORMAT_YCrCb_444_SP_10),
+
+       HAL_PIXEL_FORMAT_YCrCb_NV12_10_BT2020 =
+                       BT2020(HAL_PIXEL_FORMAT_YCrCb_NV12_10),
+       HAL_PIXEL_FORMAT_YCbCr_422_SP_10_BT2020 =
+                       BT2020(HAL_PIXEL_FORMAT_YCbCr_422_SP_10),
+       HAL_PIXEL_FORMAT_YCrCb_420_SP_10_BT2020 =
+                       BT2020(HAL_PIXEL_FORMAT_YCrCb_444_SP_10),
 };
 
 //display data format
 enum data_format {
-       ARGB888 = 0,
-       RGB888,
-       RGB565,
-       YUV420 = 4,
-       YUV422,
-       YUV444,
+       ARGB888,/*don't update and insert other format*/
+       RGB888, /*don't update and insert other format*/
+       RGB565, /*don't update and insert other format*/
+       BGR888,
        XRGB888,
        XBGR888,
        ABGR888,
-       YUV420_A = 10,
-       YUV422_A,
-       YUV444_A,
-       YUV420_NV21,
-       FBDC_RGB_565 = 0x26,
+       BGR565,
+       FBDC_RGB_565,
        FBDC_ARGB_888,
        FBDC_RGBX_888,
        FBDC_ABGR_888,
+       YUV420,
+       YUV422,
+       YUV444,
+       YUV420_A,
+       YUV422_A,
+       YUV444_A,
+       YUV420_NV21,
+       YUYV422,
+       YUYV420,
+       UYVY422,
+       UYVY420
 };
+#define IS_YUV_FMT(fmt) ((fmt >= YUV420) ? 1 : 0)
+#define IS_RGB_FMT(fmt) ((fmt < YUV420) ? 1 : 0)
+#define IS_FBDC_FMT(fmt) \
+       (((fmt >= FBDC_RGB_565) && (fmt <= FBDC_ABGR_888)) ? 1 : 0)
 
 enum
 {
@@ -246,6 +275,42 @@ typedef enum {
        SCREEN_UNPREPARE_DDR_CHANGE,
 } screen_status;
 
+typedef enum {
+       GET_PAGE_FAULT  = 0x0,
+       CLR_PAGE_FAULT  = 0x1,
+       UNMASK_PAGE_FAULT = 0x2
+} extern_func;
+
+enum rk_vop_feature {
+       SUPPORT_VOP_IDENTIFY    = BIT(0),
+       SUPPORT_IFBDC           = BIT(1),
+       SUPPORT_AFBDC           = BIT(2),
+       SUPPORT_WRITE_BACK      = BIT(3),
+       SUPPORT_YUV420_OUTPUT   = BIT(4)
+};
+
+struct rk_vop_property {
+       u32 feature;
+       u32 max_output_x;
+       u32 max_output_y;
+};
+
+enum rk_win_feature {
+       SUPPORT_WIN_IDENTIFY    = BIT(0),
+       SUPPORT_HW_EXIST        = BIT(1),
+       SUPPORT_SCALE           = BIT(2),
+       SUPPORT_YUV             = BIT(3),
+       SUPPORT_YUV10BIT        = BIT(4),
+       SUPPORT_MULTI_AREA      = BIT(5),
+       SUPPORT_HWC_LAYER       = BIT(6)
+};
+
+struct rk_win_property {
+       u32 feature;
+       u32 max_input_x;
+       u32 max_input_y;
+};
+
 struct rk_fb_rgb {
        struct fb_bitfield red;
        struct fb_bitfield green;
@@ -308,6 +373,16 @@ struct rk_lcdc_post_cfg {
        u32 ysize;
 };
 
+struct rk_fb_wb_cfg {
+       u8  data_format;
+       short ion_fd;
+       u32 phy_addr;
+       u16 xsize;
+       u16 ysize;
+       u8 reserved0;
+       u32 reversed1;
+};
+
 struct rk_lcdc_bcsh {
        bool enable;
        u16 brightness;
@@ -321,6 +396,7 @@ struct rk_lcdc_win_area {
        bool state;
        enum data_format format;
        u8 fmt_cfg;
+       u8 yuyv_fmt;
        u8 swap_rb;
        u8 swap_uv;
        u32 y_offset;           /*yuv/rgb offset  -->LCDC_WINx_YRGB_MSTx*/
@@ -368,11 +444,13 @@ struct rk_lcdc_win_area {
 struct rk_lcdc_win {
        char name[5];
        int id;
+       struct rk_win_property property;
        bool state;             /*on or off*/
        bool last_state;                /*on or off*/
        u32 pseudo_pal[16];
        int z_order;            /*win sel layer*/
        u8 fmt_10;
+       u8 colorspace;
        u32 reserved;
        u32 area_num;
        u32 scale_yrgb_x;
@@ -402,9 +480,10 @@ struct rk_lcdc_win {
        u8 alpha_en;
        u8 alpha_mode;
        u16 g_alpha_val;
-       u8  mirror_en;
        u32 color_key_val;
        u8 csc_mode;
+       u8 xmirror;
+       u8 ymirror;
 
        struct rk_lcdc_win_area area[RK_WIN_MAX_AREA];
        struct rk_lcdc_post_cfg post_cfg;
@@ -438,17 +517,19 @@ struct rk_lcdc_drv_ops {
        int (*load_screen) (struct rk_lcdc_driver *dev_drv, bool initscreen);
        int (*get_dspbuf_info) (struct rk_lcdc_driver *dev_drv,
                                u16 *xact, u16 *yact, int *format,
-                               u32 *dsp_addr);
+                               u32 *dsp_addr, int *ymirror);
        int (*post_dspbuf)(struct rk_lcdc_driver *dev_drv, u32 rgb_mst,
-                          int format, u16 xact, u16 yact, u16 xvir);
+                          int format, u16 xact, u16 yact, u16 xvir,
+                          int ymirror);
 
-       int (*get_win_state) (struct rk_lcdc_driver *dev_drv, int layer_id);
+       int (*get_win_state) (struct rk_lcdc_driver *dev_drv, int layer_id, int area_id);
        int (*ovl_mgr) (struct rk_lcdc_driver *dev_drv, int swap, bool set);    /*overlay manager*/
        int (*fps_mgr) (struct rk_lcdc_driver *dev_drv, int fps, bool set);
        int (*fb_get_win_id) (struct rk_lcdc_driver *dev_drv, const char *id);  /*find layer for fb*/
        int (*fb_win_remap) (struct rk_lcdc_driver *dev_drv,
                             u16 fb_win_map_order);
        int (*set_dsp_lut) (struct rk_lcdc_driver *dev_drv, int *lut);
+       int (*set_cabc_lut)(struct rk_lcdc_driver *dev_drv, int *lut);
        int (*set_hwc_lut) (struct rk_lcdc_driver *dev_drv, int *hwc_lut, int mode);
        int (*read_dsp_lut) (struct rk_lcdc_driver *dev_drv, int *lut);
        int (*lcdc_hdmi_process) (struct rk_lcdc_driver *dev_drv, int mode);    /*some lcdc need to some process in hdmi mode*/
@@ -458,8 +539,8 @@ struct rk_lcdc_drv_ops {
        int (*dpi_open) (struct rk_lcdc_driver *dev_drv, bool open);
        int (*dpi_win_sel) (struct rk_lcdc_driver *dev_drv, int layer_id);
        int (*dpi_status) (struct rk_lcdc_driver *dev_drv);
-       int (*get_dsp_addr)(struct rk_lcdc_driver *dev_drv,unsigned int *dsp_addr);
-       int (*set_dsp_cabc) (struct rk_lcdc_driver *dev_drv, int mode);
+       int (*get_dsp_addr)(struct rk_lcdc_driver *dev_drv, unsigned int dsp_addr[][4]);
+       int (*set_dsp_cabc) (struct rk_lcdc_driver *dev_drv, int mode, int calc, int up, int down, int global);
        int (*set_dsp_bcsh_hue) (struct rk_lcdc_driver *dev_drv,int sin_hue, int cos_hue);
        int (*set_dsp_bcsh_bcs)(struct rk_lcdc_driver *dev_drv,bcsh_bcs_mode mode,int value);
        int (*get_dsp_bcsh_hue) (struct rk_lcdc_driver *dev_drv,bcsh_hue_mode mode);
@@ -472,12 +553,17 @@ struct rk_lcdc_drv_ops {
        int (*set_overscan) (struct rk_lcdc_driver *dev_drv,
                             struct overscan *overscan);
        int (*dsp_black) (struct rk_lcdc_driver *dev_drv, int enable);
+       int (*backlight_close)(struct rk_lcdc_driver *dev_drv, int enable);
+       int (*area_support_num)(struct rk_lcdc_driver *dev_drv, unsigned int *area_support);
+       int (*extern_func)(struct rk_lcdc_driver *dev_drv, int cmd);
+       int (*wait_frame_start)(struct rk_lcdc_driver *dev_drv, int enable);
+       int (*set_wb)(struct rk_lcdc_driver *dev_drv);
 };
 
 struct rk_fb_area_par {
        u8  data_format;        /*layer data fmt*/
        short ion_fd;
-       unsigned long phy_addr;
+       u32 phy_addr;
        short acq_fence_fd;
        u16  x_offset;
        u16  y_offset;
@@ -512,7 +598,17 @@ struct rk_fb_win_cfg_data {
        short ret_fence_fd;
        short rel_fence_fd[RK_MAX_BUF_NUM];
        struct  rk_fb_win_par win_par[RK30_MAX_LAYER_SUPPORT];
-       struct  rk_lcdc_post_cfg post_cfg;
+       struct  rk_fb_wb_cfg wb_cfg;
+};
+
+struct rk_fb_reg_wb_data {
+       bool state;
+       u8 data_format;
+       struct ion_handle *ion_handle;
+       unsigned long smem_start;
+       unsigned long cbr_start;        /*Cbr memory start address*/
+       u16 xsize;
+       u16 ysize;
 };
 
 struct rk_fb_reg_area_data {
@@ -550,14 +646,15 @@ struct rk_fb_reg_area_data {
 };
 
 struct rk_fb_reg_win_data {
-       u8 win_id;
-       u8 z_order;             /*win sel layer*/
+       int win_id;
+       int z_order;            /*win sel layer*/
        u32 area_num;           /*maybe two region have the same dma buff,*/
        u32 area_buf_num;     /*so area_num  maybe not equal to area_buf_num*/
        u8 alpha_en;
        u8 alpha_mode;
        u16 g_alpha_val;
        u8  mirror_en;
+       u8 colorspace;
 
        struct rk_fb_reg_area_data reg_area_data[RK_WIN_MAX_AREA];
 };
@@ -568,7 +665,7 @@ struct rk_fb_reg_data {
        int    buf_num;
        int    acq_num;
        struct rk_fb_reg_win_data reg_win_data[RK30_MAX_LAYER_SUPPORT];
-       struct rk_lcdc_post_cfg post_cfg;
+       struct rk_fb_reg_wb_data reg_wb_data;
 };
 
 struct rk_lcdc_driver {
@@ -576,8 +673,11 @@ struct rk_lcdc_driver {
        int  id;
        int  prop;
        struct device *dev;
+       u32 version;
+       struct rk_vop_property property;
 
        struct rk_lcdc_win *win[RK_MAX_FB_SUPPORT];
+       struct rk_fb_reg_wb_data wb_data;
        int lcdc_win_num;
        int num_buf;            //the num_of buffer
        int atv_layer_cnt;
@@ -612,6 +712,7 @@ struct rk_lcdc_driver {
        struct mutex fb_win_id_mutex;
        struct mutex win_config;
 
+       struct mutex switch_screen; /*for switch screen*/
        struct completion frame_done;   /*sync for pan_display,whe we set a new
                                          frame address to lcdc register,we must
                                          make sure the frame begain to display*/
@@ -623,6 +724,7 @@ struct rk_lcdc_driver {
        struct sw_sync_timeline *timeline;
        int                     timeline_max;
        int                     suspend_flag;
+       int standby;
        struct list_head        update_regs_list;
        struct list_head        saved_list;
        struct mutex            update_regs_list_lock;
@@ -644,6 +746,14 @@ struct rk_lcdc_driver {
        int *hwc_lut;
        int uboot_logo;
        int bcsh_init_status;
+       bool cabc_pwm_pol;
+       u8  reserved_fb;
+       /*1:hdmi switch uncomplete,0:complete*/
+       bool hdmi_switch;
+       void *trace_buf;
+       struct rk_fb_win_cfg_data tmp_win_cfg[DUMP_FRAME_NUM];
+       struct rk_fb_reg_data tmp_regs[DUMP_FRAME_NUM];
+       unsigned int area_support[RK30_MAX_LAYER_SUPPORT];
 };
 
 struct rk_fb_par {
@@ -681,8 +791,6 @@ struct rk_fb {
 #if defined(CONFIG_ION_ROCKCHIP)
        struct ion_client *ion_client;
 #endif
-
-
 };
 
 extern int rk_fb_trsm_ops_register(struct rk_fb_trsm_ops *ops, int type);
@@ -691,6 +799,8 @@ extern int rk_fb_register(struct rk_lcdc_driver *dev_drv,
                                struct rk_lcdc_win *win, int id);
 extern int rk_fb_unregister(struct rk_lcdc_driver *dev_drv);
 extern struct rk_lcdc_driver *rk_get_lcdc_drv(char *name);
+extern int rk_fb_get_extern_screen(struct rk_screen *screen);
+extern int rk_fb_set_vop_pwm(void);
 extern int rk_fb_get_prmry_screen( struct rk_screen *screen);
 extern int rk_fb_set_prmry_screen(struct rk_screen *screen);
 extern u32 rk_fb_get_prmry_screen_pixclock(void);
@@ -717,4 +827,9 @@ extern struct device *rk_fb_get_sysmmu_device_by_compatible(const char *compt);
 extern void rk_fb_platform_set_sysmmu(struct device *sysmmu,
                                       struct device *dev);
 int rk_fb_get_display_policy(void);
+int rk_fb_pixel_width(int data_format);
+void trace_buffer_dump(struct device *dev,
+                             struct rk_lcdc_driver *dev_drv);
+int rk_fb_set_car_reverse_status(struct rk_lcdc_driver *dev_drv, int status);
+extern int rockchip_get_screen_type(void);
 #endif