Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef __ALPHA_PAL_H |
| 2 | #define __ALPHA_PAL_H |
| 3 | |
David Howells | 96433f6e | 2012-12-17 13:47:09 +0000 | [diff] [blame] | 4 | #include <uapi/asm/pal.h> |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 5 | |
David Howells | ec22120 | 2012-03-28 18:11:12 +0100 | [diff] [blame] | 6 | #ifndef __ASSEMBLY__ |
| 7 | |
| 8 | extern void halt(void) __attribute__((noreturn)); |
| 9 | #define __halt() __asm__ __volatile__ ("call_pal %0 #halt" : : "i" (PAL_halt)) |
| 10 | |
| 11 | #define imb() \ |
| 12 | __asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory") |
| 13 | |
| 14 | #define draina() \ |
| 15 | __asm__ __volatile__ ("call_pal %0 #draina" : : "i" (PAL_draina) : "memory") |
| 16 | |
| 17 | #define __CALL_PAL_R0(NAME, TYPE) \ |
| 18 | extern inline TYPE NAME(void) \ |
| 19 | { \ |
| 20 | register TYPE __r0 __asm__("$0"); \ |
| 21 | __asm__ __volatile__( \ |
| 22 | "call_pal %1 # " #NAME \ |
| 23 | :"=r" (__r0) \ |
| 24 | :"i" (PAL_ ## NAME) \ |
| 25 | :"$1", "$16", "$22", "$23", "$24", "$25"); \ |
| 26 | return __r0; \ |
| 27 | } |
| 28 | |
| 29 | #define __CALL_PAL_W1(NAME, TYPE0) \ |
| 30 | extern inline void NAME(TYPE0 arg0) \ |
| 31 | { \ |
| 32 | register TYPE0 __r16 __asm__("$16") = arg0; \ |
| 33 | __asm__ __volatile__( \ |
| 34 | "call_pal %1 # "#NAME \ |
| 35 | : "=r"(__r16) \ |
| 36 | : "i"(PAL_ ## NAME), "0"(__r16) \ |
| 37 | : "$1", "$22", "$23", "$24", "$25"); \ |
| 38 | } |
| 39 | |
| 40 | #define __CALL_PAL_W2(NAME, TYPE0, TYPE1) \ |
| 41 | extern inline void NAME(TYPE0 arg0, TYPE1 arg1) \ |
| 42 | { \ |
| 43 | register TYPE0 __r16 __asm__("$16") = arg0; \ |
| 44 | register TYPE1 __r17 __asm__("$17") = arg1; \ |
| 45 | __asm__ __volatile__( \ |
| 46 | "call_pal %2 # "#NAME \ |
| 47 | : "=r"(__r16), "=r"(__r17) \ |
| 48 | : "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17) \ |
| 49 | : "$1", "$22", "$23", "$24", "$25"); \ |
| 50 | } |
| 51 | |
| 52 | #define __CALL_PAL_RW1(NAME, RTYPE, TYPE0) \ |
| 53 | extern inline RTYPE NAME(TYPE0 arg0) \ |
| 54 | { \ |
| 55 | register RTYPE __r0 __asm__("$0"); \ |
| 56 | register TYPE0 __r16 __asm__("$16") = arg0; \ |
| 57 | __asm__ __volatile__( \ |
| 58 | "call_pal %2 # "#NAME \ |
| 59 | : "=r"(__r16), "=r"(__r0) \ |
| 60 | : "i"(PAL_ ## NAME), "0"(__r16) \ |
| 61 | : "$1", "$22", "$23", "$24", "$25"); \ |
| 62 | return __r0; \ |
| 63 | } |
| 64 | |
| 65 | #define __CALL_PAL_RW2(NAME, RTYPE, TYPE0, TYPE1) \ |
| 66 | extern inline RTYPE NAME(TYPE0 arg0, TYPE1 arg1) \ |
| 67 | { \ |
| 68 | register RTYPE __r0 __asm__("$0"); \ |
| 69 | register TYPE0 __r16 __asm__("$16") = arg0; \ |
| 70 | register TYPE1 __r17 __asm__("$17") = arg1; \ |
| 71 | __asm__ __volatile__( \ |
| 72 | "call_pal %3 # "#NAME \ |
| 73 | : "=r"(__r16), "=r"(__r17), "=r"(__r0) \ |
| 74 | : "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17) \ |
| 75 | : "$1", "$22", "$23", "$24", "$25"); \ |
| 76 | return __r0; \ |
| 77 | } |
| 78 | |
| 79 | __CALL_PAL_W1(cflush, unsigned long); |
| 80 | __CALL_PAL_R0(rdmces, unsigned long); |
| 81 | __CALL_PAL_R0(rdps, unsigned long); |
| 82 | __CALL_PAL_R0(rdusp, unsigned long); |
| 83 | __CALL_PAL_RW1(swpipl, unsigned long, unsigned long); |
| 84 | __CALL_PAL_R0(whami, unsigned long); |
| 85 | __CALL_PAL_W2(wrent, void*, unsigned long); |
| 86 | __CALL_PAL_W1(wripir, unsigned long); |
| 87 | __CALL_PAL_W1(wrkgp, unsigned long); |
| 88 | __CALL_PAL_W1(wrmces, unsigned long); |
| 89 | __CALL_PAL_RW2(wrperfmon, unsigned long, unsigned long, unsigned long); |
| 90 | __CALL_PAL_W1(wrusp, unsigned long); |
| 91 | __CALL_PAL_W1(wrvptptr, unsigned long); |
| 92 | |
| 93 | /* |
| 94 | * TB routines.. |
| 95 | */ |
| 96 | #define __tbi(nr,arg,arg1...) \ |
| 97 | ({ \ |
| 98 | register unsigned long __r16 __asm__("$16") = (nr); \ |
| 99 | register unsigned long __r17 __asm__("$17"); arg; \ |
| 100 | __asm__ __volatile__( \ |
| 101 | "call_pal %3 #__tbi" \ |
| 102 | :"=r" (__r16),"=r" (__r17) \ |
| 103 | :"0" (__r16),"i" (PAL_tbi) ,##arg1 \ |
| 104 | :"$0", "$1", "$22", "$23", "$24", "$25"); \ |
| 105 | }) |
| 106 | |
| 107 | #define tbi(x,y) __tbi(x,__r17=(y),"1" (__r17)) |
| 108 | #define tbisi(x) __tbi(1,__r17=(x),"1" (__r17)) |
| 109 | #define tbisd(x) __tbi(2,__r17=(x),"1" (__r17)) |
| 110 | #define tbis(x) __tbi(3,__r17=(x),"1" (__r17)) |
| 111 | #define tbiap() __tbi(-1, /* no second argument */) |
| 112 | #define tbia() __tbi(-2, /* no second argument */) |
| 113 | |
| 114 | #endif /* !__ASSEMBLY__ */ |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 115 | #endif /* __ALPHA_PAL_H */ |