disp: msm: sde: revert to previous smmu state upon failure to switch
This change saves the previous state before moving into the transitional smmu state, during secure-display/secure-camera usecases. Upon failure to complete the transition, set smmu state to the previous state. Previously, smmu state was staying in transitional state. Change-Id: I1a78ddcf6ac1c7ea66c8c2095cd1a6d6160647a1 Signed-off-by: Samantha Tran <samtran@codeaurora.org>
This commit is contained in:
@@ -1781,6 +1781,8 @@ int sde_crtc_get_secure_transition_ops(struct drm_crtc *crtc,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
smmu_state = &sde_kms->smmu_state;
|
smmu_state = &sde_kms->smmu_state;
|
||||||
|
smmu_state->prev_state = smmu_state->state;
|
||||||
|
|
||||||
sde_crtc = to_sde_crtc(crtc);
|
sde_crtc = to_sde_crtc(crtc);
|
||||||
secure_level = sde_crtc_get_secure_level(crtc, crtc->state);
|
secure_level = sde_crtc_get_secure_level(crtc, crtc->state);
|
||||||
catalog = sde_kms->catalog;
|
catalog = sde_kms->catalog;
|
||||||
|
@@ -528,12 +528,24 @@ static int _sde_kms_secure_ctrl(struct sde_kms *sde_kms, struct drm_crtc *crtc,
|
|||||||
end:
|
end:
|
||||||
smmu_state->sui_misr_state = NONE;
|
smmu_state->sui_misr_state = NONE;
|
||||||
smmu_state->transition_type = NONE;
|
smmu_state->transition_type = NONE;
|
||||||
smmu_state->transition_error = ret ? true : false;
|
smmu_state->transition_error = false;
|
||||||
|
|
||||||
SDE_DEBUG("crtc %d: old_state %d, new_state %d, sec_lvl %d, ret %d\n",
|
/*
|
||||||
DRMID(crtc), old_smmu_state, smmu_state->state,
|
* If switch failed, toggling secure_level is enough since
|
||||||
smmu_state->secure_level, ret);
|
* there are only two secure levels - secure/non-secure
|
||||||
SDE_EVT32(DRMID(crtc), smmu_state->state, smmu_state->transition_type,
|
*/
|
||||||
|
if (ret) {
|
||||||
|
smmu_state->transition_error = true;
|
||||||
|
smmu_state->state = smmu_state->prev_state;
|
||||||
|
smmu_state->secure_level = !smmu_state->secure_level;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDE_DEBUG(
|
||||||
|
"crtc %d: old_state %d, req_state %d, new_state %d, sec_lvl %d, ret %d\n",
|
||||||
|
DRMID(crtc), smmu_state->prev_state, old_smmu_state,
|
||||||
|
smmu_state->state, smmu_state->secure_level, ret);
|
||||||
|
SDE_EVT32(DRMID(crtc), smmu_state->prev_state,
|
||||||
|
smmu_state->state, smmu_state->transition_type,
|
||||||
smmu_state->transition_error, smmu_state->secure_level,
|
smmu_state->transition_error, smmu_state->secure_level,
|
||||||
smmu_state->sui_misr_state, ret, SDE_EVTLOG_FUNC_EXIT);
|
smmu_state->sui_misr_state, ret, SDE_EVTLOG_FUNC_EXIT);
|
||||||
|
|
||||||
|
@@ -187,12 +187,14 @@ enum frame_trigger_mode_type {
|
|||||||
/**
|
/**
|
||||||
* struct sde_kms_smmu_state_data: stores the smmu state and transition type
|
* struct sde_kms_smmu_state_data: stores the smmu state and transition type
|
||||||
* @state: current state of smmu context banks
|
* @state: current state of smmu context banks
|
||||||
|
* @prev_state: previous state of smmu context banks
|
||||||
* @secure_level: secure level cached from crtc
|
* @secure_level: secure level cached from crtc
|
||||||
* @transition_type: transition request type
|
* @transition_type: transition request type
|
||||||
* @transition_error: whether there is error while transitioning the state
|
* @transition_error: whether there is error while transitioning the state
|
||||||
*/
|
*/
|
||||||
struct sde_kms_smmu_state_data {
|
struct sde_kms_smmu_state_data {
|
||||||
uint32_t state;
|
uint32_t state;
|
||||||
|
uint32_t prev_state;
|
||||||
uint32_t secure_level;
|
uint32_t secure_level;
|
||||||
uint32_t transition_type;
|
uint32_t transition_type;
|
||||||
uint32_t transition_error;
|
uint32_t transition_error;
|
||||||
|
Reference in New Issue
Block a user