Merge "msm: mdss: add error check for iommu attach API"
diff --git a/drivers/video/msm/mdss/mdss.h b/drivers/video/msm/mdss/mdss.h
index 72cceaa..afa0bc1 100644
--- a/drivers/video/msm/mdss/mdss.h
+++ b/drivers/video/msm/mdss/mdss.h
@@ -220,7 +220,7 @@
void mdss_enable_irq(struct mdss_hw *hw);
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_bus_bandwidth_ctrl(int enable);
static inline struct ion_client *mdss_get_ionclient(void)
{
diff --git a/drivers/video/msm/mdss/mdss_dsi_host.c b/drivers/video/msm/mdss/mdss_dsi_host.c
index 46ca84f..74d2739 100644
--- a/drivers/video/msm/mdss/mdss_dsi_host.c
+++ b/drivers/video/msm/mdss/mdss_dsi_host.c
@@ -1264,7 +1264,11 @@
* also, axi bus bandwidth need since dsi controller will
* fetch dcs commands from axi bus
*/
- mdss_bus_bandwidth_ctrl(1);
+ ret = mdss_bus_bandwidth_ctrl(1);
+ if (ret) {
+ pr_err("bus bandwidth request failed ret=%d\n", ret);
+ goto need_lock;
+ }
pr_debug("%s: from_mdp=%d pid=%d\n", __func__, from_mdp, current->pid);
mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 1);
diff --git a/drivers/video/msm/mdss/mdss_mdp.c b/drivers/video/msm/mdss/mdss_mdp.c
index 037a183..bf151f4 100644
--- a/drivers/video/msm/mdss/mdss_mdp.c
+++ b/drivers/video/msm/mdss/mdss_mdp.c
@@ -627,18 +627,29 @@
* Function place bus bandwidth request to allocate saved bandwidth
* if enabled or free bus bandwidth allocation if disabled.
* Bus bandwidth is required by mdp.For dsi, it only requires to send
- * dcs coammnd.
+ * dcs coammnd. It returns error if bandwidth request fails.
*/
-void mdss_bus_bandwidth_ctrl(int enable)
+int mdss_bus_bandwidth_ctrl(int enable)
{
struct mdss_data_type *mdata = mdss_mdp_get_mdata();
static int bus_bw_cnt;
int changed = 0;
+ int rc = 0;
mutex_lock(&bus_bw_lock);
if (enable) {
- if (bus_bw_cnt == 0)
+ if (bus_bw_cnt == 0) {
changed++;
+ if (!mdata->handoff_pending) {
+ rc = mdss_iommu_attach(mdata);
+ if (rc) {
+ pr_err("iommu attach failed rc=%d\n",
+ rc);
+ goto end;
+ }
+ }
+ }
+
bus_bw_cnt++;
} else {
if (bus_bw_cnt) {
@@ -663,12 +674,12 @@
pm_runtime_get_sync(&mdata->pdev->dev);
msm_bus_scale_client_update_request(
mdata->bus_hdl, mdata->curr_bw_uc_idx);
- if (!mdata->handoff_pending)
- mdss_iommu_attach(mdata);
}
}
+end:
mutex_unlock(&bus_bw_lock);
+ return rc;
}
EXPORT_SYMBOL(mdss_bus_bandwidth_ctrl);
@@ -676,7 +687,7 @@
{
struct mdss_data_type *mdata = mdss_mdp_get_mdata();
static int mdp_clk_cnt;
- int changed = 0;
+ int changed = 0, rc;
mutex_lock(&mdp_clk_lock);
if (enable) {
@@ -709,7 +720,9 @@
if (mdata->vsync_ena)
mdss_mdp_clk_update(MDSS_CLK_MDP_VSYNC, enable);
- mdss_bus_bandwidth_ctrl(enable);
+ rc = mdss_bus_bandwidth_ctrl(enable);
+ if (rc)
+ pr_err("bus bandwidth control failed rc=%d", rc);
if (!enable)
pm_runtime_put(&mdata->pdev->dev);
@@ -794,15 +807,14 @@
{
struct iommu_domain *domain;
struct mdss_iommu_map_type *iomap;
- int i;
+ int i, rc = 0;
mutex_lock(&mdp_iommu_lock);
MDSS_XLOG(mdata->iommu_attached);
if (mdata->iommu_attached) {
pr_debug("mdp iommu already attached\n");
- mutex_unlock(&mdp_iommu_lock);
- return 0;
+ goto end;
}
for (i = 0; i < MDSS_IOMMU_MAX_DOMAIN; i++) {
@@ -814,13 +826,23 @@
iomap->client_name, iomap->ctx_name);
continue;
}
- iommu_attach_device(domain, iomap->ctx);
+
+ rc = iommu_attach_device(domain, iomap->ctx);
+ if (rc) {
+ WARN(1, "mdp::iommu device attach failed rc:%d\n", rc);
+ for (i--; i >= 0; i--) {
+ iomap = mdata->iommu_map + i;
+ iommu_detach_device(domain, iomap->ctx);
+ }
+ goto end;
+ }
}
mdata->iommu_attached = true;
+end:
mutex_unlock(&mdp_iommu_lock);
- return 0;
+ return rc;
}
int mdss_iommu_dettach(struct mdss_data_type *mdata)
@@ -2558,22 +2580,31 @@
* MDSS GDSC can be voted off during idle-screen usecase for MIPI DSI command
* mode displays with Ultra-Low Power State (ULPS) feature enabled. Upon
* subsequent frame update, MDSS GDSC needs to turned back on and hw state
- * needs to be restored.
+ * needs to be restored. It returns error if footswitch control API
+ * fails.
*/
-void mdss_mdp_footswitch_ctrl_ulps(int on, struct device *dev)
+int mdss_mdp_footswitch_ctrl_ulps(int on, struct device *dev)
{
struct mdss_data_type *mdata = mdss_mdp_get_mdata();
+ int rc = 0;
pr_debug("called on=%d\n", on);
if (on) {
pm_runtime_get_sync(dev);
- mdss_iommu_attach(mdata);
+ rc = mdss_iommu_attach(mdata);
+ if (rc) {
+ pr_err("mdss iommu attach failed rc=%d\n", rc);
+ goto end;
+ }
mdss_hw_init(mdata);
mdata->ulps = false;
} else {
mdata->ulps = true;
pm_runtime_put_sync(dev);
}
+
+end:
+ return rc;
}
static inline int mdss_mdp_suspend_sub(struct mdss_data_type *mdata)
diff --git a/drivers/video/msm/mdss/mdss_mdp.h b/drivers/video/msm/mdss/mdss_mdp.h
index 0c10d8c..8e83f51 100644
--- a/drivers/video/msm/mdss/mdss_mdp.h
+++ b/drivers/video/msm/mdss/mdss_mdp.h
@@ -736,7 +736,7 @@
int mdss_mdp_wb_set_secure(struct msm_fb_data_type *mfd, int enable);
int mdss_mdp_wb_get_secure(struct msm_fb_data_type *mfd, uint8_t *enable);
void mdss_mdp_ctl_restore(struct mdss_mdp_ctl *ctl);
-void mdss_mdp_footswitch_ctrl_ulps(int on, struct device *dev);
+int mdss_mdp_footswitch_ctrl_ulps(int on, struct device *dev);
int mdss_mdp_pipe_program_pixel_extn(struct mdss_mdp_pipe *pipe);
#define mfd_to_mdp5_data(mfd) (mfd->mdp.private1)
diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c
index 3f9ea7f..52c220f 100644
--- a/drivers/video/msm/mdss/mdss_mdp_overlay.c
+++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c
@@ -702,12 +702,15 @@
int num_planes,
u32 flags)
{
- int i, rc = 0;
+ int i, rc;
if ((num_planes <= 0) || (num_planes > MAX_PLANES))
return -EINVAL;
- mdss_bus_bandwidth_ctrl(1);
+ rc = mdss_bus_bandwidth_ctrl(1);
+ if (rc)
+ goto end;
+
memset(data, 0, sizeof(*data));
for (i = 0; i < num_planes; i++) {
data->p[i].flags = flags;
@@ -725,21 +728,27 @@
data->num_planes = i;
+end:
return rc;
}
int mdss_mdp_overlay_free_buf(struct mdss_mdp_data *data)
{
int i;
+ int rc;
- mdss_bus_bandwidth_ctrl(1);
+ rc = mdss_bus_bandwidth_ctrl(1);
+ if (rc)
+ goto end;
+
for (i = 0; i < data->num_planes && data->p[i].len; i++)
mdss_mdp_put_img(&data->p[i]);
mdss_bus_bandwidth_ctrl(0);
data->num_planes = 0;
- return 0;
+end:
+ return rc;
}
/**
@@ -898,14 +907,25 @@
if (ctl->power_on) {
if (mdp5_data->mdata->ulps) {
- mdss_mdp_footswitch_ctrl_ulps(1, &mfd->pdev->dev);
+ rc = mdss_mdp_footswitch_ctrl_ulps(1, &mfd->pdev->dev);
+ if (rc) {
+ pr_err("footswtich control power on failed rc=%d\n",
+ rc);
+ goto end;
+ }
+
mdss_mdp_ctl_restore(ctl);
}
if (!mdp5_data->mdata->batfet)
mdss_mdp_batfet_ctrl(mdp5_data->mdata, true);
- if (!mfd->panel_info->cont_splash_enabled)
- mdss_iommu_attach(mdp5_data->mdata);
+ if (!mfd->panel_info->cont_splash_enabled) {
+ rc = mdss_iommu_attach(mdp5_data->mdata);
+ if (rc) {
+ pr_err("mdss iommu attach failed rc=%d\n", rc);
+ goto end;
+ }
+ }
mdss_mdp_release_splash_pipe(mfd);
return 0;
}
@@ -915,7 +935,7 @@
rc = pm_runtime_get_sync(&mfd->pdev->dev);
if (IS_ERR_VALUE(rc)) {
pr_err("unable to resume with pm_runtime_get_sync rc=%d\n", rc);
- return rc;
+ goto end;
}
/*
@@ -927,8 +947,13 @@
* we would have called in to TZ to restore security configs from LK.
*/
if (!is_mdss_iommu_attached()) {
- if (!mfd->panel_info->cont_splash_enabled)
- mdss_iommu_attach(mdss_res);
+ if (!mfd->panel_info->cont_splash_enabled) {
+ rc = mdss_iommu_attach(mdss_res);
+ if (rc) {
+ pr_err("mdss iommu attach failed rc=%d\n", rc);
+ goto pm_error;
+ }
+ }
mdss_hw_init(mdss_res);
}
@@ -940,17 +965,19 @@
&mfd->mdp_sync_pt_data.notifier);
} else {
pr_err("mdp ctl start failed.\n");
- goto error;
+ goto ctl_error;
}
rc = mdss_mdp_splash_cleanup(mfd, true);
-error:
- if (rc) {
- mdss_mdp_ctl_destroy(ctl);
- mdp5_data->ctl = NULL;
- pm_runtime_put(&mfd->pdev->dev);
- }
+ if (!rc)
+ goto end;
+ctl_error:
+ mdss_mdp_ctl_destroy(ctl);
+ mdp5_data->ctl = NULL;
+pm_error:
+ pm_runtime_put(&mfd->pdev->dev);
+end:
return rc;
}
@@ -1358,8 +1385,13 @@
flags = (pipe->flags & MDP_SECURE_OVERLAY_SESSION);
flags |= (pipe->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION);
- if (!mfd->panel_info->cont_splash_enabled)
- mdss_iommu_attach(mdata);
+ if (!mfd->panel_info->cont_splash_enabled) {
+ ret = mdss_iommu_attach(mdata);
+ if (ret) {
+ pr_err("mdss iommu attach failed ret=%d\n", ret);
+ goto end;
+ }
+ }
src_data = &pipe->back_buf;
if (src_data->num_planes) {
@@ -1372,6 +1404,8 @@
if (IS_ERR_VALUE(ret)) {
pr_err("src_data pmem error\n");
}
+
+end:
mdss_mdp_pipe_unmap(pipe);
return ret;
diff --git a/drivers/video/msm/mdss/mdss_mdp_wb.c b/drivers/video/msm/mdss/mdss_mdp_wb.c
index aa17472..0e59a26 100644
--- a/drivers/video/msm/mdss/mdss_mdp_wb.c
+++ b/drivers/video/msm/mdss/mdss_mdp_wb.c
@@ -481,8 +481,13 @@
pr_debug("fb%d queue\n", wb->fb_ndx);
- if (!mfd->panel_info->cont_splash_enabled)
- mdss_iommu_attach(mdp5_data->mdata);
+ if (!mfd->panel_info->cont_splash_enabled) {
+ ret = mdss_iommu_attach(mdp5_data->mdata);
+ if (ret) {
+ pr_err("mdss iommu attach failed rc=%d", ret);
+ return ret;
+ }
+ }
mutex_lock(&wb->lock);
if (local)