From 722cd61c35444835dbfbd0d2a25b2593eae3fe3f Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Tue, 23 Jun 2026 14:53:34 +0200 Subject: arm64: zynqmp: Move board_early_init_r clock setup to mach code board_early_init_r() programmed the system timestamp counter directly with readl()/writel() in board code. This is SoC register setup rather than board policy, and similar code exists across the Xilinx SoCs. Move it into zynqmp_timer_setup() in arch/arm/mach-zynqmp so the board hook only keeps the EL3 guard and calls the helper. The asm/arch/clk.h include (for zynqmp_get_system_timer_freq()) moves to cpu.c along with the code. Signed-off-by: Michal Simek Link: https://patch.msgid.link/2d8f2419fab314b4ff8fd53b846e1dd6151586d3.1782219202.git.michal.simek@amd.com --- arch/arm/mach-zynqmp/cpu.c | 22 ++++++++++++++++++++++ arch/arm/mach-zynqmp/include/mach/sys_proto.h | 2 ++ 2 files changed, 24 insertions(+) (limited to 'arch') diff --git a/arch/arm/mach-zynqmp/cpu.c b/arch/arm/mach-zynqmp/cpu.c index 3dc47e5d48e..e6f2e0b3ee0 100644 --- a/arch/arm/mach-zynqmp/cpu.c +++ b/arch/arm/mach-zynqmp/cpu.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -234,6 +235,27 @@ int zynqmp_mmio_read(const u32 address, u32 *value) return ret; } +void zynqmp_timer_setup(void) +{ + u32 val; + + val = readl(&crlapb_base->timestamp_ref_ctrl); + val &= ZYNQMP_CRL_APB_TIMESTAMP_REF_CTRL_CLKACT; + + if (!val) { + val = readl(&crlapb_base->timestamp_ref_ctrl); + val |= ZYNQMP_CRL_APB_TIMESTAMP_REF_CTRL_CLKACT; + writel(val, &crlapb_base->timestamp_ref_ctrl); + + /* Program freq register in System counter */ + writel(zynqmp_get_system_timer_freq(), + &iou_scntr_secure->base_frequency_id_register); + /* And enable system counter */ + writel(ZYNQMP_IOU_SCNTR_COUNTER_CONTROL_REGISTER_EN, + &iou_scntr_secure->counter_control_register); + } +} + U_BOOT_DRVINFO(soc_xilinx_zynqmp) = { .name = "soc_xilinx_zynqmp", }; diff --git a/arch/arm/mach-zynqmp/include/mach/sys_proto.h b/arch/arm/mach-zynqmp/include/mach/sys_proto.h index b6a41df1da4..723e7593cf7 100644 --- a/arch/arm/mach-zynqmp/include/mach/sys_proto.h +++ b/arch/arm/mach-zynqmp/include/mach/sys_proto.h @@ -54,5 +54,7 @@ void mem_map_fill(void); #if defined(CONFIG_DEFINE_TCM_OCM_MMAP) void tcm_init(enum tcm_mode mode); #endif +/* EL3 clock/timer register setup, called from board_early_init_r() */ +void zynqmp_timer_setup(void); #endif /* _ASM_ARCH_SYS_PROTO_H */ -- cgit v1.3.1