diff options
author | Shivaraj Shetty <shivaraj@codeaurora.org> | 2014-11-12 23:11:28 +0530 |
---|---|---|
committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:35:23 -0700 |
commit | 50290a21e510dd3ff0c0d60ee757c306fee81e19 (patch) | |
tree | eee42656e8fead46e608ab3a748d021ae6e6b098 /drivers | |
parent | 2b1912967b7c7e297b6a00c01eeaa25c70110bf3 (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.c | 27 | ||||
-rw-r--r-- | drivers/video/fbdev/msm/mdp3.h | 3 | ||||
-rw-r--r-- | drivers/video/fbdev/msm/mdp3_ctrl.c | 4 | ||||
-rw-r--r-- | drivers/video/fbdev/msm/mdp3_ppp.c | 4 | ||||
-rw-r--r-- | drivers/video/fbdev/msm/mdss.h | 13 | ||||
-rw-r--r-- | drivers/video/fbdev/msm/mdss_dsi.c | 17 | ||||
-rw-r--r-- | drivers/video/fbdev/msm/mdss_dsi_host.c | 36 | ||||
-rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.c | 14 | ||||
-rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 8 | ||||
-rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_splash_logo.c | 3 | ||||
-rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_util.c | 2 | ||||
-rw-r--r-- | drivers/video/fbdev/msm/mdss_util.c | 16 |
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() |