diff options
| -rw-r--r-- | drivers/video/fbdev/msm/mdp3_hwio.h | 3 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdp3_ppp.c | 41 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdp3_ppp.h | 1 | ||||
| -rw-r--r-- | include/uapi/linux/msm_mdp.h | 1 |
4 files changed, 44 insertions, 2 deletions
diff --git a/drivers/video/fbdev/msm/mdp3_hwio.h b/drivers/video/fbdev/msm/mdp3_hwio.h index 90ee3579bc1e..8846ec5fdb62 100644 --- a/drivers/video/fbdev/msm/mdp3_hwio.h +++ b/drivers/video/fbdev/msm/mdp3_hwio.h @@ -221,6 +221,9 @@ #define MDP3_PPP_BG_UNPACK_PATTERN1 0x101D8 #define MDP3_PPP_BG_UNPACK_PATTERN2 0x101DC +#define MDP3_TFETCH_SOLID_FILL 0x20004 +#define MDP3_TFETCH_FILL_COLOR 0x20040 + #define MDP3_PPP_BLEND_PARAM 0x1014C #define MDP3_PPP_BLEND_BG_ALPHA_SEL 0x70010 diff --git a/drivers/video/fbdev/msm/mdp3_ppp.c b/drivers/video/fbdev/msm/mdp3_ppp.c index 5ddae1f6f9df..deae57922d4b 100644 --- a/drivers/video/fbdev/msm/mdp3_ppp.c +++ b/drivers/video/fbdev/msm/mdp3_ppp.c @@ -38,6 +38,9 @@ #define MDP_PPP_MAX_BPP 4 #define MDP_PPP_DYNAMIC_FACTOR 3 #define MDP_PPP_MAX_READ_WRITE 3 +#define MDP_SOLID_FILL_COLOR 0x0 +#define ENABLE_SOLID_FILL 0x2 +#define DISABLE_SOLID_FILL 0x0 static const bool valid_fmt[MDP_IMGTYPE_LIMIT] = { [MDP_RGB_565] = true, @@ -392,6 +395,23 @@ void mdp3_start_ppp(struct ppp_blit_op *blit_op) /* Wait for the pipe to clear */ do { } while (mdp3_ppp_pipe_wait() <= 0); config_ppp_op_mode(blit_op); + if (blit_op->solid_fill) { + MDP3_REG_WRITE(0x10138, 0x10000000); + MDP3_REG_WRITE(0x1014c, 0xffffffff); + MDP3_REG_WRITE(0x101b8, 0); + MDP3_REG_WRITE(0x101bc, 0); + MDP3_REG_WRITE(0x1013c, 0); + MDP3_REG_WRITE(0x10140, 0); + MDP3_REG_WRITE(0x10144, 0); + MDP3_REG_WRITE(0x10148, 0); + MDP3_REG_WRITE(MDP3_TFETCH_FILL_COLOR, + MDP_SOLID_FILL_COLOR); + MDP3_REG_WRITE(MDP3_TFETCH_SOLID_FILL, + ENABLE_SOLID_FILL); + } else { + MDP3_REG_WRITE(MDP3_TFETCH_SOLID_FILL, + DISABLE_SOLID_FILL); + } mdp3_ppp_kickoff(); } @@ -491,6 +511,22 @@ static void mdp3_ppp_process_req(struct ppp_blit_op *blit_op, if (req->flags & MDP_BLUR) blit_op->mdp_op |= MDPOP_ASCALE | MDPOP_BLUR; + + if (req->flags & MDP_SOLID_FILL) { + blit_op->solid_fill = true; + + /* Avoid odd width, as it could hang ppp during solid fill */ + blit_op->dst.roi.width = (blit_op->dst.roi.width / 2) * 2; + blit_op->src.roi.width = (blit_op->src.roi.width / 2) * 2; + + /* Avoid RGBA format, as it could hang ppp during solid fill */ + if (blit_op->src.color_fmt == MDP_RGBA_8888) + blit_op->src.color_fmt = MDP_RGBX_8888; + if (blit_op->dst.color_fmt == MDP_RGBA_8888) + blit_op->dst.color_fmt = MDP_RGBX_8888; + } else { + blit_op->solid_fill = false; + } } static void mdp3_ppp_tile_workaround(struct ppp_blit_op *blit_op, @@ -793,9 +829,10 @@ int mdp3_ppp_start_blit(struct msm_fb_data_type *mfd, } is_bpp_4 = (ret == 4) ? 1 : 0; - if ((is_bpp_4 && (remainder == 6 || remainder == 14))) + if ((is_bpp_4 && (remainder == 6 || remainder == 14)) && + !(req->flags & MDP_SOLID_FILL)) ret = mdp3_ppp_blit_workaround(mfd, req, remainder, - src_data, dst_data); + src_data, dst_data); else ret = mdp3_ppp_blit(mfd, req, src_data, dst_data); return ret; diff --git a/drivers/video/fbdev/msm/mdp3_ppp.h b/drivers/video/fbdev/msm/mdp3_ppp.h index b4252cad857a..7dbe44e50703 100644 --- a/drivers/video/fbdev/msm/mdp3_ppp.h +++ b/drivers/video/fbdev/msm/mdp3_ppp.h @@ -332,6 +332,7 @@ struct ppp_blit_op { struct ppp_img_desc bg; struct ppp_blend blend; uint32_t mdp_op; /* Operations */ + bool solid_fill; }; struct ppp_edge_rep { diff --git a/include/uapi/linux/msm_mdp.h b/include/uapi/linux/msm_mdp.h index 858f093c5db2..074754c96162 100644 --- a/include/uapi/linux/msm_mdp.h +++ b/include/uapi/linux/msm_mdp.h @@ -159,6 +159,7 @@ enum { #define MDP_BLUR 0x10 #define MDP_BLEND_FG_PREMULT 0x20000 #define MDP_IS_FG 0x40000 +#define MDP_SOLID_FILL 0x0000100 #define MDP_DEINTERLACE 0x80000000 #define MDP_SHARPENING 0x40000000 #define MDP_NO_DMA_BARRIER_START 0x20000000 |
