First version
[3rdparty/ote_partner/tlk.git] / include / lib / monitor / monitor_vector.h
1 /*
2  * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files
6  * (the "Software"), to deal in the Software without restriction,
7  * including without limitation the rights to use, copy, modify, merge,
8  * publish, distribute, sublicense, and/or sell copies of the Software,
9  * and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 #ifndef __MONITOR_VECTOR_H
24 #define __MONITOR_VECTOR_H
25
26 #ifndef ASSEMBLY
27 #define UL(x)   (x##UL)
28 #else
29 #define UL(x)   (x)
30 #endif
31
32 #if !defined(ASSEMBLY) && defined(WITH_MONITOR_BIN)
33 /*
34  * Monitor data structures and functions
35  * (usable if linked into the monitor binary)
36  */
37 extern uintptr_t __mon_cpu_return_addr;
38 extern uintptr_t __mon_cpu_reset_vector;
39 extern uintptr_t __mon_phys_base;
40 extern uintptr_t __mon_phys_size;
41
42 paddr_t mon_virt_to_phys(void *vaddr);
43 void *mon_phys_to_virt(uint64_t paddr);
44 int mon_mmu_map_mmio(uintptr_t vaddr, uint64_t paddr, uint32_t length);
45 void mon_atomic_or(volatile uint32_t *ptr, uint32_t bits);
46 #endif  // !ASSEMBLY && WITH_MONITOR_BIN
47
48
49 #define SMC_STDCALL                     (UL(0) << 31)
50 #define SMC_FASTCALL                    (UL(1) << 31)
51
52 #define SMC_CALLING_CONVENTION_32       (UL(0) << 30)
53 #define SMC_CALLING_CONVENTION_64       (UL(1) << 30)
54
55 #define SMC_OWNER_MASK                  0x3F
56 #define SMC_OWNER_SHIFT                 24
57
58 #define SMC_OWNER_ARM_ARCH              0x0
59 #define SMC_OWNER_CPU_SERVICE           0x1
60 #define SMC_OWNER_SIP_SERVICE           0x2
61 #define SMC_OWNER_OEM_SERVICE           0x3
62 #define SMC_OWNER_ARM_STD               0x4
63
64 #define SMC_OWNER_TRUSTED_BASE          0x30
65 #define SMC_OWNER_TRUSTED_SERVICE       0x5
66
67 #define SMC_MUST_BE_ZERO_MASK           0xFF
68 #define SMC_MUST_BE_ZERO_SHIFT          16
69
70 /* legacy when fastcall & MBZ field is all 1s */
71 #define SMC_IS_LEGACY   \
72         (SMC_FASTCALL | (SMC_MUST_BE_ZERO_MASK << SMC_MUST_BE_ZERO_SHIFT))
73
74 /* Trusted OS issued SMC (i.e. generated from the TLK kernel) */
75 #define SMC_TOS_CALL                    (0x32 << SMC_OWNER_SHIFT)
76 #define SMC_TOS_FROM_SECURE             (1 << 15)
77 #define SMC_TOS_PREEMPT                 (1 << 12)
78
79 #if ARCH_ARM
80 /* TOS 32bit secure fastcalls */
81 #define SMC_TOS_SECURE  (SMC_FASTCALL | SMC_TOS_CALL | \
82                          SMC_TOS_FROM_SECURE | SMC_CALLING_CONVENTION_32)
83 #endif
84 #if ARCH_ARM64
85 /* TOS 64bit secure fastcalls */
86 #define SMC_TOS_SECURE  (SMC_FASTCALL | SMC_TOS_CALL | \
87                          SMC_TOS_FROM_SECURE | SMC_CALLING_CONVENTION_64)
88 #endif
89
90 /* low byte used as jump table idx */
91 #define SMC_TOS_FUNC_ID_MASK            0xFF
92
93 /* TOS issued SMCs */
94 #define SMC_TOS_COMPLETION              (SMC_TOS_SECURE | 0x1)
95 #define SMC_TOS_PREEMPT_BY_IRQ          (SMC_TOS_SECURE | SMC_TOS_PREEMPT | 0x2)
96 #define SMC_TOS_PREEMPT_BY_FS           (SMC_TOS_SECURE | SMC_TOS_PREEMPT | 0x3)
97 #define SMC_TOS_INITIAL_NS_RETURN       (SMC_TOS_SECURE | 0x4)
98 #define SMC_TOS_ADDR_TRANSLATE          (SMC_TOS_SECURE | 0x5)
99 #define SMC_TOS_INIT_SHARED_ADDR        (SMC_TOS_SECURE | 0x6)
100
101 #endif