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 */
stsi(void * sysinfo,int fc,int sel1,int sel2)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 */
topology_mnest_limit(void)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