First version
[3rdparty/ote_partner/tlk.git] / arch / arm / include / arch / arm.h
1 /*
2  * Copyright (c) 2008 Travis Geiselbrecht
3  * Copyright (c) 2012-2013, NVIDIA CORPORATION. All rights reserved
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files
7  * (the "Software"), to deal in the Software without restriction,
8  * including without limitation the rights to use, copy, modify, merge,
9  * publish, distribute, sublicense, and/or sell copies of the Software,
10  * and to permit persons to whom the Software is furnished to do so,
11  * subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 #ifndef __ARCH_ARM_H
25 #define __ARCH_ARM_H
26
27 /* defines used in asm */
28 #define MODE_USR        0x10
29 #define MODE_FIQ        0x11
30 #define MODE_IRQ        0x12
31 #define MODE_SVC        0x13
32 #define MODE_MON        0x16
33 #define MODE_ABT        0x17
34 #define MODE_UND        0x1b
35 #define MODE_SYS        0x1f
36 #define MODE_MASK       0x1f
37
38 #define EXC_ARM         (0 << 5)
39 #define EXC_THUMB       (1 << 5)
40
41 /* offsets in context_switch_frame */
42 #define CSF_OFFSET_R0   0x0
43 #define CSF_OFFSET_R1   0x4
44 #define CSF_OFFSET_R2   0x8
45 #define CSF_OFFSET_R3   0xc
46 #define CSF_OFFSET_R4   0x10
47 #define CSF_OFFSET_R5   0x14
48 #define CSF_OFFSET_R6   0x18
49 #define CSF_OFFSET_R7   0x1c
50 #define CSF_OFFSET_R8   0x20
51 #define CSF_OFFSET_R9   0x24
52 #define CSF_OFFSET_R10  0x28
53 #define CSF_OFFSET_R11  0x2c
54 #define CSF_OFFSET_R12  0x30
55 #define CSF_OFFSET_SP   0x34
56 #define CSF_OFFSET_LR   0x38
57 #define CSF_OFFSET_PC   0x3c
58 #define CSF_OFFSET_PSR  0x40
59 #define CSF_SIZE        (CSF_OFFSET_PSR + 0x4)
60
61 #ifndef ASSEMBLY
62
63 #include <sys/types.h>
64 #include <arch/arm/cores.h>
65 #include <kernel/thread.h>
66
67 #if defined(__cplusplus)
68 extern "C" {
69 #endif
70
71 #define DSB __asm__ volatile("dsb" ::: "memory")
72 #define ISB __asm__ volatile("isb" ::: "memory")
73
74 void arm_context_switch(thread_t *old_sp, thread_t *new_sp);
75
76 static inline uint32_t read_cpsr() {
77         uint32_t cpsr;
78
79         __asm__ volatile("mrs   %0, cpsr" : "=r" (cpsr));
80         return cpsr;
81 }
82
83 struct arm_iframe {
84         uint32_t r[13];
85         uint32_t lr;    /* lr_svc */
86         uint32_t usp;   /* sp_usr */
87         uint32_t ulr;   /* lr_usr */
88         uint32_t pc;
89         uint32_t spsr;  /* spsr_irq */
90 };
91
92 struct arm_fault_frame {
93         uint32_t spsr;
94         uint32_t usp;
95         uint32_t ulr;
96         uint32_t r[13];
97         uint32_t pc;
98 };
99
100 struct context_switch_frame {
101         uint32_t r0;
102         uint32_t r1;
103         uint32_t r2;
104         uint32_t r3;
105         uint32_t r4;
106         uint32_t r5;
107         uint32_t r6;
108         uint32_t r7;
109         uint32_t r8;
110         uint32_t r9;
111         uint32_t r10;
112         uint32_t r11;
113         uint32_t r12;
114         uint32_t sp;    /* sp_usr or sp_svc */
115         uint32_t lr;    /* lr_usr or lr_svc */
116         uint32_t pc;    /* restart pc */
117         uint32_t psr;   /* previous mode */
118 };
119
120 struct arm_mode_regs {
121         uint32_t fiq_r13, fiq_r14;
122         uint32_t irq_r13, irq_r14;
123         uint32_t svc_r13, svc_r14;
124         uint32_t abt_r13, abt_r14;
125         uint32_t und_r13, und_r14;
126         uint32_t sys_r13, sys_r14;
127 };
128
129 void arm_save_mode_regs(struct arm_mode_regs *regs);
130
131 uint32_t arm_read_sctlr(void);
132 void arm_write_sctlr(uint32_t val);
133 uint32_t arm_read_actlr(void);
134 void arm_write_actlr(uint32_t val);
135 uint32_t arm_read_ttbr0(void);
136 void arm_write_ttbr0(uint32_t val);
137 uint32_t arm_read_contextidr(void);
138 void arm_write_contextidr(uint32_t val);
139 uint32_t arm_read_ttbr1(void);
140 void arm_write_ttbr1(uint32_t val);
141 uint32_t arm_read_ttbcr(void);
142 void arm_write_ttbcr(uint32_t val);
143 uint32_t arm_read_dacr(void);
144 void arm_write_dacr(uint32_t val);
145 void arm_invalidate_tlb(void);
146 void arm_invalidate_tlb_byaddr(addr_t addr);
147 void arm_invalidate_tlb_byaddr_asid(addr_t addr, uint32_t asid);
148
149 uint32_t arm_get_tls(void);
150 void arm_set_tls(uint32_t val);
151 uint32_t arm_read_vbar(void);
152 void arm_write_vbar(uint32_t val);
153
154 /* virt -> phys address translation args */
155 enum {
156         V2PCWPR,
157         V2PCWPW,
158         V2PCWUR,
159         V2PCWUW,
160         V2POWPR,
161         V2POWPW,
162         V2POWUR,
163         V2POWUW
164 };
165 void arm_write_v2p(uint32_t vaddr, uint32_t type);
166 uint64_t arm_read_par(void);
167
168 #if ARM_WITH_NEON
169 uint32_t arm_get_vfp_fpexc(void);
170 void arm_set_vfp_fpexc(uint32_t val);
171 uint32_t arm_get_vfp_fpscr(void);
172 void arm_set_vfp_fpscr(uint32_t val);
173 void arm_save_vfp_dregs(addr_t ctx);
174 void arm_restore_vfp_dregs(addr_t ctx);
175 #endif
176
177 #if defined(__cplusplus)
178 }
179 #endif
180 #endif
181
182 #endif