xref: /linux/arch/hexagon/include/asm/hexagon_vm.h (revision 7c6a5df44fd90a288fe067581c5564859c071fc0)
1e49ee290SRichard Kuo /*
2e49ee290SRichard Kuo  * Declarations for to Hexagon Virtal Machine.
3e49ee290SRichard Kuo  *
4*7c6a5df4SRichard Kuo  * Copyright (c) 2010-2013, 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 
348f5a0b9dSRichard Kuo #define HVM_TRAP1_VMVERSION		0
358f5a0b9dSRichard Kuo #define HVM_TRAP1_VMRTE			1
368f5a0b9dSRichard Kuo #define HVM_TRAP1_VMSETVEC		2
378f5a0b9dSRichard Kuo #define HVM_TRAP1_VMSETIE		3
388f5a0b9dSRichard Kuo #define HVM_TRAP1_VMGETIE		4
398f5a0b9dSRichard Kuo #define HVM_TRAP1_VMINTOP		5
408f5a0b9dSRichard Kuo #define HVM_TRAP1_VMCLRMAP		10
418f5a0b9dSRichard Kuo #define HVM_TRAP1_VMNEWMAP		11
428f5a0b9dSRichard Kuo #define HVM_TRAP1_FORMERLY_VMWIRE	12
438f5a0b9dSRichard Kuo #define HVM_TRAP1_VMCACHE		13
448f5a0b9dSRichard Kuo #define HVM_TRAP1_VMGETTIME		14
458f5a0b9dSRichard Kuo #define HVM_TRAP1_VMSETTIME		15
468f5a0b9dSRichard Kuo #define HVM_TRAP1_VMWAIT		16
478f5a0b9dSRichard Kuo #define HVM_TRAP1_VMYIELD		17
488f5a0b9dSRichard Kuo #define HVM_TRAP1_VMSTART		18
498f5a0b9dSRichard Kuo #define HVM_TRAP1_VMSTOP		19
508f5a0b9dSRichard Kuo #define HVM_TRAP1_VMVPID		20
518f5a0b9dSRichard Kuo #define HVM_TRAP1_VMSETREGS		21
528f5a0b9dSRichard Kuo #define HVM_TRAP1_VMGETREGS		22
538f5a0b9dSRichard 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 
2007959bd76SRichard Kuo /* vmnewmap arguments */
2017959bd76SRichard Kuo 
2027959bd76SRichard Kuo #define VM_TRANS_TYPE_LINEAR 0
2037959bd76SRichard Kuo #define VM_TRANS_TYPE_TABLE 1
2047959bd76SRichard Kuo #define VM_TLB_INVALIDATE_FALSE 0
2057959bd76SRichard Kuo #define VM_TLB_INVALIDATE_TRUE 1
2067959bd76SRichard Kuo 
207e49ee290SRichard Kuo /* vmsetie arguments */
208e49ee290SRichard Kuo 
209e49ee290SRichard Kuo #define VM_INT_DISABLE	0
210e49ee290SRichard Kuo #define VM_INT_ENABLE	1
211e49ee290SRichard Kuo 
212e49ee290SRichard Kuo /* vmsetimask arguments */
213e49ee290SRichard Kuo 
214e49ee290SRichard Kuo #define VM_INT_UNMASK	0
215e49ee290SRichard Kuo #define VM_INT_MASK	1
216e49ee290SRichard Kuo 
217e49ee290SRichard Kuo #define VM_NEWMAP_TYPE_LINEAR	0
218e49ee290SRichard Kuo #define VM_NEWMAP_TYPE_PGTABLES	1
219e49ee290SRichard Kuo 
220e49ee290SRichard Kuo 
221e49ee290SRichard Kuo /*
222e49ee290SRichard Kuo  * Event Record definitions useful to both C and Assembler
223e49ee290SRichard Kuo  */
224e49ee290SRichard Kuo 
225e49ee290SRichard Kuo /* VMEST Layout */
226e49ee290SRichard Kuo 
227e49ee290SRichard Kuo #define HVM_VMEST_UM_SFT	31
228e49ee290SRichard Kuo #define HVM_VMEST_UM_MSK	1
229e49ee290SRichard Kuo #define HVM_VMEST_IE_SFT	30
230e49ee290SRichard Kuo #define HVM_VMEST_IE_MSK	1
2318f5a0b9dSRichard Kuo #define HVM_VMEST_SS_SFT	29
2328f5a0b9dSRichard Kuo #define HVM_VMEST_SS_MSK	1
233e49ee290SRichard Kuo #define HVM_VMEST_EVENTNUM_SFT	16
234e49ee290SRichard Kuo #define HVM_VMEST_EVENTNUM_MSK	0xff
235e49ee290SRichard Kuo #define HVM_VMEST_CAUSE_SFT	0
236e49ee290SRichard Kuo #define HVM_VMEST_CAUSE_MSK	0xffff
237e49ee290SRichard Kuo 
238e49ee290SRichard Kuo /*
239e49ee290SRichard Kuo  * The initial program gets to find a system environment descriptor
240e49ee290SRichard Kuo  * on its stack when it begins exection. The first word is a version
241e49ee290SRichard Kuo  * code to indicate what is there.  Zero means nothing more.
242e49ee290SRichard Kuo  */
243e49ee290SRichard Kuo 
244e49ee290SRichard Kuo #define HEXAGON_VM_SED_NULL	0
245e49ee290SRichard Kuo 
246e49ee290SRichard Kuo /*
247e49ee290SRichard Kuo  * Event numbers for vector binding
248e49ee290SRichard Kuo  */
249e49ee290SRichard Kuo 
250e49ee290SRichard Kuo #define HVM_EV_RESET		0
251e49ee290SRichard Kuo #define HVM_EV_MACHCHECK	1
252e49ee290SRichard Kuo #define HVM_EV_GENEX		2
253e49ee290SRichard Kuo #define HVM_EV_TRAP		8
254e49ee290SRichard Kuo #define HVM_EV_INTR		15
255e49ee290SRichard Kuo /* These shoud be nuked as soon as we know the VM is up to spec v0.1.1 */
256e49ee290SRichard Kuo #define HVM_EV_INTR_0		16
257e49ee290SRichard Kuo #define HVM_MAX_INTR		240
258e49ee290SRichard Kuo 
259e49ee290SRichard Kuo /*
260e49ee290SRichard Kuo  * Cause values for General Exception
261e49ee290SRichard Kuo  */
262e49ee290SRichard Kuo 
263e49ee290SRichard Kuo #define HVM_GE_C_BUS	0x01
264e49ee290SRichard Kuo #define HVM_GE_C_XPROT	0x11
265e49ee290SRichard Kuo #define HVM_GE_C_XUSER	0x14
266e49ee290SRichard Kuo #define HVM_GE_C_INVI	0x15
267e49ee290SRichard Kuo #define HVM_GE_C_PRIVI	0x1B
268e49ee290SRichard Kuo #define HVM_GE_C_XMAL	0x1C
2698f5a0b9dSRichard Kuo #define HVM_GE_C_WREG	0x1D
2708f5a0b9dSRichard Kuo #define HVM_GE_C_PCAL	0x1E
271e49ee290SRichard Kuo #define HVM_GE_C_RMAL	0x20
272e49ee290SRichard Kuo #define HVM_GE_C_WMAL	0x21
273e49ee290SRichard Kuo #define HVM_GE_C_RPROT	0x22
274e49ee290SRichard Kuo #define HVM_GE_C_WPROT	0x23
275e49ee290SRichard Kuo #define HVM_GE_C_RUSER	0x24
276e49ee290SRichard Kuo #define HVM_GE_C_WUSER	0x25
277e49ee290SRichard Kuo #define HVM_GE_C_CACHE	0x28
278e49ee290SRichard Kuo 
279e49ee290SRichard Kuo /*
280e49ee290SRichard Kuo  * Cause codes for Machine Check
281e49ee290SRichard Kuo  */
282e49ee290SRichard Kuo 
283e49ee290SRichard Kuo #define	HVM_MCHK_C_DOWN		0x00
284e49ee290SRichard Kuo #define	HVM_MCHK_C_BADSP	0x01
285e49ee290SRichard Kuo #define	HVM_MCHK_C_BADEX	0x02
286e49ee290SRichard Kuo #define	HVM_MCHK_C_BADPT	0x03
287e49ee290SRichard Kuo #define	HVM_MCHK_C_REGWR	0x29
288e49ee290SRichard Kuo 
289e49ee290SRichard Kuo #endif
290