summaryrefslogtreecommitdiff
path: root/drivers/video
diff options
context:
space:
mode:
authorRobby Cai <robby.cai@nxp.com>2017-03-09 21:42:04 +0800
committerRobby Cai <robby.cai@nxp.com>2017-04-18 16:33:15 +0800
commit998b29aac600678c40324ba2faf09aaded01c29a (patch)
treec8685b40d7c968d288e3028d3497b5a310b9d987 /drivers/video
parentebcdab9fd127e654568a20f6178818132b625efe (diff)
MLK-14516 epdc: bypass pxp legacy process when there's no transformation
when there's no transform (Y8 format in framebuffer, no rotation, no look-up transformation such as CMAP, no scaling/flip, etc.) and no dithering, bypass pxp legacy process to save time. Signed-off-by: Robby Cai <robby.cai@nxp.com> (cherry picked from commit fccd1fc3dbfa689f81ba0900b8538f5c90ed24e1)
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/fbdev/mxc/mxc_epdc_v2_fb.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/drivers/video/fbdev/mxc/mxc_epdc_v2_fb.c b/drivers/video/fbdev/mxc/mxc_epdc_v2_fb.c
index 9f6140a544fa..36ae60402a14 100644
--- a/drivers/video/fbdev/mxc/mxc_epdc_v2_fb.c
+++ b/drivers/video/fbdev/mxc/mxc_epdc_v2_fb.c
@@ -2760,6 +2760,8 @@ static void epdc_submit_work_func(struct work_struct *work)
struct update_marker_data *next_marker, *temp_marker;
struct mxc_epdc_fb_data *fb_data =
container_of(work, struct mxc_epdc_fb_data, epdc_submit_work);
+ struct pxp_config_data *pxp_conf = &fb_data->pxp_conf;
+ struct pxp_proc_data *proc_data = &pxp_conf->proc_data;
struct update_data_list *upd_data_list = NULL;
struct mxcfb_rect adj_update_region, *upd_region;
bool end_merge = false;
@@ -2907,22 +2909,22 @@ static void epdc_submit_work_func(struct work_struct *work)
* - FB unrotated
* - FB pixel format = 8-bit grayscale
* - No look-up transformations (inversion, posterization, etc.)
- *
- * Note: A bug with EPDC stride prevents us from skipping
- * PxP in versions 2.0 and earlier of EPDC.
+ * - No scaling/flip
*/
- is_transform = upd_data_list->update_desc->upd_data.flags &
+ is_transform = ((upd_data_list->update_desc->upd_data.flags &
(EPDC_FLAG_ENABLE_INVERSION | EPDC_FLAG_USE_DITHERING_Y1 |
EPDC_FLAG_USE_DITHERING_Y4 | EPDC_FLAG_FORCE_MONOCHROME |
- EPDC_FLAG_USE_CMAP) ? true : false;
+ EPDC_FLAG_USE_CMAP)) && (proc_data->scaling == 0) &&
+ (proc_data->hflip == 0) && (proc_data->vflip == 0)) ?
+ true : false;
/*XXX if we use external mode, we should first use pxp
* to update upd buffer data to working buffer first.
*/
if ((fb_data->epdc_fb_var.rotate == FB_ROTATE_UR) &&
(fb_data->epdc_fb_var.grayscale == GRAYSCALE_8BIT) &&
- !is_transform && (fb_data->rev > 20) &&
- !fb_data->restrict_width && !fb_data->epdc_wb_mode) {
+ !is_transform && (proc_data->dither_mode == 0) &&
+ !fb_data->restrict_width) {
/* If needed, enable EPDC HW while ePxP is processing */
if ((fb_data->power_state == POWER_STATE_OFF)
@@ -6315,6 +6317,7 @@ static int pxp_wfe_a_process(struct mxc_epdc_fb_data *fb_data,
u32 wv_mode = upd_data_list->update_desc->upd_data.waveform_mode;
int i, j = 0, ret;
int length;
+ bool is_transform;
dev_dbg(fb_data->dev, "Starting PxP WFE_A process.\n");
@@ -6392,12 +6395,22 @@ static int pxp_wfe_a_process(struct mxc_epdc_fb_data *fb_data,
if (proc_data->dither_mode) {
pxp_conf->wfe_a_fetch_param[0].paddr = fb_data->phys_addr_y4;
} else {
-#ifdef USE_PS_AS_OUTPUT
- pxp_conf->wfe_a_fetch_param[0].paddr = upd_data_list->phys_addr + upd_data_list->update_desc->epdc_offs;
-
-#else
- pxp_conf->wfe_a_fetch_param[0].paddr = sg_dma_address(&sg[0]);
-#endif
+ is_transform = ((upd_data_list->update_desc->upd_data.flags &
+ (EPDC_FLAG_ENABLE_INVERSION | EPDC_FLAG_USE_DITHERING_Y1 |
+ EPDC_FLAG_USE_DITHERING_Y4 | EPDC_FLAG_FORCE_MONOCHROME |
+ EPDC_FLAG_USE_CMAP)) && (proc_data->scaling == 0) &&
+ (proc_data->hflip == 0) && (proc_data->vflip == 0)) ?
+ true : false;
+
+ if ((fb_data->epdc_fb_var.rotate == FB_ROTATE_UR) &&
+ (fb_data->epdc_fb_var.grayscale == GRAYSCALE_8BIT) &&
+ !is_transform && (proc_data->dither_mode == 0) &&
+ !fb_data->restrict_width) {
+ pxp_conf->wfe_a_fetch_param[0].paddr =
+ sg_dma_address(&sg[0]);
+ } else
+ pxp_conf->wfe_a_fetch_param[0].paddr =
+ upd_data_list->phys_addr + upd_data_list->update_desc->epdc_offs;
}
/* fetch1 is working buffer */