diff options
Diffstat (limited to 'arch/arm/mach-exynos/firmware.c')
| -rw-r--r-- | arch/arm/mach-exynos/firmware.c | 31 | 
1 files changed, 30 insertions, 1 deletions
diff --git a/arch/arm/mach-exynos/firmware.c b/arch/arm/mach-exynos/firmware.c index 932129ef26c..e8797bb7887 100644 --- a/arch/arm/mach-exynos/firmware.c +++ b/arch/arm/mach-exynos/firmware.c @@ -18,6 +18,7 @@  #include <mach/map.h> +#include "common.h"  #include "smc.h"  static int exynos_do_idle(void) @@ -28,13 +29,41 @@ static int exynos_do_idle(void)  static int exynos_cpu_boot(int cpu)  { +	/* +	 * Exynos3250 doesn't need to send smc command for secondary CPU boot +	 * because Exynos3250 removes WFE in secure mode. +	 */ +	if (soc_is_exynos3250()) +		return 0; + +	/* +	 * The second parameter of SMC_CMD_CPU1BOOT command means CPU id. +	 * But, Exynos4212 has only one secondary CPU so second parameter +	 * isn't used for informing secure firmware about CPU id. +	 */ +	if (soc_is_exynos4212()) +		cpu = 0; +  	exynos_smc(SMC_CMD_CPU1BOOT, cpu, 0, 0);  	return 0;  }  static int exynos_set_cpu_boot_addr(int cpu, unsigned long boot_addr)  { -	void __iomem *boot_reg = S5P_VA_SYSRAM_NS + 0x1c + 4*cpu; +	void __iomem *boot_reg; + +	if (!sysram_ns_base_addr) +		return -ENODEV; + +	boot_reg = sysram_ns_base_addr + 0x1c; + +	/* +	 * Almost all Exynos-series of SoCs that run in secure mode don't need +	 * additional offset for every CPU, with Exynos4412 being the only +	 * exception. +	 */ +	if (soc_is_exynos4412()) +		boot_reg += 4 * cpu;  	__raw_writel(boot_addr, boot_reg);  	return 0;  | 
