blob: 38dea5c51871eb4e20abf86f67aaf5bd9c4f6b10 [file] [log] [blame]
David Feng85fd5f12013-12-14 11:47:35 +08001/*
2 * (C) Copyright 2013
3 * David Feng <fenghua@phytium.com.cn>
4 *
5 * SPDX-License-Identifier: GPL-2.0+
6 */
7
8#include <asm-offsets.h>
9#include <config.h>
10#include <version.h>
11#include <linux/linkage.h>
12#include <asm/macro.h>
13
14ENTRY(armv8_switch_to_el2)
15 switch_el x0, 1f, 0f, 0f
160: ret
171:
18 mov x0, #0x5b1 /* Non-secure EL0/EL1 | HVC | 64bit EL2 */
19 msr scr_el3, x0
20 msr cptr_el3, xzr /* Disable coprocessor traps to EL3 */
21 mov x0, #0x33ff
22 msr cptr_el2, x0 /* Disable coprocessor traps to EL2 */
23
24 /* Initialize SCTLR_EL2 */
25 msr sctlr_el2, xzr
26
27 /* Return to the EL2_SP2 mode from EL3 */
28 mov x0, sp
29 msr sp_el2, x0 /* Migrate SP */
30 mrs x0, vbar_el3
31 msr vbar_el2, x0 /* Migrate VBAR */
32 mov x0, #0x3c9
33 msr spsr_el3, x0 /* EL2_SP2 | D | A | I | F */
34 msr elr_el3, lr
35 eret
36ENDPROC(armv8_switch_to_el2)
37
38ENTRY(armv8_switch_to_el1)
39 switch_el x0, 0f, 1f, 0f
400: ret
411:
42 /* Initialize Generic Timers */
43 mrs x0, cnthctl_el2
44 orr x0, x0, #0x3 /* Enable EL1 access to timers */
45 msr cnthctl_el2, x0
Mark Rutlandb4166702014-05-21 14:29:23 +010046 msr cntvoff_el2, xzr
David Feng85fd5f12013-12-14 11:47:35 +080047 mrs x0, cntkctl_el1
48 orr x0, x0, #0x3 /* Enable EL0 access to timers */
49 msr cntkctl_el1, x0
50
51 /* Initilize MPID/MPIDR registers */
52 mrs x0, midr_el1
53 mrs x1, mpidr_el1
54 msr vpidr_el2, x0
55 msr vmpidr_el2, x1
56
57 /* Disable coprocessor traps */
58 mov x0, #0x33ff
59 msr cptr_el2, x0 /* Disable coprocessor traps to EL2 */
60 msr hstr_el2, xzr /* Disable coprocessor traps to EL2 */
61 mov x0, #3 << 20
62 msr cpacr_el1, x0 /* Enable FP/SIMD at EL1 */
63
64 /* Initialize HCR_EL2 */
65 mov x0, #(1 << 31) /* 64bit EL1 */
66 orr x0, x0, #(1 << 29) /* Disable HVC */
67 msr hcr_el2, x0
68
69 /* SCTLR_EL1 initialization */
70 mov x0, #0x0800
71 movk x0, #0x30d0, lsl #16
72 msr sctlr_el1, x0
73
74 /* Return to the EL1_SP1 mode from EL2 */
75 mov x0, sp
76 msr sp_el1, x0 /* Migrate SP */
77 mrs x0, vbar_el2
78 msr vbar_el1, x0 /* Migrate VBAR */
79 mov x0, #0x3c5
80 msr spsr_el2, x0 /* EL1_SP1 | D | A | I | F */
81 msr elr_el2, lr
82 eret
83ENDPROC(armv8_switch_to_el1)