-
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.
Merge branch 'socfpga/smp' into next/smp
SMP support for socfpga platform, from Dinh Nguyen <dinguyen@altera.com> v3: -cleaned up socfpga_defconfig. -Needs # CONFIG_ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA is not set -Removed CONFIG_VMSPLIT_2G, as system has 2GB of RAM -Removed CONFIG_ARCH_TIMER -Remove pen_release variable -Added Reviewed-by: Rob Herring <rob.herring@calxeda.com> v2: -Remove pen_release code -Remove code that was already done by v7_setup -Add bindings document for reset and system manager -Move socfpga_sysmgr_init from platsmp.c to socfpga.c, because we will need to use the reset and system manager for more than SMP. -Move core.h to mach-socfpga from mach-socfpga/include/mach * socfpga/smp: ARM: socfpga: Enable SMP for socfpga Signed-off-by: Arnd Bergmann <arnd@arndb.de>
- Loading branch information
Showing
10 changed files
with
254 additions
and
2 deletions.
There are no files selected for viewing
11 changes: 11 additions & 0 deletions
11
Documentation/devicetree/bindings/arm/altera/socfpga-reset.txt
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,11 @@ | ||
Altera SOCFPGA Reset Manager | ||
|
||
Required properties: | ||
- compatible : "altr,rst-mgr" | ||
- reg : Should contain 1 register ranges(address and length) | ||
|
||
Example: | ||
rstmgr@ffd05000 { | ||
compatible = "altr,rst-mgr"; | ||
reg = <0xffd05000 0x1000>; | ||
}; |
11 changes: 11 additions & 0 deletions
11
Documentation/devicetree/bindings/arm/altera/socfpga-system.txt
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,11 @@ | ||
Altera SOCFPGA System Manager | ||
|
||
Required properties: | ||
- compatible : "altr,sys-mgr" | ||
- reg : Should contain 1 register ranges(address and length) | ||
|
||
Example: | ||
sysmgr@ffd08000 { | ||
compatible = "altr,sys-mgr"; | ||
reg = <0xffd08000 0x1000>; | ||
}; |
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 |
---|---|---|
|
@@ -3,3 +3,4 @@ | |
# | ||
|
||
obj-y := socfpga.o | ||
obj-$(CONFIG_SMP) += headsmp.o platsmp.o |
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,34 @@ | ||
/* | ||
* Copyright 2012 Pavel Machek <pavel@denx.de> | ||
* Copyright (C) 2012 Altera Corporation | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
*/ | ||
|
||
#ifndef __MACH_CORE_H | ||
#define __MACH_CORE_H | ||
|
||
extern void secondary_startup(void); | ||
extern void __iomem *socfpga_scu_base_addr; | ||
|
||
extern void socfpga_init_clocks(void); | ||
extern void socfpga_sysmgr_init(void); | ||
|
||
extern struct smp_operations socfpga_smp_ops; | ||
extern char secondary_trampoline, secondary_trampoline_end; | ||
|
||
#define SOCFPGA_SCU_VIRT_BASE 0xfffec000 | ||
|
||
#endif |
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,24 @@ | ||
/* | ||
* Copyright (c) 2003 ARM Limited | ||
* Copyright (c) u-boot contributors | ||
* Copyright (c) 2012 Pavel Machek <pavel@denx.de> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
#include <linux/linkage.h> | ||
#include <linux/init.h> | ||
|
||
__INIT | ||
|
||
#define CPU1_START_ADDR 0xffd08010 | ||
|
||
ENTRY(secondary_trampoline) | ||
movw r0, #:lower16:CPU1_START_ADDR | ||
movt r0, #:upper16:CPU1_START_ADDR | ||
|
||
ldr r1, [r0] | ||
bx r1 | ||
|
||
ENTRY(secondary_trampoline_end) |
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,116 @@ | ||
/* | ||
* Copyright 2010-2011 Calxeda, Inc. | ||
* Copyright 2012 Pavel Machek <pavel@denx.de> | ||
* Based on platsmp.c, Copyright (C) 2002 ARM Ltd. | ||
* Copyright (C) 2012 Altera Corporation | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms and conditions of the GNU General Public License, | ||
* version 2, as published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope it will be useful, but WITHOUT | ||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
* more details. | ||
* | ||
* You should have received a copy of the GNU General Public License along with | ||
* this program. If not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
#include <linux/delay.h> | ||
#include <linux/init.h> | ||
#include <linux/smp.h> | ||
#include <linux/io.h> | ||
#include <linux/of.h> | ||
#include <linux/of_address.h> | ||
|
||
#include <asm/cacheflush.h> | ||
#include <asm/hardware/gic.h> | ||
#include <asm/smp_scu.h> | ||
#include <asm/smp_plat.h> | ||
|
||
#include "core.h" | ||
|
||
extern void __iomem *sys_manager_base_addr; | ||
extern void __iomem *rst_manager_base_addr; | ||
|
||
static void __cpuinit socfpga_secondary_init(unsigned int cpu) | ||
{ | ||
/* | ||
* if any interrupts are already enabled for the primary | ||
* core (e.g. timer irq), then they will not have been enabled | ||
* for us: do so | ||
*/ | ||
gic_secondary_init(0); | ||
} | ||
|
||
static int __cpuinit socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle) | ||
{ | ||
int trampoline_size = &secondary_trampoline_end - &secondary_trampoline; | ||
|
||
memcpy(phys_to_virt(0), &secondary_trampoline, trampoline_size); | ||
|
||
__raw_writel(virt_to_phys(secondary_startup), (sys_manager_base_addr+0x10)); | ||
|
||
flush_cache_all(); | ||
smp_wmb(); | ||
outer_clean_range(0, trampoline_size); | ||
|
||
/* This will release CPU #1 out of reset.*/ | ||
__raw_writel(0, rst_manager_base_addr + 0x10); | ||
|
||
return 0; | ||
} | ||
|
||
/* | ||
* Initialise the CPU possible map early - this describes the CPUs | ||
* which may be present or become present in the system. | ||
*/ | ||
static void __init socfpga_smp_init_cpus(void) | ||
{ | ||
unsigned int i, ncores; | ||
|
||
ncores = scu_get_core_count(socfpga_scu_base_addr); | ||
|
||
for (i = 0; i < ncores; i++) | ||
set_cpu_possible(i, true); | ||
|
||
/* sanity check */ | ||
if (ncores > num_possible_cpus()) { | ||
pr_warn("socfpga: no. of cores (%d) greater than configured" | ||
"maximum of %d - clipping\n", ncores, num_possible_cpus()); | ||
ncores = num_possible_cpus(); | ||
} | ||
|
||
for (i = 0; i < ncores; i++) | ||
set_cpu_possible(i, true); | ||
|
||
set_smp_cross_call(gic_raise_softirq); | ||
} | ||
|
||
static void __init socfpga_smp_prepare_cpus(unsigned int max_cpus) | ||
{ | ||
scu_enable(socfpga_scu_base_addr); | ||
} | ||
|
||
/* | ||
* platform-specific code to shutdown a CPU | ||
* | ||
* Called with IRQs disabled | ||
*/ | ||
static void socfpga_cpu_die(unsigned int cpu) | ||
{ | ||
cpu_do_idle(); | ||
|
||
/* We should have never returned from idle */ | ||
panic("cpu %d unexpectedly exit from shutdown\n", cpu); | ||
} | ||
|
||
struct smp_operations socfpga_smp_ops __initdata = { | ||
.smp_init_cpus = socfpga_smp_init_cpus, | ||
.smp_prepare_cpus = socfpga_smp_prepare_cpus, | ||
.smp_secondary_init = socfpga_secondary_init, | ||
.smp_boot_secondary = socfpga_boot_secondary, | ||
#ifdef CONFIG_HOTPLUG_CPU | ||
.cpu_die = socfpga_cpu_die, | ||
#endif | ||
}; |
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