2023-05-04 09:52:47

by Arnaud POULIQUEN

[permalink] [raw]
Subject: [PATCH v2 0/4] stm32mp15: update remoteproc to support SCMI Device tree

Update vs V1[1]:
---------------
- Keep compatibility with legacy DT by keeping support of st,syscfg-tz property
- Add comments to explain the different configuration supported for the old boot

[1]https://lore.kernel.org/lkml/DU0PR04MB941747DDF6FD2F157A24183288939@DU0PR04MB9417.eurprd04.prod.outlook.com/t/

Description:
-----------
This series updates the stm32_rproc driver and associated DT node to
support device tree configuration with and without SCMI server.
The impact is mainly on the MCU hold boot management.

Three configurations have to be supported:

1) Configuration without OP-TEE SCMI (legacy): Trusted context not activated
- The MCU reset is controlled through the Linux RCC reset driver.
- The MCU HOLD BOOT is controlled through The RCC sysconf.

2) Configuration with SCMI server: Trusted context activated
- The MCU reset is controlled through the SCMI reset service.
- The MCU HOLD BOOT is no more controlled through a SMC call service but
through the SCMI reset service.

3) Configuration with OP-TEE SMC call (deprecated): Trusted context activated
- The MCU reset is controlled through the Linux RCC reset driver.
- The MCU HOLD BOOT is controlled through The SMC call.

In consequence this series:
- adds the use of the SCMI reset service to manage the MCU hold boot,
- determines the configuration to use depending on the presence of the
"reset-names" property
if ( "reset-names" property contains "hold_boot")
then use reset_control services
else use regmap access based on "st,syscfg-holdboot" property.
- set the DT st,syscfg-tz property as deprecated

Arnaud Pouliquen (4):
dt-bindings: remoteproc: st,stm32-rproc: Rework reset declarations
remoteproc: stm32: Allow hold boot management by the SCMI reset
controller
ARM: dts: stm32: Update reset declarations
ARM: dts: stm32: fix m4_rproc references to use scmi

.../bindings/remoteproc/st,stm32-rproc.yaml | 42 ++++++++--
arch/arm/boot/dts/stm32mp151.dtsi | 2 +-
arch/arm/boot/dts/stm32mp157a-dk1-scmi.dts | 6 +-
arch/arm/boot/dts/stm32mp157c-dk2-scmi.dts | 6 +-
arch/arm/boot/dts/stm32mp157c-ed1-scmi.dts | 6 +-
arch/arm/boot/dts/stm32mp157c-ev1-scmi.dts | 6 +-
drivers/remoteproc/stm32_rproc.c | 78 ++++++++++++++-----
7 files changed, 111 insertions(+), 35 deletions(-)

--
2.25.1


2023-05-04 09:53:13

by Arnaud POULIQUEN

[permalink] [raw]
Subject: [PATCH v2 2/4] remoteproc: stm32: Allow hold boot management by the SCMI reset controller

The hold boot can be managed by the SCMI controller as a reset.
If the "hold_boot" reset is defined in the device tree, use it.
Else use the syscon controller directly to access to the register.
The support of the SMC call is deprecated but kept for legacy support.

Signed-off-by: Arnaud Pouliquen <[email protected]>
---
Updates vs previous version
- keep support of the "st,syscfg-tz" property for legacy compatibility
- rename secured_soc in hold_boot_smc for readability
- add comments to explain hold boot management.
- update commit message
---
drivers/remoteproc/stm32_rproc.c | 78 +++++++++++++++++++++++---------
1 file changed, 57 insertions(+), 21 deletions(-)

diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index 7d782ed9e589..e9cf24274345 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -79,6 +79,7 @@ struct stm32_mbox {

struct stm32_rproc {
struct reset_control *rst;
+ struct reset_control *hold_boot_rst;
struct stm32_syscon hold_boot;
struct stm32_syscon pdds;
struct stm32_syscon m4_state;
@@ -88,7 +89,7 @@ struct stm32_rproc {
struct stm32_rproc_mem *rmems;
struct stm32_mbox mb[MBOX_NB_MBX];
struct workqueue_struct *workqueue;
- bool secured_soc;
+ bool hold_boot_smc;
void __iomem *rsc_va;
};

@@ -401,13 +402,28 @@ static int stm32_rproc_set_hold_boot(struct rproc *rproc, bool hold)
struct arm_smccc_res smc_res;
int val, err;

+ /*
+ * Three ways to manage the hold boot
+ * - using SCMI: the hold boot is managed as a reset,
+ * - using Linux(no SCMI): the hold boot is managed as a syscon register
+ * - using SMC call (deprecated): use SMC reset interface
+ */
+
val = hold ? HOLD_BOOT : RELEASE_BOOT;

- if (IS_ENABLED(CONFIG_HAVE_ARM_SMCCC) && ddata->secured_soc) {
+ if (ddata->hold_boot_rst) {
+ /* Use the SCMI reset controller */
+ if (!hold)
+ err = reset_control_deassert(ddata->hold_boot_rst);
+ else
+ err = reset_control_assert(ddata->hold_boot_rst);
+ } else if (IS_ENABLED(CONFIG_HAVE_ARM_SMCCC) && ddata->hold_boot_smc) {
+ /* Use the SMC call */
arm_smccc_smc(STM32_SMC_RCC, STM32_SMC_REG_WRITE,
hold_boot.reg, val, 0, 0, 0, 0, &smc_res);
err = smc_res.a0;
} else {
+ /* Use syscon */
err = regmap_update_bits(hold_boot.map, hold_boot.reg,
hold_boot.mask, val);
}
@@ -705,34 +721,54 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev,
dev_info(dev, "wdg irq registered\n");
}

- ddata->rst = devm_reset_control_get_by_index(dev, 0);
+ ddata->rst = devm_reset_control_get_optional(dev, "mcu_rst");
+ if (!ddata->rst) {
+ /* Try legacy fallback method: get it by index */
+ ddata->rst = devm_reset_control_get_by_index(dev, 0);
+ }
if (IS_ERR(ddata->rst))
return dev_err_probe(dev, PTR_ERR(ddata->rst),
"failed to get mcu_reset\n");

/*
- * if platform is secured the hold boot bit must be written by
- * smc call and read normally.
- * if not secure the hold boot bit could be read/write normally
+ * Three ways to manage the hold boot
+ * - using SCMI: the hold boot is managed as a reset
+ * The DT "reset-mames" property should be defined with 2 items:
+ * reset-names = "mcu_rst", "hold_boot";
+ * - using SMC call (deprecated): use SMC reset interface
+ * The DT "reset-mames" property is optional, "st,syscfg-tz" is required
+ * - default(no SCMI, no SMC): the hold boot is managed as a syscon register
+ * The DT "reset-mames" property is optional, "st,syscfg-holdboot" is required
*/
- err = stm32_rproc_get_syscon(np, "st,syscfg-tz", &tz);
- if (err) {
- dev_err(dev, "failed to get tz syscfg\n");
- return err;
- }

- err = regmap_read(tz.map, tz.reg, &tzen);
- if (err) {
- dev_err(dev, "failed to read tzen\n");
- return err;
+ ddata->hold_boot_rst = devm_reset_control_get_optional(dev, "hold_boot");
+ if (IS_ERR(ddata->hold_boot_rst)) {
+ if (PTR_ERR(ddata->hold_boot_rst) == -EPROBE_DEFER)
+ return PTR_ERR(ddata->hold_boot_rst);
+ ddata->hold_boot_rst = NULL;
+ }
+
+ if (!ddata->hold_boot_rst && IS_ENABLED(CONFIG_HAVE_ARM_SMCCC)) {
+ /* Manage the MCU_BOOT using SMC call */
+ err = stm32_rproc_get_syscon(np, "st,syscfg-tz", &tz);
+ if (!err) {
+ err = regmap_read(tz.map, tz.reg, &tzen);
+ if (err) {
+ dev_err(dev, "failed to read tzen\n");
+ return err;
+ }
+ ddata->hold_boot_smc = tzen & tz.mask;
+ }
}
- ddata->secured_soc = tzen & tz.mask;

- err = stm32_rproc_get_syscon(np, "st,syscfg-holdboot",
- &ddata->hold_boot);
- if (err) {
- dev_err(dev, "failed to get hold boot\n");
- return err;
+ if (!ddata->hold_boot_rst && !ddata->hold_boot_smc) {
+ /* Default: hold boot manage it through the syscon controller */
+ err = stm32_rproc_get_syscon(np, "st,syscfg-holdboot",
+ &ddata->hold_boot);
+ if (err) {
+ dev_err(dev, "failed to get hold boot\n");
+ return err;
+ }
}

err = stm32_rproc_get_syscon(np, "st,syscfg-pdds", &ddata->pdds);
--
2.25.1

2023-05-04 09:53:18

by Arnaud POULIQUEN

[permalink] [raw]
Subject: [PATCH v2 1/4] dt-bindings: remoteproc: st,stm32-rproc: Rework reset declarations

With the introduction of the SCMI (System Control and Management
Interface), it is now possible to use the SCMI to handle the
hold boot instead of a dedicated SMC call.

As consequence two configurations are possible:
- without SCMI server on OP-TEE:
use the Linux rcc reset service and use syscon for the MCU hold boot
- With SCMI server on OP-TEE:
use the SCMI reset service for both the MCU reset and the MCU hold boot.

This patch:
- make optional and deprecated the use of the property st,syscfg-tz
which was used to check if the trusted Zone was enable to use scm call,
to manage the hold boot. The reset controller phandle is used instead
to select the configurations.
- make st,syscfg-holdboot optional
- adds properties check on resets definitions.
- adds an example of the SCMI reset service usage.

Signed-off-by: Arnaud Pouliquen <[email protected]>
---
Updates vs previous version:
- do not suppress "st,syscfg-tz" property to keep legacy compatibility
but set it as deprecated
- remove "reset-name" from requested property for legacy compatibility
---
.../bindings/remoteproc/st,stm32-rproc.yaml | 42 ++++++++++++++++---
1 file changed, 37 insertions(+), 5 deletions(-)

diff --git a/Documentation/devicetree/bindings/remoteproc/st,stm32-rproc.yaml b/Documentation/devicetree/bindings/remoteproc/st,stm32-rproc.yaml
index 66b1e3efdaa3..93105d174279 100644
--- a/Documentation/devicetree/bindings/remoteproc/st,stm32-rproc.yaml
+++ b/Documentation/devicetree/bindings/remoteproc/st,stm32-rproc.yaml
@@ -25,7 +25,14 @@ properties:
maxItems: 3

resets:
- maxItems: 1
+ minItems: 1
+ maxItems: 2
+
+ reset-names:
+ items:
+ - const: mcu_rst
+ - const: hold_boot
+ minItems: 1

st,syscfg-holdboot:
description: remote processor reset hold boot
@@ -37,6 +44,7 @@ properties:
- description: The field mask of the hold boot

st,syscfg-tz:
+ deprecated: true
description:
Reference to the system configuration which holds the RCC trust zone mode
$ref: "/schemas/types.yaml#/definitions/phandle-array"
@@ -135,22 +143,46 @@ required:
- compatible
- reg
- resets
- - st,syscfg-holdboot
- - st,syscfg-tz
+
+allOf:
+ - if:
+ properties:
+ reset-names:
+ not:
+ contains:
+ const: hold_boot
+ then:
+ required:
+ - st,syscfg-holdboot
+ else:
+ properties:
+ st,syscfg-holdboot: false

additionalProperties: false

examples:
- |
#include <dt-bindings/reset/stm32mp1-resets.h>
- m4_rproc: m4@10000000 {
+ m4_rproc_example1: m4@10000000 {
compatible = "st,stm32mp1-m4";
reg = <0x10000000 0x40000>,
<0x30000000 0x40000>,
<0x38000000 0x10000>;
resets = <&rcc MCU_R>;
+ reset-names = "mcu_rst";
st,syscfg-holdboot = <&rcc 0x10C 0x1>;
- st,syscfg-tz = <&rcc 0x000 0x1>;
+ st,syscfg-rsc-tbl = <&tamp 0x144 0xFFFFFFFF>;
+ st,syscfg-m4-state = <&tamp 0x148 0xFFFFFFFF>;
+ };
+ - |
+ #include <dt-bindings/reset/stm32mp1-resets.h>
+ m4_rproc_example2: m4@10000000 {
+ compatible = "st,stm32mp1-m4";
+ reg = <0x10000000 0x40000>,
+ <0x30000000 0x40000>,
+ <0x38000000 0x10000>;
+ resets = <&scmi MCU_R>, <&scmi MCU_HOLD_BOOT_R>;
+ reset-names = "mcu_rst", "hold_boot";
st,syscfg-rsc-tbl = <&tamp 0x144 0xFFFFFFFF>;
st,syscfg-m4-state = <&tamp 0x148 0xFFFFFFFF>;
};
--
2.25.1

2023-05-05 07:32:21

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH v2 1/4] dt-bindings: remoteproc: st,stm32-rproc: Rework reset declarations

On 04/05/2023 11:46, Arnaud Pouliquen wrote:
> With the introduction of the SCMI (System Control and Management
> Interface), it is now possible to use the SCMI to handle the
> hold boot instead of a dedicated SMC call.



> additionalProperties: false
>
> examples:
> - |
> #include <dt-bindings/reset/stm32mp1-resets.h>
> - m4_rproc: m4@10000000 {
> + m4_rproc_example1: m4@10000000 {

Just drop the label. It's not used.


> compatible = "st,stm32mp1-m4";
> reg = <0x10000000 0x40000>,
> <0x30000000 0x40000>,
> <0x38000000 0x10000>;
> resets = <&rcc MCU_R>;
> + reset-names = "mcu_rst";
> st,syscfg-holdboot = <&rcc 0x10C 0x1>;
> - st,syscfg-tz = <&rcc 0x000 0x1>;
> + st,syscfg-rsc-tbl = <&tamp 0x144 0xFFFFFFFF>;
> + st,syscfg-m4-state = <&tamp 0x148 0xFFFFFFFF>;
> + };
> + - |
> + #include <dt-bindings/reset/stm32mp1-resets.h>
> + m4_rproc_example2: m4@10000000 {

Also here.


Best regards,
Krzysztof

2023-05-05 17:15:13

by Mathieu Poirier

[permalink] [raw]
Subject: Re: [PATCH v2 2/4] remoteproc: stm32: Allow hold boot management by the SCMI reset controller

Hi Arnaud,

On Thu, May 04, 2023 at 11:46:39AM +0200, Arnaud Pouliquen wrote:
> The hold boot can be managed by the SCMI controller as a reset.
> If the "hold_boot" reset is defined in the device tree, use it.
> Else use the syscon controller directly to access to the register.
> The support of the SMC call is deprecated but kept for legacy support.
>
> Signed-off-by: Arnaud Pouliquen <[email protected]>
> ---
> Updates vs previous version
> - keep support of the "st,syscfg-tz" property for legacy compatibility
> - rename secured_soc in hold_boot_smc for readability
> - add comments to explain hold boot management.
> - update commit message
> ---
> drivers/remoteproc/stm32_rproc.c | 78 +++++++++++++++++++++++---------
> 1 file changed, 57 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
> index 7d782ed9e589..e9cf24274345 100644
> --- a/drivers/remoteproc/stm32_rproc.c
> +++ b/drivers/remoteproc/stm32_rproc.c
> @@ -79,6 +79,7 @@ struct stm32_mbox {
>
> struct stm32_rproc {
> struct reset_control *rst;
> + struct reset_control *hold_boot_rst;
> struct stm32_syscon hold_boot;
> struct stm32_syscon pdds;
> struct stm32_syscon m4_state;
> @@ -88,7 +89,7 @@ struct stm32_rproc {
> struct stm32_rproc_mem *rmems;
> struct stm32_mbox mb[MBOX_NB_MBX];
> struct workqueue_struct *workqueue;
> - bool secured_soc;
> + bool hold_boot_smc;
> void __iomem *rsc_va;
> };
>
> @@ -401,13 +402,28 @@ static int stm32_rproc_set_hold_boot(struct rproc *rproc, bool hold)
> struct arm_smccc_res smc_res;
> int val, err;
>
> + /*
> + * Three ways to manage the hold boot
> + * - using SCMI: the hold boot is managed as a reset,
> + * - using Linux(no SCMI): the hold boot is managed as a syscon register
> + * - using SMC call (deprecated): use SMC reset interface
> + */
> +
> val = hold ? HOLD_BOOT : RELEASE_BOOT;
>
> - if (IS_ENABLED(CONFIG_HAVE_ARM_SMCCC) && ddata->secured_soc) {
> + if (ddata->hold_boot_rst) {
> + /* Use the SCMI reset controller */
> + if (!hold)
> + err = reset_control_deassert(ddata->hold_boot_rst);
> + else
> + err = reset_control_assert(ddata->hold_boot_rst);
> + } else if (IS_ENABLED(CONFIG_HAVE_ARM_SMCCC) && ddata->hold_boot_smc) {
> + /* Use the SMC call */
> arm_smccc_smc(STM32_SMC_RCC, STM32_SMC_REG_WRITE,
> hold_boot.reg, val, 0, 0, 0, 0, &smc_res);
> err = smc_res.a0;
> } else {
> + /* Use syscon */
> err = regmap_update_bits(hold_boot.map, hold_boot.reg,
> hold_boot.mask, val);
> }
> @@ -705,34 +721,54 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev,
> dev_info(dev, "wdg irq registered\n");
> }
>
> - ddata->rst = devm_reset_control_get_by_index(dev, 0);
> + ddata->rst = devm_reset_control_get_optional(dev, "mcu_rst");
> + if (!ddata->rst) {
> + /* Try legacy fallback method: get it by index */
> + ddata->rst = devm_reset_control_get_by_index(dev, 0);
> + }
> if (IS_ERR(ddata->rst))
> return dev_err_probe(dev, PTR_ERR(ddata->rst),
> "failed to get mcu_reset\n");
>
> /*
> - * if platform is secured the hold boot bit must be written by
> - * smc call and read normally.
> - * if not secure the hold boot bit could be read/write normally
> + * Three ways to manage the hold boot
> + * - using SCMI: the hold boot is managed as a reset
> + * The DT "reset-mames" property should be defined with 2 items:
> + * reset-names = "mcu_rst", "hold_boot";
> + * - using SMC call (deprecated): use SMC reset interface
> + * The DT "reset-mames" property is optional, "st,syscfg-tz" is required
> + * - default(no SCMI, no SMC): the hold boot is managed as a syscon register
> + * The DT "reset-mames" property is optional, "st,syscfg-holdboot" is required
> */
> - err = stm32_rproc_get_syscon(np, "st,syscfg-tz", &tz);
> - if (err) {
> - dev_err(dev, "failed to get tz syscfg\n");
> - return err;
> - }
>
> - err = regmap_read(tz.map, tz.reg, &tzen);
> - if (err) {
> - dev_err(dev, "failed to read tzen\n");
> - return err;
> + ddata->hold_boot_rst = devm_reset_control_get_optional(dev, "hold_boot");
> + if (IS_ERR(ddata->hold_boot_rst)) {
> + if (PTR_ERR(ddata->hold_boot_rst) == -EPROBE_DEFER)
> + return PTR_ERR(ddata->hold_boot_rst);

Here we know that devm_reset_control_get_optional() has returned an error that is
not -EPROBE_DEFER and as such, I think we should return that error instead of
continuing on with the probing. Calling dev_err_probe() should be just fine.

Otherwise I'm good with this set. Many thanks for the enhanced explanation.

Mathieu

> + ddata->hold_boot_rst = NULL;
> + }
> +
> + if (!ddata->hold_boot_rst && IS_ENABLED(CONFIG_HAVE_ARM_SMCCC)) {
> + /* Manage the MCU_BOOT using SMC call */
> + err = stm32_rproc_get_syscon(np, "st,syscfg-tz", &tz);
> + if (!err) {
> + err = regmap_read(tz.map, tz.reg, &tzen);
> + if (err) {
> + dev_err(dev, "failed to read tzen\n");
> + return err;
> + }
> + ddata->hold_boot_smc = tzen & tz.mask;
> + }
> }
> - ddata->secured_soc = tzen & tz.mask;
>
> - err = stm32_rproc_get_syscon(np, "st,syscfg-holdboot",
> - &ddata->hold_boot);
> - if (err) {
> - dev_err(dev, "failed to get hold boot\n");
> - return err;
> + if (!ddata->hold_boot_rst && !ddata->hold_boot_smc) {
> + /* Default: hold boot manage it through the syscon controller */
> + err = stm32_rproc_get_syscon(np, "st,syscfg-holdboot",
> + &ddata->hold_boot);
> + if (err) {
> + dev_err(dev, "failed to get hold boot\n");
> + return err;
> + }
> }
>
> err = stm32_rproc_get_syscon(np, "st,syscfg-pdds", &ddata->pdds);
> --
> 2.25.1
>

2023-05-09 13:20:39

by Arnaud POULIQUEN

[permalink] [raw]
Subject: Re: [PATCH v2 2/4] remoteproc: stm32: Allow hold boot management by the SCMI reset controller

Hi Mathieu,

On 5/5/23 19:03, Mathieu Poirier wrote:
> Hi Arnaud,
>
> On Thu, May 04, 2023 at 11:46:39AM +0200, Arnaud Pouliquen wrote:
>> The hold boot can be managed by the SCMI controller as a reset.
>> If the "hold_boot" reset is defined in the device tree, use it.
>> Else use the syscon controller directly to access to the register.
>> The support of the SMC call is deprecated but kept for legacy support.
>>
>> Signed-off-by: Arnaud Pouliquen <[email protected]>
>> ---
>> Updates vs previous version
>> - keep support of the "st,syscfg-tz" property for legacy compatibility
>> - rename secured_soc in hold_boot_smc for readability
>> - add comments to explain hold boot management.
>> - update commit message
>> ---
>> drivers/remoteproc/stm32_rproc.c | 78 +++++++++++++++++++++++---------
>> 1 file changed, 57 insertions(+), 21 deletions(-)
>>
>> diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
>> index 7d782ed9e589..e9cf24274345 100644
>> --- a/drivers/remoteproc/stm32_rproc.c
>> +++ b/drivers/remoteproc/stm32_rproc.c
>> @@ -79,6 +79,7 @@ struct stm32_mbox {
>>
>> struct stm32_rproc {
>> struct reset_control *rst;
>> + struct reset_control *hold_boot_rst;
>> struct stm32_syscon hold_boot;
>> struct stm32_syscon pdds;
>> struct stm32_syscon m4_state;
>> @@ -88,7 +89,7 @@ struct stm32_rproc {
>> struct stm32_rproc_mem *rmems;
>> struct stm32_mbox mb[MBOX_NB_MBX];
>> struct workqueue_struct *workqueue;
>> - bool secured_soc;
>> + bool hold_boot_smc;
>> void __iomem *rsc_va;
>> };
>>
>> @@ -401,13 +402,28 @@ static int stm32_rproc_set_hold_boot(struct rproc *rproc, bool hold)
>> struct arm_smccc_res smc_res;
>> int val, err;
>>
>> + /*
>> + * Three ways to manage the hold boot
>> + * - using SCMI: the hold boot is managed as a reset,
>> + * - using Linux(no SCMI): the hold boot is managed as a syscon register
>> + * - using SMC call (deprecated): use SMC reset interface
>> + */
>> +
>> val = hold ? HOLD_BOOT : RELEASE_BOOT;
>>
>> - if (IS_ENABLED(CONFIG_HAVE_ARM_SMCCC) && ddata->secured_soc) {
>> + if (ddata->hold_boot_rst) {
>> + /* Use the SCMI reset controller */
>> + if (!hold)
>> + err = reset_control_deassert(ddata->hold_boot_rst);
>> + else
>> + err = reset_control_assert(ddata->hold_boot_rst);
>> + } else if (IS_ENABLED(CONFIG_HAVE_ARM_SMCCC) && ddata->hold_boot_smc) {
>> + /* Use the SMC call */
>> arm_smccc_smc(STM32_SMC_RCC, STM32_SMC_REG_WRITE,
>> hold_boot.reg, val, 0, 0, 0, 0, &smc_res);
>> err = smc_res.a0;
>> } else {
>> + /* Use syscon */
>> err = regmap_update_bits(hold_boot.map, hold_boot.reg,
>> hold_boot.mask, val);
>> }
>> @@ -705,34 +721,54 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev,
>> dev_info(dev, "wdg irq registered\n");
>> }
>>
>> - ddata->rst = devm_reset_control_get_by_index(dev, 0);
>> + ddata->rst = devm_reset_control_get_optional(dev, "mcu_rst");
>> + if (!ddata->rst) {
>> + /* Try legacy fallback method: get it by index */
>> + ddata->rst = devm_reset_control_get_by_index(dev, 0);
>> + }
>> if (IS_ERR(ddata->rst))
>> return dev_err_probe(dev, PTR_ERR(ddata->rst),
>> "failed to get mcu_reset\n");
>>
>> /*
>> - * if platform is secured the hold boot bit must be written by
>> - * smc call and read normally.
>> - * if not secure the hold boot bit could be read/write normally
>> + * Three ways to manage the hold boot
>> + * - using SCMI: the hold boot is managed as a reset
>> + * The DT "reset-mames" property should be defined with 2 items:
>> + * reset-names = "mcu_rst", "hold_boot";
>> + * - using SMC call (deprecated): use SMC reset interface
>> + * The DT "reset-mames" property is optional, "st,syscfg-tz" is required
>> + * - default(no SCMI, no SMC): the hold boot is managed as a syscon register
>> + * The DT "reset-mames" property is optional, "st,syscfg-holdboot" is required
>> */
>> - err = stm32_rproc_get_syscon(np, "st,syscfg-tz", &tz);
>> - if (err) {
>> - dev_err(dev, "failed to get tz syscfg\n");
>> - return err;
>> - }
>>
>> - err = regmap_read(tz.map, tz.reg, &tzen);
>> - if (err) {
>> - dev_err(dev, "failed to read tzen\n");
>> - return err;
>> + ddata->hold_boot_rst = devm_reset_control_get_optional(dev, "hold_boot");
>> + if (IS_ERR(ddata->hold_boot_rst)) {
>> + if (PTR_ERR(ddata->hold_boot_rst) == -EPROBE_DEFER)
>> + return PTR_ERR(ddata->hold_boot_rst);
>
> Here we know that devm_reset_control_get_optional() has returned an error that is
> not -EPROBE_DEFER and as such, I think we should return that error instead of
> continuing on with the probing. Calling dev_err_probe() should be just fine.

Good catch!

Thanks,
Arnaud

>
> Otherwise I'm good with this set. Many thanks for the enhanced explanation.
>
> Mathieu
>
>> + ddata->hold_boot_rst = NULL;
>> + }
>> +
>> + if (!ddata->hold_boot_rst && IS_ENABLED(CONFIG_HAVE_ARM_SMCCC)) {
>> + /* Manage the MCU_BOOT using SMC call */
>> + err = stm32_rproc_get_syscon(np, "st,syscfg-tz", &tz);
>> + if (!err) {
>> + err = regmap_read(tz.map, tz.reg, &tzen);
>> + if (err) {
>> + dev_err(dev, "failed to read tzen\n");
>> + return err;
>> + }
>> + ddata->hold_boot_smc = tzen & tz.mask;
>> + }
>> }
>> - ddata->secured_soc = tzen & tz.mask;
>>
>> - err = stm32_rproc_get_syscon(np, "st,syscfg-holdboot",
>> - &ddata->hold_boot);
>> - if (err) {
>> - dev_err(dev, "failed to get hold boot\n");
>> - return err;
>> + if (!ddata->hold_boot_rst && !ddata->hold_boot_smc) {
>> + /* Default: hold boot manage it through the syscon controller */
>> + err = stm32_rproc_get_syscon(np, "st,syscfg-holdboot",
>> + &ddata->hold_boot);
>> + if (err) {
>> + dev_err(dev, "failed to get hold boot\n");
>> + return err;
>> + }
>> }
>>
>> err = stm32_rproc_get_syscon(np, "st,syscfg-pdds", &ddata->pdds);
>> --
>> 2.25.1
>>