xref: /linux/arch/hexagon/include/asm/hexagon_vm.h (revision 8f5a0b9dffeb3cb94f2b0622b6fe0717512ef54b)
1e49ee290SRichard Kuo /*
2e49ee290SRichard Kuo  * Declarations for to Hexagon Virtal Machine.
3e49ee290SRichard Kuo  *
4e1858b2aSRichard Kuo  * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
5e49ee290SRichard Kuo  *
6e49ee290SRichard Kuo  * This program is free software; you can redistribute it and/or modify
7e49ee290SRichard Kuo  * it under the terms of the GNU General Public License version 2 and
8e49ee290SRichard Kuo  * only version 2 as published by the Free Software Foundation.
9e49ee290SRichard Kuo  *
10e49ee290SRichard Kuo  * This program is distributed in the hope that it will be useful,
11e49ee290SRichard Kuo  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12e49ee290SRichard Kuo  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13e49ee290SRichard Kuo  * GNU General Public License for more details.
14e49ee290SRichard Kuo  *
15e49ee290SRichard Kuo  * You should have received a copy of the GNU General Public License
16e49ee290SRichard Kuo  * along with this program; if not, write to the Free Software
17e49ee290SRichard Kuo  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18e49ee290SRichard Kuo  * 02110-1301, USA.
19e49ee290SRichard Kuo  */
20e49ee290SRichard Kuo 
21e49ee290SRichard Kuo #ifndef ASM_HEXAGON_VM_H
22e49ee290SRichard Kuo #define ASM_HEXAGON_VM_H
23e49ee290SRichard Kuo 
24e49ee290SRichard Kuo /*
25e49ee290SRichard Kuo  * In principle, a Linux kernel for the VM could
26e49ee290SRichard Kuo  * selectively define the virtual instructions
27e49ee290SRichard Kuo  * as inline assembler macros, but for a first pass,
28e49ee290SRichard Kuo  * we'll use subroutines for both the VM and the native
29e49ee290SRichard Kuo  * kernels.  It's costing a subroutine call/return,
30e49ee290SRichard Kuo  * but it makes for a single set of entry points
31e49ee290SRichard Kuo  * for tracing/debugging.
32e49ee290SRichard Kuo  */
33e49ee290SRichard Kuo 
34*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMVERSION		0
35*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMRTE			1
36*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMSETVEC		2
37*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMSETIE		3
38*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMGETIE		4
39*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMINTOP		5
40*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMCLRMAP		10
41*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMNEWMAP		11
42*8f5a0b9dSRichard Kuo #define HVM_TRAP1_FORMERLY_VMWIRE	12
43*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMCACHE		13
44*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMGETTIME		14
45*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMSETTIME		15
46*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMWAIT		16
47*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMYIELD		17
48*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMSTART		18
49*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMSTOP		19
50*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMVPID		20
51*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMSETREGS		21
52*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMGETREGS		22
53*8f5a0b9dSRichard Kuo #define HVM_TRAP1_VMTIMEROP		24
54e49ee290SRichard Kuo 
55e49ee290SRichard Kuo #ifndef __ASSEMBLY__
56e49ee290SRichard Kuo 
57e49ee290SRichard Kuo enum VM_CACHE_OPS {
58e49ee290SRichard Kuo 	ickill,
59e49ee290SRichard Kuo 	dckill,
60e49ee290SRichard Kuo 	l2kill,
61e49ee290SRichard Kuo 	dccleaninva,
62e49ee290SRichard Kuo 	icinva,
63e49ee290SRichard Kuo 	idsync,
64e49ee290SRichard Kuo 	fetch_cfg
65e49ee290SRichard Kuo };
66e49ee290SRichard Kuo 
67e49ee290SRichard Kuo enum VM_INT_OPS {
68e49ee290SRichard Kuo 	nop,
69e49ee290SRichard Kuo 	globen,
70e49ee290SRichard Kuo 	globdis,
71e49ee290SRichard Kuo 	locen,
72e49ee290SRichard Kuo 	locdis,
73e49ee290SRichard Kuo 	affinity,
74e49ee290SRichard Kuo 	get,
75e49ee290SRichard Kuo 	peek,
76e49ee290SRichard Kuo 	status,
77e49ee290SRichard Kuo 	post,
78e49ee290SRichard Kuo 	clear
79e49ee290SRichard Kuo };
80e49ee290SRichard Kuo 
81e49ee290SRichard Kuo extern void _K_VM_event_vector(void);
82e49ee290SRichard Kuo 
83e49ee290SRichard Kuo void __vmrte(void);
84e49ee290SRichard Kuo long __vmsetvec(void *);
85e49ee290SRichard Kuo long __vmsetie(long);
86e49ee290SRichard Kuo long __vmgetie(void);
87e49ee290SRichard Kuo long __vmintop(enum VM_INT_OPS, long, long, long, long);
88e49ee290SRichard Kuo long __vmclrmap(void *, unsigned long);
89e49ee290SRichard Kuo long __vmnewmap(void *);
90e49ee290SRichard Kuo long __vmcache(enum VM_CACHE_OPS op, unsigned long addr, unsigned long len);
91e49ee290SRichard Kuo unsigned long long __vmgettime(void);
92e49ee290SRichard Kuo long __vmsettime(unsigned long long);
93e49ee290SRichard Kuo long __vmstart(void *, void *);
94e49ee290SRichard Kuo void __vmstop(void);
95e49ee290SRichard Kuo long __vmwait(void);
96e49ee290SRichard Kuo void __vmyield(void);
97e49ee290SRichard Kuo long __vmvpid(void);
98e49ee290SRichard Kuo 
99e49ee290SRichard Kuo static inline long __vmcache_ickill(void)
100e49ee290SRichard Kuo {
101e49ee290SRichard Kuo 	return __vmcache(ickill, 0, 0);
102e49ee290SRichard Kuo }
103e49ee290SRichard Kuo 
104e49ee290SRichard Kuo static inline long __vmcache_dckill(void)
105e49ee290SRichard Kuo {
106e49ee290SRichard Kuo 	return __vmcache(dckill, 0, 0);
107e49ee290SRichard Kuo }
108e49ee290SRichard Kuo 
109e49ee290SRichard Kuo static inline long __vmcache_l2kill(void)
110e49ee290SRichard Kuo {
111e49ee290SRichard Kuo 	return __vmcache(l2kill, 0, 0);
112e49ee290SRichard Kuo }
113e49ee290SRichard Kuo 
114e49ee290SRichard Kuo static inline long __vmcache_dccleaninva(unsigned long addr, unsigned long len)
115e49ee290SRichard Kuo {
116e49ee290SRichard Kuo 	return __vmcache(dccleaninva, addr, len);
117e49ee290SRichard Kuo }
118e49ee290SRichard Kuo 
119e49ee290SRichard Kuo static inline long __vmcache_icinva(unsigned long addr, unsigned long len)
120e49ee290SRichard Kuo {
121e49ee290SRichard Kuo 	return __vmcache(icinva, addr, len);
122e49ee290SRichard Kuo }
123e49ee290SRichard Kuo 
124e49ee290SRichard Kuo static inline long __vmcache_idsync(unsigned long addr,
125e49ee290SRichard Kuo 					   unsigned long len)
126e49ee290SRichard Kuo {
127e49ee290SRichard Kuo 	return __vmcache(idsync, addr, len);
128e49ee290SRichard Kuo }
129e49ee290SRichard Kuo 
130e49ee290SRichard Kuo static inline long __vmcache_fetch_cfg(unsigned long val)
131e49ee290SRichard Kuo {
132e49ee290SRichard Kuo 	return __vmcache(fetch_cfg, val, 0);
133e49ee290SRichard Kuo }
134e49ee290SRichard Kuo 
135e49ee290SRichard Kuo /* interrupt operations  */
136e49ee290SRichard Kuo 
137e49ee290SRichard Kuo static inline long __vmintop_nop(void)
138e49ee290SRichard Kuo {
139e49ee290SRichard Kuo 	return __vmintop(nop, 0, 0, 0, 0);
140e49ee290SRichard Kuo }
141e49ee290SRichard Kuo 
142e49ee290SRichard Kuo static inline long __vmintop_globen(long i)
143e49ee290SRichard Kuo {
144e49ee290SRichard Kuo 	return __vmintop(globen, i, 0, 0, 0);
145e49ee290SRichard Kuo }
146e49ee290SRichard Kuo 
147e49ee290SRichard Kuo static inline long __vmintop_globdis(long i)
148e49ee290SRichard Kuo {
149e49ee290SRichard Kuo 	return __vmintop(globdis, i, 0, 0, 0);
150e49ee290SRichard Kuo }
151e49ee290SRichard Kuo 
152e49ee290SRichard Kuo static inline long __vmintop_locen(long i)
153e49ee290SRichard Kuo {
154e49ee290SRichard Kuo 	return __vmintop(locen, i, 0, 0, 0);
155e49ee290SRichard Kuo }
156e49ee290SRichard Kuo 
157e49ee290SRichard Kuo static inline long __vmintop_locdis(long i)
158e49ee290SRichard Kuo {
159e49ee290SRichard Kuo 	return __vmintop(locdis, i, 0, 0, 0);
160e49ee290SRichard Kuo }
161e49ee290SRichard Kuo 
162e49ee290SRichard Kuo static inline long __vmintop_affinity(long i, long cpu)
163e49ee290SRichard Kuo {
164e49ee290SRichard Kuo 	return __vmintop(locdis, i, cpu, 0, 0);
165e49ee290SRichard Kuo }
166e49ee290SRichard Kuo 
167e49ee290SRichard Kuo static inline long __vmintop_get(void)
168e49ee290SRichard Kuo {
169e49ee290SRichard Kuo 	return __vmintop(get, 0, 0, 0, 0);
170e49ee290SRichard Kuo }
171e49ee290SRichard Kuo 
172e49ee290SRichard Kuo static inline long __vmintop_peek(void)
173e49ee290SRichard Kuo {
174e49ee290SRichard Kuo 	return __vmintop(peek, 0, 0, 0, 0);
175e49ee290SRichard Kuo }
176e49ee290SRichard Kuo 
177e49ee290SRichard Kuo static inline long __vmintop_status(long i)
178e49ee290SRichard Kuo {
179e49ee290SRichard Kuo 	return __vmintop(status, i, 0, 0, 0);
180e49ee290SRichard Kuo }
181e49ee290SRichard Kuo 
182e49ee290SRichard Kuo static inline long __vmintop_post(long i)
183e49ee290SRichard Kuo {
184e49ee290SRichard Kuo 	return __vmintop(post, i, 0, 0, 0);
185e49ee290SRichard Kuo }
186e49ee290SRichard Kuo 
187e49ee290SRichard Kuo static inline long __vmintop_clear(long i)
188e49ee290SRichard Kuo {
189e49ee290SRichard Kuo 	return __vmintop(clear, i, 0, 0, 0);
190e49ee290SRichard Kuo }
191e49ee290SRichard Kuo 
192e49ee290SRichard Kuo #else /* Only assembly code should reference these */
193e49ee290SRichard Kuo 
194e49ee290SRichard Kuo #endif /* __ASSEMBLY__ */
195e49ee290SRichard Kuo 
196e49ee290SRichard Kuo /*
197e49ee290SRichard Kuo  * Constants for virtual instruction parameters and return values
198e49ee290SRichard Kuo  */
199e49ee290SRichard Kuo 
200e49ee290SRichard Kuo /* vmsetie arguments */
201e49ee290SRichard Kuo 
202e49ee290SRichard Kuo #define VM_INT_DISABLE	0
203e49ee290SRichard Kuo #define VM_INT_ENABLE	1
204e49ee290SRichard Kuo 
205e49ee290SRichard Kuo /* vmsetimask arguments */
206e49ee290SRichard Kuo 
207e49ee290SRichard Kuo #define VM_INT_UNMASK	0
208e49ee290SRichard Kuo #define VM_INT_MASK	1
209e49ee290SRichard Kuo 
210e49ee290SRichard Kuo #define VM_NEWMAP_TYPE_LINEAR	0
211e49ee290SRichard Kuo #define VM_NEWMAP_TYPE_PGTABLES	1
212e49ee290SRichard Kuo 
213e49ee290SRichard Kuo 
214e49ee290SRichard Kuo /*
215e49ee290SRichard Kuo  * Event Record definitions useful to both C and Assembler
216e49ee290SRichard Kuo  */
217e49ee290SRichard Kuo 
218e49ee290SRichard Kuo /* VMEST Layout */
219e49ee290SRichard Kuo 
220e49ee290SRichard Kuo #define HVM_VMEST_UM_SFT	31
221e49ee290SRichard Kuo #define HVM_VMEST_UM_MSK	1
222e49ee290SRichard Kuo #define HVM_VMEST_IE_SFT	30
223e49ee290SRichard Kuo #define HVM_VMEST_IE_MSK	1
224*8f5a0b9dSRichard Kuo #define HVM_VMEST_SS_SFT	29
225*8f5a0b9dSRichard Kuo #define HVM_VMEST_SS_MSK	1
226e49ee290SRichard Kuo #define HVM_VMEST_EVENTNUM_SFT	16
227e49ee290SRichard Kuo #define HVM_VMEST_EVENTNUM_MSK	0xff
228e49ee290SRichard Kuo #define HVM_VMEST_CAUSE_SFT	0
229e49ee290SRichard Kuo #define HVM_VMEST_CAUSE_MSK	0xffff
230e49ee290SRichard Kuo 
231e49ee290SRichard Kuo /*
232e49ee290SRichard Kuo  * The initial program gets to find a system environment descriptor
233e49ee290SRichard Kuo  * on its stack when it begins exection. The first word is a version
234e49ee290SRichard Kuo  * code to indicate what is there.  Zero means nothing more.
235e49ee290SRichard Kuo  */
236e49ee290SRichard Kuo 
237e49ee290SRichard Kuo #define HEXAGON_VM_SED_NULL	0
238e49ee290SRichard Kuo 
239e49ee290SRichard Kuo /*
240e49ee290SRichard Kuo  * Event numbers for vector binding
241e49ee290SRichard Kuo  */
242e49ee290SRichard Kuo 
243e49ee290SRichard Kuo #define HVM_EV_RESET		0
244e49ee290SRichard Kuo #define HVM_EV_MACHCHECK	1
245e49ee290SRichard Kuo #define HVM_EV_GENEX		2
246e49ee290SRichard Kuo #define HVM_EV_TRAP		8
247e49ee290SRichard Kuo #define HVM_EV_INTR		15
248e49ee290SRichard Kuo /* These shoud be nuked as soon as we know the VM is up to spec v0.1.1 */
249e49ee290SRichard Kuo #define HVM_EV_INTR_0		16
250e49ee290SRichard Kuo #define HVM_MAX_INTR		240
251e49ee290SRichard Kuo 
252e49ee290SRichard Kuo /*
253e49ee290SRichard Kuo  * Cause values for General Exception
254e49ee290SRichard Kuo  */
255e49ee290SRichard Kuo 
256e49ee290SRichard Kuo #define HVM_GE_C_BUS	0x01
257e49ee290SRichard Kuo #define HVM_GE_C_XPROT	0x11
258e49ee290SRichard Kuo #define HVM_GE_C_XUSER	0x14
259e49ee290SRichard Kuo #define HVM_GE_C_INVI	0x15
260e49ee290SRichard Kuo #define HVM_GE_C_PRIVI	0x1B
261e49ee290SRichard Kuo #define HVM_GE_C_XMAL	0x1C
262*8f5a0b9dSRichard Kuo #define HVM_GE_C_WREG	0x1D
263*8f5a0b9dSRichard Kuo #define HVM_GE_C_PCAL	0x1E
264e49ee290SRichard Kuo #define HVM_GE_C_RMAL	0x20
265e49ee290SRichard Kuo #define HVM_GE_C_WMAL	0x21
266e49ee290SRichard Kuo #define HVM_GE_C_RPROT	0x22
267e49ee290SRichard Kuo #define HVM_GE_C_WPROT	0x23
268e49ee290SRichard Kuo #define HVM_GE_C_RUSER	0x24
269e49ee290SRichard Kuo #define HVM_GE_C_WUSER	0x25
270e49ee290SRichard Kuo #define HVM_GE_C_CACHE	0x28
271e49ee290SRichard Kuo 
272e49ee290SRichard Kuo /*
273e49ee290SRichard Kuo  * Cause codes for Machine Check
274e49ee290SRichard Kuo  */
275e49ee290SRichard Kuo 
276e49ee290SRichard Kuo #define	HVM_MCHK_C_DOWN		0x00
277e49ee290SRichard Kuo #define	HVM_MCHK_C_BADSP	0x01
278e49ee290SRichard Kuo #define	HVM_MCHK_C_BADEX	0x02
279e49ee290SRichard Kuo #define	HVM_MCHK_C_BADPT	0x03
280e49ee290SRichard Kuo #define	HVM_MCHK_C_REGWR	0x29
281e49ee290SRichard Kuo 
282e49ee290SRichard Kuo #endif
283