diff options
| author | Dhaval Patel <pdhaval@codeaurora.org> | 2014-09-05 14:56:10 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:35:24 -0700 |
| commit | 2eae06948f4d3989ea4c7062fdccca014bd6eecb (patch) | |
| tree | f48a56b1d5848bfdd069bab37e3b61293895bc23 /drivers/video/fbdev | |
| parent | 50290a21e510dd3ff0c0d60ee757c306fee81e19 (diff) | |
msm: mdss: request ab/ib quota based on rt and nrt client
Non-RealTime(NRT) memory fetch should use NRT AXI
ports while RT usecase memory fetch should go through
RT AXI ports. Number of RT and NRT AXI ports can be
different from chipset to chipset. MDSS driver hardcodes
them to "2" for all usecases which won't apply for
all MDP cores Ex: MDPv17. This change removes AXI ports
hard coding and updates ab/ib request based on AXI
ports availability for respective chipset. It uses
uniform calculation method for ib/ab quota request on
RT and NRT AXI ports to reduce the driver complexity
and clean interface.
Change-Id: I015c5c8a64bdf62f5747fcbcf19ba00cd29e21b5
Signed-off-by: Dhaval Patel <pdhaval@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
| -rw-r--r-- | drivers/video/fbdev/msm/mdp3.c | 12 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdp3.h | 3 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdp3_ctrl.c | 4 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdp3_ppp.c | 4 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss.h | 19 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_dsi_host.c | 5 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.c | 113 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 8 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_ctl.c | 51 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_trace.h | 26 |
10 files changed, 136 insertions, 109 deletions
diff --git a/drivers/video/fbdev/msm/mdp3.c b/drivers/video/fbdev/msm/mdp3.c index b3b7a0d44bdd..79416909e89a 100644 --- a/drivers/video/fbdev/msm/mdp3.c +++ b/drivers/video/fbdev/msm/mdp3.c @@ -346,8 +346,7 @@ static void mdp3_bus_scale_unregister(void) } } -int mdp3_bus_scale_set_quota(int client, u64 ab_quota, u64 ab_quota_nrt, - u64 ib_quota) +int mdp3_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota) { struct mdp3_bus_handle_map *bus_handle; int cur_bus_idx; @@ -366,9 +365,6 @@ int mdp3_bus_scale_set_quota(int client, u64 ab_quota, u64 ab_quota_nrt, return -EINVAL; } - if (ab_quota_nrt != 0) - pr_err("Ignoring non zero NRT bus voting on mdp3\n"); - bus_handle->ab[client] = ab_quota; bus_handle->ib[client] = ib_quota; @@ -633,9 +629,9 @@ void mdp3_bus_bw_iommu_enable(int enable, int client) ab += bus_handle->restore_ab[i]; ib += bus_handle->restore_ib[i]; } - mdp3_bus_scale_set_quota(client, ab, 0, ib); + mdp3_bus_scale_set_quota(client, ab, ib); } else if (!enable && ref_cnt == 0) { - mdp3_bus_scale_set_quota(client, 0, 0, 0); + mdp3_bus_scale_set_quota(client, 0, 0); mdp3_iommu_disable(); } else if (ref_cnt < 0) { pr_err("Ref count < 0, bus client=%d, ref_cnt=%d", @@ -1648,7 +1644,7 @@ static int mdp3_continuous_splash_on(struct mdss_panel_data *pdata) ab = panel_info->xres * panel_info->yres * 4; ab *= panel_info->mipi.frame_rate; ib = (ab * 3) / 2; - rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_DMA_P, ab, 0, ib); + rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_DMA_P, ab, ib); bus_handle->restore_ab[MDP3_CLIENT_DMA_P] = ab; bus_handle->restore_ib[MDP3_CLIENT_DMA_P] = ib; diff --git a/drivers/video/fbdev/msm/mdp3.h b/drivers/video/fbdev/msm/mdp3.h index 69d32ddaca08..1d7526b7c895 100644 --- a/drivers/video/fbdev/msm/mdp3.h +++ b/drivers/video/fbdev/msm/mdp3.h @@ -176,8 +176,7 @@ void mdp3_irq_deregister(void); int mdp3_clk_set_rate(int clk_type, unsigned long clk_rate, int client); int mdp3_clk_enable(int enable, int dsi_clk); int mdp3_res_update(int enable, int dsi_clk, int client); -int mdp3_bus_scale_set_quota(int client, u64 ab_quota, u64 ab_quota_nrt, - u64 ib_quota); +int mdp3_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota); int mdp3_put_img(struct mdp3_img_data *data); int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data); int mdp3_iommu_enable(void); diff --git a/drivers/video/fbdev/msm/mdp3_ctrl.c b/drivers/video/fbdev/msm/mdp3_ctrl.c index 2c54952c43f1..d0606578a72f 100644 --- a/drivers/video/fbdev/msm/mdp3_ctrl.c +++ b/drivers/video/fbdev/msm/mdp3_ctrl.c @@ -355,9 +355,9 @@ static int mdp3_ctrl_res_req_bus(struct msm_fb_data_type *mfd, int status) ab = panel_info->xres * panel_info->yres * 4 * 2; ab *= panel_info->mipi.frame_rate; ib = (ab * 3) / 2; - rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_DMA_P, ab, 0, ib); + rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_DMA_P, ab, ib); } else { - rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_DMA_P, 0, 0, 0); + rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_DMA_P, 0, 0); } return rc; } diff --git a/drivers/video/fbdev/msm/mdp3_ppp.c b/drivers/video/fbdev/msm/mdp3_ppp.c index 5fad4970e688..e8135b5fda80 100644 --- a/drivers/video/fbdev/msm/mdp3_ppp.c +++ b/drivers/video/fbdev/msm/mdp3_ppp.c @@ -349,7 +349,7 @@ int mdp3_ppp_vote_update(struct msm_fb_data_type *mfd) ab = ib / 2; else ab = req_bw; - rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_PPP, ab, 0, ib); + rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_PPP, ab, ib); if (rc < 0) { pr_err("%s: scale_set_quota failed\n", __func__); return rc; @@ -383,7 +383,7 @@ int mdp3_ppp_turnon(struct msm_fb_data_type *mfd, int on_off) pr_err("%s: mdp3_clk_enable failed\n", __func__); return rc; } - rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_PPP, ab, 0, ib); + rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_PPP, ab, ib); if (rc < 0) { mdp3_res_update(!on_off, 0, MDP3_CLIENT_PPP); pr_err("%s: scale_set_quota failed\n", __func__); diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h index a895d6a9c159..07f3e86522c6 100644 --- a/drivers/video/fbdev/msm/mdss.h +++ b/drivers/video/fbdev/msm/mdss.h @@ -107,6 +107,13 @@ enum mdss_hw_index { MDSS_MAX_HW_BLK }; +enum mdss_bus_clients { + MDSS_MDP_RT, + MDSS_DSI_RT, + MDSS_MDP_NRT, + MDSS_MAX_BUS_CLIENTS +}; + struct mdss_pp_block_off { u32 sspp_igc_lut_off; u32 vig_pcc_off; @@ -172,6 +179,7 @@ struct mdss_data_type { u32 rot_block_size; u32 axi_port_cnt; + u32 nrt_axi_port_cnt; u32 bus_channels; u32 curr_bw_uc_idx; u32 bus_hdl; @@ -256,9 +264,8 @@ struct mdss_data_type { atomic_t active_intf_cnt; bool has_rot_dwnscale; - u64 ab_rt[MDSS_MAX_HW_BLK]; - u64 ab_nrt[MDSS_MAX_HW_BLK]; - u64 ib[MDSS_MAX_HW_BLK]; + u64 ab[MDSS_MAX_BUS_CLIENTS]; + u64 ib[MDSS_MAX_BUS_CLIENTS]; struct mdss_pp_block_off pp_block_off; }; extern struct mdss_data_type *mdss_res; @@ -280,8 +287,7 @@ struct mdss_hw { struct irq_info *mdss_intr_line(void); void mdss_bus_bandwidth_ctrl(int enable); int mdss_iommu_ctrl(int enable); -int mdss_bus_scale_set_quota(int client, u64 ab_quota_rt, u64 ab_quota_nrt, - u64 ib_quota); +int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota); struct mdss_util_intf { bool mdp_probe_done; @@ -293,8 +299,7 @@ struct mdss_util_intf { int (*iommu_attached)(void); int (*iommu_ctrl)(int enable); void (*bus_bandwidth_ctrl)(int enable); - int (*bus_scale_set_quota)(int client, u64 ab_quota, - u64 ab_quote_nrt, u64 ib_quota); + int (*bus_scale_set_quota)(int client, u64 ab_quota, u64 ib_quota); }; struct mdss_util_intf *mdss_get_util_intf(void); diff --git a/drivers/video/fbdev/msm/mdss_dsi_host.c b/drivers/video/fbdev/msm/mdss_dsi_host.c index 16e78a9f2fea..ec7c7f397ae6 100644 --- a/drivers/video/fbdev/msm/mdss_dsi_host.c +++ b/drivers/video/fbdev/msm/mdss_dsi_host.c @@ -1834,8 +1834,7 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) ctrl->mdss_util->bus_bandwidth_ctrl(1); if (ctrl->mdss_util->bus_scale_set_quota) - ctrl->mdss_util->bus_scale_set_quota(MDSS_HW_DSI0, - SZ_1M, 0, SZ_1M); + ctrl->mdss_util->bus_scale_set_quota(MDSS_DSI_RT, SZ_1M, SZ_1M); pr_debug("%s: from_mdp=%d pid=%d\n", __func__, from_mdp, current->pid); mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 1); @@ -1865,7 +1864,7 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 0); if (ctrl->mdss_util->bus_scale_set_quota) - ctrl->mdss_util->bus_scale_set_quota(MDSS_HW_DSI0, 0, 0, 0); + ctrl->mdss_util->bus_scale_set_quota(MDSS_DSI_RT, 0, 0); if (ctrl->mdss_util->bus_bandwidth_ctrl) ctrl->mdss_util->bus_bandwidth_ctrl(0); need_lock: diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c index 4075014f6d53..513b8c1b88c1 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.c +++ b/drivers/video/fbdev/msm/mdss_mdp.c @@ -82,6 +82,8 @@ struct msm_mdp_interface mdp5 = { #define IB_QUOTA 2000000000 #define AB_QUOTA 2000000000 +#define MAX_AXI_PORT_COUNT 3 + #define MEM_PROTECT_SD_CTRL 0xF #define MEM_PROTECT_SD_CTRL_FLAT 0x14 @@ -295,7 +297,7 @@ static int mdss_mdp_bus_scale_register(struct mdss_data_type *mdata) mdata->reg_bus_hdl); } - return mdss_bus_scale_set_quota(MDSS_HW_MDP, AB_QUOTA, 0, IB_QUOTA); + return mdss_bus_scale_set_quota(MDSS_MDP_RT, AB_QUOTA, IB_QUOTA); } static void mdss_mdp_bus_scale_unregister(struct mdss_data_type *mdata) @@ -313,66 +315,78 @@ static void mdss_mdp_bus_scale_unregister(struct mdss_data_type *mdata) } } -int mdss_mdp_bus_scale_set_quota(u64 ab_quota_rt, u64 ab_quota_nrt, - u64 ib_quota) +static int mdss_mdp_bus_scale_set_quota(u64 ab_quota_rt, u64 ab_quota_nrt, + u64 ib_quota_rt, u64 ib_quota_nrt) { int new_uc_idx; - u64 ab_quota[2]; + u64 ab_quota[MAX_AXI_PORT_COUNT] = {0, 0}; + u64 ib_quota[MAX_AXI_PORT_COUNT] = {0, 0}; if (mdss_res->bus_hdl < 1) { pr_err("invalid bus handle %d\n", mdss_res->bus_hdl); return -EINVAL; } - if (((ab_quota_rt + ab_quota_nrt) || ib_quota) == 0) { + if (!ab_quota_rt && !ab_quota_nrt && !ib_quota_rt && !ib_quota_nrt) { new_uc_idx = 0; } else { int i; struct msm_bus_vectors *vect = NULL; struct msm_bus_scale_pdata *bw_table = mdss_res->bus_scale_table; - unsigned long size; + u32 nrt_axi_port_cnt = mdss_res->nrt_axi_port_cnt; + u32 total_axi_port_cnt = mdss_res->axi_port_cnt; + u32 rt_axi_port_cnt = total_axi_port_cnt - nrt_axi_port_cnt; - if (!bw_table || !mdss_res->axi_port_cnt) { + if (!bw_table || !total_axi_port_cnt || + total_axi_port_cnt > MAX_AXI_PORT_COUNT) { pr_err("invalid input\n"); return -EINVAL; } - size = SZ_64M / mdss_res->axi_port_cnt; + if (mdss_res->bus_channels) { + ib_quota_rt = div_u64(ib_quota_rt, + mdss_res->bus_channels); + ib_quota_nrt = div_u64(ib_quota_nrt, + mdss_res->bus_channels); + } + if (mdss_res->has_fixed_qos_arbiter_enabled && - mdss_res->axi_port_cnt > 1) { - ab_quota[0] = ab_quota_rt; - ab_quota[1] = ab_quota_nrt; + rt_axi_port_cnt && nrt_axi_port_cnt) { + ab_quota_rt = div_u64(ab_quota_rt, rt_axi_port_cnt); + ab_quota_nrt = div_u64(ab_quota_nrt, nrt_axi_port_cnt); + + for (i = 0; i < total_axi_port_cnt; i++) { + if (i < rt_axi_port_cnt) { + ab_quota[i] = ab_quota_rt; + ib_quota[i] = ib_quota_rt; + } else { + ab_quota[i] = ab_quota_nrt; + ib_quota[i] = ib_quota_nrt; + } + } } else { ab_quota[0] = div_u64(ab_quota_rt + ab_quota_nrt, - mdss_res->axi_port_cnt); - ab_quota[1] = ab_quota[0]; + total_axi_port_cnt); + ib_quota[0] = ib_quota_rt + ib_quota_nrt; + + for (i = 1; i < total_axi_port_cnt; i++) { + ab_quota[i] = ab_quota[0]; + ib_quota[i] = ib_quota[0]; + } } new_uc_idx = (mdss_res->curr_bw_uc_idx % (bw_table->num_usecases - 1)) + 1; - if (mdss_res->bus_channels > 0) - ib_quota = div_u64(ib_quota, mdss_res->bus_channels); - - for (i = 0; i < mdss_res->axi_port_cnt; i++) { - vect = &bw_table->usecase[mdss_res->curr_bw_uc_idx]. - vectors[i]; - - /* avoid performing updates for small changes */ - if ((ALIGN(ab_quota[i], size) == ALIGN(vect->ab, size)) - && (ALIGN(ib_quota, size) == ALIGN(vect->ib, size))) { - pr_debug("skip bus scaling, no changes\n"); - return 0; - } - + for (i = 0; i < total_axi_port_cnt; i++) { vect = &bw_table->usecase[new_uc_idx].vectors[i]; vect->ab = ab_quota[i]; - vect->ib = ib_quota; + vect->ib = ib_quota[i]; - pr_debug("uc_idx=%d path_idx=%d ab=%llu ib=%llu ch=%d\n", - new_uc_idx, i, vect->ab, vect->ib, - mdss_res->bus_channels); + pr_debug("uc_idx=%d %s path idx=%d ab=%llu ib=%llu\n", + new_uc_idx, (i < rt_axi_port_cnt) ? "rt" : "nrt" + , i, vect->ab, vect->ib); } } mdss_res->curr_bw_uc_idx = new_uc_idx; @@ -381,26 +395,31 @@ int mdss_mdp_bus_scale_set_quota(u64 ab_quota_rt, u64 ab_quota_nrt, new_uc_idx); } -int mdss_bus_scale_set_quota(int client, u64 ab_quota_rt, u64 ab_quota_nrt, - u64 ib_quota) +int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota) { int rc = 0; int i; - u64 total_ab_rt = 0, total_ab_nrt = 0; - u64 total_ib = 0; + u64 total_ab_rt = 0, total_ib_rt = 0; + u64 total_ab_nrt = 0, total_ib_nrt = 0; mutex_lock(&bus_bw_lock); - mdss_res->ab_rt[client] = ab_quota_rt; - mdss_res->ab_nrt[client] = ab_quota_nrt; + mdss_res->ab[client] = ab_quota; mdss_res->ib[client] = ib_quota; - for (i = 0; i < MDSS_MAX_HW_BLK; i++) { - total_ab_rt += mdss_res->ab_rt[i]; - total_ab_nrt += mdss_res->ab_nrt[i]; - total_ib = max(total_ib, mdss_res->ib[i]); + trace_mdp_perf_update_bus(client, ab_quota, ib_quota); + + for (i = 0; i < MDSS_MAX_BUS_CLIENTS; i++) { + if (i == MDSS_MDP_NRT) { + total_ab_nrt = mdss_res->ab[i]; + total_ib_nrt = mdss_res->ib[i]; + } else { + total_ab_rt += mdss_res->ab[i]; + total_ib_rt = max(total_ib_rt, mdss_res->ib[i]); + } } - rc = mdss_mdp_bus_scale_set_quota(total_ab_rt, total_ab_nrt, total_ib); + rc = mdss_mdp_bus_scale_set_quota(total_ab_rt, total_ab_nrt, + total_ib_rt, total_ib_nrt); mutex_unlock(&bus_bw_lock); @@ -2738,6 +2757,16 @@ static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev) return rc; } + rc = of_property_read_u32(pdev->dev.of_node, + "qcom,mdss-num-nrt-paths", &mdata->nrt_axi_port_cnt); + if (rc && mdata->has_fixed_qos_arbiter_enabled) { + pr_err("Error. qcom,mdss-num-nrt-paths prop not found.rc=%d\n", + rc); + return rc; + } else { + rc = 0; + } + mdata->bus_scale_table = msm_bus_cl_get_pdata(pdev); if (IS_ERR_OR_NULL(mdata->bus_scale_table)) { rc = PTR_ERR(mdata->bus_scale_table); diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index 2ec029684b47..3299335ea09d 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -690,6 +690,12 @@ static inline bool mdss_mdp_is_nrt_vbif_client(struct mdss_data_type *mdata, pipe->mixer_left->rotator_mode; } +static inline bool mdss_mdp_is_nrt_ctl_path(struct mdss_mdp_ctl *ctl) +{ + return (ctl->intf_num == MDSS_MDP_NO_INTF) || + (ctl->mixer_left && ctl->mixer_left->rotator_mode); +} + static inline bool mdss_mdp_ctl_is_power_off(struct mdss_mdp_ctl *ctl) { return mdss_panel_is_power_off(ctl->power_state); @@ -747,8 +753,6 @@ int mdss_mdp_set_intr_callback(u32 intr_type, u32 intf_num, void mdss_mdp_footswitch_ctrl_splash(int on); void mdss_mdp_batfet_ctrl(struct mdss_data_type *mdata, int enable); -int mdss_mdp_bus_scale_set_quota(u64 ab_quota_rt, u64 ab_quota_nrt, - u64 ib_quota); void mdss_mdp_set_clk_rate(unsigned long min_clk_rate); unsigned long mdss_mdp_get_clk_rate(u32 clk_idx); int mdss_mdp_vsync_clk_enable(int enable); diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c index 92e62add3fc4..450f5ce49efd 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c +++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c @@ -1167,20 +1167,24 @@ static void mdss_mdp_ctl_perf_update_traffic_shaper_bw(struct mdss_mdp_ctl *ctl, } static inline void mdss_mdp_ctl_perf_update_bus(struct mdss_data_type *mdata, - u32 mdp_clk) + bool nrt_client, u32 mdp_clk) { - u64 bw_sum_of_intfs_rt = 0, bw_sum_of_intfs_nrt = 0; - u64 bus_ab_quota_rt, bus_ab_quota_nrt, bus_ib_quota; + u64 bw_sum_of_intfs = 0, bus_ab_quota, bus_ib_quota; + struct mdss_mdp_ctl *ctl; + struct mdss_mdp_mixer *mixer; int i; struct mdss_mdp_perf_params perf_temp; bitmap_zero(perf_temp.bw_vote_mode, MDSS_MDP_BW_MODE_MAX); ATRACE_BEGIN(__func__); for (i = 0; i < mdata->nctl; i++) { - struct mdss_mdp_ctl *ctl; - struct mdss_mdp_mixer *mixer; ctl = mdata->ctl_off + i; - if (mdss_mdp_ctl_is_power_on(ctl)) { + mixer = ctl->mixer_left; + if (mdss_mdp_ctl_is_power_on(ctl) && + /* RealTime clients */ + ((!nrt_client && !mdss_mdp_is_nrt_ctl_path(ctl)) || + /* Non-RealTime clients */ + (nrt_client && mdss_mdp_is_nrt_ctl_path(ctl)))) { /* * If traffic shaper is enabled we must check * if additional bandwidth is required. @@ -1195,22 +1199,17 @@ static inline void mdss_mdp_ctl_perf_update_bus(struct mdss_data_type *mdata, ctl->cur_perf.bw_vote_mode, MDSS_MDP_BW_MODE_MAX); - mixer = ctl->mixer_left; - if (ctl->intf_num == MDSS_MDP_NO_INTF || - mixer->rotator_mode) - bw_sum_of_intfs_nrt += ctl->cur_perf.bw_ctl; - else - bw_sum_of_intfs_rt += ctl->cur_perf.bw_ctl; + bw_sum_of_intfs += ctl->cur_perf.bw_ctl; pr_debug("ctl_num=%d bw=%llu mode=0x%lx\n", ctl->num, ctl->cur_perf.bw_ctl, *(ctl->cur_perf.bw_vote_mode)); } } - bw_sum_of_intfs_rt = max(bw_sum_of_intfs_rt, - mdata->perf_tune.min_bus_vote); - bus_ib_quota = bw_sum_of_intfs_rt + bw_sum_of_intfs_nrt; + bw_sum_of_intfs = max(bw_sum_of_intfs, mdata->perf_tune.min_bus_vote); + bus_ib_quota = bw_sum_of_intfs; + if (test_bit(MDSS_MDP_BW_MODE_SINGLE_LAYER, perf_temp.bw_vote_mode) && (bus_ib_quota >= PERF_SINGLE_PIPE_BW_FLOOR)) { @@ -1221,17 +1220,15 @@ static inline void mdss_mdp_ctl_perf_update_bus(struct mdss_data_type *mdata, &ib_factor_vscaling); } - bus_ab_quota_rt = apply_fudge_factor(bw_sum_of_intfs_rt, - &mdss_res->ab_factor); - bus_ab_quota_nrt = apply_fudge_factor(bw_sum_of_intfs_nrt, + bus_ab_quota = apply_fudge_factor(bw_sum_of_intfs, &mdss_res->ab_factor); - trace_mdp_perf_update_bus(bus_ab_quota_rt, bus_ab_quota_nrt, - bus_ib_quota, *(perf_temp.bw_vote_mode)); ATRACE_INT("bus_quota", bus_ib_quota); - mdss_bus_scale_set_quota(MDSS_HW_MDP, bus_ab_quota_rt, bus_ab_quota_nrt - , bus_ib_quota); - pr_debug("ab_rt=%llu ab_nrt=%llu ib=%llu\n", - bus_ab_quota_rt, bus_ab_quota_nrt, bus_ib_quota); + + mdss_bus_scale_set_quota(nrt_client ? MDSS_MDP_NRT : MDSS_MDP_RT, + bus_ab_quota, bus_ib_quota); + pr_debug("client:%s ab=%llu ib=%llu\n", nrt_client ? "nrt" : "rt", + bus_ab_quota, bus_ib_quota); + ATRACE_END(__func__); } @@ -1285,7 +1282,8 @@ void mdss_mdp_ctl_perf_release_bw(struct mdss_mdp_ctl *ctl) ctl_local->cur_perf.bw_ctl = 0; ctl_local->new_perf.bw_ctl = 0; pr_debug("Release BW ctl=%d\n", ctl_local->num); - mdss_mdp_ctl_perf_update_bus(mdata, 0); + mdss_mdp_ctl_perf_update_bus(mdata, + mdss_mdp_is_nrt_ctl_path(ctl), 0); } exit: mutex_unlock(&mdss_mdp_ctl_lock); @@ -1423,7 +1421,8 @@ static void mdss_mdp_ctl_perf_update(struct mdss_mdp_ctl *ctl, clk_rate = mdss_mdp_get_mdp_clk_rate(mdata); if (update_bus) - mdss_mdp_ctl_perf_update_bus(mdata, clk_rate); + mdss_mdp_ctl_perf_update_bus(mdata, + mdss_mdp_is_nrt_ctl_path(ctl), clk_rate); /* * Update the clock after bandwidth vote to ensure diff --git a/drivers/video/fbdev/msm/mdss_mdp_trace.h b/drivers/video/fbdev/msm/mdss_mdp_trace.h index 3ecbd6c245c8..1827746f613b 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_trace.h +++ b/drivers/video/fbdev/msm/mdss_mdp_trace.h @@ -204,27 +204,23 @@ TRACE_EVENT(mdp_video_underrun_done, ); TRACE_EVENT(mdp_perf_update_bus, - TP_PROTO(unsigned long long ab_quota_rt, - unsigned long long ab_quota_nrt, unsigned long long ib_quota, - unsigned long bw_vote_mode), - TP_ARGS(ab_quota_rt, ab_quota_nrt, ib_quota, bw_vote_mode), + TP_PROTO(int client, unsigned long long ab_quota, + unsigned long long ib_quota), + TP_ARGS(client, ab_quota, ib_quota), TP_STRUCT__entry( - __field(u64, ab_quota_rt) - __field(u64, ab_quota_nrt) + __field(int, client) + __field(u64, ab_quota) __field(u64, ib_quota) - __field(u32, bw_vote_mode) ), TP_fast_assign( - __entry->ab_quota_rt = ab_quota_rt; - __entry->ab_quota_nrt = ab_quota_nrt; + __entry->client = client; + __entry->ab_quota = ab_quota; __entry->ib_quota = ib_quota; - __entry->bw_vote_mode = bw_vote_mode; ), - TP_printk("ab_rt=%llu ab_nrt=%llu ib=%llu mode=%d", - __entry->ab_quota_rt, - __entry->ab_quota_nrt, - __entry->ib_quota, - __entry->bw_vote_mode) + TP_printk("Request client:%d ab=%llu ib=%llu", + __entry->client, + __entry->ab_quota, + __entry->ib_quota) ); TRACE_EVENT(mdp_cmd_pingpong_done, |
