Message ID | 20230103150515.v4.3.I59210046e368cfc22bd3cca2afe1653674f8ece8@changeid |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp4638766wrt; Tue, 3 Jan 2023 06:09:57 -0800 (PST) X-Google-Smtp-Source: AMrXdXt24qYZLjslGSHal+UmPJxkyVCE10UIOxpcBONTnwSRpcoQd6mIkBf8/Ej3tO/SeFbmRWsH X-Received: by 2002:a17:906:5289:b0:82b:61db:92b8 with SMTP id c9-20020a170906528900b0082b61db92b8mr34201087ejm.57.1672754997256; Tue, 03 Jan 2023 06:09:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672754997; cv=none; d=google.com; s=arc-20160816; b=fv1UJdpt27TBBIDr/3ed4Xg3V1e0FSsNk1+y2wi5wUdoEMrYYnf3WYbYuUCXzSSDZe vk/67tBSLVnTW5Kgm4meMWfF76rqHx83BQineCsG3y6McbRJusy1qzQPfXu9YFG2G921 o5Q5dt3pkrQ0oZTVx+0NazCClHw/vCU4WRVYN2HMkO90Id0sEwTl2htjzTdYUkPM6ar1 SCbuEWwWgkkHe5nk9ytDvPW+pGFVFr5aJ+EEiRjv8t64+d7cv2Uw940ADGdjLTaPT9hz n9p6Sh6OroI2Z2T3tpCT8r5GyH6HRI8+ZM+yppaagutgA0JgpwEXx3kOXEoOSo6LtZZW gLiQ== 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=BakpOF/DNu8pvX2DxGhT1ID4m18yweosmq9XQbEVqS0=; b=YDBeof4sTpzapKJM91Zx+60Asm4xdV9Y5qhD0SJ6QXn6Apf42NmIZEFOLChVOVuS7D c16I4EkBmh9YHDwLkdzeEgoYzWJiPVC4FHk0Et2FWuGZkWQDLjL8vsJ/cIka3nk8yjzI 4riYBPjyIWb2eYywJazCpo1D3oDiEtQWpWEs9FodNzcL5k6cz3agsKtWqy+ruSevTMgA I0EsP/OuHWsSAg5ys9en/l3N0Whc+ZBjBHkDnhlmDgAChxLc41ZhjLoUZPg2PbR+3/6J H6dNhX9PEeUYNraGYD/CyudbWPLjxBiSeOxaYuLd2NbACyarbEi54+HiPsoxponT/Ow3 oR2w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@foss.st.com header.s=selector1 header.b=HjMVrG8s; 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=foss.st.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id mp28-20020a1709071b1c00b007ae0ca417e4si29453462ejc.690.2023.01.03.06.09.33; Tue, 03 Jan 2023 06:09:57 -0800 (PST) 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=@foss.st.com header.s=selector1 header.b=HjMVrG8s; 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=foss.st.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237783AbjACOIi (ORCPT <rfc822;tmhikaru@gmail.com> + 99 others); Tue, 3 Jan 2023 09:08:38 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56284 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237787AbjACOIY (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Tue, 3 Jan 2023 09:08:24 -0500 Received: from mx07-00178001.pphosted.com (mx08-00178001.pphosted.com [91.207.212.93]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E01591057A for <linux-kernel@vger.kernel.org>; Tue, 3 Jan 2023 06:08:22 -0800 (PST) Received: from pps.filterd (m0046661.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 303B19nq016088; Tue, 3 Jan 2023 15:08:08 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=selector1; bh=BakpOF/DNu8pvX2DxGhT1ID4m18yweosmq9XQbEVqS0=; b=HjMVrG8sVXnvxnPTSyVWtyDRj9Zn5Tn2bQ1ZMZWeUeDXyuIpF731nAb+ul9qCNrGr8/0 IHCWL69WiAYb4Ay6cM0CsPSctNW+jlkgVD5f+RTepZ62nLi3aOfu4I3zlAoqxZ493YfD gDIIV8coxfe+baa1hu92joZpWYbC1qkwx8nCQwPRh9hClnxZcDG3aVwnlKIYl1W/OD2q sLUXFXyj1tiaws3odU2HB+Dq7ulDf5r02SNqXa2rxyzygpoB8buWBzeCuvBJUjIqduuF eBes9Q0a3rP6L+jYxRSklZ+wpCj0HZecniY0G9YSwm2VzX5Lrm6q08fUyT8qdAdcGMD+ qA== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com (PPS) with ESMTPS id 3mtcupnht6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 03 Jan 2023 15:08:08 +0100 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id E1F5010002A; Tue, 3 Jan 2023 15:08:07 +0100 (CET) Received: from Webmail-eu.st.com (shfdag1node3.st.com [10.75.129.71]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id DBBEA224402; Tue, 3 Jan 2023 15:08:07 +0100 (CET) Received: from localhost (10.48.0.157) by SHFDAG1NODE3.st.com (10.75.129.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.13; Tue, 3 Jan 2023 15:08:06 +0100 From: Patrick Delaunay <patrick.delaunay@foss.st.com> To: Alexandre TORGUE <alexandre.torgue@foss.st.com>, Srinivas Kandagatla <srinivas.kandagatla@linaro.org>, Maxime Coquelin <mcoquelin.stm32@gmail.com> CC: Lionel DEBIEVE <lionel.debieve@foss.st.com>, Amelie DELAUNAY <amelie.delaunay@foss.st.com>, Etienne CARRIERE <etienne.carriere@linaro.org>, Fabrice GASNIER <fabrice.gasnier@foss.st.com>, Patrick Delaunay <patrick.delaunay@foss.st.com>, <linux-arm-kernel@lists.infradead.org>, <linux-kernel@vger.kernel.org>, <linux-stm32@st-md-mailman.stormreply.com> Subject: [PATCH v4 3/3] nvmem: stm32: detect bsec pta presence for STM32MP15x Date: Tue, 3 Jan 2023 15:05:21 +0100 Message-ID: <20230103150515.v4.3.I59210046e368cfc22bd3cca2afe1653674f8ece8@changeid> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230103140521.187678-1-patrick.delaunay@foss.st.com> References: <20230103140521.187678-1-patrick.delaunay@foss.st.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.48.0.157] X-ClientProxiedBy: SHFCAS1NODE2.st.com (10.75.129.73) To SHFDAG1NODE3.st.com (10.75.129.71) X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.923,Hydra:6.0.545,FMLib:17.11.122.1 definitions=2023-01-03_04,2023-01-03_02,2022-06-22_01 X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_LOW,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: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754010743864500421?= X-GMAIL-MSGID: =?utf-8?q?1754010743864500421?= |
Series |
nvmem: stm32: add OP-TEE support for STM32MP13x
|
|
Commit Message
Patrick Delaunay
Jan. 3, 2023, 2:05 p.m. UTC
On STM32MP15x SoC, the SMC backend is optional when OP-TEE is used;
the PTA BSEC should be used as it is done on STM32MP13x platform,
but the BSEC SMC can be also used: it is a legacy mode in OP-TEE,
not recommended but used in previous OP-TEE firmware.
The presence of OP-TEE is dynamically detected in STM32MP15x device tree
and the supported NVMEM backend is dynamically detected:
- PTA with stm32_bsec_pta_find
- SMC with stm32_bsec_check
With OP-TEE but without PTA and SMC detection, the probe is deferred for
STM32MP15x devices.
On STM32MP13x platform, only the PTA is supported with cfg->ta = true
and this detection is skipped.
Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
---
(no changes since v3)
Changes in v3:
- use of_find_compatible_node in optee_presence_check function
instead of of_find_node_by_path("/firmware/optee")
Changes in v2:
- Added patch in the serie for BSEC PTA support on STM32MP15x
with dynamic detection of OP-TEE presence and SMC support (legacy mode)
drivers/nvmem/stm32-romem.c | 33 +++++++++++++++++++++++++++++++--
1 file changed, 31 insertions(+), 2 deletions(-)
Comments
Hi Patrick, On Tue, 3 Jan 2023 at 15:08, Patrick Delaunay <patrick.delaunay@foss.st.com> wrote: > > On STM32MP15x SoC, the SMC backend is optional when OP-TEE is used; > the PTA BSEC should be used as it is done on STM32MP13x platform, > but the BSEC SMC can be also used: it is a legacy mode in OP-TEE, > not recommended but used in previous OP-TEE firmware. > > The presence of OP-TEE is dynamically detected in STM32MP15x device tree > and the supported NVMEM backend is dynamically detected: > - PTA with stm32_bsec_pta_find > - SMC with stm32_bsec_check > > With OP-TEE but without PTA and SMC detection, the probe is deferred for > STM32MP15x devices. > > On STM32MP13x platform, only the PTA is supported with cfg->ta = true > and this detection is skipped. > > Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com> > --- > > (no changes since v3) > > Changes in v3: > - use of_find_compatible_node in optee_presence_check function > instead of of_find_node_by_path("/firmware/optee") > > Changes in v2: > - Added patch in the serie for BSEC PTA support on STM32MP15x > with dynamic detection of OP-TEE presence and SMC support (legacy mode) > > drivers/nvmem/stm32-romem.c | 33 +++++++++++++++++++++++++++++++-- > 1 file changed, 31 insertions(+), 2 deletions(-) > > diff --git a/drivers/nvmem/stm32-romem.c b/drivers/nvmem/stm32-romem.c > index 2edc61925e52..1b90c78301fa 100644 > --- a/drivers/nvmem/stm32-romem.c > +++ b/drivers/nvmem/stm32-romem.c > @@ -159,6 +159,31 @@ static int stm32_bsec_pta_write(void *context, unsigned int offset, void *buf, > return stm32_bsec_optee_ta_write(priv->ctx, priv->lower, offset, buf, bytes); > } > > +static bool stm32_bsec_smc_check(void) > +{ > + u32 val; > + int ret; > + > + /* check that the OP-TEE support the BSEC SMC (legacy mode) */ > + ret = stm32_bsec_smc(STM32_SMC_READ_SHADOW, 0, 0, &val); > + > + return !ret; > +} > + > +static bool optee_presence_check(void) > +{ > + struct device_node *np; > + bool tee_detected = false; > + > + /* check that the OP-TEE node is present and available. */ > + np = of_find_compatible_node(NULL, NULL, "linaro,optee-tz"); > + if (np && of_device_is_available(np)) > + tee_detected = true; > + of_node_put(np); > + > + return tee_detected; > +} > + > static int stm32_romem_probe(struct platform_device *pdev) > { > const struct stm32_romem_cfg *cfg; > @@ -195,10 +220,14 @@ static int stm32_romem_probe(struct platform_device *pdev) > } else { > priv->cfg.size = cfg->size; > priv->lower = cfg->lower; > - if (cfg->ta) { > + if (cfg->ta || optee_presence_check()) { > rc = stm32_bsec_optee_ta_open(&priv->ctx); > /* wait for OP-TEE client driver to be up and ready */ > - if (rc) > + if (rc == -EPROBE_DEFER) { > + /* BSEC PTA is required or SMC not ready */ > + if (cfg->ta || !stm32_bsec_smc_check()) > + return -EPROBE_DEFER; > + } else if (rc) Could you fix the logic? The sequence here fails to fallback to BSEC SMC service if optee does not embed BSEC PTA service and optee driver is probed before stm32_romem. Br, etienne > return rc; > rc = devm_add_action_or_reset(dev, stm32_bsec_optee_ta_close, priv->ctx); > if (rc) { > -- > 2.25.1 >
Hi, On 1/4/23 10:30, Etienne Carriere wrote: > Hi Patrick, > > On Tue, 3 Jan 2023 at 15:08, Patrick Delaunay > <patrick.delaunay@foss.st.com> wrote: >> On STM32MP15x SoC, the SMC backend is optional when OP-TEE is used; >> the PTA BSEC should be used as it is done on STM32MP13x platform, >> but the BSEC SMC can be also used: it is a legacy mode in OP-TEE, >> not recommended but used in previous OP-TEE firmware. >> >> The presence of OP-TEE is dynamically detected in STM32MP15x device tree >> and the supported NVMEM backend is dynamically detected: >> - PTA with stm32_bsec_pta_find >> - SMC with stm32_bsec_check >> >> With OP-TEE but without PTA and SMC detection, the probe is deferred for >> STM32MP15x devices. >> >> On STM32MP13x platform, only the PTA is supported with cfg->ta = true >> and this detection is skipped. >> >> Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com> >> --- >> >> (no changes since v3) >> >> Changes in v3: >> - use of_find_compatible_node in optee_presence_check function >> instead of of_find_node_by_path("/firmware/optee") >> >> Changes in v2: >> - Added patch in the serie for BSEC PTA support on STM32MP15x >> with dynamic detection of OP-TEE presence and SMC support (legacy mode) >> >> drivers/nvmem/stm32-romem.c | 33 +++++++++++++++++++++++++++++++-- >> 1 file changed, 31 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/nvmem/stm32-romem.c b/drivers/nvmem/stm32-romem.c >> index 2edc61925e52..1b90c78301fa 100644 >> --- a/drivers/nvmem/stm32-romem.c >> +++ b/drivers/nvmem/stm32-romem.c >> @@ -159,6 +159,31 @@ static int stm32_bsec_pta_write(void *context, unsigned int offset, void *buf, >> return stm32_bsec_optee_ta_write(priv->ctx, priv->lower, offset, buf, bytes); >> } >> >> +static bool stm32_bsec_smc_check(void) >> +{ >> + u32 val; >> + int ret; >> + >> + /* check that the OP-TEE support the BSEC SMC (legacy mode) */ >> + ret = stm32_bsec_smc(STM32_SMC_READ_SHADOW, 0, 0, &val); >> + >> + return !ret; >> +} >> + >> +static bool optee_presence_check(void) >> +{ >> + struct device_node *np; >> + bool tee_detected = false; >> + >> + /* check that the OP-TEE node is present and available. */ >> + np = of_find_compatible_node(NULL, NULL, "linaro,optee-tz"); >> + if (np && of_device_is_available(np)) >> + tee_detected = true; >> + of_node_put(np); >> + >> + return tee_detected; >> +} >> + >> static int stm32_romem_probe(struct platform_device *pdev) >> { >> const struct stm32_romem_cfg *cfg; >> @@ -195,10 +220,14 @@ static int stm32_romem_probe(struct platform_device *pdev) >> } else { >> priv->cfg.size = cfg->size; >> priv->lower = cfg->lower; >> - if (cfg->ta) { >> + if (cfg->ta || optee_presence_check()) { >> rc = stm32_bsec_optee_ta_open(&priv->ctx); >> /* wait for OP-TEE client driver to be up and ready */ >> - if (rc) >> + if (rc == -EPROBE_DEFER) { >> + /* BSEC PTA is required or SMC not ready */ >> + if (cfg->ta || !stm32_bsec_smc_check()) >> + return -EPROBE_DEFER; >> + } else if (rc) > Could you fix the logic? The sequence here fails to fallback to BSEC > SMC service if optee does not embed BSEC PTA service and optee driver > is probed before stm32_romem. Yes, I will modify it... my patch is working only if OP-TEE is probed after BSEC NVMEM when RC = defered stm32_bsec_smc_check() isĀ not called the OP-TEE is already porbed (not deferred) but TA is not integrated > > Br, > etienne > >> return rc; >> rc = devm_add_action_or_reset(dev, stm32_bsec_optee_ta_close, priv->ctx); >> if (rc) { >> -- >> 2.25.1 >>
diff --git a/drivers/nvmem/stm32-romem.c b/drivers/nvmem/stm32-romem.c index 2edc61925e52..1b90c78301fa 100644 --- a/drivers/nvmem/stm32-romem.c +++ b/drivers/nvmem/stm32-romem.c @@ -159,6 +159,31 @@ static int stm32_bsec_pta_write(void *context, unsigned int offset, void *buf, return stm32_bsec_optee_ta_write(priv->ctx, priv->lower, offset, buf, bytes); } +static bool stm32_bsec_smc_check(void) +{ + u32 val; + int ret; + + /* check that the OP-TEE support the BSEC SMC (legacy mode) */ + ret = stm32_bsec_smc(STM32_SMC_READ_SHADOW, 0, 0, &val); + + return !ret; +} + +static bool optee_presence_check(void) +{ + struct device_node *np; + bool tee_detected = false; + + /* check that the OP-TEE node is present and available. */ + np = of_find_compatible_node(NULL, NULL, "linaro,optee-tz"); + if (np && of_device_is_available(np)) + tee_detected = true; + of_node_put(np); + + return tee_detected; +} + static int stm32_romem_probe(struct platform_device *pdev) { const struct stm32_romem_cfg *cfg; @@ -195,10 +220,14 @@ static int stm32_romem_probe(struct platform_device *pdev) } else { priv->cfg.size = cfg->size; priv->lower = cfg->lower; - if (cfg->ta) { + if (cfg->ta || optee_presence_check()) { rc = stm32_bsec_optee_ta_open(&priv->ctx); /* wait for OP-TEE client driver to be up and ready */ - if (rc) + if (rc == -EPROBE_DEFER) { + /* BSEC PTA is required or SMC not ready */ + if (cfg->ta || !stm32_bsec_smc_check()) + return -EPROBE_DEFER; + } else if (rc) return rc; rc = devm_add_action_or_reset(dev, stm32_bsec_optee_ta_close, priv->ctx); if (rc) {