summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorShivaraj Shetty <shivaraj@codeaurora.org>2014-11-12 23:11:28 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:35:23 -0700
commit50290a21e510dd3ff0c0d60ee757c306fee81e19 (patch)
treeeee42656e8fead46e608ab3a748d021ae6e6b098 /drivers
parent2b1912967b7c7e297b6a00c01eeaa25c70110bf3 (diff)
msm: mdss: Add iommu and bandwidth changes for dsi 6G
msm8909 has mdp3 with DSI 6G. Enable DSI 6G to work with mdp3 and mdp5 while using iommu and bandwidth functions. Change-Id: I0de48dbe388c81ebfade7aeb5592357e2750d143 Signed-off-by: Shivaraj Shetty <shivaraj@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/msm/mdp3.c27
-rw-r--r--drivers/video/fbdev/msm/mdp3.h3
-rw-r--r--drivers/video/fbdev/msm/mdp3_ctrl.c4
-rw-r--r--drivers/video/fbdev/msm/mdp3_ppp.c4
-rw-r--r--drivers/video/fbdev/msm/mdss.h13
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi.c17
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi_host.c36
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.c14
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c8
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_splash_logo.c3
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_util.c2
-rw-r--r--drivers/video/fbdev/msm/mdss_util.c16
12 files changed, 99 insertions, 48 deletions
diff --git a/drivers/video/fbdev/msm/mdp3.c b/drivers/video/fbdev/msm/mdp3.c
index 5268bc0863c0..b3b7a0d44bdd 100644
--- a/drivers/video/fbdev/msm/mdp3.c
+++ b/drivers/video/fbdev/msm/mdp3.c
@@ -346,7 +346,8 @@ static void mdp3_bus_scale_unregister(void)
}
}
-int mdp3_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota)
+int mdp3_bus_scale_set_quota(int client, u64 ab_quota, u64 ab_quota_nrt,
+ u64 ib_quota)
{
struct mdp3_bus_handle_map *bus_handle;
int cur_bus_idx;
@@ -365,6 +366,9 @@ int mdp3_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota)
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;
@@ -629,9 +633,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, ib);
+ mdp3_bus_scale_set_quota(client, ab, 0, ib);
} else if (!enable && ref_cnt == 0) {
- mdp3_bus_scale_set_quota(client, 0, 0);
+ mdp3_bus_scale_set_quota(client, 0, 0, 0);
mdp3_iommu_disable();
} else if (ref_cnt < 0) {
pr_err("Ref count < 0, bus client=%d, ref_cnt=%d",
@@ -1385,6 +1389,17 @@ int mdp3_iommu_disable()
return rc;
}
+int mdp3_iommu_ctrl(int enable)
+{
+ int rc;
+
+ if (enable)
+ rc = mdp3_iommu_enable();
+ else
+ rc = mdp3_iommu_disable();
+ return rc;
+}
+
int mdp3_iommu_is_attached()
{
struct mdp3_iommu_ctx_map *context_map;
@@ -1633,7 +1648,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, ib);
+ rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_DMA_P, ab, 0, ib);
bus_handle->restore_ab[MDP3_CLIENT_DMA_P] = ab;
bus_handle->restore_ib[MDP3_CLIENT_DMA_P] = ib;
@@ -1981,6 +1996,9 @@ static int mdp3_probe(struct platform_device *pdev)
rc = -ENODEV;
goto get_util_fail;
}
+ mdp3_res->mdss_util->iommu_attached = mdp3_iommu_is_attached;
+ mdp3_res->mdss_util->iommu_ctrl = mdp3_iommu_ctrl;
+ mdp3_res->mdss_util->bus_scale_set_quota = mdp3_bus_scale_set_quota;
rc = mdp3_parse_dt(pdev);
if (rc)
@@ -2028,6 +2046,7 @@ static int mdp3_probe(struct platform_device *pdev)
&underrun_cb);
if (rc)
pr_err("unable to configure interrupt callback\n");
+ mdp3_res->mdss_util->mdp_probe_done = true;
probe_done:
if (IS_ERR_VALUE(rc))
diff --git a/drivers/video/fbdev/msm/mdp3.h b/drivers/video/fbdev/msm/mdp3.h
index 1d7526b7c895..69d32ddaca08 100644
--- a/drivers/video/fbdev/msm/mdp3.h
+++ b/drivers/video/fbdev/msm/mdp3.h
@@ -176,7 +176,8 @@ 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 ib_quota);
+int mdp3_bus_scale_set_quota(int client, u64 ab_quota, u64 ab_quota_nrt,
+ 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 d0606578a72f..2c54952c43f1 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, ib);
+ rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_DMA_P, ab, 0, ib);
} else {
- rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_DMA_P, 0, 0);
+ rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_DMA_P, 0, 0, 0);
}
return rc;
}
diff --git a/drivers/video/fbdev/msm/mdp3_ppp.c b/drivers/video/fbdev/msm/mdp3_ppp.c
index e8135b5fda80..5fad4970e688 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, ib);
+ rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_PPP, ab, 0, 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, ib);
+ rc = mdp3_bus_scale_set_quota(MDP3_CLIENT_PPP, ab, 0, 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 8c5bbf350a12..a895d6a9c159 100644
--- a/drivers/video/fbdev/msm/mdss.h
+++ b/drivers/video/fbdev/msm/mdss.h
@@ -284,11 +284,17 @@ int mdss_bus_scale_set_quota(int client, u64 ab_quota_rt, u64 ab_quota_nrt,
u64 ib_quota);
struct mdss_util_intf {
+ bool mdp_probe_done;
int (*register_irq)(struct mdss_hw *hw);
void (*enable_irq)(struct mdss_hw *hw);
void (*disable_irq)(struct mdss_hw *hw);
void (*disable_irq_nosync)(struct mdss_hw *hw);
int (*irq_dispatch)(u32 hw_ndx, int irq, void *ptr);
+ 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);
};
struct mdss_util_intf *mdss_get_util_intf(void);
@@ -300,13 +306,6 @@ static inline struct ion_client *mdss_get_ionclient(void)
return mdss_res->iclient;
}
-static inline int is_mdss_iommu_attached(void)
-{
- if (!mdss_res)
- return false;
- return mdss_res->iommu_attached;
-}
-
static inline int mdss_get_iommu_domain(u32 type)
{
if (type >= MDSS_IOMMU_MAX_DOMAIN)
diff --git a/drivers/video/fbdev/msm/mdss_dsi.c b/drivers/video/fbdev/msm/mdss_dsi.c
index d903e462d318..771ee17e432c 100644
--- a/drivers/video/fbdev/msm/mdss_dsi.c
+++ b/drivers/video/fbdev/msm/mdss_dsi.c
@@ -1377,8 +1377,15 @@ static int mdss_dsi_ctrl_probe(struct platform_device *pdev)
const char *ctrl_name;
bool cmd_cfg_cont_splash = true;
struct mdss_panel_cfg *pan_cfg = NULL;
+ struct mdss_util_intf *util;
- if (!mdss_is_ready()) {
+ util = mdss_get_util_intf();
+ if (util == NULL) {
+ pr_err("Failed to get mdss utility functions\n");
+ return -ENODEV;
+ }
+
+ if (!util->mdp_probe_done) {
pr_err("%s: MDP not probed yet!\n", __func__);
return -EPROBE_DEFER;
}
@@ -1409,13 +1416,7 @@ static int mdss_dsi_ctrl_probe(struct platform_device *pdev)
}
platform_set_drvdata(pdev, ctrl_pdata);
}
-
- ctrl_pdata->mdss_util = mdss_get_util_intf();
- if (ctrl_pdata->mdss_util == NULL) {
- pr_err("Failed to get mdss utility functions\n");
- rc = -ENODEV;
- goto error_no_mem;
- }
+ ctrl_pdata->mdss_util = util;
atomic_set(&ctrl_pdata->te_irq_ready, 0);
ctrl_name = of_get_property(pdev->dev.of_node, "label", NULL);
diff --git a/drivers/video/fbdev/msm/mdss_dsi_host.c b/drivers/video/fbdev/msm/mdss_dsi_host.c
index ba210d2594b4..16e78a9f2fea 100644
--- a/drivers/video/fbdev/msm/mdss_dsi_host.c
+++ b/drivers/video/fbdev/msm/mdss_dsi_host.c
@@ -1489,7 +1489,7 @@ static int mdss_dsi_cmd_dma_tx(struct mdss_dsi_ctrl_pdata *ctrl,
ctrl->dma_size = ALIGN(tp->len, SZ_4K);
- if (is_mdss_iommu_attached()) {
+ if (ctrl->mdss_util->iommu_attached()) {
int ret = msm_iommu_map_contig_buffer(tp->dmap,
mdss_get_iommu_domain(domain), 0,
ctrl->dma_size, SZ_4K, 0, &(ctrl->dma_addr));
@@ -1537,7 +1537,7 @@ static int mdss_dsi_cmd_dma_tx(struct mdss_dsi_ctrl_pdata *ctrl,
ret = tp->len;
if (mctrl && mctrl->dma_addr) {
- if (is_mdss_iommu_attached()) {
+ if (ctrl->mdss_util->iommu_attached()) {
msm_iommu_unmap_contig_buffer(mctrl->dma_addr,
mdss_get_iommu_domain(domain), 0, mctrl->dma_size);
}
@@ -1545,7 +1545,7 @@ static int mdss_dsi_cmd_dma_tx(struct mdss_dsi_ctrl_pdata *ctrl,
mctrl->dma_size = 0;
}
- if (is_mdss_iommu_attached()) {
+ if (ctrl->mdss_util->iommu_attached()) {
msm_iommu_unmap_contig_buffer(ctrl->dma_addr,
mdss_get_iommu_domain(domain), 0, ctrl->dma_size);
}
@@ -1830,17 +1830,23 @@ 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_bandwidth_ctrl(1);
- mdss_bus_scale_set_quota(MDSS_HW_DSI0, SZ_1M, 0, SZ_1M);
+ if (ctrl->mdss_util->bus_bandwidth_ctrl)
+ 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);
pr_debug("%s: from_mdp=%d pid=%d\n", __func__, from_mdp, current->pid);
mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 1);
- rc = mdss_iommu_ctrl(1);
- if (IS_ERR_VALUE(rc)) {
- pr_err("IOMMU attach failed\n");
- mutex_unlock(&ctrl->cmd_mutex);
- return rc;
+ if (ctrl->mdss_util->iommu_ctrl) {
+ rc = ctrl->mdss_util->iommu_ctrl(1);
+ if (IS_ERR_VALUE(rc)) {
+ pr_err("IOMMU attach failed\n");
+ mutex_unlock(&ctrl->cmd_mutex);
+ return rc;
+ }
}
if (req->flags & CMD_REQ_HS_MODE)
@@ -1854,10 +1860,14 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp)
if (req->flags & CMD_REQ_HS_MODE)
mdss_dsi_set_tx_power_mode(1, &ctrl->panel_data);
- mdss_iommu_ctrl(0);
+ if (ctrl->mdss_util->iommu_ctrl)
+ ctrl->mdss_util->iommu_ctrl(0);
+
mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 0);
- mdss_bus_scale_set_quota(MDSS_HW_DSI0, 0, 0, 0);
- mdss_bus_bandwidth_ctrl(0);
+ if (ctrl->mdss_util->bus_scale_set_quota)
+ ctrl->mdss_util->bus_scale_set_quota(MDSS_HW_DSI0, 0, 0, 0);
+ if (ctrl->mdss_util->bus_bandwidth_ctrl)
+ ctrl->mdss_util->bus_bandwidth_ctrl(0);
need_lock:
MDSS_XLOG(ctrl->ndx, from_mdp, ctrl->mdp_busy, current->pid,
diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c
index 210414653550..4075014f6d53 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp.c
@@ -631,6 +631,13 @@ unsigned long mdss_mdp_get_clk_rate(u32 clk_idx)
return clk_rate;
}
+static inline int is_mdss_iommu_attached(void)
+{
+ if (!mdss_res)
+ return false;
+ return mdss_res->iommu_attached;
+}
+
int mdss_iommu_ctrl(int enable)
{
struct mdss_data_type *mdata = mdss_mdp_get_mdata();
@@ -1442,6 +1449,11 @@ static int mdss_mdp_probe(struct platform_device *pdev)
return -ENODEV;
}
+ mdss_res->mdss_util->iommu_attached = is_mdss_iommu_attached;
+ 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;
+
rc = msm_dss_ioremap_byname(pdev, &mdata->mdss_io, "mdp_phys");
if (rc) {
pr_err("unable to map MDP base\n");
@@ -1536,7 +1548,7 @@ static int mdss_mdp_probe(struct platform_device *pdev)
rc = mdss_res->mdss_util->register_irq(&mdss_mdp_hw);
if (rc)
pr_err("mdss_register_irq failed.\n");
-
+ mdss_res->mdss_util->mdp_probe_done = true;
probe_done:
if (IS_ERR_VALUE(rc)) {
mdss_mdp_hw.ptr = NULL;
diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
index 7585943763f8..d6266d708e3c 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
@@ -1193,6 +1193,7 @@ int mdss_mdp_overlay_start(struct msm_fb_data_type *mfd)
{
int rc;
struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
+ struct mdss_data_type *mdata = mdss_mdp_get_mdata();
struct mdss_mdp_ctl *ctl = mdp5_data->ctl;
if (mdss_mdp_ctl_is_power_on(ctl)) {
@@ -1237,7 +1238,7 @@ int mdss_mdp_overlay_start(struct msm_fb_data_type *mfd)
* This is not needed when continuous splash screen is enabled since
* we would have called in to TZ to restore security configs from LK.
*/
- if (!is_mdss_iommu_attached()) {
+ if (!mdata->mdss_util->iommu_attached()) {
if (!mfd->panel_info->cont_splash_enabled) {
rc = mdss_iommu_ctrl(1);
if (IS_ERR_VALUE(rc)) {
@@ -1979,7 +1980,7 @@ static void mdss_mdp_overlay_pan_display(struct msm_fb_data_type *mfd)
}
buf = &pipe->back_buf;
- if (is_mdss_iommu_attached()) {
+ if (mdata->mdss_util->iommu_attached()) {
if (!mfd->iova) {
pr_err("mfd iova is zero\n");
mdss_mdp_pipe_unmap(pipe);
@@ -2419,6 +2420,7 @@ static int mdss_mdp_hw_cursor_update(struct msm_fb_data_type *mfd,
struct mdss_mdp_mixer *mixer_left = NULL;
struct mdss_mdp_mixer *mixer_right = NULL;
struct fb_image *img = &cursor->image;
+ struct mdss_data_type *mdata = mdss_mdp_get_mdata();
struct fbcurpos cursor_hot;
struct mdss_rect roi;
int ret = 0;
@@ -2512,7 +2514,7 @@ static int mdss_mdp_hw_cursor_update(struct msm_fb_data_type *mfd,
return ret;
}
- if (is_mdss_iommu_attached()) {
+ if (mdata->mdss_util->iommu_attached()) {
cursor_addr = mfd->cursor_buf_iova;
} else {
if (MDSS_LPAE_CHECK(mfd->cursor_buf_phys)) {
diff --git a/drivers/video/fbdev/msm/mdss_mdp_splash_logo.c b/drivers/video/fbdev/msm/mdss_mdp_splash_logo.c
index 18a90006a31e..250021d82eeb 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_splash_logo.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_splash_logo.c
@@ -149,6 +149,7 @@ static int mdss_mdp_splash_iommu_attach(struct msm_fb_data_type *mfd)
{
struct iommu_domain *domain;
struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
+ struct mdss_data_type *mdata = mdss_mdp_get_mdata();
int rc, ret;
/*
@@ -157,7 +158,7 @@ static int mdss_mdp_splash_iommu_attach(struct msm_fb_data_type *mfd)
* 2. MDP hardware version supports the feature
* 3. configuration is with valid splash buffer
*/
- if (is_mdss_iommu_attached() ||
+ if (mdata->mdss_util->iommu_attached() ||
!mfd->panel_info->cont_splash_enabled ||
!mdss_mdp_iommu_dyn_attach_supported(mdp5_data->mdata) ||
!mdp5_data->splash_mem_addr ||
diff --git a/drivers/video/fbdev/msm/mdss_mdp_util.c b/drivers/video/fbdev/msm/mdss_mdp_util.c
index e7f1a5ea3bd6..e435bf31ebaf 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_util.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_util.c
@@ -803,7 +803,7 @@ static int mdss_mdp_map_buffer(struct mdss_mdp_img_data *data)
return 0;
if (!IS_ERR_OR_NULL(data->srcp_dma_buf)) {
- if (is_mdss_iommu_attached()) {
+ if (mdss_res->mdss_util->iommu_attached()) {
int domain;
if (data->flags & MDP_SECURE_OVERLAY_SESSION)
domain = MDSS_IOMMU_DOMAIN_SECURE;
diff --git a/drivers/video/fbdev/msm/mdss_util.c b/drivers/video/fbdev/msm/mdss_util.c
index 1c86516a894b..b0eb962f909d 100644
--- a/drivers/video/fbdev/msm/mdss_util.c
+++ b/drivers/video/fbdev/msm/mdss_util.c
@@ -140,11 +140,17 @@ int mdss_irq_dispatch(u32 hw_ndx, int irq, void *ptr)
}
struct mdss_util_intf mdss_util = {
- mdss_register_irq,
- mdss_enable_irq,
- mdss_disable_irq,
- mdss_disable_irq_nosync,
- mdss_irq_dispatch
+ .register_irq = mdss_register_irq,
+ .enable_irq = mdss_enable_irq,
+ .disable_irq = mdss_disable_irq,
+ .disable_irq_nosync = mdss_disable_irq_nosync,
+ .irq_dispatch = mdss_irq_dispatch,
+ .iommu_attached = NULL,
+ .iommu_ctrl = NULL,
+ .bus_bandwidth_ctrl = NULL,
+ .bus_scale_set_quota = NULL,
+ .mdp_probe_done = false
+
};
struct mdss_util_intf *mdss_get_util_intf()