diff options
author | Alexey Brodkin <abrodkin@synopsys.com> | 2015-04-13 13:37:05 +0300 |
---|---|---|
committer | Alexey Brodkin <abrodkin@synopsys.com> | 2015-07-01 17:17:27 +0300 |
commit | 8b2eb776b13055e71f94367c06a26c5e3a902f16 (patch) | |
tree | aad534710ed24ea662d54446c0e928b1b52c1ce1 /arch/arc | |
parent | 9c6b05cb724e18d1db3f9e1a75b2272572f06fbd (diff) | |
download | u-boot-8b2eb776b13055e71f94367c06a26c5e3a902f16.zip u-boot-8b2eb776b13055e71f94367c06a26c5e3a902f16.tar.gz u-boot-8b2eb776b13055e71f94367c06a26c5e3a902f16.tar.bz2 |
arc: implement slave cores kick-start for Linux kernel
With new SMP-enabled CPUs with ARC HS38 cores and corresponding support
in Linux kernel it's required to add basic SMP support in U-Boot.
Currently we assume the one and only core starts execution after
power-on. So most of things in U-Boot is handled in UP mode.
But when U-Boot is used for loading and starting Linux kernel right
before jumping to kernel's entry point U-Boot:
[1] Sets all slave cores to jump to the same address [kernel's entry
point]
[2] Really starts all slav cores
In ARC's implemetation of SMP in Linux kernel all cores are supposed to
run the same start-up code. But only core with ID 0 (master core)
processes further while others are looping waiting for master core to
complete some initialization.
That means it's safe to un-pause slave cores and let them execute kernel
- they will wait for master anyway.
Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Cc: Vineet Gupta <vgupta@synopsys.com>
Diffstat (limited to 'arch/arc')
-rw-r--r-- | arch/arc/lib/bootm.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/arc/lib/bootm.c b/arch/arc/lib/bootm.c index d185a50..04d9d9c 100644 --- a/arch/arc/lib/bootm.c +++ b/arch/arc/lib/bootm.c @@ -53,6 +53,9 @@ static void boot_prep_linux(bootm_headers_t *images) hang(); } +__weak void smp_set_core_boot_addr(unsigned long addr, int corenr) {} +__weak void smp_kick_all_cpus(void) {} + /* Subcommand: GO */ static void boot_jump_linux(bootm_headers_t *images, int flag) { @@ -80,6 +83,9 @@ static void boot_jump_linux(bootm_headers_t *images, int flag) r2 = (unsigned int)getenv("bootargs"); } + smp_set_core_boot_addr((unsigned long)kernel_entry, -1); + smp_kick_all_cpus(); + if (!fake) kernel_entry(r0, 0, r2); } |