summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorqctecmdr <qctecmdr@localhost>2020-12-08 06:02:54 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2020-12-08 06:02:54 -0800
commit35e5304089c5793976e14dd4d7882f08c1f8bcc6 (patch)
tree3212da16c813e070ed6d9a3da151f5875f107d95
parent8d51384c716e2c7e6ce50e17b026ec5f3c4c06c9 (diff)
parent019688fd3f9143d876aa4867cb3b5676c1d24d53 (diff)
downloaddisplay-drivers-35e5304089c5793976e14dd4d7882f08c1f8bcc6.tar.gz
Merge "disp: msm: sde: add secure session flag in sde_crtc state"
-rw-r--r--msm/sde/sde_crtc.c106
-rw-r--r--msm/sde/sde_crtc.h18
2 files changed, 110 insertions, 14 deletions
diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c
index 3a5988a5..696dbff2 100644
--- a/msm/sde/sde_crtc.c
+++ b/msm/sde/sde_crtc.c
@@ -1725,8 +1725,12 @@ int sde_crtc_state_find_plane_fb_modes(struct drm_crtc_state *state,
static void _sde_drm_fb_sec_dir_trans(
struct sde_kms_smmu_state_data *smmu_state, uint32_t secure_level,
- struct sde_mdss_cfg *catalog, bool old_valid_fb, int *ops)
+ struct sde_mdss_cfg *catalog, bool old_valid_fb, int *ops,
+ struct drm_crtc_state *old_crtc_state)
{
+ struct sde_crtc_state *old_cstate = to_sde_crtc_state(old_crtc_state);
+ int old_secure_session = old_cstate->secure_session;
+
/* secure display usecase */
if ((smmu_state->state == ATTACHED)
&& (secure_level == SDE_DRM_SEC_ONLY)) {
@@ -1747,6 +1751,10 @@ static void _sde_drm_fb_sec_dir_trans(
smmu_state->secure_level = secure_level;
smmu_state->transition_type = PRE_COMMIT;
*ops |= SDE_KMS_OPS_SECURE_STATE_CHANGE;
+ if (old_secure_session ==
+ SDE_SECURE_VIDEO_SESSION)
+ *ops |= (SDE_KMS_OPS_WAIT_FOR_TX_DONE |
+ SDE_KMS_OPS_CLEANUP_PLANE_FB);
}
}
@@ -1872,7 +1880,7 @@ int sde_crtc_get_secure_transition_ops(struct drm_crtc *crtc,
switch (translation_mode) {
case SDE_DRM_FB_SEC_DIR_TRANS:
_sde_drm_fb_sec_dir_trans(smmu_state, secure_level,
- catalog, old_valid_fb, &ops);
+ catalog, old_valid_fb, &ops, old_crtc_state);
if (clone_mode && (ops & SDE_KMS_OPS_SECURE_STATE_CHANGE))
ops |= SDE_KMS_OPS_WAIT_FOR_TX_DONE;
break;
@@ -4347,6 +4355,55 @@ static int _sde_crtc_check_secure_single_encoder(struct drm_crtc *crtc,
return 0;
}
+static int _sde_crtc_check_secure_transition(struct drm_crtc *crtc,
+ struct drm_crtc_state *state, bool is_video_mode)
+{
+ struct sde_crtc_state *old_cstate = to_sde_crtc_state(crtc->state);
+ struct sde_crtc_state *new_cstate = to_sde_crtc_state(state);
+ int old_secure_session = old_cstate->secure_session;
+ int new_secure_session = new_cstate->secure_session;
+ int ret = 0;
+
+ /*
+ * Direct transition from Secure Camera to Secure UI(&viceversa)
+ * is not allowed
+ */
+ if ((old_secure_session == SDE_SECURE_CAMERA_SESSION &&
+ new_secure_session == SDE_SECURE_UI_SESSION) ||
+ (old_secure_session == SDE_SECURE_UI_SESSION &&
+ new_secure_session == SDE_SECURE_CAMERA_SESSION)) {
+ SDE_EVT32(DRMID(crtc), old_secure_session,
+ new_secure_session, SDE_EVTLOG_ERROR);
+ ret = -EINVAL;
+ }
+
+ /*
+ * In video mode, null commit is required for transition between
+ * secure video & secure camera
+ */
+ if (is_video_mode &&
+ ((old_secure_session == SDE_SECURE_CAMERA_SESSION &&
+ new_secure_session == SDE_SECURE_VIDEO_SESSION) ||
+ (old_secure_session == SDE_SECURE_VIDEO_SESSION &&
+ new_secure_session == SDE_SECURE_CAMERA_SESSION))) {
+ SDE_EVT32(DRMID(crtc), old_secure_session,
+ new_secure_session, SDE_EVTLOG_ERROR);
+ ret = -EINVAL;
+ }
+
+ if (old_secure_session != new_secure_session)
+ SDE_EVT32(DRMID(crtc), old_secure_session,
+ new_secure_session);
+
+ SDE_DEBUG("old session: %d new session : %d\n",
+ old_secure_session, new_secure_session);
+ if (ret)
+ SDE_ERROR("invalid transition old:%d new:%d\n",
+ old_secure_session, new_secure_session);
+
+ return ret;
+}
+
static int _sde_crtc_check_secure_state_smmu_translation(struct drm_crtc *crtc,
struct drm_crtc_state *state, struct sde_kms *sde_kms, int secure,
int fb_ns, int fb_sec, int fb_sec_dir)
@@ -4361,19 +4418,8 @@ static int _sde_crtc_check_secure_state_smmu_translation(struct drm_crtc *crtc,
MSM_DISPLAY_VIDEO_MODE);
}
- /*
- * Secure display to secure camera needs without direct
- * transition is currently not allowed
- */
- if (fb_sec_dir && secure == SDE_DRM_SEC_NON_SEC &&
- smmu_state->state != ATTACHED &&
- smmu_state->secure_level == SDE_DRM_SEC_ONLY) {
-
- SDE_EVT32(DRMID(crtc), fb_ns, fb_sec_dir,
- smmu_state->state, smmu_state->secure_level,
- secure);
+ if (_sde_crtc_check_secure_transition(crtc, state, is_video_mode))
goto sec_err;
- }
/*
* In video mode check for null commit before transition
@@ -4439,6 +4485,33 @@ static int _sde_crtc_check_secure_conn(struct drm_crtc *crtc,
return 0;
}
+static int _sde_crtc_populate_secure_session(struct drm_crtc_state *state,
+ int secure, int fb_ns, int fb_sec, int fb_sec_dir)
+{
+ struct sde_crtc_state *cstate = to_sde_crtc_state(state);
+
+ if (secure == SDE_DRM_SEC_ONLY && fb_sec_dir && !fb_sec && !fb_ns)
+ cstate->secure_session = SDE_SECURE_UI_SESSION;
+ else if (secure == SDE_DRM_SEC_NON_SEC && fb_sec_dir && !fb_sec)
+ cstate->secure_session = SDE_SECURE_CAMERA_SESSION;
+ else if (secure == SDE_DRM_SEC_NON_SEC && !fb_sec_dir && fb_sec)
+ cstate->secure_session = SDE_SECURE_VIDEO_SESSION;
+ else if (secure == SDE_DRM_SEC_NON_SEC && !fb_sec_dir &&
+ !fb_sec && fb_ns)
+ cstate->secure_session = SDE_NON_SECURE_SESSION;
+ else if (!fb_sec_dir && !fb_sec && !fb_ns)
+ cstate->secure_session = SDE_NULL_SESSION;
+ else {
+ SDE_ERROR(
+ "invalid session sec:%d fb_sec_dir:%d fb_sec:%d fb_ns:%d\n",
+ cstate->secure_session, fb_sec_dir,
+ fb_sec, fb_ns);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
static int _sde_crtc_check_secure_state(struct drm_crtc *crtc,
struct drm_crtc_state *state, struct plane_state pstates[],
int cnt)
@@ -4469,6 +4542,11 @@ static int _sde_crtc_check_secure_state(struct drm_crtc *crtc,
if (rc)
return rc;
+ rc = _sde_crtc_populate_secure_session(state, secure,
+ fb_ns, fb_sec, fb_sec_dir);
+ if (rc)
+ return rc;
+
rc = _sde_crtc_check_secure_blend_config(crtc, state, pstates, cstate,
sde_kms, cnt, secure, fb_ns, fb_sec, fb_sec_dir);
if (rc)
diff --git a/msm/sde/sde_crtc.h b/msm/sde/sde_crtc.h
index 8ac8b9b0..cb93c90f 100644
--- a/msm/sde/sde_crtc.h
+++ b/msm/sde/sde_crtc.h
@@ -36,6 +36,22 @@
#define SDE_CRTC_FRAME_EVENT_SIZE (4 * 2)
/**
+ * enum sde_session_type: session type
+ * @SDE_SECURE_UI_SESSION: secure UI usecase
+ * @SDE_SECURE_CAMERA_SESSION: secure camera usecase
+ * @SDE_SECURE_VIDEO_SESSION: secure video usecase
+ * @SDE_NON_SECURE_SESSION: non secure usecase
+ * @SDE_NULL_SESSION: null commit usecase
+ */
+enum sde_session_type {
+ SDE_SECURE_UI_SESSION,
+ SDE_SECURE_CAMERA_SESSION,
+ SDE_SECURE_VIDEO_SESSION,
+ SDE_NON_SECURE_SESSION,
+ SDE_NULL_SESSION,
+};
+
+/**
* enum sde_crtc_client_type: crtc client type
* @RT_CLIENT: RealTime client like video/cmd mode display
* voting through apps rsc
@@ -384,6 +400,7 @@ struct sde_crtc {
* @ds_cfg: Destination scaler config
* @scl3_lut_cfg: QSEED3 lut config
* @new_perf: new performance state being requested
+ * @secure_session: Indicates the type of secure session
*/
struct sde_crtc_state {
struct drm_crtc_state base;
@@ -413,6 +430,7 @@ struct sde_crtc_state {
struct sde_hw_scaler3_lut_cfg scl3_lut_cfg;
struct sde_core_perf_params new_perf;
+ int secure_session;
};
enum sde_crtc_irq_state {