]> git.baikalelectronics.ru Git - uboot.git/commit
armv8: Fix and simplify branch_if_master/branch_if_slave
authorAndre Przywara <andre.przywara@arm.com>
Fri, 11 Feb 2022 11:29:39 +0000 (11:29 +0000)
committerTom Rini <trini@konsulko.com>
Wed, 2 Mar 2022 18:59:29 +0000 (13:59 -0500)
commitff06e15f39c433df73b907915eddf2a7986d1c5a
treeda9d57e285034143ed1e9cd4dfc30577792275ad
parent16766a370949742670fbf1a256270c00b1c55579
armv8: Fix and simplify branch_if_master/branch_if_slave

The branch_if_master macro jumps to a label if the CPU is the "master"
core, which we define as having all affinity levels set to 0. To check
for this condition, we need to mask off some bits from the MPIDR
register, then compare the remaining register value against zero.

The implementation of this was slighly broken (it preserved the upper
RES0 bits), overly complicated and hard to understand, especially since
it lacked comments. The same was true for the very similar
branch_if_slave macro.

Use a much shorter assembly sequence for those checks, use the same
masking for both macros (just negate the final branch), and put some
comments on them, to make it clear what the code does.
This allows to drop the second temporary register for branch_if_master,
so we adjust all call sites as well.

Also use the opportunity to remove a misleading comment: the macro
works fine on SoCs with multiple clusters. Judging by the commit
message, the original problem with the Juno SoC stems from the fact that
the master CPU *can* be configured to be from cluster 1, so the
assumption that the master CPU has all affinity values set to 0 does not
hold there. But this is already mentioned above in a comment, so remove
the extra comment.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S
arch/arm/cpu/armv8/start.S
arch/arm/include/asm/macro.h
arch/arm/mach-rmobile/lowlevel_init_gen3.S
arch/arm/mach-socfpga/lowlevel_init_soc64.S
board/cortina/presidio-asic/lowlevel_init.S