diff options
-rw-r--r-- | drivers/s390/sysinfo.c | 455 |
1 files changed, 231 insertions, 224 deletions
diff --git a/drivers/s390/sysinfo.c b/drivers/s390/sysinfo.c index d1c1e75bfd60..1e788e815ce7 100644 --- a/drivers/s390/sysinfo.c +++ b/drivers/s390/sysinfo.c | |||
@@ -11,19 +11,18 @@ | |||
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <asm/ebcdic.h> | 12 | #include <asm/ebcdic.h> |
13 | 13 | ||
14 | struct sysinfo_1_1_1 | 14 | struct sysinfo_1_1_1 { |
15 | { | ||
16 | char reserved_0[32]; | 15 | char reserved_0[32]; |
17 | char manufacturer[16]; | 16 | char manufacturer[16]; |
18 | char type[4]; | 17 | char type[4]; |
19 | char reserved_1[12]; | 18 | char reserved_1[12]; |
20 | char model[16]; | 19 | char model_capacity[16]; |
21 | char sequence[16]; | 20 | char sequence[16]; |
22 | char plant[4]; | 21 | char plant[4]; |
22 | char model[16]; | ||
23 | }; | 23 | }; |
24 | 24 | ||
25 | struct sysinfo_1_2_1 | 25 | struct sysinfo_1_2_1 { |
26 | { | ||
27 | char reserved_0[80]; | 26 | char reserved_0[80]; |
28 | char sequence[16]; | 27 | char sequence[16]; |
29 | char plant[4]; | 28 | char plant[4]; |
@@ -31,9 +30,12 @@ struct sysinfo_1_2_1 | |||
31 | unsigned short cpu_address; | 30 | unsigned short cpu_address; |
32 | }; | 31 | }; |
33 | 32 | ||
34 | struct sysinfo_1_2_2 | 33 | struct sysinfo_1_2_2 { |
35 | { | 34 | char format; |
36 | char reserved_0[32]; | 35 | char reserved_0[1]; |
36 | unsigned short acc_offset; | ||
37 | char reserved_1[24]; | ||
38 | unsigned int secondary_capability; | ||
37 | unsigned int capability; | 39 | unsigned int capability; |
38 | unsigned short cpus_total; | 40 | unsigned short cpus_total; |
39 | unsigned short cpus_configured; | 41 | unsigned short cpus_configured; |
@@ -42,8 +44,12 @@ struct sysinfo_1_2_2 | |||
42 | unsigned short adjustment[0]; | 44 | unsigned short adjustment[0]; |
43 | }; | 45 | }; |
44 | 46 | ||
45 | struct sysinfo_2_2_1 | 47 | struct sysinfo_1_2_2_extension { |
46 | { | 48 | unsigned int alt_capability; |
49 | unsigned short alt_adjustment[0]; | ||
50 | }; | ||
51 | |||
52 | struct sysinfo_2_2_1 { | ||
47 | char reserved_0[80]; | 53 | char reserved_0[80]; |
48 | char sequence[16]; | 54 | char sequence[16]; |
49 | char plant[4]; | 55 | char plant[4]; |
@@ -51,15 +57,11 @@ struct sysinfo_2_2_1 | |||
51 | unsigned short cpu_address; | 57 | unsigned short cpu_address; |
52 | }; | 58 | }; |
53 | 59 | ||
54 | struct sysinfo_2_2_2 | 60 | struct sysinfo_2_2_2 { |
55 | { | ||
56 | char reserved_0[32]; | 61 | char reserved_0[32]; |
57 | unsigned short lpar_number; | 62 | unsigned short lpar_number; |
58 | char reserved_1; | 63 | char reserved_1; |
59 | unsigned char characteristics; | 64 | unsigned char characteristics; |
60 | #define LPAR_CHAR_DEDICATED (1 << 7) | ||
61 | #define LPAR_CHAR_SHARED (1 << 6) | ||
62 | #define LPAR_CHAR_LIMITED (1 << 5) | ||
63 | unsigned short cpus_total; | 65 | unsigned short cpus_total; |
64 | unsigned short cpus_configured; | 66 | unsigned short cpus_configured; |
65 | unsigned short cpus_standby; | 67 | unsigned short cpus_standby; |
@@ -71,12 +73,14 @@ struct sysinfo_2_2_2 | |||
71 | unsigned short cpus_shared; | 73 | unsigned short cpus_shared; |
72 | }; | 74 | }; |
73 | 75 | ||
74 | struct sysinfo_3_2_2 | 76 | #define LPAR_CHAR_DEDICATED (1 << 7) |
75 | { | 77 | #define LPAR_CHAR_SHARED (1 << 6) |
78 | #define LPAR_CHAR_LIMITED (1 << 5) | ||
79 | |||
80 | struct sysinfo_3_2_2 { | ||
76 | char reserved_0[31]; | 81 | char reserved_0[31]; |
77 | unsigned char count; | 82 | unsigned char count; |
78 | struct | 83 | struct { |
79 | { | ||
80 | char reserved_0[4]; | 84 | char reserved_0[4]; |
81 | unsigned short cpus_total; | 85 | unsigned short cpus_total; |
82 | unsigned short cpus_configured; | 86 | unsigned short cpus_configured; |
@@ -90,136 +94,223 @@ struct sysinfo_3_2_2 | |||
90 | } vm[8]; | 94 | } vm[8]; |
91 | }; | 95 | }; |
92 | 96 | ||
93 | union s390_sysinfo | 97 | static inline int stsi(void *sysinfo, int fc, int sel1, int sel2) |
94 | { | 98 | { |
95 | struct sysinfo_1_1_1 sysinfo_1_1_1; | 99 | register int r0 asm("0") = (fc << 28) | sel1; |
96 | struct sysinfo_1_2_1 sysinfo_1_2_1; | 100 | register int r1 asm("1") = sel2; |
97 | struct sysinfo_1_2_2 sysinfo_1_2_2; | 101 | |
98 | struct sysinfo_2_2_1 sysinfo_2_2_1; | 102 | asm volatile( |
99 | struct sysinfo_2_2_2 sysinfo_2_2_2; | 103 | " stsi 0(%2)\n" |
100 | struct sysinfo_3_2_2 sysinfo_3_2_2; | 104 | "0: jz 2f\n" |
101 | }; | 105 | "1: lhi %0,%3\n" |
102 | 106 | "2:\n" | |
103 | static inline int stsi (void *sysinfo, | 107 | EX_TABLE(0b,1b) |
104 | int fc, int sel1, int sel2) | 108 | : "+d" (r0) : "d" (r1), "a" (sysinfo), "K" (-ENOSYS) |
105 | { | 109 | : "cc", "memory" ); |
106 | int cc, retv; | 110 | return r0; |
107 | |||
108 | #ifndef CONFIG_64BIT | ||
109 | __asm__ __volatile__ ( "lr\t0,%2\n" | ||
110 | "\tlr\t1,%3\n" | ||
111 | "\tstsi\t0(%4)\n" | ||
112 | "0:\tipm\t%0\n" | ||
113 | "\tsrl\t%0,28\n" | ||
114 | "1:lr\t%1,0\n" | ||
115 | ".section .fixup,\"ax\"\n" | ||
116 | "2:\tlhi\t%0,3\n" | ||
117 | "\tbras\t1,3f\n" | ||
118 | "\t.long 1b\n" | ||
119 | "3:\tl\t1,0(1)\n" | ||
120 | "\tbr\t1\n" | ||
121 | ".previous\n" | ||
122 | ".section __ex_table,\"a\"\n" | ||
123 | "\t.align 4\n" | ||
124 | "\t.long 0b,2b\n" | ||
125 | ".previous\n" | ||
126 | : "=d" (cc), "=d" (retv) | ||
127 | : "d" ((fc << 28) | sel1), "d" (sel2), "a" (sysinfo) | ||
128 | : "cc", "memory", "0", "1" ); | ||
129 | #else | ||
130 | __asm__ __volatile__ ( "lr\t0,%2\n" | ||
131 | "lr\t1,%3\n" | ||
132 | "\tstsi\t0(%4)\n" | ||
133 | "0:\tipm\t%0\n" | ||
134 | "\tsrl\t%0,28\n" | ||
135 | "1:lr\t%1,0\n" | ||
136 | ".section .fixup,\"ax\"\n" | ||
137 | "2:\tlhi\t%0,3\n" | ||
138 | "\tjg\t1b\n" | ||
139 | ".previous\n" | ||
140 | ".section __ex_table,\"a\"\n" | ||
141 | "\t.align 8\n" | ||
142 | "\t.quad 0b,2b\n" | ||
143 | ".previous\n" | ||
144 | : "=d" (cc), "=d" (retv) | ||
145 | : "d" ((fc << 28) | sel1), "d" (sel2), "a" (sysinfo) | ||
146 | : "cc", "memory", "0", "1" ); | ||
147 | #endif | ||
148 | |||
149 | return cc? -1 : retv; | ||
150 | } | 111 | } |
151 | 112 | ||
152 | static inline int stsi_0 (void) | 113 | static inline int stsi_0(void) |
153 | { | 114 | { |
154 | int rc = stsi (NULL, 0, 0, 0); | 115 | int rc = stsi (NULL, 0, 0, 0); |
155 | return rc == -1 ? rc : (((unsigned int)rc) >> 28); | 116 | return rc == -ENOSYS ? rc : (((unsigned int) rc) >> 28); |
156 | } | 117 | } |
157 | 118 | ||
158 | static inline int stsi_1_1_1 (struct sysinfo_1_1_1 *info) | 119 | static int stsi_1_1_1(struct sysinfo_1_1_1 *info, char *page, int len) |
159 | { | 120 | { |
160 | int rc = stsi (info, 1, 1, 1); | 121 | if (stsi(info, 1, 1, 1) == -ENOSYS) |
161 | if (rc != -1) | 122 | return len; |
162 | { | 123 | |
163 | EBCASC (info->manufacturer, sizeof(info->manufacturer)); | 124 | EBCASC(info->manufacturer, sizeof(info->manufacturer)); |
164 | EBCASC (info->type, sizeof(info->type)); | 125 | EBCASC(info->type, sizeof(info->type)); |
165 | EBCASC (info->model, sizeof(info->model)); | 126 | EBCASC(info->model, sizeof(info->model)); |
166 | EBCASC (info->sequence, sizeof(info->sequence)); | 127 | EBCASC(info->sequence, sizeof(info->sequence)); |
167 | EBCASC (info->plant, sizeof(info->plant)); | 128 | EBCASC(info->plant, sizeof(info->plant)); |
168 | } | 129 | EBCASC(info->model_capacity, sizeof(info->model_capacity)); |
169 | return rc == -1 ? rc : 0; | 130 | len += sprintf(page + len, "Manufacturer: %-16.16s\n", |
131 | info->manufacturer); | ||
132 | len += sprintf(page + len, "Type: %-4.4s\n", | ||
133 | info->type); | ||
134 | if (info->model[0] != '\0') | ||
135 | /* | ||
136 | * Sigh: the model field has been renamed with System z9 | ||
137 | * to model_capacity and a new model field has been added | ||
138 | * after the plant field. To avoid confusing older programs | ||
139 | * the "Model:" prints "model_capacity model" or just | ||
140 | * "model_capacity" if the model string is empty . | ||
141 | */ | ||
142 | len += sprintf(page + len, | ||
143 | "Model: %-16.16s %-16.16s\n", | ||
144 | info->model_capacity, info->model); | ||
145 | else | ||
146 | len += sprintf(page + len, "Model: %-16.16s\n", | ||
147 | info->model_capacity); | ||
148 | len += sprintf(page + len, "Sequence Code: %-16.16s\n", | ||
149 | info->sequence); | ||
150 | len += sprintf(page + len, "Plant: %-4.4s\n", | ||
151 | info->plant); | ||
152 | len += sprintf(page + len, "Model Capacity: %-16.16s\n", | ||
153 | info->model_capacity); | ||
154 | return len; | ||
170 | } | 155 | } |
171 | 156 | ||
172 | static inline int stsi_1_2_1 (struct sysinfo_1_2_1 *info) | 157 | #if 0 /* Currently unused */ |
158 | static int stsi_1_2_1(struct sysinfo_1_2_1 *info, char *page, int len) | ||
173 | { | 159 | { |
174 | int rc = stsi (info, 1, 2, 1); | 160 | if (stsi(info, 1, 2, 1) == -ENOSYS) |
175 | if (rc != -1) | 161 | return len; |
176 | { | 162 | |
177 | EBCASC (info->sequence, sizeof(info->sequence)); | 163 | len += sprintf(page + len, "\n"); |
178 | EBCASC (info->plant, sizeof(info->plant)); | 164 | EBCASC(info->sequence, sizeof(info->sequence)); |
179 | } | 165 | EBCASC(info->plant, sizeof(info->plant)); |
180 | return rc == -1 ? rc : 0; | 166 | len += sprintf(page + len, "Sequence Code of CPU: %-16.16s\n", |
167 | info->sequence); | ||
168 | len += sprintf(page + len, "Plant of CPU: %-16.16s\n", | ||
169 | info->plant); | ||
170 | return len; | ||
181 | } | 171 | } |
172 | #endif | ||
182 | 173 | ||
183 | static inline int stsi_1_2_2 (struct sysinfo_1_2_2 *info) | 174 | static int stsi_1_2_2(struct sysinfo_1_2_2 *info, char *page, int len) |
184 | { | 175 | { |
185 | int rc = stsi (info, 1, 2, 2); | 176 | struct sysinfo_1_2_2_extension *ext; |
186 | return rc == -1 ? rc : 0; | 177 | int i; |
178 | |||
179 | if (stsi(info, 1, 2, 2) == -ENOSYS) | ||
180 | return len; | ||
181 | ext = (struct sysinfo_1_2_2_extension *) | ||
182 | ((unsigned long) info + info->acc_offset); | ||
183 | |||
184 | len += sprintf(page + len, "\n"); | ||
185 | len += sprintf(page + len, "CPUs Total: %d\n", | ||
186 | info->cpus_total); | ||
187 | len += sprintf(page + len, "CPUs Configured: %d\n", | ||
188 | info->cpus_configured); | ||
189 | len += sprintf(page + len, "CPUs Standby: %d\n", | ||
190 | info->cpus_standby); | ||
191 | len += sprintf(page + len, "CPUs Reserved: %d\n", | ||
192 | info->cpus_reserved); | ||
193 | |||
194 | if (info->format == 1) { | ||
195 | /* | ||
196 | * Sigh 2. According to the specification the alternate | ||
197 | * capability field is a 32 bit floating point number | ||
198 | * if the higher order 8 bits are not zero. Printing | ||
199 | * a floating point number in the kernel is a no-no, | ||
200 | * always print the number as 32 bit unsigned integer. | ||
201 | * The user-space needs to know about the stange | ||
202 | * encoding of the alternate cpu capability. | ||
203 | */ | ||
204 | len += sprintf(page + len, "Capability: %u %u\n", | ||
205 | info->capability, ext->alt_capability); | ||
206 | for (i = 2; i <= info->cpus_total; i++) | ||
207 | len += sprintf(page + len, | ||
208 | "Adjustment %02d-way: %u %u\n", | ||
209 | i, info->adjustment[i-2], | ||
210 | ext->alt_adjustment[i-2]); | ||
211 | |||
212 | } else { | ||
213 | len += sprintf(page + len, "Capability: %u\n", | ||
214 | info->capability); | ||
215 | for (i = 2; i <= info->cpus_total; i++) | ||
216 | len += sprintf(page + len, | ||
217 | "Adjustment %02d-way: %u\n", | ||
218 | i, info->adjustment[i-2]); | ||
219 | } | ||
220 | |||
221 | if (info->secondary_capability != 0) | ||
222 | len += sprintf(page + len, "Secondary Capability: %d\n", | ||
223 | info->secondary_capability); | ||
224 | |||
225 | return len; | ||
187 | } | 226 | } |
188 | 227 | ||
189 | static inline int stsi_2_2_1 (struct sysinfo_2_2_1 *info) | 228 | #if 0 /* Currently unused */ |
229 | static int stsi_2_2_1(struct sysinfo_2_2_1 *info, char *page, int len) | ||
190 | { | 230 | { |
191 | int rc = stsi (info, 2, 2, 1); | 231 | if (stsi(info, 2, 2, 1) == -ENOSYS) |
192 | if (rc != -1) | 232 | return len; |
193 | { | 233 | |
194 | EBCASC (info->sequence, sizeof(info->sequence)); | 234 | len += sprintf(page + len, "\n"); |
195 | EBCASC (info->plant, sizeof(info->plant)); | 235 | EBCASC (info->sequence, sizeof(info->sequence)); |
196 | } | 236 | EBCASC (info->plant, sizeof(info->plant)); |
197 | return rc == -1 ? rc : 0; | 237 | len += sprintf(page + len, "Sequence Code of logical CPU: %-16.16s\n", |
238 | info->sequence); | ||
239 | len += sprintf(page + len, "Plant of logical CPU: %-16.16s\n", | ||
240 | info->plant); | ||
241 | return len; | ||
198 | } | 242 | } |
243 | #endif | ||
199 | 244 | ||
200 | static inline int stsi_2_2_2 (struct sysinfo_2_2_2 *info) | 245 | static int stsi_2_2_2(struct sysinfo_2_2_2 *info, char *page, int len) |
201 | { | 246 | { |
202 | int rc = stsi (info, 2, 2, 2); | 247 | if (stsi(info, 2, 2, 2) == -ENOSYS) |
203 | if (rc != -1) | 248 | return len; |
204 | { | 249 | |
205 | EBCASC (info->name, sizeof(info->name)); | 250 | EBCASC (info->name, sizeof(info->name)); |
206 | } | 251 | |
207 | return rc == -1 ? rc : 0; | 252 | len += sprintf(page + len, "\n"); |
253 | len += sprintf(page + len, "LPAR Number: %d\n", | ||
254 | info->lpar_number); | ||
255 | |||
256 | len += sprintf(page + len, "LPAR Characteristics: "); | ||
257 | if (info->characteristics & LPAR_CHAR_DEDICATED) | ||
258 | len += sprintf(page + len, "Dedicated "); | ||
259 | if (info->characteristics & LPAR_CHAR_SHARED) | ||
260 | len += sprintf(page + len, "Shared "); | ||
261 | if (info->characteristics & LPAR_CHAR_LIMITED) | ||
262 | len += sprintf(page + len, "Limited "); | ||
263 | len += sprintf(page + len, "\n"); | ||
264 | |||
265 | len += sprintf(page + len, "LPAR Name: %-8.8s\n", | ||
266 | info->name); | ||
267 | |||
268 | len += sprintf(page + len, "LPAR Adjustment: %d\n", | ||
269 | info->caf); | ||
270 | |||
271 | len += sprintf(page + len, "LPAR CPUs Total: %d\n", | ||
272 | info->cpus_total); | ||
273 | len += sprintf(page + len, "LPAR CPUs Configured: %d\n", | ||
274 | info->cpus_configured); | ||
275 | len += sprintf(page + len, "LPAR CPUs Standby: %d\n", | ||
276 | info->cpus_standby); | ||
277 | len += sprintf(page + len, "LPAR CPUs Reserved: %d\n", | ||
278 | info->cpus_reserved); | ||
279 | len += sprintf(page + len, "LPAR CPUs Dedicated: %d\n", | ||
280 | info->cpus_dedicated); | ||
281 | len += sprintf(page + len, "LPAR CPUs Shared: %d\n", | ||
282 | info->cpus_shared); | ||
283 | return len; | ||
208 | } | 284 | } |
209 | 285 | ||
210 | static inline int stsi_3_2_2 (struct sysinfo_3_2_2 *info) | 286 | static int stsi_3_2_2(struct sysinfo_3_2_2 *info, char *page, int len) |
211 | { | 287 | { |
212 | int rc = stsi (info, 3, 2, 2); | 288 | int i; |
213 | if (rc != -1) | 289 | |
214 | { | 290 | if (stsi(info, 3, 2, 2) == -ENOSYS) |
215 | int i; | 291 | return len; |
216 | for (i = 0; i < info->count; i++) | 292 | for (i = 0; i < info->count; i++) { |
217 | { | 293 | EBCASC (info->vm[i].name, sizeof(info->vm[i].name)); |
218 | EBCASC (info->vm[i].name, sizeof(info->vm[i].name)); | 294 | EBCASC (info->vm[i].cpi, sizeof(info->vm[i].cpi)); |
219 | EBCASC (info->vm[i].cpi, sizeof(info->vm[i].cpi)); | 295 | len += sprintf(page + len, "\n"); |
220 | } | 296 | len += sprintf(page + len, "VM%02d Name: %-8.8s\n", |
297 | i, info->vm[i].name); | ||
298 | len += sprintf(page + len, "VM%02d Control Program: %-16.16s\n", | ||
299 | i, info->vm[i].cpi); | ||
300 | |||
301 | len += sprintf(page + len, "VM%02d Adjustment: %d\n", | ||
302 | i, info->vm[i].caf); | ||
303 | |||
304 | len += sprintf(page + len, "VM%02d CPUs Total: %d\n", | ||
305 | i, info->vm[i].cpus_total); | ||
306 | len += sprintf(page + len, "VM%02d CPUs Configured: %d\n", | ||
307 | i, info->vm[i].cpus_configured); | ||
308 | len += sprintf(page + len, "VM%02d CPUs Standby: %d\n", | ||
309 | i, info->vm[i].cpus_standby); | ||
310 | len += sprintf(page + len, "VM%02d CPUs Reserved: %d\n", | ||
311 | i, info->vm[i].cpus_reserved); | ||
221 | } | 312 | } |
222 | return rc == -1 ? rc : 0; | 313 | return len; |
223 | } | 314 | } |
224 | 315 | ||
225 | 316 | ||
@@ -227,118 +318,34 @@ static int proc_read_sysinfo(char *page, char **start, | |||
227 | off_t off, int count, | 318 | off_t off, int count, |
228 | int *eof, void *data) | 319 | int *eof, void *data) |
229 | { | 320 | { |
230 | unsigned long info_page = get_zeroed_page (GFP_KERNEL); | 321 | unsigned long info = get_zeroed_page (GFP_KERNEL); |
231 | union s390_sysinfo *info = (union s390_sysinfo *) info_page; | 322 | int level, len; |
232 | int len = 0; | ||
233 | int level; | ||
234 | int i; | ||
235 | 323 | ||
236 | if (!info) | 324 | if (!info) |
237 | return 0; | 325 | return 0; |
238 | 326 | ||
239 | level = stsi_0 (); | 327 | len = 0; |
240 | 328 | level = stsi_0(); | |
241 | if (level >= 1 && stsi_1_1_1 (&info->sysinfo_1_1_1) == 0) | 329 | if (level >= 1) |
242 | { | 330 | len = stsi_1_1_1((struct sysinfo_1_1_1 *) info, page, len); |
243 | len += sprintf (page+len, "Manufacturer: %-16.16s\n", | ||
244 | info->sysinfo_1_1_1.manufacturer); | ||
245 | len += sprintf (page+len, "Type: %-4.4s\n", | ||
246 | info->sysinfo_1_1_1.type); | ||
247 | len += sprintf (page+len, "Model: %-16.16s\n", | ||
248 | info->sysinfo_1_1_1.model); | ||
249 | len += sprintf (page+len, "Sequence Code: %-16.16s\n", | ||
250 | info->sysinfo_1_1_1.sequence); | ||
251 | len += sprintf (page+len, "Plant: %-4.4s\n", | ||
252 | info->sysinfo_1_1_1.plant); | ||
253 | } | ||
254 | |||
255 | if (level >= 1 && stsi_1_2_2 (&info->sysinfo_1_2_2) == 0) | ||
256 | { | ||
257 | len += sprintf (page+len, "\n"); | ||
258 | len += sprintf (page+len, "CPUs Total: %d\n", | ||
259 | info->sysinfo_1_2_2.cpus_total); | ||
260 | len += sprintf (page+len, "CPUs Configured: %d\n", | ||
261 | info->sysinfo_1_2_2.cpus_configured); | ||
262 | len += sprintf (page+len, "CPUs Standby: %d\n", | ||
263 | info->sysinfo_1_2_2.cpus_standby); | ||
264 | len += sprintf (page+len, "CPUs Reserved: %d\n", | ||
265 | info->sysinfo_1_2_2.cpus_reserved); | ||
266 | |||
267 | len += sprintf (page+len, "Capability: %d\n", | ||
268 | info->sysinfo_1_2_2.capability); | ||
269 | 331 | ||
270 | for (i = 2; i <= info->sysinfo_1_2_2.cpus_total; i++) | 332 | if (level >= 1) |
271 | len += sprintf (page+len, "Adjustment %02d-way: %d\n", | 333 | len = stsi_1_2_2((struct sysinfo_1_2_2 *) info, page, len); |
272 | i, info->sysinfo_1_2_2.adjustment[i-2]); | ||
273 | } | ||
274 | 334 | ||
275 | if (level >= 2 && stsi_2_2_2 (&info->sysinfo_2_2_2) == 0) | 335 | if (level >= 2) |
276 | { | 336 | len = stsi_2_2_2((struct sysinfo_2_2_2 *) info, page, len); |
277 | len += sprintf (page+len, "\n"); | ||
278 | len += sprintf (page+len, "LPAR Number: %d\n", | ||
279 | info->sysinfo_2_2_2.lpar_number); | ||
280 | |||
281 | len += sprintf (page+len, "LPAR Characteristics: "); | ||
282 | if (info->sysinfo_2_2_2.characteristics & LPAR_CHAR_DEDICATED) | ||
283 | len += sprintf (page+len, "Dedicated "); | ||
284 | if (info->sysinfo_2_2_2.characteristics & LPAR_CHAR_SHARED) | ||
285 | len += sprintf (page+len, "Shared "); | ||
286 | if (info->sysinfo_2_2_2.characteristics & LPAR_CHAR_LIMITED) | ||
287 | len += sprintf (page+len, "Limited "); | ||
288 | len += sprintf (page+len, "\n"); | ||
289 | |||
290 | len += sprintf (page+len, "LPAR Name: %-8.8s\n", | ||
291 | info->sysinfo_2_2_2.name); | ||
292 | |||
293 | len += sprintf (page+len, "LPAR Adjustment: %d\n", | ||
294 | info->sysinfo_2_2_2.caf); | ||
295 | |||
296 | len += sprintf (page+len, "LPAR CPUs Total: %d\n", | ||
297 | info->sysinfo_2_2_2.cpus_total); | ||
298 | len += sprintf (page+len, "LPAR CPUs Configured: %d\n", | ||
299 | info->sysinfo_2_2_2.cpus_configured); | ||
300 | len += sprintf (page+len, "LPAR CPUs Standby: %d\n", | ||
301 | info->sysinfo_2_2_2.cpus_standby); | ||
302 | len += sprintf (page+len, "LPAR CPUs Reserved: %d\n", | ||
303 | info->sysinfo_2_2_2.cpus_reserved); | ||
304 | len += sprintf (page+len, "LPAR CPUs Dedicated: %d\n", | ||
305 | info->sysinfo_2_2_2.cpus_dedicated); | ||
306 | len += sprintf (page+len, "LPAR CPUs Shared: %d\n", | ||
307 | info->sysinfo_2_2_2.cpus_shared); | ||
308 | } | ||
309 | 337 | ||
310 | if (level >= 3 && stsi_3_2_2 (&info->sysinfo_3_2_2) == 0) | 338 | if (level >= 3) |
311 | { | 339 | len = stsi_3_2_2((struct sysinfo_3_2_2 *) info, page, len); |
312 | for (i = 0; i < info->sysinfo_3_2_2.count; i++) | ||
313 | { | ||
314 | len += sprintf (page+len, "\n"); | ||
315 | len += sprintf (page+len, "VM%02d Name: %-8.8s\n", | ||
316 | i, info->sysinfo_3_2_2.vm[i].name); | ||
317 | len += sprintf (page+len, "VM%02d Control Program: %-16.16s\n", | ||
318 | i, info->sysinfo_3_2_2.vm[i].cpi); | ||
319 | |||
320 | len += sprintf (page+len, "VM%02d Adjustment: %d\n", | ||
321 | i, info->sysinfo_3_2_2.vm[i].caf); | ||
322 | |||
323 | len += sprintf (page+len, "VM%02d CPUs Total: %d\n", | ||
324 | i, info->sysinfo_3_2_2.vm[i].cpus_total); | ||
325 | len += sprintf (page+len, "VM%02d CPUs Configured: %d\n", | ||
326 | i, info->sysinfo_3_2_2.vm[i].cpus_configured); | ||
327 | len += sprintf (page+len, "VM%02d CPUs Standby: %d\n", | ||
328 | i, info->sysinfo_3_2_2.vm[i].cpus_standby); | ||
329 | len += sprintf (page+len, "VM%02d CPUs Reserved: %d\n", | ||
330 | i, info->sysinfo_3_2_2.vm[i].cpus_reserved); | ||
331 | } | ||
332 | } | ||
333 | 340 | ||
334 | free_page (info_page); | 341 | free_page (info); |
335 | return len; | 342 | return len; |
336 | } | 343 | } |
337 | 344 | ||
338 | static __init int create_proc_sysinfo(void) | 345 | static __init int create_proc_sysinfo(void) |
339 | { | 346 | { |
340 | create_proc_read_entry ("sysinfo", 0444, NULL, | 347 | create_proc_read_entry("sysinfo", 0444, NULL, |
341 | proc_read_sysinfo, NULL); | 348 | proc_read_sysinfo, NULL); |
342 | return 0; | 349 | return 0; |
343 | } | 350 | } |
344 | 351 | ||