1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2527dcdccSDavid Howells #ifndef __PARISC_SPECIAL_INSNS_H 3527dcdccSDavid Howells #define __PARISC_SPECIAL_INSNS_H 4527dcdccSDavid Howells 5*116d7533SJohn David Anglin #define lpa(va) ({ \ 6*116d7533SJohn David Anglin unsigned long pa; \ 7*116d7533SJohn David Anglin __asm__ __volatile__( \ 8*116d7533SJohn David Anglin "copy %%r0,%0\n\t" \ 9*116d7533SJohn David Anglin "lpa %%r0(%1),%0" \ 10*116d7533SJohn David Anglin : "=r" (pa) \ 11*116d7533SJohn David Anglin : "r" (va) \ 12*116d7533SJohn David Anglin : "memory" \ 13*116d7533SJohn David Anglin ); \ 14*116d7533SJohn David Anglin pa; \ 15*116d7533SJohn David Anglin }) 16*116d7533SJohn David Anglin 17*116d7533SJohn David Anglin #define lpa_user(va) ({ \ 18*116d7533SJohn David Anglin unsigned long pa; \ 19*116d7533SJohn David Anglin __asm__ __volatile__( \ 20*116d7533SJohn David Anglin "copy %%r0,%0\n\t" \ 21*116d7533SJohn David Anglin "lpa %%r0(%%sr3,%1),%0" \ 22*116d7533SJohn David Anglin : "=r" (pa) \ 23*116d7533SJohn David Anglin : "r" (va) \ 24*116d7533SJohn David Anglin : "memory" \ 25*116d7533SJohn David Anglin ); \ 26*116d7533SJohn David Anglin pa; \ 27*116d7533SJohn David Anglin }) 28*116d7533SJohn David Anglin 29527dcdccSDavid Howells #define mfctl(reg) ({ \ 30527dcdccSDavid Howells unsigned long cr; \ 31527dcdccSDavid Howells __asm__ __volatile__( \ 32527dcdccSDavid Howells "mfctl " #reg ",%0" : \ 33527dcdccSDavid Howells "=r" (cr) \ 34527dcdccSDavid Howells ); \ 35527dcdccSDavid Howells cr; \ 36527dcdccSDavid Howells }) 37527dcdccSDavid Howells 38527dcdccSDavid Howells #define mtctl(gr, cr) \ 39527dcdccSDavid Howells __asm__ __volatile__("mtctl %0,%1" \ 40527dcdccSDavid Howells : /* no outputs */ \ 41527dcdccSDavid Howells : "r" (gr), "i" (cr) : "memory") 42527dcdccSDavid Howells 43527dcdccSDavid Howells /* these are here to de-mystefy the calling code, and to provide hooks */ 44527dcdccSDavid Howells /* which I needed for debugging EIEM problems -PB */ 45527dcdccSDavid Howells #define get_eiem() mfctl(15) 46527dcdccSDavid Howells static inline void set_eiem(unsigned long val) 47527dcdccSDavid Howells { 48527dcdccSDavid Howells mtctl(val, 15); 49527dcdccSDavid Howells } 50527dcdccSDavid Howells 51527dcdccSDavid Howells #define mfsp(reg) ({ \ 52527dcdccSDavid Howells unsigned long cr; \ 53527dcdccSDavid Howells __asm__ __volatile__( \ 54527dcdccSDavid Howells "mfsp " #reg ",%0" : \ 55527dcdccSDavid Howells "=r" (cr) \ 56527dcdccSDavid Howells ); \ 57527dcdccSDavid Howells cr; \ 58527dcdccSDavid Howells }) 59527dcdccSDavid Howells 6092b59929SHelge Deller #define mtsp(val, cr) \ 6192b59929SHelge Deller { if (__builtin_constant_p(val) && ((val) == 0)) \ 6292b59929SHelge Deller __asm__ __volatile__("mtsp %%r0,%0" : : "i" (cr) : "memory"); \ 6392b59929SHelge Deller else \ 64527dcdccSDavid Howells __asm__ __volatile__("mtsp %0,%1" \ 65527dcdccSDavid Howells : /* no outputs */ \ 6692b59929SHelge Deller : "r" (val), "i" (cr) : "memory"); } 67527dcdccSDavid Howells 68527dcdccSDavid Howells #endif /* __PARISC_SPECIAL_INSNS_H */ 69