diff options
| author | Guchun Chen <guchunc@codeaurora.org> | 2018-06-21 10:40:46 +0800 |
|---|---|---|
| committer | Guchun Chen <guchunc@codeaurora.org> | 2018-06-26 13:47:46 +0800 |
| commit | e7d10511017daa1caab3dab11cce91e2bf48a976 (patch) | |
| tree | d7f608236d4f93f592644c559d5871c1b1202310 | |
| parent | 4926f1bce00e57fdacf7edc40b791767f35398b3 (diff) | |
drm: msm: sde: move S1 smmu enablement earlier
Stage 1 translation enablement should be called after
user has finished early mapping for splash buffer.
Origianl sequence will bring potential race competition.
This change can avoid race condition happens.
CRs-Fixed: 2247983
Change-Id: I00ce034c5c54e06a2c1514faca22f9d65aca727f
Signed-off-by: Guchun Chen <guchunc@codeaurora.org>
| -rw-r--r-- | drivers/gpu/drm/msm/sde/sde_kms.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/sde/sde_splash.c | 27 |
2 files changed, 16 insertions, 26 deletions
diff --git a/drivers/gpu/drm/msm/sde/sde_kms.c b/drivers/gpu/drm/msm/sde/sde_kms.c index 86a5c23b5258..95ab14ffc3ac 100644 --- a/drivers/gpu/drm/msm/sde/sde_kms.c +++ b/drivers/gpu/drm/msm/sde/sde_kms.c @@ -1128,6 +1128,7 @@ static int _sde_kms_mmu_init(struct sde_kms *sde_kms) { struct msm_mmu *mmu; int i, ret; + int data = 0; for (i = 0; i < MSM_SMMU_DOMAIN_MAX; i++) { struct msm_gem_address_space *aspace; @@ -1188,6 +1189,20 @@ static int _sde_kms_mmu_init(struct sde_kms *sde_kms) msm_gem_address_space_put(aspace); goto fail; } + + /* + * Enable stage 1 smmu after user has finished early + * mapping of splash memory. + */ + ret = mmu->funcs->set_property(mmu, + DOMAIN_ATTR_EARLY_MAP, + &data); + if (ret) { + SDE_ERROR("failed to set map att(%d): %d\n", + data, ret); + msm_gem_address_space_put(aspace); + goto fail; + } } } diff --git a/drivers/gpu/drm/msm/sde/sde_splash.c b/drivers/gpu/drm/msm/sde/sde_splash.c index 9c3964e99c1f..3f9e70912ce6 100644 --- a/drivers/gpu/drm/msm/sde/sde_splash.c +++ b/drivers/gpu/drm/msm/sde/sde_splash.c @@ -856,17 +856,13 @@ int sde_splash_free_resource(struct msm_kms *kms, } /* - * In below function, it will - * 1. Notify LK to stop display splash. - * 2. Set DOMAIN_ATTR_EARLY_MAP to 1 to enable stage 1 translation in iommu. + * Below function will notify LK to stop display splash. */ int sde_splash_lk_stop_splash(struct msm_kms *kms, struct drm_atomic_state *state) { struct sde_splash_info *sinfo; - struct msm_mmu *mmu; struct sde_kms *sde_kms = to_sde_kms(kms); - int ret; sinfo = &sde_kms->splash_info; @@ -886,26 +882,5 @@ int sde_splash_lk_stop_splash(struct msm_kms *kms, } mutex_unlock(&sde_splash_lock); - if (!sde_kms->aspace[0] || !sde_kms->aspace[0]->mmu) { - /* We do not return fault value here, to ensure - * flag "lk_is_exited" is set. - */ - SDE_ERROR("invalid mmu\n"); - WARN_ON(1); - } else { - mmu = sde_kms->aspace[0]->mmu; - /* After LK has exited, set early domain map attribute - * to 1 to enable stage 1 translation in iommu driver. - */ - if (mmu->funcs && mmu->funcs->set_property) { - ret = mmu->funcs->set_property(mmu, - DOMAIN_ATTR_EARLY_MAP, - &sinfo->display_splash_enabled); - - if (ret) - SDE_ERROR("set_property failed\n"); - } - } - return 0; } |
