disp: msm: sde: accept and reclaim resources on user prompt

Currently, trusted VM accepts and releases the resources
on RM notifications.

In cases, where TUI fails to submit the first frame on the trusted
vm, display cannot rely on the teardown commit IOCTL to release the
resources back to primary VM.

To handle scenarios where RM notification drops, the VM's should be
able to ACCEPT/RECLAIM resources without relying on the RM.

To address above scenarios, this change moves the resource handling
calls from notification handlers to user prompt. With this change,
trusted VM will ACCEPT the resource only on the first frame commit and
primary VM can RECLAIM the resources back if the TUI use case fails
or any of the RM notifications fail to deliver.

Change-Id: Iebb1724a7558e52567f8af1a49e38f8adbec88a0
Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
This commit is contained in:
Jeykumar Sankaran
2020-08-11 09:58:04 -07:00
committed by Gerrit - the friendly Code Review server
부모 de8c973a73
커밋 9de6eee40e
5개의 변경된 파일364개의 추가작업 그리고 251개의 파일을 삭제

파일 보기

@@ -1358,11 +1358,13 @@ int sde_kms_vm_trusted_post_commit(struct sde_kms *sde_kms,
sde_hw_set_lutdma_sid(sde_kms->hw_sid, 0);
sde_kms_vm_trusted_resource_deinit(sde_kms);
sde_vm_lock(sde_kms);
if (vm_ops->vm_release)
rc = vm_ops->vm_release(sde_kms);
sde_vm_unlock(sde_kms);
return rc;
}
@@ -1438,12 +1440,15 @@ int sde_kms_vm_primary_post_commit(struct sde_kms *sde_kms,
}
}
sde_vm_lock(sde_kms);
/* release HW */
if (vm_ops->vm_release) {
rc = vm_ops->vm_release(sde_kms);
if (rc)
SDE_ERROR("sde vm assign failed, rc=%d\n", rc);
}
sde_vm_unlock(sde_kms);
exit:
return rc;
}
@@ -2675,6 +2680,38 @@ static int sde_kms_check_secure_transition(struct msm_kms *kms,
return 0;
}
static void sde_kms_vm_res_release(struct msm_kms *kms,
struct drm_atomic_state *state)
{
struct drm_crtc *crtc;
struct drm_crtc_state *crtc_state;
struct sde_vm_ops *vm_ops;
enum sde_crtc_vm_req vm_req;
struct sde_kms *sde_kms = to_sde_kms(kms);
int i;
for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
struct sde_crtc_state *cstate;
cstate = to_sde_crtc_state(state->crtcs[0].new_state);
vm_req = sde_crtc_get_property(cstate, CRTC_PROP_VM_REQ_STATE);
if (vm_req != VM_REQ_ACQUIRE)
return;
}
vm_ops = sde_vm_get_ops(sde_kms);
if (!vm_ops)
return;
sde_vm_lock(sde_kms);
if (vm_ops->vm_acquire_fail_handler)
vm_ops->vm_acquire_fail_handler(sde_kms);
sde_vm_unlock(sde_kms);
}
static int sde_kms_atomic_check(struct msm_kms *kms,
struct drm_atomic_state *state)
{
@@ -2695,9 +2732,15 @@ static int sde_kms_atomic_check(struct msm_kms *kms,
goto end;
}
ret = sde_kms_check_vm_request(kms, state);
if (ret) {
SDE_ERROR("vm switch request checks failed\n");
goto end;
}
ret = drm_atomic_helper_check(dev, state);
if (ret)
goto end;
goto vm_clean_up;
/*
* Check if any secure transition(moving CRTC between secure and
* non-secure state and vice-versa) is allowed or not. when moving
@@ -2707,12 +2750,12 @@ static int sde_kms_atomic_check(struct msm_kms *kms,
*/
ret = sde_kms_check_secure_transition(kms, state);
if (ret)
goto end;
goto vm_clean_up;
ret = sde_kms_check_vm_request(kms, state);
if (ret)
SDE_ERROR("vm switch request checks failed\n");
goto end;
vm_clean_up:
sde_kms_vm_res_release(kms, state);
end:
SDE_ATRACE_END("atomic_check");
return ret;
@@ -4454,7 +4497,6 @@ int sde_kms_vm_trusted_resource_init(struct sde_kms *sde_kms)
struct msm_drm_private *priv;
struct sde_splash_display *handoff_display;
struct dsi_display *display;
struct sde_vm_ops *vm_ops;
int ret, i;
if (!sde_kms || !sde_kms->dev || !sde_kms->dev->dev_private) {
@@ -4462,13 +4504,6 @@ int sde_kms_vm_trusted_resource_init(struct sde_kms *sde_kms)
return -EINVAL;
}
vm_ops = sde_vm_get_ops(sde_kms);
if (vm_ops && !vm_ops->vm_owns_hw(sde_kms)) {
SDE_DEBUG(
"skipping sde res init as device assign is not completed\n");
return 0;
}
if (sde_kms->dsi_display_count != 1) {
SDE_ERROR("no. of displays not supported:%d\n",
sde_kms->dsi_display_count);