[PATCH] lib: sbi: Respect boot hart setting in "dynamic" boot mode
Xiang W
wxjstz at 126.com
Tue Jun 4 04:26:03 PDT 2024
在 2024-06-04星期二的 18:33 +0800,Inochi Amaoto写道:
> In "dynamic" boot mode, the boot hart is only used for the early
> initialization, but not for the coldboot even if it is available.
> This make the boot hart configuration in the dynamic mode
> meaningless.
>
> To solve this, add extra check for coldboot detection and fallback
> to the lottery if the boot hart does not support coldboot.
>
> Signed-off-by: Inochi Amaoto <inochiama at outlook.com>
It seems that someone has submitted a similar patch. But this is not
necessary, see the comment of fw_dynamic_info.hartid:
/**
* Preferred boot HART id
*
* It is possible that the previous booting stage uses same link
* address as the FW_DYNAMIC firmware. In this case, the relocation
* lottery mechanism can potentially overwrite the previous booting
* stage while other HARTs are still running in the previous booting
* stage leading to boot-time crash. To avoid this boot-time crash,
* the previous booting stage can specify last HART that will jump
* to the FW_DYNAMIC firmware as the preferred boot HART.
*
* To avoid specifying a preferred boot HART, the previous booting
* stage can set it to -1UL which will force the FW_DYNAMIC firmware
* to use the relocation lottery mechanism.
*/
If you need to specify the cold boot hart, you can set cold-boot-harts through dt.
Regards,
Xiang W
> ---
> firmware/fw_dynamic.S | 4 +---
> include/sbi/sbi_init.h | 2 ++
> lib/sbi/sbi_init.c | 14 +++++++++++++-
> 3 files changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/firmware/fw_dynamic.S b/firmware/fw_dynamic.S
> index 5ee2883..c08ba5f 100644
> --- a/firmware/fw_dynamic.S
> +++ b/firmware/fw_dynamic.S
> @@ -66,7 +66,7 @@ fw_save_info:
> li a4, FW_DYNAMIC_INFO_VERSION_2
> REG_L a3, FW_DYNAMIC_INFO_VERSION_OFFSET(a2)
> blt a3, a4, 2f
> - lla a4, _dynamic_boot_hart
> + lla a4, sbi_boot_hart
> REG_L a3, FW_DYNAMIC_INFO_BOOT_HART_OFFSET(a2)
> REG_S a3, (a4)
> 2:
> @@ -133,5 +133,3 @@ _dynamic_next_mode:
> RISCV_PTR PRV_S
> _dynamic_options:
> RISCV_PTR 0x0
> -_dynamic_boot_hart:
> - RISCV_PTR -1
> diff --git a/include/sbi/sbi_init.h b/include/sbi/sbi_init.h
> index 9640fee..dd88c23 100644
> --- a/include/sbi/sbi_init.h
> +++ b/include/sbi/sbi_init.h
> @@ -22,4 +22,6 @@ unsigned long sbi_init_count(u32 hartid);
>
> void __noreturn sbi_exit(struct sbi_scratch *scratch);
>
> +extern long sbi_boot_hart;
> +
> #endif
> diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
> index 389172a..70ff4d7 100644
> --- a/lib/sbi/sbi_init.c
> +++ b/lib/sbi/sbi_init.c
> @@ -18,6 +18,7 @@
> #include <sbi/sbi_hartmask.h>
> #include <sbi/sbi_heap.h>
> #include <sbi/sbi_hsm.h>
> +#include <sbi/sbi_init.h>
> #include <sbi/sbi_ipi.h>
> #include <sbi/sbi_irqchip.h>
> #include <sbi/sbi_platform.h>
> @@ -479,6 +480,8 @@ static void __noreturn init_warmboot(struct sbi_scratch *scratch, u32 hartid)
>
> static atomic_t coldboot_lottery = ATOMIC_INITIALIZER(0);
>
> +long sbi_boot_hart = -1;
> +
> /**
> * Initialize OpenSBI library for current HART and jump to next
> * booting stage.
> @@ -532,9 +535,18 @@ void __noreturn sbi_init(struct sbi_scratch *scratch)
> *
> * We use a lottery mechanism to select coldboot HART among
> * HARTs which satisfy above condition.
> + *
> + * If user set the boot HART, we will check whether it supports
> + * coldboot, and boot the system with the selected one if the
> + * check success. Otherwise, we fall back to any supported HART
> + * selected from the lottery mechanism.
> */
>
> - if (sbi_platform_cold_boot_allowed(plat, hartid)) {
> + if (sbi_boot_hart != -1 &&
> + sbi_platform_cold_boot_allowed(plat, sbi_boot_hart)) {
> + if (sbi_boot_hart == hartid)
> + coldboot = true;
> + } else if (sbi_platform_cold_boot_allowed(plat, hartid)) {
> if (next_mode_supported &&
> atomic_xchg(&coldboot_lottery, 1) == 0)
> coldboot = true;
> --
> 2.45.2
>
>
More information about the opensbi
mailing list