Prepare v2017.01
[platform/kernel/u-boot.git] / arch / arm / cpu / armv8 / cpu.c
1 /*
2  * (C) Copyright 2008 Texas Insturments
3  *
4  * (C) Copyright 2002
5  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
6  * Marius Groeger <mgroeger@sysgo.de>
7  *
8  * (C) Copyright 2002
9  * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
10  *
11  * SPDX-License-Identifier:     GPL-2.0+
12  */
13
14 #include <common.h>
15 #include <command.h>
16 #include <asm/system.h>
17 #include <asm/secure.h>
18 #include <linux/compiler.h>
19
20 int cleanup_before_linux(void)
21 {
22         /*
23          * this function is called just before we call linux
24          * it prepares the processor for linux
25          *
26          * disable interrupt and turn off caches etc ...
27          */
28         disable_interrupts();
29
30         /*
31          * Turn off I-cache and invalidate it
32          */
33         icache_disable();
34         invalidate_icache_all();
35
36         /*
37          * turn off D-cache
38          * dcache_disable() in turn flushes the d-cache and disables MMU
39          */
40         dcache_disable();
41         invalidate_dcache_all();
42
43         return 0;
44 }
45
46 #ifdef CONFIG_ARMV8_PSCI
47 static void relocate_secure_section(void)
48 {
49 #ifdef CONFIG_ARMV8_SECURE_BASE
50         size_t sz = __secure_end - __secure_start;
51
52         memcpy((void *)CONFIG_ARMV8_SECURE_BASE, __secure_start, sz);
53         flush_dcache_range(CONFIG_ARMV8_SECURE_BASE,
54                            CONFIG_ARMV8_SECURE_BASE + sz + 1);
55         invalidate_icache_all();
56 #endif
57 }
58
59 void armv8_setup_psci(void)
60 {
61         relocate_secure_section();
62         secure_ram_addr(psci_setup_vectors)();
63         secure_ram_addr(psci_arch_init)();
64 }
65 #endif