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: 13181574 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CB589C6FD1D for ; Mon, 20 Mar 2023 16:29:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=2SydwxZEglzP+/l4coW6dci58Ae9zRU1b9wh0CMA66c=; b=aopUzvDLio1fhu MVm0ipanGep/mnAfAkX//6DXM0RR/5MoUMxarMnEfuzAPYwxf2ej//ENtyxo0XjNW6xxOpsrYXbzm yxm7OdJaLOHskv4y0x0lRsF8AsfDMHlTaLwdQM2mPH+SlX6rfosqc0wxTgWhn9YsL3BvuFDDSb+i5 URIu3Uqedys20jGWPxKXUoEJRdXyLhoEjMiJM0lAverTtMvzWnXUVgqZ8g7oF2UHZmnGMVhpGDWBe xTWKr6gZW5TnQ7/Q2uWcWLwY55mKdQS0wLDu3JORWO2qswyz1ysqHFRjUsVKZp1PSR8nSHDBb7tA+ 6qzXFD7fV0FxTReJsD/Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1peIN0-009lff-2G; Mon, 20 Mar 2023 16:28:26 +0000 Received: from mail-ed1-x52d.google.com ([2a00:1450:4864:20::52d]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1peIMr-009lbJ-1g for linux-arm-kernel@lists.infradead.org; Mon, 20 Mar 2023 16:28:19 +0000 Received: by mail-ed1-x52d.google.com with SMTP id r11so49037540edd.5 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=1679329694; 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=vjzSCvYJbAyxmGrFLZQujl+YnjE/2QW+3YRkBXLDitxLQMzp81dOXLhWH2HSJFc81T WARvTydJxiWJ94pHVdInK9h9kJU0JIoZ/qivdDBVAZKq7iISQMQyocoqbpowHxp3tKwX icw8aYX2+sDRud32yyBhe8jkAhOcvr78PWiHmmGT/+KuTBvDW3l4w7L6W/Rlo9ykXij2 y3B0wyy0FzJobySi7bWlZd8u1fF9QufXl4K6CViAkW9fWDZh/CJNL4RT6CC3rzwm88fo cWjF9FvZYsALB2j1SDWN5DgNLi8PXXxHd58ep9+i3hGS+9zmcKJ13IDY1FcF5IfCkEpl /tDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679329694; 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=X0/btps7JCG9TcmlNQAqmYqtN0CpHIoHmFdhZpw6CIfdg+jkKfTbQVjrsehgohQklP gqIswQKdrtniaZhKGP7Is1FY2MzeU84bTAjbpmqGqVio5/HqPV9bPhIuq9eQptrrw9Z7 hBW6qevrKUSoBAYu6OhKOcYlibmWw6J/3EzWl2XRj1Moy9CrCo/uES/Jb3wiCeOWaw0t 64PNnlvJHDENcoeakTDRg+oDivT0VSDWyqZCMYk7p/RDvsEHYELtssckuhTKKqV9UDOs sDo2yRGLM+832RwLfWKBxMQhBFOko2jqax7DrPrTHpVkgu8F4uC2gDF+EqXNuI5KuSKP TwCQ== X-Gm-Message-State: AO0yUKUHcgArbzWdNKfwcWlsCeuw2cpLjhwAln5MOar2N0c5B5mJwH+7 mJZkRyvPg39xVlpd9jFBvQk0yA== X-Google-Smtp-Source: AK7set+4poO5jiBNV/Qz3zcdFXCmCVoALDUP20qdaRa3np+7mHDQhPXGZw8LTkcDF3/gj4+iCEcfgg== 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-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230320_092817_587873_17C96F8A X-CRM114-Status: GOOD ( 17.45 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org 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