[PATCH v4 10/10] cmd: riscv: Add 'startharts' command to start multiple harts

Yao Zi ziyao at disroot.org
Thu Oct 9 13:43:55 CEST 2025


On Tue, Aug 19, 2025 at 10:34:39AM +0000, Uros Stajic wrote:
> From: Chao-ying Fu <cfu at mips.com>
> 
> Introduce the 'startharts' command for RISC-V targets, which prints
> or executes commands to power up and reset all harts and jump to
> 0x80000000. The command supports optional cluster/core count and
> immediate execution via the 'g' argument.
> 
> Signed-off-by: Chao-ying Fu <cfu at mips.com>
> Signed-off-by: Uros Stajic <uros.stajic at htecgroup.com>

I noticed in OpenSBI, P8700 already implements HSM extension[1], which
means it's usually unnecessary to take care of SMP stuff in U-Boot. Do
you still want the new startharts command?

In summary, there are two possible solutions to support SMP for RISC-V
systems with U-Boot and OpenSBI with minimal effort, where SPL runs in M
mode and proper U-Boot runs in S mode,

1. Release all the HARTs in SPL stage. With SMP enabled in U-Boot SPL, a
   core is randomly picked to run the main part of U-Boot SPL, and the
   others simply spin and wait.

   When all the initialization and load are finished, an IPI message is
   sent to each spinning HART, releasing them to the next-level
   firmware's entry (OpenSBI here), see smp_call_function called in
   spl_opensbi.c.

   This is usually more appropriate when your platform releases all
   HARTs when powered up, in which case you could omit the code of
   releasing all HARTs to U-Boot SPL. This requires a proper
   implementation of IPI, and proper description of all HARTs in
   devicetree.

2. Implement SMP bring-up code totally in OpenSBI. U-Boot itself is
   expected to run in single thread, so it's unnecessary to bring up any
   cores in U-Boot.

   RISC-V SBI defines a HART-State-Management extension (HSM). You could
   implement HART bring-up code in OpenSBI, and expecting kernel (maybe
   Linux) brings up the rest HARTs through the extension.

Looking through the startharts command, P8700 does require manual steps
to release non-boot cores, which makes option 1 less appropriate since
it introduces more platform-specific code to U-Boot, while it has been
already implemented in OpenSBI, becoming some duplicated code.

I suggest moving to HSM extension entirely and avoiding introducing any
SMP code in U-Boot for your port. Or, if you still prefer to implement
it in U-Boot, please re-use the existing framework of bring up HARTs
(smp_call_function, proper IPI, etc.). This could definitely helps
code review and future maintenance.

Best regards,
Yao Zi

[1]: https://github.com/riscv-software-src/opensbi/commit/66ab965e54017292d530033ffaae127389c45458


More information about the U-Boot mailing list