[PATCH] arm: stm32mp: protect DBGMCU_IDC access with BSEC
Patrice CHOTARD
patrice.chotard at st.com
Thu Jul 2 09:14:32 CEST 2020
Hi Patrick
On 6/16/20 6:27 PM, Patrick Delaunay wrote:
> As debugger must be totally closed on Sec closed chip,
> the DBGMCU_IDC register is no more accessible (self
> hosted debug is disabled with OTP).
>
> This patch adds a function bsec_dbgswenable() to check
> if the DBGMCU registers are available before to access them:
> BSEC_DENABLE.DBGSWENABLE = self hosted debug status.
>
> Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>
> ---
>
> arch/arm/mach-stm32mp/bsec.c | 25 +++++++++++++++++++++++
> arch/arm/mach-stm32mp/cpu.c | 22 ++++++++++++++++----
> arch/arm/mach-stm32mp/include/mach/bsec.h | 7 +++++++
> 3 files changed, 50 insertions(+), 4 deletions(-)
> create mode 100644 arch/arm/mach-stm32mp/include/mach/bsec.h
>
> diff --git a/arch/arm/mach-stm32mp/bsec.c b/arch/arm/mach-stm32mp/bsec.c
> index fc39230113..c4b33ff241 100644
> --- a/arch/arm/mach-stm32mp/bsec.c
> +++ b/arch/arm/mach-stm32mp/bsec.c
> @@ -8,6 +8,7 @@
> #include <log.h>
> #include <misc.h>
> #include <asm/io.h>
> +#include <asm/arch/bsec.h>
> #include <asm/arch/stm32mp1_smc.h>
> #include <linux/arm-smccc.h>
> #include <linux/iopoll.h>
> @@ -21,6 +22,7 @@
> #define BSEC_OTP_WRDATA_OFF 0x008
> #define BSEC_OTP_STATUS_OFF 0x00C
> #define BSEC_OTP_LOCK_OFF 0x010
> +#define BSEC_DENABLE_OFF 0x014
> #define BSEC_DISTURBED_OFF 0x01C
> #define BSEC_ERROR_OFF 0x034
> #define BSEC_WRLOCK_OFF 0x04C /* OTP write permananet lock */
> @@ -46,6 +48,9 @@
> #define BSEC_MODE_PROGFAIL_MASK 0x10
> #define BSEC_MODE_PWR_MASK 0x20
>
> +/* DENABLE Register */
> +#define BSEC_DENABLE_DBGSWENABLE BIT(10)
> +
> /*
> * OTP Lock services definition
> * Value must corresponding to the bit number in the register
> @@ -505,3 +510,23 @@ U_BOOT_DRIVER(stm32mp_bsec) = {
> .probe = stm32mp_bsec_probe,
> #endif
> };
> +
> +bool bsec_dbgswenable(void)
> +{
> + struct udevice *dev;
> + struct stm32mp_bsec_platdata *plat;
> + int ret;
> +
> + ret = uclass_get_device_by_driver(UCLASS_MISC,
> + DM_GET_DRIVER(stm32mp_bsec), &dev);
> + if (ret || !dev) {
> + pr_debug("bsec driver not available\n");
> + return false;
> + }
> +
> + plat = dev_get_platdata(dev);
> + if (readl(plat->base + BSEC_DENABLE_OFF) & BSEC_DENABLE_DBGSWENABLE)
> + return true;
> +
> + return false;
> +}
> diff --git a/arch/arm/mach-stm32mp/cpu.c b/arch/arm/mach-stm32mp/cpu.c
> index 472b140321..382067190c 100644
> --- a/arch/arm/mach-stm32mp/cpu.c
> +++ b/arch/arm/mach-stm32mp/cpu.c
> @@ -12,6 +12,7 @@
> #include <misc.h>
> #include <net.h>
> #include <asm/io.h>
> +#include <asm/arch/bsec.h>
> #include <asm/arch/stm32.h>
> #include <asm/arch/sys_proto.h>
> #include <dm/device.h>
> @@ -155,8 +156,13 @@ static void dbgmcu_init(void)
> {
> setbits_le32(RCC_DBGCFGR, RCC_DBGCFGR_DBGCKEN);
>
> - /* Freeze IWDG2 if Cortex-A7 is in debug mode */
> - setbits_le32(DBGMCU_APB4FZ1, DBGMCU_APB4FZ1_IWDG2);
> + /*
> + * Freeze IWDG2 if Cortex-A7 is in debug mode
> + * done in TF-A for TRUSTED boot and
> + * DBGMCU access is controlled by BSEC_DENABLE.DBGSWENABLE
> + */
> + if (!IS_ENABLED(CONFIG_TFABOOT) && bsec_dbgswenable())
> + setbits_le32(DBGMCU_APB4FZ1, DBGMCU_APB4FZ1_IWDG2);
> }
> #endif /* !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD) */
>
> @@ -276,9 +282,17 @@ void enable_caches(void)
>
> static u32 read_idc(void)
> {
> - setbits_le32(RCC_DBGCFGR, RCC_DBGCFGR_DBGCKEN);
> + /* DBGMCU access is controlled by BSEC_DENABLE.DBGSWENABLE */
> + if (bsec_dbgswenable()) {
> + setbits_le32(RCC_DBGCFGR, RCC_DBGCFGR_DBGCKEN);
>
> - return readl(DBGMCU_IDC);
> + return readl(DBGMCU_IDC);
> + }
> +
> + if (CONFIG_IS_ENABLED(STM32MP15x))
> + return CPU_DEV_STM32MP15; /* STM32MP15x and unknown revision */
> + else
> + return 0x0;
> }
>
> u32 get_cpu_dev(void)
> diff --git a/arch/arm/mach-stm32mp/include/mach/bsec.h b/arch/arm/mach-stm32mp/include/mach/bsec.h
> new file mode 100644
> index 0000000000..252eac3946
> --- /dev/null
> +++ b/arch/arm/mach-stm32mp/include/mach/bsec.h
> @@ -0,0 +1,7 @@
> +/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
> +/*
> + * Copyright (C) 2020, STMicroelectronics - All Rights Reserved
> + */
> +
> +/* check self hosted debug status = BSEC_DENABLE.DBGSWENABLE */
> +bool bsec_dbgswenable(void);
Reviewed-by: Patrice Chotard <patrice.chotard at st.com>
Thanks
More information about the U-Boot
mailing list