
2016-06-18 0:05 GMT+09:00 Mark Rutland mark.rutland@arm.com:
On Fri, Jun 17, 2016 at 09:51:49PM +0900, Masahiro Yamada wrote:
There are two enable methods supported by ARM64 Linux; psci and spin-table. The latter is simpler and easier to use for quick SoC bring-up.
So, I used the spin-table for my first ARMv8 SoC porting, but I found its support in U-Boot was poor. It is true there exists a code fragment for the spin code in arch/arm/cpu/armv8/start.S, but I see some problems:
We must hard-code CPU_RELEASE_ADDR so that it matches the "cpu-release-addr" property in the DT that comes from the kernel tree.
The Documentation/arm64/booting.txt in Linux requires that the release address must be zero-initialized, but it is not cared by the common code in U-Boot. So, we must do it in a board specific manner.
There is no systematic way to protect the spin code from the kernel. U-Boot relocates itself during the boot, so it is difficult to predict where the spin code will be located after the relocation, which makes it even more difficult to hard-code /memreserve/ in the DT of the kernel. One possible work-around would be to pre-fetch the spin-code into the I-cache of secondary CPUs, but this is an unsafe solution.
So, here is a patch to solve the problems. In this approach, the DT is run-time modified to reserve the spin code (+ cpu-release-addr). Also, the "cpu-release-addr" property is set to an appropriate address after the relocation, which means we no longer need the hard-coded CPU_RELEASE_ADDR.
Currently this patch only supports ARMv8, but theoretically nothing about the spin-table is arch-specific. Perhaps, we might want to support it on PowerPC in the future. So, I put the DT fixup code into the common/ directory. Very little code must be written in assembler, which went to the arch/arm/cpu/armv8/ directory.
It's worth noting that while both arm64 and PPC have something called "spin-table", they're not quite the same. The arm64 version just reused the enable-method and property names for something different (and arch-specific).
I have no strong feelings about where the code lives, however.
I did not know this. Thanks.
Maybe I should consider moving all the code to arch/arm/cpu/armv8/ and renaming CONFIG_SPIN_TABLE to CONFIG_ARMV8_SPIN_TABLE.