]> Git Repo - J-linux.git/commitdiff
optee: add timeout value to optee_notif_wait() to support timeout
authorGavin Liu <[email protected]>
Tue, 7 May 2024 02:00:37 +0000 (10:00 +0800)
committerJens Wiklander <[email protected]>
Thu, 30 May 2024 08:19:28 +0000 (10:19 +0200)
Add timeout value to support self waking when timeout to avoid waiting
indefinitely.

Signed-off-by: Gavin Liu <[email protected]>
Reviewed-by: Sumit Garg <[email protected]>
Signed-off-by: Jens Wiklander <[email protected]>
drivers/tee/optee/notif.c
drivers/tee/optee/optee_private.h
drivers/tee/optee/optee_rpc_cmd.h
drivers/tee/optee/rpc.c

index 05212842b0a50f5498f79a8c7f99d41937ce01ad..d5e5c06456093396c64e234d700a02bc0e1ae9ec 100644 (file)
@@ -29,7 +29,7 @@ static bool have_key(struct optee *optee, u_int key)
        return false;
 }
 
-int optee_notif_wait(struct optee *optee, u_int key)
+int optee_notif_wait(struct optee *optee, u_int key, u32 timeout)
 {
        unsigned long flags;
        struct notif_entry *entry;
@@ -70,7 +70,12 @@ int optee_notif_wait(struct optee *optee, u_int key)
         * Unlock temporarily and wait for completion.
         */
        spin_unlock_irqrestore(&optee->notif.lock, flags);
-       wait_for_completion(&entry->c);
+       if (timeout != 0) {
+               if (!wait_for_completion_timeout(&entry->c, timeout))
+                       rc = -ETIMEDOUT;
+       } else {
+               wait_for_completion(&entry->c);
+       }
        spin_lock_irqsave(&optee->notif.lock, flags);
 
        list_del(&entry->link);
index 7a5243c78b55ee1c012b271c538ada48175affff..3f08c949b988113c77e8873d2c96b78540e3d509 100644 (file)
@@ -26,6 +26,9 @@
 #define TEEC_ERROR_BUSY                        0xFFFF000D
 #define TEEC_ERROR_SHORT_BUFFER                0xFFFF0010
 
+/* API Return Codes are from the GP TEE Internal Core API Specification */
+#define TEE_ERROR_TIMEOUT              0xFFFF3001
+
 #define TEEC_ORIGIN_COMMS              0x00000002
 
 /*
@@ -252,7 +255,7 @@ struct optee_call_ctx {
 
 int optee_notif_init(struct optee *optee, u_int max_key);
 void optee_notif_uninit(struct optee *optee);
-int optee_notif_wait(struct optee *optee, u_int key);
+int optee_notif_wait(struct optee *optee, u_int key, u32 timeout);
 int optee_notif_send(struct optee *optee, u_int key);
 
 u32 optee_supp_thrd_req(struct tee_context *ctx, u32 func, size_t num_params,
index f3f06e0994a751ee2c4d8542d24d082b3ac4f4e6..4576751b490c347670fbbcf071f503637d2a2953 100644 (file)
@@ -41,6 +41,7 @@
  * Waiting on notification
  * [in]    value[0].a      OPTEE_RPC_NOTIFICATION_WAIT
  * [in]    value[0].b      notification value
+ * [in]    value[0].c      timeout in milliseconds or 0 if no timeout
  *
  * Sending a synchronous notification
  * [in]    value[0].a      OPTEE_RPC_NOTIFICATION_SEND
index e69bc6380683af8b0bb9932ca8986d490acf756d..13f63c0a7f049bdd017d181b07ca21c24b0ecaf2 100644 (file)
@@ -130,6 +130,8 @@ static void handle_rpc_func_cmd_i2c_transfer(struct tee_context *ctx,
 static void handle_rpc_func_cmd_wq(struct optee *optee,
                                   struct optee_msg_arg *arg)
 {
+       int rc = 0;
+
        if (arg->num_params != 1)
                goto bad;
 
@@ -139,7 +141,8 @@ static void handle_rpc_func_cmd_wq(struct optee *optee,
 
        switch (arg->params[0].u.value.a) {
        case OPTEE_RPC_NOTIFICATION_WAIT:
-               if (optee_notif_wait(optee, arg->params[0].u.value.b))
+               rc = optee_notif_wait(optee, arg->params[0].u.value.b, arg->params[0].u.value.c);
+               if (rc)
                        goto bad;
                break;
        case OPTEE_RPC_NOTIFICATION_SEND:
@@ -153,7 +156,10 @@ static void handle_rpc_func_cmd_wq(struct optee *optee,
        arg->ret = TEEC_SUCCESS;
        return;
 bad:
-       arg->ret = TEEC_ERROR_BAD_PARAMETERS;
+       if (rc == -ETIMEDOUT)
+               arg->ret = TEE_ERROR_TIMEOUT;
+       else
+               arg->ret = TEEC_ERROR_BAD_PARAMETERS;
 }
 
 static void handle_rpc_func_cmd_wait(struct optee_msg_arg *arg)
This page took 0.055696 seconds and 4 git commands to generate.