git: 3bbe8ed1a7dc - main - arm64: Add a CPU reset hook instead of expecting PSCI

From: Stephen J. Kiernan <stevek_at_FreeBSD.org>
Date: Fri, 05 Apr 2024 21:37:30 UTC
The branch main has been updated by stevek:

URL: https://cgit.FreeBSD.org/src/commit/?id=3bbe8ed1a7dce6943ce0fbf4946d2b1d435de0ec

commit 3bbe8ed1a7dce6943ce0fbf4946d2b1d435de0ec
Author:     Stephen J. Kiernan <stevek@FreeBSD.org>
AuthorDate: 2024-04-05 21:37:15 +0000
Commit:     Stephen J. Kiernan <stevek@FreeBSD.org>
CommitDate: 2024-04-05 21:37:15 +0000

    arm64: Add a CPU reset hook instead of expecting PSCI
    
    Some SoCs do not include a PSCI for power management and defer it to
    something else instead. Add a CPU reset hook to account for this, and
    use it in the psci driver.
    
    Reviewed by:    andrew
    Obtained from:  Juniper Networks, Inc.
    Differential Revision:  https://reviews.freebsd.org/D44535
---
 sys/arm64/arm64/vm_machdep.c | 9 ++++++++-
 sys/arm64/include/cpu.h      | 3 +++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/sys/arm64/arm64/vm_machdep.c b/sys/arm64/arm64/vm_machdep.c
index 385bec00ada5..457157e34a6f 100644
--- a/sys/arm64/arm64/vm_machdep.c
+++ b/sys/arm64/arm64/vm_machdep.c
@@ -54,6 +54,13 @@
 
 #include <dev/psci/psci.h>
 
+/*
+ * psci.c is "default" in ARM64 kernel config files
+ * psci_reset will do nothing until/unless the psci device probes/attaches.
+ * Therefore, it is safe to default the cpu_reset_hook to psci_reset.
+ */
+cpu_reset_hook_t cpu_reset_hook = psci_reset;
+
 /*
  * Finish a fork operation, with process p2 nearly set up.
  * Copy and update the pcb, set up the stack so that the child
@@ -123,7 +130,7 @@ void
 cpu_reset(void)
 {
 
-	psci_reset();
+	cpu_reset_hook();
 
 	printf("cpu_reset failed");
 	while(1)
diff --git a/sys/arm64/include/cpu.h b/sys/arm64/include/cpu.h
index 995be1c96d77..8f5a9e3dbd3c 100644
--- a/sys/arm64/include/cpu.h
+++ b/sys/arm64/include/cpu.h
@@ -206,6 +206,9 @@ extern uint64_t __cpu_affinity[];
 struct arm64_addr_mask;
 extern struct arm64_addr_mask elf64_addr_mask;
 
+typedef void (*cpu_reset_hook_t)(void);
+extern cpu_reset_hook_t cpu_reset_hook;
+
 void	cpu_halt(void) __dead2;
 void	cpu_reset(void) __dead2;
 void	fork_trampoline(void);