Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 26b6ae2d authored by Veera Sundaram Sankaran's avatar Veera Sundaram Sankaran
Browse files

disp: msm: sde: fix Trusted-ui state transition check



Fix the checks done as part of the trsuted-ui transition.
Allow full validation to go through whenever the new vm request
or old vm request is not NONE. Split the checks and the vm acquire,
so vm acquire can be done after all necessary checks are over.

Change-Id: I91165010ad110193c2ca3947af8c6504cd259919
Signed-off-by: default avatarVeera Sundaram Sankaran <veeras@codeaurora.org>
parent 9fadc353
Loading
Loading
Loading
Loading
+48 −20
Original line number Diff line number Diff line
@@ -2502,6 +2502,12 @@ static int sde_kms_check_vm_request(struct msm_kms *kms,
	if (!vm_ops)
		return 0;

	if (!vm_ops->vm_request_valid || !vm_ops->vm_owns_hw ||
				!vm_ops->vm_acquire)
		return -EINVAL;

	sde_vm_lock(sde_kms);

	for_each_oldnew_crtc_in_state(state, crtc, old_cstate, new_cstate, i) {
		struct sde_crtc_state *old_state = NULL, *new_state = NULL;

@@ -2516,12 +2522,27 @@ static int sde_kms_check_vm_request(struct msm_kms *kms,
		old_vm_req = sde_crtc_get_property(old_state,
				CRTC_PROP_VM_REQ_STATE);

		/**
		/*
		 * No active request if the transition is from
		 * VM_REQ_NONE to VM_REQ_NONE
		 */
		if (new_vm_req || old_vm_req)
		if (old_vm_req || new_vm_req) {
			rc = vm_ops->vm_request_valid(sde_kms,
					old_vm_req, new_vm_req);
			if (rc) {
				SDE_ERROR(
				"VM transition check failed; o_state:%d, n_state:%d, hw_owner:%d, rc:%d\n",
					old_vm_req, new_vm_req,
					vm_ops->vm_owns_hw(sde_kms), rc);
				goto end;
			} else if (old_vm_req == VM_REQ_ACQUIRE &&
					new_vm_req == VM_REQ_NONE) {
				SDE_DEBUG(
				"VM transition valid; ignore further checks\n");
			} else {
				vm_req_active = true;
			}
		}

		idle_pc_state = sde_crtc_get_property(new_state,
						CRTC_PROP_IDLE_PC_STATE);
@@ -2530,6 +2551,10 @@ static int sde_kms_check_vm_request(struct msm_kms *kms,
		commit_crtc_cnt++;
	}

	/* return early if no active vm request */
	if (!vm_req_active)
		goto end;

	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
		if (!crtc->state->active)
			continue;
@@ -2539,36 +2564,39 @@ static int sde_kms_check_vm_request(struct msm_kms *kms,
	}

	/* Check for single crtc commits only on valid VM requests */
	if (vm_req_active && active_crtc && global_active_crtc &&
	if (active_crtc && global_active_crtc &&
		(commit_crtc_cnt > sde_kms->catalog->max_trusted_vm_displays ||
		 global_crtc_cnt > sde_kms->catalog->max_trusted_vm_displays ||
		 active_crtc != global_active_crtc)) {
		SDE_ERROR(
			   "failed to switch VM due to CRTC concurrencies: MAX_CNT: %d active_cnt: %d global_cnt: %d active_crtc: %d global_crtc: %d\n",
		"VM switch failed; MAX:%d a_cnt:%d g_cnt:%d a_crtc:%d g_crtc:%d\n",
			   sde_kms->catalog->max_trusted_vm_displays,
			   commit_crtc_cnt, global_crtc_cnt, active_crtc,
			   global_active_crtc);
		return -E2BIG;
			   commit_crtc_cnt, global_crtc_cnt, DRMID(active_crtc),
			   DRMID(global_active_crtc));
		rc = -E2BIG;
		goto end;
	}

	if (!vm_req_active)
		return 0;

	/* disable idle-pc before releasing the HW */
	if ((new_vm_req == VM_REQ_RELEASE) &&
			(idle_pc_state == IDLE_PC_ENABLE)) {
		SDE_ERROR("failed to switch VM since idle-pc is enabled\n");
		return -EINVAL;
		SDE_ERROR("VM switch failed since idle-pc is enabled\n");
		rc = -EINVAL;
		goto end;
	}

	sde_vm_lock(sde_kms);

	if (vm_ops->vm_request_valid)
		rc = vm_ops->vm_request_valid(sde_kms, old_vm_req, new_vm_req);
	if (rc)
	if ((new_vm_req == VM_REQ_ACQUIRE) && !vm_ops->vm_owns_hw(sde_kms)) {
		rc = vm_ops->vm_acquire(sde_kms);
		if (rc) {
			SDE_ERROR(
		"failed to complete vm transition request. old_state = %d, new_state = %d, hw_ownership: %d\n",
		old_vm_req, new_vm_req, vm_ops->vm_owns_hw(sde_kms));
			"VM acquire failed; o_state:%d, n_state:%d, hw_owner:%d, rc:%d\n",
				old_vm_req, new_vm_req,
				vm_ops->vm_owns_hw(sde_kms), rc);
			goto end;
		}
	}

end:
	sde_vm_unlock(sde_kms);

	return rc;
+1 −7
Original line number Diff line number Diff line
@@ -306,14 +306,8 @@ int sde_vm_request_valid(struct sde_kms *sde_kms,
			rc = -EINVAL;
		break;
	case VM_REQ_ACQUIRE:
		if (old_state != VM_REQ_RELEASE) {
		if (old_state != VM_REQ_RELEASE)
			rc = -EINVAL;
		} else if (!vm_ops->vm_owns_hw(sde_kms)) {
			if (vm_ops->vm_acquire)
				rc = vm_ops->vm_acquire(sde_kms);
			else
				rc = -EINVAL;
		}
		break;
	default:
		SDE_ERROR("invalid vm request\n");