1 // SPDX-License-Identifier: GPL-2.0
3 * ipl/reipl/dump support for Linux on s390.
5 * Copyright IBM Corp. 2005, 2012
10 #include <linux/types.h>
11 #include <linux/export.h>
12 #include <linux/init.h>
13 #include <linux/device.h>
14 #include <linux/delay.h>
15 #include <linux/kstrtox.h>
16 #include <linux/panic_notifier.h>
17 #include <linux/reboot.h>
18 #include <linux/ctype.h>
20 #include <linux/gfp.h>
21 #include <linux/crash_dump.h>
22 #include <linux/debug_locks.h>
23 #include <asm/asm-extable.h>
27 #include <asm/setup.h>
28 #include <asm/cpcmd.h>
29 #include <asm/ebcdic.h>
31 #include <asm/checksum.h>
32 #include <asm/debug.h>
33 #include <asm/abs_lowcore.h>
34 #include <asm/os_info.h>
35 #include <asm/sections.h>
36 #include <asm/boot_data.h>
39 #define IPL_PARM_BLOCK_VERSION 0
41 #define IPL_UNKNOWN_STR "unknown"
42 #define IPL_CCW_STR "ccw"
43 #define IPL_ECKD_STR "eckd"
44 #define IPL_ECKD_DUMP_STR "eckd_dump"
45 #define IPL_FCP_STR "fcp"
46 #define IPL_FCP_DUMP_STR "fcp_dump"
47 #define IPL_NVME_STR "nvme"
48 #define IPL_NVME_DUMP_STR "nvme_dump"
49 #define IPL_NSS_STR "nss"
51 #define DUMP_CCW_STR "ccw"
52 #define DUMP_ECKD_STR "eckd"
53 #define DUMP_FCP_STR "fcp"
54 #define DUMP_NVME_STR "nvme"
55 #define DUMP_NONE_STR "none"
58 * Four shutdown trigger types are supported:
65 #define ON_PANIC_STR "on_panic"
66 #define ON_HALT_STR "on_halt"
67 #define ON_POFF_STR "on_poff"
68 #define ON_REIPL_STR "on_reboot"
69 #define ON_RESTART_STR "on_restart"
71 struct shutdown_action;
72 struct shutdown_trigger {
74 struct shutdown_action *action;
78 * The following shutdown action types are supported:
80 #define SHUTDOWN_ACTION_IPL_STR "ipl"
81 #define SHUTDOWN_ACTION_REIPL_STR "reipl"
82 #define SHUTDOWN_ACTION_DUMP_STR "dump"
83 #define SHUTDOWN_ACTION_VMCMD_STR "vmcmd"
84 #define SHUTDOWN_ACTION_STOP_STR "stop"
85 #define SHUTDOWN_ACTION_DUMP_REIPL_STR "dump_reipl"
87 struct shutdown_action {
89 void (*fn) (struct shutdown_trigger *trigger);
94 static char *ipl_type_str(enum ipl_type type)
101 case IPL_TYPE_ECKD_DUMP:
102 return IPL_ECKD_DUMP_STR;
105 case IPL_TYPE_FCP_DUMP:
106 return IPL_FCP_DUMP_STR;
111 case IPL_TYPE_NVME_DUMP:
112 return IPL_NVME_DUMP_STR;
113 case IPL_TYPE_UNKNOWN:
115 return IPL_UNKNOWN_STR;
127 static char *dump_type_str(enum dump_type type)
131 return DUMP_NONE_STR;
135 return DUMP_ECKD_STR;
139 return DUMP_NVME_STR;
145 int __bootdata_preserved(ipl_block_valid);
146 struct ipl_parameter_block __bootdata_preserved(ipl_block);
147 int __bootdata_preserved(ipl_secure_flag);
149 unsigned long __bootdata_preserved(ipl_cert_list_addr);
150 unsigned long __bootdata_preserved(ipl_cert_list_size);
152 unsigned long __bootdata(early_ipl_comp_list_addr);
153 unsigned long __bootdata(early_ipl_comp_list_size);
155 static int reipl_capabilities = IPL_TYPE_UNKNOWN;
157 static enum ipl_type reipl_type = IPL_TYPE_UNKNOWN;
158 static struct ipl_parameter_block *reipl_block_fcp;
159 static struct ipl_parameter_block *reipl_block_nvme;
160 static struct ipl_parameter_block *reipl_block_ccw;
161 static struct ipl_parameter_block *reipl_block_eckd;
162 static struct ipl_parameter_block *reipl_block_nss;
163 static struct ipl_parameter_block *reipl_block_actual;
165 static int dump_capabilities = DUMP_TYPE_NONE;
166 static enum dump_type dump_type = DUMP_TYPE_NONE;
167 static struct ipl_parameter_block *dump_block_fcp;
168 static struct ipl_parameter_block *dump_block_nvme;
169 static struct ipl_parameter_block *dump_block_ccw;
170 static struct ipl_parameter_block *dump_block_eckd;
172 static struct sclp_ipl_info sclp_ipl_info;
174 static bool reipl_nvme_clear;
175 static bool reipl_fcp_clear;
176 static bool reipl_ccw_clear;
177 static bool reipl_eckd_clear;
179 static inline int __diag308(unsigned long subcode, unsigned long addr)
181 union register_pair r1;
186 " diag %[r1],%[subcode],0x308\n"
189 : [r1] "+&d" (r1.pair)
190 : [subcode] "d" (subcode)
195 int diag308(unsigned long subcode, void *addr)
197 diag_stat_inc(DIAG_STAT_X308);
198 return __diag308(subcode, addr ? virt_to_phys(addr) : 0);
200 EXPORT_SYMBOL_GPL(diag308);
204 #define IPL_ATTR_SHOW_FN(_prefix, _name, _format, args...) \
205 static ssize_t sys_##_prefix##_##_name##_show(struct kobject *kobj, \
206 struct kobj_attribute *attr, \
209 return scnprintf(page, PAGE_SIZE, _format, ##args); \
212 #define IPL_ATTR_CCW_STORE_FN(_prefix, _name, _ipl_blk) \
213 static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
214 struct kobj_attribute *attr, \
215 const char *buf, size_t len) \
217 unsigned long long ssid, devno; \
219 if (sscanf(buf, "0.%llx.%llx\n", &ssid, &devno) != 2) \
222 if (ssid > __MAX_SSID || devno > __MAX_SUBCHANNEL) \
225 _ipl_blk.ssid = ssid; \
226 _ipl_blk.devno = devno; \
230 #define DEFINE_IPL_CCW_ATTR_RW(_prefix, _name, _ipl_blk) \
231 IPL_ATTR_SHOW_FN(_prefix, _name, "0.%x.%04x\n", \
232 _ipl_blk.ssid, _ipl_blk.devno); \
233 IPL_ATTR_CCW_STORE_FN(_prefix, _name, _ipl_blk); \
234 static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
235 __ATTR(_name, 0644, \
236 sys_##_prefix##_##_name##_show, \
237 sys_##_prefix##_##_name##_store) \
239 #define DEFINE_IPL_ATTR_RO(_prefix, _name, _format, _value) \
240 IPL_ATTR_SHOW_FN(_prefix, _name, _format, _value) \
241 static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
242 __ATTR(_name, 0444, sys_##_prefix##_##_name##_show, NULL)
244 #define DEFINE_IPL_ATTR_RW(_prefix, _name, _fmt_out, _fmt_in, _value) \
245 IPL_ATTR_SHOW_FN(_prefix, _name, _fmt_out, (unsigned long long) _value) \
246 static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
247 struct kobj_attribute *attr, \
248 const char *buf, size_t len) \
250 unsigned long long value; \
251 if (sscanf(buf, _fmt_in, &value) != 1) \
256 static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
257 __ATTR(_name, 0644, \
258 sys_##_prefix##_##_name##_show, \
259 sys_##_prefix##_##_name##_store)
261 #define DEFINE_IPL_ATTR_STR_RW(_prefix, _name, _fmt_out, _fmt_in, _value)\
262 IPL_ATTR_SHOW_FN(_prefix, _name, _fmt_out, _value) \
263 static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
264 struct kobj_attribute *attr, \
265 const char *buf, size_t len) \
267 strncpy(_value, buf, sizeof(_value) - 1); \
271 static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
272 __ATTR(_name, 0644, \
273 sys_##_prefix##_##_name##_show, \
274 sys_##_prefix##_##_name##_store)
280 static __init enum ipl_type get_ipl_type(void)
282 if (!ipl_block_valid)
283 return IPL_TYPE_UNKNOWN;
285 switch (ipl_block.pb0_hdr.pbt) {
289 if (ipl_block.fcp.opt == IPL_PB0_FCP_OPT_DUMP)
290 return IPL_TYPE_FCP_DUMP;
294 if (ipl_block.nvme.opt == IPL_PB0_NVME_OPT_DUMP)
295 return IPL_TYPE_NVME_DUMP;
297 return IPL_TYPE_NVME;
299 if (ipl_block.eckd.opt == IPL_PB0_ECKD_OPT_DUMP)
300 return IPL_TYPE_ECKD_DUMP;
302 return IPL_TYPE_ECKD;
304 return IPL_TYPE_UNKNOWN;
307 struct ipl_info ipl_info;
308 EXPORT_SYMBOL_GPL(ipl_info);
310 static ssize_t ipl_type_show(struct kobject *kobj, struct kobj_attribute *attr,
313 return sprintf(page, "%s\n", ipl_type_str(ipl_info.type));
316 static struct kobj_attribute sys_ipl_type_attr = __ATTR_RO(ipl_type);
318 static ssize_t ipl_secure_show(struct kobject *kobj,
319 struct kobj_attribute *attr, char *page)
321 return sprintf(page, "%i\n", !!ipl_secure_flag);
324 static struct kobj_attribute sys_ipl_secure_attr =
325 __ATTR(secure, 0444, ipl_secure_show, NULL);
327 static ssize_t ipl_has_secure_show(struct kobject *kobj,
328 struct kobj_attribute *attr, char *page)
330 return sprintf(page, "%i\n", !!sclp.has_sipl);
333 static struct kobj_attribute sys_ipl_has_secure_attr =
334 __ATTR(has_secure, 0444, ipl_has_secure_show, NULL);
336 static ssize_t ipl_vm_parm_show(struct kobject *kobj,
337 struct kobj_attribute *attr, char *page)
339 char parm[DIAG308_VMPARM_SIZE + 1] = {};
341 if (ipl_block_valid && (ipl_block.pb0_hdr.pbt == IPL_PBT_CCW))
342 ipl_block_get_ascii_vmparm(parm, sizeof(parm), &ipl_block);
343 return sprintf(page, "%s\n", parm);
346 static struct kobj_attribute sys_ipl_vm_parm_attr =
347 __ATTR(parm, 0444, ipl_vm_parm_show, NULL);
349 static ssize_t sys_ipl_device_show(struct kobject *kobj,
350 struct kobj_attribute *attr, char *page)
352 switch (ipl_info.type) {
354 return sprintf(page, "0.%x.%04x\n", ipl_block.ccw.ssid,
355 ipl_block.ccw.devno);
357 case IPL_TYPE_ECKD_DUMP:
358 return sprintf(page, "0.%x.%04x\n", ipl_block.eckd.ssid,
359 ipl_block.eckd.devno);
361 case IPL_TYPE_FCP_DUMP:
362 return sprintf(page, "0.0.%04x\n", ipl_block.fcp.devno);
364 case IPL_TYPE_NVME_DUMP:
365 return sprintf(page, "%08ux\n", ipl_block.nvme.fid);
371 static struct kobj_attribute sys_ipl_device_attr =
372 __ATTR(device, 0444, sys_ipl_device_show, NULL);
374 static ssize_t ipl_parameter_read(struct file *filp, struct kobject *kobj,
375 struct bin_attribute *attr, char *buf,
376 loff_t off, size_t count)
378 return memory_read_from_buffer(buf, count, &off, &ipl_block,
381 static struct bin_attribute ipl_parameter_attr =
382 __BIN_ATTR(binary_parameter, 0444, ipl_parameter_read, NULL,
385 static ssize_t ipl_scp_data_read(struct file *filp, struct kobject *kobj,
386 struct bin_attribute *attr, char *buf,
387 loff_t off, size_t count)
389 unsigned int size = ipl_block.fcp.scp_data_len;
390 void *scp_data = &ipl_block.fcp.scp_data;
392 return memory_read_from_buffer(buf, count, &off, scp_data, size);
395 static ssize_t ipl_nvme_scp_data_read(struct file *filp, struct kobject *kobj,
396 struct bin_attribute *attr, char *buf,
397 loff_t off, size_t count)
399 unsigned int size = ipl_block.nvme.scp_data_len;
400 void *scp_data = &ipl_block.nvme.scp_data;
402 return memory_read_from_buffer(buf, count, &off, scp_data, size);
405 static ssize_t ipl_eckd_scp_data_read(struct file *filp, struct kobject *kobj,
406 struct bin_attribute *attr, char *buf,
407 loff_t off, size_t count)
409 unsigned int size = ipl_block.eckd.scp_data_len;
410 void *scp_data = &ipl_block.eckd.scp_data;
412 return memory_read_from_buffer(buf, count, &off, scp_data, size);
415 static struct bin_attribute ipl_scp_data_attr =
416 __BIN_ATTR(scp_data, 0444, ipl_scp_data_read, NULL, PAGE_SIZE);
418 static struct bin_attribute ipl_nvme_scp_data_attr =
419 __BIN_ATTR(scp_data, 0444, ipl_nvme_scp_data_read, NULL, PAGE_SIZE);
421 static struct bin_attribute ipl_eckd_scp_data_attr =
422 __BIN_ATTR(scp_data, 0444, ipl_eckd_scp_data_read, NULL, PAGE_SIZE);
424 static struct bin_attribute *ipl_fcp_bin_attrs[] = {
430 static struct bin_attribute *ipl_nvme_bin_attrs[] = {
432 &ipl_nvme_scp_data_attr,
436 static struct bin_attribute *ipl_eckd_bin_attrs[] = {
438 &ipl_eckd_scp_data_attr,
442 /* FCP ipl device attributes */
444 DEFINE_IPL_ATTR_RO(ipl_fcp, wwpn, "0x%016llx\n",
445 (unsigned long long)ipl_block.fcp.wwpn);
446 DEFINE_IPL_ATTR_RO(ipl_fcp, lun, "0x%016llx\n",
447 (unsigned long long)ipl_block.fcp.lun);
448 DEFINE_IPL_ATTR_RO(ipl_fcp, bootprog, "%lld\n",
449 (unsigned long long)ipl_block.fcp.bootprog);
450 DEFINE_IPL_ATTR_RO(ipl_fcp, br_lba, "%lld\n",
451 (unsigned long long)ipl_block.fcp.br_lba);
453 /* NVMe ipl device attributes */
454 DEFINE_IPL_ATTR_RO(ipl_nvme, fid, "0x%08llx\n",
455 (unsigned long long)ipl_block.nvme.fid);
456 DEFINE_IPL_ATTR_RO(ipl_nvme, nsid, "0x%08llx\n",
457 (unsigned long long)ipl_block.nvme.nsid);
458 DEFINE_IPL_ATTR_RO(ipl_nvme, bootprog, "%lld\n",
459 (unsigned long long)ipl_block.nvme.bootprog);
460 DEFINE_IPL_ATTR_RO(ipl_nvme, br_lba, "%lld\n",
461 (unsigned long long)ipl_block.nvme.br_lba);
463 /* ECKD ipl device attributes */
464 DEFINE_IPL_ATTR_RO(ipl_eckd, bootprog, "%lld\n",
465 (unsigned long long)ipl_block.eckd.bootprog);
467 #define IPL_ATTR_BR_CHR_SHOW_FN(_name, _ipb) \
468 static ssize_t eckd_##_name##_br_chr_show(struct kobject *kobj, \
469 struct kobj_attribute *attr, \
472 struct ipl_pb0_eckd *ipb = &(_ipb); \
474 if (!ipb->br_chr.cyl && \
475 !ipb->br_chr.head && \
476 !ipb->br_chr.record) \
477 return sprintf(buf, "auto\n"); \
479 return sprintf(buf, "0x%x,0x%x,0x%x\n", \
482 ipb->br_chr.record); \
485 #define IPL_ATTR_BR_CHR_STORE_FN(_name, _ipb) \
486 static ssize_t eckd_##_name##_br_chr_store(struct kobject *kobj, \
487 struct kobj_attribute *attr, \
488 const char *buf, size_t len) \
490 struct ipl_pb0_eckd *ipb = &(_ipb); \
491 unsigned long args[3] = { 0 }; \
492 char *p, *p1, *tmp = NULL; \
495 if (!strncmp(buf, "auto", 4)) \
498 tmp = kstrdup(buf, GFP_KERNEL); \
500 for (i = 0; i < 3; i++) { \
501 p1 = strsep(&p, ", "); \
506 rc = kstrtoul(p1, 0, args + i); \
515 if ((args[0] || args[1]) && !args[2]) \
518 if (args[0] > UINT_MAX || args[1] > 255 || args[2] > 255) \
522 ipb->br_chr.cyl = args[0]; \
523 ipb->br_chr.head = args[1]; \
524 ipb->br_chr.record = args[2]; \
531 IPL_ATTR_BR_CHR_SHOW_FN(ipl, ipl_block.eckd);
532 static struct kobj_attribute sys_ipl_eckd_br_chr_attr =
533 __ATTR(br_chr, 0644, eckd_ipl_br_chr_show, NULL);
535 IPL_ATTR_BR_CHR_SHOW_FN(reipl, reipl_block_eckd->eckd);
536 IPL_ATTR_BR_CHR_STORE_FN(reipl, reipl_block_eckd->eckd);
538 static struct kobj_attribute sys_reipl_eckd_br_chr_attr =
539 __ATTR(br_chr, 0644, eckd_reipl_br_chr_show, eckd_reipl_br_chr_store);
541 static ssize_t ipl_ccw_loadparm_show(struct kobject *kobj,
542 struct kobj_attribute *attr, char *page)
544 char loadparm[LOADPARM_LEN + 1] = {};
546 if (!sclp_ipl_info.is_valid)
547 return sprintf(page, "#unknown#\n");
548 memcpy(loadparm, &sclp_ipl_info.loadparm, LOADPARM_LEN);
549 EBCASC(loadparm, LOADPARM_LEN);
551 return sprintf(page, "%s\n", loadparm);
554 static struct kobj_attribute sys_ipl_ccw_loadparm_attr =
555 __ATTR(loadparm, 0444, ipl_ccw_loadparm_show, NULL);
557 static struct attribute *ipl_fcp_attrs[] = {
558 &sys_ipl_type_attr.attr,
559 &sys_ipl_device_attr.attr,
560 &sys_ipl_fcp_wwpn_attr.attr,
561 &sys_ipl_fcp_lun_attr.attr,
562 &sys_ipl_fcp_bootprog_attr.attr,
563 &sys_ipl_fcp_br_lba_attr.attr,
564 &sys_ipl_ccw_loadparm_attr.attr,
565 &sys_ipl_secure_attr.attr,
566 &sys_ipl_has_secure_attr.attr,
570 static struct attribute_group ipl_fcp_attr_group = {
571 .attrs = ipl_fcp_attrs,
572 .bin_attrs = ipl_fcp_bin_attrs,
575 static struct attribute *ipl_nvme_attrs[] = {
576 &sys_ipl_type_attr.attr,
577 &sys_ipl_nvme_fid_attr.attr,
578 &sys_ipl_nvme_nsid_attr.attr,
579 &sys_ipl_nvme_bootprog_attr.attr,
580 &sys_ipl_nvme_br_lba_attr.attr,
581 &sys_ipl_ccw_loadparm_attr.attr,
582 &sys_ipl_secure_attr.attr,
583 &sys_ipl_has_secure_attr.attr,
587 static struct attribute_group ipl_nvme_attr_group = {
588 .attrs = ipl_nvme_attrs,
589 .bin_attrs = ipl_nvme_bin_attrs,
592 static struct attribute *ipl_eckd_attrs[] = {
593 &sys_ipl_type_attr.attr,
594 &sys_ipl_eckd_bootprog_attr.attr,
595 &sys_ipl_eckd_br_chr_attr.attr,
596 &sys_ipl_ccw_loadparm_attr.attr,
597 &sys_ipl_device_attr.attr,
598 &sys_ipl_secure_attr.attr,
599 &sys_ipl_has_secure_attr.attr,
603 static struct attribute_group ipl_eckd_attr_group = {
604 .attrs = ipl_eckd_attrs,
605 .bin_attrs = ipl_eckd_bin_attrs,
608 /* CCW ipl device attributes */
610 static struct attribute *ipl_ccw_attrs_vm[] = {
611 &sys_ipl_type_attr.attr,
612 &sys_ipl_device_attr.attr,
613 &sys_ipl_ccw_loadparm_attr.attr,
614 &sys_ipl_vm_parm_attr.attr,
615 &sys_ipl_secure_attr.attr,
616 &sys_ipl_has_secure_attr.attr,
620 static struct attribute *ipl_ccw_attrs_lpar[] = {
621 &sys_ipl_type_attr.attr,
622 &sys_ipl_device_attr.attr,
623 &sys_ipl_ccw_loadparm_attr.attr,
624 &sys_ipl_secure_attr.attr,
625 &sys_ipl_has_secure_attr.attr,
629 static struct attribute_group ipl_ccw_attr_group_vm = {
630 .attrs = ipl_ccw_attrs_vm,
633 static struct attribute_group ipl_ccw_attr_group_lpar = {
634 .attrs = ipl_ccw_attrs_lpar
637 /* UNKNOWN ipl device attributes */
639 static struct attribute *ipl_unknown_attrs[] = {
640 &sys_ipl_type_attr.attr,
644 static struct attribute_group ipl_unknown_attr_group = {
645 .attrs = ipl_unknown_attrs,
648 static struct kset *ipl_kset;
650 static void __ipl_run(void *unused)
652 diag308(DIAG308_LOAD_CLEAR, NULL);
655 static void ipl_run(struct shutdown_trigger *trigger)
657 smp_call_ipl_cpu(__ipl_run, NULL);
660 static int __init ipl_init(void)
664 ipl_kset = kset_create_and_add("ipl", NULL, firmware_kobj);
669 switch (ipl_info.type) {
672 rc = sysfs_create_group(&ipl_kset->kobj,
673 &ipl_ccw_attr_group_vm);
675 rc = sysfs_create_group(&ipl_kset->kobj,
676 &ipl_ccw_attr_group_lpar);
679 rc = sysfs_create_group(&ipl_kset->kobj, &ipl_eckd_attr_group);
682 case IPL_TYPE_FCP_DUMP:
683 rc = sysfs_create_group(&ipl_kset->kobj, &ipl_fcp_attr_group);
686 case IPL_TYPE_NVME_DUMP:
687 rc = sysfs_create_group(&ipl_kset->kobj, &ipl_nvme_attr_group);
690 rc = sysfs_create_group(&ipl_kset->kobj,
691 &ipl_unknown_attr_group);
696 panic("ipl_init failed: rc = %i\n", rc);
701 static struct shutdown_action __refdata ipl_action = {
702 .name = SHUTDOWN_ACTION_IPL_STR,
708 * reipl shutdown action: Reboot Linux on shutdown.
711 /* VM IPL PARM attributes */
712 static ssize_t reipl_generic_vmparm_show(struct ipl_parameter_block *ipb,
715 char vmparm[DIAG308_VMPARM_SIZE + 1] = {};
717 ipl_block_get_ascii_vmparm(vmparm, sizeof(vmparm), ipb);
718 return sprintf(page, "%s\n", vmparm);
721 static ssize_t reipl_generic_vmparm_store(struct ipl_parameter_block *ipb,
723 const char *buf, size_t len)
727 /* ignore trailing newline */
729 if ((len > 0) && (buf[len - 1] == '\n'))
732 if (ip_len > vmparm_max)
735 /* parm is used to store kernel options, check for common chars */
736 for (i = 0; i < ip_len; i++)
737 if (!(isalnum(buf[i]) || isascii(buf[i]) || isprint(buf[i])))
740 memset(ipb->ccw.vm_parm, 0, DIAG308_VMPARM_SIZE);
741 ipb->ccw.vm_parm_len = ip_len;
743 ipb->ccw.vm_flags |= IPL_PB0_CCW_VM_FLAG_VP;
744 memcpy(ipb->ccw.vm_parm, buf, ip_len);
745 ASCEBC(ipb->ccw.vm_parm, ip_len);
747 ipb->ccw.vm_flags &= ~IPL_PB0_CCW_VM_FLAG_VP;
754 static ssize_t reipl_nss_vmparm_show(struct kobject *kobj,
755 struct kobj_attribute *attr, char *page)
757 return reipl_generic_vmparm_show(reipl_block_nss, page);
760 static ssize_t reipl_nss_vmparm_store(struct kobject *kobj,
761 struct kobj_attribute *attr,
762 const char *buf, size_t len)
764 return reipl_generic_vmparm_store(reipl_block_nss, 56, buf, len);
768 static ssize_t reipl_ccw_vmparm_show(struct kobject *kobj,
769 struct kobj_attribute *attr, char *page)
771 return reipl_generic_vmparm_show(reipl_block_ccw, page);
774 static ssize_t reipl_ccw_vmparm_store(struct kobject *kobj,
775 struct kobj_attribute *attr,
776 const char *buf, size_t len)
778 return reipl_generic_vmparm_store(reipl_block_ccw, 64, buf, len);
781 static struct kobj_attribute sys_reipl_nss_vmparm_attr =
782 __ATTR(parm, 0644, reipl_nss_vmparm_show,
783 reipl_nss_vmparm_store);
784 static struct kobj_attribute sys_reipl_ccw_vmparm_attr =
785 __ATTR(parm, 0644, reipl_ccw_vmparm_show,
786 reipl_ccw_vmparm_store);
788 /* FCP reipl device attributes */
790 static ssize_t reipl_fcp_scpdata_read(struct file *filp, struct kobject *kobj,
791 struct bin_attribute *attr,
792 char *buf, loff_t off, size_t count)
794 size_t size = reipl_block_fcp->fcp.scp_data_len;
795 void *scp_data = reipl_block_fcp->fcp.scp_data;
797 return memory_read_from_buffer(buf, count, &off, scp_data, size);
800 static ssize_t reipl_fcp_scpdata_write(struct file *filp, struct kobject *kobj,
801 struct bin_attribute *attr,
802 char *buf, loff_t off, size_t count)
804 size_t scpdata_len = count;
811 memcpy(reipl_block_fcp->fcp.scp_data, buf, count);
812 if (scpdata_len % 8) {
813 padding = 8 - (scpdata_len % 8);
814 memset(reipl_block_fcp->fcp.scp_data + scpdata_len,
816 scpdata_len += padding;
819 reipl_block_fcp->hdr.len = IPL_BP_FCP_LEN + scpdata_len;
820 reipl_block_fcp->fcp.len = IPL_BP0_FCP_LEN + scpdata_len;
821 reipl_block_fcp->fcp.scp_data_len = scpdata_len;
825 static struct bin_attribute sys_reipl_fcp_scp_data_attr =
826 __BIN_ATTR(scp_data, 0644, reipl_fcp_scpdata_read,
827 reipl_fcp_scpdata_write, DIAG308_SCPDATA_SIZE);
829 static struct bin_attribute *reipl_fcp_bin_attrs[] = {
830 &sys_reipl_fcp_scp_data_attr,
834 DEFINE_IPL_ATTR_RW(reipl_fcp, wwpn, "0x%016llx\n", "%llx\n",
835 reipl_block_fcp->fcp.wwpn);
836 DEFINE_IPL_ATTR_RW(reipl_fcp, lun, "0x%016llx\n", "%llx\n",
837 reipl_block_fcp->fcp.lun);
838 DEFINE_IPL_ATTR_RW(reipl_fcp, bootprog, "%lld\n", "%lld\n",
839 reipl_block_fcp->fcp.bootprog);
840 DEFINE_IPL_ATTR_RW(reipl_fcp, br_lba, "%lld\n", "%lld\n",
841 reipl_block_fcp->fcp.br_lba);
842 DEFINE_IPL_ATTR_RW(reipl_fcp, device, "0.0.%04llx\n", "0.0.%llx\n",
843 reipl_block_fcp->fcp.devno);
845 static void reipl_get_ascii_loadparm(char *loadparm,
846 struct ipl_parameter_block *ibp)
848 memcpy(loadparm, ibp->common.loadparm, LOADPARM_LEN);
849 EBCASC(loadparm, LOADPARM_LEN);
850 loadparm[LOADPARM_LEN] = 0;
854 static ssize_t reipl_generic_loadparm_show(struct ipl_parameter_block *ipb,
857 char buf[LOADPARM_LEN + 1];
859 reipl_get_ascii_loadparm(buf, ipb);
860 return sprintf(page, "%s\n", buf);
863 static ssize_t reipl_generic_loadparm_store(struct ipl_parameter_block *ipb,
864 const char *buf, size_t len)
868 /* ignore trailing newline */
870 if ((len > 0) && (buf[len - 1] == '\n'))
872 /* loadparm can have max 8 characters and must not start with a blank */
873 if ((lp_len > LOADPARM_LEN) || ((lp_len > 0) && (buf[0] == ' ')))
875 /* loadparm can only contain "a-z,A-Z,0-9,SP,." */
876 for (i = 0; i < lp_len; i++) {
877 if (isalpha(buf[i]) || isdigit(buf[i]) || (buf[i] == ' ') ||
882 /* initialize loadparm with blanks */
883 memset(ipb->common.loadparm, ' ', LOADPARM_LEN);
884 /* copy and convert to ebcdic */
885 memcpy(ipb->common.loadparm, buf, lp_len);
886 ASCEBC(ipb->common.loadparm, LOADPARM_LEN);
887 ipb->common.flags |= IPL_PB0_FLAG_LOADPARM;
891 #define DEFINE_GENERIC_LOADPARM(name) \
892 static ssize_t reipl_##name##_loadparm_show(struct kobject *kobj, \
893 struct kobj_attribute *attr, char *page) \
895 return reipl_generic_loadparm_show(reipl_block_##name, page); \
897 static ssize_t reipl_##name##_loadparm_store(struct kobject *kobj, \
898 struct kobj_attribute *attr, \
899 const char *buf, size_t len) \
901 return reipl_generic_loadparm_store(reipl_block_##name, buf, len); \
903 static struct kobj_attribute sys_reipl_##name##_loadparm_attr = \
904 __ATTR(loadparm, 0644, reipl_##name##_loadparm_show, \
905 reipl_##name##_loadparm_store)
907 DEFINE_GENERIC_LOADPARM(fcp);
908 DEFINE_GENERIC_LOADPARM(nvme);
909 DEFINE_GENERIC_LOADPARM(ccw);
910 DEFINE_GENERIC_LOADPARM(nss);
911 DEFINE_GENERIC_LOADPARM(eckd);
913 static ssize_t reipl_fcp_clear_show(struct kobject *kobj,
914 struct kobj_attribute *attr, char *page)
916 return sprintf(page, "%u\n", reipl_fcp_clear);
919 static ssize_t reipl_fcp_clear_store(struct kobject *kobj,
920 struct kobj_attribute *attr,
921 const char *buf, size_t len)
923 if (kstrtobool(buf, &reipl_fcp_clear) < 0)
928 static struct attribute *reipl_fcp_attrs[] = {
929 &sys_reipl_fcp_device_attr.attr,
930 &sys_reipl_fcp_wwpn_attr.attr,
931 &sys_reipl_fcp_lun_attr.attr,
932 &sys_reipl_fcp_bootprog_attr.attr,
933 &sys_reipl_fcp_br_lba_attr.attr,
934 &sys_reipl_fcp_loadparm_attr.attr,
938 static struct attribute_group reipl_fcp_attr_group = {
939 .attrs = reipl_fcp_attrs,
940 .bin_attrs = reipl_fcp_bin_attrs,
943 static struct kobj_attribute sys_reipl_fcp_clear_attr =
944 __ATTR(clear, 0644, reipl_fcp_clear_show, reipl_fcp_clear_store);
946 /* NVME reipl device attributes */
948 static ssize_t reipl_nvme_scpdata_read(struct file *filp, struct kobject *kobj,
949 struct bin_attribute *attr,
950 char *buf, loff_t off, size_t count)
952 size_t size = reipl_block_nvme->nvme.scp_data_len;
953 void *scp_data = reipl_block_nvme->nvme.scp_data;
955 return memory_read_from_buffer(buf, count, &off, scp_data, size);
958 static ssize_t reipl_nvme_scpdata_write(struct file *filp, struct kobject *kobj,
959 struct bin_attribute *attr,
960 char *buf, loff_t off, size_t count)
962 size_t scpdata_len = count;
968 memcpy(reipl_block_nvme->nvme.scp_data, buf, count);
969 if (scpdata_len % 8) {
970 padding = 8 - (scpdata_len % 8);
971 memset(reipl_block_nvme->nvme.scp_data + scpdata_len,
973 scpdata_len += padding;
976 reipl_block_nvme->hdr.len = IPL_BP_FCP_LEN + scpdata_len;
977 reipl_block_nvme->nvme.len = IPL_BP0_FCP_LEN + scpdata_len;
978 reipl_block_nvme->nvme.scp_data_len = scpdata_len;
983 static struct bin_attribute sys_reipl_nvme_scp_data_attr =
984 __BIN_ATTR(scp_data, 0644, reipl_nvme_scpdata_read,
985 reipl_nvme_scpdata_write, DIAG308_SCPDATA_SIZE);
987 static struct bin_attribute *reipl_nvme_bin_attrs[] = {
988 &sys_reipl_nvme_scp_data_attr,
992 DEFINE_IPL_ATTR_RW(reipl_nvme, fid, "0x%08llx\n", "%llx\n",
993 reipl_block_nvme->nvme.fid);
994 DEFINE_IPL_ATTR_RW(reipl_nvme, nsid, "0x%08llx\n", "%llx\n",
995 reipl_block_nvme->nvme.nsid);
996 DEFINE_IPL_ATTR_RW(reipl_nvme, bootprog, "%lld\n", "%lld\n",
997 reipl_block_nvme->nvme.bootprog);
998 DEFINE_IPL_ATTR_RW(reipl_nvme, br_lba, "%lld\n", "%lld\n",
999 reipl_block_nvme->nvme.br_lba);
1001 static struct attribute *reipl_nvme_attrs[] = {
1002 &sys_reipl_nvme_fid_attr.attr,
1003 &sys_reipl_nvme_nsid_attr.attr,
1004 &sys_reipl_nvme_bootprog_attr.attr,
1005 &sys_reipl_nvme_br_lba_attr.attr,
1006 &sys_reipl_nvme_loadparm_attr.attr,
1010 static struct attribute_group reipl_nvme_attr_group = {
1011 .attrs = reipl_nvme_attrs,
1012 .bin_attrs = reipl_nvme_bin_attrs
1015 static ssize_t reipl_nvme_clear_show(struct kobject *kobj,
1016 struct kobj_attribute *attr, char *page)
1018 return sprintf(page, "%u\n", reipl_nvme_clear);
1021 static ssize_t reipl_nvme_clear_store(struct kobject *kobj,
1022 struct kobj_attribute *attr,
1023 const char *buf, size_t len)
1025 if (kstrtobool(buf, &reipl_nvme_clear) < 0)
1030 static struct kobj_attribute sys_reipl_nvme_clear_attr =
1031 __ATTR(clear, 0644, reipl_nvme_clear_show, reipl_nvme_clear_store);
1033 /* CCW reipl device attributes */
1034 DEFINE_IPL_CCW_ATTR_RW(reipl_ccw, device, reipl_block_ccw->ccw);
1036 static ssize_t reipl_ccw_clear_show(struct kobject *kobj,
1037 struct kobj_attribute *attr, char *page)
1039 return sprintf(page, "%u\n", reipl_ccw_clear);
1042 static ssize_t reipl_ccw_clear_store(struct kobject *kobj,
1043 struct kobj_attribute *attr,
1044 const char *buf, size_t len)
1046 if (kstrtobool(buf, &reipl_ccw_clear) < 0)
1051 static struct kobj_attribute sys_reipl_ccw_clear_attr =
1052 __ATTR(clear, 0644, reipl_ccw_clear_show, reipl_ccw_clear_store);
1054 static struct attribute *reipl_ccw_attrs_vm[] = {
1055 &sys_reipl_ccw_device_attr.attr,
1056 &sys_reipl_ccw_loadparm_attr.attr,
1057 &sys_reipl_ccw_vmparm_attr.attr,
1058 &sys_reipl_ccw_clear_attr.attr,
1062 static struct attribute *reipl_ccw_attrs_lpar[] = {
1063 &sys_reipl_ccw_device_attr.attr,
1064 &sys_reipl_ccw_loadparm_attr.attr,
1065 &sys_reipl_ccw_clear_attr.attr,
1069 static struct attribute_group reipl_ccw_attr_group_vm = {
1070 .name = IPL_CCW_STR,
1071 .attrs = reipl_ccw_attrs_vm,
1074 static struct attribute_group reipl_ccw_attr_group_lpar = {
1075 .name = IPL_CCW_STR,
1076 .attrs = reipl_ccw_attrs_lpar,
1079 /* ECKD reipl device attributes */
1081 static ssize_t reipl_eckd_scpdata_read(struct file *filp, struct kobject *kobj,
1082 struct bin_attribute *attr,
1083 char *buf, loff_t off, size_t count)
1085 size_t size = reipl_block_eckd->eckd.scp_data_len;
1086 void *scp_data = reipl_block_eckd->eckd.scp_data;
1088 return memory_read_from_buffer(buf, count, &off, scp_data, size);
1091 static ssize_t reipl_eckd_scpdata_write(struct file *filp, struct kobject *kobj,
1092 struct bin_attribute *attr,
1093 char *buf, loff_t off, size_t count)
1095 size_t scpdata_len = count;
1101 memcpy(reipl_block_eckd->eckd.scp_data, buf, count);
1102 if (scpdata_len % 8) {
1103 padding = 8 - (scpdata_len % 8);
1104 memset(reipl_block_eckd->eckd.scp_data + scpdata_len,
1106 scpdata_len += padding;
1109 reipl_block_eckd->hdr.len = IPL_BP_ECKD_LEN + scpdata_len;
1110 reipl_block_eckd->eckd.len = IPL_BP0_ECKD_LEN + scpdata_len;
1111 reipl_block_eckd->eckd.scp_data_len = scpdata_len;
1116 static struct bin_attribute sys_reipl_eckd_scp_data_attr =
1117 __BIN_ATTR(scp_data, 0644, reipl_eckd_scpdata_read,
1118 reipl_eckd_scpdata_write, DIAG308_SCPDATA_SIZE);
1120 static struct bin_attribute *reipl_eckd_bin_attrs[] = {
1121 &sys_reipl_eckd_scp_data_attr,
1125 DEFINE_IPL_CCW_ATTR_RW(reipl_eckd, device, reipl_block_eckd->eckd);
1126 DEFINE_IPL_ATTR_RW(reipl_eckd, bootprog, "%lld\n", "%lld\n",
1127 reipl_block_eckd->eckd.bootprog);
1129 static struct attribute *reipl_eckd_attrs[] = {
1130 &sys_reipl_eckd_device_attr.attr,
1131 &sys_reipl_eckd_bootprog_attr.attr,
1132 &sys_reipl_eckd_br_chr_attr.attr,
1133 &sys_reipl_eckd_loadparm_attr.attr,
1137 static struct attribute_group reipl_eckd_attr_group = {
1138 .attrs = reipl_eckd_attrs,
1139 .bin_attrs = reipl_eckd_bin_attrs
1142 static ssize_t reipl_eckd_clear_show(struct kobject *kobj,
1143 struct kobj_attribute *attr, char *page)
1145 return sprintf(page, "%u\n", reipl_eckd_clear);
1148 static ssize_t reipl_eckd_clear_store(struct kobject *kobj,
1149 struct kobj_attribute *attr,
1150 const char *buf, size_t len)
1152 if (kstrtobool(buf, &reipl_eckd_clear) < 0)
1157 static struct kobj_attribute sys_reipl_eckd_clear_attr =
1158 __ATTR(clear, 0644, reipl_eckd_clear_show, reipl_eckd_clear_store);
1160 /* NSS reipl device attributes */
1161 static void reipl_get_ascii_nss_name(char *dst,
1162 struct ipl_parameter_block *ipb)
1164 memcpy(dst, ipb->ccw.nss_name, NSS_NAME_SIZE);
1165 EBCASC(dst, NSS_NAME_SIZE);
1166 dst[NSS_NAME_SIZE] = 0;
1169 static ssize_t reipl_nss_name_show(struct kobject *kobj,
1170 struct kobj_attribute *attr, char *page)
1172 char nss_name[NSS_NAME_SIZE + 1] = {};
1174 reipl_get_ascii_nss_name(nss_name, reipl_block_nss);
1175 return sprintf(page, "%s\n", nss_name);
1178 static ssize_t reipl_nss_name_store(struct kobject *kobj,
1179 struct kobj_attribute *attr,
1180 const char *buf, size_t len)
1184 /* ignore trailing newline */
1186 if ((len > 0) && (buf[len - 1] == '\n'))
1189 if (nss_len > NSS_NAME_SIZE)
1192 memset(reipl_block_nss->ccw.nss_name, 0x40, NSS_NAME_SIZE);
1194 reipl_block_nss->ccw.vm_flags |= IPL_PB0_CCW_VM_FLAG_NSS;
1195 memcpy(reipl_block_nss->ccw.nss_name, buf, nss_len);
1196 ASCEBC(reipl_block_nss->ccw.nss_name, nss_len);
1197 EBC_TOUPPER(reipl_block_nss->ccw.nss_name, nss_len);
1199 reipl_block_nss->ccw.vm_flags &= ~IPL_PB0_CCW_VM_FLAG_NSS;
1205 static struct kobj_attribute sys_reipl_nss_name_attr =
1206 __ATTR(name, 0644, reipl_nss_name_show,
1207 reipl_nss_name_store);
1209 static struct attribute *reipl_nss_attrs[] = {
1210 &sys_reipl_nss_name_attr.attr,
1211 &sys_reipl_nss_loadparm_attr.attr,
1212 &sys_reipl_nss_vmparm_attr.attr,
1216 static struct attribute_group reipl_nss_attr_group = {
1217 .name = IPL_NSS_STR,
1218 .attrs = reipl_nss_attrs,
1221 void set_os_info_reipl_block(void)
1223 os_info_entry_add(OS_INFO_REIPL_BLOCK, reipl_block_actual,
1224 reipl_block_actual->hdr.len);
1229 static int reipl_set_type(enum ipl_type type)
1231 if (!(reipl_capabilities & type))
1236 reipl_block_actual = reipl_block_ccw;
1239 reipl_block_actual = reipl_block_eckd;
1242 reipl_block_actual = reipl_block_fcp;
1245 reipl_block_actual = reipl_block_nvme;
1248 reipl_block_actual = reipl_block_nss;
1257 static ssize_t reipl_type_show(struct kobject *kobj,
1258 struct kobj_attribute *attr, char *page)
1260 return sprintf(page, "%s\n", ipl_type_str(reipl_type));
1263 static ssize_t reipl_type_store(struct kobject *kobj,
1264 struct kobj_attribute *attr,
1265 const char *buf, size_t len)
1269 if (strncmp(buf, IPL_CCW_STR, strlen(IPL_CCW_STR)) == 0)
1270 rc = reipl_set_type(IPL_TYPE_CCW);
1271 else if (strncmp(buf, IPL_ECKD_STR, strlen(IPL_ECKD_STR)) == 0)
1272 rc = reipl_set_type(IPL_TYPE_ECKD);
1273 else if (strncmp(buf, IPL_FCP_STR, strlen(IPL_FCP_STR)) == 0)
1274 rc = reipl_set_type(IPL_TYPE_FCP);
1275 else if (strncmp(buf, IPL_NVME_STR, strlen(IPL_NVME_STR)) == 0)
1276 rc = reipl_set_type(IPL_TYPE_NVME);
1277 else if (strncmp(buf, IPL_NSS_STR, strlen(IPL_NSS_STR)) == 0)
1278 rc = reipl_set_type(IPL_TYPE_NSS);
1279 return (rc != 0) ? rc : len;
1282 static struct kobj_attribute reipl_type_attr =
1283 __ATTR(reipl_type, 0644, reipl_type_show, reipl_type_store);
1285 static struct kset *reipl_kset;
1286 static struct kset *reipl_fcp_kset;
1287 static struct kset *reipl_nvme_kset;
1288 static struct kset *reipl_eckd_kset;
1290 static void __reipl_run(void *unused)
1292 switch (reipl_type) {
1294 diag308(DIAG308_SET, reipl_block_ccw);
1295 if (reipl_ccw_clear)
1296 diag308(DIAG308_LOAD_CLEAR, NULL);
1298 diag308(DIAG308_LOAD_NORMAL_DUMP, NULL);
1301 diag308(DIAG308_SET, reipl_block_eckd);
1302 if (reipl_eckd_clear)
1303 diag308(DIAG308_LOAD_CLEAR, NULL);
1305 diag308(DIAG308_LOAD_NORMAL, NULL);
1308 diag308(DIAG308_SET, reipl_block_fcp);
1309 if (reipl_fcp_clear)
1310 diag308(DIAG308_LOAD_CLEAR, NULL);
1312 diag308(DIAG308_LOAD_NORMAL, NULL);
1315 diag308(DIAG308_SET, reipl_block_nvme);
1316 if (reipl_nvme_clear)
1317 diag308(DIAG308_LOAD_CLEAR, NULL);
1319 diag308(DIAG308_LOAD_NORMAL, NULL);
1322 diag308(DIAG308_SET, reipl_block_nss);
1323 diag308(DIAG308_LOAD_CLEAR, NULL);
1325 case IPL_TYPE_UNKNOWN:
1326 diag308(DIAG308_LOAD_CLEAR, NULL);
1328 case IPL_TYPE_FCP_DUMP:
1329 case IPL_TYPE_NVME_DUMP:
1330 case IPL_TYPE_ECKD_DUMP:
1336 static void reipl_run(struct shutdown_trigger *trigger)
1338 smp_call_ipl_cpu(__reipl_run, NULL);
1341 static void reipl_block_ccw_init(struct ipl_parameter_block *ipb)
1343 ipb->hdr.len = IPL_BP_CCW_LEN;
1344 ipb->hdr.version = IPL_PARM_BLOCK_VERSION;
1345 ipb->pb0_hdr.len = IPL_BP0_CCW_LEN;
1346 ipb->pb0_hdr.pbt = IPL_PBT_CCW;
1349 static void reipl_block_ccw_fill_parms(struct ipl_parameter_block *ipb)
1352 /* check if read scp info worked and set loadparm */
1353 if (sclp_ipl_info.is_valid)
1354 memcpy(ipb->ccw.loadparm, &sclp_ipl_info.loadparm, LOADPARM_LEN);
1356 /* read scp info failed: set empty loadparm (EBCDIC blanks) */
1357 memset(ipb->ccw.loadparm, 0x40, LOADPARM_LEN);
1358 ipb->ccw.flags = IPL_PB0_FLAG_LOADPARM;
1361 if (MACHINE_IS_VM && ipl_block_valid &&
1362 (ipl_block.ccw.vm_flags & IPL_PB0_CCW_VM_FLAG_VP)) {
1364 ipb->ccw.vm_flags |= IPL_PB0_CCW_VM_FLAG_VP;
1365 ipb->ccw.vm_parm_len = ipl_block.ccw.vm_parm_len;
1366 memcpy(ipb->ccw.vm_parm,
1367 ipl_block.ccw.vm_parm, DIAG308_VMPARM_SIZE);
1371 static int __init reipl_nss_init(void)
1378 reipl_block_nss = (void *) get_zeroed_page(GFP_KERNEL);
1379 if (!reipl_block_nss)
1382 rc = sysfs_create_group(&reipl_kset->kobj, &reipl_nss_attr_group);
1386 reipl_block_ccw_init(reipl_block_nss);
1387 reipl_capabilities |= IPL_TYPE_NSS;
1391 static int __init reipl_ccw_init(void)
1395 reipl_block_ccw = (void *) get_zeroed_page(GFP_KERNEL);
1396 if (!reipl_block_ccw)
1399 rc = sysfs_create_group(&reipl_kset->kobj,
1400 MACHINE_IS_VM ? &reipl_ccw_attr_group_vm
1401 : &reipl_ccw_attr_group_lpar);
1405 reipl_block_ccw_init(reipl_block_ccw);
1406 if (ipl_info.type == IPL_TYPE_CCW) {
1407 reipl_block_ccw->ccw.ssid = ipl_block.ccw.ssid;
1408 reipl_block_ccw->ccw.devno = ipl_block.ccw.devno;
1409 reipl_block_ccw_fill_parms(reipl_block_ccw);
1412 reipl_capabilities |= IPL_TYPE_CCW;
1416 static int __init reipl_fcp_init(void)
1420 reipl_block_fcp = (void *) get_zeroed_page(GFP_KERNEL);
1421 if (!reipl_block_fcp)
1424 /* sysfs: create fcp kset for mixing attr group and bin attrs */
1425 reipl_fcp_kset = kset_create_and_add(IPL_FCP_STR, NULL,
1427 if (!reipl_fcp_kset) {
1428 free_page((unsigned long) reipl_block_fcp);
1432 rc = sysfs_create_group(&reipl_fcp_kset->kobj, &reipl_fcp_attr_group);
1436 if (test_facility(141)) {
1437 rc = sysfs_create_file(&reipl_fcp_kset->kobj,
1438 &sys_reipl_fcp_clear_attr.attr);
1442 reipl_fcp_clear = true;
1445 if (ipl_info.type == IPL_TYPE_FCP) {
1446 memcpy(reipl_block_fcp, &ipl_block, sizeof(ipl_block));
1448 * Fix loadparm: There are systems where the (SCSI) LOADPARM
1449 * is invalid in the SCSI IPL parameter block, so take it
1450 * always from sclp_ipl_info.
1452 memcpy(reipl_block_fcp->fcp.loadparm, sclp_ipl_info.loadparm,
1455 reipl_block_fcp->hdr.len = IPL_BP_FCP_LEN;
1456 reipl_block_fcp->hdr.version = IPL_PARM_BLOCK_VERSION;
1457 reipl_block_fcp->fcp.len = IPL_BP0_FCP_LEN;
1458 reipl_block_fcp->fcp.pbt = IPL_PBT_FCP;
1459 reipl_block_fcp->fcp.opt = IPL_PB0_FCP_OPT_IPL;
1461 reipl_capabilities |= IPL_TYPE_FCP;
1465 sysfs_remove_group(&reipl_fcp_kset->kobj, &reipl_fcp_attr_group);
1467 kset_unregister(reipl_fcp_kset);
1468 free_page((unsigned long) reipl_block_fcp);
1472 static int __init reipl_nvme_init(void)
1476 reipl_block_nvme = (void *) get_zeroed_page(GFP_KERNEL);
1477 if (!reipl_block_nvme)
1480 /* sysfs: create kset for mixing attr group and bin attrs */
1481 reipl_nvme_kset = kset_create_and_add(IPL_NVME_STR, NULL,
1483 if (!reipl_nvme_kset) {
1484 free_page((unsigned long) reipl_block_nvme);
1488 rc = sysfs_create_group(&reipl_nvme_kset->kobj, &reipl_nvme_attr_group);
1492 if (test_facility(141)) {
1493 rc = sysfs_create_file(&reipl_nvme_kset->kobj,
1494 &sys_reipl_nvme_clear_attr.attr);
1498 reipl_nvme_clear = true;
1501 if (ipl_info.type == IPL_TYPE_NVME) {
1502 memcpy(reipl_block_nvme, &ipl_block, sizeof(ipl_block));
1504 * Fix loadparm: There are systems where the (SCSI) LOADPARM
1505 * is invalid in the IPL parameter block, so take it
1506 * always from sclp_ipl_info.
1508 memcpy(reipl_block_nvme->nvme.loadparm, sclp_ipl_info.loadparm,
1511 reipl_block_nvme->hdr.len = IPL_BP_NVME_LEN;
1512 reipl_block_nvme->hdr.version = IPL_PARM_BLOCK_VERSION;
1513 reipl_block_nvme->nvme.len = IPL_BP0_NVME_LEN;
1514 reipl_block_nvme->nvme.pbt = IPL_PBT_NVME;
1515 reipl_block_nvme->nvme.opt = IPL_PB0_NVME_OPT_IPL;
1517 reipl_capabilities |= IPL_TYPE_NVME;
1521 sysfs_remove_group(&reipl_nvme_kset->kobj, &reipl_nvme_attr_group);
1523 kset_unregister(reipl_nvme_kset);
1524 free_page((unsigned long) reipl_block_nvme);
1528 static int __init reipl_eckd_init(void)
1532 if (!sclp.has_sipl_eckd)
1535 reipl_block_eckd = (void *)get_zeroed_page(GFP_KERNEL);
1536 if (!reipl_block_eckd)
1539 /* sysfs: create kset for mixing attr group and bin attrs */
1540 reipl_eckd_kset = kset_create_and_add(IPL_ECKD_STR, NULL,
1542 if (!reipl_eckd_kset) {
1543 free_page((unsigned long)reipl_block_eckd);
1547 rc = sysfs_create_group(&reipl_eckd_kset->kobj, &reipl_eckd_attr_group);
1551 if (test_facility(141)) {
1552 rc = sysfs_create_file(&reipl_eckd_kset->kobj,
1553 &sys_reipl_eckd_clear_attr.attr);
1557 reipl_eckd_clear = true;
1560 if (ipl_info.type == IPL_TYPE_ECKD) {
1561 memcpy(reipl_block_eckd, &ipl_block, sizeof(ipl_block));
1563 reipl_block_eckd->hdr.len = IPL_BP_ECKD_LEN;
1564 reipl_block_eckd->hdr.version = IPL_PARM_BLOCK_VERSION;
1565 reipl_block_eckd->eckd.len = IPL_BP0_ECKD_LEN;
1566 reipl_block_eckd->eckd.pbt = IPL_PBT_ECKD;
1567 reipl_block_eckd->eckd.opt = IPL_PB0_ECKD_OPT_IPL;
1569 reipl_capabilities |= IPL_TYPE_ECKD;
1573 sysfs_remove_group(&reipl_eckd_kset->kobj, &reipl_eckd_attr_group);
1575 kset_unregister(reipl_eckd_kset);
1576 free_page((unsigned long)reipl_block_eckd);
1580 static int __init reipl_type_init(void)
1582 enum ipl_type reipl_type = ipl_info.type;
1583 struct ipl_parameter_block *reipl_block;
1586 reipl_block = os_info_old_entry(OS_INFO_REIPL_BLOCK, &size);
1590 * If we have an OS info reipl block, this will be used
1592 if (reipl_block->pb0_hdr.pbt == IPL_PBT_FCP) {
1593 memcpy(reipl_block_fcp, reipl_block, size);
1594 reipl_type = IPL_TYPE_FCP;
1595 } else if (reipl_block->pb0_hdr.pbt == IPL_PBT_NVME) {
1596 memcpy(reipl_block_nvme, reipl_block, size);
1597 reipl_type = IPL_TYPE_NVME;
1598 } else if (reipl_block->pb0_hdr.pbt == IPL_PBT_CCW) {
1599 memcpy(reipl_block_ccw, reipl_block, size);
1600 reipl_type = IPL_TYPE_CCW;
1601 } else if (reipl_block->pb0_hdr.pbt == IPL_PBT_ECKD) {
1602 memcpy(reipl_block_eckd, reipl_block, size);
1603 reipl_type = IPL_TYPE_ECKD;
1606 return reipl_set_type(reipl_type);
1609 static int __init reipl_init(void)
1613 reipl_kset = kset_create_and_add("reipl", NULL, firmware_kobj);
1616 rc = sysfs_create_file(&reipl_kset->kobj, &reipl_type_attr.attr);
1618 kset_unregister(reipl_kset);
1621 rc = reipl_ccw_init();
1624 rc = reipl_eckd_init();
1627 rc = reipl_fcp_init();
1630 rc = reipl_nvme_init();
1633 rc = reipl_nss_init();
1636 return reipl_type_init();
1639 static struct shutdown_action __refdata reipl_action = {
1640 .name = SHUTDOWN_ACTION_REIPL_STR,
1646 * dump shutdown action: Dump Linux on shutdown.
1649 /* FCP dump device attributes */
1651 DEFINE_IPL_ATTR_RW(dump_fcp, wwpn, "0x%016llx\n", "%llx\n",
1652 dump_block_fcp->fcp.wwpn);
1653 DEFINE_IPL_ATTR_RW(dump_fcp, lun, "0x%016llx\n", "%llx\n",
1654 dump_block_fcp->fcp.lun);
1655 DEFINE_IPL_ATTR_RW(dump_fcp, bootprog, "%lld\n", "%lld\n",
1656 dump_block_fcp->fcp.bootprog);
1657 DEFINE_IPL_ATTR_RW(dump_fcp, br_lba, "%lld\n", "%lld\n",
1658 dump_block_fcp->fcp.br_lba);
1659 DEFINE_IPL_ATTR_RW(dump_fcp, device, "0.0.%04llx\n", "0.0.%llx\n",
1660 dump_block_fcp->fcp.devno);
1662 static struct attribute *dump_fcp_attrs[] = {
1663 &sys_dump_fcp_device_attr.attr,
1664 &sys_dump_fcp_wwpn_attr.attr,
1665 &sys_dump_fcp_lun_attr.attr,
1666 &sys_dump_fcp_bootprog_attr.attr,
1667 &sys_dump_fcp_br_lba_attr.attr,
1671 static struct attribute_group dump_fcp_attr_group = {
1672 .name = IPL_FCP_STR,
1673 .attrs = dump_fcp_attrs,
1676 /* NVME dump device attributes */
1677 DEFINE_IPL_ATTR_RW(dump_nvme, fid, "0x%08llx\n", "%llx\n",
1678 dump_block_nvme->nvme.fid);
1679 DEFINE_IPL_ATTR_RW(dump_nvme, nsid, "0x%08llx\n", "%llx\n",
1680 dump_block_nvme->nvme.nsid);
1681 DEFINE_IPL_ATTR_RW(dump_nvme, bootprog, "%lld\n", "%llx\n",
1682 dump_block_nvme->nvme.bootprog);
1683 DEFINE_IPL_ATTR_RW(dump_nvme, br_lba, "%lld\n", "%llx\n",
1684 dump_block_nvme->nvme.br_lba);
1686 static struct attribute *dump_nvme_attrs[] = {
1687 &sys_dump_nvme_fid_attr.attr,
1688 &sys_dump_nvme_nsid_attr.attr,
1689 &sys_dump_nvme_bootprog_attr.attr,
1690 &sys_dump_nvme_br_lba_attr.attr,
1694 static struct attribute_group dump_nvme_attr_group = {
1695 .name = IPL_NVME_STR,
1696 .attrs = dump_nvme_attrs,
1699 /* ECKD dump device attributes */
1700 DEFINE_IPL_CCW_ATTR_RW(dump_eckd, device, dump_block_eckd->eckd);
1701 DEFINE_IPL_ATTR_RW(dump_eckd, bootprog, "%lld\n", "%llx\n",
1702 dump_block_eckd->eckd.bootprog);
1704 IPL_ATTR_BR_CHR_SHOW_FN(dump, dump_block_eckd->eckd);
1705 IPL_ATTR_BR_CHR_STORE_FN(dump, dump_block_eckd->eckd);
1707 static struct kobj_attribute sys_dump_eckd_br_chr_attr =
1708 __ATTR(br_chr, 0644, eckd_dump_br_chr_show, eckd_dump_br_chr_store);
1710 static struct attribute *dump_eckd_attrs[] = {
1711 &sys_dump_eckd_device_attr.attr,
1712 &sys_dump_eckd_bootprog_attr.attr,
1713 &sys_dump_eckd_br_chr_attr.attr,
1717 static struct attribute_group dump_eckd_attr_group = {
1718 .name = IPL_ECKD_STR,
1719 .attrs = dump_eckd_attrs,
1722 /* CCW dump device attributes */
1723 DEFINE_IPL_CCW_ATTR_RW(dump_ccw, device, dump_block_ccw->ccw);
1725 static struct attribute *dump_ccw_attrs[] = {
1726 &sys_dump_ccw_device_attr.attr,
1730 static struct attribute_group dump_ccw_attr_group = {
1731 .name = IPL_CCW_STR,
1732 .attrs = dump_ccw_attrs,
1737 static int dump_set_type(enum dump_type type)
1739 if (!(dump_capabilities & type))
1745 static ssize_t dump_type_show(struct kobject *kobj,
1746 struct kobj_attribute *attr, char *page)
1748 return sprintf(page, "%s\n", dump_type_str(dump_type));
1751 static ssize_t dump_type_store(struct kobject *kobj,
1752 struct kobj_attribute *attr,
1753 const char *buf, size_t len)
1757 if (strncmp(buf, DUMP_NONE_STR, strlen(DUMP_NONE_STR)) == 0)
1758 rc = dump_set_type(DUMP_TYPE_NONE);
1759 else if (strncmp(buf, DUMP_CCW_STR, strlen(DUMP_CCW_STR)) == 0)
1760 rc = dump_set_type(DUMP_TYPE_CCW);
1761 else if (strncmp(buf, DUMP_ECKD_STR, strlen(DUMP_ECKD_STR)) == 0)
1762 rc = dump_set_type(DUMP_TYPE_ECKD);
1763 else if (strncmp(buf, DUMP_FCP_STR, strlen(DUMP_FCP_STR)) == 0)
1764 rc = dump_set_type(DUMP_TYPE_FCP);
1765 else if (strncmp(buf, DUMP_NVME_STR, strlen(DUMP_NVME_STR)) == 0)
1766 rc = dump_set_type(DUMP_TYPE_NVME);
1767 return (rc != 0) ? rc : len;
1770 static struct kobj_attribute dump_type_attr =
1771 __ATTR(dump_type, 0644, dump_type_show, dump_type_store);
1773 static struct kset *dump_kset;
1775 static void diag308_dump(void *dump_block)
1777 diag308(DIAG308_SET, dump_block);
1779 if (diag308(DIAG308_LOAD_NORMAL_DUMP, NULL) != 0x302)
1781 udelay(USEC_PER_SEC);
1785 static void __dump_run(void *unused)
1787 switch (dump_type) {
1789 diag308_dump(dump_block_ccw);
1791 case DUMP_TYPE_ECKD:
1792 diag308_dump(dump_block_eckd);
1795 diag308_dump(dump_block_fcp);
1797 case DUMP_TYPE_NVME:
1798 diag308_dump(dump_block_nvme);
1805 static void dump_run(struct shutdown_trigger *trigger)
1807 if (dump_type == DUMP_TYPE_NONE)
1810 smp_call_ipl_cpu(__dump_run, NULL);
1813 static int __init dump_ccw_init(void)
1817 dump_block_ccw = (void *) get_zeroed_page(GFP_KERNEL);
1818 if (!dump_block_ccw)
1820 rc = sysfs_create_group(&dump_kset->kobj, &dump_ccw_attr_group);
1822 free_page((unsigned long)dump_block_ccw);
1825 dump_block_ccw->hdr.len = IPL_BP_CCW_LEN;
1826 dump_block_ccw->hdr.version = IPL_PARM_BLOCK_VERSION;
1827 dump_block_ccw->ccw.len = IPL_BP0_CCW_LEN;
1828 dump_block_ccw->ccw.pbt = IPL_PBT_CCW;
1829 dump_capabilities |= DUMP_TYPE_CCW;
1833 static int __init dump_fcp_init(void)
1837 if (!sclp_ipl_info.has_dump)
1838 return 0; /* LDIPL DUMP is not installed */
1839 dump_block_fcp = (void *) get_zeroed_page(GFP_KERNEL);
1840 if (!dump_block_fcp)
1842 rc = sysfs_create_group(&dump_kset->kobj, &dump_fcp_attr_group);
1844 free_page((unsigned long)dump_block_fcp);
1847 dump_block_fcp->hdr.len = IPL_BP_FCP_LEN;
1848 dump_block_fcp->hdr.version = IPL_PARM_BLOCK_VERSION;
1849 dump_block_fcp->fcp.len = IPL_BP0_FCP_LEN;
1850 dump_block_fcp->fcp.pbt = IPL_PBT_FCP;
1851 dump_block_fcp->fcp.opt = IPL_PB0_FCP_OPT_DUMP;
1852 dump_capabilities |= DUMP_TYPE_FCP;
1856 static int __init dump_nvme_init(void)
1860 if (!sclp_ipl_info.has_dump)
1861 return 0; /* LDIPL DUMP is not installed */
1862 dump_block_nvme = (void *) get_zeroed_page(GFP_KERNEL);
1863 if (!dump_block_nvme)
1865 rc = sysfs_create_group(&dump_kset->kobj, &dump_nvme_attr_group);
1867 free_page((unsigned long)dump_block_nvme);
1870 dump_block_nvme->hdr.len = IPL_BP_NVME_LEN;
1871 dump_block_nvme->hdr.version = IPL_PARM_BLOCK_VERSION;
1872 dump_block_nvme->fcp.len = IPL_BP0_NVME_LEN;
1873 dump_block_nvme->fcp.pbt = IPL_PBT_NVME;
1874 dump_block_nvme->fcp.opt = IPL_PB0_NVME_OPT_DUMP;
1875 dump_capabilities |= DUMP_TYPE_NVME;
1879 static int __init dump_eckd_init(void)
1883 if (!sclp_ipl_info.has_dump || !sclp.has_sipl_eckd)
1884 return 0; /* LDIPL DUMP is not installed */
1885 dump_block_eckd = (void *)get_zeroed_page(GFP_KERNEL);
1886 if (!dump_block_eckd)
1888 rc = sysfs_create_group(&dump_kset->kobj, &dump_eckd_attr_group);
1890 free_page((unsigned long)dump_block_eckd);
1893 dump_block_eckd->hdr.len = IPL_BP_ECKD_LEN;
1894 dump_block_eckd->hdr.version = IPL_PARM_BLOCK_VERSION;
1895 dump_block_eckd->eckd.len = IPL_BP0_ECKD_LEN;
1896 dump_block_eckd->eckd.pbt = IPL_PBT_ECKD;
1897 dump_block_eckd->eckd.opt = IPL_PB0_ECKD_OPT_DUMP;
1898 dump_capabilities |= DUMP_TYPE_ECKD;
1902 static int __init dump_init(void)
1906 dump_kset = kset_create_and_add("dump", NULL, firmware_kobj);
1909 rc = sysfs_create_file(&dump_kset->kobj, &dump_type_attr.attr);
1911 kset_unregister(dump_kset);
1914 rc = dump_ccw_init();
1917 rc = dump_eckd_init();
1920 rc = dump_fcp_init();
1923 rc = dump_nvme_init();
1926 dump_set_type(DUMP_TYPE_NONE);
1930 static struct shutdown_action __refdata dump_action = {
1931 .name = SHUTDOWN_ACTION_DUMP_STR,
1936 static void dump_reipl_run(struct shutdown_trigger *trigger)
1938 unsigned long ipib = (unsigned long) reipl_block_actual;
1939 struct lowcore *abs_lc;
1942 csum = (__force unsigned int)
1943 csum_partial(reipl_block_actual, reipl_block_actual->hdr.len, 0);
1944 abs_lc = get_abs_lowcore();
1945 abs_lc->ipib = ipib;
1946 abs_lc->ipib_checksum = csum;
1947 put_abs_lowcore(abs_lc);
1951 static struct shutdown_action __refdata dump_reipl_action = {
1952 .name = SHUTDOWN_ACTION_DUMP_REIPL_STR,
1953 .fn = dump_reipl_run,
1957 * vmcmd shutdown action: Trigger vm command on shutdown.
1960 static char vmcmd_on_reboot[128];
1961 static char vmcmd_on_panic[128];
1962 static char vmcmd_on_halt[128];
1963 static char vmcmd_on_poff[128];
1964 static char vmcmd_on_restart[128];
1966 DEFINE_IPL_ATTR_STR_RW(vmcmd, on_reboot, "%s\n", "%s\n", vmcmd_on_reboot);
1967 DEFINE_IPL_ATTR_STR_RW(vmcmd, on_panic, "%s\n", "%s\n", vmcmd_on_panic);
1968 DEFINE_IPL_ATTR_STR_RW(vmcmd, on_halt, "%s\n", "%s\n", vmcmd_on_halt);
1969 DEFINE_IPL_ATTR_STR_RW(vmcmd, on_poff, "%s\n", "%s\n", vmcmd_on_poff);
1970 DEFINE_IPL_ATTR_STR_RW(vmcmd, on_restart, "%s\n", "%s\n", vmcmd_on_restart);
1972 static struct attribute *vmcmd_attrs[] = {
1973 &sys_vmcmd_on_reboot_attr.attr,
1974 &sys_vmcmd_on_panic_attr.attr,
1975 &sys_vmcmd_on_halt_attr.attr,
1976 &sys_vmcmd_on_poff_attr.attr,
1977 &sys_vmcmd_on_restart_attr.attr,
1981 static struct attribute_group vmcmd_attr_group = {
1982 .attrs = vmcmd_attrs,
1985 static struct kset *vmcmd_kset;
1987 static void vmcmd_run(struct shutdown_trigger *trigger)
1991 if (strcmp(trigger->name, ON_REIPL_STR) == 0)
1992 cmd = vmcmd_on_reboot;
1993 else if (strcmp(trigger->name, ON_PANIC_STR) == 0)
1994 cmd = vmcmd_on_panic;
1995 else if (strcmp(trigger->name, ON_HALT_STR) == 0)
1996 cmd = vmcmd_on_halt;
1997 else if (strcmp(trigger->name, ON_POFF_STR) == 0)
1998 cmd = vmcmd_on_poff;
1999 else if (strcmp(trigger->name, ON_RESTART_STR) == 0)
2000 cmd = vmcmd_on_restart;
2004 if (strlen(cmd) == 0)
2006 __cpcmd(cmd, NULL, 0, NULL);
2009 static int vmcmd_init(void)
2013 vmcmd_kset = kset_create_and_add("vmcmd", NULL, firmware_kobj);
2016 return sysfs_create_group(&vmcmd_kset->kobj, &vmcmd_attr_group);
2019 static struct shutdown_action vmcmd_action = {SHUTDOWN_ACTION_VMCMD_STR,
2020 vmcmd_run, vmcmd_init};
2023 * stop shutdown action: Stop Linux on shutdown.
2026 static void stop_run(struct shutdown_trigger *trigger)
2028 if (strcmp(trigger->name, ON_PANIC_STR) == 0 ||
2029 strcmp(trigger->name, ON_RESTART_STR) == 0)
2034 static struct shutdown_action stop_action = {SHUTDOWN_ACTION_STOP_STR,
2039 static struct shutdown_action *shutdown_actions_list[] = {
2040 &ipl_action, &reipl_action, &dump_reipl_action, &dump_action,
2041 &vmcmd_action, &stop_action};
2042 #define SHUTDOWN_ACTIONS_COUNT (sizeof(shutdown_actions_list) / sizeof(void *))
2048 static struct kset *shutdown_actions_kset;
2050 static int set_trigger(const char *buf, struct shutdown_trigger *trigger,
2055 for (i = 0; i < SHUTDOWN_ACTIONS_COUNT; i++) {
2056 if (sysfs_streq(buf, shutdown_actions_list[i]->name)) {
2057 if (shutdown_actions_list[i]->init_rc) {
2058 return shutdown_actions_list[i]->init_rc;
2060 trigger->action = shutdown_actions_list[i];
2070 static struct shutdown_trigger on_reboot_trigger = {ON_REIPL_STR,
2073 static ssize_t on_reboot_show(struct kobject *kobj,
2074 struct kobj_attribute *attr, char *page)
2076 return sprintf(page, "%s\n", on_reboot_trigger.action->name);
2079 static ssize_t on_reboot_store(struct kobject *kobj,
2080 struct kobj_attribute *attr,
2081 const char *buf, size_t len)
2083 return set_trigger(buf, &on_reboot_trigger, len);
2085 static struct kobj_attribute on_reboot_attr = __ATTR_RW(on_reboot);
2087 static void do_machine_restart(char *__unused)
2090 on_reboot_trigger.action->fn(&on_reboot_trigger);
2093 void (*_machine_restart)(char *command) = do_machine_restart;
2097 static struct shutdown_trigger on_panic_trigger = {ON_PANIC_STR, &stop_action};
2099 static ssize_t on_panic_show(struct kobject *kobj,
2100 struct kobj_attribute *attr, char *page)
2102 return sprintf(page, "%s\n", on_panic_trigger.action->name);
2105 static ssize_t on_panic_store(struct kobject *kobj,
2106 struct kobj_attribute *attr,
2107 const char *buf, size_t len)
2109 return set_trigger(buf, &on_panic_trigger, len);
2111 static struct kobj_attribute on_panic_attr = __ATTR_RW(on_panic);
2113 static void do_panic(void)
2116 on_panic_trigger.action->fn(&on_panic_trigger);
2117 stop_run(&on_panic_trigger);
2122 static struct shutdown_trigger on_restart_trigger = {ON_RESTART_STR,
2125 static ssize_t on_restart_show(struct kobject *kobj,
2126 struct kobj_attribute *attr, char *page)
2128 return sprintf(page, "%s\n", on_restart_trigger.action->name);
2131 static ssize_t on_restart_store(struct kobject *kobj,
2132 struct kobj_attribute *attr,
2133 const char *buf, size_t len)
2135 return set_trigger(buf, &on_restart_trigger, len);
2137 static struct kobj_attribute on_restart_attr = __ATTR_RW(on_restart);
2139 static void __do_restart(void *ignore)
2142 #ifdef CONFIG_CRASH_DUMP
2145 on_restart_trigger.action->fn(&on_restart_trigger);
2146 stop_run(&on_restart_trigger);
2149 void do_restart(void *arg)
2154 smp_call_online_cpu(__do_restart, arg);
2159 static struct shutdown_trigger on_halt_trigger = {ON_HALT_STR, &stop_action};
2161 static ssize_t on_halt_show(struct kobject *kobj,
2162 struct kobj_attribute *attr, char *page)
2164 return sprintf(page, "%s\n", on_halt_trigger.action->name);
2167 static ssize_t on_halt_store(struct kobject *kobj,
2168 struct kobj_attribute *attr,
2169 const char *buf, size_t len)
2171 return set_trigger(buf, &on_halt_trigger, len);
2173 static struct kobj_attribute on_halt_attr = __ATTR_RW(on_halt);
2175 static void do_machine_halt(void)
2178 on_halt_trigger.action->fn(&on_halt_trigger);
2179 stop_run(&on_halt_trigger);
2181 void (*_machine_halt)(void) = do_machine_halt;
2185 static struct shutdown_trigger on_poff_trigger = {ON_POFF_STR, &stop_action};
2187 static ssize_t on_poff_show(struct kobject *kobj,
2188 struct kobj_attribute *attr, char *page)
2190 return sprintf(page, "%s\n", on_poff_trigger.action->name);
2193 static ssize_t on_poff_store(struct kobject *kobj,
2194 struct kobj_attribute *attr,
2195 const char *buf, size_t len)
2197 return set_trigger(buf, &on_poff_trigger, len);
2199 static struct kobj_attribute on_poff_attr = __ATTR_RW(on_poff);
2201 static void do_machine_power_off(void)
2204 on_poff_trigger.action->fn(&on_poff_trigger);
2205 stop_run(&on_poff_trigger);
2207 void (*_machine_power_off)(void) = do_machine_power_off;
2209 static struct attribute *shutdown_action_attrs[] = {
2210 &on_restart_attr.attr,
2211 &on_reboot_attr.attr,
2212 &on_panic_attr.attr,
2218 static struct attribute_group shutdown_action_attr_group = {
2219 .attrs = shutdown_action_attrs,
2222 static void __init shutdown_triggers_init(void)
2224 shutdown_actions_kset = kset_create_and_add("shutdown_actions", NULL,
2226 if (!shutdown_actions_kset)
2228 if (sysfs_create_group(&shutdown_actions_kset->kobj,
2229 &shutdown_action_attr_group))
2233 panic("shutdown_triggers_init failed\n");
2236 static void __init shutdown_actions_init(void)
2240 for (i = 0; i < SHUTDOWN_ACTIONS_COUNT; i++) {
2241 if (!shutdown_actions_list[i]->init)
2243 shutdown_actions_list[i]->init_rc =
2244 shutdown_actions_list[i]->init();
2248 static int __init s390_ipl_init(void)
2250 char str[8] = {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40};
2252 sclp_early_get_ipl_info(&sclp_ipl_info);
2254 * Fix loadparm: There are systems where the (SCSI) LOADPARM
2255 * returned by read SCP info is invalid (contains EBCDIC blanks)
2256 * when the system has been booted via diag308. In that case we use
2257 * the value from diag308, if available.
2259 * There are also systems where diag308 store does not work in
2260 * case the system is booted from HMC. Fortunately in this case
2261 * READ SCP info provides the correct value.
2263 if (memcmp(sclp_ipl_info.loadparm, str, sizeof(str)) == 0 && ipl_block_valid)
2264 memcpy(sclp_ipl_info.loadparm, ipl_block.ccw.loadparm, LOADPARM_LEN);
2265 shutdown_actions_init();
2266 shutdown_triggers_init();
2270 __initcall(s390_ipl_init);
2272 static void __init strncpy_skip_quote(char *dst, char *src, int n)
2277 for (sx = 0; src[sx] != 0; sx++) {
2280 dst[dx++] = src[sx];
2286 static int __init vmcmd_on_reboot_setup(char *str)
2290 strncpy_skip_quote(vmcmd_on_reboot, str, 127);
2291 vmcmd_on_reboot[127] = 0;
2292 on_reboot_trigger.action = &vmcmd_action;
2295 __setup("vmreboot=", vmcmd_on_reboot_setup);
2297 static int __init vmcmd_on_panic_setup(char *str)
2301 strncpy_skip_quote(vmcmd_on_panic, str, 127);
2302 vmcmd_on_panic[127] = 0;
2303 on_panic_trigger.action = &vmcmd_action;
2306 __setup("vmpanic=", vmcmd_on_panic_setup);
2308 static int __init vmcmd_on_halt_setup(char *str)
2312 strncpy_skip_quote(vmcmd_on_halt, str, 127);
2313 vmcmd_on_halt[127] = 0;
2314 on_halt_trigger.action = &vmcmd_action;
2317 __setup("vmhalt=", vmcmd_on_halt_setup);
2319 static int __init vmcmd_on_poff_setup(char *str)
2323 strncpy_skip_quote(vmcmd_on_poff, str, 127);
2324 vmcmd_on_poff[127] = 0;
2325 on_poff_trigger.action = &vmcmd_action;
2328 __setup("vmpoff=", vmcmd_on_poff_setup);
2330 static int on_panic_notify(struct notifier_block *self,
2331 unsigned long event, void *data)
2337 static struct notifier_block on_panic_nb = {
2338 .notifier_call = on_panic_notify,
2339 .priority = INT_MIN,
2342 void __init setup_ipl(void)
2344 BUILD_BUG_ON(sizeof(struct ipl_parameter_block) != PAGE_SIZE);
2346 ipl_info.type = get_ipl_type();
2347 switch (ipl_info.type) {
2349 ipl_info.data.ccw.dev_id.ssid = ipl_block.ccw.ssid;
2350 ipl_info.data.ccw.dev_id.devno = ipl_block.ccw.devno;
2353 case IPL_TYPE_ECKD_DUMP:
2354 ipl_info.data.eckd.dev_id.ssid = ipl_block.eckd.ssid;
2355 ipl_info.data.eckd.dev_id.devno = ipl_block.eckd.devno;
2358 case IPL_TYPE_FCP_DUMP:
2359 ipl_info.data.fcp.dev_id.ssid = 0;
2360 ipl_info.data.fcp.dev_id.devno = ipl_block.fcp.devno;
2361 ipl_info.data.fcp.wwpn = ipl_block.fcp.wwpn;
2362 ipl_info.data.fcp.lun = ipl_block.fcp.lun;
2365 case IPL_TYPE_NVME_DUMP:
2366 ipl_info.data.nvme.fid = ipl_block.nvme.fid;
2367 ipl_info.data.nvme.nsid = ipl_block.nvme.nsid;
2370 case IPL_TYPE_UNKNOWN:
2371 /* We have no info to copy */
2374 atomic_notifier_chain_register(&panic_notifier_list, &on_panic_nb);
2377 void s390_reset_system(void)
2379 /* Disable prefixing */
2382 /* Disable lowcore protection */
2383 __ctl_clear_bit(0, 28);
2384 diag_amode31_ops.diag308_reset();
2387 #ifdef CONFIG_KEXEC_FILE
2389 int ipl_report_add_component(struct ipl_report *report, struct kexec_buf *kbuf,
2390 unsigned char flags, unsigned short cert)
2392 struct ipl_report_component *comp;
2394 comp = vzalloc(sizeof(*comp));
2397 list_add_tail(&comp->list, &report->components);
2399 comp->entry.addr = kbuf->mem;
2400 comp->entry.len = kbuf->memsz;
2401 comp->entry.flags = flags;
2402 comp->entry.certificate_index = cert;
2404 report->size += sizeof(comp->entry);
2409 int ipl_report_add_certificate(struct ipl_report *report, void *key,
2410 unsigned long addr, unsigned long len)
2412 struct ipl_report_certificate *cert;
2414 cert = vzalloc(sizeof(*cert));
2417 list_add_tail(&cert->list, &report->certificates);
2419 cert->entry.addr = addr;
2420 cert->entry.len = len;
2423 report->size += sizeof(cert->entry);
2424 report->size += cert->entry.len;
2429 struct ipl_report *ipl_report_init(struct ipl_parameter_block *ipib)
2431 struct ipl_report *report;
2433 report = vzalloc(sizeof(*report));
2435 return ERR_PTR(-ENOMEM);
2437 report->ipib = ipib;
2438 INIT_LIST_HEAD(&report->components);
2439 INIT_LIST_HEAD(&report->certificates);
2441 report->size = ALIGN(ipib->hdr.len, 8);
2442 report->size += sizeof(struct ipl_rl_hdr);
2443 report->size += sizeof(struct ipl_rb_components);
2444 report->size += sizeof(struct ipl_rb_certificates);
2449 void *ipl_report_finish(struct ipl_report *report)
2451 struct ipl_report_certificate *cert;
2452 struct ipl_report_component *comp;
2453 struct ipl_rb_certificates *certs;
2454 struct ipl_parameter_block *ipib;
2455 struct ipl_rb_components *comps;
2456 struct ipl_rl_hdr *rl_hdr;
2459 buf = vzalloc(report->size);
2464 memcpy(ptr, report->ipib, report->ipib->hdr.len);
2466 if (ipl_secure_flag)
2467 ipib->hdr.flags |= IPL_PL_FLAG_SIPL;
2468 ipib->hdr.flags |= IPL_PL_FLAG_IPLSR;
2469 ptr += report->ipib->hdr.len;
2470 ptr = PTR_ALIGN(ptr, 8);
2473 ptr += sizeof(*rl_hdr);
2476 comps->rbt = IPL_RBT_COMPONENTS;
2477 ptr += sizeof(*comps);
2478 list_for_each_entry(comp, &report->components, list) {
2479 memcpy(ptr, &comp->entry, sizeof(comp->entry));
2480 ptr += sizeof(comp->entry);
2482 comps->len = ptr - (void *)comps;
2485 certs->rbt = IPL_RBT_CERTIFICATES;
2486 ptr += sizeof(*certs);
2487 list_for_each_entry(cert, &report->certificates, list) {
2488 memcpy(ptr, &cert->entry, sizeof(cert->entry));
2489 ptr += sizeof(cert->entry);
2491 certs->len = ptr - (void *)certs;
2492 rl_hdr->len = ptr - (void *)rl_hdr;
2494 list_for_each_entry(cert, &report->certificates, list) {
2495 memcpy(ptr, cert->key, cert->entry.len);
2496 ptr += cert->entry.len;
2499 BUG_ON(ptr > buf + report->size);
2504 int ipl_report_free(struct ipl_report *report)
2506 struct ipl_report_component *comp, *ncomp;
2507 struct ipl_report_certificate *cert, *ncert;
2509 list_for_each_entry_safe(comp, ncomp, &report->components, list)
2512 list_for_each_entry_safe(cert, ncert, &report->certificates, list)