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>
This commit is contained in:
parent
50290a21e5
commit
2eae06948f
11 changed files with 147 additions and 109 deletions
|
@ -169,6 +169,7 @@ Bus Scaling Data:
|
|||
src values allowed for MDSS are:
|
||||
22 = MSM_BUS_MASTER_MDP_PORT0
|
||||
23 = MSM_BUS_MASTER_MDP_PORT1
|
||||
25 = MSM_BUS_MASTER_ROTATOR
|
||||
dst values allowed for MDSS are:
|
||||
512 = MSM_BUS_SLAVE_EBI_CH0
|
||||
ab: Represents aggregated bandwidth.
|
||||
|
@ -180,6 +181,8 @@ Bus Scaling Data:
|
|||
ab and ib values defined here are random and
|
||||
bare no logic except for the use-case 0 where ab
|
||||
and ib values needs to be 0.
|
||||
* Define realtime vector properties followed by
|
||||
non-realtime vector properties.
|
||||
|
||||
- qcom,mdss-prefill-outstanding-buffer-bytes: The size of mdp outstanding buffer
|
||||
in bytes. The buffer is filled during prefill
|
||||
|
@ -259,6 +262,13 @@ Optional properties:
|
|||
increased performance by prioritizing the real time
|
||||
(rt) traffic over non real time (nrt) traffic to
|
||||
access the memory.
|
||||
- qcom,mdss-num-nrt-paths: Integer property represents the number of non-realtime
|
||||
paths in each Bus Scaling Usecase. This value depends on
|
||||
number of AXI ports are dedicated to non-realtime VBIF for
|
||||
particular chipset. This property is mandatory when
|
||||
"qcom,mdss-has-fixed-qos-arbiter-enabled" is enabled.
|
||||
These paths must be defined after rt-paths in
|
||||
"qcom,msm-bus,vectors-KBps" vector request.
|
||||
- qcom,mdss-has-source-split: Boolean property to indicate if source split
|
||||
feature is available or not.
|
||||
- qcom,mdss-has-rotator-downscale: Boolean property to indicate if rotator
|
||||
|
@ -487,6 +497,7 @@ Example:
|
|||
qcom,msm-bus,num-cases = <3>;
|
||||
qcom,msm-bus,num-paths = <2>;
|
||||
qcom,mdss-dram-channels = <2>;
|
||||
qcom,mdss-num-nrt-paths = <1>;
|
||||
qcom,msm-bus,vectors-KBps =
|
||||
<22 512 0 0>, <23 512 0 0>,
|
||||
<22 512 0 6400000>, <23 512 0 6400000>,
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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__);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
bus_ab_quota = apply_fudge_factor(bw_sum_of_intfs,
|
||||
&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_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
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue