1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright 2014, Michael Ellerman, IBM Corp. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef _SELFTESTS_POWERPC_REG_H 7*4882a593Smuzhiyun #define _SELFTESTS_POWERPC_REG_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #define __stringify_1(x) #x 10*4882a593Smuzhiyun #define __stringify(x) __stringify_1(x) 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define mfspr(rn) ({unsigned long rval; \ 13*4882a593Smuzhiyun asm volatile("mfspr %0," _str(rn) \ 14*4882a593Smuzhiyun : "=r" (rval)); rval; }) 15*4882a593Smuzhiyun #define mtspr(rn, v) asm volatile("mtspr " _str(rn) ",%0" : \ 16*4882a593Smuzhiyun : "r" ((unsigned long)(v)) \ 17*4882a593Smuzhiyun : "memory") 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define mb() asm volatile("sync" : : : "memory"); 20*4882a593Smuzhiyun #define barrier() asm volatile("" : : : "memory"); 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define SPRN_MMCR2 769 23*4882a593Smuzhiyun #define SPRN_MMCRA 770 24*4882a593Smuzhiyun #define SPRN_MMCR0 779 25*4882a593Smuzhiyun #define MMCR0_PMAO 0x00000080 26*4882a593Smuzhiyun #define MMCR0_PMAE 0x04000000 27*4882a593Smuzhiyun #define MMCR0_FC 0x80000000 28*4882a593Smuzhiyun #define SPRN_EBBHR 804 29*4882a593Smuzhiyun #define SPRN_EBBRR 805 30*4882a593Smuzhiyun #define SPRN_BESCR 806 /* Branch event status & control register */ 31*4882a593Smuzhiyun #define SPRN_BESCRS 800 /* Branch event status & control set (1 bits set to 1) */ 32*4882a593Smuzhiyun #define SPRN_BESCRSU 801 /* Branch event status & control set upper */ 33*4882a593Smuzhiyun #define SPRN_BESCRR 802 /* Branch event status & control REset (1 bits set to 0) */ 34*4882a593Smuzhiyun #define SPRN_BESCRRU 803 /* Branch event status & control REset upper */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #define BESCR_PMEO 0x1 /* PMU Event-based exception Occurred */ 37*4882a593Smuzhiyun #define BESCR_PME (0x1ul << 32) /* PMU Event-based exception Enable */ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define SPRN_PMC1 771 40*4882a593Smuzhiyun #define SPRN_PMC2 772 41*4882a593Smuzhiyun #define SPRN_PMC3 773 42*4882a593Smuzhiyun #define SPRN_PMC4 774 43*4882a593Smuzhiyun #define SPRN_PMC5 775 44*4882a593Smuzhiyun #define SPRN_PMC6 776 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define SPRN_SIAR 780 47*4882a593Smuzhiyun #define SPRN_SDAR 781 48*4882a593Smuzhiyun #define SPRN_SIER 768 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #define SPRN_TEXASR 0x82 /* Transaction Exception and Status Register */ 51*4882a593Smuzhiyun #define SPRN_TFIAR 0x81 /* Transaction Failure Inst Addr */ 52*4882a593Smuzhiyun #define SPRN_TFHAR 0x80 /* Transaction Failure Handler Addr */ 53*4882a593Smuzhiyun #define SPRN_TAR 0x32f /* Target Address Register */ 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define SPRN_DSCR_PRIV 0x11 /* Privilege State DSCR */ 56*4882a593Smuzhiyun #define SPRN_DSCR 0x03 /* Data Stream Control Register */ 57*4882a593Smuzhiyun #define SPRN_PPR 896 /* Program Priority Register */ 58*4882a593Smuzhiyun #define SPRN_AMR 13 /* Authority Mask Register - problem state */ 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define set_amr(v) asm volatile("isync;" \ 61*4882a593Smuzhiyun "mtspr " __stringify(SPRN_AMR) ",%0;" \ 62*4882a593Smuzhiyun "isync" : \ 63*4882a593Smuzhiyun : "r" ((unsigned long)(v)) \ 64*4882a593Smuzhiyun : "memory") 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* TEXASR register bits */ 67*4882a593Smuzhiyun #define TEXASR_FC 0xFE00000000000000 68*4882a593Smuzhiyun #define TEXASR_FP 0x0100000000000000 69*4882a593Smuzhiyun #define TEXASR_DA 0x0080000000000000 70*4882a593Smuzhiyun #define TEXASR_NO 0x0040000000000000 71*4882a593Smuzhiyun #define TEXASR_FO 0x0020000000000000 72*4882a593Smuzhiyun #define TEXASR_SIC 0x0010000000000000 73*4882a593Smuzhiyun #define TEXASR_NTC 0x0008000000000000 74*4882a593Smuzhiyun #define TEXASR_TC 0x0004000000000000 75*4882a593Smuzhiyun #define TEXASR_TIC 0x0002000000000000 76*4882a593Smuzhiyun #define TEXASR_IC 0x0001000000000000 77*4882a593Smuzhiyun #define TEXASR_IFC 0x0000800000000000 78*4882a593Smuzhiyun #define TEXASR_ABT 0x0000000100000000 79*4882a593Smuzhiyun #define TEXASR_SPD 0x0000000080000000 80*4882a593Smuzhiyun #define TEXASR_HV 0x0000000020000000 81*4882a593Smuzhiyun #define TEXASR_PR 0x0000000010000000 82*4882a593Smuzhiyun #define TEXASR_FS 0x0000000008000000 83*4882a593Smuzhiyun #define TEXASR_TE 0x0000000004000000 84*4882a593Smuzhiyun #define TEXASR_ROT 0x0000000002000000 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* MSR register bits */ 87*4882a593Smuzhiyun #define MSR_TS_S_LG 33 /* Trans Mem state: Suspended */ 88*4882a593Smuzhiyun #define MSR_TS_T_LG 34 /* Trans Mem state: Active */ 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun #define __MASK(X) (1UL<<(X)) 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* macro to check TM MSR bits */ 93*4882a593Smuzhiyun #define MSR_TS_S __MASK(MSR_TS_S_LG) /* Transaction Suspended */ 94*4882a593Smuzhiyun #define MSR_TS_T __MASK(MSR_TS_T_LG) /* Transaction Transactional */ 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* Vector Instructions */ 97*4882a593Smuzhiyun #define VSX_XX1(xs, ra, rb) (((xs) & 0x1f) << 21 | ((ra) << 16) | \ 98*4882a593Smuzhiyun ((rb) << 11) | (((xs) >> 5))) 99*4882a593Smuzhiyun #define STXVD2X(xs, ra, rb) .long (0x7c000798 | VSX_XX1((xs), (ra), (rb))) 100*4882a593Smuzhiyun #define LXVD2X(xs, ra, rb) .long (0x7c000698 | VSX_XX1((xs), (ra), (rb))) 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun #define ASM_LOAD_GPR_IMMED(_asm_symbol_name_immed) \ 103*4882a593Smuzhiyun "li 14, %[" #_asm_symbol_name_immed "];" \ 104*4882a593Smuzhiyun "li 15, %[" #_asm_symbol_name_immed "];" \ 105*4882a593Smuzhiyun "li 16, %[" #_asm_symbol_name_immed "];" \ 106*4882a593Smuzhiyun "li 17, %[" #_asm_symbol_name_immed "];" \ 107*4882a593Smuzhiyun "li 18, %[" #_asm_symbol_name_immed "];" \ 108*4882a593Smuzhiyun "li 19, %[" #_asm_symbol_name_immed "];" \ 109*4882a593Smuzhiyun "li 20, %[" #_asm_symbol_name_immed "];" \ 110*4882a593Smuzhiyun "li 21, %[" #_asm_symbol_name_immed "];" \ 111*4882a593Smuzhiyun "li 22, %[" #_asm_symbol_name_immed "];" \ 112*4882a593Smuzhiyun "li 23, %[" #_asm_symbol_name_immed "];" \ 113*4882a593Smuzhiyun "li 24, %[" #_asm_symbol_name_immed "];" \ 114*4882a593Smuzhiyun "li 25, %[" #_asm_symbol_name_immed "];" \ 115*4882a593Smuzhiyun "li 26, %[" #_asm_symbol_name_immed "];" \ 116*4882a593Smuzhiyun "li 27, %[" #_asm_symbol_name_immed "];" \ 117*4882a593Smuzhiyun "li 28, %[" #_asm_symbol_name_immed "];" \ 118*4882a593Smuzhiyun "li 29, %[" #_asm_symbol_name_immed "];" \ 119*4882a593Smuzhiyun "li 30, %[" #_asm_symbol_name_immed "];" \ 120*4882a593Smuzhiyun "li 31, %[" #_asm_symbol_name_immed "];" 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun #define ASM_LOAD_FPR_SINGLE_PRECISION(_asm_symbol_name_addr) \ 123*4882a593Smuzhiyun "lfs 0, 0(%[" #_asm_symbol_name_addr "]);" \ 124*4882a593Smuzhiyun "lfs 1, 0(%[" #_asm_symbol_name_addr "]);" \ 125*4882a593Smuzhiyun "lfs 2, 0(%[" #_asm_symbol_name_addr "]);" \ 126*4882a593Smuzhiyun "lfs 3, 0(%[" #_asm_symbol_name_addr "]);" \ 127*4882a593Smuzhiyun "lfs 4, 0(%[" #_asm_symbol_name_addr "]);" \ 128*4882a593Smuzhiyun "lfs 5, 0(%[" #_asm_symbol_name_addr "]);" \ 129*4882a593Smuzhiyun "lfs 6, 0(%[" #_asm_symbol_name_addr "]);" \ 130*4882a593Smuzhiyun "lfs 7, 0(%[" #_asm_symbol_name_addr "]);" \ 131*4882a593Smuzhiyun "lfs 8, 0(%[" #_asm_symbol_name_addr "]);" \ 132*4882a593Smuzhiyun "lfs 9, 0(%[" #_asm_symbol_name_addr "]);" \ 133*4882a593Smuzhiyun "lfs 10, 0(%[" #_asm_symbol_name_addr "]);" \ 134*4882a593Smuzhiyun "lfs 11, 0(%[" #_asm_symbol_name_addr "]);" \ 135*4882a593Smuzhiyun "lfs 12, 0(%[" #_asm_symbol_name_addr "]);" \ 136*4882a593Smuzhiyun "lfs 13, 0(%[" #_asm_symbol_name_addr "]);" \ 137*4882a593Smuzhiyun "lfs 14, 0(%[" #_asm_symbol_name_addr "]);" \ 138*4882a593Smuzhiyun "lfs 15, 0(%[" #_asm_symbol_name_addr "]);" \ 139*4882a593Smuzhiyun "lfs 16, 0(%[" #_asm_symbol_name_addr "]);" \ 140*4882a593Smuzhiyun "lfs 17, 0(%[" #_asm_symbol_name_addr "]);" \ 141*4882a593Smuzhiyun "lfs 18, 0(%[" #_asm_symbol_name_addr "]);" \ 142*4882a593Smuzhiyun "lfs 19, 0(%[" #_asm_symbol_name_addr "]);" \ 143*4882a593Smuzhiyun "lfs 20, 0(%[" #_asm_symbol_name_addr "]);" \ 144*4882a593Smuzhiyun "lfs 21, 0(%[" #_asm_symbol_name_addr "]);" \ 145*4882a593Smuzhiyun "lfs 22, 0(%[" #_asm_symbol_name_addr "]);" \ 146*4882a593Smuzhiyun "lfs 23, 0(%[" #_asm_symbol_name_addr "]);" \ 147*4882a593Smuzhiyun "lfs 24, 0(%[" #_asm_symbol_name_addr "]);" \ 148*4882a593Smuzhiyun "lfs 25, 0(%[" #_asm_symbol_name_addr "]);" \ 149*4882a593Smuzhiyun "lfs 26, 0(%[" #_asm_symbol_name_addr "]);" \ 150*4882a593Smuzhiyun "lfs 27, 0(%[" #_asm_symbol_name_addr "]);" \ 151*4882a593Smuzhiyun "lfs 28, 0(%[" #_asm_symbol_name_addr "]);" \ 152*4882a593Smuzhiyun "lfs 29, 0(%[" #_asm_symbol_name_addr "]);" \ 153*4882a593Smuzhiyun "lfs 30, 0(%[" #_asm_symbol_name_addr "]);" \ 154*4882a593Smuzhiyun "lfs 31, 0(%[" #_asm_symbol_name_addr "]);" 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #ifndef __ASSEMBLER__ 157*4882a593Smuzhiyun void store_gpr(unsigned long *addr); 158*4882a593Smuzhiyun void load_gpr(unsigned long *addr); 159*4882a593Smuzhiyun void load_fpr_single_precision(float *addr); 160*4882a593Smuzhiyun void store_fpr_single_precision(float *addr); 161*4882a593Smuzhiyun #endif /* end of __ASSEMBLER__ */ 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun #endif /* _SELFTESTS_POWERPC_REG_H */ 164