Loading drivers/video/msm/mdss/mdss.h +4 −2 Original line number Diff line number Diff line Loading @@ -242,7 +242,8 @@ struct mdss_data_type { u32 latency_buff_per; atomic_t active_intf_cnt; u64 ab[MDSS_MAX_HW_BLK]; u64 ab_rt[MDSS_MAX_HW_BLK]; u64 ab_nrt[MDSS_MAX_HW_BLK]; u64 ib[MDSS_MAX_HW_BLK]; }; extern struct mdss_data_type *mdss_res; Loading @@ -259,7 +260,8 @@ void mdss_disable_irq(struct mdss_hw *hw); void mdss_disable_irq_nosync(struct mdss_hw *hw); void mdss_bus_bandwidth_ctrl(int enable); int mdss_iommu_ctrl(int enable); int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota); int mdss_bus_scale_set_quota(int client, u64 ab_quota_rt, u64 ab_quota_nrt, u64 ib_quota); static inline struct ion_client *mdss_get_ionclient(void) { Loading drivers/video/msm/mdss/mdss_dsi_host.c +2 −2 Original line number Diff line number Diff line Loading @@ -1351,7 +1351,7 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) * also, axi bus bandwidth need since dsi controller will * fetch dcs commands from axi bus */ mdss_bus_scale_set_quota(MDSS_HW_DSI0, SZ_1M, SZ_1M); mdss_bus_scale_set_quota(MDSS_HW_DSI0, SZ_1M, 0, 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); Loading @@ -1368,7 +1368,7 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) ret = mdss_dsi_cmdlist_tx(ctrl, req); mdss_iommu_ctrl(0); mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 0); mdss_bus_scale_set_quota(MDSS_HW_DSI0, 0, 0); mdss_bus_scale_set_quota(MDSS_HW_DSI0, 0, 0, 0); need_lock: MDSS_XLOG(ctrl->ndx, from_mdp, ctrl->mdp_busy, current->pid, Loading drivers/video/msm/mdss/mdss_mdp.c +25 −13 Original line number Diff line number Diff line Loading @@ -424,7 +424,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, IB_QUOTA); return mdss_bus_scale_set_quota(MDSS_HW_MDP, AB_QUOTA, 0, IB_QUOTA); } static void mdss_mdp_bus_scale_unregister(struct mdss_data_type *mdata) Loading @@ -442,16 +442,18 @@ static void mdss_mdp_bus_scale_unregister(struct mdss_data_type *mdata) } } int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota) int mdss_mdp_bus_scale_set_quota(u64 ab_quota_rt, u64 ab_quota_nrt, u64 ib_quota) { int new_uc_idx; u64 ab_quota[2]; if (mdss_res->bus_hdl < 1) { pr_err("invalid bus handle %d\n", mdss_res->bus_hdl); return -EINVAL; } if ((ab_quota | ib_quota) == 0) { if (((ab_quota_rt + ab_quota_nrt) || ib_quota) == 0) { new_uc_idx = 0; } else { int i; Loading @@ -466,8 +468,15 @@ int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota) } size = SZ_64M / mdss_res->axi_port_cnt; ab_quota = div_u64(ab_quota, mdss_res->axi_port_cnt); 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; } else { ab_quota[0] = div_u64(ab_quota_rt + ab_quota_nrt, mdss_res->axi_port_cnt); ab_quota[1] = ab_quota[0]; } new_uc_idx = (mdss_res->curr_bw_uc_idx % (bw_table->num_usecases - 1)) + 1; Loading @@ -477,14 +486,14 @@ int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota) vectors[i]; /* avoid performing updates for small changes */ if ((ALIGN(ab_quota, size) == ALIGN(vect->ab, size)) && (ALIGN(ib_quota, size) == ALIGN(vect->ib, size))) { 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; } vect = &bw_table->usecase[new_uc_idx].vectors[i]; vect->ab = ab_quota; vect->ab = ab_quota[i]; vect->ib = ib_quota; pr_debug("uc_idx=%d path_idx=%d ab=%llu ib=%llu\n", Loading @@ -497,23 +506,26 @@ int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota) new_uc_idx); } int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota) int mdss_bus_scale_set_quota(int client, u64 ab_quota_rt, u64 ab_quota_nrt, u64 ib_quota) { int rc = 0; int i; u64 total_ab = 0; u64 total_ab_rt = 0, total_ab_nrt = 0; u64 total_ib = 0; mutex_lock(&bus_bw_lock); mdss_res->ab[client] = ab_quota; mdss_res->ab_rt[client] = ab_quota_rt; mdss_res->ab_nrt[client] = ab_quota_nrt; mdss_res->ib[client] = ib_quota; for (i = 0; i < MDSS_MAX_HW_BLK; i++) { total_ab += mdss_res->ab[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]); } rc = mdss_mdp_bus_scale_set_quota(total_ab, total_ib); rc = mdss_mdp_bus_scale_set_quota(total_ab_rt, total_ab_nrt, total_ib); mutex_unlock(&bus_bw_lock); Loading drivers/video/msm/mdss/mdss_mdp.h +2 −1 Original line number Diff line number Diff line Loading @@ -670,7 +670,8 @@ 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, u64 ib_quota); 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); Loading drivers/video/msm/mdss/mdss_mdp_ctl.c +22 −8 Original line number Diff line number Diff line Loading @@ -1083,13 +1083,14 @@ 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) { u64 bw_sum_of_intfs = 0; u64 bus_ab_quota, bus_ib_quota; 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; int i; 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 (ctl->power_on) { /* Loading @@ -1099,18 +1100,31 @@ static inline void mdss_mdp_ctl_perf_update_bus(struct mdss_data_type *mdata, if (ctl->traffic_shaper_enabled) mdss_mdp_ctl_perf_update_traffic_shaper_bw (ctl, mdp_clk); bw_sum_of_intfs += ctl->cur_perf.bw_ctl; 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; pr_debug("ctl_num=%d bw=%llu\n", ctl->num, ctl->cur_perf.bw_ctl); } } bus_ib_quota = max(bw_sum_of_intfs, mdata->perf_tune.min_bus_vote); bus_ab_quota = apply_fudge_factor(bus_ib_quota, 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; 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, &mdss_res->ab_factor); trace_mdp_perf_update_bus(bus_ab_quota, bus_ib_quota); trace_mdp_perf_update_bus(bus_ab_quota_rt, bus_ab_quota_nrt , bus_ib_quota); ATRACE_INT("bus_quota", bus_ib_quota); mdss_bus_scale_set_quota(MDSS_HW_MDP, bus_ab_quota, bus_ib_quota); pr_debug("ab=%llu ib=%llu\n", bus_ab_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); ATRACE_END(__func__); } Loading Loading
drivers/video/msm/mdss/mdss.h +4 −2 Original line number Diff line number Diff line Loading @@ -242,7 +242,8 @@ struct mdss_data_type { u32 latency_buff_per; atomic_t active_intf_cnt; u64 ab[MDSS_MAX_HW_BLK]; u64 ab_rt[MDSS_MAX_HW_BLK]; u64 ab_nrt[MDSS_MAX_HW_BLK]; u64 ib[MDSS_MAX_HW_BLK]; }; extern struct mdss_data_type *mdss_res; Loading @@ -259,7 +260,8 @@ void mdss_disable_irq(struct mdss_hw *hw); void mdss_disable_irq_nosync(struct mdss_hw *hw); void mdss_bus_bandwidth_ctrl(int enable); int mdss_iommu_ctrl(int enable); int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota); int mdss_bus_scale_set_quota(int client, u64 ab_quota_rt, u64 ab_quota_nrt, u64 ib_quota); static inline struct ion_client *mdss_get_ionclient(void) { Loading
drivers/video/msm/mdss/mdss_dsi_host.c +2 −2 Original line number Diff line number Diff line Loading @@ -1351,7 +1351,7 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) * also, axi bus bandwidth need since dsi controller will * fetch dcs commands from axi bus */ mdss_bus_scale_set_quota(MDSS_HW_DSI0, SZ_1M, SZ_1M); mdss_bus_scale_set_quota(MDSS_HW_DSI0, SZ_1M, 0, 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); Loading @@ -1368,7 +1368,7 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) ret = mdss_dsi_cmdlist_tx(ctrl, req); mdss_iommu_ctrl(0); mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 0); mdss_bus_scale_set_quota(MDSS_HW_DSI0, 0, 0); mdss_bus_scale_set_quota(MDSS_HW_DSI0, 0, 0, 0); need_lock: MDSS_XLOG(ctrl->ndx, from_mdp, ctrl->mdp_busy, current->pid, Loading
drivers/video/msm/mdss/mdss_mdp.c +25 −13 Original line number Diff line number Diff line Loading @@ -424,7 +424,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, IB_QUOTA); return mdss_bus_scale_set_quota(MDSS_HW_MDP, AB_QUOTA, 0, IB_QUOTA); } static void mdss_mdp_bus_scale_unregister(struct mdss_data_type *mdata) Loading @@ -442,16 +442,18 @@ static void mdss_mdp_bus_scale_unregister(struct mdss_data_type *mdata) } } int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota) int mdss_mdp_bus_scale_set_quota(u64 ab_quota_rt, u64 ab_quota_nrt, u64 ib_quota) { int new_uc_idx; u64 ab_quota[2]; if (mdss_res->bus_hdl < 1) { pr_err("invalid bus handle %d\n", mdss_res->bus_hdl); return -EINVAL; } if ((ab_quota | ib_quota) == 0) { if (((ab_quota_rt + ab_quota_nrt) || ib_quota) == 0) { new_uc_idx = 0; } else { int i; Loading @@ -466,8 +468,15 @@ int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota) } size = SZ_64M / mdss_res->axi_port_cnt; ab_quota = div_u64(ab_quota, mdss_res->axi_port_cnt); 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; } else { ab_quota[0] = div_u64(ab_quota_rt + ab_quota_nrt, mdss_res->axi_port_cnt); ab_quota[1] = ab_quota[0]; } new_uc_idx = (mdss_res->curr_bw_uc_idx % (bw_table->num_usecases - 1)) + 1; Loading @@ -477,14 +486,14 @@ int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota) vectors[i]; /* avoid performing updates for small changes */ if ((ALIGN(ab_quota, size) == ALIGN(vect->ab, size)) && (ALIGN(ib_quota, size) == ALIGN(vect->ib, size))) { 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; } vect = &bw_table->usecase[new_uc_idx].vectors[i]; vect->ab = ab_quota; vect->ab = ab_quota[i]; vect->ib = ib_quota; pr_debug("uc_idx=%d path_idx=%d ab=%llu ib=%llu\n", Loading @@ -497,23 +506,26 @@ int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota) new_uc_idx); } int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota) int mdss_bus_scale_set_quota(int client, u64 ab_quota_rt, u64 ab_quota_nrt, u64 ib_quota) { int rc = 0; int i; u64 total_ab = 0; u64 total_ab_rt = 0, total_ab_nrt = 0; u64 total_ib = 0; mutex_lock(&bus_bw_lock); mdss_res->ab[client] = ab_quota; mdss_res->ab_rt[client] = ab_quota_rt; mdss_res->ab_nrt[client] = ab_quota_nrt; mdss_res->ib[client] = ib_quota; for (i = 0; i < MDSS_MAX_HW_BLK; i++) { total_ab += mdss_res->ab[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]); } rc = mdss_mdp_bus_scale_set_quota(total_ab, total_ib); rc = mdss_mdp_bus_scale_set_quota(total_ab_rt, total_ab_nrt, total_ib); mutex_unlock(&bus_bw_lock); Loading
drivers/video/msm/mdss/mdss_mdp.h +2 −1 Original line number Diff line number Diff line Loading @@ -670,7 +670,8 @@ 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, u64 ib_quota); 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); Loading
drivers/video/msm/mdss/mdss_mdp_ctl.c +22 −8 Original line number Diff line number Diff line Loading @@ -1083,13 +1083,14 @@ 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) { u64 bw_sum_of_intfs = 0; u64 bus_ab_quota, bus_ib_quota; 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; int i; 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 (ctl->power_on) { /* Loading @@ -1099,18 +1100,31 @@ static inline void mdss_mdp_ctl_perf_update_bus(struct mdss_data_type *mdata, if (ctl->traffic_shaper_enabled) mdss_mdp_ctl_perf_update_traffic_shaper_bw (ctl, mdp_clk); bw_sum_of_intfs += ctl->cur_perf.bw_ctl; 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; pr_debug("ctl_num=%d bw=%llu\n", ctl->num, ctl->cur_perf.bw_ctl); } } bus_ib_quota = max(bw_sum_of_intfs, mdata->perf_tune.min_bus_vote); bus_ab_quota = apply_fudge_factor(bus_ib_quota, 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; 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, &mdss_res->ab_factor); trace_mdp_perf_update_bus(bus_ab_quota, bus_ib_quota); trace_mdp_perf_update_bus(bus_ab_quota_rt, bus_ab_quota_nrt , bus_ib_quota); ATRACE_INT("bus_quota", bus_ib_quota); mdss_bus_scale_set_quota(MDSS_HW_MDP, bus_ab_quota, bus_ib_quota); pr_debug("ab=%llu ib=%llu\n", bus_ab_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); ATRACE_END(__func__); } Loading