1*c6798030SJanosch Frank /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*c6798030SJanosch Frank #ifndef _S390X_SIE_ARCH_H_ 3*c6798030SJanosch Frank #define _S390X_SIE_ARCH_H_ 4*c6798030SJanosch Frank 5*c6798030SJanosch Frank #include <stdint.h> 6*c6798030SJanosch Frank #include <asm/arch_def.h> 7*c6798030SJanosch Frank 8*c6798030SJanosch Frank #define CPUSTAT_STOPPED 0x80000000 9*c6798030SJanosch Frank #define CPUSTAT_WAIT 0x10000000 10*c6798030SJanosch Frank #define CPUSTAT_ECALL_PEND 0x08000000 11*c6798030SJanosch Frank #define CPUSTAT_STOP_INT 0x04000000 12*c6798030SJanosch Frank #define CPUSTAT_IO_INT 0x02000000 13*c6798030SJanosch Frank #define CPUSTAT_EXT_INT 0x01000000 14*c6798030SJanosch Frank #define CPUSTAT_RUNNING 0x00800000 15*c6798030SJanosch Frank #define CPUSTAT_RETAINED 0x00400000 16*c6798030SJanosch Frank #define CPUSTAT_TIMING_SUB 0x00020000 17*c6798030SJanosch Frank #define CPUSTAT_SIE_SUB 0x00010000 18*c6798030SJanosch Frank #define CPUSTAT_RRF 0x00008000 19*c6798030SJanosch Frank #define CPUSTAT_SLSV 0x00004000 20*c6798030SJanosch Frank #define CPUSTAT_SLSR 0x00002000 21*c6798030SJanosch Frank #define CPUSTAT_ZARCH 0x00000800 22*c6798030SJanosch Frank #define CPUSTAT_MCDS 0x00000100 23*c6798030SJanosch Frank #define CPUSTAT_KSS 0x00000200 24*c6798030SJanosch Frank #define CPUSTAT_SM 0x00000080 25*c6798030SJanosch Frank #define CPUSTAT_IBS 0x00000040 26*c6798030SJanosch Frank #define CPUSTAT_GED2 0x00000010 27*c6798030SJanosch Frank #define CPUSTAT_G 0x00000008 28*c6798030SJanosch Frank #define CPUSTAT_GED 0x00000004 29*c6798030SJanosch Frank #define CPUSTAT_J 0x00000002 30*c6798030SJanosch Frank #define CPUSTAT_P 0x00000001 31*c6798030SJanosch Frank 32*c6798030SJanosch Frank struct kvm_s390_sie_block { 33*c6798030SJanosch Frank uint32_t cpuflags; /* 0x0000 */ 34*c6798030SJanosch Frank uint32_t : 1; /* 0x0004 */ 35*c6798030SJanosch Frank uint32_t prefix : 18; 36*c6798030SJanosch Frank uint32_t : 1; 37*c6798030SJanosch Frank uint32_t ibc : 12; 38*c6798030SJanosch Frank uint8_t reserved08[4]; /* 0x0008 */ 39*c6798030SJanosch Frank #define PROG_IN_SIE (1<<0) 40*c6798030SJanosch Frank uint32_t prog0c; /* 0x000c */ 41*c6798030SJanosch Frank union { 42*c6798030SJanosch Frank uint8_t reserved10[16]; /* 0x0010 */ 43*c6798030SJanosch Frank struct { 44*c6798030SJanosch Frank uint64_t pv_handle_cpu; 45*c6798030SJanosch Frank uint64_t pv_handle_config; 46*c6798030SJanosch Frank }; 47*c6798030SJanosch Frank }; 48*c6798030SJanosch Frank #define PROG_BLOCK_SIE (1<<0) 49*c6798030SJanosch Frank #define PROG_REQUEST (1<<1) 50*c6798030SJanosch Frank uint32_t prog20; /* 0x0020 */ 51*c6798030SJanosch Frank uint8_t reserved24[4]; /* 0x0024 */ 52*c6798030SJanosch Frank uint64_t cputm; /* 0x0028 */ 53*c6798030SJanosch Frank uint64_t ckc; /* 0x0030 */ 54*c6798030SJanosch Frank uint64_t epoch; /* 0x0038 */ 55*c6798030SJanosch Frank uint32_t svcc; /* 0x0040 */ 56*c6798030SJanosch Frank #define LCTL_CR0 0x8000 57*c6798030SJanosch Frank #define LCTL_CR6 0x0200 58*c6798030SJanosch Frank #define LCTL_CR9 0x0040 59*c6798030SJanosch Frank #define LCTL_CR10 0x0020 60*c6798030SJanosch Frank #define LCTL_CR11 0x0010 61*c6798030SJanosch Frank #define LCTL_CR14 0x0002 62*c6798030SJanosch Frank uint16_t lctl; /* 0x0044 */ 63*c6798030SJanosch Frank int16_t icpua; /* 0x0046 */ 64*c6798030SJanosch Frank #define ICTL_OPEREXC 0x80000000 65*c6798030SJanosch Frank #define ICTL_PINT 0x20000000 66*c6798030SJanosch Frank #define ICTL_LPSW 0x00400000 67*c6798030SJanosch Frank #define ICTL_STCTL 0x00040000 68*c6798030SJanosch Frank #define ICTL_ISKE 0x00004000 69*c6798030SJanosch Frank #define ICTL_SSKE 0x00002000 70*c6798030SJanosch Frank #define ICTL_RRBE 0x00001000 71*c6798030SJanosch Frank #define ICTL_TPROT 0x00000200 72*c6798030SJanosch Frank uint32_t ictl; /* 0x0048 */ 73*c6798030SJanosch Frank #define ECA_CEI 0x80000000 74*c6798030SJanosch Frank #define ECA_IB 0x40000000 75*c6798030SJanosch Frank #define ECA_SIGPI 0x10000000 76*c6798030SJanosch Frank #define ECA_MVPGI 0x01000000 77*c6798030SJanosch Frank #define ECA_AIV 0x00200000 78*c6798030SJanosch Frank #define ECA_VX 0x00020000 79*c6798030SJanosch Frank #define ECA_PROTEXCI 0x00002000 80*c6798030SJanosch Frank #define ECA_APIE 0x00000008 81*c6798030SJanosch Frank #define ECA_SII 0x00000001 82*c6798030SJanosch Frank uint32_t eca; /* 0x004c */ 83*c6798030SJanosch Frank #define ICPT_INST 0x04 84*c6798030SJanosch Frank #define ICPT_PROGI 0x08 85*c6798030SJanosch Frank #define ICPT_INSTPROGI 0x0C 86*c6798030SJanosch Frank #define ICPT_EXTREQ 0x10 87*c6798030SJanosch Frank #define ICPT_EXTINT 0x14 88*c6798030SJanosch Frank #define ICPT_IOREQ 0x18 89*c6798030SJanosch Frank #define ICPT_WAIT 0x1c 90*c6798030SJanosch Frank #define ICPT_VALIDITY 0x20 91*c6798030SJanosch Frank #define ICPT_STOP 0x28 92*c6798030SJanosch Frank #define ICPT_OPEREXC 0x2C 93*c6798030SJanosch Frank #define ICPT_PARTEXEC 0x38 94*c6798030SJanosch Frank #define ICPT_IOINST 0x40 95*c6798030SJanosch Frank #define ICPT_KSS 0x5c 96*c6798030SJanosch Frank #define ICPT_INT_ENABLE 0x64 97*c6798030SJanosch Frank #define ICPT_PV_INSTR 0x68 98*c6798030SJanosch Frank #define ICPT_PV_NOTIFY 0x6c 99*c6798030SJanosch Frank #define ICPT_PV_PREF 0x70 100*c6798030SJanosch Frank uint8_t icptcode; /* 0x0050 */ 101*c6798030SJanosch Frank uint8_t icptstatus; /* 0x0051 */ 102*c6798030SJanosch Frank uint16_t ihcpu; /* 0x0052 */ 103*c6798030SJanosch Frank uint8_t reserved54; /* 0x0054 */ 104*c6798030SJanosch Frank #define IICTL_CODE_NONE 0x00 105*c6798030SJanosch Frank #define IICTL_CODE_MCHK 0x01 106*c6798030SJanosch Frank #define IICTL_CODE_EXT 0x02 107*c6798030SJanosch Frank #define IICTL_CODE_IO 0x03 108*c6798030SJanosch Frank #define IICTL_CODE_RESTART 0x04 109*c6798030SJanosch Frank #define IICTL_CODE_SPECIFICATION 0x10 110*c6798030SJanosch Frank #define IICTL_CODE_OPERAND 0x11 111*c6798030SJanosch Frank uint8_t iictl; /* 0x0055 */ 112*c6798030SJanosch Frank uint16_t ipa; /* 0x0056 */ 113*c6798030SJanosch Frank uint32_t ipb; /* 0x0058 */ 114*c6798030SJanosch Frank uint32_t scaoh; /* 0x005c */ 115*c6798030SJanosch Frank #define FPF_BPBC 0x20 116*c6798030SJanosch Frank uint8_t fpf; /* 0x0060 */ 117*c6798030SJanosch Frank #define ECB_GS 0x40 118*c6798030SJanosch Frank #define ECB_TE 0x10 119*c6798030SJanosch Frank #define ECB_SPECI 0x08 120*c6798030SJanosch Frank #define ECB_SRSI 0x04 121*c6798030SJanosch Frank #define ECB_HOSTPROTINT 0x02 122*c6798030SJanosch Frank uint8_t ecb; /* 0x0061 */ 123*c6798030SJanosch Frank #define ECB2_CMMA 0x80 124*c6798030SJanosch Frank #define ECB2_IEP 0x20 125*c6798030SJanosch Frank #define ECB2_PFMFI 0x08 126*c6798030SJanosch Frank #define ECB2_ESCA 0x04 127*c6798030SJanosch Frank uint8_t ecb2; /* 0x0062 */ 128*c6798030SJanosch Frank #define ECB3_DEA 0x08 129*c6798030SJanosch Frank #define ECB3_AES 0x04 130*c6798030SJanosch Frank #define ECB3_RI 0x01 131*c6798030SJanosch Frank uint8_t ecb3; /* 0x0063 */ 132*c6798030SJanosch Frank uint32_t scaol; /* 0x0064 */ 133*c6798030SJanosch Frank uint8_t sdf; /* 0x0068 */ 134*c6798030SJanosch Frank uint8_t epdx; /* 0x0069 */ 135*c6798030SJanosch Frank uint8_t reserved6a[2]; /* 0x006a */ 136*c6798030SJanosch Frank uint32_t todpr; /* 0x006c */ 137*c6798030SJanosch Frank #define GISA_FORMAT1 0x00000001 138*c6798030SJanosch Frank uint32_t gd; /* 0x0070 */ 139*c6798030SJanosch Frank uint8_t reserved74[12]; /* 0x0074 */ 140*c6798030SJanosch Frank uint64_t mso; /* 0x0080 */ 141*c6798030SJanosch Frank uint64_t msl; /* 0x0088 */ 142*c6798030SJanosch Frank struct psw gpsw; /* 0x0090 */ 143*c6798030SJanosch Frank uint64_t gg14; /* 0x00a0 */ 144*c6798030SJanosch Frank uint64_t gg15; /* 0x00a8 */ 145*c6798030SJanosch Frank uint8_t reservedb0[8]; /* 0x00b0 */ 146*c6798030SJanosch Frank #define HPID_KVM 0x4 147*c6798030SJanosch Frank #define HPID_VSIE 0x5 148*c6798030SJanosch Frank uint8_t hpid; /* 0x00b8 */ 149*c6798030SJanosch Frank uint8_t reservedb9[7]; /* 0x00b9 */ 150*c6798030SJanosch Frank union { 151*c6798030SJanosch Frank struct { 152*c6798030SJanosch Frank uint32_t eiparams; /* 0x00c0 */ 153*c6798030SJanosch Frank uint16_t extcpuaddr; /* 0x00c4 */ 154*c6798030SJanosch Frank uint16_t eic; /* 0x00c6 */ 155*c6798030SJanosch Frank }; 156*c6798030SJanosch Frank uint64_t mcic; /* 0x00c0 */ 157*c6798030SJanosch Frank } __attribute__ ((__packed__)); 158*c6798030SJanosch Frank uint32_t reservedc8; /* 0x00c8 */ 159*c6798030SJanosch Frank uint16_t pgmilc; /* 0x00cc */ 160*c6798030SJanosch Frank uint16_t iprcc; /* 0x00ce */ 161*c6798030SJanosch Frank uint32_t dxc; /* 0x00d0 */ 162*c6798030SJanosch Frank uint16_t mcn; /* 0x00d4 */ 163*c6798030SJanosch Frank uint8_t perc; /* 0x00d6 */ 164*c6798030SJanosch Frank uint8_t peratmid; /* 0x00d7 */ 165*c6798030SJanosch Frank uint64_t peraddr; /* 0x00d8 */ 166*c6798030SJanosch Frank uint8_t eai; /* 0x00e0 */ 167*c6798030SJanosch Frank uint8_t peraid; /* 0x00e1 */ 168*c6798030SJanosch Frank uint8_t oai; /* 0x00e2 */ 169*c6798030SJanosch Frank uint8_t armid; /* 0x00e3 */ 170*c6798030SJanosch Frank uint8_t reservede4[4]; /* 0x00e4 */ 171*c6798030SJanosch Frank uint64_t tecmc; /* 0x00e8 */ 172*c6798030SJanosch Frank uint8_t reservedf0[12]; /* 0x00f0 */ 173*c6798030SJanosch Frank #define CRYCB_FORMAT_MASK 0x00000003 174*c6798030SJanosch Frank #define CRYCB_FORMAT0 0x00000000 175*c6798030SJanosch Frank #define CRYCB_FORMAT1 0x00000001 176*c6798030SJanosch Frank #define CRYCB_FORMAT2 0x00000003 177*c6798030SJanosch Frank uint32_t crycbd; /* 0x00fc */ 178*c6798030SJanosch Frank uint64_t gcr[16]; /* 0x0100 */ 179*c6798030SJanosch Frank union { 180*c6798030SJanosch Frank uint64_t gbea; /* 0x0180 */ 181*c6798030SJanosch Frank uint64_t sidad; 182*c6798030SJanosch Frank }; 183*c6798030SJanosch Frank uint8_t reserved188[8]; /* 0x0188 */ 184*c6798030SJanosch Frank uint64_t sdnxo; /* 0x0190 */ 185*c6798030SJanosch Frank uint8_t reserved198[8]; /* 0x0198 */ 186*c6798030SJanosch Frank uint32_t fac; /* 0x01a0 */ 187*c6798030SJanosch Frank uint8_t reserved1a4[20]; /* 0x01a4 */ 188*c6798030SJanosch Frank uint64_t cbrlo; /* 0x01b8 */ 189*c6798030SJanosch Frank uint8_t reserved1c0[8]; /* 0x01c0 */ 190*c6798030SJanosch Frank #define ECD_HOSTREGMGMT 0x20000000 191*c6798030SJanosch Frank #define ECD_MEF 0x08000000 192*c6798030SJanosch Frank #define ECD_ETOKENF 0x02000000 193*c6798030SJanosch Frank #define ECD_ECC 0x00200000 194*c6798030SJanosch Frank uint32_t ecd; /* 0x01c8 */ 195*c6798030SJanosch Frank uint8_t reserved1cc[18]; /* 0x01cc */ 196*c6798030SJanosch Frank uint64_t pp; /* 0x01de */ 197*c6798030SJanosch Frank uint8_t reserved1e6[2]; /* 0x01e6 */ 198*c6798030SJanosch Frank uint64_t itdba; /* 0x01e8 */ 199*c6798030SJanosch Frank uint64_t riccbd; /* 0x01f0 */ 200*c6798030SJanosch Frank uint64_t gvrd; /* 0x01f8 */ 201*c6798030SJanosch Frank uint64_t reserved200[48]; /* 0x0200 */ 202*c6798030SJanosch Frank uint64_t pv_grregs[16]; /* 0x0380 */ 203*c6798030SJanosch Frank } __attribute__((packed)); 204*c6798030SJanosch Frank 205*c6798030SJanosch Frank union esca_sigp_ctrl { 206*c6798030SJanosch Frank uint16_t value; 207*c6798030SJanosch Frank struct { 208*c6798030SJanosch Frank uint8_t c : 1; 209*c6798030SJanosch Frank uint8_t reserved: 7; 210*c6798030SJanosch Frank uint8_t scn; 211*c6798030SJanosch Frank }; 212*c6798030SJanosch Frank }; 213*c6798030SJanosch Frank 214*c6798030SJanosch Frank struct esca_entry { 215*c6798030SJanosch Frank union esca_sigp_ctrl sigp_ctrl; 216*c6798030SJanosch Frank uint16_t reserved1[3]; 217*c6798030SJanosch Frank uint64_t sda; 218*c6798030SJanosch Frank uint64_t reserved2[6]; 219*c6798030SJanosch Frank }; 220*c6798030SJanosch Frank 221*c6798030SJanosch Frank union ipte_control { 222*c6798030SJanosch Frank unsigned long val; 223*c6798030SJanosch Frank struct { 224*c6798030SJanosch Frank unsigned long k : 1; 225*c6798030SJanosch Frank unsigned long kh : 31; 226*c6798030SJanosch Frank unsigned long kg : 32; 227*c6798030SJanosch Frank }; 228*c6798030SJanosch Frank }; 229*c6798030SJanosch Frank 230*c6798030SJanosch Frank struct esca_block { 231*c6798030SJanosch Frank union ipte_control ipte_control; 232*c6798030SJanosch Frank uint64_t reserved1[7]; 233*c6798030SJanosch Frank uint64_t mcn[4]; 234*c6798030SJanosch Frank uint64_t reserved2[20]; 235*c6798030SJanosch Frank struct esca_entry cpu[256]; 236*c6798030SJanosch Frank }; 237*c6798030SJanosch Frank 238*c6798030SJanosch Frank #endif /* _S390X_SIE_ARCH_H_ */ 239