1 /*
2  * Copyright IBM Corp. 2007, 2009
3  *
4  * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>,
5  *	      Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
6  */
7 
8 #define KMSG_COMPONENT "sclp_cmd"
9 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
10 
11 #include <linux/completion.h>
12 #include <linux/init.h>
13 #include <linux/errno.h>
14 #include <linux/err.h>
15 #include <linux/slab.h>
16 #include <linux/string.h>
17 #include <linux/mm.h>
18 #include <linux/mmzone.h>
19 #include <linux/memory.h>
20 #include <linux/platform_device.h>
21 #include <asm/chpid.h>
22 #include <asm/sclp.h>
23 #include <asm/setup.h>
24 #include <asm/ctl_reg.h>
25 
26 #include "sclp.h"
27 
28 #define SCLP_CMDW_READ_SCP_INFO		0x00020001
29 #define SCLP_CMDW_READ_SCP_INFO_FORCED	0x00120001
30 
31 struct read_info_sccb {
32 	struct	sccb_header header;	/* 0-7 */
33 	u16	rnmax;			/* 8-9 */
34 	u8	rnsize;			/* 10 */
35 	u8	_reserved0[24 - 11];	/* 11-15 */
36 	u8	loadparm[8];		/* 24-31 */
37 	u8	_reserved1[48 - 32];	/* 32-47 */
38 	u64	facilities;		/* 48-55 */
39 	u8	_reserved2[84 - 56];	/* 56-83 */
40 	u8	fac84;			/* 84 */
41 	u8	_reserved3[91 - 85];	/* 85-90 */
42 	u8	flags;			/* 91 */
43 	u8	_reserved4[100 - 92];	/* 92-99 */
44 	u32	rnsize2;		/* 100-103 */
45 	u64	rnmax2;			/* 104-111 */
46 	u8	_reserved5[4096 - 112];	/* 112-4095 */
47 } __attribute__((packed, aligned(PAGE_SIZE)));
48 
49 static struct read_info_sccb __initdata early_read_info_sccb;
50 static int __initdata early_read_info_sccb_valid;
51 
52 u64 sclp_facilities;
53 static u8 sclp_fac84;
54 static unsigned long long rzm;
55 static unsigned long long rnmax;
56 
sclp_cmd_sync_early(sclp_cmdw_t cmd,void * sccb)57 static int __init sclp_cmd_sync_early(sclp_cmdw_t cmd, void *sccb)
58 {
59 	int rc;
60 
61 	__ctl_set_bit(0, 9);
62 	rc = sclp_service_call(cmd, sccb);
63 	if (rc)
64 		goto out;
65 	__load_psw_mask(PSW_DEFAULT_KEY | PSW_MASK_BASE | PSW_MASK_EA |
66 			PSW_MASK_BA | PSW_MASK_EXT | PSW_MASK_WAIT);
67 	local_irq_disable();
68 out:
69 	/* Contents of the sccb might have changed. */
70 	barrier();
71 	__ctl_clear_bit(0, 9);
72 	return rc;
73 }
74 
sclp_read_info_early(void)75 static void __init sclp_read_info_early(void)
76 {
77 	int rc;
78 	int i;
79 	struct read_info_sccb *sccb;
80 	sclp_cmdw_t commands[] = {SCLP_CMDW_READ_SCP_INFO_FORCED,
81 				  SCLP_CMDW_READ_SCP_INFO};
82 
83 	sccb = &early_read_info_sccb;
84 	for (i = 0; i < ARRAY_SIZE(commands); i++) {
85 		do {
86 			memset(sccb, 0, sizeof(*sccb));
87 			sccb->header.length = sizeof(*sccb);
88 			sccb->header.function_code = 0x80;
89 			sccb->header.control_mask[2] = 0x80;
90 			rc = sclp_cmd_sync_early(commands[i], sccb);
91 		} while (rc == -EBUSY);
92 
93 		if (rc)
94 			break;
95 		if (sccb->header.response_code == 0x10) {
96 			early_read_info_sccb_valid = 1;
97 			break;
98 		}
99 		if (sccb->header.response_code != 0x1f0)
100 			break;
101 	}
102 }
103 
sclp_facilities_detect(void)104 void __init sclp_facilities_detect(void)
105 {
106 	struct read_info_sccb *sccb;
107 
108 	sclp_read_info_early();
109 	if (!early_read_info_sccb_valid)
110 		return;
111 
112 	sccb = &early_read_info_sccb;
113 	sclp_facilities = sccb->facilities;
114 	sclp_fac84 = sccb->fac84;
115 	rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2;
116 	rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2;
117 	rzm <<= 20;
118 }
119 
sclp_get_rnmax(void)120 unsigned long long sclp_get_rnmax(void)
121 {
122 	return rnmax;
123 }
124 
sclp_get_rzm(void)125 unsigned long long sclp_get_rzm(void)
126 {
127 	return rzm;
128 }
129 
130 /*
131  * This function will be called after sclp_facilities_detect(), which gets
132  * called from early.c code. Therefore the sccb should have valid contents.
133  */
sclp_get_ipl_info(struct sclp_ipl_info * info)134 void __init sclp_get_ipl_info(struct sclp_ipl_info *info)
135 {
136 	struct read_info_sccb *sccb;
137 
138 	if (!early_read_info_sccb_valid)
139 		return;
140 	sccb = &early_read_info_sccb;
141 	info->is_valid = 1;
142 	if (sccb->flags & 0x2)
143 		info->has_dump = 1;
144 	memcpy(&info->loadparm, &sccb->loadparm, LOADPARM_LEN);
145 }
146 
sclp_sync_callback(struct sclp_req * req,void * data)147 static void sclp_sync_callback(struct sclp_req *req, void *data)
148 {
149 	struct completion *completion = data;
150 
151 	complete(completion);
152 }
153 
do_sync_request(sclp_cmdw_t cmd,void * sccb)154 static int do_sync_request(sclp_cmdw_t cmd, void *sccb)
155 {
156 	struct completion completion;
157 	struct sclp_req *request;
158 	int rc;
159 
160 	request = kzalloc(sizeof(*request), GFP_KERNEL);
161 	if (!request)
162 		return -ENOMEM;
163 	request->command = cmd;
164 	request->sccb = sccb;
165 	request->status = SCLP_REQ_FILLED;
166 	request->callback = sclp_sync_callback;
167 	request->callback_data = &completion;
168 	init_completion(&completion);
169 
170 	/* Perform sclp request. */
171 	rc = sclp_add_request(request);
172 	if (rc)
173 		goto out;
174 	wait_for_completion(&completion);
175 
176 	/* Check response. */
177 	if (request->status != SCLP_REQ_DONE) {
178 		pr_warning("sync request failed (cmd=0x%08x, "
179 			   "status=0x%02x)\n", cmd, request->status);
180 		rc = -EIO;
181 	}
182 out:
183 	kfree(request);
184 	return rc;
185 }
186 
187 /*
188  * CPU configuration related functions.
189  */
190 
191 #define SCLP_CMDW_READ_CPU_INFO		0x00010001
192 #define SCLP_CMDW_CONFIGURE_CPU		0x00110001
193 #define SCLP_CMDW_DECONFIGURE_CPU	0x00100001
194 
195 struct read_cpu_info_sccb {
196 	struct	sccb_header header;
197 	u16	nr_configured;
198 	u16	offset_configured;
199 	u16	nr_standby;
200 	u16	offset_standby;
201 	u8	reserved[4096 - 16];
202 } __attribute__((packed, aligned(PAGE_SIZE)));
203 
sclp_fill_cpu_info(struct sclp_cpu_info * info,struct read_cpu_info_sccb * sccb)204 static void sclp_fill_cpu_info(struct sclp_cpu_info *info,
205 			       struct read_cpu_info_sccb *sccb)
206 {
207 	char *page = (char *) sccb;
208 
209 	memset(info, 0, sizeof(*info));
210 	info->configured = sccb->nr_configured;
211 	info->standby = sccb->nr_standby;
212 	info->combined = sccb->nr_configured + sccb->nr_standby;
213 	info->has_cpu_type = sclp_fac84 & 0x1;
214 	memcpy(&info->cpu, page + sccb->offset_configured,
215 	       info->combined * sizeof(struct sclp_cpu_entry));
216 }
217 
sclp_get_cpu_info(struct sclp_cpu_info * info)218 int sclp_get_cpu_info(struct sclp_cpu_info *info)
219 {
220 	int rc;
221 	struct read_cpu_info_sccb *sccb;
222 
223 	if (!SCLP_HAS_CPU_INFO)
224 		return -EOPNOTSUPP;
225 	sccb = (void *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
226 	if (!sccb)
227 		return -ENOMEM;
228 	sccb->header.length = sizeof(*sccb);
229 	rc = do_sync_request(SCLP_CMDW_READ_CPU_INFO, sccb);
230 	if (rc)
231 		goto out;
232 	if (sccb->header.response_code != 0x0010) {
233 		pr_warning("readcpuinfo failed (response=0x%04x)\n",
234 			   sccb->header.response_code);
235 		rc = -EIO;
236 		goto out;
237 	}
238 	sclp_fill_cpu_info(info, sccb);
239 out:
240 	free_page((unsigned long) sccb);
241 	return rc;
242 }
243 
244 struct cpu_configure_sccb {
245 	struct sccb_header header;
246 } __attribute__((packed, aligned(8)));
247 
do_cpu_configure(sclp_cmdw_t cmd)248 static int do_cpu_configure(sclp_cmdw_t cmd)
249 {
250 	struct cpu_configure_sccb *sccb;
251 	int rc;
252 
253 	if (!SCLP_HAS_CPU_RECONFIG)
254 		return -EOPNOTSUPP;
255 	/*
256 	 * This is not going to cross a page boundary since we force
257 	 * kmalloc to have a minimum alignment of 8 bytes on s390.
258 	 */
259 	sccb = kzalloc(sizeof(*sccb), GFP_KERNEL | GFP_DMA);
260 	if (!sccb)
261 		return -ENOMEM;
262 	sccb->header.length = sizeof(*sccb);
263 	rc = do_sync_request(cmd, sccb);
264 	if (rc)
265 		goto out;
266 	switch (sccb->header.response_code) {
267 	case 0x0020:
268 	case 0x0120:
269 		break;
270 	default:
271 		pr_warning("configure cpu failed (cmd=0x%08x, "
272 			   "response=0x%04x)\n", cmd,
273 			   sccb->header.response_code);
274 		rc = -EIO;
275 		break;
276 	}
277 out:
278 	kfree(sccb);
279 	return rc;
280 }
281 
sclp_cpu_configure(u8 cpu)282 int sclp_cpu_configure(u8 cpu)
283 {
284 	return do_cpu_configure(SCLP_CMDW_CONFIGURE_CPU | cpu << 8);
285 }
286 
sclp_cpu_deconfigure(u8 cpu)287 int sclp_cpu_deconfigure(u8 cpu)
288 {
289 	return do_cpu_configure(SCLP_CMDW_DECONFIGURE_CPU | cpu << 8);
290 }
291 
292 #ifdef CONFIG_MEMORY_HOTPLUG
293 
294 static DEFINE_MUTEX(sclp_mem_mutex);
295 static LIST_HEAD(sclp_mem_list);
296 static u8 sclp_max_storage_id;
297 static unsigned long sclp_storage_ids[256 / BITS_PER_LONG];
298 static int sclp_mem_state_changed;
299 
300 struct memory_increment {
301 	struct list_head list;
302 	u16 rn;
303 	int standby;
304 	int usecount;
305 };
306 
307 struct assign_storage_sccb {
308 	struct sccb_header header;
309 	u16 rn;
310 } __packed;
311 
arch_get_memory_phys_device(unsigned long start_pfn)312 int arch_get_memory_phys_device(unsigned long start_pfn)
313 {
314 	if (!rzm)
315 		return 0;
316 	return PFN_PHYS(start_pfn) >> ilog2(rzm);
317 }
318 
rn2addr(u16 rn)319 static unsigned long long rn2addr(u16 rn)
320 {
321 	return (unsigned long long) (rn - 1) * rzm;
322 }
323 
do_assign_storage(sclp_cmdw_t cmd,u16 rn)324 static int do_assign_storage(sclp_cmdw_t cmd, u16 rn)
325 {
326 	struct assign_storage_sccb *sccb;
327 	int rc;
328 
329 	sccb = (void *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
330 	if (!sccb)
331 		return -ENOMEM;
332 	sccb->header.length = PAGE_SIZE;
333 	sccb->rn = rn;
334 	rc = do_sync_request(cmd, sccb);
335 	if (rc)
336 		goto out;
337 	switch (sccb->header.response_code) {
338 	case 0x0020:
339 	case 0x0120:
340 		break;
341 	default:
342 		pr_warning("assign storage failed (cmd=0x%08x, "
343 			   "response=0x%04x, rn=0x%04x)\n", cmd,
344 			   sccb->header.response_code, rn);
345 		rc = -EIO;
346 		break;
347 	}
348 out:
349 	free_page((unsigned long) sccb);
350 	return rc;
351 }
352 
sclp_assign_storage(u16 rn)353 static int sclp_assign_storage(u16 rn)
354 {
355 	return do_assign_storage(0x000d0001, rn);
356 }
357 
sclp_unassign_storage(u16 rn)358 static int sclp_unassign_storage(u16 rn)
359 {
360 	return do_assign_storage(0x000c0001, rn);
361 }
362 
363 struct attach_storage_sccb {
364 	struct sccb_header header;
365 	u16 :16;
366 	u16 assigned;
367 	u32 :32;
368 	u32 entries[0];
369 } __packed;
370 
sclp_attach_storage(u8 id)371 static int sclp_attach_storage(u8 id)
372 {
373 	struct attach_storage_sccb *sccb;
374 	int rc;
375 	int i;
376 
377 	sccb = (void *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
378 	if (!sccb)
379 		return -ENOMEM;
380 	sccb->header.length = PAGE_SIZE;
381 	rc = do_sync_request(0x00080001 | id << 8, sccb);
382 	if (rc)
383 		goto out;
384 	switch (sccb->header.response_code) {
385 	case 0x0020:
386 		set_bit(id, sclp_storage_ids);
387 		for (i = 0; i < sccb->assigned; i++) {
388 			if (sccb->entries[i])
389 				sclp_unassign_storage(sccb->entries[i] >> 16);
390 		}
391 		break;
392 	default:
393 		rc = -EIO;
394 		break;
395 	}
396 out:
397 	free_page((unsigned long) sccb);
398 	return rc;
399 }
400 
sclp_mem_change_state(unsigned long start,unsigned long size,int online)401 static int sclp_mem_change_state(unsigned long start, unsigned long size,
402 				 int online)
403 {
404 	struct memory_increment *incr;
405 	unsigned long long istart;
406 	int rc = 0;
407 
408 	list_for_each_entry(incr, &sclp_mem_list, list) {
409 		istart = rn2addr(incr->rn);
410 		if (start + size - 1 < istart)
411 			break;
412 		if (start > istart + rzm - 1)
413 			continue;
414 		if (online) {
415 			if (incr->usecount++)
416 				continue;
417 			/*
418 			 * Don't break the loop if one assign fails. Loop may
419 			 * be walked again on CANCEL and we can't save
420 			 * information if state changed before or not.
421 			 * So continue and increase usecount for all increments.
422 			 */
423 			rc |= sclp_assign_storage(incr->rn);
424 		} else {
425 			if (--incr->usecount)
426 				continue;
427 			sclp_unassign_storage(incr->rn);
428 		}
429 	}
430 	return rc ? -EIO : 0;
431 }
432 
sclp_mem_notifier(struct notifier_block * nb,unsigned long action,void * data)433 static int sclp_mem_notifier(struct notifier_block *nb,
434 			     unsigned long action, void *data)
435 {
436 	unsigned long start, size;
437 	struct memory_notify *arg;
438 	unsigned char id;
439 	int rc = 0;
440 
441 	arg = data;
442 	start = arg->start_pfn << PAGE_SHIFT;
443 	size = arg->nr_pages << PAGE_SHIFT;
444 	mutex_lock(&sclp_mem_mutex);
445 	for_each_clear_bit(id, sclp_storage_ids, sclp_max_storage_id + 1)
446 		sclp_attach_storage(id);
447 	switch (action) {
448 	case MEM_ONLINE:
449 	case MEM_GOING_OFFLINE:
450 	case MEM_CANCEL_OFFLINE:
451 		break;
452 	case MEM_GOING_ONLINE:
453 		rc = sclp_mem_change_state(start, size, 1);
454 		break;
455 	case MEM_CANCEL_ONLINE:
456 		sclp_mem_change_state(start, size, 0);
457 		break;
458 	case MEM_OFFLINE:
459 		sclp_mem_change_state(start, size, 0);
460 		break;
461 	default:
462 		rc = -EINVAL;
463 		break;
464 	}
465 	if (!rc)
466 		sclp_mem_state_changed = 1;
467 	mutex_unlock(&sclp_mem_mutex);
468 	return rc ? NOTIFY_BAD : NOTIFY_OK;
469 }
470 
471 static struct notifier_block sclp_mem_nb = {
472 	.notifier_call = sclp_mem_notifier,
473 };
474 
add_memory_merged(u16 rn)475 static void __init add_memory_merged(u16 rn)
476 {
477 	static u16 first_rn, num;
478 	unsigned long long start, size;
479 
480 	if (rn && first_rn && (first_rn + num == rn)) {
481 		num++;
482 		return;
483 	}
484 	if (!first_rn)
485 		goto skip_add;
486 	start = rn2addr(first_rn);
487 	size = (unsigned long long ) num * rzm;
488 	if (start >= VMEM_MAX_PHYS)
489 		goto skip_add;
490 	if (start + size > VMEM_MAX_PHYS)
491 		size = VMEM_MAX_PHYS - start;
492 	if (memory_end_set && (start >= memory_end))
493 		goto skip_add;
494 	if (memory_end_set && (start + size > memory_end))
495 		size = memory_end - start;
496 	add_memory(0, start, size);
497 skip_add:
498 	first_rn = rn;
499 	num = 1;
500 }
501 
sclp_add_standby_memory(void)502 static void __init sclp_add_standby_memory(void)
503 {
504 	struct memory_increment *incr;
505 
506 	list_for_each_entry(incr, &sclp_mem_list, list)
507 		if (incr->standby)
508 			add_memory_merged(incr->rn);
509 	add_memory_merged(0);
510 }
511 
512 #define MEM_SCT_SIZE (1UL << SECTION_SIZE_BITS)
513 
insert_increment(u16 rn,int standby,int assigned)514 static void __init insert_increment(u16 rn, int standby, int assigned)
515 {
516 	struct memory_increment *incr, *new_incr;
517 	struct list_head *prev;
518 	u16 last_rn;
519 
520 	new_incr = kzalloc(sizeof(*new_incr), GFP_KERNEL);
521 	if (!new_incr)
522 		return;
523 	new_incr->rn = rn;
524 	new_incr->standby = standby;
525 	if (!standby)
526 		new_incr->usecount = rzm > MEM_SCT_SIZE ? rzm/MEM_SCT_SIZE : 1;
527 	last_rn = 0;
528 	prev = &sclp_mem_list;
529 	list_for_each_entry(incr, &sclp_mem_list, list) {
530 		if (assigned && incr->rn > rn)
531 			break;
532 		if (!assigned && incr->rn - last_rn > 1)
533 			break;
534 		last_rn = incr->rn;
535 		prev = &incr->list;
536 	}
537 	if (!assigned)
538 		new_incr->rn = last_rn + 1;
539 	if (new_incr->rn > rnmax) {
540 		kfree(new_incr);
541 		return;
542 	}
543 	list_add(&new_incr->list, prev);
544 }
545 
sclp_mem_freeze(struct device * dev)546 static int sclp_mem_freeze(struct device *dev)
547 {
548 	if (!sclp_mem_state_changed)
549 		return 0;
550 	pr_err("Memory hotplug state changed, suspend refused.\n");
551 	return -EPERM;
552 }
553 
554 struct read_storage_sccb {
555 	struct sccb_header header;
556 	u16 max_id;
557 	u16 assigned;
558 	u16 standby;
559 	u16 :16;
560 	u32 entries[0];
561 } __packed;
562 
563 static const struct dev_pm_ops sclp_mem_pm_ops = {
564 	.freeze		= sclp_mem_freeze,
565 };
566 
567 static struct platform_driver sclp_mem_pdrv = {
568 	.driver = {
569 		.name	= "sclp_mem",
570 		.pm	= &sclp_mem_pm_ops,
571 	},
572 };
573 
sclp_detect_standby_memory(void)574 static int __init sclp_detect_standby_memory(void)
575 {
576 	struct platform_device *sclp_pdev;
577 	struct read_storage_sccb *sccb;
578 	int i, id, assigned, rc;
579 
580 	if (!early_read_info_sccb_valid)
581 		return 0;
582 	if ((sclp_facilities & 0xe00000000000ULL) != 0xe00000000000ULL)
583 		return 0;
584 	rc = -ENOMEM;
585 	sccb = (void *) __get_free_page(GFP_KERNEL | GFP_DMA);
586 	if (!sccb)
587 		goto out;
588 	assigned = 0;
589 	for (id = 0; id <= sclp_max_storage_id; id++) {
590 		memset(sccb, 0, PAGE_SIZE);
591 		sccb->header.length = PAGE_SIZE;
592 		rc = do_sync_request(0x00040001 | id << 8, sccb);
593 		if (rc)
594 			goto out;
595 		switch (sccb->header.response_code) {
596 		case 0x0010:
597 			set_bit(id, sclp_storage_ids);
598 			for (i = 0; i < sccb->assigned; i++) {
599 				if (!sccb->entries[i])
600 					continue;
601 				assigned++;
602 				insert_increment(sccb->entries[i] >> 16, 0, 1);
603 			}
604 			break;
605 		case 0x0310:
606 			break;
607 		case 0x0410:
608 			for (i = 0; i < sccb->assigned; i++) {
609 				if (!sccb->entries[i])
610 					continue;
611 				assigned++;
612 				insert_increment(sccb->entries[i] >> 16, 1, 1);
613 			}
614 			break;
615 		default:
616 			rc = -EIO;
617 			break;
618 		}
619 		if (!rc)
620 			sclp_max_storage_id = sccb->max_id;
621 	}
622 	if (rc || list_empty(&sclp_mem_list))
623 		goto out;
624 	for (i = 1; i <= rnmax - assigned; i++)
625 		insert_increment(0, 1, 0);
626 	rc = register_memory_notifier(&sclp_mem_nb);
627 	if (rc)
628 		goto out;
629 	rc = platform_driver_register(&sclp_mem_pdrv);
630 	if (rc)
631 		goto out;
632 	sclp_pdev = platform_device_register_simple("sclp_mem", -1, NULL, 0);
633 	rc = IS_ERR(sclp_pdev) ? PTR_ERR(sclp_pdev) : 0;
634 	if (rc)
635 		goto out_driver;
636 	sclp_add_standby_memory();
637 	goto out;
638 out_driver:
639 	platform_driver_unregister(&sclp_mem_pdrv);
640 out:
641 	free_page((unsigned long) sccb);
642 	return rc;
643 }
644 __initcall(sclp_detect_standby_memory);
645 
646 #endif /* CONFIG_MEMORY_HOTPLUG */
647 
648 /*
649  * Channel path configuration related functions.
650  */
651 
652 #define SCLP_CMDW_CONFIGURE_CHPATH		0x000f0001
653 #define SCLP_CMDW_DECONFIGURE_CHPATH		0x000e0001
654 #define SCLP_CMDW_READ_CHPATH_INFORMATION	0x00030001
655 
656 struct chp_cfg_sccb {
657 	struct sccb_header header;
658 	u8 ccm;
659 	u8 reserved[6];
660 	u8 cssid;
661 } __attribute__((packed));
662 
do_chp_configure(sclp_cmdw_t cmd)663 static int do_chp_configure(sclp_cmdw_t cmd)
664 {
665 	struct chp_cfg_sccb *sccb;
666 	int rc;
667 
668 	if (!SCLP_HAS_CHP_RECONFIG)
669 		return -EOPNOTSUPP;
670 	/* Prepare sccb. */
671 	sccb = (struct chp_cfg_sccb *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
672 	if (!sccb)
673 		return -ENOMEM;
674 	sccb->header.length = sizeof(*sccb);
675 	rc = do_sync_request(cmd, sccb);
676 	if (rc)
677 		goto out;
678 	switch (sccb->header.response_code) {
679 	case 0x0020:
680 	case 0x0120:
681 	case 0x0440:
682 	case 0x0450:
683 		break;
684 	default:
685 		pr_warning("configure channel-path failed "
686 			   "(cmd=0x%08x, response=0x%04x)\n", cmd,
687 			   sccb->header.response_code);
688 		rc = -EIO;
689 		break;
690 	}
691 out:
692 	free_page((unsigned long) sccb);
693 	return rc;
694 }
695 
696 /**
697  * sclp_chp_configure - perform configure channel-path sclp command
698  * @chpid: channel-path ID
699  *
700  * Perform configure channel-path command sclp command for specified chpid.
701  * Return 0 after command successfully finished, non-zero otherwise.
702  */
sclp_chp_configure(struct chp_id chpid)703 int sclp_chp_configure(struct chp_id chpid)
704 {
705 	return do_chp_configure(SCLP_CMDW_CONFIGURE_CHPATH | chpid.id << 8);
706 }
707 
708 /**
709  * sclp_chp_deconfigure - perform deconfigure channel-path sclp command
710  * @chpid: channel-path ID
711  *
712  * Perform deconfigure channel-path command sclp command for specified chpid
713  * and wait for completion. On success return 0. Return non-zero otherwise.
714  */
sclp_chp_deconfigure(struct chp_id chpid)715 int sclp_chp_deconfigure(struct chp_id chpid)
716 {
717 	return do_chp_configure(SCLP_CMDW_DECONFIGURE_CHPATH | chpid.id << 8);
718 }
719 
720 struct chp_info_sccb {
721 	struct sccb_header header;
722 	u8 recognized[SCLP_CHP_INFO_MASK_SIZE];
723 	u8 standby[SCLP_CHP_INFO_MASK_SIZE];
724 	u8 configured[SCLP_CHP_INFO_MASK_SIZE];
725 	u8 ccm;
726 	u8 reserved[6];
727 	u8 cssid;
728 } __attribute__((packed));
729 
730 /**
731  * sclp_chp_read_info - perform read channel-path information sclp command
732  * @info: resulting channel-path information data
733  *
734  * Perform read channel-path information sclp command and wait for completion.
735  * On success, store channel-path information in @info and return 0. Return
736  * non-zero otherwise.
737  */
sclp_chp_read_info(struct sclp_chp_info * info)738 int sclp_chp_read_info(struct sclp_chp_info *info)
739 {
740 	struct chp_info_sccb *sccb;
741 	int rc;
742 
743 	if (!SCLP_HAS_CHP_INFO)
744 		return -EOPNOTSUPP;
745 	/* Prepare sccb. */
746 	sccb = (struct chp_info_sccb *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
747 	if (!sccb)
748 		return -ENOMEM;
749 	sccb->header.length = sizeof(*sccb);
750 	rc = do_sync_request(SCLP_CMDW_READ_CHPATH_INFORMATION, sccb);
751 	if (rc)
752 		goto out;
753 	if (sccb->header.response_code != 0x0010) {
754 		pr_warning("read channel-path info failed "
755 			   "(response=0x%04x)\n", sccb->header.response_code);
756 		rc = -EIO;
757 		goto out;
758 	}
759 	memcpy(info->recognized, sccb->recognized, SCLP_CHP_INFO_MASK_SIZE);
760 	memcpy(info->standby, sccb->standby, SCLP_CHP_INFO_MASK_SIZE);
761 	memcpy(info->configured, sccb->configured, SCLP_CHP_INFO_MASK_SIZE);
762 out:
763 	free_page((unsigned long) sccb);
764 	return rc;
765 }
766