From patchwork Mon Mar 20 16:27:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Etienne Carriere X-Patchwork-Id: 72275 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:604a:0:0:0:0:0 with SMTP id j10csp1316622wrt; Mon, 20 Mar 2023 09:41:05 -0700 (PDT) X-Google-Smtp-Source: AK7set/laxNbB9ofXDojD94N80Iv34AaESTpXNjYLW2uShqQcSXrOSvALf+9beLTqnVy0KS/K8JI X-Received: by 2002:a17:90b:1c0d:b0:23d:2d91:ab71 with SMTP id oc13-20020a17090b1c0d00b0023d2d91ab71mr20385450pjb.6.1679330465558; Mon, 20 Mar 2023 09:41:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679330465; cv=none; d=google.com; s=arc-20160816; b=FCv9o6hYhWlCOLKkS8PC6AGCG/Go2BIMys8dv4B0S5EpdUeZdsQ4uIZnfF3hLZhJV+ o2icWNsFXtCj4/5V2/JB9THi+jD13TDIat0ABnEHHhsESt3jWZTyrJAw769F6aKqWlH4 1ceFCuQ8x9ffCVrUvnY5tSlPsxkG0eMOGcyHsYi24Hbh26abpoj3556DPFewMhC6mGzN tNQ+WZK+/vlbDIg+FjcJuMe0Oc58+YSipbmGFJBt9Xf0mna1YiHlQ+tU4bVVegET/Uo/ DRuJSr+Kok06+c9E9ADxeHHxsQ/ec7Vr2+Ur7af3HqG2ep5jGgTUmtyZ59VdUTHKmm12 wskg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=coZgV39qyKs2/pDs+sDQc1r5OQnfwOGVkRlYCqNjnyE=; b=C8ooZlOaNG2W+noWjexNYsSn9me4+4YTJtLnX8qz0vdXy2kqLtY6S/S4eyPjX6BUk/ 7/tNvxPS2RJZeRHGPdMbii+ZkqBf5z0rZ1SQTIqQ9l8l4qalq3EXVh/ildbNvc6lSYG5 Qs+OPHfgiRbozE81xhX48VS0ZvzDISt33/X8/1yUYDKumFbPYyEMRC4JTv4ys90g/FNg qNRZ/ysE8DxCHvF8NTiiFPQpkrLE0QkXCvqO7mdtaJLMB0DtNmFutglGZlvcPAkmI5Hu UH5blWjFBedTQa1pEZn9l4RRIGd6TCjuZSWLH7l6GZvDC0F6STzc4zlM1AcSOq/Sgpq6 dX8g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=vZPpqCB0; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d11-20020a630e0b000000b004faf341b31asi11302539pgl.196.2023.03.20.09.40.52; Mon, 20 Mar 2023 09:41:05 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=vZPpqCB0; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230027AbjCTQf1 (ORCPT + 99 others); Mon, 20 Mar 2023 12:35:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49130 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231786AbjCTQep (ORCPT ); Mon, 20 Mar 2023 12:34:45 -0400 Received: from mail-ed1-x52e.google.com (mail-ed1-x52e.google.com [IPv6:2a00:1450:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5CA0E14E86 for ; Mon, 20 Mar 2023 09:28:13 -0700 (PDT) Received: by mail-ed1-x52e.google.com with SMTP id cn12so3390671edb.4 for ; Mon, 20 Mar 2023 09:28:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1679329690; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=coZgV39qyKs2/pDs+sDQc1r5OQnfwOGVkRlYCqNjnyE=; b=vZPpqCB0zHiXyY5Vq7/Rq1B+h4CLkskS6DB6FYg80B54N9sBmBrheRnsP23RGgVuCa CD6Sc+6H3KQbGiX3RMUWmR8+WWvzDtaDbCMmi6x4JBthUCmWD38at9OoL36aw1lJ25DK tkaeOFyfH/S0Ty3Zj26VvjvVcV3qyYlURIEvKgydLC2VqyUk5LoOr9ZdvRlP0ZIPSBPE JOR5+LL0CeNKbn4U7UPc56UerGL4AcpPRWZEv94e9WuZsakjYwZoKAV1rPzRm4zfZwKi Eph0jH0ZBGS3ctnxs2SwJ5paDP4J013492RUkmqobgNobO7eJo1uZaj2ePyjeVkDaPK4 NBMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679329690; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=coZgV39qyKs2/pDs+sDQc1r5OQnfwOGVkRlYCqNjnyE=; b=q2bw9qJLJvamI9fdm/D5hEAphPH4GX633agZEftxbAh30UFO5cb8sdG9gm3ev4SbXc 24fZwKMsjVTVdEXZ86Diweg4VYcGeUy9NH+xwDDZZbvUd0W1jqhxk09GvYgTJrWVytQt XL9FtbkfJ6INJkzEZ4XmSfb7U4a4NetgO44/6MCj9e4IruxsZU64KN46L6dTYlts3pVZ cNFj6btWIqXjTLDpcPSgFXX6FkhSehTbc9llChUFAZN4zOGz7MVmWULjBLtWDWnVLhhd hfjyxNALU3Oa81s6A32icRu/EGM+3YQiaGaLNJfgyu65aD/AQYl7G0LLgpGRV/VTriNl tQUQ== X-Gm-Message-State: AO0yUKWkT/fqS9HDMAgJ4im5+10oig/y7SD5bO5qoZNmVJ84eZxsBjdM ar5YcXBXXeQYcqbnzQdliAmt766nxC5aIoMexi0= X-Received: by 2002:a17:906:b1c9:b0:907:9bda:93b9 with SMTP id bv9-20020a170906b1c900b009079bda93b9mr9763751ejb.17.1679329689860; Mon, 20 Mar 2023 09:28:09 -0700 (PDT) Received: from lmecxl1178.lme.st.com ([2a04:cec0:104a:5611:7bcb:e0c2:1993:f82b]) by smtp.gmail.com with ESMTPSA id b17-20020a17090630d100b009300424a2fdsm4646335ejb.144.2023.03.20.09.28.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Mar 2023 09:28:09 -0700 (PDT) From: Etienne Carriere To: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, op-tee@lists.trustedfirmware.org, Sumit Garg , Jens Wiklander , Sudeep Holla , Cristian Marussi , Etienne Carriere Subject: [PATCH v5 1/4] tee: optee: system call property Date: Mon, 20 Mar 2023 17:27:58 +0100 Message-Id: <20230320162801.2811542-1-etienne.carriere@linaro.org> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1760905622239278151?= X-GMAIL-MSGID: =?utf-8?q?1760905622239278151?= Adds an argument to do_call_with_arg() handler to tell whether the call is a system call or nor. This change always sets this info to false hence no functional change. This change prepares management of system invocation proposed in a later change. Co-developed-by: Jens Wiklander Signed-off-by: Jens Wiklander Signed-off-by: Etienne Carriere --- Changes since v4: - New change, extracted from PATCH v4 1/2 (tee: system invocation") and revised to cover preparatory changes in optee driver for system session support with contribution from Jens. --- drivers/tee/optee/call.c | 22 ++++++++++++++++------ drivers/tee/optee/core.c | 5 +++-- drivers/tee/optee/ffa_abi.c | 3 ++- drivers/tee/optee/optee_private.h | 7 +++++-- drivers/tee/optee/smc_abi.c | 9 +++++---- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c index 290b1bb0e9cd..844d2bdc68db 100644 --- a/drivers/tee/optee/call.c +++ b/drivers/tee/optee/call.c @@ -328,7 +328,8 @@ int optee_open_session(struct tee_context *ctx, goto out; } - if (optee->ops->do_call_with_arg(ctx, shm, offs)) { + if (optee->ops->do_call_with_arg(ctx, shm, offs, + sess->use_sys_thread)) { msg_arg->ret = TEEC_ERROR_COMMUNICATION; msg_arg->ret_origin = TEEC_ORIGIN_COMMS; } @@ -360,7 +361,8 @@ int optee_open_session(struct tee_context *ctx, return rc; } -int optee_close_session_helper(struct tee_context *ctx, u32 session) +int optee_close_session_helper(struct tee_context *ctx, u32 session, + bool system_thread) { struct optee *optee = tee_get_drvdata(ctx->teedev); struct optee_shm_arg_entry *entry; @@ -374,7 +376,7 @@ int optee_close_session_helper(struct tee_context *ctx, u32 session) msg_arg->cmd = OPTEE_MSG_CMD_CLOSE_SESSION; msg_arg->session = session; - optee->ops->do_call_with_arg(ctx, shm, offs); + optee->ops->do_call_with_arg(ctx, shm, offs, system_thread); optee_free_msg_arg(ctx, entry, offs); @@ -385,6 +387,7 @@ int optee_close_session(struct tee_context *ctx, u32 session) { struct optee_context_data *ctxdata = ctx->data; struct optee_session *sess; + bool system_thread; /* Check that the session is valid and remove it from the list */ mutex_lock(&ctxdata->mutex); @@ -394,9 +397,10 @@ int optee_close_session(struct tee_context *ctx, u32 session) mutex_unlock(&ctxdata->mutex); if (!sess) return -EINVAL; + system_thread = sess->use_sys_thread; kfree(sess); - return optee_close_session_helper(ctx, session); + return optee_close_session_helper(ctx, session, system_thread); } int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg, @@ -408,12 +412,15 @@ int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg, struct optee_msg_arg *msg_arg; struct optee_session *sess; struct tee_shm *shm; + bool system_thread; u_int offs; int rc; /* Check that the session is valid */ mutex_lock(&ctxdata->mutex); sess = find_session(ctxdata, arg->session); + if (sess) + system_thread = sess->use_sys_thread; mutex_unlock(&ctxdata->mutex); if (!sess) return -EINVAL; @@ -432,7 +439,7 @@ int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg, if (rc) goto out; - if (optee->ops->do_call_with_arg(ctx, shm, offs)) { + if (optee->ops->do_call_with_arg(ctx, shm, offs, system_thread)) { msg_arg->ret = TEEC_ERROR_COMMUNICATION; msg_arg->ret_origin = TEEC_ORIGIN_COMMS; } @@ -457,12 +464,15 @@ int optee_cancel_req(struct tee_context *ctx, u32 cancel_id, u32 session) struct optee_shm_arg_entry *entry; struct optee_msg_arg *msg_arg; struct optee_session *sess; + bool system_thread; struct tee_shm *shm; u_int offs; /* Check that the session is valid */ mutex_lock(&ctxdata->mutex); sess = find_session(ctxdata, session); + if (sess) + system_thread = sess->use_sys_thread; mutex_unlock(&ctxdata->mutex); if (!sess) return -EINVAL; @@ -474,7 +484,7 @@ int optee_cancel_req(struct tee_context *ctx, u32 cancel_id, u32 session) msg_arg->cmd = OPTEE_MSG_CMD_CANCEL; msg_arg->session = session; msg_arg->cancel_id = cancel_id; - optee->ops->do_call_with_arg(ctx, shm, offs); + optee->ops->do_call_with_arg(ctx, shm, offs, system_thread); optee_free_msg_arg(ctx, entry, offs); return 0; diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c index 2a258bd3b6b5..d01ca47f7bde 100644 --- a/drivers/tee/optee/core.c +++ b/drivers/tee/optee/core.c @@ -129,7 +129,8 @@ int optee_open(struct tee_context *ctx, bool cap_memref_null) static void optee_release_helper(struct tee_context *ctx, int (*close_session)(struct tee_context *ctx, - u32 session)) + u32 session, + bool system_thread)) { struct optee_context_data *ctxdata = ctx->data; struct optee_session *sess; @@ -141,7 +142,7 @@ static void optee_release_helper(struct tee_context *ctx, list_for_each_entry_safe(sess, sess_tmp, &ctxdata->sess_list, list_node) { list_del(&sess->list_node); - close_session(ctx, sess->session_id); + close_session(ctx, sess->session_id, sess->use_sys_thread); kfree(sess); } kfree(ctxdata); diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c index 0828240f27e6..52cec9d06041 100644 --- a/drivers/tee/optee/ffa_abi.c +++ b/drivers/tee/optee/ffa_abi.c @@ -612,7 +612,8 @@ static int optee_ffa_yielding_call(struct tee_context *ctx, */ static int optee_ffa_do_call_with_arg(struct tee_context *ctx, - struct tee_shm *shm, u_int offs) + struct tee_shm *shm, u_int offs, + bool system_thread) { struct ffa_send_direct_data data = { .data0 = OPTEE_FFA_YIELDING_CALL_WITH_ARG, diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h index 04ae58892608..bdbc0dc293bb 100644 --- a/drivers/tee/optee/optee_private.h +++ b/drivers/tee/optee/optee_private.h @@ -130,7 +130,8 @@ struct optee; */ struct optee_ops { int (*do_call_with_arg)(struct tee_context *ctx, - struct tee_shm *shm_arg, u_int offs); + struct tee_shm *shm_arg, u_int offs, + bool system_thread); int (*to_msg_param)(struct optee *optee, struct optee_msg_param *msg_params, size_t num_params, const struct tee_param *params); @@ -180,6 +181,7 @@ struct optee { struct optee_session { struct list_head list_node; u32 session_id; + bool use_sys_thread; }; struct optee_context_data { @@ -228,7 +230,8 @@ int optee_supp_send(struct tee_context *ctx, u32 ret, u32 num_params, int optee_open_session(struct tee_context *ctx, struct tee_ioctl_open_session_arg *arg, struct tee_param *param); -int optee_close_session_helper(struct tee_context *ctx, u32 session); +int optee_close_session_helper(struct tee_context *ctx, u32 session, + bool system_thread); int optee_close_session(struct tee_context *ctx, u32 session); int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg, struct tee_param *param); diff --git a/drivers/tee/optee/smc_abi.c b/drivers/tee/optee/smc_abi.c index a1c1fa1a9c28..df77700804e5 100644 --- a/drivers/tee/optee/smc_abi.c +++ b/drivers/tee/optee/smc_abi.c @@ -487,7 +487,7 @@ static int optee_shm_register(struct tee_context *ctx, struct tee_shm *shm, msg_arg->params->u.tmem.buf_ptr = virt_to_phys(pages_list) | (tee_shm_get_page_offset(shm) & (OPTEE_MSG_NONCONTIG_PAGE_SIZE - 1)); - if (optee->ops->do_call_with_arg(ctx, shm_arg, 0) || + if (optee->ops->do_call_with_arg(ctx, shm_arg, 0, false) || msg_arg->ret != TEEC_SUCCESS) rc = -EINVAL; @@ -530,7 +530,7 @@ static int optee_shm_unregister(struct tee_context *ctx, struct tee_shm *shm) msg_arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_RMEM_INPUT; msg_arg->params[0].u.rmem.shm_ref = (unsigned long)shm; - if (optee->ops->do_call_with_arg(ctx, shm_arg, 0) || + if (optee->ops->do_call_with_arg(ctx, shm_arg, 0, false) || msg_arg->ret != TEEC_SUCCESS) rc = -EINVAL; out: @@ -865,7 +865,8 @@ static void optee_handle_rpc(struct tee_context *ctx, * Returns return code from secure world, 0 is OK */ static int optee_smc_do_call_with_arg(struct tee_context *ctx, - struct tee_shm *shm, u_int offs) + struct tee_shm *shm, u_int offs, + bool system_thread) { struct optee *optee = tee_get_drvdata(ctx->teedev); struct optee_call_waiter w; @@ -957,7 +958,7 @@ static int simple_call_with_arg(struct tee_context *ctx, u32 cmd) return PTR_ERR(msg_arg); msg_arg->cmd = cmd; - optee_smc_do_call_with_arg(ctx, shm, offs); + optee_smc_do_call_with_arg(ctx, shm, offs, false); optee_free_msg_arg(ctx, entry, offs); return 0; From patchwork Mon Mar 20 16:27:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Etienne Carriere X-Patchwork-Id: 72277 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:604a:0:0:0:0:0 with SMTP id j10csp1316685wrt; Mon, 20 Mar 2023 09:41:12 -0700 (PDT) X-Google-Smtp-Source: AK7set8m0ulPJRuPkvvKWvOvKYd7hCgAIpRkQHyFRHnO6KFHjdC/AiL0j88d5dN8t8/mb8vbb3hT X-Received: by 2002:a05:6a20:698c:b0:cc:b5de:3037 with SMTP id t12-20020a056a20698c00b000ccb5de3037mr24383297pzk.51.1679330471795; Mon, 20 Mar 2023 09:41:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679330471; cv=none; d=google.com; s=arc-20160816; b=woSaPvHK4krKllxgVzWGswjeuzR9PKIg/O89bJJK7KueAt/jxvTGFwAXwTnuBNf6qp t2pTJKseEwr2EpuaJtvQ8skS81wygnUgMu2GSQ5AbeExikUAh+aJXbn6TTyQFvUGG+sO eHKM584HuzJgvQwwtLFozocTP6G1zOIVx+wbcmoLrVxfpHZ7OrGal/pqQjZ9lX1s7h/V MwUdqhEHjbgXP1BU8Sry28lZp0LUdm0r/XGu5y8TsbXcPrJJHABaaozlV4JzNVDFxn/7 YK+ex6WjQJvRC9kqxYOrGFCMadolOHAi1WCsT/YSxBkVj1JDbtGJaJqFtfQnkaP86VGx gOQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=WDeOjoDocOcxKnFCxzE5QJGiGWBwUocZvCAgOgQgvYw=; b=e44UvyMnWZoK/On+tToE69j5kmRdT+I9JglxF5Nc/Z/YZBBwFZRLp4pdTUW7u6+DWz 0tEd1ZwkvZyr70ZV5Y+Ax4ylF4IBjnfdieq4bX9Nc2+fOHzMUsGpIX4ibMb2MQLAcHBY bWh+48CQpqbumKRqervQhPN8m7g6sEQrhzvZrpIFdqrxMVP5pm6DYbiPZGbSfqgQIVip 5mHGe0aCjY4FMJVKdQfEy0yEHeRvyaZ7ARd++Lv3VY0Tjr/C0r+6IONX5oZrYJVQ1dbj CFCqRkwXgau5xUXfeF83w64uCLvFfhIVqRQjkT/6qAoI+Are8yy3eXwS7xsXSxF2uUDQ ivxg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="VQ3Ll/QE"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id y186-20020a638ac3000000b0050bcc13077bsi10882322pgd.21.2023.03.20.09.40.58; Mon, 20 Mar 2023 09:41:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="VQ3Ll/QE"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231976AbjCTQfr (ORCPT + 99 others); Mon, 20 Mar 2023 12:35:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52234 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231847AbjCTQeq (ORCPT ); Mon, 20 Mar 2023 12:34:46 -0400 Received: from mail-ed1-x532.google.com (mail-ed1-x532.google.com [IPv6:2a00:1450:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AB7D01F48A for ; Mon, 20 Mar 2023 09:28:13 -0700 (PDT) Received: by mail-ed1-x532.google.com with SMTP id o12so49005093edb.9 for ; Mon, 20 Mar 2023 09:28:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1679329691; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=WDeOjoDocOcxKnFCxzE5QJGiGWBwUocZvCAgOgQgvYw=; b=VQ3Ll/QEHTAVHgk5aZWji5s2msSwIubq36YfwWXvN4t5sNjy3LcpbNYbSeRuEi+XsN z8/r52uCLQ1nvuDcfeP3Zblyi9SQ8N37Tf9w3MwpqRuJPlxP145OJmsO8faVxykxaEk7 morENENmyDCTIuj72SdNyim/3pjqU/SyJGoQQq9JuiZFg2sDxYG1Fj58DJUSBo6PXSb+ B5ulTW11sWw/n0iD1MYG4AwMj3XS/AasSlThmCzX0Lp01ti3LRQX6Ths8WKgWmohEI9z zQ1xIFKKG8rryb89Q7TNeZQQpDlEx+JR4brDlwTB0V/RwCrNFIhN4Rtp57u3ytW5iKGL ZJ8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679329691; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WDeOjoDocOcxKnFCxzE5QJGiGWBwUocZvCAgOgQgvYw=; b=YPuIs03qfomKNUfXUFpT3+Flk2M3kzA72S36Ld9R0yT5FO+wP/U9NXdRrrBUBijMjw 4ngu6Cwz1vhgZ+7CrvveFo6cdPrF0I9Hv8QCmVA6T0bdFAb89xrC4NVY6FajzKJMGUWB /bqSkflTK+Bopgz2YcbajUZ5mQH+1uiXogiTA2VFd730/dWAaGLpburbatXnFpZwvdrM AGSz2+3Cb2wRCu4lnFdAa36svn7m5LGhtIU8CtpQJLnQPTrCCFDDTCtuKjCBnDSSw2Nb Lql1leATjcpri9Y3GL7dMHJuE5n2nXYd+esrgV+5MrD+Gx3BkMhvY4Az5VnN/ZDp+a7u i83w== X-Gm-Message-State: AO0yUKVcqRLfUynxTCyVGTJ3SJYRa8oSlpgsv0Nrhs0ouWBr98IIesyL 8eTZnGdxcO0xFo0CiBFndRJV2jKKAvGjZDbc7Uc= X-Received: by 2002:a17:907:3f93:b0:933:15c0:6e05 with SMTP id hr19-20020a1709073f9300b0093315c06e05mr9929989ejc.7.1679329690771; Mon, 20 Mar 2023 09:28:10 -0700 (PDT) Received: from lmecxl1178.lme.st.com ([2a04:cec0:104a:5611:7bcb:e0c2:1993:f82b]) by smtp.gmail.com with ESMTPSA id b17-20020a17090630d100b009300424a2fdsm4646335ejb.144.2023.03.20.09.28.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Mar 2023 09:28:10 -0700 (PDT) From: Etienne Carriere To: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, op-tee@lists.trustedfirmware.org, Sumit Garg , Jens Wiklander , Sudeep Holla , Cristian Marussi , Etienne Carriere Subject: [PATCH v5 2/4] tee: system session Date: Mon, 20 Mar 2023 17:27:59 +0100 Message-Id: <20230320162801.2811542-2-etienne.carriere@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230320162801.2811542-1-etienne.carriere@linaro.org> References: <20230320162801.2811542-1-etienne.carriere@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1760905628692187994?= X-GMAIL-MSGID: =?utf-8?q?1760905628692187994?= Adds kernel client API function tee_client_system_session() for a client to request a system service entry in TEE context. This feature is needed to prevent a system deadlock when several TEE client applications invoke TEE, consuming all TEE thread contexts available in the secure world. The deadlock can happen in the OP-TEE driver for example if all these TEE threads issue an RPC call from TEE to Linux OS to access an eMMC RPMB partition (TEE secure storage) which device clock or regulator controller is accessed through an OP-TEE SCMI services. In that case, Linux SCMI driver must reach OP-TEE SCMI service without waiting one of the consumed TEE thread is freed. Co-developed-by: Jens Wiklander Signed-off-by: Jens Wiklander Signed-off-by: Etienne Carriere --- Changes since v4: - Changes extracted from "[PATCH v4 1/2] tee: system invocation" and revised with Jens contribution to cover only definition of tee driver new API function tee_client_system_session() for kernel clients to register their session as a system session. - Commit message rephrased, including header line changed from "tee: system invocation" to "tee: system session" has the feature relates to system attributes of tee sessions. Changes since v3: - Fixed new SMC funcIDs to reserved/unreserve OP-TEE thread contexts: minor renaming + define as fastcall funcIDs. - Moved system_ctx_count from generic struct tee_context to optee's private struct optee_context_data. This changes optee smc_abi.c to release reserved thread contexts when the optee device is released. - Fixed inline description comments. No change since v2 Change since v1 - Addressed comment on Linux client to claim reservation on TEE context. This brings 2 new operations from client to TEE to request and release system thread contexts: 2 new tee_drv.h API functions, 2 new ops functions in struct tee_driver_ops. The OP-TEE implement shall implement 2 new fastcall SMC funcIDs. - Fixed typos in commit message. --- drivers/tee/tee_core.c | 8 ++++++++ include/linux/tee_drv.h | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c index 98da206cd761..cf241bf1c6f7 100644 --- a/drivers/tee/tee_core.c +++ b/drivers/tee/tee_core.c @@ -1170,6 +1170,14 @@ int tee_client_close_session(struct tee_context *ctx, u32 session) } EXPORT_SYMBOL_GPL(tee_client_close_session); +int tee_client_system_session(struct tee_context *ctx, u32 session) +{ + if (!ctx->teedev->desc->ops->system_session) + return -EINVAL; + return ctx->teedev->desc->ops->system_session(ctx, session); +} +EXPORT_SYMBOL_GPL(tee_client_system_session); + int tee_client_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg, struct tee_param *param) diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h index 17eb1c5205d3..911ddf92dcee 100644 --- a/include/linux/tee_drv.h +++ b/include/linux/tee_drv.h @@ -84,6 +84,7 @@ struct tee_param { * @release: release this open file * @open_session: open a new session * @close_session: close a session + * @system_session: declare session as a system session * @invoke_func: invoke a trusted function * @cancel_req: request cancel of an ongoing invoke or open * @supp_recv: called for supplicant to get a command @@ -100,6 +101,7 @@ struct tee_driver_ops { struct tee_ioctl_open_session_arg *arg, struct tee_param *param); int (*close_session)(struct tee_context *ctx, u32 session); + int (*system_session)(struct tee_context *ctx, u32 session); int (*invoke_func)(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg, struct tee_param *param); @@ -429,6 +431,20 @@ int tee_client_open_session(struct tee_context *ctx, */ int tee_client_close_session(struct tee_context *ctx, u32 session); +/** + * tee_client_system_session() - Declare session as a system session + * @ctx: TEE Context + * @session: Session id + * + * This function requests TEE to provision an entry context ready to use for + * that session only. The provisioned entry context is used for command + * invocation and session closure, not for command cancelling requests. + * TEE releases the provisioned context upon session closure. + * + * Return < 0 on error else 0 if an entry context has been provisioned. + */ +int tee_client_system_session(struct tee_context *ctx, u32 session); + /** * tee_client_invoke_func() - Invoke a function in a Trusted Application * @ctx: TEE Context From patchwork Mon Mar 20 16:28:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Etienne Carriere X-Patchwork-Id: 72278 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:604a:0:0:0:0:0 with SMTP id j10csp1319140wrt; Mon, 20 Mar 2023 09:46:48 -0700 (PDT) X-Google-Smtp-Source: AK7set/+hoMvLS6QiN7IKnIQq13jAz6cbI/Ulo+mbaTgs3bO2jNEM6+/T6E42g21nwZMQ5gnOy6S X-Received: by 2002:a17:90b:3884:b0:23f:5273:1ae0 with SMTP id mu4-20020a17090b388400b0023f52731ae0mr14142608pjb.45.1679330808652; Mon, 20 Mar 2023 09:46:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679330808; cv=none; d=google.com; s=arc-20160816; b=s2ZV2HOSBVtF3s25iCbxQDdKjAnhR2BzRJ5i2GF/HqChtTmZurjePU6V+rcpFPXTJq DKGCu+TeCSU+Iq8bBtwOmqSWTwQUQw1mcSERvcrdEuUFmb6GQRNxKFZ1O/pt7Ab3ovM9 9vYRXregPB88+87IcrrXHsaNxUTCiujehuWyzwG5IDHXFUO8aO+TbHWpK0gNNj+GCzIq VpW2u4mpynLqqbu3rQJECGu588kVeXwgoW2YuOIczlGBQkMMtj2zRS6yOd7mbFkCM7E9 Rh3TQmGmIvCQMoXMsG6VwU2pE3mGJVMoGDT6sRToHEFaOaL5+rrRVQKmBczdAeRE0+yE 6thQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=MXkyzw67vzSdH3kz71nVOLRM9uyb/ncUdlbLW1O8cfc=; b=BX57m0o+kEmF7w3kwneuGXksFgYbdprIlBYojDIeC6nSX1hMDFIgQnPZoawRPpbDZo 1REWjtSMjQDM+tY2VvEgWs8sR+sa0E/ut4CHk3M32iCsbqiYJyDyk5cRR0ia96Nod0OZ qoz4gpldvw5ow3d9GtpQ1mhQp1BPqPzlXTiYZeEwAVMtKNXuB4gJ5wVU1V7+7/eHPBfx pKWZe2gIecInTEHC52tPcMTON0Uwmkl5j6rv+WfG9UxMxf5a2kiLWsvSd4lII8NkD28n xfkNm7vAtc35RLwmJ32wkyGoiI8AejKDlZEA2Z1xyga9l2NS0WSNGydVVOZDpMYKTn8o EHXw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=s+cifg0O; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 31-20020a17090a0fa200b00226e01736f8si10617108pjz.109.2023.03.20.09.46.23; Mon, 20 Mar 2023 09:46:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=s+cifg0O; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231952AbjCTQfm (ORCPT + 99 others); Mon, 20 Mar 2023 12:35:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49198 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231947AbjCTQeq (ORCPT ); Mon, 20 Mar 2023 12:34:46 -0400 Received: from mail-ed1-x535.google.com (mail-ed1-x535.google.com [IPv6:2a00:1450:4864:20::535]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E3E8322025 for ; Mon, 20 Mar 2023 09:28:13 -0700 (PDT) Received: by mail-ed1-x535.google.com with SMTP id x3so48968809edb.10 for ; Mon, 20 Mar 2023 09:28:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1679329692; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MXkyzw67vzSdH3kz71nVOLRM9uyb/ncUdlbLW1O8cfc=; b=s+cifg0Ow6fmWKWvJrsbbVv0fmg0ooOK0C8ng52m/8izTiV+0hB6tXZRsuj/773Ot4 4KI7jOUsIiCLIRDfkSd4BhCYjCrl4ykeRIQURgIB/qaT1d1jBnzPAbVF5FAhXigm6UdD Cl+/1clJEQ5tmTzQUUrKQGXgPGDfPKIx+9CrHwJui1FY61yPhWF/UkZ6DPZtIb7rmlAN NmZT45KgDp5P787wxKMtOBGhrJcDfctIN8zbq9uxS6eqM1K/20SRoTOG6lnBOSG7ymho DXhme/s4mn9qhH2iSrvtWg6QUFyvc1vBoTcNrU2Wb5Wm5uhH/Xk8IwnYufFwAa8mdzFT TZ1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679329692; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MXkyzw67vzSdH3kz71nVOLRM9uyb/ncUdlbLW1O8cfc=; b=Ct5bUEI4hG8LZVfWlF3MGVSX0DSSDrRvp+hx6mhsg0gr5KTpC89e/ZdLt6VZDO32xb vN3M0blQrVcS/sG8aR+2dBwG/tecjyVuc2LwJnI9r0QBeqI5X+OnzjLKPHjwxREvRPbV oa30eJnxZilLWT73R3oDn/fL2IMgIINjIA4lFl41CiIh6aLIIkfu49YxHxZjJzCPdoCi nnv5CjqpWkrTAdh5KjPQhYe4Bp4/7BtyxiHL2U3vuz57BphI3VKC7/kxPvCsrMRJe8DB DzzuCnIftICB82TS56tUv/6Wez73ZJ/FCF9/ZxDP7L2v6+l22egCfJX9Wh/UnudGuCqo UNoA== X-Gm-Message-State: AO0yUKU2ZHm3H1rDbItOOqIlcsvkn81iqF0Md6leTkAdZ5XYwk3uvdXK 0woIc4AGHiUbKR5njZde7wFmZCZNYiE50NI5hsg= X-Received: by 2002:a50:fb93:0:b0:4f9:ef7a:27d2 with SMTP id e19-20020a50fb93000000b004f9ef7a27d2mr101712edq.17.1679329691867; Mon, 20 Mar 2023 09:28:11 -0700 (PDT) Received: from lmecxl1178.lme.st.com ([2a04:cec0:104a:5611:7bcb:e0c2:1993:f82b]) by smtp.gmail.com with ESMTPSA id b17-20020a17090630d100b009300424a2fdsm4646335ejb.144.2023.03.20.09.28.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Mar 2023 09:28:11 -0700 (PDT) From: Etienne Carriere To: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, op-tee@lists.trustedfirmware.org, Sumit Garg , Jens Wiklander , Sudeep Holla , Cristian Marussi , Etienne Carriere Subject: [PATCH v5 3/4] tee: optee: support tracking system threads Date: Mon, 20 Mar 2023 17:28:00 +0100 Message-Id: <20230320162801.2811542-3-etienne.carriere@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230320162801.2811542-1-etienne.carriere@linaro.org> References: <20230320162801.2811542-1-etienne.carriere@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1760905981735473119?= X-GMAIL-MSGID: =?utf-8?q?1760905981735473119?= From: Jens Wiklander Adds support in the OP-TEE driver to keep track of reserved system threads. The optee_cq_*() functions are updated to handle this if enabled. The SMC ABI part of the driver enables this tracking, but the FF-A ABI part does not. Signed-off-by: Jens Wiklander Signed-off-by: Etienne Carriere --- Changes since v4: - New change that supersedes implementation proposed in PATCH v4 (tee: system invocation"). Thanks to Jens implementation we don't need the new OP-TEE services that my previous patch versions introduced to monitor system threads entry. Now, Linux optee SMC ABI driver gets TEE provisioned thread contexts count once and monitors thread entries in OP-TEE on that basis and the system thread capability of the related tee session. By the way, I dropped the WARN_ONCE() call I suggested on tee thread exhaustion as it does not provides useful information. --- drivers/tee/optee/call.c | 128 +++++++++++++++++++++++++++--- drivers/tee/optee/ffa_abi.c | 10 +-- drivers/tee/optee/optee_private.h | 13 ++- drivers/tee/optee/smc_abi.c | 24 ++++-- 4 files changed, 154 insertions(+), 21 deletions(-) diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c index 844d2bdc68db..8b8181099da7 100644 --- a/drivers/tee/optee/call.c +++ b/drivers/tee/optee/call.c @@ -39,9 +39,26 @@ struct optee_shm_arg_entry { DECLARE_BITMAP(map, MAX_ARG_COUNT_PER_ENTRY); }; +void optee_cq_init(struct optee_call_queue *cq, int thread_count) +{ + mutex_init(&cq->mutex); + INIT_LIST_HEAD(&cq->normal_waiters); + INIT_LIST_HEAD(&cq->sys_waiters); + /* + * If cq->total_thread_count is 0 then we're not trying to keep + * track of how many free threads we have, instead we're relying on + * the secure world to tell us when we're out of thread and have to + * wait for another thread to become available. + */ + cq->total_thread_count = thread_count; + cq->free_normal_thread_count = thread_count; +} + void optee_cq_wait_init(struct optee_call_queue *cq, - struct optee_call_waiter *w) + struct optee_call_waiter *w, bool sys_thread) { + bool need_wait = false; + /* * We're preparing to make a call to secure world. In case we can't * allocate a thread in secure world we'll end up waiting in @@ -53,15 +70,40 @@ void optee_cq_wait_init(struct optee_call_queue *cq, mutex_lock(&cq->mutex); /* - * We add ourselves to the queue, but we don't wait. This - * guarantees that we don't lose a completion if secure world - * returns busy and another thread just exited and try to complete - * someone. + * We add ourselves to a queue, but we don't wait. This guarantees + * that we don't lose a completion if secure world returns busy and + * another thread just exited and try to complete someone. */ init_completion(&w->c); - list_add_tail(&w->list_node, &cq->waiters); + w->sys_thread = sys_thread; + if (sys_thread) { + list_add_tail(&w->list_node, &cq->sys_waiters); + } else { + list_add_tail(&w->list_node, &cq->normal_waiters); + if (cq->total_thread_count) { + /* + * Claim a normal thread if one is available, else + * we'll need to wait for a normal thread to be + * released. + */ + if (cq->free_normal_thread_count > 0) + cq->free_normal_thread_count--; + else + need_wait = true; + } + } mutex_unlock(&cq->mutex); + + while (need_wait) { + optee_cq_wait_for_completion(cq, w); + mutex_lock(&cq->mutex); + if (cq->free_normal_thread_count > 0) { + cq->free_normal_thread_count--; + need_wait = false; + } + mutex_unlock(&cq->mutex); + } } void optee_cq_wait_for_completion(struct optee_call_queue *cq, @@ -74,7 +116,10 @@ void optee_cq_wait_for_completion(struct optee_call_queue *cq, /* Move to end of list to get out of the way for other waiters */ list_del(&w->list_node); reinit_completion(&w->c); - list_add_tail(&w->list_node, &cq->waiters); + if (w->sys_thread) + list_add_tail(&w->list_node, &cq->sys_waiters); + else + list_add_tail(&w->list_node, &cq->normal_waiters); mutex_unlock(&cq->mutex); } @@ -83,10 +128,19 @@ static void optee_cq_complete_one(struct optee_call_queue *cq) { struct optee_call_waiter *w; - list_for_each_entry(w, &cq->waiters, list_node) { + list_for_each_entry(w, &cq->sys_waiters, list_node) { if (!completion_done(&w->c)) { complete(&w->c); - break; + return; + } + } + + if (!cq->total_thread_count || cq->free_normal_thread_count > 0) { + list_for_each_entry(w, &cq->normal_waiters, list_node) { + if (!completion_done(&w->c)) { + complete(&w->c); + break; + } } } } @@ -104,6 +158,9 @@ void optee_cq_wait_final(struct optee_call_queue *cq, /* Get out of the list */ list_del(&w->list_node); + if (!w->sys_thread) + cq->free_normal_thread_count++; /* Release a normal thread */ + /* Wake up one eventual waiting task */ optee_cq_complete_one(cq); @@ -119,6 +176,36 @@ void optee_cq_wait_final(struct optee_call_queue *cq, mutex_unlock(&cq->mutex); } +bool optee_cq_inc_sys_thread_count(struct optee_call_queue *cq) +{ + bool rc = false; + + mutex_lock(&cq->mutex); + + /* Leave at least 1 normal (non-system) thread */ + if (cq->res_sys_thread_count + 1 < cq->total_thread_count) { + cq->free_normal_thread_count--; + cq->res_sys_thread_count++; + rc = true; + } + + mutex_unlock(&cq->mutex); + + return rc; +} + +void optee_cq_dec_sys_thread_count(struct optee_call_queue *cq) +{ + mutex_lock(&cq->mutex); + if (cq->res_sys_thread_count > 0) { + cq->res_sys_thread_count--; + cq->free_normal_thread_count++; + /* If there's someone waiting, let it resume */ + optee_cq_complete_one(cq); + } + mutex_unlock(&cq->mutex); +} + /* Requires the filpstate mutex to be held */ static struct optee_session *find_session(struct optee_context_data *ctxdata, u32 session_id) @@ -361,6 +448,27 @@ int optee_open_session(struct tee_context *ctx, return rc; } +int optee_system_session(struct tee_context *ctx, u32 session) +{ + struct optee_context_data *ctxdata = ctx->data; + struct optee *optee = tee_get_drvdata(ctx->teedev); + struct optee_session *sess; + int rc = -EINVAL; + + mutex_lock(&ctxdata->mutex); + + sess = find_session(ctxdata, session); + if (sess && !sess->use_sys_thread && + optee_cq_inc_sys_thread_count(&optee->call_queue)) { + rc = 0; + sess->use_sys_thread = true; + } + + mutex_unlock(&ctxdata->mutex); + + return rc; +} + int optee_close_session_helper(struct tee_context *ctx, u32 session, bool system_thread) { @@ -378,6 +486,8 @@ int optee_close_session_helper(struct tee_context *ctx, u32 session, msg_arg->session = session; optee->ops->do_call_with_arg(ctx, shm, offs, system_thread); + if (system_thread) + optee_cq_dec_sys_thread_count(&optee->call_queue); optee_free_msg_arg(ctx, entry, offs); return 0; diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c index 52cec9d06041..0c9055691343 100644 --- a/drivers/tee/optee/ffa_abi.c +++ b/drivers/tee/optee/ffa_abi.c @@ -528,7 +528,8 @@ static void optee_handle_ffa_rpc(struct tee_context *ctx, struct optee *optee, static int optee_ffa_yielding_call(struct tee_context *ctx, struct ffa_send_direct_data *data, - struct optee_msg_arg *rpc_arg) + struct optee_msg_arg *rpc_arg, + bool system_thread) { struct optee *optee = tee_get_drvdata(ctx->teedev); struct ffa_device *ffa_dev = optee->ffa.ffa_dev; @@ -541,7 +542,7 @@ static int optee_ffa_yielding_call(struct tee_context *ctx, int rc; /* Initialize waiter */ - optee_cq_wait_init(&optee->call_queue, &w); + optee_cq_wait_init(&optee->call_queue, &w, system_thread); while (true) { rc = msg_ops->sync_send_receive(ffa_dev, data); if (rc) @@ -643,7 +644,7 @@ static int optee_ffa_do_call_with_arg(struct tee_context *ctx, if (IS_ERR(rpc_arg)) return PTR_ERR(rpc_arg); - return optee_ffa_yielding_call(ctx, &data, rpc_arg); + return optee_ffa_yielding_call(ctx, &data, rpc_arg, system_thread); } /* @@ -851,8 +852,7 @@ static int optee_ffa_probe(struct ffa_device *ffa_dev) if (rc) goto err_unreg_supp_teedev; mutex_init(&optee->ffa.mutex); - mutex_init(&optee->call_queue.mutex); - INIT_LIST_HEAD(&optee->call_queue.waiters); + optee_cq_init(&optee->call_queue, 0); optee_supp_init(&optee->supp); optee_shm_arg_cache_init(optee, arg_cache_flags); ffa_dev_set_drvdata(ffa_dev, optee); diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h index bdbc0dc293bb..4f4201c812e3 100644 --- a/drivers/tee/optee/optee_private.h +++ b/drivers/tee/optee/optee_private.h @@ -43,12 +43,17 @@ typedef void (optee_invoke_fn)(unsigned long, unsigned long, unsigned long, struct optee_call_waiter { struct list_head list_node; struct completion c; + bool sys_thread; }; struct optee_call_queue { /* Serializes access to this struct */ struct mutex mutex; - struct list_head waiters; + struct list_head normal_waiters; + struct list_head sys_waiters; + int total_thread_count; + int free_normal_thread_count; + int res_sys_thread_count; }; struct optee_notif { @@ -230,6 +235,7 @@ int optee_supp_send(struct tee_context *ctx, u32 ret, u32 num_params, int optee_open_session(struct tee_context *ctx, struct tee_ioctl_open_session_arg *arg, struct tee_param *param); +int optee_system_session(struct tee_context *ctx, u32 session); int optee_close_session_helper(struct tee_context *ctx, u32 session, bool system_thread); int optee_close_session(struct tee_context *ctx, u32 session); @@ -279,8 +285,11 @@ static inline void optee_to_msg_param_value(struct optee_msg_param *mp, mp->u.value.c = p->u.value.c; } +void optee_cq_init(struct optee_call_queue *cq, int thread_count); +bool optee_cq_inc_sys_thread_count(struct optee_call_queue *cq); +void optee_cq_dec_sys_thread_count(struct optee_call_queue *cq); void optee_cq_wait_init(struct optee_call_queue *cq, - struct optee_call_waiter *w); + struct optee_call_waiter *w, bool sys_thread); void optee_cq_wait_for_completion(struct optee_call_queue *cq, struct optee_call_waiter *w); void optee_cq_wait_final(struct optee_call_queue *cq, diff --git a/drivers/tee/optee/smc_abi.c b/drivers/tee/optee/smc_abi.c index df77700804e5..418c967b83f0 100644 --- a/drivers/tee/optee/smc_abi.c +++ b/drivers/tee/optee/smc_abi.c @@ -261,9 +261,10 @@ static int optee_to_msg_param(struct optee *optee, static void optee_enable_shm_cache(struct optee *optee) { struct optee_call_waiter w; + bool system_thread = false; /* We need to retry until secure world isn't busy. */ - optee_cq_wait_init(&optee->call_queue, &w); + optee_cq_wait_init(&optee->call_queue, &w, system_thread); while (true) { struct arm_smccc_res res; @@ -286,9 +287,10 @@ static void optee_enable_shm_cache(struct optee *optee) static void __optee_disable_shm_cache(struct optee *optee, bool is_mapped) { struct optee_call_waiter w; + bool system_thread = false; /* We need to retry until secure world isn't busy. */ - optee_cq_wait_init(&optee->call_queue, &w); + optee_cq_wait_init(&optee->call_queue, &w, system_thread); while (true) { union { struct arm_smccc_res smccc; @@ -907,7 +909,7 @@ static int optee_smc_do_call_with_arg(struct tee_context *ctx, reg_pair_from_64(¶m.a1, ¶m.a2, parg); } /* Initialize waiter */ - optee_cq_wait_init(&optee->call_queue, &w); + optee_cq_wait_init(&optee->call_queue, &w, system_thread); while (true) { struct arm_smccc_res res; @@ -1092,6 +1094,7 @@ static const struct tee_driver_ops optee_clnt_ops = { .release = optee_release, .open_session = optee_open_session, .close_session = optee_close_session, + .system_session = optee_system_session, .invoke_func = optee_invoke_func, .cancel_req = optee_cancel_req, .shm_register = optee_shm_register, @@ -1223,6 +1226,16 @@ static bool optee_msg_exchange_capabilities(optee_invoke_fn *invoke_fn, return true; } +static unsigned int optee_msg_get_thread_count(optee_invoke_fn *invoke_fn) +{ + struct arm_smccc_res res; + + invoke_fn(OPTEE_SMC_GET_THREAD_COUNT, 0, 0, 0, 0, 0, 0, 0, &res); + if (res.a0) + return 0; + return res.a1; +} + static struct tee_shm_pool * optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_shm) { @@ -1362,6 +1375,7 @@ static int optee_probe(struct platform_device *pdev) struct optee *optee = NULL; void *memremaped_shm = NULL; unsigned int rpc_param_count; + unsigned int thread_count; struct tee_device *teedev; struct tee_context *ctx; u32 max_notif_value; @@ -1385,6 +1399,7 @@ static int optee_probe(struct platform_device *pdev) return -EINVAL; } + thread_count = optee_msg_get_thread_count(invoke_fn); if (!optee_msg_exchange_capabilities(invoke_fn, &sec_caps, &max_notif_value, &rpc_param_count)) { @@ -1474,8 +1489,7 @@ static int optee_probe(struct platform_device *pdev) if (rc) goto err_unreg_supp_teedev; - mutex_init(&optee->call_queue.mutex); - INIT_LIST_HEAD(&optee->call_queue.waiters); + optee_cq_init(&optee->call_queue, thread_count); optee_supp_init(&optee->supp); optee->smc.memremaped_shm = memremaped_shm; optee->pool = pool; From patchwork Mon Mar 20 16:28:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Etienne Carriere X-Patchwork-Id: 72276 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:604a:0:0:0:0:0 with SMTP id j10csp1316639wrt; Mon, 20 Mar 2023 09:41:08 -0700 (PDT) X-Google-Smtp-Source: AK7set922Lg0DcNijI3KmLz4FMx7/jmkyvG0UHlQ0JsmaCRBPBS7YndsyhCnUzZA9AWoSdOB+HX7 X-Received: by 2002:a05:6a20:c51d:b0:d9:63c3:e298 with SMTP id gm29-20020a056a20c51d00b000d963c3e298mr191754pzb.10.1679330468107; Mon, 20 Mar 2023 09:41:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679330468; cv=none; d=google.com; s=arc-20160816; b=cZWPyzuFi711zTgbHLRZ5jSoVakgZ2dbSkCMH1hoZhcVBXq3EBT42G43lURgiwLhyV /NChrq+a++ENeH2v7o2PPgCxbpCpFw8+5j+IyTAok0u7j/c9a2pd4OX5HEKZ0uOQS2Gv U7Pp1sn3Aei9sbeaYB+5tqN0gI6IC+HsH/J7fk93jfme6t/Q/JoJtqMn8KYIU6UijriH HMQ9Nh4d2H9KYBdEb2UhtonU04MjG+fgtL8xNsa/PU+yEej1GOTKnyFGyzgdH8qQfpAn QCm76ehyC8E1AzpuPi0fWqtvQgV96+o73N+C9ohrAT82XHaC+id8Dk//qB12K7GUMq3K Yz9g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=5VruUI//IRhqNmoD8Q5azVtaM6cIQmuR0hWrVWNp3gY=; b=S2qa8P7NSbB/3+P7ZGJ1JZZHZNEw33lyYIlx7IwytllIy7hCXgqQo2Hm6ooBjzxU+v doLDR/ykxLE4vJrxq/SHdGZPs+iaUt1e+A8JBl+Y4svtcnIbOX7B5cpEX+zveJl1toxa FPkF3wQ+w1pcXTsSOJU4N4mC4nI6us1q3JlZttjt8WfbY6mTJdl1sQVByDF5bG80won9 lMWitZCr26oiA+vPZ8bAYuP8knTkyS46Sjp50E+OdStxOlzV30q9AKcfIlVlzpzKq7ET 47sHZDwQhRTVJ+5OW7bVYOuauqbK01B5xIQ62BQ0I/FS6vGzK7eDS0vo3N9iMdx0ZNX1 whVA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=j3GTB6zH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id fc34-20020a056a002e2200b00625c8edafbesi11728818pfb.375.2023.03.20.09.40.55; Mon, 20 Mar 2023 09:41:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=j3GTB6zH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231775AbjCTQfb (ORCPT + 99 others); Mon, 20 Mar 2023 12:35:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52236 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231857AbjCTQeq (ORCPT ); Mon, 20 Mar 2023 12:34:46 -0400 Received: from mail-ed1-x530.google.com (mail-ed1-x530.google.com [IPv6:2a00:1450:4864:20::530]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 39B7D227B6 for ; Mon, 20 Mar 2023 09:28:15 -0700 (PDT) Received: by mail-ed1-x530.google.com with SMTP id b20so16081676edd.1 for ; Mon, 20 Mar 2023 09:28:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1679329693; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5VruUI//IRhqNmoD8Q5azVtaM6cIQmuR0hWrVWNp3gY=; b=j3GTB6zHSKFYXwDQR3E75kyaRy94kg9SJlGrDtLjgfeNNL7C8a2zIQZMBiwZzaBOvq A1oKUQGCLqHpSxoFOgQw9zITYp9gl02CN4IW+PAogO2SoRMuw3oedfXd+Cy127sMqQTQ lDxV/2E+ahZe4v1wUuqxnbVhWvUmXQF0k423ZD4GKDrh+Sf7nKyiH1+Sjx6O1AjYs/AL uk8FC7STV5uZ5glOfJkSoevW2AscX9m0mK5pl7hR9u8LKSBbrjI7HVtngg42YmTKRgLk 5E++zMI29aqhLBI+RF9FGUZW5m3cbkP/KwJ+4wnmv3e9VJzmDP0PITYiozSWQPJ7TB8L nIkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679329693; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5VruUI//IRhqNmoD8Q5azVtaM6cIQmuR0hWrVWNp3gY=; b=MJHe9CPy2Gh6iVUecr/GAOUhp4W9UbSBfOflD5rTCv+Pr8I/Cy5QRIKXlivZbR0iam yvMU+ILKNEi5nMzuKxHwdA9URbRu2s7dCu1Qf1XNmnn2ziodxo2xg5R0FME5bDrxODC9 4olMelg0qnLVfJK9evDMELyBI9z1QSAtOluitw6taIByroNgBk1jxV8c/wvHwAPGbWcH 484ygsfePjSJN9EZm5iuy8B5oZEwKpTesCSZJ/lPfhmJkQsjxwTDQ2QuSIvyQRXRdl4t UY+LqnVHoyi6eXGsGu6YCSFSz7/XhwpuT8dDghBMEntq+m3HFAoAxjC8flsXuDhV0I5w KntA== X-Gm-Message-State: AO0yUKXYRmWlzZmr5seAA6cRHOkYNXNZuQyeblDsLh+AJnZvJd7Ihccf qTmd6bRAXRixGAfm5y63qGIEVgr1utRd4hXllFU= X-Received: by 2002:a17:906:7fc9:b0:8ab:4c4:d0f6 with SMTP id r9-20020a1709067fc900b008ab04c4d0f6mr8657609ejs.56.1679329692978; Mon, 20 Mar 2023 09:28:12 -0700 (PDT) Received: from lmecxl1178.lme.st.com ([2a04:cec0:104a:5611:7bcb:e0c2:1993:f82b]) by smtp.gmail.com with ESMTPSA id b17-20020a17090630d100b009300424a2fdsm4646335ejb.144.2023.03.20.09.28.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Mar 2023 09:28:12 -0700 (PDT) From: Etienne Carriere To: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, op-tee@lists.trustedfirmware.org, Sumit Garg , Jens Wiklander , Sudeep Holla , Cristian Marussi , Etienne Carriere Subject: [PATCH v5 4/4] firmware: arm_scmi: optee: use optee system invocation Date: Mon, 20 Mar 2023 17:28:01 +0100 Message-Id: <20230320162801.2811542-4-etienne.carriere@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230320162801.2811542-1-etienne.carriere@linaro.org> References: <20230320162801.2811542-1-etienne.carriere@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1760905624833523096?= X-GMAIL-MSGID: =?utf-8?q?1760905624833523096?= Changes SCMI optee transport to call tee_client_system_session() to request optee driver to provision an entry context in OP-TEE for processing OP-TEE messages. This prevents possible deadlock in case OP-TEE threads are all consumed while these may be waiting for a clock or regulator to be enable which SCMI OP-TEE service which requires a free thread context to execute. Signed-off-by: Etienne Carriere Acked-by: Sudeep Holla --- Changes since v4: - Updated to new API function tee_client_system_session() introduced in patch v5 2/3. No change since v3 Changes since v2: - Fixed syntax issues (missing ';' chars), reported by kernel test robot. Changes since v1: - Updated to use new tee API functions tee_client_request_system_context() and tee_client_release_system_context(). --- drivers/firmware/arm_scmi/optee.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/firmware/arm_scmi/optee.c b/drivers/firmware/arm_scmi/optee.c index 2a7aeab40e54..22a755160c2f 100644 --- a/drivers/firmware/arm_scmi/optee.c +++ b/drivers/firmware/arm_scmi/optee.c @@ -440,6 +440,10 @@ static int scmi_optee_chan_setup(struct scmi_chan_info *cinfo, struct device *de if (ret) goto err_free_shm; + ret = tee_client_system_session(scmi_optee_private->tee_ctx, channel->tee_session); + if (ret) + dev_warn(dev, "Could not switch to system session, do best effort\n"); + ret = get_channel(channel); if (ret) goto err_close_sess;