Loading drivers/video/msm/mdss/mdss_dsi_clk.c +1 −1 Original line number Diff line number Diff line Loading @@ -876,7 +876,7 @@ void *mdss_dsi_clk_init(struct mdss_dsi_clk_info *info) mngr->post_clkoff_cb = info->post_clkoff_cb; mngr->priv_data = info->priv_data; mngr->reg_bus_clt = mdss_reg_bus_vote_client_create(info->name); if (IS_ERR_OR_NULL(mngr->reg_bus_clt)) { if (IS_ERR(mngr->reg_bus_clt)) { pr_err("Unable to get handle for reg bus vote\n"); kfree(mngr); mngr = ERR_PTR(-EINVAL); Loading drivers/video/msm/mdss/mdss_hdmi_tx.c +1 −1 Original line number Diff line number Diff line Loading @@ -2797,7 +2797,7 @@ static int hdmi_tx_config_power(struct hdmi_tx_ctrl *hdmi_ctrl, snprintf(name, MAX_CLIENT_NAME_LEN, "hdmi:%u", module); hdmi_ctrl->pdata.reg_bus_clt[module] = mdss_reg_bus_vote_client_create(name); if (IS_ERR_OR_NULL(hdmi_ctrl->pdata.reg_bus_clt[module])) { if (IS_ERR(hdmi_ctrl->pdata.reg_bus_clt[module])) { pr_err("reg bus client create failed\n"); msm_dss_config_vreg(&hdmi_ctrl->pdev->dev, power_data->vreg_config, power_data->num_vreg, 0); Loading drivers/video/msm/mdss/mdss_mdp.c +52 −5 Original line number Diff line number Diff line Loading @@ -117,6 +117,7 @@ struct mdss_hw mdss_misc_hw = { .irq_handler = NULL, }; #ifdef CONFIG_MSM_BUS_SCALING #define MDP_REG_BUS_VECTOR_ENTRY(ab_val, ib_val) \ { \ .src = MSM_BUS_MASTER_AMPSS_M0, \ Loading @@ -143,6 +144,7 @@ static struct msm_bus_scale_pdata mdp_reg_bus_scale_table = { .name = "mdss_reg", .active_only = true, }; #endif u32 invalid_mdp107_wb_output_fmts[] = { MDP_XRGB_8888, Loading Loading @@ -294,6 +296,7 @@ static irqreturn_t mdss_irq_handler(int irq, void *ptr) return IRQ_HANDLED; } #ifdef CONFIG_MSM_BUS_SCALING static int mdss_mdp_bus_scale_register(struct mdss_data_type *mdata) { struct msm_bus_scale_pdata *reg_bus_pdata; Loading Loading @@ -571,6 +574,42 @@ int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota) return rc; } #else static int mdss_mdp_bus_scale_register(struct mdss_data_type *mdata) { return 0; } static void mdss_mdp_bus_scale_unregister(struct mdss_data_type *mdata) { } int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota) { pr_debug("No bus scaling! client=%d ab=%llu ib=%llu\n", client, ab_quota, ib_quota); return 0; } struct reg_bus_client *mdss_reg_bus_vote_client_create(char *client_name) { return NULL; } void mdss_reg_bus_vote_client_destroy(struct reg_bus_client *client) { } int mdss_update_reg_bus_vote(struct reg_bus_client *bus_client, u32 usecase_ndx) { pr_debug("%pS: No reg scaling! usecase=%u\n", __builtin_return_address(0), usecase_ndx); return 0; } #endif static inline u32 mdss_mdp_irq_mask(u32 intr_type, u32 intf_num) { Loading Loading @@ -1271,7 +1310,7 @@ static int mdss_mdp_irq_clk_setup(struct mdss_data_type *mdata) } mdata->reg_bus_clt = mdss_reg_bus_vote_client_create("mdp\0"); if (IS_ERR_OR_NULL(mdata->reg_bus_clt)) { if (IS_ERR(mdata->reg_bus_clt)) { pr_err("bus client register failed\n"); return PTR_ERR(mdata->reg_bus_clt); } Loading Loading @@ -1831,11 +1870,11 @@ static int mdss_mdp_get_cmdline_config(struct platform_device *pdev) rc = mdss_mdp_parse_dt_pan_intf(pdev); /* if pref pan intf is not present */ if (rc) pr_err("unable to parse device tree for pan intf\n"); else pr_warn("unable to parse device tree for pan intf\n"); pan_cfg->init_done = true; return rc; return 0; } static void __update_sspp_info(struct mdss_mdp_pipe *pipe, Loading Loading @@ -3898,6 +3937,7 @@ static int mdss_mdp_parse_dt_ppb_off(struct platform_device *pdev) return -EINVAL; } #ifdef CONFIG_MSM_BUS_SCALING static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev) { int rc, paths; Loading Loading @@ -3956,6 +3996,13 @@ static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev) return rc; } #else static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev) { return 0; } #endif static int mdss_mdp_parse_dt_handler(struct platform_device *pdev, char *prop_name, u32 *offsets, int len) Loading drivers/video/msm/mdss/mdss_mdp.h +59 −1 Original line number Diff line number Diff line Loading @@ -113,13 +113,71 @@ enum mdss_mdp_mixer_mux { }; enum mdss_mdp_pipe_type { MDSS_MDP_PIPE_TYPE_UNUSED, MDSS_MDP_PIPE_TYPE_INVALID, MDSS_MDP_PIPE_TYPE_VIG, MDSS_MDP_PIPE_TYPE_RGB, MDSS_MDP_PIPE_TYPE_DMA, MDSS_MDP_PIPE_TYPE_CURSOR, }; static inline enum mdss_mdp_sspp_index get_pipe_num_from_ndx(u32 ndx) { u32 id; if (unlikely(!ndx)) return MDSS_MDP_MAX_SSPP; id = fls(ndx) - 1; if (unlikely(ndx ^ BIT(id))) return MDSS_MDP_MAX_SSPP; return id; } static inline enum mdss_mdp_pipe_type get_pipe_type_from_num(enum mdss_mdp_sspp_index pnum) { enum mdss_mdp_pipe_type ptype; switch (pnum) { case MDSS_MDP_SSPP_VIG0: case MDSS_MDP_SSPP_VIG1: case MDSS_MDP_SSPP_VIG2: case MDSS_MDP_SSPP_VIG3: ptype = MDSS_MDP_PIPE_TYPE_VIG; break; case MDSS_MDP_SSPP_RGB0: case MDSS_MDP_SSPP_RGB1: case MDSS_MDP_SSPP_RGB2: case MDSS_MDP_SSPP_RGB3: ptype = MDSS_MDP_PIPE_TYPE_RGB; break; case MDSS_MDP_SSPP_DMA0: case MDSS_MDP_SSPP_DMA1: ptype = MDSS_MDP_PIPE_TYPE_DMA; break; case MDSS_MDP_SSPP_CURSOR0: case MDSS_MDP_SSPP_CURSOR1: ptype = MDSS_MDP_PIPE_TYPE_CURSOR; break; default: ptype = MDSS_MDP_PIPE_TYPE_INVALID; break; } return ptype; } static inline enum mdss_mdp_pipe_type get_pipe_type_from_ndx(u32 ndx) { enum mdss_mdp_sspp_index pnum; pnum = get_pipe_num_from_ndx(ndx); return get_pipe_type_from_num(pnum); } enum mdss_mdp_block_type { MDSS_MDP_BLOCK_UNUSED, MDSS_MDP_BLOCK_SSPP, Loading drivers/video/msm/mdss/mdss_mdp_ctl.c +33 −21 Original line number Diff line number Diff line Loading @@ -4630,17 +4630,12 @@ int mdss_mdp_mixer_pipe_update(struct mdss_mdp_pipe *pipe, j = i * MAX_PIPES_PER_STAGE; /* * 1. If pipe is on the right side of the blending * stage, on either left LM or right LM but it is not * crossing LM boundry then right_blend ndx is used. * 2. If pipe is on the right side of the blending * stage on left LM and it is crossing LM boundry * then for left LM it is placed into right_blend * index but for right LM it still placed into * left_blend index. * this could lead to cases where left blend index is * not populated. For instance, where pipe is spanning * across layer mixers. But this is handled properly * within mixer programming code. */ if (pipe->is_right_blend && (!pipe->src_split_req || (pipe->src_split_req && !mixer->is_right_mixer))) if (pipe->is_right_blend) j++; /* First clear all blend containers for current stage */ Loading Loading @@ -4694,27 +4689,44 @@ void mdss_mdp_mixer_unstage_all(struct mdss_mdp_mixer *mixer) int mdss_mdp_mixer_pipe_unstage(struct mdss_mdp_pipe *pipe, struct mdss_mdp_mixer *mixer) { int index; u8 right_blend_index; int i, right_blend; if (!pipe) return -EINVAL; if (!mixer) return -EINVAL; right_blend_index = pipe->is_right_blend && !(pipe->src_split_req && mixer->is_right_mixer); index = (pipe->mixer_stage * MAX_PIPES_PER_STAGE) + right_blend_index; if (index < MAX_PIPES_PER_LM && pipe == mixer->stage_pipe[index]) { right_blend = pipe->is_right_blend ? 1 : 0; i = (pipe->mixer_stage * MAX_PIPES_PER_STAGE) + right_blend; if ((i < MAX_PIPES_PER_LM) && (pipe == mixer->stage_pipe[i])) { pr_debug("unstage p%d from %s side of stage=%d lm=%d ndx=%d\n", pipe->num, pipe->is_right_blend ? "right" : "left", pipe->mixer_stage, mixer->num, index); pipe->num, right_blend ? "right" : "left", pipe->mixer_stage, mixer->num, i); } else { int stage; mixer->params_changed++; mixer->stage_pipe[index] = NULL; for (i = 0; i < MAX_PIPES_PER_LM; i++) { if (pipe != mixer->stage_pipe[i]) continue; stage = i / MAX_PIPES_PER_STAGE; right_blend = i & 1; pr_warn("lm=%d pipe #%d stage=%d with %s blend, unstaged from %s side of stage=%d!\n", mixer->num, pipe->num, pipe->mixer_stage, pipe->is_right_blend ? "right" : "left", right_blend ? "right" : "left", stage); break; } /* pipe not found, not a failure */ if (i == MAX_PIPES_PER_LM) return 0; } mixer->params_changed++; mixer->stage_pipe[i] = NULL; return 0; } Loading Loading
drivers/video/msm/mdss/mdss_dsi_clk.c +1 −1 Original line number Diff line number Diff line Loading @@ -876,7 +876,7 @@ void *mdss_dsi_clk_init(struct mdss_dsi_clk_info *info) mngr->post_clkoff_cb = info->post_clkoff_cb; mngr->priv_data = info->priv_data; mngr->reg_bus_clt = mdss_reg_bus_vote_client_create(info->name); if (IS_ERR_OR_NULL(mngr->reg_bus_clt)) { if (IS_ERR(mngr->reg_bus_clt)) { pr_err("Unable to get handle for reg bus vote\n"); kfree(mngr); mngr = ERR_PTR(-EINVAL); Loading
drivers/video/msm/mdss/mdss_hdmi_tx.c +1 −1 Original line number Diff line number Diff line Loading @@ -2797,7 +2797,7 @@ static int hdmi_tx_config_power(struct hdmi_tx_ctrl *hdmi_ctrl, snprintf(name, MAX_CLIENT_NAME_LEN, "hdmi:%u", module); hdmi_ctrl->pdata.reg_bus_clt[module] = mdss_reg_bus_vote_client_create(name); if (IS_ERR_OR_NULL(hdmi_ctrl->pdata.reg_bus_clt[module])) { if (IS_ERR(hdmi_ctrl->pdata.reg_bus_clt[module])) { pr_err("reg bus client create failed\n"); msm_dss_config_vreg(&hdmi_ctrl->pdev->dev, power_data->vreg_config, power_data->num_vreg, 0); Loading
drivers/video/msm/mdss/mdss_mdp.c +52 −5 Original line number Diff line number Diff line Loading @@ -117,6 +117,7 @@ struct mdss_hw mdss_misc_hw = { .irq_handler = NULL, }; #ifdef CONFIG_MSM_BUS_SCALING #define MDP_REG_BUS_VECTOR_ENTRY(ab_val, ib_val) \ { \ .src = MSM_BUS_MASTER_AMPSS_M0, \ Loading @@ -143,6 +144,7 @@ static struct msm_bus_scale_pdata mdp_reg_bus_scale_table = { .name = "mdss_reg", .active_only = true, }; #endif u32 invalid_mdp107_wb_output_fmts[] = { MDP_XRGB_8888, Loading Loading @@ -294,6 +296,7 @@ static irqreturn_t mdss_irq_handler(int irq, void *ptr) return IRQ_HANDLED; } #ifdef CONFIG_MSM_BUS_SCALING static int mdss_mdp_bus_scale_register(struct mdss_data_type *mdata) { struct msm_bus_scale_pdata *reg_bus_pdata; Loading Loading @@ -571,6 +574,42 @@ int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota) return rc; } #else static int mdss_mdp_bus_scale_register(struct mdss_data_type *mdata) { return 0; } static void mdss_mdp_bus_scale_unregister(struct mdss_data_type *mdata) { } int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota) { pr_debug("No bus scaling! client=%d ab=%llu ib=%llu\n", client, ab_quota, ib_quota); return 0; } struct reg_bus_client *mdss_reg_bus_vote_client_create(char *client_name) { return NULL; } void mdss_reg_bus_vote_client_destroy(struct reg_bus_client *client) { } int mdss_update_reg_bus_vote(struct reg_bus_client *bus_client, u32 usecase_ndx) { pr_debug("%pS: No reg scaling! usecase=%u\n", __builtin_return_address(0), usecase_ndx); return 0; } #endif static inline u32 mdss_mdp_irq_mask(u32 intr_type, u32 intf_num) { Loading Loading @@ -1271,7 +1310,7 @@ static int mdss_mdp_irq_clk_setup(struct mdss_data_type *mdata) } mdata->reg_bus_clt = mdss_reg_bus_vote_client_create("mdp\0"); if (IS_ERR_OR_NULL(mdata->reg_bus_clt)) { if (IS_ERR(mdata->reg_bus_clt)) { pr_err("bus client register failed\n"); return PTR_ERR(mdata->reg_bus_clt); } Loading Loading @@ -1831,11 +1870,11 @@ static int mdss_mdp_get_cmdline_config(struct platform_device *pdev) rc = mdss_mdp_parse_dt_pan_intf(pdev); /* if pref pan intf is not present */ if (rc) pr_err("unable to parse device tree for pan intf\n"); else pr_warn("unable to parse device tree for pan intf\n"); pan_cfg->init_done = true; return rc; return 0; } static void __update_sspp_info(struct mdss_mdp_pipe *pipe, Loading Loading @@ -3898,6 +3937,7 @@ static int mdss_mdp_parse_dt_ppb_off(struct platform_device *pdev) return -EINVAL; } #ifdef CONFIG_MSM_BUS_SCALING static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev) { int rc, paths; Loading Loading @@ -3956,6 +3996,13 @@ static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev) return rc; } #else static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev) { return 0; } #endif static int mdss_mdp_parse_dt_handler(struct platform_device *pdev, char *prop_name, u32 *offsets, int len) Loading
drivers/video/msm/mdss/mdss_mdp.h +59 −1 Original line number Diff line number Diff line Loading @@ -113,13 +113,71 @@ enum mdss_mdp_mixer_mux { }; enum mdss_mdp_pipe_type { MDSS_MDP_PIPE_TYPE_UNUSED, MDSS_MDP_PIPE_TYPE_INVALID, MDSS_MDP_PIPE_TYPE_VIG, MDSS_MDP_PIPE_TYPE_RGB, MDSS_MDP_PIPE_TYPE_DMA, MDSS_MDP_PIPE_TYPE_CURSOR, }; static inline enum mdss_mdp_sspp_index get_pipe_num_from_ndx(u32 ndx) { u32 id; if (unlikely(!ndx)) return MDSS_MDP_MAX_SSPP; id = fls(ndx) - 1; if (unlikely(ndx ^ BIT(id))) return MDSS_MDP_MAX_SSPP; return id; } static inline enum mdss_mdp_pipe_type get_pipe_type_from_num(enum mdss_mdp_sspp_index pnum) { enum mdss_mdp_pipe_type ptype; switch (pnum) { case MDSS_MDP_SSPP_VIG0: case MDSS_MDP_SSPP_VIG1: case MDSS_MDP_SSPP_VIG2: case MDSS_MDP_SSPP_VIG3: ptype = MDSS_MDP_PIPE_TYPE_VIG; break; case MDSS_MDP_SSPP_RGB0: case MDSS_MDP_SSPP_RGB1: case MDSS_MDP_SSPP_RGB2: case MDSS_MDP_SSPP_RGB3: ptype = MDSS_MDP_PIPE_TYPE_RGB; break; case MDSS_MDP_SSPP_DMA0: case MDSS_MDP_SSPP_DMA1: ptype = MDSS_MDP_PIPE_TYPE_DMA; break; case MDSS_MDP_SSPP_CURSOR0: case MDSS_MDP_SSPP_CURSOR1: ptype = MDSS_MDP_PIPE_TYPE_CURSOR; break; default: ptype = MDSS_MDP_PIPE_TYPE_INVALID; break; } return ptype; } static inline enum mdss_mdp_pipe_type get_pipe_type_from_ndx(u32 ndx) { enum mdss_mdp_sspp_index pnum; pnum = get_pipe_num_from_ndx(ndx); return get_pipe_type_from_num(pnum); } enum mdss_mdp_block_type { MDSS_MDP_BLOCK_UNUSED, MDSS_MDP_BLOCK_SSPP, Loading
drivers/video/msm/mdss/mdss_mdp_ctl.c +33 −21 Original line number Diff line number Diff line Loading @@ -4630,17 +4630,12 @@ int mdss_mdp_mixer_pipe_update(struct mdss_mdp_pipe *pipe, j = i * MAX_PIPES_PER_STAGE; /* * 1. If pipe is on the right side of the blending * stage, on either left LM or right LM but it is not * crossing LM boundry then right_blend ndx is used. * 2. If pipe is on the right side of the blending * stage on left LM and it is crossing LM boundry * then for left LM it is placed into right_blend * index but for right LM it still placed into * left_blend index. * this could lead to cases where left blend index is * not populated. For instance, where pipe is spanning * across layer mixers. But this is handled properly * within mixer programming code. */ if (pipe->is_right_blend && (!pipe->src_split_req || (pipe->src_split_req && !mixer->is_right_mixer))) if (pipe->is_right_blend) j++; /* First clear all blend containers for current stage */ Loading Loading @@ -4694,27 +4689,44 @@ void mdss_mdp_mixer_unstage_all(struct mdss_mdp_mixer *mixer) int mdss_mdp_mixer_pipe_unstage(struct mdss_mdp_pipe *pipe, struct mdss_mdp_mixer *mixer) { int index; u8 right_blend_index; int i, right_blend; if (!pipe) return -EINVAL; if (!mixer) return -EINVAL; right_blend_index = pipe->is_right_blend && !(pipe->src_split_req && mixer->is_right_mixer); index = (pipe->mixer_stage * MAX_PIPES_PER_STAGE) + right_blend_index; if (index < MAX_PIPES_PER_LM && pipe == mixer->stage_pipe[index]) { right_blend = pipe->is_right_blend ? 1 : 0; i = (pipe->mixer_stage * MAX_PIPES_PER_STAGE) + right_blend; if ((i < MAX_PIPES_PER_LM) && (pipe == mixer->stage_pipe[i])) { pr_debug("unstage p%d from %s side of stage=%d lm=%d ndx=%d\n", pipe->num, pipe->is_right_blend ? "right" : "left", pipe->mixer_stage, mixer->num, index); pipe->num, right_blend ? "right" : "left", pipe->mixer_stage, mixer->num, i); } else { int stage; mixer->params_changed++; mixer->stage_pipe[index] = NULL; for (i = 0; i < MAX_PIPES_PER_LM; i++) { if (pipe != mixer->stage_pipe[i]) continue; stage = i / MAX_PIPES_PER_STAGE; right_blend = i & 1; pr_warn("lm=%d pipe #%d stage=%d with %s blend, unstaged from %s side of stage=%d!\n", mixer->num, pipe->num, pipe->mixer_stage, pipe->is_right_blend ? "right" : "left", right_blend ? "right" : "left", stage); break; } /* pipe not found, not a failure */ if (i == MAX_PIPES_PER_LM) return 0; } mixer->params_changed++; mixer->stage_pipe[i] = NULL; return 0; } Loading