From e3e12f52b214121840b44c91de5b3e5af5d3eb84 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 06 Nov 2023 03:04:41 +0000
Subject: [PATCH] rk3568 rt init

---
 kernel/drivers/tee/optee/supp.c |   22 +++++++++++++++++++++-
 1 files changed, 21 insertions(+), 1 deletions(-)

diff --git a/kernel/drivers/tee/optee/supp.c b/kernel/drivers/tee/optee/supp.c
index 43626e1..3e644a1 100644
--- a/kernel/drivers/tee/optee/supp.c
+++ b/kernel/drivers/tee/optee/supp.c
@@ -91,6 +91,9 @@
 	struct optee_supp_req *req = kzalloc(sizeof(*req), GFP_KERNEL);
 	bool interruptable;
 	u32 ret;
+	unsigned long timeleft;
+	int id;
+	struct optee_supp_req *get_req;
 
 	if (!req)
 		return TEEC_ERROR_OUT_OF_MEMORY;
@@ -115,8 +118,17 @@
 	 * exclusive access again.
 	 */
 	while (wait_for_completion_interruptible(&req->c)) {
+		pr_err("Warning, Interrupting an RPC to supplicant!\n");
+		timeleft = wait_for_completion_timeout(&req->c, msecs_to_jiffies(2000));
+		if (timeleft) {
+			/* get completion, it means tee-supplicant is alive. */
+			break;
+		} else {
+			/* timeout, it means tee-supplicant is dead, interrupting an RPC. */
+			interruptable = true;
+		}
+
 		mutex_lock(&supp->mutex);
-		interruptable = !supp->ctx;
 		if (interruptable) {
 			/*
 			 * There's no supplicant available and since the
@@ -135,6 +147,14 @@
 				list_del(&req->link);
 				req->in_queue = false;
 			}
+
+			idr_for_each_entry(&supp->idr, get_req, id) {
+				if (get_req == req) {
+					idr_remove(&supp->idr, id);
+					supp->req_id = -1;
+					break;
+				}
+			}
 		}
 		mutex_unlock(&supp->mutex);
 

--
Gitblit v1.6.2