]> www.infradead.org Git - users/willy/xarray.git/commitdiff
RISC-V: Move spinwait booting method to its own config
authorAtish Patra <atishp@rivosinc.com>
Thu, 20 Jan 2022 09:09:17 +0000 (01:09 -0800)
committerPalmer Dabbelt <palmer@rivosinc.com>
Thu, 20 Jan 2022 17:27:16 +0000 (09:27 -0800)
The spinwait booting method should only be used for platforms with older
firmware without SBI HSM extension or M-mode firmware because spinwait
method can't support cpu hotplug, kexec or sparse hartid. It is better
to move the entire spinwait implementation to its own config which can
be disabled if required. It is enabled by default to maintain backward
compatibility and M-mode Linux.

Reviewed-by: Anup Patel <anup@brainfault.org>
Signed-off-by: Atish Patra <atishp@rivosinc.com>
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/Kconfig
arch/riscv/kernel/Makefile
arch/riscv/kernel/cpu_ops.c
arch/riscv/kernel/head.S
arch/riscv/kernel/head.h

index 86553d8c6b07b3ae666e5241162b5bf5bc3cfdf7..fd60ab94260b45e4bb72f81601cfa0ca037d5259 100644 (file)
@@ -374,6 +374,20 @@ config RISCV_SBI_V01
          This config allows kernel to use SBI v0.1 APIs. This will be
          deprecated in future once legacy M-mode software are no longer in use.
 
+config RISCV_BOOT_SPINWAIT
+       bool "Spinwait booting method"
+       depends on SMP
+       default y
+       help
+         This enables support for booting Linux via spinwait method. In the
+         spinwait method, all cores randomly jump to Linux. One of the cores
+         gets chosen via lottery and all other keep spinning on a percpu
+         variable. This method cannot support CPU hotplug and sparse hartid
+         scheme. It should be only enabled for M-mode Linux or platforms relying
+         on older firmware without SBI HSM extension. All other platforms should
+         rely on ordered booting via SBI HSM extension which gets chosen
+         dynamically at runtime if the firmware supports it.
+
 config KEXEC
        bool "Kexec system call"
        select KEXEC_CORE
index 3397ddac1a30caeab19cc7ee7fc99ff58a52fd7a..612556faa527f583cf6fc3bc9a737adcaa18a105 100644 (file)
@@ -43,7 +43,8 @@ obj-$(CONFIG_FPU)             += fpu.o
 obj-$(CONFIG_SMP)              += smpboot.o
 obj-$(CONFIG_SMP)              += smp.o
 obj-$(CONFIG_SMP)              += cpu_ops.o
-obj-$(CONFIG_SMP)              += cpu_ops_spinwait.o
+
+obj-$(CONFIG_RISCV_BOOT_SPINWAIT) += cpu_ops_spinwait.o
 obj-$(CONFIG_MODULES)          += module.o
 obj-$(CONFIG_MODULE_SECTIONS)  += module-sections.o
 
index c1e30f403c3b463a7fbaf615aa14bdebabefa0fe..170d07e577215b2c40c23da0332b2a2c28a322a0 100644 (file)
 const struct cpu_operations *cpu_ops[NR_CPUS] __ro_after_init;
 
 extern const struct cpu_operations cpu_ops_sbi;
+#ifdef CONFIG_RISCV_BOOT_SPINWAIT
 extern const struct cpu_operations cpu_ops_spinwait;
+#else
+const struct cpu_operations cpu_ops_spinwait = {
+       .name           = "",
+       .cpu_prepare    = NULL,
+       .cpu_start      = NULL,
+};
+#endif
 
 void __init cpu_set_ops(int cpuid)
 {
index b0766f62bd730aee6ae8db38fd7331c5eeb98027..2363b43312fc6490cb7327c420631fbe5ea58163 100644 (file)
@@ -259,7 +259,7 @@ pmp_done:
        li t0, SR_FS
        csrc CSR_STATUS, t0
 
-#ifdef CONFIG_SMP
+#ifdef CONFIG_RISCV_BOOT_SPINWAIT
        li t0, CONFIG_NR_CPUS
        blt a0, t0, .Lgood_cores
        tail .Lsecondary_park
@@ -285,7 +285,7 @@ pmp_done:
        beq t0, t1, .Lsecondary_start
 
 #endif /* CONFIG_XIP */
-#endif /* CONFIG_SMP */
+#endif /* CONFIG_RISCV_BOOT_SPINWAIT */
 
 #ifdef CONFIG_XIP_KERNEL
        la sp, _end + THREAD_SIZE
@@ -344,7 +344,7 @@ clear_bss_done:
        call soc_early_init
        tail start_kernel
 
-#ifdef CONFIG_SMP
+#if CONFIG_RISCV_BOOT_SPINWAIT
 .Lsecondary_start:
        /* Set trap vector to spin forever to help debug */
        la a3, .Lsecondary_park
@@ -371,7 +371,7 @@ clear_bss_done:
        fence
 
        tail .Lsecondary_start_common
-#endif
+#endif /* CONFIG_RISCV_BOOT_SPINWAIT */
 
 END(_start_kernel)
 
index 5393cca777901e37ae071f93c147bc9c278031a7..726731ada5349c3e5cc58765ce5d94dae0edfb58 100644 (file)
@@ -16,7 +16,9 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa);
 asmlinkage void __init __copy_data(void);
 #endif
 
+#ifdef CONFIG_RISCV_BOOT_SPINWAIT
 extern void *__cpu_spinwait_stack_pointer[];
 extern void *__cpu_spinwait_task_pointer[];
+#endif
 
 #endif /* __ASM_HEAD_H */