Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / arch / mips / include / asm / asm-eva.h
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 2014 Imagination Technologies Ltd.
7  *
8  */
9
10 #ifndef __ASM_ASM_EVA_H
11 #define __ASM_ASM_EVA_H
12
13 #ifndef __ASSEMBLY__
14
15 /* Kernel variants */
16
17 #define kernel_cache(op, base)          "cache " op ", " base "\n"
18 #define kernel_ll(reg, addr)            "ll " reg ", " addr "\n"
19 #define kernel_sc(reg, addr)            "sc " reg ", " addr "\n"
20 #define kernel_lw(reg, addr)            "lw " reg ", " addr "\n"
21 #define kernel_lwl(reg, addr)           "lwl " reg ", " addr "\n"
22 #define kernel_lwr(reg, addr)           "lwr " reg ", " addr "\n"
23 #define kernel_lh(reg, addr)            "lh " reg ", " addr "\n"
24 #define kernel_lb(reg, addr)            "lb " reg ", " addr "\n"
25 #define kernel_lbu(reg, addr)           "lbu " reg ", " addr "\n"
26 #define kernel_sw(reg, addr)            "sw " reg ", " addr "\n"
27 #define kernel_swl(reg, addr)           "swl " reg ", " addr "\n"
28 #define kernel_swr(reg, addr)           "swr " reg ", " addr "\n"
29 #define kernel_sh(reg, addr)            "sh " reg ", " addr "\n"
30 #define kernel_sb(reg, addr)            "sb " reg ", " addr "\n"
31
32 #ifdef CONFIG_32BIT
33 /*
34  * No 'sd' or 'ld' instructions in 32-bit but the code will
35  * do the correct thing
36  */
37 #define kernel_sd(reg, addr)            user_sw(reg, addr)
38 #define kernel_ld(reg, addr)            user_lw(reg, addr)
39 #else
40 #define kernel_sd(reg, addr)            "sd " reg", " addr "\n"
41 #define kernel_ld(reg, addr)            "ld " reg", " addr "\n"
42 #endif /* CONFIG_32BIT */
43
44 #ifdef CONFIG_EVA
45
46 #define __BUILD_EVA_INSN(insn, reg, addr)                               \
47                                 "       .set    push\n"                 \
48                                 "       .set    mips0\n"                \
49                                 "       .set    eva\n"                  \
50                                 "       "insn" "reg", "addr "\n"        \
51                                 "       .set    pop\n"
52
53 #define user_cache(op, base)            __BUILD_EVA_INSN("cachee", op, base)
54 #define user_ll(reg, addr)              __BUILD_EVA_INSN("lle", reg, addr)
55 #define user_sc(reg, addr)              __BUILD_EVA_INSN("sce", reg, addr)
56 #define user_lw(reg, addr)              __BUILD_EVA_INSN("lwe", reg, addr)
57 #define user_lwl(reg, addr)             __BUILD_EVA_INSN("lwle", reg, addr)
58 #define user_lwr(reg, addr)             __BUILD_EVA_INSN("lwre", reg, addr)
59 #define user_lh(reg, addr)              __BUILD_EVA_INSN("lhe", reg, addr)
60 #define user_lb(reg, addr)              __BUILD_EVA_INSN("lbe", reg, addr)
61 #define user_lbu(reg, addr)             __BUILD_EVA_INSN("lbue", reg, addr)
62 /* No 64-bit EVA instruction for loading double words */
63 #define user_ld(reg, addr)              user_lw(reg, addr)
64 #define user_sw(reg, addr)              __BUILD_EVA_INSN("swe", reg, addr)
65 #define user_swl(reg, addr)             __BUILD_EVA_INSN("swle", reg, addr)
66 #define user_swr(reg, addr)             __BUILD_EVA_INSN("swre", reg, addr)
67 #define user_sh(reg, addr)              __BUILD_EVA_INSN("she", reg, addr)
68 #define user_sb(reg, addr)              __BUILD_EVA_INSN("sbe", reg, addr)
69 /* No 64-bit EVA instruction for storing double words */
70 #define user_sd(reg, addr)              user_sw(reg, addr)
71
72 #else
73
74 #define user_cache(op, base)            kernel_cache(op, base)
75 #define user_ll(reg, addr)              kernel_ll(reg, addr)
76 #define user_sc(reg, addr)              kernel_sc(reg, addr)
77 #define user_lw(reg, addr)              kernel_lw(reg, addr)
78 #define user_lwl(reg, addr)             kernel_lwl(reg, addr)
79 #define user_lwr(reg, addr)             kernel_lwr(reg, addr)
80 #define user_lh(reg, addr)              kernel_lh(reg, addr)
81 #define user_lb(reg, addr)              kernel_lb(reg, addr)
82 #define user_lbu(reg, addr)             kernel_lbu(reg, addr)
83 #define user_sw(reg, addr)              kernel_sw(reg, addr)
84 #define user_swl(reg, addr)             kernel_swl(reg, addr)
85 #define user_swr(reg, addr)             kernel_swr(reg, addr)
86 #define user_sh(reg, addr)              kernel_sh(reg, addr)
87 #define user_sb(reg, addr)              kernel_sb(reg, addr)
88
89 #ifdef CONFIG_32BIT
90 #define user_sd(reg, addr)              kernel_sw(reg, addr)
91 #define user_ld(reg, addr)              kernel_lw(reg, addr)
92 #else
93 #define user_sd(reg, addr)              kernel_sd(reg, addr)
94 #define user_ld(reg, addr)              kernel_ld(reg, addr)
95 #endif /* CONFIG_32BIT */
96
97 #endif /* CONFIG_EVA */
98
99 #else /* __ASSEMBLY__ */
100
101 #define kernel_cache(op, base)          cache op, base
102 #define kernel_ll(reg, addr)            ll reg, addr
103 #define kernel_sc(reg, addr)            sc reg, addr
104 #define kernel_lw(reg, addr)            lw reg, addr
105 #define kernel_lwl(reg, addr)           lwl reg, addr
106 #define kernel_lwr(reg, addr)           lwr reg, addr
107 #define kernel_lh(reg, addr)            lh reg, addr
108 #define kernel_lb(reg, addr)            lb reg, addr
109 #define kernel_lbu(reg, addr)           lbu reg, addr
110 #define kernel_sw(reg, addr)            sw reg, addr
111 #define kernel_swl(reg, addr)           swl reg, addr
112 #define kernel_swr(reg, addr)           swr reg, addr
113 #define kernel_sh(reg, addr)            sh reg, addr
114 #define kernel_sb(reg, addr)            sb reg, addr
115
116 #ifdef CONFIG_32BIT
117 /*
118  * No 'sd' or 'ld' instructions in 32-bit but the code will
119  * do the correct thing
120  */
121 #define kernel_sd(reg, addr)            user_sw(reg, addr)
122 #define kernel_ld(reg, addr)            user_lw(reg, addr)
123 #else
124 #define kernel_sd(reg, addr)            sd reg, addr
125 #define kernel_ld(reg, addr)            ld reg, addr
126 #endif /* CONFIG_32BIT */
127
128 #ifdef CONFIG_EVA
129
130 #define __BUILD_EVA_INSN(insn, reg, addr)                       \
131                                 .set    push;                   \
132                                 .set    mips0;                  \
133                                 .set    eva;                    \
134                                 insn reg, addr;                 \
135                                 .set    pop;
136
137 #define user_cache(op, base)            __BUILD_EVA_INSN(cachee, op, base)
138 #define user_ll(reg, addr)              __BUILD_EVA_INSN(lle, reg, addr)
139 #define user_sc(reg, addr)              __BUILD_EVA_INSN(sce, reg, addr)
140 #define user_lw(reg, addr)              __BUILD_EVA_INSN(lwe, reg, addr)
141 #define user_lwl(reg, addr)             __BUILD_EVA_INSN(lwle, reg, addr)
142 #define user_lwr(reg, addr)             __BUILD_EVA_INSN(lwre, reg, addr)
143 #define user_lh(reg, addr)              __BUILD_EVA_INSN(lhe, reg, addr)
144 #define user_lb(reg, addr)              __BUILD_EVA_INSN(lbe, reg, addr)
145 #define user_lbu(reg, addr)             __BUILD_EVA_INSN(lbue, reg, addr)
146 /* No 64-bit EVA instruction for loading double words */
147 #define user_ld(reg, addr)              user_lw(reg, addr)
148 #define user_sw(reg, addr)              __BUILD_EVA_INSN(swe, reg, addr)
149 #define user_swl(reg, addr)             __BUILD_EVA_INSN(swle, reg, addr)
150 #define user_swr(reg, addr)             __BUILD_EVA_INSN(swre, reg, addr)
151 #define user_sh(reg, addr)              __BUILD_EVA_INSN(she, reg, addr)
152 #define user_sb(reg, addr)              __BUILD_EVA_INSN(sbe, reg, addr)
153 /* No 64-bit EVA instruction for loading double words */
154 #define user_sd(reg, addr)              user_sw(reg, addr)
155 #else
156
157 #define user_cache(op, base)            kernel_cache(op, base)
158 #define user_ll(reg, addr)              kernel_ll(reg, addr)
159 #define user_sc(reg, addr)              kernel_sc(reg, addr)
160 #define user_lw(reg, addr)              kernel_lw(reg, addr)
161 #define user_lwl(reg, addr)             kernel_lwl(reg, addr)
162 #define user_lwr(reg, addr)             kernel_lwr(reg, addr)
163 #define user_lh(reg, addr)              kernel_lh(reg, addr)
164 #define user_lb(reg, addr)              kernel_lb(reg, addr)
165 #define user_lbu(reg, addr)             kernel_lbu(reg, addr)
166 #define user_sw(reg, addr)              kernel_sw(reg, addr)
167 #define user_swl(reg, addr)             kernel_swl(reg, addr)
168 #define user_swr(reg, addr)             kernel_swr(reg, addr)
169 #define user_sh(reg, addr)              kernel_sh(reg, addr)
170 #define user_sb(reg, addr)              kernel_sb(reg, addr)
171
172 #ifdef CONFIG_32BIT
173 #define user_sd(reg, addr)              kernel_sw(reg, addr)
174 #define user_ld(reg, addr)              kernel_lw(reg, addr)
175 #else
176 #define user_sd(reg, addr)              kernel_sd(reg, addr)
177 #define user_ld(reg, addr)              kernel_sd(reg, addr)
178 #endif /* CONFIG_32BIT */
179
180 #endif /* CONFIG_EVA */
181
182 #endif /* __ASSEMBLY__ */
183
184 #endif /* __ASM_ASM_EVA_H */