mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-18 10:54:37 +00:00

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>
47 lines
990 B
C
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,
|
|
};
|