xref: /openbmc/linux/arch/alpha/include/asm/pal.h (revision 63dc02bd)
1 #ifndef __ALPHA_PAL_H
2 #define __ALPHA_PAL_H
3 
4 /*
5  * Common PAL-code
6  */
7 #define PAL_halt	  0
8 #define PAL_cflush	  1
9 #define PAL_draina	  2
10 #define PAL_bpt		128
11 #define PAL_bugchk	129
12 #define PAL_chmk	131
13 #define PAL_callsys	131
14 #define PAL_imb		134
15 #define PAL_rduniq	158
16 #define PAL_wruniq	159
17 #define PAL_gentrap	170
18 #define PAL_nphalt	190
19 
20 /*
21  * VMS specific PAL-code
22  */
23 #define PAL_swppal	10
24 #define PAL_mfpr_vptb	41
25 
26 /*
27  * OSF specific PAL-code
28  */
29 #define PAL_cserve	 9
30 #define PAL_wripir	13
31 #define PAL_rdmces	16
32 #define PAL_wrmces	17
33 #define PAL_wrfen	43
34 #define PAL_wrvptptr	45
35 #define PAL_jtopal	46
36 #define PAL_swpctx	48
37 #define PAL_wrval	49
38 #define PAL_rdval	50
39 #define PAL_tbi		51
40 #define PAL_wrent	52
41 #define PAL_swpipl	53
42 #define PAL_rdps	54
43 #define PAL_wrkgp	55
44 #define PAL_wrusp	56
45 #define PAL_wrperfmon	57
46 #define PAL_rdusp	58
47 #define PAL_whami	60
48 #define PAL_retsys	61
49 #define PAL_rti		63
50 
51 #ifdef __KERNEL__
52 #ifndef __ASSEMBLY__
53 
54 extern void halt(void) __attribute__((noreturn));
55 #define __halt() __asm__ __volatile__ ("call_pal %0 #halt" : : "i" (PAL_halt))
56 
57 #define imb() \
58 __asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory")
59 
60 #define draina() \
61 __asm__ __volatile__ ("call_pal %0 #draina" : : "i" (PAL_draina) : "memory")
62 
63 #define __CALL_PAL_R0(NAME, TYPE)				\
64 extern inline TYPE NAME(void)					\
65 {								\
66 	register TYPE __r0 __asm__("$0");			\
67 	__asm__ __volatile__(					\
68 		"call_pal %1 # " #NAME				\
69 		:"=r" (__r0)					\
70 		:"i" (PAL_ ## NAME)				\
71 		:"$1", "$16", "$22", "$23", "$24", "$25");	\
72 	return __r0;						\
73 }
74 
75 #define __CALL_PAL_W1(NAME, TYPE0)				\
76 extern inline void NAME(TYPE0 arg0)				\
77 {								\
78 	register TYPE0 __r16 __asm__("$16") = arg0;		\
79 	__asm__ __volatile__(					\
80 		"call_pal %1 # "#NAME				\
81 		: "=r"(__r16)					\
82 		: "i"(PAL_ ## NAME), "0"(__r16)			\
83 		: "$1", "$22", "$23", "$24", "$25");		\
84 }
85 
86 #define __CALL_PAL_W2(NAME, TYPE0, TYPE1)			\
87 extern inline void NAME(TYPE0 arg0, TYPE1 arg1)			\
88 {								\
89 	register TYPE0 __r16 __asm__("$16") = arg0;		\
90 	register TYPE1 __r17 __asm__("$17") = arg1;		\
91 	__asm__ __volatile__(					\
92 		"call_pal %2 # "#NAME				\
93 		: "=r"(__r16), "=r"(__r17)			\
94 		: "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17)	\
95 		: "$1", "$22", "$23", "$24", "$25");		\
96 }
97 
98 #define __CALL_PAL_RW1(NAME, RTYPE, TYPE0)			\
99 extern inline RTYPE NAME(TYPE0 arg0)				\
100 {								\
101 	register RTYPE __r0 __asm__("$0");			\
102 	register TYPE0 __r16 __asm__("$16") = arg0;		\
103 	__asm__ __volatile__(					\
104 		"call_pal %2 # "#NAME				\
105 		: "=r"(__r16), "=r"(__r0)			\
106 		: "i"(PAL_ ## NAME), "0"(__r16)			\
107 		: "$1", "$22", "$23", "$24", "$25");		\
108 	return __r0;						\
109 }
110 
111 #define __CALL_PAL_RW2(NAME, RTYPE, TYPE0, TYPE1)		\
112 extern inline RTYPE NAME(TYPE0 arg0, TYPE1 arg1)		\
113 {								\
114 	register RTYPE __r0 __asm__("$0");			\
115 	register TYPE0 __r16 __asm__("$16") = arg0;		\
116 	register TYPE1 __r17 __asm__("$17") = arg1;		\
117 	__asm__ __volatile__(					\
118 		"call_pal %3 # "#NAME				\
119 		: "=r"(__r16), "=r"(__r17), "=r"(__r0)		\
120 		: "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17)	\
121 		: "$1", "$22", "$23", "$24", "$25");		\
122 	return __r0;						\
123 }
124 
125 __CALL_PAL_W1(cflush, unsigned long);
126 __CALL_PAL_R0(rdmces, unsigned long);
127 __CALL_PAL_R0(rdps, unsigned long);
128 __CALL_PAL_R0(rdusp, unsigned long);
129 __CALL_PAL_RW1(swpipl, unsigned long, unsigned long);
130 __CALL_PAL_R0(whami, unsigned long);
131 __CALL_PAL_W2(wrent, void*, unsigned long);
132 __CALL_PAL_W1(wripir, unsigned long);
133 __CALL_PAL_W1(wrkgp, unsigned long);
134 __CALL_PAL_W1(wrmces, unsigned long);
135 __CALL_PAL_RW2(wrperfmon, unsigned long, unsigned long, unsigned long);
136 __CALL_PAL_W1(wrusp, unsigned long);
137 __CALL_PAL_W1(wrvptptr, unsigned long);
138 
139 /*
140  * TB routines..
141  */
142 #define __tbi(nr,arg,arg1...)					\
143 ({								\
144 	register unsigned long __r16 __asm__("$16") = (nr);	\
145 	register unsigned long __r17 __asm__("$17"); arg;	\
146 	__asm__ __volatile__(					\
147 		"call_pal %3 #__tbi"				\
148 		:"=r" (__r16),"=r" (__r17)			\
149 		:"0" (__r16),"i" (PAL_tbi) ,##arg1		\
150 		:"$0", "$1", "$22", "$23", "$24", "$25");	\
151 })
152 
153 #define tbi(x,y)	__tbi(x,__r17=(y),"1" (__r17))
154 #define tbisi(x)	__tbi(1,__r17=(x),"1" (__r17))
155 #define tbisd(x)	__tbi(2,__r17=(x),"1" (__r17))
156 #define tbis(x)		__tbi(3,__r17=(x),"1" (__r17))
157 #define tbiap()		__tbi(-1, /* no second argument */)
158 #define tbia()		__tbi(-2, /* no second argument */)
159 
160 #endif /* !__ASSEMBLY__ */
161 #endif /* __KERNEL__ */
162 
163 #endif /* __ALPHA_PAL_H */
164