/* Copyright (c) 2008-2010, Code Aurora Forum. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef MDP_H #define MDP_H #include #include #include #include #include #include #include #include "msm_mdp.h" #include #include #include #include #include "msm_fb_panel.h" #ifdef CONFIG_MDP_PPP_ASYNC_OP #include "mdp_ppp_dq.h" #endif #ifdef BIT #undef BIT #endif #define BIT(x) (1<<(x)) #define MDPOP_NOP 0 #define MDPOP_LR BIT(0) /* left to right flip */ #define MDPOP_UD BIT(1) /* up and down flip */ #define MDPOP_ROT90 BIT(2) /* rotate image to 90 degree */ #define MDPOP_ROT180 (MDPOP_UD|MDPOP_LR) #define MDPOP_ROT270 (MDPOP_ROT90|MDPOP_UD|MDPOP_LR) #define MDPOP_ASCALE BIT(7) #define MDPOP_ALPHAB BIT(8) /* enable alpha blending */ #define MDPOP_TRANSP BIT(9) /* enable transparency */ #define MDPOP_DITHER BIT(10) /* enable dither */ #define MDPOP_SHARPENING BIT(11) /* enable sharpening */ #define MDPOP_BLUR BIT(12) /* enable blur */ #define MDPOP_FG_PM_ALPHA BIT(13) struct mdp_table_entry { uint32_t reg; uint32_t val; }; extern struct mdp_ccs mdp_ccs_yuv2rgb ; extern struct mdp_ccs mdp_ccs_rgb2yuv ; /* * MDP Image Structure */ typedef struct mdpImg_ { uint32 imgType; /* Image type */ uint32 *bmy_addr; /* bitmap or y addr */ uint32 *cbcr_addr; /* cbcr addr */ uint32 width; /* image width */ uint32 mdpOp; /* image opertion (rotation,flip up/down, alpha/tp) */ uint32 tpVal; /* transparency color */ uint32 alpha; /* alpha percentage 0%(0x0) ~ 100%(0x100) */ int sp_value; /* sharpening strength */ } MDPIMG; #ifdef CONFIG_MDP_PPP_ASYNC_OP #define MDP_OUTP(addr, data) mdp_ppp_outdw((uint32_t)(addr), \ (uint32_t)(data)) #else #define MDP_OUTP(addr, data) outpdw((addr), (data)) #endif #define MDP_KTIME2USEC(kt) (kt.tv.sec*1000000 + kt.tv.nsec/1000) #define MDP_BASE msm_mdp_base typedef enum { MDP_BC_SCALE_POINT2_POINT4, MDP_BC_SCALE_POINT4_POINT6, MDP_BC_SCALE_POINT6_POINT8, MDP_BC_SCALE_POINT8_1, MDP_BC_SCALE_UP, MDP_PR_SCALE_POINT2_POINT4, MDP_PR_SCALE_POINT4_POINT6, MDP_PR_SCALE_POINT6_POINT8, MDP_PR_SCALE_POINT8_1, MDP_PR_SCALE_UP, MDP_SCALE_BLUR, MDP_INIT_SCALE } MDP_SCALE_MODE; typedef enum { MDP_BLOCK_POWER_OFF, MDP_BLOCK_POWER_ON } MDP_BLOCK_POWER_STATE; typedef enum { MDP_MASTER_BLOCK, MDP_CMD_BLOCK, MDP_PPP_BLOCK, MDP_DMA2_BLOCK, MDP_DMA3_BLOCK, MDP_DMA_S_BLOCK, MDP_DMA_E_BLOCK, MDP_OVERLAY0_BLOCK, MDP_OVERLAY1_BLOCK, MDP_MAX_BLOCK } MDP_BLOCK_TYPE; /* Let's keep Q Factor power of 2 for optimization */ #define MDP_SCALE_Q_FACTOR 512 #ifdef CONFIG_FB_MSM_MDP31 #define MDP_MAX_X_SCALE_FACTOR (MDP_SCALE_Q_FACTOR*8) #define MDP_MIN_X_SCALE_FACTOR (MDP_SCALE_Q_FACTOR/8) #define MDP_MAX_Y_SCALE_FACTOR (MDP_SCALE_Q_FACTOR*8) #define MDP_MIN_Y_SCALE_FACTOR (MDP_SCALE_Q_FACTOR/8) #else #define MDP_MAX_X_SCALE_FACTOR (MDP_SCALE_Q_FACTOR*4) #define MDP_MIN_X_SCALE_FACTOR (MDP_SCALE_Q_FACTOR/4) #define MDP_MAX_Y_SCALE_FACTOR (MDP_SCALE_Q_FACTOR*4) #define MDP_MIN_Y_SCALE_FACTOR (MDP_SCALE_Q_FACTOR/4) #endif /* SHIM Q Factor */ #define PHI_Q_FACTOR 29 #define PQF_PLUS_5 (PHI_Q_FACTOR + 5) /* due to 32 phases */ #define PQF_PLUS_4 (PHI_Q_FACTOR + 4) #define PQF_PLUS_2 (PHI_Q_FACTOR + 2) /* to get 4.0 */ #define PQF_MINUS_2 (PHI_Q_FACTOR - 2) /* to get 0.25 */ #define PQF_PLUS_5_PLUS_2 (PQF_PLUS_5 + 2) #define PQF_PLUS_5_MINUS_2 (PQF_PLUS_5 - 2) #define MDP_CONVTP(tpVal) (((tpVal&0xF800)<<8)|((tpVal&0x7E0)<<5)|((tpVal&0x1F)<<3)) #define MDPOP_ROTATION (MDPOP_ROT90|MDPOP_LR|MDPOP_UD) #define MDP_CHKBIT(val, bit) ((bit) == ((val) & (bit))) /* overlay interface API defines */ typedef enum { MORE_IBUF, FINAL_IBUF, COMPLETE_IBUF } MDP_IBUF_STATE; struct mdp_dirty_region { __u32 xoffset; /* source origin in the x-axis */ __u32 yoffset; /* source origin in the y-axis */ __u32 width; /* number of pixels in the x-axis */ __u32 height; /* number of pixels in the y-axis */ }; /* * MDP extended data types */ typedef struct mdp_roi_s { uint32 x; uint32 y; uint32 width; uint32 height; int32 lcd_x; int32 lcd_y; uint32 dst_width; uint32 dst_height; } MDP_ROI; typedef struct mdp_ibuf_s { uint8 *buf; uint32 bpp; uint32 ibuf_type; uint32 ibuf_width; uint32 ibuf_height; MDP_ROI roi; MDPIMG mdpImg; int32 dma_x; int32 dma_y; uint32 dma_w; uint32 dma_h; uint32 vsync_enable; uint32 visible_swapped; } MDPIBUF; struct mdp_dma_data { boolean busy; boolean waiting; struct mutex ov_mutex; struct semaphore mutex; struct completion comp; }; #define MDP_CMD_DEBUG_ACCESS_BASE (MDP_BASE+0x10000) #define MDP_DMA2_TERM 0x1 #define MDP_DMA3_TERM 0x2 #define MDP_PPP_TERM 0x4 #define MDP_DMA_S_TERM 0x8 #ifdef CONFIG_FB_MSM_MDP40 #define MDP_DMA_E_TERM 0x10 #define MDP_OVERLAY0_TERM 0x20 #define MDP_OVERLAY1_TERM 0x40 #endif #define ACTIVE_START_X_EN BIT(31) #define ACTIVE_START_Y_EN BIT(31) #define ACTIVE_HIGH 0 #define ACTIVE_LOW 1 #define MDP_DMA_S_DONE BIT(2) #define LCDC_FRAME_START BIT(15) #define LCDC_UNDERFLOW BIT(16) #ifdef CONFIG_FB_MSM_MDP22 #define MDP_DMA_P_DONE BIT(2) #else #define MDP_DMA_P_DONE BIT(14) #endif #define MDP_PPP_DONE BIT(0) #define TV_OUT_DMA3_DONE BIT(6) #define TV_ENC_UNDERRUN BIT(7) #define TV_OUT_DMA3_START BIT(13) #define MDP_HIST_DONE BIT(20) #ifdef CONFIG_FB_MSM_MDP22 #define MDP_ANY_INTR_MASK (MDP_PPP_DONE| \ MDP_DMA_P_DONE| \ TV_ENC_UNDERRUN) #else #define MDP_ANY_INTR_MASK (MDP_PPP_DONE| \ MDP_DMA_P_DONE| \ MDP_DMA_S_DONE| \ LCDC_UNDERFLOW| \ MDP_HIST_DONE| \ TV_ENC_UNDERRUN) #endif #define MDP_TOP_LUMA 16 #define MDP_TOP_CHROMA 0 #define MDP_BOTTOM_LUMA 19 #define MDP_BOTTOM_CHROMA 3 #define MDP_LEFT_LUMA 22 #define MDP_LEFT_CHROMA 6 #define MDP_RIGHT_LUMA 25 #define MDP_RIGHT_CHROMA 9 #define CLR_G 0x0 #define CLR_B 0x1 #define CLR_R 0x2 #define CLR_ALPHA 0x3 #define CLR_Y CLR_G #define CLR_CB CLR_B #define CLR_CR CLR_R /* from lsb to msb */ #define MDP_GET_PACK_PATTERN(a,x,y,z,bit) (((a)<<(bit*3))|((x)<<(bit*2))|((y)<