[Also adding Tom Rini as ARM maintainer]
Am 2020-05-14 22:17, schrieb Alexander Graf:
On 14.05.20 20:46, Heinrich Schuchardt wrote:
On 5/14/20 2:38 PM, Michael Walle wrote:
On some architectures, specifically the layerscape, the secondary
cores
wait for an interrupt before entering the spin-tables. This applies
only
to boards which doesn't have PSCI provided by TF-a and u-boot does
the
%s/TF-a/TF-A/, %s/u-boot/U-Boot/
secondary cores handling.
bootm/booti already call that function for ARM architecture; also add
it
to bootelf before switching to EL2. Additionally, provide a weak noop
function so we don't have to have "#ifdef CONFIG_ARM64" guards.
Signed-off-by: Michael Walle <mich...@walle.cc>
---
common/bootm.c | 9 +++++++++
lib/efi_loader/efi_setup.c | 6 ++++++
2 files changed, 15 insertions(+)
diff --git a/common/bootm.c b/common/bootm.c
index db4362a643..65adf29329 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -816,6 +816,15 @@ void __weak switch_to_non_secure_mode(void)
{
}
+/**
+ * smp_kick_all_cpus() - kick all CPUs
+ *
+ * This routine is overridden by architectures requiring this
feature.
+ */
+void __weak smp_kick_all_cpus(void)
+{
+}
+
#else /* USE_HOSTCC */
#if defined(CONFIG_FIT_SIGNATURE)
diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
index 26a7423203..7e5364adc5 100644
--- a/lib/efi_loader/efi_setup.c
+++ b/lib/efi_loader/efi_setup.c
@@ -132,6 +132,12 @@ efi_status_t efi_init_obj_list(void)
/* Allow unaligned memory access */
allow_unaligned();
+ /*
+ * Some architectures need to kick secondary cores to enter their
+ * spin table.
+ */
+ smp_kick_all_cpus();
This will not compile with
CONFIG_CMD_BOOTI=n
CONFIG_CMD_BOOTM=n
CONFIG_CMD_BOOTZ=n
Much worse is that in incurs needless overhead on PSCI capable
platforms. Can we move the smp_kick_all_cpus() to the board or soc
level of the few systems that use spin tables please? :)
Ok, I'm not sure where I should put the smp_kick_all_cpus(). In the
bootm/booti path this is done in boot_jump_linux() (unconditionally
in do_nonsec_virt_switch()). Therefore, shouldn't the kick be in
switch_to_non_secure_mode(), too?
Regarding the overhead, isn't it just called once before starting
the OS? Is that really worth adding yet another weak function or
ifdef guards? Isn't it better to behave like the bootm case?
--
-michael