[patch 25/38] arm64: Select ARCH_HAS_RANDOM_ENTROPY

Thomas Gleixner
2026-04-10T12:20:34Z

The only remaining usage of get_cycles() is to provide random_get_entropy().

Switch arm64 over to the new scheme of selecting ARCH_HAS_RANDOM_ENTROPY
and providing random_get_entropy() in asm/random.h.

As a consequence this unearthed a nasty include dependecy hell where random
code including rqspinlock.h relies on a magic include of asm/arch_timer.h.
Including the headers in asm/random.h turned out to be impossible as well.

The only solution for now is to uninline random_get_entropy(). Fix up all
other dependencies on the content of asm/timex.h in those files which
really depend on it.

Remove asm/timex.h as it has no functionality anymore.

Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: linux-arm-kernel@lists.infradead.org
---
arch/arm64/Kconfig | 1 +
arch/arm64/include/asm/io.h | 5 +++--
arch/arm64/include/asm/random.h | 11 +++++++++++
arch/arm64/include/asm/rqspinlock.h | 1 +
arch/arm64/include/asm/timex.h | 18 ------------------
arch/arm64/kernel/time.c | 6 ++++++
arch/arm64/kernel/topology.c | 1 +
arch/arm64/kernel/traps.c | 1 +
arch/arm64/kvm/emulate-nested.c | 1 +
arch/arm64/kvm/hyp/include/hyp/switch.h | 1 +
arch/arm64/lib/delay.c | 1 +
drivers/irqchip/irq-apple-aic.c | 1 +
12 files changed, 28 insertions(+), 20 deletions(-)

--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -45,6 +45,7 @@ config ARM64
select ARCH_HAS_PREEMPT_LAZY
select ARCH_HAS_PTDUMP
select ARCH_HAS_PTE_SPECIAL
+ select ARCH_HAS_RANDOM_ENTROPY
select ARCH_HAS_HW_PTE_YOUNG
select ARCH_HAS_SETUP_DMA_OPS
select ARCH_HAS_SET_DIRECT_MAP
--- a/arch/arm64/include/asm/io.h
+++ b/arch/arm64/include/asm/io.h
@@ -100,12 +100,13 @@ static __always_inline u64 __raw_readq(c
({ \
unsigned long tmp; \
\
- dma_rmb(); \
+ dma_rmb(); \
\
/* \
* Create a dummy control dependency from the IO read to any \
* later instructions. This ensures that a subsequent call to \
- * udelay() will be ordered due to the ISB in get_cycles(). \
+ * udelay() will be ordered due to the ISB in \
+ * arm_timer_read_counter(). \
*/ \
asm volatile("eor %0, %1, %1\n" \
"cbnz %0, ." \
--- /dev/null
+++ b/arch/arm64/include/asm/random.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2012 ARM Ltd.
+ */
+#ifndef __ASM_RANDOM_H
+#define __ASM_RANDOM_H
+
+/* Out of line to avoid recursive include hell */
+unsigned long random_get_entropy(void);
+
+#endif
--- a/arch/arm64/include/asm/rqspinlock.h
+++ b/arch/arm64/include/asm/rqspinlock.h
@@ -2,6 +2,7 @@
#ifndef _ASM_RQSPINLOCK_H
#define _ASM_RQSPINLOCK_H

+#include <asm/arch_timer.h>
#include <asm/barrier.h>

/*
--- a/arch/arm64/include/asm/timex.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Copyright (C) 2012 ARM Ltd.
- */
-#ifndef __ASM_TIMEX_H
-#define __ASM_TIMEX_H
-
-#include <asm/arch_timer.h>
-
-/*
- * Use the current timer as a cycle counter since this is what we use for
- * the delay loop.
- */
-#define get_cycles() arch_timer_read_counter()
-
-#include <asm-generic/timex.h>
-
-#endif
--- a/arch/arm64/kernel/time.c
+++ b/arch/arm64/kernel/time.c
@@ -29,6 +29,7 @@

#include <clocksource/arm_arch_timer.h>

+#include <asm/arch_timer.h>
#include <asm/thread_info.h>
#include <asm/paravirt.h>

@@ -52,6 +53,11 @@ unsigned long profile_pc(struct pt_regs
}
EXPORT_SYMBOL(profile_pc);

+static unsigned long random_get_entropy(void)
+{
+ return arch_timer_read_counter();
+}
+
void __init time_init(void)
{
u32 arch_timer_rate;
--- a/arch/arm64/kernel/topology.c
+++ b/arch/arm64/kernel/topology.c
@@ -21,6 +21,7 @@
#include <linux/sched/isolation.h>
#include <linux/xarray.h>

+#include <asm/arch_timer.h>
#include <asm/cpu.h>
#include <asm/cputype.h>
#include <asm/topology.h>
--- a/arch/arm64/kernel/traps.c
+++ b/arch/arm64/kernel/traps.c
@@ -30,6 +30,7 @@
#include <linux/ubsan.h>
#include <linux/cfi.h>

+#include <asm/arch_timer.h>
#include <asm/atomic.h>
#include <asm/bug.h>
#include <asm/cpufeature.h>
--- a/arch/arm64/kvm/emulate-nested.c
+++ b/arch/arm64/kvm/emulate-nested.c
@@ -7,6 +7,7 @@
#include <linux/kvm.h>
#include <linux/kvm_host.h>

+#include <asm/arch_timer.h>
#include <asm/kvm_emulate.h>
#include <asm/kvm_nested.h>

--- a/arch/arm64/kvm/hyp/include/hyp/switch.h
+++ b/arch/arm64/kvm/hyp/include/hyp/switch.h
@@ -18,6 +18,7 @@

#include <kvm/arm_psci.h>

+#include <asm/arch_timer.h>
#include <asm/barrier.h>
#include <asm/cpufeature.h>
#include <asm/extable.h>
--- a/arch/arm64/lib/delay.c
+++ b/arch/arm64/lib/delay.c
@@ -14,6 +14,7 @@
#include <linux/timex.h>

#include <clocksource/arm_arch_timer.h>
+#include <asm/arch_timer.h>

#define USECS_TO_CYCLES(time_usecs) \
xloops_to_cycles((time_usecs) * 0x10C7UL)
--- a/drivers/irqchip/irq-apple-aic.c
+++ b/drivers/irqchip/irq-apple-aic.c
@@ -55,6 +55,7 @@
#include <linux/jump_label.h>
#include <linux/limits.h>
#include <linux/of_address.h>
+#include <asm/arch_timer.h>
#include <linux/slab.h>
#include <asm/apple_m1_pmu.h>
#include <asm/cputype.h>