1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * definition for store system information stsi 4 * 5 * Copyright IBM Corp. 2001, 2008 6 * 7 * Author(s): Ulrich Weigand <weigand@de.ibm.com> 8 * Christian Borntraeger <borntraeger@de.ibm.com> 9 */ 10 11 #ifndef __ASM_S390_SYSINFO_H 12 #define __ASM_S390_SYSINFO_H 13 14 #include <linux/uuid.h> 15 #include <asm/bitsperlong.h> 16 #include <asm/asm.h> 17 18 /* 19 * stsi - store system information 20 * 21 * Returns the current configuration level if function code 0 was specified. 22 * Otherwise returns 0 on success or a negative value on error. 23 */ 24 static inline int stsi(void *sysinfo, int fc, int sel1, int sel2) 25 { 26 int r0 = (fc << 28) | sel1; 27 int cc; 28 29 asm volatile( 30 " lr %%r0,%[r0]\n" 31 " lr %%r1,%[r1]\n" 32 " stsi %[sysinfo]\n" 33 " lr %[r0],%%r0\n" 34 CC_IPM(cc) 35 : CC_OUT(cc, cc), [r0] "+d" (r0), [sysinfo] "=Q" (*(char *)sysinfo) 36 : [r1] "d" (sel2) 37 : CC_CLOBBER_LIST("0", "1", "memory")); 38 if (cc == 3) 39 return -EOPNOTSUPP; 40 return fc ? 0 : (unsigned int)r0 >> 28; 41 } 42 43 struct sysinfo_1_1_1 { 44 unsigned char p:1; 45 unsigned char :6; 46 unsigned char t:1; 47 unsigned char :8; 48 unsigned char ccr; 49 unsigned char cai; 50 char reserved_0[20]; 51 unsigned long lic; 52 char manufacturer[16]; 53 char type[4]; 54 char reserved_1[12]; 55 char model_capacity[16]; 56 char sequence[16]; 57 char plant[4]; 58 char model[16]; 59 char model_perm_cap[16]; 60 char model_temp_cap[16]; 61 unsigned int model_cap_rating; 62 unsigned int model_perm_cap_rating; 63 unsigned int model_temp_cap_rating; 64 unsigned char typepct[5]; 65 unsigned char reserved_2[3]; 66 unsigned int ncr; 67 unsigned int npr; 68 unsigned int ntr; 69 char reserved_3[4]; 70 char model_var_cap[16]; 71 unsigned int model_var_cap_rating; 72 unsigned int nvr; 73 }; 74 75 struct sysinfo_1_2_1 { 76 char reserved_0[80]; 77 char sequence[16]; 78 char plant[4]; 79 char reserved_1[2]; 80 unsigned short cpu_address; 81 }; 82 83 struct sysinfo_1_2_2 { 84 char format; 85 char reserved_0[1]; 86 unsigned short acc_offset; 87 unsigned char mt_installed :1; 88 unsigned char :2; 89 unsigned char mt_stid :5; 90 unsigned char :3; 91 unsigned char mt_gtid :5; 92 char reserved_1[18]; 93 unsigned int nominal_cap; 94 unsigned int secondary_cap; 95 unsigned int capability; 96 unsigned short cpus_total; 97 unsigned short cpus_configured; 98 unsigned short cpus_standby; 99 unsigned short cpus_reserved; 100 unsigned short adjustment[]; 101 }; 102 103 struct sysinfo_1_2_2_extension { 104 unsigned int alt_capability; 105 unsigned short alt_adjustment[]; 106 }; 107 108 struct sysinfo_2_2_1 { 109 char reserved_0[80]; 110 char sequence[16]; 111 char plant[4]; 112 unsigned short cpu_id; 113 unsigned short cpu_address; 114 }; 115 116 struct sysinfo_2_2_2 { 117 char reserved_0[32]; 118 unsigned short lpar_number; 119 char reserved_1; 120 unsigned char characteristics; 121 unsigned short cpus_total; 122 unsigned short cpus_configured; 123 unsigned short cpus_standby; 124 unsigned short cpus_reserved; 125 char name[8]; 126 unsigned int caf; 127 char reserved_2[8]; 128 unsigned char mt_installed :1; 129 unsigned char :2; 130 unsigned char mt_stid :5; 131 unsigned char :3; 132 unsigned char mt_gtid :5; 133 unsigned char :3; 134 unsigned char mt_psmtid :5; 135 char reserved_3[5]; 136 unsigned short cpus_dedicated; 137 unsigned short cpus_shared; 138 char reserved_4[3]; 139 unsigned char vsne; 140 uuid_t uuid; 141 char reserved_5[160]; 142 char ext_name[256]; 143 }; 144 145 #define LPAR_CHAR_DEDICATED (1 << 7) 146 #define LPAR_CHAR_SHARED (1 << 6) 147 #define LPAR_CHAR_LIMITED (1 << 5) 148 149 struct sysinfo_3_2_2 { 150 char reserved_0[31]; 151 unsigned char :4; 152 unsigned char count:4; 153 struct { 154 char reserved_0[4]; 155 unsigned short cpus_total; 156 unsigned short cpus_configured; 157 unsigned short cpus_standby; 158 unsigned short cpus_reserved; 159 char name[8]; 160 unsigned int caf; 161 char cpi[16]; 162 char reserved_1[3]; 163 unsigned char evmne; 164 unsigned int reserved_2; 165 uuid_t uuid; 166 } vm[8]; 167 char reserved_3[1504]; 168 char ext_names[8][256]; 169 }; 170 171 extern int topology_max_mnest; 172 173 /* 174 * Returns the maximum nesting level supported by the cpu topology code. 175 * The current maximum level is 4 which is the drawer level. 176 */ 177 static inline unsigned char topology_mnest_limit(void) 178 { 179 return min(topology_max_mnest, 4); 180 } 181 182 #define TOPOLOGY_NR_MAG 6 183 184 struct topology_core { 185 unsigned char nl; 186 unsigned char reserved0[3]; 187 unsigned char :5; 188 unsigned char d:1; 189 unsigned char pp:2; 190 unsigned char reserved1; 191 unsigned short origin; 192 unsigned long mask; 193 }; 194 195 struct topology_container { 196 unsigned char nl; 197 unsigned char reserved[6]; 198 unsigned char id; 199 }; 200 201 union topology_entry { 202 unsigned char nl; 203 struct topology_core cpu; 204 struct topology_container container; 205 }; 206 207 struct sysinfo_15_1_x { 208 unsigned char reserved0[2]; 209 unsigned short length; 210 unsigned char mag[TOPOLOGY_NR_MAG]; 211 unsigned char reserved1; 212 unsigned char mnest; 213 unsigned char reserved2[4]; 214 union topology_entry tle[]; 215 }; 216 217 int stsi(void *sysinfo, int fc, int sel1, int sel2); 218 219 /* 220 * Service level reporting interface. 221 */ 222 struct service_level { 223 struct list_head list; 224 void (*seq_print)(struct seq_file *, struct service_level *); 225 }; 226 227 int register_service_level(struct service_level *); 228 int unregister_service_level(struct service_level *); 229 230 int sthyi_fill(void *dst, u64 *rc); 231 #endif /* __ASM_S390_SYSINFO_H */ 232