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