Unverified Commit 30c577a8 authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

Merge tag 'optee-notif-wait-timeout-for-v6.11' of...

Merge tag 'optee-notif-wait-timeout-for-v6.11' of https://git.linaro.org/people/jens.wiklander/linux-tee into soc/drivers

optee: add timeout parameter for notification wait

* tag 'optee-notif-wait-timeout-for-v6.11' of https://git.linaro.org/people/jens.wiklander/linux-tee:
  optee: add timeout value to optee_notif_wait() to support timeout

Link: https://lore.kernel.org/r/20240627095325.GA2585076@rayden


Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents f42af02c 14ca6401
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -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);
	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);
+4 −1
Original line number Diff line number Diff line
@@ -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,
+1 −0
Original line number Diff line number Diff line
@@ -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
+8 −2
Original line number Diff line number Diff line
@@ -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,6 +156,9 @@ static void handle_rpc_func_cmd_wq(struct optee *optee,
	arg->ret = TEEC_SUCCESS;
	return;
bad:
	if (rc == -ETIMEDOUT)
		arg->ret = TEE_ERROR_TIMEOUT;
	else
		arg->ret = TEEC_ERROR_BAD_PARAMETERS;
}