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.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJVr48oAAoJEMo4jShGhw+JmpYP/RH/9EPvUSsOEYlRYNGlGfz8
 FxnBitLnPiEStK/Iu0gsAgDJLiz5GriXM/DGUSZxlRCDPfLcvXEvO9yrQ03HwKhx
 dJWkpeUGBmHgjLCbrHuUB83KxhDpKeC7RdoQUBKWY13top5DIO/EbzMYuHzxG6nW
 gbVpGi88gCWvVR076gui95PAOLM4hY6enhUKoePQT/Pln6A/qp4dTCb0eVJpMMbm
 VTXis8114jPoivTUNHy4lT9R27SjBLfvXMa6jLZwvFJ70eHc+7cN/kXamKnhyerD
 ogmz3XlUEcqzm3guYsohtE6sCLrOF8tQRGo/qA8t8hQQ+DK0yLimDmqM5C6uxZF1
 NIoLfETyuvXngroVBZrqQ3bL5CeXgHT4FJfp+pfdxz6YxpGEM5FRn4oorM6bPHWU
 dsR/7u/Qi3CJ14L1WA7C2VmIlsOCL8tHDhDRsVpEciN6UBRpiCCjVtYrJSOee7er
 u0J3/SKsdaCGmULZLN2aveqzai6QHpYNEEZP8d6yikGUAhAhFwWslX9EfgKmUW6N
 uNsDmqe5G+mG753ni3tSbr0FUALp69QeqQTkMYlmNsMdaFRdzMkjkbvQlCc6oyVf
 N3TMp73EwRrMZ/h9o6OX0pp6t1iVwmpqgs8slb5IBrK+a04cck4DYPYQvvQ+c1vi
 KwdoGauAvnvCGE0XZtBq
 =KbCI
 -----END PGP SIGNATURE-----

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: Olof Johansson <olof@lixom.net>
This commit is contained in:
Olof Johansson 2015-07-27 14:25:23 +02:00
commit 7bd1584bd5
3 changed files with 55 additions and 5 deletions

View File

@ -37,6 +37,7 @@ pen: ldr r7, [r6]
* should now contain the SVC stack for this core
*/
b secondary_startup
ENDPROC(sti_secondary_startup)
1: .long .
.long pen_release

View File

@ -20,6 +20,7 @@
#include <linux/io.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/memblock.h>
#include <asm/cacheflush.h>
#include <asm/smp_plat.h>
@ -38,8 +39,6 @@ static DEFINE_SPINLOCK(boot_lock);
static void sti_secondary_init(unsigned int cpu)
{
trace_hardirqs_off();
/*
* let the primary processor know we're out of the
* 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)
static void __init sti_smp_prepare_cpus(unsigned int max_cpus)
{
void __iomem *scu_base = NULL;
struct device_node *np = of_find_compatible_node(
NULL, NULL, "arm,cortex-a9-scu");
struct device_node *np;
void __iomem *scu_base;
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) {
scu_base = of_iomap(np, 0);
scu_enable(scu_base);
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 = {

View File

@ -14,4 +14,6 @@
extern struct smp_operations sti_smp_ops;
void sti_secondary_startup(void);
#endif