Loading drivers/video/msm/mdss/mdss_mdp_cdm.c +3 −22 Original line number Diff line number Diff line /* Copyright (c) 2014, The Linux Foundation. All rights reserved. /* Copyright (c) 2014-2015, The Linux Foundation. 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 Loading Loading @@ -26,20 +26,6 @@ static u32 cdm_cdwn2_offsite_h_coeff[] = {0x000b0005, 0x01db01eb, 0x00e40046}; static u32 cdm_cdwn2_cosite_v_coeff[] = {0x00080004}; static u32 cdm_cdwn2_offsite_v_coeff[] = {0x00060002}; /* Limited Range rgb2yuv coeff with clamp and bias values for CSC 10 module */ static struct mdp_csc_cfg cdm_rgb2yuv_coeff = { 0, { 0x0083, 0x0102, 0x0032, 0x1fb5, 0x1f6c, 0x00e1, 0x00e1, 0x1f45, 0x1fdc }, { 0x00, 0x00, 0x00 }, { 0x0040, 0x0200, 0x0200 }, { 0x000, 0x3ff, 0x000, 0x3ff, 0x000, 0x3ff }, { 0x040, 0x3ac, 0x040, 0x3c0, 0x040, 0x3c0 }, }; /** * @mdss_mdp_cdm_alloc() - Allocates a cdm block by parsing the list of * available cdm blocks. Loading Loading @@ -107,13 +93,6 @@ struct mdss_mdp_cdm *mdss_mdp_cdm_init(struct mdss_mdp_ctl *ctl, u32 intf_type) cdm->is_bypassed = true; memset(&cdm->setup, 0x0, sizeof(struct mdp_cdm_cfg)); /* * Setup RGB to YUV conversion in CDM. CDM will be in bypass mode for * other cases */ mdss_mdp_csc_setup_data(MDSS_MDP_BLOCK_CDM, cdm->num, &cdm_rgb2yuv_coeff); return cdm; } Loading @@ -129,6 +108,8 @@ static int mdss_mdp_cdm_csc_setup(struct mdss_mdp_cdm *cdm, int rc = 0; u32 op_mode = 0; mdss_mdp_csc_setup(MDSS_MDP_BLOCK_CDM, cdm->num, data->csc_type); if (data->csc_type == MDSS_MDP_CSC_RGB2YUV_601L) { op_mode |= BIT(2); /* DST_DATA_FORMAT = YUV */ op_mode &= ~BIT(1); /* SRC_DATA_FORMAT = RGB */ Loading drivers/video/msm/mdss/mdss_mdp_pp.c +113 −5 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ #include <linux/msm-bus-board.h> #include "mdss_mdp_pp_cache_config.h" struct mdp_csc_cfg mdp_csc_convert[MDSS_MDP_MAX_CSC] = { struct mdp_csc_cfg mdp_csc_8bit_convert[MDSS_MDP_MAX_CSC] = { [MDSS_MDP_CSC_YUV2RGB_601L] = { 0, { Loading Loading @@ -123,10 +123,111 @@ struct mdp_csc_cfg mdp_csc_convert[MDSS_MDP_MAX_CSC] = { }, }; struct mdp_csc_cfg mdp_csc_10bit_convert[MDSS_MDP_MAX_CSC] = { [MDSS_MDP_CSC_YUV2RGB_601L] = { 0, { 0x0254, 0x0000, 0x0331, 0x0254, 0xff37, 0xfe60, 0x0254, 0x0409, 0x0000, }, { 0xffc0, 0xffe0, 0xffe0,}, { 0x0, 0x0, 0x0,}, { 0x40, 0x3ac, 0x40, 0x3c0, 0x40, 0x3c0,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, [MDSS_MDP_CSC_YUV2RGB_601FR] = { 0, { 0x0200, 0x0000, 0x02ce, 0x0200, 0xff50, 0xfe92, 0x0200, 0x038b, 0x0000, }, { 0x0000, 0xffe0, 0xffe0,}, { 0x0, 0x0, 0x0,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, [MDSS_MDP_CSC_YUV2RGB_709L] = { 0, { 0x0254, 0x0000, 0x0396, 0x0254, 0xff93, 0xfeef, 0x0254, 0x043e, 0x0000, }, { 0xffc0, 0xffe0, 0xffe0,}, { 0x0, 0x0, 0x0,}, { 0x40, 0x3ac, 0x40, 0x3c0, 0x40, 0x3c0,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, [MDSS_MDP_CSC_RGB2YUV_601L] = { 0, { 0x0083, 0x0102, 0x0032, 0xffb4, 0xff6b, 0x00e1, 0x00e1, 0xff44, 0xffdb }, { 0x0, 0x0, 0x0,}, { 0x0040, 0x0200, 0x0200,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0040, 0x03ac, 0x0040, 0x03c0, 0x0040, 0x03c0,}, }, [MDSS_MDP_CSC_RGB2YUV_601FR] = { 0, { 0x0099, 0x012d, 0x003a, 0xffaa, 0xff56, 0x0100, 0x0100, 0xff2a, 0xffd6 }, { 0x0, 0x0, 0x0,}, { 0x0000, 0x0200, 0x0200,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, [MDSS_MDP_CSC_RGB2YUV_709L] = { 0, { 0x005d, 0x013a, 0x0020, 0xffcc, 0xff53, 0x00e1, 0x00e1, 0xff34, 0xffeb }, { 0x0, 0x0, 0x0,}, { 0x0040, 0x0200, 0x0200,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0040, 0x03ac, 0x0040, 0x03c0, 0x0040, 0x03c0,}, }, [MDSS_MDP_CSC_YUV2YUV] = { 0, { 0x0200, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0200, }, { 0x0, 0x0, 0x0,}, { 0x0, 0x0, 0x0,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, [MDSS_MDP_CSC_RGB2RGB] = { 0, { 0x0200, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0200, }, { 0x0, 0x0, 0x0,}, { 0x0, 0x0, 0x0,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, }; #define CSC_MV_OFF 0x0 #define CSC_BV_OFF 0x2C #define CSC_LV_OFF 0x14 #define CSC_POST_OFF 0xC #define CSC_10BIT_LV_SHIFT 16 #define CSC_8BIT_LV_SHIFT 8 #define HIST_INTR_DSPP_MASK 0xFFF000 Loading Loading @@ -427,7 +528,7 @@ int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, struct mdp_csc_cfg *data) { int i, ret = 0; char __iomem *base, *addr; u32 val = 0; u32 val = 0, lv_shift = 0; struct mdss_data_type *mdata; struct mdss_mdp_pipe *pipe; struct mdss_mdp_cdm *cdm; Loading @@ -441,6 +542,7 @@ int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, struct mdp_csc_cfg *data) mdata = mdss_mdp_get_mdata(); switch (block) { case MDSS_MDP_BLOCK_SSPP: lv_shift = CSC_8BIT_LV_SHIFT; pipe = mdss_mdp_pipe_search(mdata, BIT(blk_idx)); if (!pipe) { pr_err("invalid blk index=%d\n", blk_idx); Loading @@ -456,6 +558,7 @@ int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, struct mdp_csc_cfg *data) } break; case MDSS_MDP_BLOCK_WB: lv_shift = CSC_8BIT_LV_SHIFT; if (blk_idx < mdata->nwb) { wb = mdata->wb + blk_idx; if (wb->base) Loading @@ -467,6 +570,7 @@ int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, struct mdp_csc_cfg *data) } break; case MDSS_MDP_BLOCK_CDM: lv_shift = CSC_10BIT_LV_SHIFT; if (blk_idx < mdata->ncdm) { cdm = mdata->cdm_off + blk_idx; if (cdm->base) Loading Loading @@ -508,10 +612,11 @@ int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, struct mdp_csc_cfg *data) addr = base + CSC_LV_OFF; for (i = 0; i < 6; i += 2) { val = (data->csc_pre_lv[i] << 8) | data->csc_pre_lv[i+1]; val = (data->csc_pre_lv[i] << lv_shift) | data->csc_pre_lv[i+1]; writel_relaxed(val, addr); val = (data->csc_post_lv[i] << 8) | data->csc_post_lv[i+1]; val = (data->csc_post_lv[i] << lv_shift) | data->csc_post_lv[i+1]; writel_relaxed(val, addr + CSC_POST_OFF); addr += sizeof(u32); } Loading @@ -531,7 +636,10 @@ int mdss_mdp_csc_setup(u32 block, u32 blk_idx, u32 csc_type) pr_debug("csc type=%d blk=%d idx=%d\n", csc_type, block, blk_idx); data = &mdp_csc_convert[csc_type]; if (block == MDSS_MDP_BLOCK_CDM) data = &mdp_csc_10bit_convert[csc_type]; else data = &mdp_csc_8bit_convert[csc_type]; return mdss_mdp_csc_setup_data(block, blk_idx, data); } Loading Loading
drivers/video/msm/mdss/mdss_mdp_cdm.c +3 −22 Original line number Diff line number Diff line /* Copyright (c) 2014, The Linux Foundation. All rights reserved. /* Copyright (c) 2014-2015, The Linux Foundation. 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 Loading Loading @@ -26,20 +26,6 @@ static u32 cdm_cdwn2_offsite_h_coeff[] = {0x000b0005, 0x01db01eb, 0x00e40046}; static u32 cdm_cdwn2_cosite_v_coeff[] = {0x00080004}; static u32 cdm_cdwn2_offsite_v_coeff[] = {0x00060002}; /* Limited Range rgb2yuv coeff with clamp and bias values for CSC 10 module */ static struct mdp_csc_cfg cdm_rgb2yuv_coeff = { 0, { 0x0083, 0x0102, 0x0032, 0x1fb5, 0x1f6c, 0x00e1, 0x00e1, 0x1f45, 0x1fdc }, { 0x00, 0x00, 0x00 }, { 0x0040, 0x0200, 0x0200 }, { 0x000, 0x3ff, 0x000, 0x3ff, 0x000, 0x3ff }, { 0x040, 0x3ac, 0x040, 0x3c0, 0x040, 0x3c0 }, }; /** * @mdss_mdp_cdm_alloc() - Allocates a cdm block by parsing the list of * available cdm blocks. Loading Loading @@ -107,13 +93,6 @@ struct mdss_mdp_cdm *mdss_mdp_cdm_init(struct mdss_mdp_ctl *ctl, u32 intf_type) cdm->is_bypassed = true; memset(&cdm->setup, 0x0, sizeof(struct mdp_cdm_cfg)); /* * Setup RGB to YUV conversion in CDM. CDM will be in bypass mode for * other cases */ mdss_mdp_csc_setup_data(MDSS_MDP_BLOCK_CDM, cdm->num, &cdm_rgb2yuv_coeff); return cdm; } Loading @@ -129,6 +108,8 @@ static int mdss_mdp_cdm_csc_setup(struct mdss_mdp_cdm *cdm, int rc = 0; u32 op_mode = 0; mdss_mdp_csc_setup(MDSS_MDP_BLOCK_CDM, cdm->num, data->csc_type); if (data->csc_type == MDSS_MDP_CSC_RGB2YUV_601L) { op_mode |= BIT(2); /* DST_DATA_FORMAT = YUV */ op_mode &= ~BIT(1); /* SRC_DATA_FORMAT = RGB */ Loading
drivers/video/msm/mdss/mdss_mdp_pp.c +113 −5 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ #include <linux/msm-bus-board.h> #include "mdss_mdp_pp_cache_config.h" struct mdp_csc_cfg mdp_csc_convert[MDSS_MDP_MAX_CSC] = { struct mdp_csc_cfg mdp_csc_8bit_convert[MDSS_MDP_MAX_CSC] = { [MDSS_MDP_CSC_YUV2RGB_601L] = { 0, { Loading Loading @@ -123,10 +123,111 @@ struct mdp_csc_cfg mdp_csc_convert[MDSS_MDP_MAX_CSC] = { }, }; struct mdp_csc_cfg mdp_csc_10bit_convert[MDSS_MDP_MAX_CSC] = { [MDSS_MDP_CSC_YUV2RGB_601L] = { 0, { 0x0254, 0x0000, 0x0331, 0x0254, 0xff37, 0xfe60, 0x0254, 0x0409, 0x0000, }, { 0xffc0, 0xffe0, 0xffe0,}, { 0x0, 0x0, 0x0,}, { 0x40, 0x3ac, 0x40, 0x3c0, 0x40, 0x3c0,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, [MDSS_MDP_CSC_YUV2RGB_601FR] = { 0, { 0x0200, 0x0000, 0x02ce, 0x0200, 0xff50, 0xfe92, 0x0200, 0x038b, 0x0000, }, { 0x0000, 0xffe0, 0xffe0,}, { 0x0, 0x0, 0x0,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, [MDSS_MDP_CSC_YUV2RGB_709L] = { 0, { 0x0254, 0x0000, 0x0396, 0x0254, 0xff93, 0xfeef, 0x0254, 0x043e, 0x0000, }, { 0xffc0, 0xffe0, 0xffe0,}, { 0x0, 0x0, 0x0,}, { 0x40, 0x3ac, 0x40, 0x3c0, 0x40, 0x3c0,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, [MDSS_MDP_CSC_RGB2YUV_601L] = { 0, { 0x0083, 0x0102, 0x0032, 0xffb4, 0xff6b, 0x00e1, 0x00e1, 0xff44, 0xffdb }, { 0x0, 0x0, 0x0,}, { 0x0040, 0x0200, 0x0200,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0040, 0x03ac, 0x0040, 0x03c0, 0x0040, 0x03c0,}, }, [MDSS_MDP_CSC_RGB2YUV_601FR] = { 0, { 0x0099, 0x012d, 0x003a, 0xffaa, 0xff56, 0x0100, 0x0100, 0xff2a, 0xffd6 }, { 0x0, 0x0, 0x0,}, { 0x0000, 0x0200, 0x0200,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, [MDSS_MDP_CSC_RGB2YUV_709L] = { 0, { 0x005d, 0x013a, 0x0020, 0xffcc, 0xff53, 0x00e1, 0x00e1, 0xff34, 0xffeb }, { 0x0, 0x0, 0x0,}, { 0x0040, 0x0200, 0x0200,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0040, 0x03ac, 0x0040, 0x03c0, 0x0040, 0x03c0,}, }, [MDSS_MDP_CSC_YUV2YUV] = { 0, { 0x0200, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0200, }, { 0x0, 0x0, 0x0,}, { 0x0, 0x0, 0x0,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, [MDSS_MDP_CSC_RGB2RGB] = { 0, { 0x0200, 0x0000, 0x0000, 0x0000, 0x0200, 0x0000, 0x0000, 0x0000, 0x0200, }, { 0x0, 0x0, 0x0,}, { 0x0, 0x0, 0x0,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, }; #define CSC_MV_OFF 0x0 #define CSC_BV_OFF 0x2C #define CSC_LV_OFF 0x14 #define CSC_POST_OFF 0xC #define CSC_10BIT_LV_SHIFT 16 #define CSC_8BIT_LV_SHIFT 8 #define HIST_INTR_DSPP_MASK 0xFFF000 Loading Loading @@ -427,7 +528,7 @@ int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, struct mdp_csc_cfg *data) { int i, ret = 0; char __iomem *base, *addr; u32 val = 0; u32 val = 0, lv_shift = 0; struct mdss_data_type *mdata; struct mdss_mdp_pipe *pipe; struct mdss_mdp_cdm *cdm; Loading @@ -441,6 +542,7 @@ int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, struct mdp_csc_cfg *data) mdata = mdss_mdp_get_mdata(); switch (block) { case MDSS_MDP_BLOCK_SSPP: lv_shift = CSC_8BIT_LV_SHIFT; pipe = mdss_mdp_pipe_search(mdata, BIT(blk_idx)); if (!pipe) { pr_err("invalid blk index=%d\n", blk_idx); Loading @@ -456,6 +558,7 @@ int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, struct mdp_csc_cfg *data) } break; case MDSS_MDP_BLOCK_WB: lv_shift = CSC_8BIT_LV_SHIFT; if (blk_idx < mdata->nwb) { wb = mdata->wb + blk_idx; if (wb->base) Loading @@ -467,6 +570,7 @@ int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, struct mdp_csc_cfg *data) } break; case MDSS_MDP_BLOCK_CDM: lv_shift = CSC_10BIT_LV_SHIFT; if (blk_idx < mdata->ncdm) { cdm = mdata->cdm_off + blk_idx; if (cdm->base) Loading Loading @@ -508,10 +612,11 @@ int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, struct mdp_csc_cfg *data) addr = base + CSC_LV_OFF; for (i = 0; i < 6; i += 2) { val = (data->csc_pre_lv[i] << 8) | data->csc_pre_lv[i+1]; val = (data->csc_pre_lv[i] << lv_shift) | data->csc_pre_lv[i+1]; writel_relaxed(val, addr); val = (data->csc_post_lv[i] << 8) | data->csc_post_lv[i+1]; val = (data->csc_post_lv[i] << lv_shift) | data->csc_post_lv[i+1]; writel_relaxed(val, addr + CSC_POST_OFF); addr += sizeof(u32); } Loading @@ -531,7 +636,10 @@ int mdss_mdp_csc_setup(u32 block, u32 blk_idx, u32 csc_type) pr_debug("csc type=%d blk=%d idx=%d\n", csc_type, block, blk_idx); data = &mdp_csc_convert[csc_type]; if (block == MDSS_MDP_BLOCK_CDM) data = &mdp_csc_10bit_convert[csc_type]; else data = &mdp_csc_8bit_convert[csc_type]; return mdss_mdp_csc_setup_data(block, blk_idx, data); } Loading