Home | History | Annotate | Download | only in linux
      1 /* include/linux/msm_mdp.h
      2  *
      3  * Copyright (C) 2007 Google Incorporated
      4  * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
      5  *
      6  * This software is licensed under the terms of the GNU General Public
      7  * License version 2, as published by the Free Software Foundation, and
      8  * may be copied, distributed, and modified under those terms.
      9  *
     10  * This program is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  * GNU General Public License for more details.
     14  */
     15 #ifndef _MSM_MDP_H_
     16 #define _MSM_MDP_H_
     17 
     18 #include <linux/types.h>
     19 #include <linux/fb.h>
     20 
     21 #define MSMFB_IOCTL_MAGIC 'm'
     22 #define MSMFB_GRP_DISP          _IOW(MSMFB_IOCTL_MAGIC, 1, unsigned int)
     23 #define MSMFB_BLIT              _IOW(MSMFB_IOCTL_MAGIC, 2, unsigned int)
     24 #define MSMFB_SUSPEND_SW_REFRESHER _IOW(MSMFB_IOCTL_MAGIC, 128, unsigned int)
     25 #define MSMFB_RESUME_SW_REFRESHER _IOW(MSMFB_IOCTL_MAGIC, 129, unsigned int)
     26 #define MSMFB_CURSOR _IOW(MSMFB_IOCTL_MAGIC, 130, struct fb_cursor)
     27 #define MSMFB_SET_LUT _IOW(MSMFB_IOCTL_MAGIC, 131, struct fb_cmap)
     28 #define MSMFB_HISTOGRAM _IOWR(MSMFB_IOCTL_MAGIC, 132, struct mdp_histogram_data)
     29 /* new ioctls's for set/get ccs matrix */
     30 #define MSMFB_GET_CCS_MATRIX  _IOWR(MSMFB_IOCTL_MAGIC, 133, struct mdp_ccs)
     31 #define MSMFB_SET_CCS_MATRIX  _IOW(MSMFB_IOCTL_MAGIC, 134, struct mdp_ccs)
     32 #define MSMFB_OVERLAY_SET       _IOWR(MSMFB_IOCTL_MAGIC, 135, \
     33 						struct mdp_overlay)
     34 #define MSMFB_OVERLAY_UNSET     _IOW(MSMFB_IOCTL_MAGIC, 136, unsigned int)
     35 
     36 #define MSMFB_OVERLAY_PLAY      _IOW(MSMFB_IOCTL_MAGIC, 137, \
     37 						struct msmfb_overlay_data)
     38 #define MSMFB_OVERLAY_QUEUE	MSMFB_OVERLAY_PLAY
     39 
     40 #define MSMFB_GET_PAGE_PROTECTION _IOR(MSMFB_IOCTL_MAGIC, 138, \
     41 					struct mdp_page_protection)
     42 #define MSMFB_SET_PAGE_PROTECTION _IOW(MSMFB_IOCTL_MAGIC, 139, \
     43 					struct mdp_page_protection)
     44 #define MSMFB_OVERLAY_GET      _IOR(MSMFB_IOCTL_MAGIC, 140, \
     45 						struct mdp_overlay)
     46 #define MSMFB_OVERLAY_PLAY_ENABLE     _IOW(MSMFB_IOCTL_MAGIC, 141, unsigned int)
     47 #define MSMFB_OVERLAY_BLT       _IOWR(MSMFB_IOCTL_MAGIC, 142, \
     48 						struct msmfb_overlay_blt)
     49 #define MSMFB_OVERLAY_BLT_OFFSET     _IOW(MSMFB_IOCTL_MAGIC, 143, unsigned int)
     50 #define MSMFB_HISTOGRAM_START	_IOR(MSMFB_IOCTL_MAGIC, 144, \
     51 						struct mdp_histogram_start_req)
     52 #define MSMFB_HISTOGRAM_STOP	_IOR(MSMFB_IOCTL_MAGIC, 145, unsigned int)
     53 #define MSMFB_NOTIFY_UPDATE	_IOWR(MSMFB_IOCTL_MAGIC, 146, unsigned int)
     54 
     55 #define MSMFB_OVERLAY_3D       _IOWR(MSMFB_IOCTL_MAGIC, 147, \
     56 						struct msmfb_overlay_3d)
     57 
     58 #define MSMFB_MIXER_INFO       _IOWR(MSMFB_IOCTL_MAGIC, 148, \
     59 						struct msmfb_mixer_info_req)
     60 #define MSMFB_OVERLAY_PLAY_WAIT _IOWR(MSMFB_IOCTL_MAGIC, 149, \
     61 						struct msmfb_overlay_data)
     62 #define MSMFB_WRITEBACK_INIT _IO(MSMFB_IOCTL_MAGIC, 150)
     63 #define MSMFB_WRITEBACK_START _IO(MSMFB_IOCTL_MAGIC, 151)
     64 #define MSMFB_WRITEBACK_STOP _IO(MSMFB_IOCTL_MAGIC, 152)
     65 #define MSMFB_WRITEBACK_QUEUE_BUFFER _IOW(MSMFB_IOCTL_MAGIC, 153, \
     66 						struct msmfb_data)
     67 #define MSMFB_WRITEBACK_DEQUEUE_BUFFER _IOW(MSMFB_IOCTL_MAGIC, 154, \
     68 						struct msmfb_data)
     69 #define MSMFB_WRITEBACK_TERMINATE _IO(MSMFB_IOCTL_MAGIC, 155)
     70 #define MSMFB_MDP_PP _IOWR(MSMFB_IOCTL_MAGIC, 156, struct msmfb_mdp_pp)
     71 #define MSMFB_OVERLAY_VSYNC_CTRL _IOW(MSMFB_IOCTL_MAGIC, 160, unsigned int)
     72 #define MSMFB_VSYNC_CTRL  _IOW(MSMFB_IOCTL_MAGIC, 161, unsigned int)
     73 #define MSMFB_BUFFER_SYNC  _IOW(MSMFB_IOCTL_MAGIC, 162, struct mdp_buf_sync)
     74 #define MSMFB_OVERLAY_COMMIT      _IO(MSMFB_IOCTL_MAGIC, 163)
     75 #define MSMFB_DISPLAY_COMMIT      _IOW(MSMFB_IOCTL_MAGIC, 164, \
     76 						struct mdp_display_commit)
     77 #define MSMFB_METADATA_SET  _IOW(MSMFB_IOCTL_MAGIC, 165, struct msmfb_metadata)
     78 #define MSMFB_METADATA_GET  _IOW(MSMFB_IOCTL_MAGIC, 166, struct msmfb_metadata)
     79 #define MSMFB_WRITEBACK_SET_MIRRORING_HINT _IOW(MSMFB_IOCTL_MAGIC, 167, \
     80 						unsigned int)
     81 #define MSMFB_ASYNC_BLIT              _IOW(MSMFB_IOCTL_MAGIC, 168, unsigned int)
     82 
     83 #define FB_TYPE_3D_PANEL 0x10101010
     84 #define MDP_IMGTYPE2_START 0x10000
     85 #define MSMFB_DRIVER_VERSION	0xF9E8D701
     86 
     87 enum {
     88 	NOTIFY_UPDATE_START,
     89 	NOTIFY_UPDATE_STOP,
     90 	NOTIFY_UPDATE_POWER_OFF,
     91 };
     92 
     93 enum {
     94 	NOTIFY_TYPE_NO_UPDATE,
     95 	NOTIFY_TYPE_SUSPEND,
     96 	NOTIFY_TYPE_UPDATE,
     97 };
     98 
     99 enum {
    100 	MDP_RGB_565,      /* RGB 565 planer */
    101 	MDP_XRGB_8888,    /* RGB 888 padded */
    102 	MDP_Y_CBCR_H2V2,  /* Y and CbCr, pseudo planer w/ Cb is in MSB */
    103 	MDP_Y_CBCR_H2V2_ADRENO,
    104 	MDP_ARGB_8888,    /* ARGB 888 */
    105 	MDP_RGB_888,      /* RGB 888 planer */
    106 	MDP_Y_CRCB_H2V2,  /* Y and CrCb, pseudo planer w/ Cr is in MSB */
    107 	MDP_YCRYCB_H2V1,  /* YCrYCb interleave */
    108 	MDP_CBYCRY_H2V1,  /* CbYCrY interleave */
    109 	MDP_Y_CRCB_H2V1,  /* Y and CrCb, pseduo planer w/ Cr is in MSB */
    110 	MDP_Y_CBCR_H2V1,   /* Y and CrCb, pseduo planer w/ Cr is in MSB */
    111 	MDP_Y_CRCB_H1V2,
    112 	MDP_Y_CBCR_H1V2,
    113 	MDP_RGBA_8888,    /* ARGB 888 */
    114 	MDP_BGRA_8888,	  /* ABGR 888 */
    115 	MDP_RGBX_8888,	  /* RGBX 888 */
    116 	MDP_Y_CRCB_H2V2_TILE,  /* Y and CrCb, pseudo planer tile */
    117 	MDP_Y_CBCR_H2V2_TILE,  /* Y and CbCr, pseudo planer tile */
    118 	MDP_Y_CR_CB_H2V2,  /* Y, Cr and Cb, planar */
    119 	MDP_Y_CR_CB_GH2V2,  /* Y, Cr and Cb, planar aligned to Android YV12 */
    120 	MDP_Y_CB_CR_H2V2,  /* Y, Cb and Cr, planar */
    121 	MDP_Y_CRCB_H1V1,  /* Y and CrCb, pseduo planer w/ Cr is in MSB */
    122 	MDP_Y_CBCR_H1V1,  /* Y and CbCr, pseduo planer w/ Cb is in MSB */
    123 	MDP_YCRCB_H1V1,   /* YCrCb interleave */
    124 	MDP_YCBCR_H1V1,   /* YCbCr interleave */
    125 	MDP_BGR_565,      /* BGR 565 planer */
    126 	MDP_BGR_888,      /* BGR 888 */
    127 	MDP_Y_CBCR_H2V2_VENUS,
    128 	MDP_BGRX_8888,   /* BGRX 8888 */
    129 	MDP_YCBYCR_H2V1,  /* YCbYCr interleave */
    130 	MDP_IMGTYPE_LIMIT,
    131 	MDP_RGB_BORDERFILL,	/* border fill pipe */
    132 	MDP_FB_FORMAT = MDP_IMGTYPE2_START,    /* framebuffer format */
    133 	MDP_IMGTYPE_LIMIT2 /* Non valid image type after this enum */
    134 };
    135 
    136 enum {
    137 	PMEM_IMG,
    138 	FB_IMG,
    139 };
    140 
    141 enum {
    142 	HSIC_HUE = 0,
    143 	HSIC_SAT,
    144 	HSIC_INT,
    145 	HSIC_CON,
    146 	NUM_HSIC_PARAM,
    147 };
    148 
    149 #define MDSS_MDP_ROT_ONLY		0x80
    150 #define MDSS_MDP_RIGHT_MIXER		0x100
    151 #define MDSS_MDP_DUAL_PIPE		0x200
    152 
    153 /* mdp_blit_req flag values */
    154 #define MDP_ROT_NOP 0
    155 #define MDP_FLIP_LR 0x1
    156 #define MDP_FLIP_UD 0x2
    157 #define MDP_ROT_90 0x4
    158 #define MDP_ROT_180 (MDP_FLIP_UD|MDP_FLIP_LR)
    159 #define MDP_ROT_270 (MDP_ROT_90|MDP_FLIP_UD|MDP_FLIP_LR)
    160 #define MDP_DITHER 0x8
    161 #define MDP_BLUR 0x10
    162 #define MDP_BLEND_FG_PREMULT 0x20000
    163 #define MDP_IS_FG 0x40000
    164 #define MDP_DEINTERLACE 0x80000000
    165 #define MDP_SHARPENING  0x40000000
    166 #define MDP_NO_DMA_BARRIER_START	0x20000000
    167 #define MDP_NO_DMA_BARRIER_END		0x10000000
    168 #define MDP_NO_BLIT			0x08000000
    169 #define MDP_BLIT_WITH_DMA_BARRIERS	0x000
    170 #define MDP_BLIT_WITH_NO_DMA_BARRIERS    \
    171 	(MDP_NO_DMA_BARRIER_START | MDP_NO_DMA_BARRIER_END)
    172 #define MDP_BLIT_SRC_GEM                0x04000000
    173 #define MDP_BLIT_DST_GEM                0x02000000
    174 #define MDP_BLIT_NON_CACHED		0x01000000
    175 #define MDP_OV_PIPE_SHARE		0x00800000
    176 #define MDP_DEINTERLACE_ODD		0x00400000
    177 #define MDP_OV_PLAY_NOWAIT		0x00200000
    178 #define MDP_SOURCE_ROTATED_90		0x00100000
    179 #define MDP_OVERLAY_PP_CFG_EN		0x00080000
    180 #define MDP_BACKEND_COMPOSITION		0x00040000
    181 #define MDP_BORDERFILL_SUPPORTED	0x00010000
    182 #define MDP_SECURE_OVERLAY_SESSION      0x00008000
    183 #define MDP_OV_PIPE_FORCE_DMA		0x00004000
    184 #define MDP_MEMORY_ID_TYPE_FB		0x00001000
    185 #define MDP_BWC_EN			0x00000400
    186 #define MDP_DECIMATION_EN		0x00000800
    187 #define MDP_TRANSP_NOP 0xffffffff
    188 #define MDP_ALPHA_NOP 0xff
    189 
    190 #define MDP_FB_PAGE_PROTECTION_NONCACHED         (0)
    191 #define MDP_FB_PAGE_PROTECTION_WRITECOMBINE      (1)
    192 #define MDP_FB_PAGE_PROTECTION_WRITETHROUGHCACHE (2)
    193 #define MDP_FB_PAGE_PROTECTION_WRITEBACKCACHE    (3)
    194 #define MDP_FB_PAGE_PROTECTION_WRITEBACKWACACHE  (4)
    195 /* Sentinel: Don't use! */
    196 #define MDP_FB_PAGE_PROTECTION_INVALID           (5)
    197 /* Count of the number of MDP_FB_PAGE_PROTECTION_... values. */
    198 #define MDP_NUM_FB_PAGE_PROTECTION_VALUES        (5)
    199 
    200 struct mdp_rect {
    201 	uint32_t x;
    202 	uint32_t y;
    203 	uint32_t w;
    204 	uint32_t h;
    205 };
    206 
    207 struct mdp_img {
    208 	uint32_t width;
    209 	uint32_t height;
    210 	uint32_t format;
    211 	uint32_t offset;
    212 	int memory_id;		/* the file descriptor */
    213 	uint32_t priv;
    214 };
    215 
    216 /*
    217  * {3x3} + {3} ccs matrix
    218  */
    219 
    220 #define MDP_CCS_RGB2YUV 	0
    221 #define MDP_CCS_YUV2RGB 	1
    222 
    223 #define MDP_CCS_SIZE	9
    224 #define MDP_BV_SIZE	3
    225 
    226 struct mdp_ccs {
    227 	int direction;			/* MDP_CCS_RGB2YUV or YUV2RGB */
    228 	uint16_t ccs[MDP_CCS_SIZE];	/* 3x3 color coefficients */
    229 	uint16_t bv[MDP_BV_SIZE];	/* 1x3 bias vector */
    230 };
    231 
    232 struct mdp_csc {
    233 	int id;
    234 	uint32_t csc_mv[9];
    235 	uint32_t csc_pre_bv[3];
    236 	uint32_t csc_post_bv[3];
    237 	uint32_t csc_pre_lv[6];
    238 	uint32_t csc_post_lv[6];
    239 };
    240 
    241 /* The version of the mdp_blit_req structure so that
    242  * user applications can selectively decide which functionality
    243  * to include
    244  */
    245 
    246 #define MDP_BLIT_REQ_VERSION 2
    247 
    248 struct mdp_blit_req {
    249 	struct mdp_img src;
    250 	struct mdp_img dst;
    251 	struct mdp_rect src_rect;
    252 	struct mdp_rect dst_rect;
    253 	uint32_t alpha;
    254 	uint32_t transp_mask;
    255 	uint32_t flags;
    256 	int sharpening_strength;  /* -127 <--> 127, default 64 */
    257 };
    258 
    259 struct mdp_blit_req_list {
    260 	uint32_t count;
    261 	struct mdp_blit_req req[];
    262 };
    263 
    264 #define MSMFB_DATA_VERSION 2
    265 
    266 struct msmfb_data {
    267 	uint32_t offset;
    268 	int memory_id;
    269 	int id;
    270 	uint32_t flags;
    271 	uint32_t priv;
    272 	uint32_t iova;
    273 };
    274 
    275 #define MSMFB_NEW_REQUEST -1
    276 
    277 struct msmfb_overlay_data {
    278 	uint32_t id;
    279 	struct msmfb_data data;
    280 	uint32_t version_key;
    281 	struct msmfb_data plane1_data;
    282 	struct msmfb_data plane2_data;
    283 	struct msmfb_data dst_data;
    284 };
    285 
    286 struct msmfb_img {
    287 	uint32_t width;
    288 	uint32_t height;
    289 	uint32_t format;
    290 };
    291 
    292 #define MSMFB_WRITEBACK_DEQUEUE_BLOCKING 0x1
    293 struct msmfb_writeback_data {
    294 	struct msmfb_data buf_info;
    295 	struct msmfb_img img;
    296 };
    297 
    298 #define MDP_PP_OPS_ENABLE 0x1
    299 #define MDP_PP_OPS_READ 0x2
    300 #define MDP_PP_OPS_WRITE 0x4
    301 #define MDP_PP_OPS_DISABLE 0x8
    302 #define MDP_PP_IGC_FLAG_ROM0	0x10
    303 #define MDP_PP_IGC_FLAG_ROM1	0x20
    304 
    305 #define MDSS_PP_DSPP_CFG	0x000
    306 #define MDSS_PP_SSPP_CFG	0x100
    307 #define MDSS_PP_LM_CFG	0x200
    308 #define MDSS_PP_WB_CFG	0x300
    309 
    310 #define MDSS_PP_ARG_MASK	0x3C00
    311 #define MDSS_PP_ARG_NUM		4
    312 #define MDSS_PP_ARG_SHIFT	10
    313 #define MDSS_PP_LOCATION_MASK	0x0300
    314 #define MDSS_PP_LOGICAL_MASK	0x00FF
    315 
    316 #define MDSS_PP_ADD_ARG(var, arg) ((var) | (0x1 << (MDSS_PP_ARG_SHIFT + (arg))))
    317 #define PP_ARG(x, var) ((var) & (0x1 << (MDSS_PP_ARG_SHIFT + (x))))
    318 #define PP_LOCAT(var) ((var) & MDSS_PP_LOCATION_MASK)
    319 #define PP_BLOCK(var) ((var) & MDSS_PP_LOGICAL_MASK)
    320 
    321 
    322 struct mdp_qseed_cfg {
    323 	uint32_t table_num;
    324 	uint32_t ops;
    325 	uint32_t len;
    326 	uint32_t *data;
    327 };
    328 
    329 struct mdp_sharp_cfg {
    330 	uint32_t flags;
    331 	uint32_t strength;
    332 	uint32_t edge_thr;
    333 	uint32_t smooth_thr;
    334 	uint32_t noise_thr;
    335 };
    336 
    337 struct mdp_qseed_cfg_data {
    338 	uint32_t block;
    339 	struct mdp_qseed_cfg qseed_data;
    340 };
    341 
    342 #define MDP_OVERLAY_PP_CSC_CFG         0x1
    343 #define MDP_OVERLAY_PP_QSEED_CFG       0x2
    344 #define MDP_OVERLAY_PP_PA_CFG          0x4
    345 #define MDP_OVERLAY_PP_IGC_CFG         0x8
    346 #define MDP_OVERLAY_PP_SHARP_CFG       0x10
    347 #define MDP_OVERLAY_PP_HIST_CFG        0x20
    348 #define MDP_OVERLAY_PP_HIST_LUT_CFG    0x40
    349 
    350 #define MDP_CSC_FLAG_ENABLE	0x1
    351 #define MDP_CSC_FLAG_YUV_IN	0x2
    352 #define MDP_CSC_FLAG_YUV_OUT	0x4
    353 
    354 struct mdp_csc_cfg {
    355 	/* flags for enable CSC, toggling RGB,YUV input/output */
    356 	uint32_t flags;
    357 	uint32_t csc_mv[9];
    358 	uint32_t csc_pre_bv[3];
    359 	uint32_t csc_post_bv[3];
    360 	uint32_t csc_pre_lv[6];
    361 	uint32_t csc_post_lv[6];
    362 };
    363 
    364 struct mdp_csc_cfg_data {
    365 	uint32_t block;
    366 	struct mdp_csc_cfg csc_data;
    367 };
    368 
    369 struct mdp_pa_cfg {
    370 	uint32_t flags;
    371 	uint32_t hue_adj;
    372 	uint32_t sat_adj;
    373 	uint32_t val_adj;
    374 	uint32_t cont_adj;
    375 };
    376 
    377 struct mdp_igc_lut_data {
    378 	uint32_t block;
    379 	uint32_t len, ops;
    380 	uint32_t *c0_c1_data;
    381 	uint32_t *c2_data;
    382 };
    383 
    384 struct mdp_histogram_cfg {
    385 	uint32_t ops;
    386 	uint32_t block;
    387 	uint8_t frame_cnt;
    388 	uint8_t bit_mask;
    389 	uint16_t num_bins;
    390 };
    391 
    392 struct mdp_hist_lut_data {
    393 	uint32_t block;
    394 	uint32_t ops;
    395 	uint32_t len;
    396 	uint32_t *data;
    397 };
    398 
    399 struct mdp_overlay_pp_params {
    400 	uint32_t config_ops;
    401 	struct mdp_csc_cfg csc_cfg;
    402 	struct mdp_qseed_cfg qseed_cfg[2];
    403 	struct mdp_pa_cfg pa_cfg;
    404 	struct mdp_igc_lut_data igc_cfg;
    405 	struct mdp_sharp_cfg sharp_cfg;
    406 	struct mdp_histogram_cfg hist_cfg;
    407 	struct mdp_hist_lut_data hist_lut_cfg;
    408 };
    409 
    410 /**
    411  * enum mdss_mdp_blend_op - Different blend operations set by userspace
    412  *
    413  * @BLEND_OP_NOT_DEFINED:    No blend operation defined for the layer.
    414  * @BLEND_OP_OPAQUE:         Apply a constant blend operation. The layer
    415  *                           would appear opaque in case fg plane alpha is
    416  *                           0xff.
    417  * @BLEND_OP_PREMULTIPLIED:  Apply source over blend rule. Layer already has
    418  *                           alpha pre-multiplication done. If fg plane alpha
    419  *                           is less than 0xff, apply modulation as well. This
    420  *                           operation is intended on layers having alpha
    421  *                           channel.
    422  * @BLEND_OP_COVERAGE:       Apply source over blend rule. Layer is not alpha
    423  *                           pre-multiplied. Apply pre-multiplication. If fg
    424  *                           plane alpha is less than 0xff, apply modulation as
    425  *                           well.
    426  * @BLEND_OP_MAX:            Used to track maximum blend operation possible by
    427  *                           mdp.
    428  */
    429 enum mdss_mdp_blend_op {
    430 	BLEND_OP_NOT_DEFINED = 0,
    431 	BLEND_OP_OPAQUE,
    432 	BLEND_OP_PREMULTIPLIED,
    433 	BLEND_OP_COVERAGE,
    434 	BLEND_OP_MAX,
    435 };
    436 
    437 struct mdp_overlay {
    438 	struct msmfb_img src;
    439 	struct mdp_rect src_rect;
    440 	struct mdp_rect dst_rect;
    441 	uint32_t z_order;	/* stage number */
    442 	uint32_t is_fg;		/* control alpha & transp */
    443 	uint32_t alpha;
    444 	uint32_t blend_op;
    445 	uint32_t transp_mask;
    446 	uint32_t flags;
    447 	uint32_t id;
    448 	uint32_t user_data[7];
    449 	uint8_t horz_deci;
    450 	uint8_t vert_deci;
    451 	struct mdp_overlay_pp_params overlay_pp_cfg;
    452 };
    453 
    454 struct msmfb_overlay_3d {
    455 	uint32_t is_3d;
    456 	uint32_t width;
    457 	uint32_t height;
    458 };
    459 
    460 
    461 struct msmfb_overlay_blt {
    462 	uint32_t enable;
    463 	uint32_t offset;
    464 	uint32_t width;
    465 	uint32_t height;
    466 	uint32_t bpp;
    467 };
    468 
    469 struct mdp_histogram {
    470 	uint32_t frame_cnt;
    471 	uint32_t bin_cnt;
    472 	uint32_t *r;
    473 	uint32_t *g;
    474 	uint32_t *b;
    475 };
    476 
    477 enum {
    478 	DISPLAY_MISR_EDP,
    479 	DISPLAY_MISR_DSI0,
    480 	DISPLAY_MISR_DSI1,
    481 	DISPLAY_MISR_HDMI,
    482 	DISPLAY_MISR_LCDC,
    483 	DISPLAY_MISR_ATV,
    484 	DISPLAY_MISR_DSI_CMD,
    485 	DISPLAY_MISR_MAX
    486 };
    487 
    488 enum {
    489 	MISR_OP_NONE,
    490 	MISR_OP_SFM,
    491 	MISR_OP_MFM,
    492 	MISR_OP_BM,
    493 	MISR_OP_MAX
    494 };
    495 
    496 struct mdp_misr {
    497 	uint32_t block_id;
    498 	uint32_t frame_count;
    499 	uint32_t crc_op_mode;
    500 	uint32_t crc_value[32];
    501 };
    502 
    503 /*
    504 
    505 	mdp_block_type defines the identifiers for pipes in MDP 4.3 and up
    506 
    507 	MDP_BLOCK_RESERVED is provided for backward compatibility and is
    508 	deprecated. It corresponds to DMA_P. So MDP_BLOCK_DMA_P should be used
    509 	instead.
    510 
    511 	MDP_LOGICAL_BLOCK_DISP_0 identifies the display pipe which fb0 uses,
    512 	same for others.
    513 
    514 */
    515 
    516 enum {
    517 	MDP_BLOCK_RESERVED = 0,
    518 	MDP_BLOCK_OVERLAY_0,
    519 	MDP_BLOCK_OVERLAY_1,
    520 	MDP_BLOCK_VG_1,
    521 	MDP_BLOCK_VG_2,
    522 	MDP_BLOCK_RGB_1,
    523 	MDP_BLOCK_RGB_2,
    524 	MDP_BLOCK_DMA_P,
    525 	MDP_BLOCK_DMA_S,
    526 	MDP_BLOCK_DMA_E,
    527 	MDP_BLOCK_OVERLAY_2,
    528 	MDP_LOGICAL_BLOCK_DISP_0 = 0x10,
    529 	MDP_LOGICAL_BLOCK_DISP_1,
    530 	MDP_LOGICAL_BLOCK_DISP_2,
    531 	MDP_BLOCK_MAX,
    532 };
    533 
    534 /*
    535  * mdp_histogram_start_req is used to provide the parameters for
    536  * histogram start request
    537  */
    538 
    539 struct mdp_histogram_start_req {
    540 	uint32_t block;
    541 	uint8_t frame_cnt;
    542 	uint8_t bit_mask;
    543 	uint16_t num_bins;
    544 };
    545 
    546 /*
    547  * mdp_histogram_data is used to return the histogram data, once
    548  * the histogram is done/stopped/cance
    549  */
    550 
    551 struct mdp_histogram_data {
    552 	uint32_t block;
    553 	uint32_t bin_cnt;
    554 	uint32_t *c0;
    555 	uint32_t *c1;
    556 	uint32_t *c2;
    557 	uint32_t *extra_info;
    558 };
    559 
    560 struct mdp_pcc_coeff {
    561 	uint32_t c, r, g, b, rr, gg, bb, rg, gb, rb, rgb_0, rgb_1;
    562 };
    563 
    564 struct mdp_pcc_cfg_data {
    565 	uint32_t block;
    566 	uint32_t ops;
    567 	struct mdp_pcc_coeff r, g, b;
    568 };
    569 
    570 #define MDP_GAMUT_TABLE_NUM		8
    571 
    572 enum {
    573 	mdp_lut_igc,
    574 	mdp_lut_pgc,
    575 	mdp_lut_hist,
    576 	mdp_lut_max,
    577 };
    578 
    579 struct mdp_ar_gc_lut_data {
    580 	uint32_t x_start;
    581 	uint32_t slope;
    582 	uint32_t offset;
    583 };
    584 
    585 struct mdp_pgc_lut_data {
    586 	uint32_t block;
    587 	uint32_t flags;
    588 	uint8_t num_r_stages;
    589 	uint8_t num_g_stages;
    590 	uint8_t num_b_stages;
    591 	struct mdp_ar_gc_lut_data *r_data;
    592 	struct mdp_ar_gc_lut_data *g_data;
    593 	struct mdp_ar_gc_lut_data *b_data;
    594 };
    595 
    596 
    597 struct mdp_lut_cfg_data {
    598 	uint32_t lut_type;
    599 	union {
    600 		struct mdp_igc_lut_data igc_lut_data;
    601 		struct mdp_pgc_lut_data pgc_lut_data;
    602 		struct mdp_hist_lut_data hist_lut_data;
    603 	} data;
    604 };
    605 
    606 struct mdp_bl_scale_data {
    607 	uint32_t min_lvl;
    608 	uint32_t scale;
    609 };
    610 
    611 struct mdp_pa_cfg_data {
    612 	uint32_t block;
    613 	struct mdp_pa_cfg pa_data;
    614 };
    615 
    616 struct mdp_dither_cfg_data {
    617 	uint32_t block;
    618 	uint32_t flags;
    619 	uint32_t g_y_depth;
    620 	uint32_t r_cr_depth;
    621 	uint32_t b_cb_depth;
    622 };
    623 
    624 struct mdp_gamut_cfg_data {
    625 	uint32_t block;
    626 	uint32_t flags;
    627 	uint32_t gamut_first;
    628 	uint32_t tbl_size[MDP_GAMUT_TABLE_NUM];
    629 	uint16_t *r_tbl[MDP_GAMUT_TABLE_NUM];
    630 	uint16_t *g_tbl[MDP_GAMUT_TABLE_NUM];
    631 	uint16_t *b_tbl[MDP_GAMUT_TABLE_NUM];
    632 };
    633 
    634 struct mdp_calib_config_data {
    635 	uint32_t ops;
    636 	uint32_t addr;
    637 	uint32_t data;
    638 };
    639 
    640 struct mdp_calib_config_buffer {
    641 	uint32_t ops;
    642 	uint32_t size;
    643 	uint32_t *buffer;
    644 };
    645 
    646 struct mdp_calib_dcm_state {
    647 	uint32_t ops;
    648 	uint32_t dcm_state;
    649 };
    650 
    651 enum {
    652 	DCM_UNINIT,
    653 	DCM_UNBLANK,
    654 	DCM_ENTER,
    655 	DCM_EXIT,
    656 	DCM_BLANK,
    657 };
    658 
    659 #define MDSS_MAX_BL_BRIGHTNESS 255
    660 #define AD_BL_LIN_LEN (MDSS_MAX_BL_BRIGHTNESS + 1)
    661 
    662 #define MDSS_AD_MODE_AUTO_BL	0x0
    663 #define MDSS_AD_MODE_AUTO_STR	0x1
    664 #define MDSS_AD_MODE_TARG_STR	0x3
    665 #define MDSS_AD_MODE_MAN_STR	0x7
    666 #define MDSS_AD_MODE_CALIB	0xF
    667 
    668 #define MDP_PP_AD_INIT	0x10
    669 #define MDP_PP_AD_CFG	0x20
    670 
    671 struct mdss_ad_init {
    672 	uint32_t asym_lut[33];
    673 	uint32_t color_corr_lut[33];
    674 	uint8_t i_control[2];
    675 	uint16_t black_lvl;
    676 	uint16_t white_lvl;
    677 	uint8_t var;
    678 	uint8_t limit_ampl;
    679 	uint8_t i_dither;
    680 	uint8_t slope_max;
    681 	uint8_t slope_min;
    682 	uint8_t dither_ctl;
    683 	uint8_t format;
    684 	uint8_t auto_size;
    685 	uint16_t frame_w;
    686 	uint16_t frame_h;
    687 	uint8_t logo_v;
    688 	uint8_t logo_h;
    689 	uint32_t bl_lin_len;
    690 	uint32_t *bl_lin;
    691 	uint32_t *bl_lin_inv;
    692 };
    693 
    694 #define MDSS_AD_BL_CTRL_MODE_EN 1
    695 #define MDSS_AD_BL_CTRL_MODE_DIS 0
    696 struct mdss_ad_cfg {
    697 	uint32_t mode;
    698 	uint32_t al_calib_lut[33];
    699 	uint16_t backlight_min;
    700 	uint16_t backlight_max;
    701 	uint16_t backlight_scale;
    702 	uint16_t amb_light_min;
    703 	uint16_t filter[2];
    704 	uint16_t calib[4];
    705 	uint8_t strength_limit;
    706 	uint8_t t_filter_recursion;
    707 	uint16_t stab_itr;
    708 	uint32_t bl_ctrl_mode;
    709 };
    710 
    711 /* ops uses standard MDP_PP_* flags */
    712 struct mdss_ad_init_cfg {
    713 	uint32_t ops;
    714 	union {
    715 		struct mdss_ad_init init;
    716 		struct mdss_ad_cfg cfg;
    717 	} params;
    718 };
    719 
    720 /* mode uses MDSS_AD_MODE_* flags */
    721 struct mdss_ad_input {
    722 	uint32_t mode;
    723 	union {
    724 		uint32_t amb_light;
    725 		uint32_t strength;
    726 		uint32_t calib_bl;
    727 	} in;
    728 	uint32_t output;
    729 };
    730 
    731 #define MDSS_CALIB_MODE_BL	0x1
    732 struct mdss_calib_cfg {
    733 	uint32_t ops;
    734 	uint32_t calib_mask;
    735 };
    736 
    737 enum {
    738 	mdp_op_pcc_cfg,
    739 	mdp_op_csc_cfg,
    740 	mdp_op_lut_cfg,
    741 	mdp_op_qseed_cfg,
    742 	mdp_bl_scale_cfg,
    743 	mdp_op_pa_cfg,
    744 	mdp_op_dither_cfg,
    745 	mdp_op_gamut_cfg,
    746 	mdp_op_calib_cfg,
    747 	mdp_op_ad_cfg,
    748 	mdp_op_ad_input,
    749 	mdp_op_calib_mode,
    750 	mdp_op_calib_buffer,
    751 	mdp_op_calib_dcm_state,
    752 	mdp_op_max,
    753 };
    754 
    755 enum {
    756 	WB_FORMAT_NV12,
    757 	WB_FORMAT_RGB_565,
    758 	WB_FORMAT_RGB_888,
    759 	WB_FORMAT_xRGB_8888,
    760 	WB_FORMAT_ARGB_8888,
    761 	WB_FORMAT_BGRA_8888,
    762 	WB_FORMAT_BGRX_8888,
    763 	WB_FORMAT_ARGB_8888_INPUT_ALPHA /* Need to support */
    764 };
    765 
    766 struct msmfb_mdp_pp {
    767 	uint32_t op;
    768 	union {
    769 		struct mdp_pcc_cfg_data pcc_cfg_data;
    770 		struct mdp_csc_cfg_data csc_cfg_data;
    771 		struct mdp_lut_cfg_data lut_cfg_data;
    772 		struct mdp_qseed_cfg_data qseed_cfg_data;
    773 		struct mdp_bl_scale_data bl_scale_data;
    774 		struct mdp_pa_cfg_data pa_cfg_data;
    775 		struct mdp_dither_cfg_data dither_cfg_data;
    776 		struct mdp_gamut_cfg_data gamut_cfg_data;
    777 		struct mdp_calib_config_data calib_cfg;
    778 		struct mdss_ad_init_cfg ad_init_cfg;
    779 		struct mdss_calib_cfg mdss_calib_cfg;
    780 		struct mdss_ad_input ad_input;
    781 		struct mdp_calib_config_buffer calib_buffer;
    782 		struct mdp_calib_dcm_state calib_dcm;
    783 	} data;
    784 };
    785 
    786 #define FB_METADATA_VIDEO_INFO_CODE_SUPPORT 1
    787 enum {
    788 	metadata_op_none,
    789 	metadata_op_base_blend,
    790 	metadata_op_frame_rate,
    791 	metadata_op_vic,
    792 	metadata_op_wb_format,
    793 	metadata_op_get_caps,
    794 	metadata_op_crc,
    795 	metadata_op_max
    796 };
    797 
    798 struct mdp_blend_cfg {
    799 	uint32_t is_premultiplied;
    800 };
    801 
    802 struct mdp_mixer_cfg {
    803 	uint32_t writeback_format;
    804 	uint32_t alpha;
    805 };
    806 
    807 struct mdss_hw_caps {
    808 	uint32_t mdp_rev;
    809 	uint8_t rgb_pipes;
    810 	uint8_t vig_pipes;
    811 	uint8_t dma_pipes;
    812 	uint32_t features;
    813 };
    814 
    815 struct msmfb_metadata {
    816 	uint32_t op;
    817 	uint32_t flags;
    818 	union {
    819 		struct mdp_misr misr_request;
    820 		struct mdp_blend_cfg blend_cfg;
    821 		struct mdp_mixer_cfg mixer_cfg;
    822 		uint32_t panel_frame_rate;
    823 		uint32_t video_info_code;
    824 		struct mdss_hw_caps caps;
    825 	} data;
    826 };
    827 
    828 #define MDP_MAX_FENCE_FD	32
    829 #define MDP_BUF_SYNC_FLAG_WAIT	1
    830 
    831 struct mdp_buf_sync {
    832 	uint32_t flags;
    833 	uint32_t acq_fen_fd_cnt;
    834 	uint32_t session_id;
    835 	int *acq_fen_fd;
    836 	int *rel_fen_fd;
    837 	int *retire_fen_fd;
    838 };
    839 
    840 struct mdp_async_blit_req_list {
    841 	struct mdp_buf_sync sync;
    842 	uint32_t count;
    843 	struct mdp_blit_req req[];
    844 };
    845 
    846 #define MDP_DISPLAY_COMMIT_OVERLAY	1
    847 
    848 struct mdp_display_commit {
    849 	uint32_t flags;
    850 	uint32_t wait_for_finish;
    851 	struct fb_var_screeninfo var;
    852 };
    853 
    854 struct mdp_page_protection {
    855 	uint32_t page_protection;
    856 };
    857 
    858 
    859 struct mdp_mixer_info {
    860 	int pndx;
    861 	int pnum;
    862 	int ptype;
    863 	int mixer_num;
    864 	int z_order;
    865 };
    866 
    867 #define MAX_PIPE_PER_MIXER  4
    868 
    869 struct msmfb_mixer_info_req {
    870 	int mixer_num;
    871 	int cnt;
    872 	struct mdp_mixer_info info[MAX_PIPE_PER_MIXER];
    873 };
    874 
    875 enum {
    876 	DISPLAY_SUBSYSTEM_ID,
    877 	ROTATOR_SUBSYSTEM_ID,
    878 };
    879 
    880 enum {
    881 	MDP_IOMMU_DOMAIN_CP,
    882 	MDP_IOMMU_DOMAIN_NS,
    883 };
    884 
    885 enum {
    886 	MDP_WRITEBACK_MIRROR_OFF,
    887 	MDP_WRITEBACK_MIRROR_ON,
    888 	MDP_WRITEBACK_MIRROR_PAUSE,
    889 	MDP_WRITEBACK_MIRROR_RESUME,
    890 };
    891 
    892 #ifdef __KERNEL__
    893 int msm_fb_get_iommu_domain(struct fb_info *info, int domain);
    894 /* get the framebuffer physical address information */
    895 int get_fb_phys_info(unsigned long *start, unsigned long *len, int fb_num,
    896 	int subsys_id);
    897 struct fb_info *msm_fb_get_writeback_fb(void);
    898 int msm_fb_writeback_init(struct fb_info *info);
    899 int msm_fb_writeback_start(struct fb_info *info);
    900 int msm_fb_writeback_queue_buffer(struct fb_info *info,
    901 		struct msmfb_data *data);
    902 int msm_fb_writeback_dequeue_buffer(struct fb_info *info,
    903 		struct msmfb_data *data);
    904 int msm_fb_writeback_stop(struct fb_info *info);
    905 int msm_fb_writeback_terminate(struct fb_info *info);
    906 int msm_fb_writeback_set_secure(struct fb_info *info, int enable);
    907 #endif
    908 
    909 #endif /*_MSM_MDP_H_*/
    910