]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
km: qrio: add access functions for ebootcount
authorAleksandar Gerasimovski <aleksandar.gerasimovski@hitachienergy.com>
Tue, 16 Nov 2021 12:53:28 +0000 (12:53 +0000)
committerPriyanka Jain <priyanka.jain@nxp.com>
Tue, 1 Feb 2022 09:38:07 +0000 (15:08 +0530)
The EBOOTCNT is a reserved persistent static memory area in QRIO,
and similar to BOOTCNT is intended to be used as boot counter location.

Comparable to BOOTCNT that is reserved for u-boot main bootcount
infrastructure, EBOOTCNT is intended to be used for pg-wcom board
specific purposes (e.g implementing early boot counter for fail-safe
u-boot update).

Signed-off-by: Aleksandar Gerasimovski <aleksandar.gerasimovski@hitachienergy.com>
Reviewed-by: Priyanka Jain <priyanka.jain@nxp.com>
board/keymile/common/common.h
board/keymile/common/qrio.c

index 15a3c3797d1a95e9f5ff8db9532e546982abf1d2..fc14728f9b53755cc8461e0de8c6c02f255cc73d 100644 (file)
@@ -133,6 +133,9 @@ int get_testpin(void);
 
 int set_km_env(void);
 
+ulong early_bootcount_load(void);
+void early_bootcount_store(ulong ebootcount);
+
 #define DELAY_ABORT_SEQ                62  /* @200kHz 9 clocks = 44us, 62us is ok */
 #define DELAY_HALF_PERIOD      (500 / (CONFIG_SYS_I2C_SPEED / 1000))
 
index 89a9726a1fc1d5584a4b4fc1518a8b642269a72e..5401bddf06a965721099f760777418311bdd324f 100644 (file)
@@ -270,6 +270,44 @@ void qrio_uprstreq(u8 mode)
        out_8(qrio_base + RSTCFG_OFF, rstcfg);
 }
 
+/* Early bootcount memory area is avilable starting from QRIO3 Rev.2 */
+#define QRIO3_ID               0x71
+#define QRIO3_REV              0x02
+#define EBOOTCNT_OFF           0x28
+
+ulong early_bootcount_load(void)
+{
+       void __iomem *qrio_base = (void *)CONFIG_SYS_QRIO_BASE;
+       u16 id_rev = in_be16(qrio_base + ID_REV_OFF);
+       u8 id = (id_rev >> 8) & 0xff;
+       u8 rev = id_rev & 0xff;
+       u32 ebootcount = 0;
+
+       if (id == QRIO3_ID && rev >= QRIO3_REV) {
+               ebootcount = in_be32(qrio_base + EBOOTCNT_OFF);
+       } else {
+               printf("QRIO: warning: early bootcount not supported, ");
+               printf("id = %u, rev = %u\n", id, rev);
+       }
+
+       return ebootcount;
+}
+
+void early_bootcount_store(ulong ebootcount)
+{
+       void __iomem *qrio_base = (void *)CONFIG_SYS_QRIO_BASE;
+       u16 id_rev = in_be16(qrio_base + ID_REV_OFF);
+       u8 id = (id_rev >> 8) & 0xff;
+       u8 rev = id_rev & 0xff;
+
+       if (id == QRIO3_ID && rev >= QRIO3_REV) {
+               out_be32(qrio_base + EBOOTCNT_OFF, ebootcount);
+       } else {
+               printf("QRIO: warning: early bootcount not supported, ");
+               printf("id = %u, rev = %u\n", id, rev);
+       }
+}
+
 /* I2C deblocking uses the algorithm defined in board/keymile/common/common.c
  * 2 dedicated QRIO GPIOs externally pull the SCL and SDA lines
  * For I2C only the low state is activly driven and high state is pulled-up