diff options
author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-06-23 05:56:41 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-06-23 05:56:40 -0700 |
commit | 10bb4a94f11a92b3160cac4a620169c298402da4 (patch) | |
tree | b7aa10e847d69db78185339ce724f0b2f193f5af | |
parent | c2841e623b186c6cc7912e42ffacfd52b685ba63 (diff) | |
parent | 245031160bff81703cf109e473329c3f01d77304 (diff) |
Merge "msm: mdss: Change IOMMU map sequence during splash cleanup"
-rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_splash_logo.c | 47 | ||||
-rw-r--r-- | drivers/video/fbdev/msm/mdss_smmu.c | 21 | ||||
-rw-r--r-- | drivers/video/fbdev/msm/mdss_smmu.h | 5 |
3 files changed, 56 insertions, 17 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_splash_logo.c b/drivers/video/fbdev/msm/mdss_mdp_splash_logo.c index 7cc94447efdc..d412a1c66e79 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_splash_logo.c +++ b/drivers/video/fbdev/msm/mdss_mdp_splash_logo.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2015, 2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -150,7 +150,7 @@ static int mdss_mdp_splash_iommu_attach(struct msm_fb_data_type *mfd) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); struct mdss_data_type *mdata = mdss_mdp_get_mdata(); - int rc, ret; + int ret; /* * iommu dynamic attach for following conditions. @@ -167,26 +167,41 @@ static int mdss_mdp_splash_iommu_attach(struct msm_fb_data_type *mfd) return -EPERM; } - rc = mdss_smmu_map(MDSS_IOMMU_DOMAIN_UNSECURE, + /* + * Putting handoff pending to false to ensure smmu attach happens + * with early flag attribute + */ + mdata->handoff_pending = false; + + ret = mdss_smmu_set_attribute(MDSS_IOMMU_DOMAIN_UNSECURE, EARLY_MAP, 1); + if (ret) { + pr_debug("mdss set attribute failed for early map\n"); + goto end; + } + + ret = mdss_iommu_ctrl(1); + if (IS_ERR_VALUE(ret)) { + pr_err("mdss iommu attach failed\n"); + goto end; + } + + ret = mdss_smmu_map(MDSS_IOMMU_DOMAIN_UNSECURE, mdp5_data->splash_mem_addr, mdp5_data->splash_mem_addr, mdp5_data->splash_mem_size, IOMMU_READ | IOMMU_NOEXEC); - if (rc) { - pr_debug("iommu memory mapping failed rc=%d\n", rc); + if (ret) { + pr_err("iommu memory mapping failed ret=%d\n", ret); } else { - ret = mdss_iommu_ctrl(1); - if (IS_ERR_VALUE(ret)) { - pr_err("mdss iommu attach failed\n"); - mdss_smmu_unmap(MDSS_IOMMU_DOMAIN_UNSECURE, - mdp5_data->splash_mem_addr, - mdp5_data->splash_mem_size); - } else { - mfd->splash_info.iommu_dynamic_attached = true; - } + pr_debug("iommu map passed for PA=VA\n"); + mfd->splash_info.iommu_dynamic_attached = true; } - return rc; + ret = mdss_smmu_set_attribute(MDSS_IOMMU_DOMAIN_UNSECURE, EARLY_MAP, 0); +end: + mdata->handoff_pending = true; + + return ret; } static void mdss_mdp_splash_unmap_splash_mem(struct msm_fb_data_type *mfd) @@ -194,12 +209,10 @@ static void mdss_mdp_splash_unmap_splash_mem(struct msm_fb_data_type *mfd) struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); if (mfd->splash_info.iommu_dynamic_attached) { - mdss_smmu_unmap(MDSS_IOMMU_DOMAIN_UNSECURE, mdp5_data->splash_mem_addr, mdp5_data->splash_mem_size); mdss_iommu_ctrl(0); - mfd->splash_info.iommu_dynamic_attached = false; } } diff --git a/drivers/video/fbdev/msm/mdss_smmu.c b/drivers/video/fbdev/msm/mdss_smmu.c index 75f502415589..02e6d210b6e4 100644 --- a/drivers/video/fbdev/msm/mdss_smmu.c +++ b/drivers/video/fbdev/msm/mdss_smmu.c @@ -280,6 +280,27 @@ end: return rc; } +int mdss_smmu_set_attribute(int domain, int flag, int val) +{ + int rc = 0, domain_attr = 0; + struct mdss_smmu_client *mdss_smmu = mdss_smmu_get_cb(domain); + + if (!mdss_smmu) { + pr_err("not able to get smmu context\n"); + return -EINVAL; + } + + if (flag == EARLY_MAP) + domain_attr = DOMAIN_ATTR_EARLY_MAP; + else + goto end; + + rc = iommu_domain_set_attr(mdss_smmu->mmu_mapping->domain, + domain_attr, &val); +end: + return rc; +} + /* * mdss_smmu_attach_v2() * diff --git a/drivers/video/fbdev/msm/mdss_smmu.h b/drivers/video/fbdev/msm/mdss_smmu.h index a5c7af74cdbf..679e564bcbc9 100644 --- a/drivers/video/fbdev/msm/mdss_smmu.h +++ b/drivers/video/fbdev/msm/mdss_smmu.h @@ -48,6 +48,11 @@ struct mdss_smmu_private { void mdss_smmu_register(struct device *dev); int mdss_smmu_init(struct mdss_data_type *mdata, struct device *dev); +int mdss_smmu_set_attribute(int domain, int flag, int val); + +enum smmu_attributes { + EARLY_MAP +}; static inline int mdss_smmu_dma_data_direction(int dir) { |