Loading drivers/video/msm/mdss/mdss.h +2 −0 Original line number Diff line number Diff line Loading @@ -321,6 +321,8 @@ struct mdss_util_intf { int (*get_iommu_domain)(u32 type); int (*iommu_attached)(void); int (*iommu_ctrl)(int enable); void (*iommu_lock)(void); void (*iommu_unlock)(void); void (*bus_bandwidth_ctrl)(int enable); int (*bus_scale_set_quota)(int client, u64 ab_quota, u64 ib_quota); struct mdss_panel_cfg* (*panel_intf_type)(int intf_val); Loading drivers/video/msm/mdss/mdss_dsi_host.c +6 −1 Original line number Diff line number Diff line Loading @@ -1714,12 +1714,14 @@ static int mdss_dsi_cmd_dma_tx(struct mdss_dsi_ctrl_pdata *ctrl, ctrl->dma_size = ALIGN(tp->len, SZ_4K); ctrl->mdss_util->iommu_lock(); if (ctrl->mdss_util->iommu_attached()) { int ret = msm_iommu_map_contig_buffer(tp->dmap, ctrl->mdss_util->get_iommu_domain(domain), 0, ctrl->dma_size, SZ_4K, 0, &(ctrl->dma_addr)); if (IS_ERR_VALUE(ret)) { pr_err("unable to map dma memory to iommu(%d)\n", ret); ctrl->mdss_util->iommu_unlock(); return -ENOMEM; } ctrl->dmap_iommu_map = true; Loading Loading @@ -1808,6 +1810,7 @@ static int mdss_dsi_cmd_dma_tx(struct mdss_dsi_ctrl_pdata *ctrl, ctrl->dma_addr = 0; ctrl->dma_size = 0; end: ctrl->mdss_util->iommu_unlock(); return ret; } Loading Loading @@ -2059,6 +2062,7 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) struct dcs_cmd_req *req; struct mdss_panel_info *pinfo; struct mdss_rect *roi = NULL; bool use_iommu = false; int ret = -EINVAL; int rc = 0; u32 ctrl_rev; Loading Loading @@ -2135,6 +2139,7 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) mutex_unlock(&ctrl->cmd_mutex); return rc; } use_iommu = true; } } Loading @@ -2152,7 +2157,7 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) mdss_dsi_set_tx_power_mode(1, &ctrl->panel_data); if (!(req->flags & CMD_REQ_DMA_TPG)) { if (ctrl->mdss_util->iommu_ctrl) if (use_iommu) ctrl->mdss_util->iommu_ctrl(0); if (ctrl->mdss_util->bus_scale_set_quota) Loading drivers/video/msm/mdss/mdss_mdp.c +21 −4 Original line number Diff line number Diff line Loading @@ -93,6 +93,7 @@ static DEFINE_SPINLOCK(mdp_lock); static DEFINE_MUTEX(mdp_clk_lock); static DEFINE_MUTEX(bus_bw_lock); static DEFINE_MUTEX(mdp_iommu_lock); static DEFINE_MUTEX(mdp_iommu_ref_cnt_lock); static DEFINE_MUTEX(mdp_fs_idle_pc_lock); static struct mdss_panel_intf pan_types[] = { Loading Loading @@ -662,12 +663,22 @@ static inline int is_mdss_iommu_attached(void) return mdss_res->iommu_attached; } void mdss_iommu_lock(void) { mutex_lock(&mdp_iommu_lock); } void mdss_iommu_unlock(void) { mutex_unlock(&mdp_iommu_lock); } int mdss_iommu_ctrl(int enable) { struct mdss_data_type *mdata = mdss_mdp_get_mdata(); int rc = 0; mutex_lock(&mdp_iommu_lock); mutex_lock(&mdp_iommu_ref_cnt_lock); pr_debug("%pS: enable %d mdata->iommu_ref_cnt %d\n", __builtin_return_address(0), enable, mdata->iommu_ref_cnt); Loading @@ -692,7 +703,7 @@ int mdss_iommu_ctrl(int enable) pr_err("unbalanced iommu ref\n"); } } mutex_unlock(&mdp_iommu_lock); mutex_unlock(&mdp_iommu_ref_cnt_lock); if (IS_ERR_VALUE(rc)) return rc; Loading Loading @@ -981,6 +992,7 @@ static int mdss_iommu_attach(struct mdss_data_type *mdata) MDSS_XLOG(mdata->iommu_attached); mutex_lock(&mdp_iommu_lock); if (mdata->iommu_attached) { pr_debug("mdp iommu already attached\n"); goto end; Loading Loading @@ -1009,6 +1021,7 @@ static int mdss_iommu_attach(struct mdss_data_type *mdata) mdata->iommu_attached = true; end: mutex_unlock(&mdp_iommu_lock); return rc; } Loading @@ -1020,9 +1033,10 @@ static int mdss_iommu_dettach(struct mdss_data_type *mdata) MDSS_XLOG(mdata->iommu_attached); mutex_lock(&mdp_iommu_lock); if (!mdata->iommu_attached) { pr_debug("mdp iommu already dettached\n"); return 0; goto end; } for (i = 0; i < MDSS_IOMMU_MAX_DOMAIN; i++) { Loading @@ -1038,7 +1052,8 @@ static int mdss_iommu_dettach(struct mdss_data_type *mdata) } mdata->iommu_attached = false; end: mutex_unlock(&mdp_iommu_lock); return 0; } Loading Loading @@ -1522,6 +1537,8 @@ static int mdss_mdp_probe(struct platform_device *pdev) mdss_res->mdss_util->get_iommu_domain = mdss_get_iommu_domain; mdss_res->mdss_util->iommu_attached = is_mdss_iommu_attached; mdss_res->mdss_util->iommu_lock = mdss_iommu_lock; mdss_res->mdss_util->iommu_unlock = mdss_iommu_unlock; mdss_res->mdss_util->iommu_ctrl = mdss_iommu_ctrl; mdss_res->mdss_util->bus_scale_set_quota = mdss_bus_scale_set_quota; mdss_res->mdss_util->bus_bandwidth_ctrl = mdss_bus_bandwidth_ctrl; Loading Loading
drivers/video/msm/mdss/mdss.h +2 −0 Original line number Diff line number Diff line Loading @@ -321,6 +321,8 @@ struct mdss_util_intf { int (*get_iommu_domain)(u32 type); int (*iommu_attached)(void); int (*iommu_ctrl)(int enable); void (*iommu_lock)(void); void (*iommu_unlock)(void); void (*bus_bandwidth_ctrl)(int enable); int (*bus_scale_set_quota)(int client, u64 ab_quota, u64 ib_quota); struct mdss_panel_cfg* (*panel_intf_type)(int intf_val); Loading
drivers/video/msm/mdss/mdss_dsi_host.c +6 −1 Original line number Diff line number Diff line Loading @@ -1714,12 +1714,14 @@ static int mdss_dsi_cmd_dma_tx(struct mdss_dsi_ctrl_pdata *ctrl, ctrl->dma_size = ALIGN(tp->len, SZ_4K); ctrl->mdss_util->iommu_lock(); if (ctrl->mdss_util->iommu_attached()) { int ret = msm_iommu_map_contig_buffer(tp->dmap, ctrl->mdss_util->get_iommu_domain(domain), 0, ctrl->dma_size, SZ_4K, 0, &(ctrl->dma_addr)); if (IS_ERR_VALUE(ret)) { pr_err("unable to map dma memory to iommu(%d)\n", ret); ctrl->mdss_util->iommu_unlock(); return -ENOMEM; } ctrl->dmap_iommu_map = true; Loading Loading @@ -1808,6 +1810,7 @@ static int mdss_dsi_cmd_dma_tx(struct mdss_dsi_ctrl_pdata *ctrl, ctrl->dma_addr = 0; ctrl->dma_size = 0; end: ctrl->mdss_util->iommu_unlock(); return ret; } Loading Loading @@ -2059,6 +2062,7 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) struct dcs_cmd_req *req; struct mdss_panel_info *pinfo; struct mdss_rect *roi = NULL; bool use_iommu = false; int ret = -EINVAL; int rc = 0; u32 ctrl_rev; Loading Loading @@ -2135,6 +2139,7 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) mutex_unlock(&ctrl->cmd_mutex); return rc; } use_iommu = true; } } Loading @@ -2152,7 +2157,7 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp) mdss_dsi_set_tx_power_mode(1, &ctrl->panel_data); if (!(req->flags & CMD_REQ_DMA_TPG)) { if (ctrl->mdss_util->iommu_ctrl) if (use_iommu) ctrl->mdss_util->iommu_ctrl(0); if (ctrl->mdss_util->bus_scale_set_quota) Loading
drivers/video/msm/mdss/mdss_mdp.c +21 −4 Original line number Diff line number Diff line Loading @@ -93,6 +93,7 @@ static DEFINE_SPINLOCK(mdp_lock); static DEFINE_MUTEX(mdp_clk_lock); static DEFINE_MUTEX(bus_bw_lock); static DEFINE_MUTEX(mdp_iommu_lock); static DEFINE_MUTEX(mdp_iommu_ref_cnt_lock); static DEFINE_MUTEX(mdp_fs_idle_pc_lock); static struct mdss_panel_intf pan_types[] = { Loading Loading @@ -662,12 +663,22 @@ static inline int is_mdss_iommu_attached(void) return mdss_res->iommu_attached; } void mdss_iommu_lock(void) { mutex_lock(&mdp_iommu_lock); } void mdss_iommu_unlock(void) { mutex_unlock(&mdp_iommu_lock); } int mdss_iommu_ctrl(int enable) { struct mdss_data_type *mdata = mdss_mdp_get_mdata(); int rc = 0; mutex_lock(&mdp_iommu_lock); mutex_lock(&mdp_iommu_ref_cnt_lock); pr_debug("%pS: enable %d mdata->iommu_ref_cnt %d\n", __builtin_return_address(0), enable, mdata->iommu_ref_cnt); Loading @@ -692,7 +703,7 @@ int mdss_iommu_ctrl(int enable) pr_err("unbalanced iommu ref\n"); } } mutex_unlock(&mdp_iommu_lock); mutex_unlock(&mdp_iommu_ref_cnt_lock); if (IS_ERR_VALUE(rc)) return rc; Loading Loading @@ -981,6 +992,7 @@ static int mdss_iommu_attach(struct mdss_data_type *mdata) MDSS_XLOG(mdata->iommu_attached); mutex_lock(&mdp_iommu_lock); if (mdata->iommu_attached) { pr_debug("mdp iommu already attached\n"); goto end; Loading Loading @@ -1009,6 +1021,7 @@ static int mdss_iommu_attach(struct mdss_data_type *mdata) mdata->iommu_attached = true; end: mutex_unlock(&mdp_iommu_lock); return rc; } Loading @@ -1020,9 +1033,10 @@ static int mdss_iommu_dettach(struct mdss_data_type *mdata) MDSS_XLOG(mdata->iommu_attached); mutex_lock(&mdp_iommu_lock); if (!mdata->iommu_attached) { pr_debug("mdp iommu already dettached\n"); return 0; goto end; } for (i = 0; i < MDSS_IOMMU_MAX_DOMAIN; i++) { Loading @@ -1038,7 +1052,8 @@ static int mdss_iommu_dettach(struct mdss_data_type *mdata) } mdata->iommu_attached = false; end: mutex_unlock(&mdp_iommu_lock); return 0; } Loading Loading @@ -1522,6 +1537,8 @@ static int mdss_mdp_probe(struct platform_device *pdev) mdss_res->mdss_util->get_iommu_domain = mdss_get_iommu_domain; mdss_res->mdss_util->iommu_attached = is_mdss_iommu_attached; mdss_res->mdss_util->iommu_lock = mdss_iommu_lock; mdss_res->mdss_util->iommu_unlock = mdss_iommu_unlock; mdss_res->mdss_util->iommu_ctrl = mdss_iommu_ctrl; mdss_res->mdss_util->bus_scale_set_quota = mdss_bus_scale_set_quota; mdss_res->mdss_util->bus_bandwidth_ctrl = mdss_bus_bandwidth_ctrl; Loading