[PATCH v1 1/1] drivers: bootcount: Add ZynqMP specific bootcount support

Vasileios Amoiridis vassilisamir at gmail.com
Tue Oct 29 19:58:14 CET 2024


From: Vasileios Amoiridis <vasileios.amoiridis at cern.ch>

Add native support of the bootcount mechanism in the ZynqMP by utilising internal
PMU registers. The Persistent Global Storage Registers of the Platform Management
Unit can keep their value during reboot cycles unless there is a POR reset, making
them appropriate for the bootcount mechanism.

Signed-off-by: Vasileios Amoiridis <vasileios.amoiridis at cern.ch>
---
 drivers/bootcount/Kconfig            |  4 ++++
 drivers/bootcount/Makefile           |  1 +
 drivers/bootcount/bootcount_zynqmp.c | 28 ++++++++++++++++++++++++++++
 3 files changed, 33 insertions(+)
 create mode 100644 drivers/bootcount/bootcount_zynqmp.c

diff --git a/drivers/bootcount/Kconfig b/drivers/bootcount/Kconfig
index fa6d8e7128..95b6a9541a 100644
--- a/drivers/bootcount/Kconfig
+++ b/drivers/bootcount/Kconfig
@@ -82,6 +82,10 @@ config BOOTCOUNT_AT91
 	bool "Boot counter for Atmel AT91SAM9XE"
 	depends on AT91SAM9XE
 
+config BOOTCOUNT_ZYNQMP
+	bool "Boot counter for Zynq UltraScale+ MPSoC"
+	depends on ARCH_ZYNQMP
+
 config DM_BOOTCOUNT
         bool "Boot counter in a device-model device"
 	help
diff --git a/drivers/bootcount/Makefile b/drivers/bootcount/Makefile
index 245f879633..487adc1212 100644
--- a/drivers/bootcount/Makefile
+++ b/drivers/bootcount/Makefile
@@ -3,6 +3,7 @@
 obj-$(CONFIG_BOOTCOUNT_GENERIC)	+= bootcount.o
 obj-$(CONFIG_BOOTCOUNT_MEM)	+= bootcount.o
 obj-$(CONFIG_BOOTCOUNT_AT91)	+= bootcount_at91.o
+obj-$(CONFIG_BOOTCOUNT_ZYNQMP)  += bootcount_zynqmp.o
 obj-$(CONFIG_BOOTCOUNT_AM33XX)	+= bootcount_davinci.o
 obj-$(CONFIG_BOOTCOUNT_RAM)	+= bootcount_ram.o
 obj-$(CONFIG_BOOTCOUNT_ENV)	+= bootcount_env.o
diff --git a/drivers/bootcount/bootcount_zynqmp.c b/drivers/bootcount/bootcount_zynqmp.c
new file mode 100644
index 0000000000..9bb801e188
--- /dev/null
+++ b/drivers/bootcount/bootcount_zynqmp.c
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+// SPDX-FileCopyrightText: 2024 CERN (home.cern)
+
+#include <bootcount.h>
+#include <stdio.h>
+#include <zynqmp_firmware.h>
+
+#define PMU_PERS_GLOB_GEN_STORAGE0 0x00FFD80050
+
+void bootcount_store(ulong a)
+{
+	int ret;
+
+	ret = zynqmp_mmio_write(PMU_PERS_GLOB_GEN_STORAGE0, 0xFF, a);
+	if (ret)
+		printf("Failed: mmio write\n");
+}
+
+ulong bootcount_load(void)
+{
+	int ret;
+	u32 val;
+
+	ret = zynqmp_mmio_read(PMU_PERS_GLOB_GEN_STORAGE0, &val);
+	if (ret)
+		printf("Failed: mmio read\n");
+	return val;
+}
-- 
2.34.1



More information about the U-Boot mailing list