[PATCH 4/4] efi_loader: call smp_kick_all_cpus()

Michael Walle michael at walle.cc
Sat May 16 17:54:43 CEST 2020


[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 <michael at 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


More information about the U-Boot mailing list