]> Git Repo - u-boot.git/blobdiff - arch/arm/mach-stm32mp/bsec.c
dm: treewide: Rename auto_alloc_size members to be shorter
[u-boot.git] / arch / arm / mach-stm32mp / bsec.c
index fc39230113cc3a11cf84fabe45ddfb1b64cc5fe3..cb9208981e7005099701454fc6d21668c05468a3 100644 (file)
@@ -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
@@ -69,7 +74,6 @@ static bool bsec_read_lock(u32 address, u32 otp)
        return !!(readl(address + bank) & bit);
 }
 
-#ifndef CONFIG_TFABOOT
 /**
  * bsec_check_error() - Check status of one otp
  * @base: base address of bsec IP
@@ -274,7 +278,6 @@ static int bsec_program_otp(long base, u32 val, u32 otp)
 
        return ret;
 }
-#endif /* CONFIG_TFABOOT */
 
 /* BSEC MISC driver *******************************************************/
 struct stm32mp_bsec_platdata {
@@ -283,15 +286,17 @@ struct stm32mp_bsec_platdata {
 
 static int stm32mp_bsec_read_otp(struct udevice *dev, u32 *val, u32 otp)
 {
-#ifdef CONFIG_TFABOOT
-       return stm32_smc(STM32_SMC_BSEC,
-                        STM32_SMC_READ_OTP,
-                        otp, 0, val);
-#else
-       struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
+       struct stm32mp_bsec_platdata *plat;
        u32 tmp_data = 0;
        int ret;
 
+       if (IS_ENABLED(CONFIG_TFABOOT))
+               return stm32_smc(STM32_SMC_BSEC,
+                                STM32_SMC_READ_OTP,
+                                otp, 0, val);
+
+       plat = dev_get_platdata(dev);
+
        /* read current shadow value */
        ret = bsec_read_shadow(plat->base, &tmp_data, otp);
        if (ret)
@@ -308,21 +313,22 @@ static int stm32mp_bsec_read_otp(struct udevice *dev, u32 *val, u32 otp)
 
        /* restore shadow value */
        ret = bsec_write_shadow(plat->base, tmp_data, otp);
+
        return ret;
-#endif
 }
 
 static int stm32mp_bsec_read_shadow(struct udevice *dev, u32 *val, u32 otp)
 {
-#ifdef CONFIG_TFABOOT
-       return stm32_smc(STM32_SMC_BSEC,
-                        STM32_SMC_READ_SHADOW,
-                        otp, 0, val);
-#else
-       struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
+       struct stm32mp_bsec_platdata *plat;
+
+       if (IS_ENABLED(CONFIG_TFABOOT))
+               return stm32_smc(STM32_SMC_BSEC,
+                                STM32_SMC_READ_SHADOW,
+                                otp, 0, val);
+
+       plat = dev_get_platdata(dev);
 
        return bsec_read_shadow(plat->base, val, otp);
-#endif
 }
 
 static int stm32mp_bsec_read_lock(struct udevice *dev, u32 *val, u32 otp)
@@ -337,33 +343,38 @@ static int stm32mp_bsec_read_lock(struct udevice *dev, u32 *val, u32 otp)
 
 static int stm32mp_bsec_write_otp(struct udevice *dev, u32 val, u32 otp)
 {
-#ifdef CONFIG_TFABOOT
-       return stm32_smc_exec(STM32_SMC_BSEC,
-                             STM32_SMC_PROG_OTP,
-                             otp, val);
-#else
-       struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
+       struct stm32mp_bsec_platdata *plat;
+
+       if (IS_ENABLED(CONFIG_TFABOOT))
+               return stm32_smc_exec(STM32_SMC_BSEC,
+                                     STM32_SMC_PROG_OTP,
+                                     otp, val);
+
+       plat = dev_get_platdata(dev);
 
        return bsec_program_otp(plat->base, val, otp);
-#endif
+
 }
 
 static int stm32mp_bsec_write_shadow(struct udevice *dev, u32 val, u32 otp)
 {
-#ifdef CONFIG_TFABOOT
-       return stm32_smc_exec(STM32_SMC_BSEC,
-                             STM32_SMC_WRITE_SHADOW,
-                             otp, val);
-#else
-       struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
+       struct stm32mp_bsec_platdata *plat;
+
+       if (IS_ENABLED(CONFIG_TFABOOT))
+               return stm32_smc_exec(STM32_SMC_BSEC,
+                                     STM32_SMC_WRITE_SHADOW,
+                                     otp, val);
+
+       plat = dev_get_platdata(dev);
 
        return bsec_write_shadow(plat->base, val, otp);
-#endif
 }
 
 static int stm32mp_bsec_write_lock(struct udevice *dev, u32 val, u32 otp)
 {
-#ifdef CONFIG_TFABOOT
+       if (!IS_ENABLED(CONFIG_TFABOOT))
+               return -ENOTSUPP;
+
        if (val == 1)
                return stm32_smc_exec(STM32_SMC_BSEC,
                                      STM32_SMC_WRLOCK_OTP,
@@ -372,9 +383,6 @@ static int stm32mp_bsec_write_lock(struct udevice *dev, u32 val, u32 otp)
                return 0; /* nothing to do */
 
        return -EINVAL;
-#else
-       return -ENOTSUPP;
-#endif
 }
 
 static int stm32mp_bsec_read(struct udevice *dev, int offset,
@@ -474,20 +482,26 @@ static int stm32mp_bsec_ofdata_to_platdata(struct udevice *dev)
        return 0;
 }
 
-#ifndef CONFIG_TFABOOT
 static int stm32mp_bsec_probe(struct udevice *dev)
 {
        int otp;
-       struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
+       struct stm32mp_bsec_platdata *plat;
 
-       /* update unlocked shadow for OTP cleared by the rom code */
-       for (otp = 57; otp <= BSEC_OTP_MAX_VALUE; otp++)
-               if (!bsec_read_SR_lock(plat->base, otp))
-                       bsec_shadow_register(plat->base, otp);
+       /*
+        * update unlocked shadow for OTP cleared by the rom code
+        * only executed in U-Boot proper when TF-A is not used
+        */
+
+       if (!IS_ENABLED(CONFIG_TFABOOT) && !IS_ENABLED(CONFIG_SPL_BUILD)) {
+               plat = dev_get_platdata(dev);
+
+               for (otp = 57; otp <= BSEC_OTP_MAX_VALUE; otp++)
+                       if (!bsec_read_SR_lock(plat->base, otp))
+                               bsec_shadow_register(plat->base, otp);
+       }
 
        return 0;
 }
-#endif
 
 static const struct udevice_id stm32mp_bsec_ids[] = {
        { .compatible = "st,stm32mp15-bsec" },
@@ -499,9 +513,27 @@ U_BOOT_DRIVER(stm32mp_bsec) = {
        .id = UCLASS_MISC,
        .of_match = stm32mp_bsec_ids,
        .ofdata_to_platdata = stm32mp_bsec_ofdata_to_platdata,
-       .platdata_auto_alloc_size = sizeof(struct stm32mp_bsec_platdata),
+       .platdata_auto  = sizeof(struct stm32mp_bsec_platdata),
        .ops = &stm32mp_bsec_ops,
-#ifndef CONFIG_TFABOOT
        .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;
+}
This page took 0.039164 seconds and 4 git commands to generate.