Loading drivers/gpu/drm/msm/sde/sde_crtc.c +106 −57 Original line number Diff line number Diff line Loading @@ -2024,6 +2024,93 @@ void sde_crtc_timeline_status(struct drm_crtc *crtc) sde_fence_timeline_status(&sde_crtc->output_fence, &crtc->base); } static int _sde_crtc_detach_all_cb(struct sde_kms *sde_kms) { u32 ret = 0; if (atomic_inc_return(&sde_kms->detach_all_cb) > 1) goto end; /* detach_all_contexts */ ret = sde_kms_mmu_detach(sde_kms, false); if (ret) { SDE_ERROR("failed to detach all cb ret:%d\n", ret); goto end; } ret = _sde_crtc_scm_call(VMID_CP_SEC_DISPLAY); if (ret) goto end; end: return ret; } static int _sde_crtc_attach_all_cb(struct sde_kms *sde_kms) { u32 ret = 0; if (atomic_dec_return(&sde_kms->detach_all_cb) != 0) goto end; ret = _sde_crtc_scm_call(VMID_CP_PIXEL); if (ret) goto end; /* attach_all_contexts */ ret = sde_kms_mmu_attach(sde_kms, false); if (ret) { SDE_ERROR("failed to attach all cb ret:%d\n", ret); goto end; } end: return ret; } static int _sde_crtc_detach_sec_cb(struct sde_kms *sde_kms) { u32 ret = 0; if (atomic_inc_return(&sde_kms->detach_sec_cb) > 1) goto end; /* detach secure_context */ ret = sde_kms_mmu_detach(sde_kms, true); if (ret) { SDE_ERROR("failed to detach sec cb ret:%d\n", ret); goto end; } ret = _sde_crtc_scm_call(VMID_CP_CAMERA_PREVIEW); if (ret) goto end; end: return ret; } static int _sde_crtc_attach_sec_cb(struct sde_kms *sde_kms) { u32 ret = 0; if (atomic_dec_return(&sde_kms->detach_sec_cb) != 0) goto end; ret = _sde_crtc_scm_call(VMID_CP_PIXEL); if (ret) goto end; ret = sde_kms_mmu_attach(sde_kms, true); if (ret) { SDE_ERROR("failed to attach sec cb ret:%d\n", ret); goto end; } end: return ret; } /** * sde_crtc_secure_ctrl - Initiates the operations to swtich between secure * and non-secure mode Loading Loading @@ -2063,85 +2150,47 @@ int sde_crtc_secure_ctrl(struct drm_crtc *crtc, bool post_commit) /* Bail out */ return 0; mutex_lock(&sde_kms->secure_transition_lock); /* Secure UI use case enable */ switch (smmu_state->state) { case DETACH_ALL_REQ: /* detach_all_contexts */ ret = sde_kms_mmu_detach(sde_kms, false); if (ret) { SDE_ERROR("crtc: %d, failed to detach %d\n", crtc->base.id, ret); goto error; } ret = _sde_crtc_scm_call(VMID_CP_SEC_DISPLAY); if (ret) goto error; ret = _sde_crtc_detach_all_cb(sde_kms); if (!ret) smmu_state->state = DETACHED; break; /* Secure UI use case disable */ case ATTACH_ALL_REQ: ret = _sde_crtc_scm_call(VMID_CP_PIXEL); if (ret) goto error; /* attach_all_contexts */ ret = sde_kms_mmu_attach(sde_kms, false); if (ret) { SDE_ERROR("crtc: %d, failed to attach %d\n", crtc->base.id, ret); goto error; } ret = _sde_crtc_attach_all_cb(sde_kms); if (!ret) smmu_state->state = ATTACHED; break; /* Secure preview enable */ case DETACH_SEC_REQ: /* detach secure_context */ ret = sde_kms_mmu_detach(sde_kms, true); if (ret) { SDE_ERROR("crtc: %d, failed to detach %d\n", crtc->base.id, ret); goto error; } ret = _sde_crtc_detach_sec_cb(sde_kms); if (!ret) smmu_state->state = DETACHED_SEC; ret = _sde_crtc_scm_call(VMID_CP_CAMERA_PREVIEW); if (ret) goto error; break; /* Secure preview disable */ case ATTACH_SEC_REQ: ret = _sde_crtc_scm_call(VMID_CP_PIXEL); if (ret) goto error; ret = sde_kms_mmu_attach(sde_kms, true); if (ret) { SDE_ERROR("crtc: %d, failed to attach %d\n", crtc->base.id, ret); goto error; } ret = _sde_crtc_attach_sec_cb(sde_kms); if (!ret) smmu_state->state = ATTACHED; break; default: SDE_ERROR("crtc:%d invalid smmu state:%d transition type:%d\n", crtc->base.id, smmu_state->state, smmu_state->transition_type); break; } mutex_unlock(&sde_kms->secure_transition_lock); SDE_DEBUG("crtc: %d, old_state %d new_state %d\n", crtc->base.id, old_smmu_state, smmu_state->state); smmu_state->transition_type = NONE; error: smmu_state->transition_type = NONE; smmu_state->transition_error = ret ? true : false; SDE_EVT32(DRMID(crtc), smmu_state->state, smmu_state->transition_type, smmu_state->transition_error, ret, SDE_EVTLOG_FUNC_EXIT); Loading drivers/gpu/drm/msm/sde/sde_kms.c +4 −0 Original line number Diff line number Diff line Loading @@ -3030,6 +3030,10 @@ static int sde_kms_hw_init(struct msm_kms *kms) dev->mode_config.max_width = sde_kms->catalog->max_display_width; dev->mode_config.max_height = sde_kms->catalog->max_display_height; mutex_init(&sde_kms->secure_transition_lock); atomic_set(&sde_kms->detach_sec_cb, 0); atomic_set(&sde_kms->detach_all_cb, 0); /* * Support format modifiers for compression etc. */ Loading drivers/gpu/drm/msm/sde/sde_kms.h +5 −1 Original line number Diff line number Diff line /* * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark <robdclark@gmail.com> * Loading Loading @@ -226,6 +226,10 @@ struct sde_kms { void **dp_displays; bool has_danger_ctrl; atomic_t detach_sec_cb; atomic_t detach_all_cb; struct mutex secure_transition_lock; }; struct vsync_info { Loading Loading
drivers/gpu/drm/msm/sde/sde_crtc.c +106 −57 Original line number Diff line number Diff line Loading @@ -2024,6 +2024,93 @@ void sde_crtc_timeline_status(struct drm_crtc *crtc) sde_fence_timeline_status(&sde_crtc->output_fence, &crtc->base); } static int _sde_crtc_detach_all_cb(struct sde_kms *sde_kms) { u32 ret = 0; if (atomic_inc_return(&sde_kms->detach_all_cb) > 1) goto end; /* detach_all_contexts */ ret = sde_kms_mmu_detach(sde_kms, false); if (ret) { SDE_ERROR("failed to detach all cb ret:%d\n", ret); goto end; } ret = _sde_crtc_scm_call(VMID_CP_SEC_DISPLAY); if (ret) goto end; end: return ret; } static int _sde_crtc_attach_all_cb(struct sde_kms *sde_kms) { u32 ret = 0; if (atomic_dec_return(&sde_kms->detach_all_cb) != 0) goto end; ret = _sde_crtc_scm_call(VMID_CP_PIXEL); if (ret) goto end; /* attach_all_contexts */ ret = sde_kms_mmu_attach(sde_kms, false); if (ret) { SDE_ERROR("failed to attach all cb ret:%d\n", ret); goto end; } end: return ret; } static int _sde_crtc_detach_sec_cb(struct sde_kms *sde_kms) { u32 ret = 0; if (atomic_inc_return(&sde_kms->detach_sec_cb) > 1) goto end; /* detach secure_context */ ret = sde_kms_mmu_detach(sde_kms, true); if (ret) { SDE_ERROR("failed to detach sec cb ret:%d\n", ret); goto end; } ret = _sde_crtc_scm_call(VMID_CP_CAMERA_PREVIEW); if (ret) goto end; end: return ret; } static int _sde_crtc_attach_sec_cb(struct sde_kms *sde_kms) { u32 ret = 0; if (atomic_dec_return(&sde_kms->detach_sec_cb) != 0) goto end; ret = _sde_crtc_scm_call(VMID_CP_PIXEL); if (ret) goto end; ret = sde_kms_mmu_attach(sde_kms, true); if (ret) { SDE_ERROR("failed to attach sec cb ret:%d\n", ret); goto end; } end: return ret; } /** * sde_crtc_secure_ctrl - Initiates the operations to swtich between secure * and non-secure mode Loading Loading @@ -2063,85 +2150,47 @@ int sde_crtc_secure_ctrl(struct drm_crtc *crtc, bool post_commit) /* Bail out */ return 0; mutex_lock(&sde_kms->secure_transition_lock); /* Secure UI use case enable */ switch (smmu_state->state) { case DETACH_ALL_REQ: /* detach_all_contexts */ ret = sde_kms_mmu_detach(sde_kms, false); if (ret) { SDE_ERROR("crtc: %d, failed to detach %d\n", crtc->base.id, ret); goto error; } ret = _sde_crtc_scm_call(VMID_CP_SEC_DISPLAY); if (ret) goto error; ret = _sde_crtc_detach_all_cb(sde_kms); if (!ret) smmu_state->state = DETACHED; break; /* Secure UI use case disable */ case ATTACH_ALL_REQ: ret = _sde_crtc_scm_call(VMID_CP_PIXEL); if (ret) goto error; /* attach_all_contexts */ ret = sde_kms_mmu_attach(sde_kms, false); if (ret) { SDE_ERROR("crtc: %d, failed to attach %d\n", crtc->base.id, ret); goto error; } ret = _sde_crtc_attach_all_cb(sde_kms); if (!ret) smmu_state->state = ATTACHED; break; /* Secure preview enable */ case DETACH_SEC_REQ: /* detach secure_context */ ret = sde_kms_mmu_detach(sde_kms, true); if (ret) { SDE_ERROR("crtc: %d, failed to detach %d\n", crtc->base.id, ret); goto error; } ret = _sde_crtc_detach_sec_cb(sde_kms); if (!ret) smmu_state->state = DETACHED_SEC; ret = _sde_crtc_scm_call(VMID_CP_CAMERA_PREVIEW); if (ret) goto error; break; /* Secure preview disable */ case ATTACH_SEC_REQ: ret = _sde_crtc_scm_call(VMID_CP_PIXEL); if (ret) goto error; ret = sde_kms_mmu_attach(sde_kms, true); if (ret) { SDE_ERROR("crtc: %d, failed to attach %d\n", crtc->base.id, ret); goto error; } ret = _sde_crtc_attach_sec_cb(sde_kms); if (!ret) smmu_state->state = ATTACHED; break; default: SDE_ERROR("crtc:%d invalid smmu state:%d transition type:%d\n", crtc->base.id, smmu_state->state, smmu_state->transition_type); break; } mutex_unlock(&sde_kms->secure_transition_lock); SDE_DEBUG("crtc: %d, old_state %d new_state %d\n", crtc->base.id, old_smmu_state, smmu_state->state); smmu_state->transition_type = NONE; error: smmu_state->transition_type = NONE; smmu_state->transition_error = ret ? true : false; SDE_EVT32(DRMID(crtc), smmu_state->state, smmu_state->transition_type, smmu_state->transition_error, ret, SDE_EVTLOG_FUNC_EXIT); Loading
drivers/gpu/drm/msm/sde/sde_kms.c +4 −0 Original line number Diff line number Diff line Loading @@ -3030,6 +3030,10 @@ static int sde_kms_hw_init(struct msm_kms *kms) dev->mode_config.max_width = sde_kms->catalog->max_display_width; dev->mode_config.max_height = sde_kms->catalog->max_display_height; mutex_init(&sde_kms->secure_transition_lock); atomic_set(&sde_kms->detach_sec_cb, 0); atomic_set(&sde_kms->detach_all_cb, 0); /* * Support format modifiers for compression etc. */ Loading
drivers/gpu/drm/msm/sde/sde_kms.h +5 −1 Original line number Diff line number Diff line /* * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark <robdclark@gmail.com> * Loading Loading @@ -226,6 +226,10 @@ struct sde_kms { void **dp_displays; bool has_danger_ctrl; atomic_t detach_sec_cb; atomic_t detach_all_cb; struct mutex secure_transition_lock; }; struct vsync_info { Loading