Commit 7bd1584b authored by Olof Johansson's avatar Olof Johansson

Merge tag 'sti-soc-for-v4.3-1' of...

Merge tag 'sti-soc-for-v4.3-1' of https://git.kernel.org/pub/scm/linux/kernel/git/mcoquelin/sti into next/soc

STi SoC updates for v4.3, round 1.

Highlights:
-----------
 - Add code to release secondary cores from holding pen.
 - Remove useless call to trace_hardirqs_off() in secondary core init function.

* tag 'sti-soc-for-v4.3-1' of https://git.kernel.org/pub/scm/linux/kernel/git/mcoquelin/sti:
  ARM: STi: Remove platform call to trace_hardirqs_off()
  ARM: STi: Add code to release secondary cores from holding pen.
Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
parents d7030a08 50de4dd4
...@@ -37,6 +37,7 @@ pen: ldr r7, [r6] ...@@ -37,6 +37,7 @@ pen: ldr r7, [r6]
* should now contain the SVC stack for this core * should now contain the SVC stack for this core
*/ */
b secondary_startup b secondary_startup
ENDPROC(sti_secondary_startup)
1: .long . 1: .long .
.long pen_release .long pen_release
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/memblock.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/smp_plat.h> #include <asm/smp_plat.h>
...@@ -38,8 +39,6 @@ static DEFINE_SPINLOCK(boot_lock); ...@@ -38,8 +39,6 @@ static DEFINE_SPINLOCK(boot_lock);
static void sti_secondary_init(unsigned int cpu) static void sti_secondary_init(unsigned int cpu)
{ {
trace_hardirqs_off();
/* /*
* let the primary processor know we're out of the * let the primary processor know we're out of the
* pen, then head off into the C entry point * pen, then head off into the C entry point
...@@ -99,14 +98,62 @@ static int sti_boot_secondary(unsigned int cpu, struct task_struct *idle) ...@@ -99,14 +98,62 @@ static int sti_boot_secondary(unsigned int cpu, struct task_struct *idle)
static void __init sti_smp_prepare_cpus(unsigned int max_cpus) static void __init sti_smp_prepare_cpus(unsigned int max_cpus)
{ {
void __iomem *scu_base = NULL; struct device_node *np;
struct device_node *np = of_find_compatible_node( void __iomem *scu_base;
NULL, NULL, "arm,cortex-a9-scu"); u32 __iomem *cpu_strt_ptr;
u32 release_phys;
int cpu;
unsigned long entry_pa = virt_to_phys(sti_secondary_startup);
np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-scu");
if (np) { if (np) {
scu_base = of_iomap(np, 0); scu_base = of_iomap(np, 0);
scu_enable(scu_base); scu_enable(scu_base);
of_node_put(np); of_node_put(np);
} }
if (max_cpus <= 1)
return;
for_each_possible_cpu(cpu) {
np = of_get_cpu_node(cpu, NULL);
if (!np)
continue;
if (of_property_read_u32(np, "cpu-release-addr",
&release_phys)) {
pr_err("CPU %d: missing or invalid cpu-release-addr "
"property\n", cpu);
continue;
}
/*
* holding pen is usually configured in SBC DMEM but can also be
* in RAM.
*/
if (!memblock_is_memory(release_phys))
cpu_strt_ptr =
ioremap(release_phys, sizeof(release_phys));
else
cpu_strt_ptr =
(u32 __iomem *)phys_to_virt(release_phys);
__raw_writel(entry_pa, cpu_strt_ptr);
/*
* wmb so that data is actually written
* before cache flush is done
*/
smp_wmb();
sync_cache_w(cpu_strt_ptr);
if (!memblock_is_memory(release_phys))
iounmap(cpu_strt_ptr);
}
} }
struct smp_operations __initdata sti_smp_ops = { struct smp_operations __initdata sti_smp_ops = {
......
...@@ -14,4 +14,6 @@ ...@@ -14,4 +14,6 @@
extern struct smp_operations sti_smp_ops; extern struct smp_operations sti_smp_ops;
void sti_secondary_startup(void);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment