-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ARM: mvebu: add SMP support for Armada 375 and Armada 38x
This commit adds the SMP support for Armada 375 and Armada 38x. It turns out that the SMP logic for both of these SOCs are fairly similar, the only differences being: * A different method to set the secondary CPU boot address * An Armada 375 specific workaround needed for the early Z1 stepping, added by the following patch. Other than that, the patch is fairly straightforward and adds the usual platsmp and headsmp code, defining the smp_operations structure that is referenced from the DT_MACHINE structures. Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com> Link: https://lkml.kernel.org/r/1397483648-26611-9-git-send-email-thomas.petazzoni@free-electrons.com Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Link: https://lkml.kernel.org/r/1397483648-26611-9-git-send-email-thomas.petazzoni@free-electrons.com Signed-off-by: Jason Cooper <jason@lakedaemon.net>
- Loading branch information
Gregory CLEMENT
authored and
Jason Cooper
committed
May 8, 2014
1 parent
00504be
commit 1ee89e2
Showing
5 changed files
with
97 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
/* | ||
* SMP support: Entry point for secondary CPUs of Marvell EBU | ||
* Cortex-A9 based SOCs (Armada 375 and Armada 38x). | ||
* | ||
* Copyright (C) 2014 Marvell | ||
* | ||
* Gregory CLEMENT <gregory.clement@free-electrons.com> | ||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | ||
* | ||
* This file is licensed under the terms of the GNU General Public | ||
* License version 2. This program is licensed "as is" without any | ||
* warranty of any kind, whether express or implied. | ||
*/ | ||
|
||
#include <linux/linkage.h> | ||
#include <linux/init.h> | ||
|
||
__CPUINIT | ||
ENTRY(mvebu_cortex_a9_secondary_startup) | ||
bl v7_invalidate_l1 | ||
b secondary_startup | ||
ENDPROC(mvebu_cortex_a9_secondary_startup) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
/* | ||
* Symmetric Multi Processing (SMP) support for Marvell EBU Cortex-A9 | ||
* based SOCs (Armada 375/38x). | ||
* | ||
* Copyright (C) 2014 Marvell | ||
* | ||
* Gregory CLEMENT <gregory.clement@free-electrons.com> | ||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | ||
* | ||
* This file is licensed under the terms of the GNU General Public | ||
* License version 2. This program is licensed "as is" without any | ||
* warranty of any kind, whether express or implied. | ||
*/ | ||
|
||
#include <linux/init.h> | ||
#include <linux/io.h> | ||
#include <linux/of.h> | ||
#include <linux/smp.h> | ||
#include <asm/smp_scu.h> | ||
#include <asm/smp_plat.h> | ||
#include "common.h" | ||
#include "pmsu.h" | ||
|
||
extern void mvebu_cortex_a9_secondary_startup(void); | ||
|
||
static int __cpuinit mvebu_cortex_a9_boot_secondary(unsigned int cpu, | ||
struct task_struct *idle) | ||
{ | ||
int ret, hw_cpu; | ||
|
||
pr_info("Booting CPU %d\n", cpu); | ||
|
||
/* | ||
* Write the address of secondary startup into the system-wide | ||
* flags register. The boot monitor waits until it receives a | ||
* soft interrupt, and then the secondary CPU branches to this | ||
* address. | ||
*/ | ||
hw_cpu = cpu_logical_map(cpu); | ||
|
||
if (of_machine_is_compatible("marvell,armada375")) | ||
mvebu_system_controller_set_cpu_boot_addr(mvebu_cortex_a9_secondary_startup); | ||
else | ||
mvebu_pmsu_set_cpu_boot_addr(hw_cpu, | ||
mvebu_cortex_a9_secondary_startup); | ||
|
||
smp_wmb(); | ||
ret = mvebu_cpu_reset_deassert(hw_cpu); | ||
if (ret) { | ||
pr_err("Could not start the secondary CPU: %d\n", ret); | ||
return ret; | ||
} | ||
arch_send_wakeup_ipi_mask(cpumask_of(cpu)); | ||
|
||
return 0; | ||
} | ||
|
||
static struct smp_operations mvebu_cortex_a9_smp_ops __initdata = { | ||
.smp_boot_secondary = mvebu_cortex_a9_boot_secondary, | ||
#ifdef CONFIG_HOTPLUG_CPU | ||
.cpu_die = armada_xp_cpu_die, | ||
#endif | ||
}; | ||
|
||
CPU_METHOD_OF_DECLARE(mvebu_armada_375_smp, "marvell,armada-375-smp", | ||
&mvebu_cortex_a9_smp_ops); | ||
CPU_METHOD_OF_DECLARE(mvebu_armada_380_smp, "marvell,armada-380-smp", | ||
&mvebu_cortex_a9_smp_ops); |