#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)
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,
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
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
{
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;
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;
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*/
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;
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;
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*/
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);
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;
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 {
};
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];
};
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 {
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;
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*/
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;
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 {
#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);
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);
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