u-boot/drivers/bootcount/bootcount_zynqmp.c
Vasileios Amoiridis 159dfef261 drivers: bootcount: Add ZynqMP specific bootcount support
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@cern.ch>
Reviewed-by: Heiko Schocher <hs@denx.de>
Link: https://lore.kernel.org/r/20241105132744.1572759-2-vassilisamir@gmail.com
Signed-off-by: Michal Simek <michal.simek@amd.com>
2024-11-15 14:32:47 +01:00

47 lines
990 B
C

// SPDX-License-Identifier: GPL-2.0+
// SPDX-FileCopyrightText: 2024 CERN (home.cern)
#include <bootcount.h>
#include <dm.h>
#include <stdio.h>
#include <zynqmp_firmware.h>
#include <asm/arch/hardware.h>
#include <dm/platdata.h>
static int bootcount_zynqmp_set(struct udevice *dev, const u32 val)
{
int ret;
ret = zynqmp_mmio_write((ulong)&pmu_base->pers_gen_storage2, 0xFF, val);
if (ret)
pr_info("%s write fail\n", __func__);
return ret;
}
static int bootcount_zynqmp_get(struct udevice *dev, u32 *val)
{
int ret;
*val = 0;
ret = zynqmp_mmio_read((ulong)&pmu_base->pers_gen_storage2, val);
if (ret)
pr_info("%s read fail\n", __func__);
return ret;
}
U_BOOT_DRVINFO(bootcount_zynqmp) = {
.name = "bootcount_zynqmp",
};
static const struct bootcount_ops bootcount_zynqmp_ops = {
.get = bootcount_zynqmp_get,
.set = bootcount_zynqmp_set,
};
U_BOOT_DRIVER(bootcount_zynqmp) = {
.name = "bootcount_zynqmp",
.id = UCLASS_BOOTCOUNT,
.ops = &bootcount_zynqmp_ops,
};